feat(accounts): enhance account and cost center tree views with additional flags and labels

This commit is contained in:
Sumit Jain
2026-09-03 13:38:20 +05:30
parent e3a976f115
commit a1b402020e
5 changed files with 61 additions and 26 deletions

View File

@@ -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",

View File

@@ -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(
$(
`<span class="inline-flex text-ink-gray-4" title="${__("Frozen — entries restricted")}">
${frappe.utils.icon("lock", "sm")}
</span>`
)[0]
frappe.ui.badge({
label: __("Frozen"),
icon: "lock",
title: __("Frozen - entries restricted"),
theme: "orange",
})
);
}
if (flags.length) {
const $flags = $(
'<span class="tree-node-flags inline-flex items-center gap-1.5 ms-2 shrink-0"></span>'
);
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 = () => {

View File

@@ -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: [
{

View File

@@ -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)

View File

@@ -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<string|HTMLElement>} 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 = $(
'<span class="tree-node-flags inline-flex items-center gap-1.5 ms-2 shrink-0"></span>'
);
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);