From c7eaef54f0894ee9e64becd2c54c11adcce3f9c6 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 26 May 2025 17:50:24 +0530 Subject: [PATCH] fix: handle script load while setting up script (cherry picked from commit 91f7cf05fc2a13e60ebb29c7703550f046d1d553) --- frontend/src/data/document.js | 44 ++++++++++++++++++++++++++++------- frontend/src/data/script.js | 16 +++++++++---- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js index f79fc9fd..bca9f713 100644 --- a/frontend/src/data/document.js +++ b/frontend/src/data/document.js @@ -14,7 +14,7 @@ export function useDocument(doctype, docname) { documentsCache[doctype][docname] = createDocumentResource({ doctype: doctype, name: docname, - onSuccess: () => setupFormScript(), + onSuccess: async () => await setupFormScript(), setValue: { onSuccess: () => { toast.success(__('Document updated successfully')) @@ -27,23 +27,49 @@ export function useDocument(doctype, docname) { }) } - function setupFormScript() { - if (controllersCache[doctype]?.[docname]) return + async function setupFormScript() { + if ( + controllersCache[doctype] && + typeof controllersCache[doctype][docname] === 'object' + ) { + return + } if (!controllersCache[doctype]) { controllersCache[doctype] = {} } - controllersCache[doctype][docname] = setupScript( - documentsCache[doctype][docname], - ) + controllersCache[doctype][docname] = {} + + const controllersArray = await setupScript(documentsCache[doctype][docname]) + + if (!controllersArray || controllersArray.length === 0) return + + const organizedControllers = {} + for (const controller of controllersArray) { + const controllerKey = controller.constructor.name // e.g., "CRMLead", "CRMProducts" + if (!organizedControllers[controllerKey]) { + organizedControllers[controllerKey] = [] + } + organizedControllers[controllerKey].push(controller) + } + controllersCache[doctype][docname] = organizedControllers } function getControllers(row = null) { const _doctype = row?.doctype || doctype - return (controllersCache[doctype]?.[docname] || []).filter( - (c) => c.constructor.name === _doctype.replace(/\s+/g, ''), - ) + const controllerKey = _doctype.replace(/\s+/g, '') + + const docControllers = controllersCache[doctype]?.[docname] + + if ( + typeof docControllers === 'object' && + docControllers !== null && + !Array.isArray(docControllers) + ) { + return docControllers[controllerKey] || [] + } + return [] } async function triggerOnRefresh() { diff --git a/frontend/src/data/script.js b/frontend/src/data/script.js index 1eff6b1e..265f0bf2 100644 --- a/frontend/src/data/script.js +++ b/frontend/src/data/script.js @@ -20,15 +20,23 @@ export function getScript(doctype, view = 'Form') { doctypeScripts[doctype][script.name] = script || {} } }, + onError: (err) => { + console.error( + `Error loading CRM Form Scripts for ${doctype} (view: ${view}):`, + err, + ) + }, }) if (!doctypeScripts[doctype] && !scripts.loading) { scripts.fetch() } - function setupScript(document, helpers = {}) { - let scripts = doctypeScripts[doctype] - if (!scripts) return null + async function setupScript(document, helpers = {}) { + await scripts.promise + + let scriptDefs = doctypeScripts[doctype] + if (!scriptDefs || Object.keys(scriptDefs).length === 0) return null const { $dialog, $socket, makeCall } = globalStore() @@ -42,7 +50,7 @@ export function getScript(doctype, view = 'Form') { makePhoneCall: makeCall, } - return setupMultipleFormControllers(scripts, document, helpers) + return setupMultipleFormControllers(scriptDefs, document, helpers) } function setupMultipleFormControllers(scriptStrings, document, helpers) {