From a405f991540be6c7256fd50c51549236bc47ab3d Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 2 May 2023 21:05:45 +0530 Subject: [PATCH] fix: update states & transition table on save --- frappe/public/js/workflow_builder/store.js | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/frappe/public/js/workflow_builder/store.js b/frappe/public/js/workflow_builder/store.js index 0c98b74cbd..f2cf4ab1bf 100644 --- a/frappe/public/js/workflow_builder/store.js +++ b/frappe/public/js/workflow_builder/store.js @@ -56,6 +56,8 @@ export const useStore = defineStore("workflow-builder-store", () => { try { let doc = workflow_doc.value; + doc.states = get_updated_states(); + doc.transitions = get_updated_transitions(); clean_workflow_data(); doc.workflow_data = JSON.stringify(workflow.value.elements); await frappe.call("frappe.client.save", { doc }); @@ -72,6 +74,71 @@ export const useStore = defineStore("workflow-builder-store", () => { workflow.value.elements.forEach((el) => (el.selected = false)); } + function get_state_df(data) { + let doc_status_map = { + Draft: 0, + Submitted: 1, + Cancelled: 2, + }; + let docfield = "Workflow Document State"; + let df = frappe.model.get_new_doc(docfield); + df.name = frappe.utils.get_random(8); + df.state = data.state; + df.doc_status = doc_status_map[data.doc_status]; + df.allow_edit = data.allow_edit; + df.update_field = data.update_field; + df.update_value = data.update_value; + df.is_optional_state = data.is_optional_state; + df.next_action_email_template = data.next_action_email_template; + df.message = data.message; + return df; + } + + function get_updated_states() { + let states = []; + workflow.value.elements.forEach((element) => { + if (element.type == "state") { + states.push(get_state_df(element.data)); + } + }); + return states; + } + + function get_transition_df({ state, action, next_state, allowed }) { + let docfield = "Workflow Transition"; + let df = frappe.model.get_new_doc(docfield); + df.name = frappe.utils.get_random(8); + df.state = state; + df.action = action; + df.next_state = next_state; + df.allowed = allowed; + return df; + } + + function get_updated_transitions() { + let transitions = []; + let actions = []; + + workflow.value.elements.forEach((element) => { + if (element.type == "action") { + actions.push(element); + } + }); + + actions.forEach((action) => { + transitions.push( + get_transition_df({ + state: action.data.from, + action: action.data.action, + next_state: action.data.to, + allowed: action.data.allowed, + }) + ); + }); + + return transitions; + } + let undo_redo_keyboard_event = onKeyDown(true, (e) => { if (!ref_history.value) return; if (e.ctrlKey || e.metaKey) {