diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js index 8760ccbb..a38e8ed6 100644 --- a/frontend/src/data/document.js +++ b/frontend/src/data/document.js @@ -75,6 +75,8 @@ export function useDocument(doctype, docname) { organizedControllers[controllerKey].push(controller) } controllersCache[doctype][docname || ''] = organizedControllers + + triggerOnload() } function getControllers(row = null) { @@ -93,9 +95,16 @@ export function useDocument(doctype, docname) { return [] } + async function triggerOnload() { + const handler = async function () { + await this.onload?.() + } + await trigger(handler) + } + async function triggerOnRefresh() { const handler = async function () { - await this.refresh() + await this.refresh?.() } await trigger(handler) } @@ -189,6 +198,8 @@ export function useDocument(doctype, docname) { return { document: documentsCache[doctype][docname || ''], assignees, + getControllers, + triggerOnload, triggerOnChange, triggerOnRowAdd, triggerOnRowRemove, diff --git a/frontend/src/data/script.js b/frontend/src/data/script.js index 9532fc11..b809f744 100644 --- a/frontend/src/data/script.js +++ b/frontend/src/data/script.js @@ -116,8 +116,13 @@ export function getScript(doctype, view = 'Form') { parentInstance = null, isChildDoctype = false, ) { + document.actions = document.actions || [] + document.statuses = document.statuses || [] + let instance = new FormClass() + // Store the original document context to be used by properties like 'actions' + instance._originalDocumentContext = document instance._isChildDoctype = isChildDoctype for (const key in document) { @@ -199,6 +204,76 @@ export function getScript(doctype, view = 'Form') { return createDocProxy(row, this) } } + + if (!Object.prototype.hasOwnProperty.call(FormClass.prototype, 'actions')) { + Object.defineProperty(FormClass.prototype, 'actions', { + configurable: true, + enumerable: true, + get() { + if (!this._originalDocumentContext) { + console.warn( + 'CRM Script: _originalDocumentContext not found on instance for actions getter.', + ) + return [] + } + + return this._originalDocumentContext.actions + }, + set(newValue) { + if (!this._originalDocumentContext) { + console.warn( + 'CRM Script: _originalDocumentContext not found on instance for actions setter.', + ) + return + } + if (!Array.isArray(newValue)) { + console.warn( + 'CRM Script: "actions" property must be an array. Value was not set.', + newValue, + ) + this._originalDocumentContext.actions = [] + return + } + this._originalDocumentContext.actions = newValue + }, + }) + } + + if ( + !Object.prototype.hasOwnProperty.call(FormClass.prototype, 'statuses') + ) { + Object.defineProperty(FormClass.prototype, 'statuses', { + configurable: true, + enumerable: true, + get() { + if (!this._originalDocumentContext) { + console.warn( + 'CRM Script: _originalDocumentContext not found on instance for statuses getter.', + ) + return [] + } + + return this._originalDocumentContext.statuses + }, + set(newValue) { + if (!this._originalDocumentContext) { + console.warn( + 'CRM Script: _originalDocumentContext not found on instance for statuses setter.', + ) + return + } + if (!Array.isArray(newValue)) { + console.warn( + 'CRM Script: "statuses" property must be an array. Value was not set.', + newValue, + ) + this._originalDocumentContext.statuses = [] + return + } + this._originalDocumentContext.statuses = newValue + }, + }) + } } // utility function to setup a form controller diff --git a/frontend/src/pages/Deal.vue b/frontend/src/pages/Deal.vue index d9b29299..9265db2e 100644 --- a/frontend/src/pages/Deal.vue +++ b/frontend/src/pages/Deal.vue @@ -12,13 +12,25 @@ v-if="deal.data._customActions?.length" :actions="deal.data._customActions" /> +