From 09dd31a79cf6de9f70814b198427fbf040325e13 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 9 Apr 2020 16:48:04 +0530 Subject: [PATCH 01/13] feat: show warning if documents have workflow states that do not exist in the workflow --- frappe/public/js/frappe/form/form.js | 8 +- frappe/public/js/frappe/ui/dialog.js | 6 ++ frappe/workflow/doctype/workflow/workflow.js | 99 +++++++++++++++++++- frappe/workflow/doctype/workflow/workflow.py | 13 ++- 4 files changed, 121 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 369e4a56d4..a6c11a3dac 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -616,8 +616,12 @@ frappe.ui.form.Form = class FrappeForm { // validate frappe.validated = true; frappe.run_serially([ - () => this.script_manager.trigger("validate"), - () => this.script_manager.trigger("before_save"), + () => { + return this.script_manager.trigger("validate") + }, + () => { + return this.script_manager.trigger("before_save") + }, () => { if(!frappe.validated) { fail(); diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index 0f4332a91a..2bb01311d9 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -42,6 +42,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { this.body = this.$body.get(0); this.$message = $('').appendTo(this.modal_body); this.header = this.$wrapper.find(".modal-header"); + this.set_indicator(); // make fields (if any) super.make(); @@ -164,6 +165,11 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { set_title(t) { this.$wrapper.find(".modal-title").html(t); } + set_indicator() { + if (this.indicator) { + this.header.find('.indicator').removeClass().addClass('indicator ' + this.indicator); + } + } show() { // show it if ( this.animate ) { diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 6e12f5fa46..cb6ed98b1a 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -6,6 +6,25 @@ frappe.ui.form.on("Workflow", { }, refresh: function(frm) { frm.events.update_field_options(frm); + frm.ignore_warning = false; + }, + validate: (frm) => { + if (frm.ignore_warning) return; + let states_list = []; + frm.doc.states.map(state=> states_list.push(state.state)); + return frappe.xcall( + 'frappe.workflow.doctype.workflow.workflow.get_workflow_state_count', + { + doctype: frm.doc.document_type, + workflow_state_field: frm.doc.workflow_state_field, + states: states_list + }).then(result => { + if (result && result.length) { + frappe.validated = false; + frm.states = result; + frm.trigger('create_warning_dialog'); + } + }); }, document_type: function(frm) { frm.events.update_field_options(frm); @@ -19,6 +38,82 @@ frappe.ui.form.on("Workflow", { frappe.meta.get_docfield("Workflow Document State", "update_field", frm.doc.name).options = [""].concat(resp); }) } - } -}) + }, + create_warning_dialog: function(frm) { + frm.warning_dialog = new frappe.ui.Dialog({ + title: __(`Worflow States Don't Exist`), + indicator: 'red', + fields: [ + { + fieldname: 'warning_text', + label: __('Warning'), + fieldtype: 'HTML', + }, + { + fieldname: 'state_table', + label: __('Count of existing Document States'), + fieldtype: 'HTML', + }, + ], + primary_action_label: __(`Don't Save`), + primary_action: () => { + frm.warning_dialog.hide(); + }, + }); + frm.warning_dialog.get_close_btn().hide(); + + frm.warning_dialog.get_field('warning_text').$wrapper.html( + `

+ ${__(`There are documents which have workflow states that do not exist in this Workflow. + It is recommended that you add these states to the Workflow and change their states + before removing these states.`)} +

` + ) + frm.trigger('render_state_table'); + frm.trigger('render_dismiss_button'); + frm.warning_dialog.show(); + }, + render_state_table: function(frm) { + let wrapper = frm.warning_dialog.get_field('state_table').$wrapper; + let rows = frm.states.map(r => { + let indicator_color_map = { + '0': 'red', + '1': 'green', + '2': 'darkgrey' + } + return ` + +
+ ${r[frm.doc.workflow_state_field]} +
+ + ${r.count} + `; + }).join(''); + + $(` + + + + + + + + ${rows} + +
${__('State')}${__('Count')}
`).appendTo(wrapper); + }, + render_dismiss_button: function(frm) { + frm.warning_dialog.header.find('.buttons').prepend( + `` + ); + + frm.warning_dialog.$wrapper.find('.dismiss').on('click', () => { + frm.warning_dialog.hide(); + frm.ignore_warning = true; + frm.save(); + }); + } + +}); diff --git a/frappe/workflow/doctype/workflow/workflow.py b/frappe/workflow/doctype/workflow/workflow.py index 62e0b39b08..a740dc136f 100644 --- a/frappe/workflow/doctype/workflow/workflow.py +++ b/frappe/workflow/doctype/workflow/workflow.py @@ -59,7 +59,7 @@ class Workflow(Document): def update_doc_status(self): ''' - Checks if the docstatus of a state was updated. + Checks if the docstatus of a state was updated. If yes then the docstatus of the document with same state will be updated ''' doc_before_save = self.get_doc_before_save() @@ -112,3 +112,14 @@ class Workflow(Document): def get_fieldnames_for(doctype): return [f.fieldname for f in frappe.get_meta(doctype).fields \ if f.fieldname not in no_value_fields] + +@frappe.whitelist() +def get_workflow_state_count(doctype, workflow_state_field, states): + states = frappe.parse_json(states) + return frappe.get_all( + doctype, + fields=[workflow_state_field, 'count(*) as count', 'docstatus'], + filters = {'workflow_state': ['not in', states]}, + group_by = workflow_state_field + ) + From 5eb22194f507db89b11f2738fce2a0a94c27b3a0 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 9 Apr 2020 23:01:28 +0530 Subject: [PATCH 02/13] feat: create frappe.warn dialog --- frappe/public/js/frappe/ui/dialog.js | 1 + frappe/public/js/frappe/ui/messages.js | 27 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/frappe/public/js/frappe/ui/dialog.js b/frappe/public/js/frappe/ui/dialog.js index 2bb01311d9..d77481f8b9 100644 --- a/frappe/public/js/frappe/ui/dialog.js +++ b/frappe/public/js/frappe/ui/dialog.js @@ -42,6 +42,7 @@ frappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup { this.body = this.$body.get(0); this.$message = $('').appendTo(this.modal_body); this.header = this.$wrapper.find(".modal-header"); + this.buttons = this.header.find('.buttons'); this.set_indicator(); // make fields (if any) diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index c6bc994a9d..4decc26a7f 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -53,6 +53,33 @@ frappe.confirm = function(message, ifyes, ifno) { return d; } +frappe.warn = function(title, message_html, proceed_action, primary_label) { + const d = new frappe.ui.Dialog({ + title: title, + indicator: 'red', + fields: [ + { + fieldtype:"HTML", + fieldname: 'warning_message', + options: `
${message_html}
` + } + ], + primary_action_label: primary_label, + primary_action: () => { + if (proceed_action) proceed_action(); + d.hide(); + }, + secondary_action_label: __("Cancel"), + }); + + d.buttons.find('.btn-primary').removeClass('btn-primary').addClass('btn-danger'); + const modal_footer = $(``).insertAfter($(d.modal_body)); + modal_footer.html(d.buttons); + + d.show(); + return d; +} + frappe.prompt = function(fields, callback, title, primary_label) { if (typeof fields === "string") { fields = [{ From d1c4af1255d57a7c5b139d944ed30afaaf32b56c Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 9 Apr 2020 23:01:54 +0530 Subject: [PATCH 03/13] refactor: use frappe.warn and render table in form also --- frappe/workflow/doctype/workflow/workflow.js | 104 ++++++++----------- 1 file changed, 45 insertions(+), 59 deletions(-) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index cb6ed98b1a..a8fe5472db 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -8,23 +8,17 @@ frappe.ui.form.on("Workflow", { frm.events.update_field_options(frm); frm.ignore_warning = false; }, + onload_post_render: function(frm) { + frm.trigger('get_orphaned_states_and_count').then(()=> { + frm.trigger('render_state_table'); + }); + }, validate: (frm) => { if (frm.ignore_warning) return; - let states_list = []; - frm.doc.states.map(state=> states_list.push(state.state)); - return frappe.xcall( - 'frappe.workflow.doctype.workflow.workflow.get_workflow_state_count', - { - doctype: frm.doc.document_type, - workflow_state_field: frm.doc.workflow_state_field, - states: states_list - }).then(result => { - if (result && result.length) { - frappe.validated = false; - frm.states = result; - frm.trigger('create_warning_dialog'); - } - }); + return frm.trigger('get_orphaned_states_and_count').then(()=> { + frappe.validated = false; + frm.trigger('create_warning_dialog'); + }); }, document_type: function(frm) { frm.events.update_field_options(frm); @@ -40,41 +34,23 @@ frappe.ui.form.on("Workflow", { } }, create_warning_dialog: function(frm) { - frm.warning_dialog = new frappe.ui.Dialog({ - title: __(`Worflow States Don't Exist`), - indicator: 'red', - fields: [ - { - fieldname: 'warning_text', - label: __('Warning'), - fieldtype: 'HTML', - }, - { - fieldname: 'state_table', - label: __('Count of existing Document States'), - fieldtype: 'HTML', - }, - ], - primary_action_label: __(`Don't Save`), - primary_action: () => { - frm.warning_dialog.hide(); - }, - }); - frm.warning_dialog.get_close_btn().hide(); - - frm.warning_dialog.get_field('warning_text').$wrapper.html( - `

- ${__(`There are documents which have workflow states that do not exist in this Workflow. + const warning_html = + `

+ ${__('Are you sure you want to save this document?')} +

+

${__(`There are documents which have workflow states that do not exist in this Workflow. It is recommended that you add these states to the Workflow and change their states before removing these states.`)} -

` - ) - frm.trigger('render_state_table'); - frm.trigger('render_dismiss_button'); - frm.warning_dialog.show(); +

`; + const message_html = warning_html + frm.state_table_html; + let proceed_action = () => { + frm.ignore_warning = true; + frm.save(); + } + + frappe.warn(__(`Worflow States Don't Exist`), message_html, proceed_action, __(`Save Anyway`)); }, - render_state_table: function(frm) { - let wrapper = frm.warning_dialog.get_field('state_table').$wrapper; + set_table_html: function(frm) { let rows = frm.states.map(r => { let indicator_color_map = { '0': 'red', @@ -91,7 +67,7 @@ frappe.ui.form.on("Workflow", { `; }).join(''); - $(` + frm.state_table_html = (`
@@ -101,19 +77,29 @@ frappe.ui.form.on("Workflow", { ${rows} -
${__('State')}
`).appendTo(wrapper); + `); }, - render_dismiss_button: function(frm) { - frm.warning_dialog.header.find('.buttons').prepend( - `` - ); - - frm.warning_dialog.$wrapper.find('.dismiss').on('click', () => { - frm.warning_dialog.hide(); - frm.ignore_warning = true; - frm.save(); + get_orphaned_states_and_count: function(frm) { + let states_list = []; + frm.doc.states.map(state=> states_list.push(state.state)); + return frappe.xcall('frappe.workflow.doctype.workflow.workflow.get_workflow_state_count',{ + doctype: frm.doc.document_type, + workflow_state_field: frm.doc.workflow_state_field, + states: states_list + }).then(result => { + if (result && result.length) { + frm.states = result; + frm.trigger('set_table_html'); + } }); + }, + render_state_table: function(frm) { + const $wrapper = frm.get_field('states').$wrapper; + const label_html = + `

+ ${'Document States that do not exist in your Workflow'} +

`; + $(label_html + frm.state_table_html).insertAfter($wrapper); } - }); From aaf1618898629232137864061cdd8bee464f4e25 Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 10 Apr 2020 00:23:45 +0530 Subject: [PATCH 04/13] refactor: refactor rendering of table --- frappe/public/js/frappe/ui/messages.js | 2 +- frappe/workflow/doctype/workflow/workflow.js | 59 +++++++++++++++----- frappe/workflow/doctype/workflow/workflow.py | 3 +- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index 4decc26a7f..f4eacb142b 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -59,7 +59,7 @@ frappe.warn = function(title, message_html, proceed_action, primary_label) { indicator: 'red', fields: [ { - fieldtype:"HTML", + fieldtype: 'HTML', fieldname: 'warning_message', options: `
${message_html}
` } diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index a8fe5472db..db941a003b 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -7,17 +7,21 @@ frappe.ui.form.on("Workflow", { refresh: function(frm) { frm.events.update_field_options(frm); frm.ignore_warning = false; - }, - onload_post_render: function(frm) { + frm.states = null; + frm.trigger('make_state_table'); frm.trigger('get_orphaned_states_and_count').then(()=> { frm.trigger('render_state_table'); }); }, validate: (frm) => { - if (frm.ignore_warning) return; + if (frm.ignore_warning) { + return; + } return frm.trigger('get_orphaned_states_and_count').then(()=> { + if (frm.states && frm.states.length) { frappe.validated = false; frm.trigger('create_warning_dialog'); + } }); }, document_type: function(frm) { @@ -51,23 +55,25 @@ frappe.ui.form.on("Workflow", { frappe.warn(__(`Worflow States Don't Exist`), message_html, proceed_action, __(`Save Anyway`)); }, set_table_html: function(frm) { + let rows = frm.states.map(r => { let indicator_color_map = { '0': 'red', '1': 'green', '2': 'darkgrey' - } + }; + return `
- ${r[frm.doc.workflow_state_field]} + ${r[frm.doc.workflow_state_field]}
${r.count} `; }).join(''); - frm.state_table_html = (` + frm.state_table_html = (`
@@ -78,11 +84,12 @@ frappe.ui.form.on("Workflow", { ${rows}
${__('State')}
`); + }, get_orphaned_states_and_count: function(frm) { let states_list = []; frm.doc.states.map(state=> states_list.push(state.state)); - return frappe.xcall('frappe.workflow.doctype.workflow.workflow.get_workflow_state_count',{ + return frappe.xcall('frappe.workflow.doctype.workflow.workflow.get_workflow_state_count', { doctype: frm.doc.document_type, workflow_state_field: frm.doc.workflow_state_field, states: states_list @@ -93,13 +100,39 @@ frappe.ui.form.on("Workflow", { } }); }, + make_state_table: function(frm) { + const wrapper = frm.get_field('states').$wrapper; + if (frm.state_table) { + frm.state_table.empty(); + } + frm.state_table = $(`
`).insertAfter(wrapper); + }, render_state_table: function(frm) { - const $wrapper = frm.get_field('states').$wrapper; - const label_html = - `

- ${'Document States that do not exist in your Workflow'} -

`; - $(label_html + frm.state_table_html).insertAfter($wrapper); + if (frm.states && frm.states.length) { + const form_state_table_html = + `

+ ${'Document States that do not exist in your Workflow'} +

+ ${frm.state_table_html} +
`; + frm.state_table.html(form_state_table_html); + + $(frm.state_table).find('a.orphaned-state').on('click', (e) => { + const state = $(e.currentTarget).text(); + let filters = {}; + filters[frm.workflow_state_field] = state; + frappe.set_route('List', frm.doc.document_type, filters); + }) + } + } + +}); + +frappe.ui.form.on("Workflow Document State", { + states_remove: function(frm) { + frm.trigger('get_orphaned_states_and_count').then(()=> { + frm.trigger('render_state_table'); + }); } }); diff --git a/frappe/workflow/doctype/workflow/workflow.py b/frappe/workflow/doctype/workflow/workflow.py index a740dc136f..553f21dbab 100644 --- a/frappe/workflow/doctype/workflow/workflow.py +++ b/frappe/workflow/doctype/workflow/workflow.py @@ -116,10 +116,11 @@ def get_fieldnames_for(doctype): @frappe.whitelist() def get_workflow_state_count(doctype, workflow_state_field, states): states = frappe.parse_json(states) - return frappe.get_all( + result = frappe.get_all( doctype, fields=[workflow_state_field, 'count(*) as count', 'docstatus'], filters = {'workflow_state': ['not in', states]}, group_by = workflow_state_field ) + return [r for r in result if r[workflow_state_field]] From f61f5ec8344c2deab14b53a698cda8d242181e06 Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 26 Apr 2020 17:02:40 +0530 Subject: [PATCH 05/13] fix: get indicator color from state --- frappe/public/js/frappe/utils/utils.js | 19 +++++++++ frappe/workflow/doctype/workflow/workflow.js | 45 ++++++++++---------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 24fa946fc4..ff49e86e49 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -292,6 +292,25 @@ Object.assign(frappe.utils, { return frappe.utils.guess_style(text, null, true); }, + get_indicator_color: function(state) { + return frappe.db.get_list('Workflow State', {filters: {name: state}, fields: ['name', 'style']}).then(res => { + const state = res[0]; + if (!state.style) { + return frappe.utils.guess_colour(state.name); + } + const style = state.style; + const colour_map = { + "Success": "green", + "Warning": "orange", + "Danger": "red", + "Primary": "blue", + } + + return colour_map[style]; + }); + + }, + sort: function(list, key, compare_type, reverse) { if(!list || list.length < 2) return list || []; diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index db941a003b..448e8db796 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -56,35 +56,34 @@ frappe.ui.form.on("Workflow", { }, set_table_html: function(frm) { - let rows = frm.states.map(r => { - let indicator_color_map = { - '0': 'red', - '1': 'green', - '2': 'darkgrey' - }; - - return ` + const promises = frm.states.map(r => { + const state = r[frm.doc.workflow_state_field]; + return frappe.utils.get_indicator_color(state).then(color => { + return ` -
+ ${r.count} `; - }).join(''); - - frm.state_table_html = (` - - - - - - - - ${rows} - -
${__('State')}${__('Count')}
`); + }) + }); + Promise.all(promises).then(rows => { + const rows_html = rows.join(''); + frm.state_table_html = (` + + + + + + + + ${rows_html} + +
${__('State')}${__('Count')}
`); + }); }, get_orphaned_states_and_count: function(frm) { let states_list = []; @@ -96,7 +95,7 @@ frappe.ui.form.on("Workflow", { }).then(result => { if (result && result.length) { frm.states = result; - frm.trigger('set_table_html'); + return frm.trigger('set_table_html'); } }); }, From 2df481e990489607b8bd45f22064ab16f78b6d5d Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 26 Apr 2020 17:04:04 +0530 Subject: [PATCH 06/13] fix: increase table width --- frappe/workflow/doctype/workflow/workflow.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 448e8db796..ef9f32ec4f 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -72,8 +72,8 @@ frappe.ui.form.on("Workflow", { Promise.all(promises).then(rows => { const rows_html = rows.join(''); - frm.state_table_html = (` - + frm.state_table_html = (`
+ From 37dcef5f530cc356dfff819f0f10a2f79124002a Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 26 Apr 2020 17:06:37 +0530 Subject: [PATCH 07/13] fix: code formatting --- frappe/public/js/frappe/utils/utils.js | 2 +- frappe/workflow/doctype/workflow/workflow.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index ff49e86e49..f4dde5804f 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -304,7 +304,7 @@ Object.assign(frappe.utils, { "Warning": "orange", "Danger": "red", "Primary": "blue", - } + }; return colour_map[style]; }); diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index ef9f32ec4f..11d63bccb4 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -50,7 +50,7 @@ frappe.ui.form.on("Workflow", { let proceed_action = () => { frm.ignore_warning = true; frm.save(); - } + }; frappe.warn(__(`Worflow States Don't Exist`), message_html, proceed_action, __(`Save Anyway`)); }, @@ -65,9 +65,8 @@ frappe.ui.form.on("Workflow", { ${r[frm.doc.workflow_state_field]} - - `; - }) + `; + }); }); Promise.all(promises).then(rows => { @@ -121,7 +120,7 @@ frappe.ui.form.on("Workflow", { let filters = {}; filters[frm.workflow_state_field] = state; frappe.set_route('List', frm.doc.document_type, filters); - }) + }); } } From 3ee944d659c70e5cf77a15ff5119e9db91cb1eab Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 5 May 2020 12:52:09 +0530 Subject: [PATCH 08/13] style: missing semicolon --- frappe/public/js/frappe/ui/messages.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index f4eacb142b..ab20feeedd 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -78,7 +78,7 @@ frappe.warn = function(title, message_html, proceed_action, primary_label) { d.show(); return d; -} +}; frappe.prompt = function(fields, callback, title, primary_label) { if (typeof fields === "string") { From 49f4eea9636f36878511c2f92aa60a0a22c2f14b Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 27 May 2020 12:14:08 +0530 Subject: [PATCH 09/13] fix: don't get states count if form is new --- frappe/workflow/doctype/workflow/workflow.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 11d63bccb4..500bece21d 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -6,7 +6,12 @@ frappe.ui.form.on("Workflow", { }, refresh: function(frm) { frm.events.update_field_options(frm); - frm.ignore_warning = false; + frm.ignore_warning = frm.is_new() ? true : false; + + if (frm.is_new()) { + return; + } + frm.states = null; frm.trigger('make_state_table'); frm.trigger('get_orphaned_states_and_count').then(()=> { From d621a994a135da65dcb5236d73eac72b2c864c3e Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 27 May 2020 12:14:49 +0530 Subject: [PATCH 10/13] fix: fix state filter --- frappe/workflow/doctype/workflow/workflow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 500bece21d..189d80a893 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -123,7 +123,7 @@ frappe.ui.form.on("Workflow", { $(frm.state_table).find('a.orphaned-state').on('click', (e) => { const state = $(e.currentTarget).text(); let filters = {}; - filters[frm.workflow_state_field] = state; + filters[frm.doc.workflow_state_field] = state; frappe.set_route('List', frm.doc.document_type, filters); }); } From 62ac2494e7d52bee16f0fdaaa67585a9bb630937 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 27 May 2020 12:16:17 +0530 Subject: [PATCH 11/13] style: fix formatting --- frappe/workflow/doctype/workflow/workflow.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index 189d80a893..a423b2610c 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -14,7 +14,7 @@ frappe.ui.form.on("Workflow", { frm.states = null; frm.trigger('make_state_table'); - frm.trigger('get_orphaned_states_and_count').then(()=> { + frm.trigger('get_orphaned_states_and_count').then(() => { frm.trigger('render_state_table'); }); }, @@ -22,7 +22,7 @@ frappe.ui.form.on("Workflow", { if (frm.ignore_warning) { return; } - return frm.trigger('get_orphaned_states_and_count').then(()=> { + return frm.trigger('get_orphaned_states_and_count').then(() => { if (frm.states && frm.states.length) { frappe.validated = false; frm.trigger('create_warning_dialog'); @@ -91,7 +91,7 @@ frappe.ui.form.on("Workflow", { }, get_orphaned_states_and_count: function(frm) { let states_list = []; - frm.doc.states.map(state=> states_list.push(state.state)); + frm.doc.states.map(state => states_list.push(state.state)); return frappe.xcall('frappe.workflow.doctype.workflow.workflow.get_workflow_state_count', { doctype: frm.doc.document_type, workflow_state_field: frm.doc.workflow_state_field, @@ -133,7 +133,7 @@ frappe.ui.form.on("Workflow", { frappe.ui.form.on("Workflow Document State", { states_remove: function(frm) { - frm.trigger('get_orphaned_states_and_count').then(()=> { + frm.trigger('get_orphaned_states_and_count').then(() => { frm.trigger('render_state_table'); }); } From c7f0aafa7e45ba8adbf2fd9f43319bac0952c2f7 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 28 May 2020 14:24:33 +0530 Subject: [PATCH 12/13] feat: add button to go to ref doctype list --- frappe/workflow/doctype/workflow/workflow.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frappe/workflow/doctype/workflow/workflow.js b/frappe/workflow/doctype/workflow/workflow.js index a423b2610c..aba6f6fe48 100644 --- a/frappe/workflow/doctype/workflow/workflow.js +++ b/frappe/workflow/doctype/workflow/workflow.js @@ -5,6 +5,12 @@ frappe.ui.form.on("Workflow", { frm.set_query("document_type", {"issingle": 0, "istable": 0}); }, refresh: function(frm) { + if (frm.doc.document_type) { + frm.add_custom_button(__('Go to {0} List', [frm.doc.document_type]), () => { + frappe.set_route('List', frm.doc.document_type); + }); + } + frm.events.update_field_options(frm); frm.ignore_warning = frm.is_new() ? true : false; From 1c7c647015d7d89ff213b1ba408a6a3bd115e38c Mon Sep 17 00:00:00 2001 From: prssanna Date: Sat, 30 May 2020 15:33:38 +0530 Subject: [PATCH 13/13] fix: revert form.js --- frappe/public/js/frappe/form/form.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index a6c11a3dac..369e4a56d4 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -616,12 +616,8 @@ frappe.ui.form.Form = class FrappeForm { // validate frappe.validated = true; frappe.run_serially([ - () => { - return this.script_manager.trigger("validate") - }, - () => { - return this.script_manager.trigger("before_save") - }, + () => this.script_manager.trigger("validate"), + () => this.script_manager.trigger("before_save"), () => { if(!frappe.validated) { fail();
${__('State')} ${__('Count')}${r.count}
${r.count}