fix: handle onchange of grid row field in modal

(cherry picked from commit 2d484c1ad2a7c70af1bb593bad1b9ee0a7bef54f)
This commit is contained in:
Shariq Ansari 2025-05-03 15:35:10 +05:30 committed by Mergify
parent 3c493b6cf3
commit 2e3a3016db
5 changed files with 40 additions and 24 deletions

View File

@ -327,7 +327,6 @@ const props = defineProps({
}) })
const triggerOnChange = inject('triggerOnChange') const triggerOnChange = inject('triggerOnChange')
const fieldname = inject('fieldname')
const { const {
getGridViewSettings, getGridViewSettings,
@ -426,11 +425,7 @@ const deleteRows = () => {
function fieldChange(value, field, row) { function fieldChange(value, field, row) {
row[field.fieldname] = value row[field.fieldname] = value
triggerOnChange(field.fieldname, { triggerOnChange(field.fieldname, row)
fieldname: fieldname,
dt: props.doctype,
dn: row.name,
})
} }
</script> </script>

View File

@ -23,7 +23,13 @@
</div> </div>
</div> </div>
<div> <div>
<FieldLayout v-if="tabs.data" :tabs="tabs.data" :data="data" /> <FieldLayout
v-if="tabs.data"
:tabs="tabs.data"
:data="data"
:doctype="doctype"
:isGridRow="true"
/>
</div> </div>
</div> </div>
</template> </template>

View File

@ -213,16 +213,23 @@ const props = defineProps({
const data = inject('data') const data = inject('data')
const doctype = inject('doctype') const doctype = inject('doctype')
const preview = inject('preview') const preview = inject('preview')
const isGridRow = inject('isGridRow')
const { getFormattedPercent, getFormattedFloat, getFormattedCurrency } = const { getFormattedPercent, getFormattedFloat, getFormattedCurrency } =
getMeta(doctype) getMeta(doctype)
const { getUser } = usersStore() const { getUser } = usersStore()
const { triggerOnChange } = useDocument(doctype, data.value.name) let triggerOnChange
provide('triggerOnChange', triggerOnChange) if (!isGridRow) {
provide('fieldname', props.field.fieldname) const { triggerOnChange: trigger } = useDocument(doctype, data.value.name)
triggerOnChange = trigger
provide('triggerOnChange', triggerOnChange)
} else {
triggerOnChange = inject('triggerOnChange')
}
const field = computed(() => { const field = computed(() => {
let field = props.field let field = props.field
@ -283,7 +290,11 @@ const getPlaceholder = (field) => {
function fieldChange(value, df) { function fieldChange(value, df) {
data.value[df.fieldname] = value data.value[df.fieldname] = value
triggerOnChange(df.fieldname) if (isGridRow) {
triggerOnChange(df.fieldname, data.value)
} else {
triggerOnChange(df.fieldname)
}
} }
</script> </script>
<style scoped> <style scoped>

View File

@ -34,6 +34,10 @@ const props = defineProps({
type: String, type: String,
default: 'CRM Lead', default: 'CRM Lead',
}, },
isGridRow: {
type: Boolean,
default: false,
},
preview: { preview: {
type: Boolean, type: Boolean,
default: false, default: false,
@ -55,6 +59,7 @@ provide(
provide('hasTabs', hasTabs) provide('hasTabs', hasTabs)
provide('doctype', props.doctype) provide('doctype', props.doctype)
provide('preview', props.preview) provide('preview', props.preview)
provide('isGridRow', props.isGridRow)
</script> </script>
<style scoped> <style scoped>
.section:not(:has(.field)) { .section:not(:has(.field)) {

View File

@ -41,38 +41,37 @@ export function useDocument(doctype, docname) {
documentsCache[doctype][docname]['controllers'] = controllers documentsCache[doctype][docname]['controllers'] = controllers
} }
async function triggerOnChange(fieldname, childTableObj) { async function triggerOnChange(fieldname, row) {
let controllers = documentsCache[doctype][docname]?.controllers let controllers = documentsCache[doctype][docname]?.controllers
if (Object.keys(controllers).length === 0) return if (Object.keys(controllers).length === 0) return
let _dt = childTableObj.dt ? childTableObj.dt : doctype let _dt = row?.doctype ? row.doctype : doctype
let doctypeClassName = _dt.replace(/\s+/g, '') let doctypeClassName = _dt.replace(/\s+/g, '')
const c = controllers[doctypeClassName] const c = controllers[doctypeClassName]
if (!c) return if (!c) return
if (childTableObj) { if (row) {
let grid = documentsCache[doctype][docname].doc[childTableObj.fieldname] c.row = () => row
c.row = grid.find((row) => row.name === childTableObj.dn) c.value = row[fieldname]
c.oldValue = getOldValue(fieldname, childTableObj) c.oldValue = getOldValue(fieldname, row)
c.value = c.row[fieldname]
} else { } else {
c.oldValue = getOldValue(fieldname)
c.value = documentsCache[doctype][docname].doc[fieldname] c.value = documentsCache[doctype][docname].doc[fieldname]
c.oldValue = getOldValue(fieldname)
} }
return await c[fieldname]?.() return await c[fieldname]?.()
} }
function getOldValue(fieldname, childTableObj) { function getOldValue(fieldname, row) {
if (!documentsCache[doctype][docname]) return '' if (!documentsCache[doctype][docname]) return ''
const document = documentsCache[doctype][docname] const document = documentsCache[doctype][docname]
const oldDoc = document.originalDoc const oldDoc = document.originalDoc
if (childTableObj?.dn) { if (row?.name) {
return oldDoc?.[childTableObj.fieldname]?.find( return oldDoc?.[row.parentfield]?.find((r) => r.name === row.name)?.[
(r) => r.name === childTableObj.dn, fieldname
)?.[fieldname] ]
} }
return oldDoc?.[fieldname] || document.doc[fieldname] return oldDoc?.[fieldname] || document.doc[fieldname]