fix(statements): restore Customer list button (merge listview_settings)

The list button was registered by reassigning
frappe.listview_settings['Customer'] in a globally-loaded script, but
ERPNext's own Customer list_js (loaded when the list opens) overwrote it,
so the button never appeared. Register it via doctype_list_js instead —
which Frappe appends after the doctype's own list_js — and merge into the
existing settings (wrapping onload, preserving ERPNext's add_fields)
rather than reassigning. The form button and shared ns_statements helpers
stay in customer_statements.js.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 20:36:21 -04:00
parent 5181f4a177
commit 326adf865a
3 changed files with 28 additions and 8 deletions

View File

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

View File

@@ -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();
});
};
})();

View File

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