From ee5f83695b5e134361c1d08e06e6b6ad461c48b8 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 15 Jan 2020 12:04:52 +0530 Subject: [PATCH 1/5] feat(Report View): show status field derived from docstatus or workflow, if not a doctype field --- .../js/frappe/views/reports/report_view.js | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index ff4ea56404..a1060b09f1 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -684,7 +684,6 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } build_fields() { - this.fields.push(['docstatus', this.doctype]); super.build_fields(); } @@ -778,12 +777,24 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { let doctype_fields = frappe.meta.get_docfields(this.doctype).filter(standard_fields_filter); + // filter out docstatus field from picker + let std_fields = frappe.model.std_fields.filter( df => !in_list('docstatus', df.fieldname)); + + // add status field derived from docstatus, if status is not a standard field + if (!frappe.meta.has_field(this.doctype, 'status')) { + doctype_fields = [{ + label: __('Status'), + fieldname: 'docstatus', + fieldtype: 'Data' + }].concat(doctype_fields, std_fields); + } + doctype_fields = [{ label: __('ID'), fieldname: 'name', fieldtype: 'Data', reqd: 1 - }].concat(doctype_fields, frappe.model.std_fields); + }].concat(doctype_fields); out[this.doctype] = doctype_fields; @@ -858,16 +869,23 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { this.columns_map = {}; for (let f of this.fields) { + let column; if (f[0]!=='docstatus') { - let column = this.build_column(f); - if (column) { - if (column_widths) { - column.width = column_widths[column.id] || column.width || 120; - } - this.columns.push(column); - this.columns_map[column.id] = column; + column = this.build_column(f); + } else { + // if status is not in fields append status column derived from docstatus + if (!this.fields.includes(['status', this.doctype]) && !frappe.meta.has_field(this.doctype, 'status')) { + column = this.build_column(['status', this.doctype]); } } + + if (column) { + if (column_widths) { + column.width = column_widths[column.id] || column.width || 120; + } + this.columns.push(column); + this.columns_map[column.id] = column; + } } } @@ -1003,7 +1021,16 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } }; } - + if (col.field == 'status') { + // get status from docstatus + let status = frappe.get_indicator(d, this.doctype)[0]; + return { + name: d.name, + doctype: col.docfield.parent, + content: status, + editable: this.is_editable(col.docfield, d) + } + } if (col.field in d) { const value = d[col.field]; return { From 2909040c54672ff95f15b5d3eb36654da532fc36 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 15 Jan 2020 16:04:57 +0530 Subject: [PATCH 2/5] fix: set editable property of derived status field to false --- frappe/public/js/frappe/views/reports/report_view.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index a1060b09f1..e328e2eec8 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -1021,17 +1021,16 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } }; } - if (col.field == 'status') { + if (col.field === 'status' && !frappe.meta.has_field(this.doctype, 'status')) { // get status from docstatus let status = frappe.get_indicator(d, this.doctype)[0]; return { name: d.name, doctype: col.docfield.parent, content: status, - editable: this.is_editable(col.docfield, d) - } - } - if (col.field in d) { + editable: false + }; + } else if (col.field in d) { const value = d[col.field]; return { name: d.name, From 095b4548d8bb26a375d8f64ca4c1a2cfdbf8dca7 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 15 Jan 2020 16:06:27 +0530 Subject: [PATCH 3/5] fix: test status column --- cypress/integration/report_view.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cypress/integration/report_view.js b/cypress/integration/report_view.js index c7aeaa92de..5ce853c730 100644 --- a/cypress/integration/report_view.js +++ b/cypress/integration/report_view.js @@ -19,11 +19,13 @@ context('Report View', () => { cy.server(); cy.route('POST', 'api/method/frappe.client.set_value').as('value-update'); cy.visit(`/desk#List/${doctype_name}/Report`); - let cell = cy.get('.dt-row-0 > .dt-cell--col-3'); + // check status column added from docstatus + cy.get('.dt-row-0 > .dt-cell--col-3').should('contain', 'Submitted'); + let cell = cy.get('.dt-row-0 > .dt-cell--col-4'); // select the cell cell.dblclick(); cell.find('input[data-fieldname="enabled"]').check({force: true}); - cy.get('.dt-row-0 > .dt-cell--col-4').click(); + cy.get('.dt-row-0 > .dt-cell--col-5').click(); cy.wait('@value-update'); cy.get('@doc').then(doc => { cy.call('frappe.client.get_value', { From 6dd807b3a7912c194d7f22618e3382929733c885 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 16 Jan 2020 16:14:06 +0530 Subject: [PATCH 4/5] fix: switch status column deleting field --- .../js/frappe/views/reports/report_view.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index e328e2eec8..5b1aff52c8 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -778,7 +778,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { let doctype_fields = frappe.meta.get_docfields(this.doctype).filter(standard_fields_filter); // filter out docstatus field from picker - let std_fields = frappe.model.std_fields.filter( df => !in_list('docstatus', df.fieldname)); + let std_fields = frappe.model.std_fields.filter( df => df.fieldname !== 'docstatus'); // add status field derived from docstatus, if status is not a standard field if (!frappe.meta.has_field(this.doctype, 'status')) { @@ -786,7 +786,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { label: __('Status'), fieldname: 'docstatus', fieldtype: 'Data' - }].concat(doctype_fields, std_fields); + }].concat(doctype_fields); } doctype_fields = [{ @@ -794,7 +794,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { fieldname: 'name', fieldtype: 'Data', reqd: 1 - }].concat(doctype_fields); + }].concat(doctype_fields, std_fields); out[this.doctype] = doctype_fields; @@ -875,7 +875,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } else { // if status is not in fields append status column derived from docstatus if (!this.fields.includes(['status', this.doctype]) && !frappe.meta.has_field(this.doctype, 'status')) { - column = this.build_column(['status', this.doctype]); + column = this.build_column(['docstatus', this.doctype]); } } @@ -910,9 +910,14 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } } docfield.parent = this.doctype; - if (fieldname == "name") { + if (fieldname == 'name') { docfield.options = this.doctype; } + if (fieldname == 'docstatus' && !frappe.meta.has_field(this.doctype, 'status')) { + docfield.label = 'Status'; + docfield.fieldtype = 'Data'; + docfield.name = 'status'; + } } } if (!docfield) return; @@ -1000,7 +1005,6 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { totals_row[0].content = __('Totals').bold(); out.push(totals_row); } - return out; } @@ -1021,7 +1025,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } }; } - if (col.field === 'status' && !frappe.meta.has_field(this.doctype, 'status')) { + if (col.field === 'docstatus' && !frappe.meta.has_field(this.doctype, 'status')) { // get status from docstatus let status = frappe.get_indicator(d, this.doctype)[0]; return { From 3b24fe5c45946d5c245d47e363b6f5dff2e85c36 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 16 Jan 2020 22:14:56 +0530 Subject: [PATCH 5/5] fix: add status dependency column --- .../js/frappe/views/reports/report_view.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 5b1aff52c8..cf3e387346 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -741,6 +741,16 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } } + add_status_dependency_column(col, doctype) { + // Adds dependent column from which status is derived if required + if (!this.fields.find(f => f[0] === col)) { + const field = [col, doctype]; + this.fields.push(field); + this.refresh(); + frappe.show_alert(__('Also adding the status dependency field {0}', [field[0].bold()])); + } + } + remove_column_from_datatable(column) { const index = this.fields.findIndex(f => column.field === f[0]); if (index === -1) return; @@ -1027,11 +1037,17 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } if (col.field === 'docstatus' && !frappe.meta.has_field(this.doctype, 'status')) { // get status from docstatus - let status = frappe.get_indicator(d, this.doctype)[0]; + let status = frappe.get_indicator(d, this.doctype); + if (!status[0]) { + // get_indicator returns the dependent field's condition as the 3rd parameter + let dependent_col = status[2].split(',')[0]; + // add status dependency column + this.add_status_dependency_column(dependent_col, this.doctype); + } return { name: d.name, doctype: col.docfield.parent, - content: status, + content: status[0], editable: false }; } else if (col.field in d) {