From fd43685695c9119b20e49a7370b32b7f91de8914 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 30 Mar 2019 18:37:50 +0530 Subject: [PATCH 1/4] fix: Datatable fixes - Remove minWidth limit - Double click to resize to perfect width --- package.json | 2 +- yarn.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b3bbda7cef..df8e65167d 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "bootstrap": "^4.3.1", "cookie": "^0.3.1", "express": "^4.16.2", - "frappe-datatable": "^1.8.0", + "frappe-datatable": "^1.10.0", "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0", "highlight.js": "^9.12.0", diff --git a/yarn.lock b/yarn.lock index 0f3d84503d..bf1904c5c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1715,6 +1715,7 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1722,10 +1723,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -frappe-datatable@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.9.0.tgz#63d6f2af0b6ea00f9b66bb3e55606f5d82b5644b" - integrity sha512-dEKUc8svDH2AoAlcHT4q3DA8Zo0kU3ihrpe9I2VqYKmmygltLXCH5iw3k3IZBVBy17hH49JtzAKGky0OazINHA== +frappe-datatable@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.10.0.tgz#915a7a6754cf6b66dbf7b07323a381e760a74221" + integrity sha512-xuiFvDUSgKIaG0vZZvQsKLs5LUqFfo5nSE+wzBwEzE5iytBaJfKXzqud71AtqteQ0CCrEe9P/tMD+hZfcnbh/Q== dependencies: hyperlist "^1.0.0-beta" lodash "^4.17.5" From 5d195e4157d31641dc99b7cf3cc80edbdf65a578 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 30 Mar 2019 23:16:28 +0530 Subject: [PATCH 2/4] fix: Save column widths in Custom Reports --- frappe/public/js/frappe/list/base_list.js | 5 ++ frappe/public/js/frappe/misc/utils.js | 60 +++++++++++++++++++ .../js/frappe/views/reports/report_view.js | 45 ++++++++++---- 3 files changed, 99 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/frappe/list/base_list.js b/frappe/public/js/frappe/list/base_list.js index d92ca100ce..0e18993349 100644 --- a/frappe/public/js/frappe/list/base_list.js +++ b/frappe/public/js/frappe/list/base_list.js @@ -365,6 +365,7 @@ frappe.views.BaseList = class BaseList { this.toggle_result_area(); this.before_render(); this.render(); + this.after_render(); this.freeze(false); if (this.settings.refresh) { this.settings.refresh(this); @@ -393,6 +394,10 @@ frappe.views.BaseList = class BaseList { } + after_render() { + + } + render() { // for child classes } diff --git a/frappe/public/js/frappe/misc/utils.js b/frappe/public/js/frappe/misc/utils.js index 7bbd63a0a8..8bed1e03a2 100644 --- a/frappe/public/js/frappe/misc/utils.js +++ b/frappe/public/js/frappe/misc/utils.js @@ -682,6 +682,66 @@ Object.assign(frappe.utils, { } else { return null; } + }, + + deep_equal(a, b) { + // https://github.com/epoberezkin/fast-deep-equal/blob/master/index.js + + var isArray = Array.isArray; + var keyList = Object.keys; + var hasProp = Object.prototype.hasOwnProperty; + + function equal(a, b) { + if (a === b) return true; + + if (a && b && typeof a == 'object' && typeof b == 'object') { + var arrA = isArray(a) + , arrB = isArray(b) + , i + , length + , key; + + if (arrA && arrB) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (!equal(a[i], b[i])) return false; + return true; + } + + if (arrA != arrB) return false; + + var dateA = a instanceof Date + , dateB = b instanceof Date; + if (dateA != dateB) return false; + if (dateA && dateB) return a.getTime() == b.getTime(); + + var regexpA = a instanceof RegExp + , regexpB = b instanceof RegExp; + if (regexpA != regexpB) return false; + if (regexpA && regexpB) return a.toString() == b.toString(); + + var keys = keyList(a); + length = keys.length; + + if (length !== keyList(b).length) + return false; + + for (i = length; i-- !== 0;) + if (!hasProp.call(b, keys[i])) return false; + + for (i = length; i-- !== 0;) { + key = keys[i]; + if (!equal(a[key], b[key])) return false; + } + + return true; + } + + return a!==a && b!==b; + }; + + return equal(a, b) } }); diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index 0da81fad54..79b773316d 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -76,7 +76,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { return super.before_refresh(); } - before_render() { + after_render() { if (this.report_doc) { this.set_dirty_state_for_custom_report(); } else { @@ -85,23 +85,25 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } set_dirty_state_for_custom_report() { - const json = JSON.stringify({ + let current_settings = { filters: this.filter_area.get(), fields: this.fields, order_by: this.sort_selector.get_sql_string(), add_totals_row: this.add_totals_row, - page_length: this.page_length - }); + page_length: this.page_length, + column_widths: this.get_column_widths() + } - const report_json = JSON.stringify({ + let report_settings = { filters: this.report_doc.json.filters, fields: this.report_doc.json.fields, order_by: this.report_doc.json.order_by, add_totals_row: this.report_doc.json.add_totals_row, - page_length: this.report_doc.json.page_length - }); + page_length: this.report_doc.json.page_length, + column_widths: this.report_doc.json.column_widths + } - if (json != report_json) { + if (!frappe.utils.deep_equal(current_settings, report_settings)) { this.page.set_indicator(__('Not Saved'), 'orange'); } else { this.page.clear_indicator(); @@ -830,11 +832,16 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { return docfield.fieldtype === 'Date' ? 'right' : 'left'; })(); - const width = (docfield ? cint(docfield.width) : null) || null; - // child table column const id = doctype !== this.doctype ? `${doctype}:${fieldname}` : fieldname; + let width = (docfield ? cint(docfield.width) : null) || null; + if (this.report_doc) { + // load the user saved column width + let saved_column_widths = this.report_doc.json.column_widths || {}; + width = saved_column_widths[id] || width; + } + let compareFn = null; if (docfield.fieldtype === 'Date') { compareFn = (cell, keyword) => { @@ -950,7 +957,8 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { fields: this.fields, order_by: this.sort_selector.get_sql_string(), add_totals_row: this.add_totals_row, - page_length: this.page_length + page_length: this.page_length, + column_widths: this.get_column_widths() } return frappe.call({ @@ -975,6 +983,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { }; this.list_sidebar.setup_reports(); frappe.set_route('List', this.doctype, 'Report', r.message); + return; } // update state @@ -994,6 +1003,20 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { } } + get_column_widths() { + if (this.datatable) { + return this.datatable + .datamanager + .getColumns(true) + .reduce((acc, curr) => { + acc[curr.id] = parseInt(curr.width); + return acc; + }, {}); + } + + return {}; + } + get_report_doc() { return new Promise(resolve => { frappe.model.with_doc('Report', this.report_name, () => { From 1dc1801cfb10f3dbc49409b6b4181f2f221e6ea8 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 30 Mar 2019 23:29:42 +0530 Subject: [PATCH 3/4] fix: Disable linting on deep_equal util --- frappe/public/js/frappe/misc/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/misc/utils.js b/frappe/public/js/frappe/misc/utils.js index 8bed1e03a2..aa48adc47f 100644 --- a/frappe/public/js/frappe/misc/utils.js +++ b/frappe/public/js/frappe/misc/utils.js @@ -686,7 +686,7 @@ Object.assign(frappe.utils, { deep_equal(a, b) { // https://github.com/epoberezkin/fast-deep-equal/blob/master/index.js - + /* eslint-disable */ var isArray = Array.isArray; var keyList = Object.keys; var hasProp = Object.prototype.hasOwnProperty; @@ -742,6 +742,7 @@ Object.assign(frappe.utils, { }; return equal(a, b) + /* eslint-enable */ } }); From 3415335423af81f3a3f679d961fd03eaf8961d74 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 1 Apr 2019 10:37:53 +0530 Subject: [PATCH 4/4] fix: Add fast-deep-equal as a dependency --- frappe/public/js/frappe/misc/utils.js | 62 ++------------------------- package.json | 1 + 2 files changed, 4 insertions(+), 59 deletions(-) diff --git a/frappe/public/js/frappe/misc/utils.js b/frappe/public/js/frappe/misc/utils.js index 949d8de350..ecbfaa555a 100644 --- a/frappe/public/js/frappe/misc/utils.js +++ b/frappe/public/js/frappe/misc/utils.js @@ -1,6 +1,7 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // MIT License. See license.txt +import deep_equal from "fast-deep-equal"; frappe.provide('frappe.utils'); Object.assign(frappe.utils, { @@ -685,65 +686,8 @@ Object.assign(frappe.utils, { }, deep_equal(a, b) { - // https://github.com/epoberezkin/fast-deep-equal/blob/master/index.js - /* eslint-disable */ - var isArray = Array.isArray; - var keyList = Object.keys; - var hasProp = Object.prototype.hasOwnProperty; - - function equal(a, b) { - if (a === b) return true; - - if (a && b && typeof a == 'object' && typeof b == 'object') { - var arrA = isArray(a) - , arrB = isArray(b) - , i - , length - , key; - - if (arrA && arrB) { - length = a.length; - if (length != b.length) return false; - for (i = length; i-- !== 0;) - if (!equal(a[i], b[i])) return false; - return true; - } - - if (arrA != arrB) return false; - - var dateA = a instanceof Date - , dateB = b instanceof Date; - if (dateA != dateB) return false; - if (dateA && dateB) return a.getTime() == b.getTime(); - - var regexpA = a instanceof RegExp - , regexpB = b instanceof RegExp; - if (regexpA != regexpB) return false; - if (regexpA && regexpB) return a.toString() == b.toString(); - - var keys = keyList(a); - length = keys.length; - - if (length !== keyList(b).length) - return false; - - for (i = length; i-- !== 0;) - if (!hasProp.call(b, keys[i])) return false; - - for (i = length; i-- !== 0;) { - key = keys[i]; - if (!equal(a[key], b[key])) return false; - } - - return true; - } - - return a!==a && b!==b; - }; - - return equal(a, b) - /* eslint-enable */ - }, + return deep_equal(a, b); + }, get_points(points) { return ` diff --git a/package.json b/package.json index df8e65167d..3b5decfc35 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "bootstrap": "^4.3.1", "cookie": "^0.3.1", "express": "^4.16.2", + "fast-deep-equal": "^2.0.1", "frappe-datatable": "^1.10.0", "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0",