diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 6abdf9eb09..9a0ed46a01 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -25,6 +25,18 @@ frappe.ui.form.on("Workflow", { }); }, validate: (frm) => { + if ( + frm.doc.is_active && + (frm.doc.states.length === 0 || frm.doc.transitions.length === 0) + ) { + let message = "Workflow must have atleast one state and transition"; + frappe.throw({ + message: __(message), + title: __("Missing Values Required"), + indicator: "orange", + }); + } + if (frm.ignore_warning) { return; } diff --git a/frappe/workflow/doctype/workflow/workflow.json b/frappe/workflow/doctype/workflow/workflow.json index e8db8dcb10..b9cade652e 100644 --- a/frappe/workflow/doctype/workflow/workflow.json +++ b/frappe/workflow/doctype/workflow/workflow.json @@ -70,8 +70,7 @@ "fieldname": "states", "fieldtype": "Table", "label": "Document States", - "options": "Workflow Document State", - "reqd": 1 + "options": "Workflow Document State" }, { "description": "Rules for how states are transitions, like next state and which role is allowed to change state etc.", @@ -84,8 +83,7 @@ "fieldname": "transitions", "fieldtype": "Table", "label": "Transitions", - "options": "Workflow Transition", - "reqd": 1 + "options": "Workflow Transition" }, { "default": "workflow_state", @@ -99,7 +97,7 @@ "icon": "fa fa-random", "idx": 1, "links": [], - "modified": "2020-12-17 20:35:16.898040", + "modified": "2023-05-01 13:21:30.951859", "modified_by": "Administrator", "module": "Workflow", "name": "Workflow", diff --git a/frappe/workflow/page/workflow_builder/workflow_builder.js b/frappe/workflow/page/workflow_builder/workflow_builder.js index bd8e322f37..2c143139d5 100644 --- a/frappe/workflow/page/workflow_builder/workflow_builder.js +++ b/frappe/workflow/page/workflow_builder/workflow_builder.js @@ -29,5 +29,80 @@ function load_workflow_builder(wrapper) { workflow: route[1], }); }); + } else { + let d = new frappe.ui.Dialog({ + title: __("Create or Edit Workflow"), + fields: [ + { + label: __("Action"), + fieldname: "action", + fieldtype: "Select", + options: [ + { label: __("Create New"), value: "Create" }, + { label: __("Edit Existing"), value: "Edit" }, + ], + change() { + let action = d.get_value("action"); + d.get_primary_btn().text(action === "Create" ? __("Create") : __("Edit")); + }, + }, + { + label: __("Select Document Type"), + fieldname: "doctype", + fieldtype: "Link", + options: "DocType", + filters: { + istable: 0, + }, + reqd: 1, + default: frappe.route_options ? frappe.route_options.doctype : null, + }, + { + label: __("New Workflow Name"), + fieldname: "workflow_name", + fieldtype: "Data", + depends_on: (doc) => doc.action === "Create", + mandatory_depends_on: (doc) => doc.action === "Create", + }, + { + label: __("Select Workflow"), + fieldname: "workflow", + fieldtype: "Link", + options: "Workflow", + only_select: 1, + depends_on: (doc) => doc.action === "Edit", + get_query() { + return { + filters: { + document_type: d.get_value("doctype"), + }, + }; + }, + mandatory_depends_on: (doc) => doc.action === "Edit", + }, + ], + primary_action_label: __("Edit"), + primary_action({ action, doctype, workflow, workflow_name }) { + if (action === "Edit") { + frappe.set_route("workflow-builder", workflow); + } else if (action === "Create") { + d.get_primary_btn().prop("disabled", true); + frappe.db + .insert({ + doctype: "Workflow", + workflow_name: workflow_name, + document_type: doctype, + }) + .then((doc) => { + frappe.set_route("workflow-builder", doc.name); + }) + .finally(() => { + d.get_primary_btn().prop("disabled", false); + }); + } + }, + }); + d.set_value("action", "Create"); + d.show(); } }