From bd9d0cfb6f5a0617c5509d8785cc97370e56f74b Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 24 Mar 2020 16:15:53 +0530 Subject: [PATCH 1/3] feat(Reports): enable depends on for script report filters --- .../js/frappe/views/reports/query_report.js | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 851800f4e9..b31c281845 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -298,6 +298,55 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { }, 1000); } + refresh_filters_dependency() { + this.filters.forEach(filter => { + filter.guardian_has_value = true; + + if (filter.df.depends_on) { + filter.guardian_has_value = + this.evaluate_depends_on_value(filter.df.depends_on, filter.df.label); + + if (filter.guardian_has_value) { + if(filter.df.hidden_due_to_dependency) { + filter.df.hidden_due_to_dependency = false; + this.toggle_filter_display(filter.df.fieldname, false); + } + } else { + if(!filter.df.hidden_due_to_dependency) { + filter.df.hidden_due_to_dependency = true; + this.toggle_filter_display(filter.df.fieldname, true); + filter.set_value(filter.df.default || null); + } + } + } + + }); + } + + evaluate_depends_on_value(expression, filter_label) { + let out = null; + let doc = this.get_filter_values(); + if (doc) { + if(typeof(expression) === 'boolean') { + out = expression; + } else if(expression.substr(0,5)=='eval:') { + try { + out = eval(expression.substr(5)); + } catch(e) { + frappe.throw(__(`Invalid "depends_on" expression set in filter ${filter_label}`)); + } + } else { + var value = doc[expression]; + if($.isArray(value)) { + out = !!value.length; + } else { + out = !!value; + } + } + } + return out; + } + setup_filters() { this.clear_filters(); const { filters = [] } = this.report_settings; @@ -315,6 +364,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { if (df.on_change) f.on_change = df.on_change; df.onchange = () => { + this.refresh_filters_dependency(); + let current_filters = this.get_filter_value(); if (this.previous_filters && (JSON.stringify(this.previous_filters) === JSON.stringify(current_filters))) { @@ -344,6 +395,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { }).filter(Boolean); + this.refresh_filters_dependency(); if (this.filters.length === 0) { // hide page form if no filters this.page.hide_form(); @@ -1472,8 +1524,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } } - toggle_filter(fieldname, flag) { - $(`div[data-fieldname=${fieldname}]`).toggleClass('hide-control', flag); + toggle_filter_display(fieldname, flag) { + this.$page.find(`div[data-fieldname=${fieldname}]`).toggleClass('hide-control', flag); } toggle_report(flag) { From 723ce0c0e5debc3f1cacfb06cc8ddf4254eeb8ae Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 24 Mar 2020 16:25:09 +0530 Subject: [PATCH 2/3] fix: code formatting --- .../public/js/frappe/views/reports/query_report.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index b31c281845..d82cf82f74 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -307,12 +307,12 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.evaluate_depends_on_value(filter.df.depends_on, filter.df.label); if (filter.guardian_has_value) { - if(filter.df.hidden_due_to_dependency) { + if (filter.df.hidden_due_to_dependency) { filter.df.hidden_due_to_dependency = false; this.toggle_filter_display(filter.df.fieldname, false); } } else { - if(!filter.df.hidden_due_to_dependency) { + if (!filter.df.hidden_due_to_dependency) { filter.df.hidden_due_to_dependency = true; this.toggle_filter_display(filter.df.fieldname, true); filter.set_value(filter.df.default || null); @@ -327,17 +327,17 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { let out = null; let doc = this.get_filter_values(); if (doc) { - if(typeof(expression) === 'boolean') { + if (typeof expression === 'boolean') { out = expression; - } else if(expression.substr(0,5)=='eval:') { + } else if (expression.substr(0, 5) == 'eval:') { try { out = eval(expression.substr(5)); - } catch(e) { + } catch (e) { frappe.throw(__(`Invalid "depends_on" expression set in filter ${filter_label}`)); } } else { var value = doc[expression]; - if($.isArray(value)) { + if ($.isArray(value)) { out = !!value.length; } else { out = !!value; From 4157a000f97117a700b2dc41562c1a003fb72329 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 24 Mar 2020 17:31:59 +0530 Subject: [PATCH 3/3] fix: Use filters as variable name instead of doc --- frappe/public/js/frappe/views/reports/query_report.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index d82cf82f74..1d7065e70d 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -325,8 +325,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { evaluate_depends_on_value(expression, filter_label) { let out = null; - let doc = this.get_filter_values(); - if (doc) { + let filters = this.get_filter_values(); + if (filters) { if (typeof expression === 'boolean') { out = expression; } else if (expression.substr(0, 5) == 'eval:') { @@ -336,7 +336,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { frappe.throw(__(`Invalid "depends_on" expression set in filter ${filter_label}`)); } } else { - var value = doc[expression]; + var value = filters[expression]; if ($.isArray(value)) { out = !!value.length; } else {