crm/frontend/src/data/document.js
2025-05-01 17:56:18 +05:30

74 lines
2.0 KiB
JavaScript

import { getScript } from '@/data/script'
import { createToast } from '@/utils'
import { createDocumentResource } from 'frappe-ui'
const documentsCache = {}
export function useDocument(doctype, docname) {
const { setupScript } = getScript(doctype)
documentsCache[doctype] = documentsCache[doctype] || {}
if (!documentsCache[doctype][docname]) {
documentsCache[doctype][docname] = createDocumentResource({
doctype: doctype,
name: docname,
onSuccess: () => setupFormScript(),
setValue: {
onSuccess: () => {
createToast({
title: 'Data Updated',
icon: 'check',
iconClasses: 'text-ink-green-3',
})
},
onError: (err) => {
createToast({
title: 'Error',
text: err.messages[0],
icon: 'x',
iconClasses: 'text-red-600',
})
},
},
})
}
function setupFormScript() {
const controllers = setupScript(documentsCache[doctype][docname])
const doctypeName = doctype.replace(/\s+/g, '')
const doctypeController = controllers[doctypeName]
if (!doctypeController) return
documentsCache[doctype][docname]['controller'] = doctypeController
}
async function triggerOnChange(fieldname) {
if (!documentsCache[doctype][docname]?.controller) return
const c = documentsCache[doctype][docname].controller
c.oldValue = getOldValue(fieldname)
c.value = documentsCache[doctype][docname].doc[fieldname]
return await c[fieldname]?.()
}
function getOldValue(fieldname) {
if (!documentsCache[doctype][docname]) return ''
const document = documentsCache[doctype][docname]
const oldDoc = document.originalDoc
return oldDoc?.[fieldname] || document.doc[fieldname]
}
return {
document: documentsCache[doctype][docname],
getActions: () =>
documentsCache[doctype][docname]?.controller?.actions || [],
getOldValue,
triggerOnChange,
setupFormScript,
}
}