diff --git a/ns_app/hooks.py b/ns_app/hooks.py index 1802a5b..57f47f9 100644 --- a/ns_app/hooks.py +++ b/ns_app/hooks.py @@ -16,6 +16,11 @@ doctype_js = { "Sales Invoice": "public/js/sales_invoice.js" } +# Load on Customer list view (merges the "Generate Statements" action) +doctype_list_js = { + "Customer": "public/js/customer_list.js" +} + # Ensure custom fields exist after every migrate after_migrate = "ns_app.setup.after_migrate" diff --git a/ns_app/public/js/customer_list.js b/ns_app/public/js/customer_list.js new file mode 100644 index 0000000..ac239ed --- /dev/null +++ b/ns_app/public/js/customer_list.js @@ -0,0 +1,20 @@ +// Customer list action: "Generate Statements". Registered as a doctype_list_js +// so it loads alongside ERPNext's own Customer list settings (in app order, +// after them). We MERGE into listview_settings — preserving any existing +// onload / add_fields — instead of reassigning the object, which would clobber +// ERPNext's settings (and be clobbered by them). The shared generate/print +// helpers live on `ns_statements` (public/js/customer_statements.js). + +frappe.listview_settings["Customer"] = frappe.listview_settings["Customer"] || {}; + +(function () { + const settings = frappe.listview_settings["Customer"]; + const original_onload = settings.onload; + + settings.onload = function (listview) { + if (original_onload) original_onload(listview); + listview.page.add_inner_button(__("Generate Statements"), () => { + ns_statements.pick_and_generate(); + }); + }; +})(); diff --git a/ns_app/public/js/customer_statements.js b/ns_app/public/js/customer_statements.js index f417586..59a0bb5 100644 --- a/ns_app/public/js/customer_statements.js +++ b/ns_app/public/js/customer_statements.js @@ -6,14 +6,9 @@ frappe.provide("ns_statements"); -// ── Entry point: Customer list ─────────────────────────────────────────────── -frappe.listview_settings["Customer"] = { - onload(listview) { - listview.page.add_inner_button(__("Generate Statements"), () => { - ns_statements.pick_and_generate(); - }); - } -}; +// The Customer list button is registered separately in customer_list.js +// (a doctype_list_js) so it merges with — rather than overwrites — ERPNext's +// own listview_settings["Customer"]. Shared helpers live here on ns_statements. // ── Entry point: Customer form ─────────────────────────────────────────────── frappe.ui.form.on("Customer", {