From a1b402020e4a1f102730b6c81c298a15832af92d Mon Sep 17 00:00:00 2001 From: Sumit Jain Date: Thu, 3 Sep 2026 13:38:20 +0530 Subject: [PATCH 1/2] feat(accounts): enhance account and cost center tree views with additional flags and labels --- erpnext/accounts/doctype/account/account.json | 3 +- .../accounts/doctype/account/account_tree.js | 23 ++++++--------- .../doctype/cost_center/cost_center_tree.js | 13 +++++++++ erpnext/accounts/utils.py | 28 +++++++++++-------- erpnext/public/js/utils.js | 20 +++++++++++++ 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index e65d41fde19..5ed1b59a45c 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -122,6 +122,7 @@ "description": "Setting Account Type helps in selecting this Account in transactions.", "fieldname": "account_type", "fieldtype": "Select", + "in_preview": 1, "in_standard_filter": 1, "label": "Account Type", "oldfieldname": "account_type", @@ -203,7 +204,7 @@ "idx": 1, "is_tree": 1, "links": [], - "modified": "2026-08-21 23:11:37.851001", + "modified": "2026-09-03 12:59:42.190900", "modified_by": "Administrator", "module": "Accounts", "name": "Account", diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js index dd7e1d29e71..7ffff22a1af 100644 --- a/erpnext/accounts/doctype/account/account_tree.js +++ b/erpnext/accounts/doctype/account/account_tree.js @@ -62,7 +62,7 @@ frappe.treeview_settings["Account"] = { const flags = []; if (node.data.account_number) { - flags.push(frappe.ui.badge({ label: node.data.account_number, size: "sm" })); + flags.push(frappe.ui.badge({ label: node.data.account_number, theme: "light" })); } const company = frappe.treeview_settings["Account"].treeview?.page?.fields_dict?.company?.get_value(); @@ -72,26 +72,21 @@ frappe.treeview_settings["Account"] = { company_currency && node.data.account_currency !== company_currency ) { - flags.push(frappe.ui.badge({ label: node.data.account_currency, theme: "blue", size: "sm" })); + flags.push(frappe.ui.badge({ label: node.data.account_currency, theme: "blue" })); } if (node.data.freeze_account === "Yes") { flags.push( - $( - ` - ${frappe.utils.icon("lock", "sm")} - ` - )[0] + frappe.ui.badge({ + label: __("Frozen"), + icon: "lock", + title: __("Frozen - entries restricted"), + theme: "orange", + }) ); } - if (flags.length) { - const $flags = $( - '' - ); - flags.forEach((flag) => $flags.append(flag)); - $flags.insertAfter(node.$tree_link.find("a.tree-label")); - } + erpnext.utils.render_tree_node_flags(node, flags); }, on_node_render: function (node, deep) { const render_balances = () => { diff --git a/erpnext/accounts/doctype/cost_center/cost_center_tree.js b/erpnext/accounts/doctype/cost_center/cost_center_tree.js index 5b134f6545f..c36a2922846 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center_tree.js +++ b/erpnext/accounts/doctype/cost_center/cost_center_tree.js @@ -12,6 +12,19 @@ frappe.treeview_settings["Cost Center"] = { ], root_label: "Cost Centers", get_tree_nodes: "erpnext.accounts.utils.get_children", + get_label: function (node) { + // clean display name — the number renders as a badge (see onrender) + return frappe.utils.escape_html(node.data.cost_center_name || node.title || node.label); + }, + onrender: function (node) { + if (node.is_root || !node.data) return; + + const flags = []; + if (node.data.cost_center_number) { + flags.push(frappe.ui.badge({ label: node.data.cost_center_number })); + } + erpnext.utils.render_tree_node_flags(node, flags); + }, add_tree_node: "erpnext.accounts.utils.add_cc", menu_items: [ { diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index db7a58c08c3..09b5a60fc53 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -1359,22 +1359,28 @@ def get_children( parent_fieldname = "parent_" + doctype.lower().replace(" ", "_") fields = ["name as value", "is_group as expandable"] filters = [["docstatus", "<", 2]] - if frappe.db.has_column(doctype, "disabled") and not include_disabled: - filters.append(["disabled", "=", False]) + if frappe.db.has_column(doctype, "disabled"): + if include_disabled: + # the tree marks disabled rows, so it needs the flag + fields.append("disabled") + else: + filters.append(["disabled", "=", False]) + + # extra columns the tree views render as badges / clean labels + node_fields = { + "Account": ["root_type", "account_name", "account_number", "account_currency", "freeze_account"], + "Cost Center": ["cost_center_name", "cost_center_number"], + } + fields += node_fields.get(doctype, []) if is_root: filters.append(IfNull(Field(parent_fieldname), "") == "") + filters.append(["company", "=", company]) + if doctype == "Account": + fields.append("report_type") else: filters.append([parent_fieldname, "=", parent]) - - account_fields = ["account_name", "account_number", "account_currency", "freeze_account"] - if is_root: - fields += ["root_type", "report_type", *account_fields] if doctype == "Account" else [] - filters.append(["company", "=", company]) - - else: - fields += ["root_type", *account_fields] if doctype == "Account" else [] - fields += [parent_fieldname + " as parent"] + fields.append(parent_fieldname + " as parent") acc = frappe.get_list(doctype, fields=fields, filters=filters) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index ecd3aa8b4e3..12bdede4166 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -426,6 +426,26 @@ $.extend(erpnext.utils, { } return rows; }, + /** + * Row flags for the Account / Cost Center trees: the caller's badges plus + * a shared "Disabled" marker for records shown through the tree's + * "include disabled" toggle. + * @param {Object} node tree node (from treeview_settings.onrender) + * @param {Array} flags badge markup / elements + */ + render_tree_node_flags: function (node, flags = []) { + if (cint(node.data?.disabled)) { + flags.push(frappe.ui.badge({ label: __("Disabled"), variant: "outline" })); + node.$tree_link.find("a.tree-label").addClass("text-ink-gray-5"); + } + if (!flags.length) return; + const $flags = $( + '' + ); + flags.forEach((flag) => $flags.append(flag)); + $flags.insertAfter(node.$tree_link.find("a.tree-label")); + }, + get_tree_options: function (option) { // get valid options for tree based on user permission & locals dict let unscrub_option = frappe.model.unscrub(option); From f8c53be37651c4f972f7e5853a77fa5427226ca4 Mon Sep 17 00:00:00 2001 From: Sumit Jain Date: Thu, 3 Sep 2026 13:53:27 +0530 Subject: [PATCH 2/2] fix(accounts): drop unsupported badge theme on account number --- erpnext/accounts/doctype/account/account_tree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js index 7ffff22a1af..9f06bdf4dbd 100644 --- a/erpnext/accounts/doctype/account/account_tree.js +++ b/erpnext/accounts/doctype/account/account_tree.js @@ -62,7 +62,7 @@ frappe.treeview_settings["Account"] = { const flags = []; if (node.data.account_number) { - flags.push(frappe.ui.badge({ label: node.data.account_number, theme: "light" })); + flags.push(frappe.ui.badge({ label: node.data.account_number })); } const company = frappe.treeview_settings["Account"].treeview?.page?.fields_dict?.company?.get_value();