diff --git a/src/control/form/edit-form/edit-form.tsx b/src/control/form/edit-form/edit-form.tsx index 22dc5e3d9741bd4f162fa1dbf5b3d1e7276e4be9..1954c3b9a6e7016a6a90753ed4bdd90c86cdcaee 100644 --- a/src/control/form/edit-form/edit-form.tsx +++ b/src/control/form/edit-form/edit-form.tsx @@ -1,5 +1,9 @@ /* eslint-disable no-param-reassign */ -import { EditFormController, IControlProvider } from '@ibiz-template/runtime'; +import { + ControlVO, + EditFormController, + IControlProvider, +} from '@ibiz-template/runtime'; import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; import { IDEEditForm } from '@ibiz/model-core'; import { defineComponent, PropType, reactive, watch } from 'vue'; @@ -33,9 +37,11 @@ export const EditFormControl = defineComponent({ () => props.data, newVal => { const changeVal = newVal || {}; + const data = + c.data instanceof ControlVO ? c.data.getOrigin() : c.data; // 找有没有不一致的属性 - const find = Object.keys(c.data).find(key => { - return changeVal[key] !== c.data[key]; + const find = Object.keys(data).find(key => { + return changeVal[key] !== data[key]; }); // 内外部数据不一致时,只能是外部修改了,这是更新数据并重走load if (find) { diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-grid/repeater-grid.tsx b/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-grid/repeater-grid.tsx index 57fbf06025c83c3f0b30fcfcc0f12f34d21c232f..b3595cc90f64bb509823cfde9e64215106b8aa69 100644 --- a/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-grid/repeater-grid.tsx +++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-grid/repeater-grid.tsx @@ -7,6 +7,7 @@ import { watch, } from 'vue'; import { + ControlVO, EditFormController, EventBase, FormMDCtrlRepeaterController, @@ -69,9 +70,10 @@ export const RepeaterGrid = defineComponent({ ); formC.evt.on('onFormDataChange', (event: EventBase) => { // 隔离抛出不一样的对象 - const formData = { ...event.data[0] }; + const item = event.data[0]; + const formData = item instanceof ControlVO ? item.getOrigin() : item; const index = formControllers.indexOf(formC); - onSingleValueChange(formData, index); + onSingleValueChange({ ...formData }, index); }); }; @@ -84,8 +86,13 @@ export const RepeaterGrid = defineComponent({ if (formC) { const changeVal = item || {}; // 找有没有不一致的属性 - const find = Object.keys(formC.data).find(key => { - return changeVal[key] !== formC.data[key]; + const data = + formC.data instanceof ControlVO + ? formC.data.getOrigin() + : formC.data; + // 找有没有不一致的属性 + const find = Object.keys(data).find(key => { + return changeVal[key] !== data[key]; }); // 内外部数据不一致时,只能是外部修改了,这是更新数据并重走load if (find) { diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-single-form/repeater-single-form.tsx b/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-single-form/repeater-single-form.tsx index ee86eb56e0f36af26be3338b81b157b5ac9c38f7..457478ce688c8adec8865d5a81fca288fcd07d47 100644 --- a/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-single-form/repeater-single-form.tsx +++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl-repeater/repeater-single-form/repeater-single-form.tsx @@ -27,22 +27,11 @@ export const RepeaterSingleForm = defineComponent({ setup(props, { emit }) { const ns = useNamespace('repeater-single-form'); - const getFilteredData = (data: ControlVO): IData => { - const tempData: IData = {}; - // 处理界面上的属性数据 - data.$dataUIMap.forEach(dataUI => { - if (data[dataUI.dataKey] !== undefined) { - tempData[dataUI.dataKey] = data[dataUI.dataKey]; - } - }); - - return tempData; - }; - const onFormDataChange = (event: EventBase) => { // 隔离抛出不一样的对象 - const data = getFilteredData(event.data[0] as ControlVO); - emit('change', data); + const item = event.data[0]; + const formData = item instanceof ControlVO ? item.getOrigin() : item; + emit('change', { ...formData }); }; const onCreated = (event: EventBase): void => { diff --git a/src/view-engine/edit-view.engine.ts b/src/view-engine/edit-view.engine.ts index b4bea2a7d09e2655131e4374179a2fa7ddde91c2..f31d79ec1c0034bb3c436adc21ee3a0833058eb4 100644 --- a/src/view-engine/edit-view.engine.ts +++ b/src/view-engine/edit-view.engine.ts @@ -78,13 +78,44 @@ export class EditViewEngine extends ViewEngineBase { } } + /** + * 模态事件监听 + * + * @param {{ allowClose?: boolean }} context + * @return {*} {Promise} + * @memberof EditViewEngine + */ + async modalEventListener(context: { allowClose?: boolean }): Promise { + const uiDomain = ibiz.uiDomainManager.get(this.view.context.srfsessionid); + const isChange = + (this.form?.state.modified || uiDomain.dataModification) && + this.view.model.enableDirtyChecking === true; + if ( + isChange && + this.form?.model.enableAutoSave && + !uiDomain.dataModification + ) { + await this.form.immediateAutoSave(); + } else if (isChange && context.allowClose == null) { + const isAllow = await ibiz.confirm.error({ + title: ibiz.i18n.t('viewEngine.closeRemind'), + desc: ibiz.i18n.t('viewEngine.confirmClosePrompt'), + }); + if (!isAllow) { + context.allowClose = false; + } else { + context.allowClose = true; + } + } + } + async onCreated(): Promise { await super.onCreated(); + this.modalEventListener = this.modalEventListener.bind(this); const { childNames, modal } = this.view; childNames.push('form'); this.deName = calcDeCodeNameById(this.view.model.appDataEntityId!); - // 给表单加默认不加载 if (!this.view.slotProps.form) { this.view.slotProps.form = {}; @@ -96,30 +127,7 @@ export class EditViewEngine extends ViewEngineBase { this.view.slotProps.toolbar = {}; } this.view.slotProps.toolbar.manualCalcButtonState = true; - - modal.hooks.shouldDismiss.tapPromise(async context => { - const uiDomain = ibiz.uiDomainManager.get(this.view.context.srfsessionid); - const isChange = - (this.form?.state.modified || uiDomain.dataModification) && - this.view.model.enableDirtyChecking === true; - if ( - isChange && - this.form?.model.enableAutoSave && - !uiDomain.dataModification - ) { - await this.form.immediateAutoSave(); - } else if (isChange && context.allowClose == null) { - const isAllow = await ibiz.confirm.error({ - title: ibiz.i18n.t('viewEngine.closeRemind'), - desc: ibiz.i18n.t('viewEngine.confirmClosePrompt'), - }); - if (!isAllow) { - context.allowClose = false; - } else { - context.allowClose = true; - } - } - }); + modal.hooks.shouldDismiss.tapPromise(this.modalEventListener); } async onMounted(): Promise { @@ -572,10 +580,18 @@ export class EditViewEngine extends ViewEngineBase { // 变更主键并加载 if (targetItem) { // 处理关系数据 + const redrawParams: IData = {}; + const redrawContext: IData = {}; const appDataEntity = await ibiz.hub.getAppDataEntity( this.form.model.appDataEntityId!, this.form.context.srfappid, )!; + // 多表单类型属性名称 + const typeFileName = + appDataEntity.formTypeAppDEFieldId || + appDataEntity.dataTypeAppDEFieldId; + + // 处理重绘相关数据 if ( appDataEntity && appDataEntity.minorAppDERSs && @@ -593,17 +609,40 @@ export class EditViewEngine extends ViewEngineBase { majorAppDataEntityCodeName && targetItem![minorAppDERS.parentAppDEFieldId] ) { - this.view.context[majorAppDataEntityCodeName] = - targetItem![minorAppDERS.parentAppDEFieldId]; - this.form.context[majorAppDataEntityCodeName] = + redrawContext[majorAppDataEntityCodeName] = targetItem![minorAppDERS.parentAppDEFieldId]; } } }); } - this.view.context[this.deName] = targetItem.srfkey; - this.form.context[this.deName] = targetItem.srfkey; - this.load(); + redrawContext[this.deName] = targetItem.srfkey; + if (typeFileName) { + redrawParams.srfdatatype = targetItem[typeFileName]; + } + if (this.view.model.dynaSysMode === 1) { + this.view.onRedrawView({ + redrawContext, + redrawParams, + data: [targetItem], + }); + } else { + Object.assign(this.view.context, redrawContext); + Object.assign(this.form.context, redrawContext); + Object.assign(this.view.params, redrawParams); + Object.assign(this.form.params, redrawParams); + this.load(); + } } } + + /** + * 视图destroyed生命周期执行逻辑 + * + * @return {*} {Promise} + * @memberof EditViewEngine + */ + async onDestroyed(): Promise { + const { modal } = this.view; + modal.hooks.shouldDismiss.removeTapPromise(this.modalEventListener); + } }