From 2632107129bc8726a7dcd6d70c1d6df7d4bd8eab Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 19 Jun 2019 12:15:37 +0530 Subject: [PATCH] fix: User MultiSelectList control for Party filter (#17943) * fix: User MultiSelectList control for Party filter The comma based filter wouldn't work for values that had comma in them * fix: Replace with MultiSelectList in reports * fix: Parse json instead of string split --- .../accounts/report/financial_statements.py | 4 +- .../report/general_ledger/general_ledger.js | 92 +++---------------- .../report/general_ledger/general_ledger.py | 9 +- .../gross_and_net_profit_report.js | 30 +----- .../profit_and_loss_statement.js | 30 +----- erpnext/public/js/financial_statements.js | 31 +------ 6 files changed, 31 insertions(+), 165 deletions(-) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index 41205ae2b0..c06856aa75 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -390,8 +390,8 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters): if filters: if filters.get("project"): if not isinstance(filters.get("project"), list): - projects = frappe.safe_encode(filters.get("project")) - filters.project = [d.strip() for d in projects.strip().split(',') if d] + filters.project = frappe.parse_json(filters.get("project")) + additional_conditions.append("project in %(project)s") if filters.get("cost_center"): diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 4235b7f60d..5c98b249db 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -72,46 +72,25 @@ frappe.query_reports["General Ledger"] = { { "fieldname":"party", "label": __("Party"), - "fieldtype": "MultiSelect", - get_data: function() { + "fieldtype": "MultiSelectList", + get_data: function(txt) { if (!frappe.query_report.filters) return; - var party_type = frappe.query_report.get_filter_value('party_type'); - var parties = frappe.query_report.get_filter_value('party'); - if(!party_type) return; - const values = parties.split(/\s*,\s*/).filter(d => d); - const txt = parties.match(/[^,\s*]*$/)[0] || ''; - let data = []; + let party_type = frappe.query_report.get_filter_value('party_type'); + if (!party_type) return; - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: frappe.query_report.get_filter_value('party_type'), - txt: txt, - filters: { - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } - }); - return data; + return frappe.db.get_link_options(party_type, txt); }, on_change: function() { var party_type = frappe.query_report.get_filter_value('party_type'); var parties = frappe.query_report.get_filter_value('party'); - const values = parties.split(/\s*,\s*/).filter(d => d); - if(!party_type || !parties || values.length>1) { + if(!party_type || parties.length === 0 || parties.length > 1) { frappe.query_report.set_filter_value('party_name', ""); frappe.query_report.set_filter_value('tax_id', ""); return; } else { - var party = values[0]; + var party = parties[0]; var fieldname = erpnext.utils.get_party_name(party_type) || "name"; frappe.db.get_value(party_type, party, fieldname, function(value) { frappe.query_report.set_filter_value('party_name', value[fieldname]); @@ -154,62 +133,17 @@ frappe.query_reports["General Ledger"] = { { "fieldname":"cost_center", "label": __("Cost Center"), - "fieldtype": "MultiSelect", - get_data: function() { - var cost_centers = frappe.query_report.get_filter_value("cost_center") || ""; - - const values = cost_centers.split(/\s*,\s*/).filter(d => d); - const txt = cost_centers.match(/[^,\s*]*$/)[0] || ''; - let data = []; - - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: "Cost Center", - txt: txt, - filters: { - "company": frappe.query_report.get_filter_value("company"), - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } - }); - return data; + "fieldtype": "MultiSelectList", + get_data: function(txt) { + return frappe.db.get_link_options('Cost Center', txt); } }, { "fieldname":"project", "label": __("Project"), - "fieldtype": "MultiSelect", - get_data: function() { - var projects = frappe.query_report.get_filter_value("project") || ""; - - const values = projects.split(/\s*,\s*/).filter(d => d); - const txt = projects.match(/[^,\s*]*$/)[0] || ''; - let data = []; - - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: "Project", - txt: txt, - filters: { - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } - }); - return data; + "fieldtype": "MultiSelectList", + get_data: function(txt) { + return frappe.db.get_link_options('Project', txt); } }, { diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index d9f395b895..1c5e089534 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -26,8 +26,7 @@ def execute(filters=None): account_details.setdefault(acc.name, acc) if filters.get('party'): - parties = cstr(filters.get("party")).strip() - filters.party = [d.strip() for d in parties.split(',') if d] + filters.party = frappe.parse_json(filters.get("party")) validate_filters(filters, account_details) @@ -61,12 +60,10 @@ def validate_filters(filters, account_details): frappe.throw(_("From Date must be before To Date")) if filters.get('project'): - projects = cstr(filters.get("project")).strip() - filters.project = [d.strip() for d in projects.split(',') if d] + filters.project = frappe.parse_json(filters.get('project')) if filters.get('cost_center'): - cost_centers = cstr(filters.get("cost_center")).strip() - filters.cost_center = [d.strip() for d in cost_centers.split(',') if d] + filters.cost_center = frappe.parse_json(filters.get('cost_center')) def validate_party(filters): diff --git a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.js b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.js index 63ac281cdb..8dc5ab36dd 100644 --- a/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.js +++ b/erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.js @@ -13,33 +13,11 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { frappe.query_reports["Gross and Net Profit Report"]["filters"].push( { - "fieldname":"project", + "fieldname": "project", "label": __("Project"), - "fieldtype": "MultiSelect", - get_data: function() { - var projects = frappe.query_report.get_filter_value("project") || ""; - - const values = projects.split(/\s*,\s*/).filter(d => d); - const txt = projects.match(/[^,\s*]*$/)[0] || ''; - let data = []; - - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: "Project", - txt: txt, - filters: { - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } - }); - return data; + "fieldtype": "MultiSelectList", + get_data: function(txt) { + return frappe.db.get_link_options('Project', txt); } }, { diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js index 250e516d7d..df5c982258 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js @@ -8,33 +8,11 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { frappe.query_reports["Profit and Loss Statement"]["filters"].push( { - "fieldname":"project", + "fieldname": "project", "label": __("Project"), - "fieldtype": "MultiSelect", - get_data: function() { - var projects = frappe.query_report.get_filter_value("project") || ""; - - const values = projects.split(/\s*,\s*/).filter(d => d); - const txt = projects.match(/[^,\s*]*$/)[0] || ''; - let data = []; - - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: "Project", - txt: txt, - filters: { - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } - }); - return data; + "fieldtype": "MultiSelectList", + get_data: function(txt) { + return frappe.db.get_link_options('Project', txt); } }, { diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js index 73e04c0ff0..d1113a4ca4 100644 --- a/erpnext/public/js/financial_statements.js +++ b/erpnext/public/js/financial_statements.js @@ -118,34 +118,13 @@ function get_filters(){ "options": erpnext.get_presentation_currency_list() }, { - "fieldname":"cost_center", + "fieldname": "cost_center", "label": __("Cost Center"), - "fieldtype": "MultiSelect", - get_data: function() { - var cost_centers = frappe.query_report.get_filter_value("cost_center") || ""; - - const values = cost_centers.split(/\s*,\s*/).filter(d => d); - const txt = cost_centers.match(/[^,\s*]*$/)[0] || ''; - let data = []; - - frappe.call({ - type: "GET", - method:'frappe.desk.search.search_link', - async: false, - no_spinner: true, - args: { - doctype: "Cost Center", - txt: txt, - filters: { - "company": frappe.query_report.get_filter_value("company"), - "name": ["not in", values] - } - }, - callback: function(r) { - data = r.results; - } + "fieldtype": "MultiSelectList", + get_data: function(txt) { + return frappe.db.get_link_options('Cost Center', txt, { + company: frappe.query_report.get_filter_value("company") }); - return data; } } ]