From 2c0735d709912dc9cafc23a98c30fb7ca5d7517c Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 10 Mar 2022 15:58:05 +0530 Subject: [PATCH] fix: Number Card to support child table doctype for filters --- .../desk/doctype/number_card/number_card.js | 34 +++++++++++++++++++ .../desk/doctype/number_card/number_card.json | 11 +++++- .../desk/doctype/number_card/number_card.py | 8 +++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js index 6d1454a2cb..f548388a99 100644 --- a/frappe/desk/doctype/number_card/number_card.js +++ b/frappe/desk/doctype/number_card/number_card.js @@ -28,6 +28,7 @@ frappe.ui.form.on('Number Card', { frm.trigger('render_filters_table'); } frm.trigger('create_add_to_dashboard_button'); + frm.trigger('set_parent_document_type'); }, create_add_to_dashboard_button: function(frm) { @@ -141,7 +142,9 @@ frappe.ui.form.on('Number Card', { frm.set_value('filters_json', '[]'); frm.set_value('dynamic_filters_json', '[]'); frm.set_value('aggregate_function_based_on', ''); + frm.set_value('parent_document_type', ''); frm.trigger('set_options'); + frm.trigger('set_parent_document_type'); }, set_options: function(frm) { @@ -317,6 +320,7 @@ frappe.ui.form.on('Number Card', { frm.filter_group = new frappe.ui.FilterGroup({ parent: dialog.get_field('filter_area').$wrapper, doctype: frm.doc.document_type, + parent_doctype: frm.doc.parent_document_type, on_change: () => {}, }); filters && frm.filter_group.add_filters_to_filter_group(filters); @@ -436,6 +440,36 @@ frappe.ui.form.on('Number Card', { frm.dynamic_filter_table.find('tbody').html(filter_rows); } + }, + + set_parent_document_type: async function(frm) { + let document_type = frm.doc.document_type; + let doc_is_table = document_type && + (await frappe.db.get_value('DocType', document_type, 'istable')).message.istable; + + frm.set_df_property('parent_document_type', 'hidden', !doc_is_table); + + if (document_type && doc_is_table) { + let parent = await frappe.db.get_list('DocField', { + filters: { + 'fieldtype': 'Table', + 'options': document_type + }, + fields: ['parent'] + }); + + parent && frm.set_query('parent_document_type', function() { + return { + filters: { + "name": ['in', parent.map(({ parent }) => parent)] + } + }; + }); + + if (parent.length === 1) { + frm.set_value('parent_document_type', parent[0].parent); + } + } } }); diff --git a/frappe/desk/doctype/number_card/number_card.json b/frappe/desk/doctype/number_card/number_card.json index d3e9598eb7..7975d878ba 100644 --- a/frappe/desk/doctype/number_card/number_card.json +++ b/frappe/desk/doctype/number_card/number_card.json @@ -16,6 +16,7 @@ "aggregate_function_based_on", "column_break_2", "document_type", + "parent_document_type", "report_field", "report_function", "is_public", @@ -188,10 +189,17 @@ "label": "Function", "mandatory_depends_on": "eval: doc.type == 'Report'", "options": "Sum\nAverage\nMinimum\nMaximum" + }, + { + "description": "The document type selected is a child table, so the parent document type is required.", + "fieldname": "parent_document_type", + "fieldtype": "Link", + "label": "Parent Document Type", + "options": "DocType" } ], "links": [], - "modified": "2020-07-23 11:11:03.391719", + "modified": "2022-03-10 15:34:38.210910", "modified_by": "Administrator", "module": "Desk", "name": "Number Card", @@ -234,6 +242,7 @@ "search_fields": "label, document_type", "sort_field": "modified", "sort_order": "DESC", + "states": [], "title_field": "label", "track_changes": 1 } \ No newline at end of file diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index 5662523a9d..784f46bb19 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -3,6 +3,7 @@ # License: MIT. See LICENSE import frappe +from frappe import _ from frappe.model.document import Document from frappe.utils import cint from frappe.model.naming import append_number_if_name_exists @@ -17,6 +18,13 @@ class NumberCard(Document): if frappe.db.exists("Number Card", self.name): self.name = append_number_if_name_exists('Number Card', self.name) + def validate(self): + if not self.document_type: + frappe.throw(_("Document type is required to create a number card")) + + if self.document_type and frappe.get_meta(self.document_type).istable and not self.parent_document_type: + frappe.throw(_("Parent document type is required to create a number card")) + def on_update(self): if frappe.conf.developer_mode and self.is_standard: export_to_files(record_list=[['Number Card', self.name]], record_module=self.module)