diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 2a511e83cd..37a076aa19 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -81,6 +81,9 @@ def generate_report_result(report, filters=None, user=None): if result: result = get_filtered_data(report.ref_doctype, columns, result, user) + if cint(report.add_total_row) and result: + result = add_total_row(result, columns) + return { "result": result, "columns": columns, @@ -325,10 +328,7 @@ def add_total_row(result, columns, meta = None): first_col_fieldtype = columns[0].get("fieldtype") if first_col_fieldtype not in ["Currency", "Int", "Float", "Percent", "Date"]: - if first_col_fieldtype == "Link": - total_row[0] = "'" + _("Total") + "'" - else: - total_row[0] = _("Total") + total_row[0] = _("Total") result.append(total_row) return result diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 4fc6d4da69..2bc12f14a0 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -393,17 +393,24 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } render_datatable() { + let data = this.data; + if (this.raw_data.add_total_row) { + data = data.slice(); + data.splice(-1, 1); + } + if (this.datatable) { this.datatable.options.treeView = this.tree_report; - this.datatable.refresh(this.data, this.columns); + this.datatable.refresh(data, this.columns); } else { let datatable_options = { columns: this.columns, - data: this.data, + data: data, inlineFilters: true, treeView: this.tree_report, layout: 'fixed', - cellHeight: 33 + cellHeight: 33, + showTotalRow: this.raw_data.add_total_row }; if (this.report_settings.get_datatable_options) { @@ -815,12 +822,17 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { filters = Object.assign(frappe.urllib.get_dict("prepared_report_name"), filters); } + const visible_idx = this.datatable.datamanager.getFilteredRowIndices(); + if (visible_idx.length + 1 === this.data.length) { + visible_idx.push(visible_idx.length); + } + const args = { cmd: 'frappe.desk.query_report.export_query', report_name: this.report_name, file_format_type: file_format, filters: filters, - visible_idx: this.datatable.datamanager.getFilteredRowIndices(), + visible_idx: visible_idx, }; open_url_post(frappe.request.url, args); diff --git a/package.json b/package.json index eed4c72e05..f48d6ad2ec 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "awesomplete": "^1.1.2", "cookie": "^0.3.1", "express": "^4.16.2", - "frappe-datatable": "^1.6.1", + "frappe-datatable": "^1.6.2", "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0", "highlight.js": "^9.12.0", diff --git a/yarn.lock b/yarn.lock index 3475604959..9d2ea9ea60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1219,10 +1219,10 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -frappe-datatable@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.6.1.tgz#e57850923b5f307fd02328c522c5abe35a17dd89" - integrity sha512-u2l4I2Pwu4jTLSBF7vW7EDwzcRdfrlKbgaUCyhDUYlOhWl0sRt6rO2ZmIhU7znSYz7TNkKkAt7hkI+x+Mg6ONw== +frappe-datatable@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.6.2.tgz#4144e2e15740a8b90dfd133410384214ee882ff9" + integrity sha512-ES0wJnSa9LGCWpCDg7WKYeuHobWKsQJQn0t8rXvuscypg87BmW6EZAJRa1bL6E0HXrjyr7p5yNXH2LyUyiULkQ== dependencies: hyperlist "^1.0.0-beta" lodash "^4.17.5"