import { createResource } from 'jingrow-ui' import { formatCurrency, formatNumber } from '@/utils/numberFormat.js' import { reactive } from 'vue' const doctypeMeta = reactive({}) const userSettings = reactive({}) export function getMeta(pagetype) { const meta = createResource({ url: 'jingrow.desk.form.load.getpagetype', params: { pagetype: pagetype, with_parent: 1, cached_timestamp: null, }, cache: ['Meta', pagetype], onSuccess: (res) => { let dtMetas = res.docs for (let dtMeta of dtMetas) { doctypeMeta[dtMeta.name] = dtMeta } userSettings[pagetype] = JSON.parse(res.user_settings) }, }) if (!doctypeMeta[pagetype] && !meta.loading) { meta.fetch() } function getFormattedPercent(fieldname, pg) { let value = getFormattedFloat(fieldname, pg) return value + '%' } function getFormattedFloat(fieldname, pg) { let df = doctypeMeta[pagetype]?.fields.find((f) => f.fieldname == fieldname) let precision = df?.precision || null return formatNumber(pg[fieldname], '', precision) } function getFloatWithPrecision(fieldname, pg) { let df = doctypeMeta[pagetype]?.fields.find((f) => f.fieldname == fieldname) let precision = df?.precision || null return formatNumber(pg[fieldname], '', precision) } function getCurrencyWithPrecision(fieldname, pg) { let df = doctypeMeta[pagetype]?.fields.find((f) => f.fieldname == fieldname) let precision = df?.precision || null return formatCurrency(pg[fieldname], '', '', precision) } function getFormattedCurrency(fieldname, pg, parentDoc = null) { let currency = window.sysdefaults.currency || 'USD' let df = doctypeMeta[pagetype]?.fields.find((f) => f.fieldname == fieldname) let precision = df?.precision || null if (df && df.options) { if (df.options.indexOf(':') != -1) { currency = currency // TODO: Handle this case } else if (pg && pg[df.options]) { currency = pg[df.options] } else if (parentDoc && parentDoc[df.options]) { currency = parentDoc[df.options] } } return formatCurrency(pg[fieldname], '', currency, precision) } function getGridSettings() { return doctypeMeta[pagetype] || {} } function getGridViewSettings(parentDoctype, dt = null) { dt = dt || pagetype if (!userSettings[parentDoctype]?.['GridView']?.[pagetype]) return {} return userSettings[parentDoctype]['GridView'][pagetype] } function getFields(dt = null) { dt = dt || pagetype return doctypeMeta[dt]?.fields.map((f) => { if (f.fieldtype === 'Select' && typeof f.options === 'string') { f.options = f.options.split('\n').map((option) => { return { label: option, value: option, } }) if (f.options[0]?.value !== '') { f.options.unshift({ label: '', value: '', }) } } if (f.fieldtype === 'Link' && f.options == 'User') { f.fieldtype = 'User' } return f }) } function saveUserSettings(parentDoctype, key, value, callback) { let oldUserSettings = userSettings[parentDoctype] || {} let newUserSettings = JSON.parse(JSON.stringify(oldUserSettings)) if (newUserSettings[key] === undefined) { newUserSettings[key] = { [pagetype]: value } } else { newUserSettings[key][pagetype] = value } if (JSON.stringify(oldUserSettings) !== JSON.stringify(newUserSettings)) { return createResource({ url: 'jingrow.model.utils.user_settings.save', params: { pagetype: parentDoctype, user_settings: JSON.stringify(newUserSettings), }, auto: true, onSuccess: () => { userSettings[parentDoctype] = newUserSettings callback?.() }, }) } userSettings[parentDoctype] = newUserSettings return callback?.() } return { meta, doctypeMeta, userSettings, getFields, getGridSettings, getGridViewSettings, saveUserSettings, getFloatWithPrecision, getCurrencyWithPrecision, getFormattedFloat, getFormattedPercent, getFormattedCurrency, } }