diff --git a/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts b/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts index ec9dd6415c0479bdeeb1d3a41d1913a7cd2beb5e..aaa1d0d8922743c403329628bc692ca8e70c91a4 100644 --- a/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts +++ b/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts @@ -3,6 +3,7 @@ import { IDataEntity, IPanelController } from '@ibiz-template/runtime'; import { IDEEditForm } from '@ibiz/model-core'; import { IPortalMessage } from '@ibiz-template/core'; import { X6CellDataProvider, X6CellServiceProvider } from '../../interface'; +import { X6Controller } from '../x6-controller/x6-controller'; /** * X6图形控制器 @@ -84,6 +85,7 @@ export abstract class X6CellController { constructor( protected panel: IPanelController, g: Graph, + protected x6: X6Controller, ) { this.context = panel.context; this.params = panel.params; diff --git a/packages/antv-x6-design/src/controller/x6-controller/x6-controller.event.ts b/packages/antv-x6-design/src/controller/x6-controller/x6-controller.event.ts index 725e23ff55cbf2f5e954b23b9ea9fcb4dfa435d8..956758567219aed88b028d5ebcb82b73b731fed6 100644 --- a/packages/antv-x6-design/src/controller/x6-controller/x6-controller.event.ts +++ b/packages/antv-x6-design/src/controller/x6-controller/x6-controller.event.ts @@ -9,4 +9,94 @@ export interface X6ControllerEvent extends IComponentEvent { event: EventBase; emitArgs: undefined; }; + + /** + * 节点新建 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:22 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onNodeCreated: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 节点更新 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:34 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onNodeUpdated: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 节点删除 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:48 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onNodeRemoved: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 连线新建 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:00 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onLinkCreated: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 连线更新 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:15 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onLinkUpdated: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 连线删除 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:26 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onLinkRemoved: { + event: EventBase; + emitArgs: undefined; + }; } diff --git a/packages/antv-x6-design/src/controller/x6-controller/x6-controller.ts b/packages/antv-x6-design/src/controller/x6-controller/x6-controller.ts index 68578e48fd8ad773933243ebf3217c91a680dd1d..884c02d921f8636e2d0131a6b8463a64b7558565 100644 --- a/packages/antv-x6-design/src/controller/x6-controller/x6-controller.ts +++ b/packages/antv-x6-design/src/controller/x6-controller/x6-controller.ts @@ -199,8 +199,8 @@ export class X6Controller { this.graphOptions.container = dom; this.g = new Graph(this.graphOptions); // this.dnd = new Dnd({ target: this.g }); - this.link = new X6LinkController(panel, this.g); - this.node = new X6NodeController(panel, this.g); + this.link = new X6LinkController(panel, this.g, this); + this.node = new X6NodeController(panel, this.g, this); this.init(); } diff --git a/packages/antv-x6-design/src/controller/x6-link-controller/x6-link-controller.ts b/packages/antv-x6-design/src/controller/x6-link-controller/x6-link-controller.ts index 70ea5aea7933d4ad095b621ac9a166a5422885ad..19b05849570807aaf6dbef676fed0ad610d5b023 100644 --- a/packages/antv-x6-design/src/controller/x6-link-controller/x6-link-controller.ts +++ b/packages/antv-x6-design/src/controller/x6-link-controller/x6-link-controller.ts @@ -209,6 +209,7 @@ export class X6LinkController extends X6CellController { const cell = this.provider.createCell(dataProvider); const newEdge = this.g.addEdge(cell); this.g.resetSelection([newEdge]); + this.x6.evt.emit('onLinkCreated', undefined); } catch (error) { ibiz.log.error(error); this.g.removeEdge(edge.id); @@ -226,6 +227,7 @@ export class X6LinkController extends X6CellController { async updateEdge(edge: Edge): Promise { if (this.map.has(edge.id) === true) { await this.provider.update(this.context, this.params, edge); + this.x6.evt.emit('onLinkUpdated', undefined); } } @@ -246,6 +248,7 @@ export class X6LinkController extends X6CellController { ); if (data) { this.map.delete(edge.id); + this.x6.evt.emit('onLinkRemoved', undefined); return true; } } diff --git a/packages/antv-x6-design/src/controller/x6-node-controller/x6-node-controller.ts b/packages/antv-x6-design/src/controller/x6-node-controller/x6-node-controller.ts index f1a117ab6b2b1429c1f5e8ab069cbe75843430f7..85291e037b9580092feeb13f904212a8516cac87 100644 --- a/packages/antv-x6-design/src/controller/x6-node-controller/x6-node-controller.ts +++ b/packages/antv-x6-design/src/controller/x6-node-controller/x6-node-controller.ts @@ -187,6 +187,7 @@ export class X6NodeController extends X6CellController { const newNode = this.g.addNode(this.provider.createCell(dataProvider)); await this.provider.createEdges(newNode, this.g); this.g.resetSelection([newNode]); + this.x6.evt.emit('onNodeCreated', undefined); } catch (error) { ibiz.log.error(error); this.g.removeNode(node.id); @@ -236,6 +237,7 @@ export class X6NodeController extends X6CellController { async updateNode(node: Node): Promise { if (this.map.has(node.id) === true) { await this.provider.update(this.context, this.params, node); + this.x6.evt.emit('onNodeUpdated', undefined); } } @@ -256,6 +258,7 @@ export class X6NodeController extends X6CellController { ); if (data) { this.map.delete(node.id); + this.x6.evt.emit('onNodeRemoved', undefined); return true; } } diff --git a/packages/antv-x6-design/src/panel-items/x6-panel-item-table/x6-panel-item-table.controller.ts b/packages/antv-x6-design/src/panel-items/x6-panel-item-table/x6-panel-item-table.controller.ts index ca5158db9b354f809a8bfe6b266b64fa700fdbc9..db3725d4f0a9706bc08cf96b0df3cbf1790c6b81 100644 --- a/packages/antv-x6-design/src/panel-items/x6-panel-item-table/x6-panel-item-table.controller.ts +++ b/packages/antv-x6-design/src/panel-items/x6-panel-item-table/x6-panel-item-table.controller.ts @@ -423,6 +423,7 @@ export class X6PanelItemTableController extends PanelItemController { @@ -505,6 +506,7 @@ export class X6PanelItemTableController extends PanelItemController { const source = this.controller.state.nodes[$index]; + if (!source) { + return; + } let style = {}; if (source.param12) { style = { '--el-tag-text-color': source.param12 }; @@ -167,9 +170,6 @@ export default defineComponent({ '--el-tag-border-color': source.param13, }); } - if (!source) { - return; - } return (
{ const target = this.controller.state.nodes[$index - 1]; + if (!target) { + return; + } let style = {}; if (target.param12) { style = { '--el-tag-text-color': target.param12 }; @@ -342,9 +345,6 @@ export default defineComponent({ '--el-tag-border-color': target.param13, }); } - if (!target) { - return; - } return (
this.state.loading = false; }); } + this.x6.evt.onAll(eventName => { + if ( + [ + 'onNodeCreated', + 'onNodeUpdated', + 'onNodeRemoved', + 'onLinkCreated', + 'onLinkUpdated', + 'onLinkRemoved', + ].includes(eventName) + ) { + this.view.evt.emit('onEditAction', undefined); + } + }); } /** diff --git a/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts b/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts index 03e68270d63e3a6e1ccfef8ea3b19368a77de4e3..bf631e62a9e6a009f9d9d931075418fc8f0efeaf 100644 --- a/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts +++ b/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts @@ -30,4 +30,19 @@ export interface X6DesignViewEvent extends IViewEvent { event: EventBase; emitArgs: undefined; }; + + /** + * 编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:18 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onEditAction: { + event: EventBase; + emitArgs: undefined; + }; } diff --git a/packages/antv-x6-design/src/views/x6-design-view/x6-design-view.engine.ts b/packages/antv-x6-design/src/views/x6-design-view/x6-design-view.engine.ts index 133c452592de4c370f53d809fec49754429092ec..e3786dd5bdeaf6ba6df297b48d9ddd34d876ddb6 100644 --- a/packages/antv-x6-design/src/views/x6-design-view/x6-design-view.engine.ts +++ b/packages/antv-x6-design/src/views/x6-design-view/x6-design-view.engine.ts @@ -1,9 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-restricted-syntax */ import { + DEMainViewEngine, + EditFormController, EditFormService, IDataEntity, SysUIActionTag, - ViewEngineBase, + ViewController, + ViewMode, findModelChild, getControl, } from '@ibiz-template/runtime'; @@ -24,7 +28,7 @@ import { X6CellDataProvider } from '../../interface'; * @class X6DesignViewEngine * @extends {ViewEngineBase} */ -export class X6DesignViewEngine extends ViewEngineBase { +export class X6DesignViewEngine extends DEMainViewEngine { protected declare view: X6DesignViewController; /** @@ -67,6 +71,178 @@ export class X6DesignViewEngine extends ViewEngineBase { */ protected service!: EditFormService; + /** + * 当前激活属性视图 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:33 + * @protected + * @type {ViewController} + */ + protected activePropertyView?: ViewController; + + /** + * 编辑事件列表 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:59 + * @protected + * @type {string[]} + */ + protected editEventNames: string[] = ['onEditAction']; + + /** + * 是否正在等待计时器 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:37 + * @protected + * @type {boolean} + */ + protected isWait: boolean = false; + + /** + * 获取数据 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:15 + * @return {*} {IData[]} + */ + getData(): IData[] { + return [this.view.state.data]; + } + + /** + * 初始化标记打开数据相关逻辑 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:48 + * @protected + * @return {*} {void} + */ + protected initMarkOpenData(): void { + if ( + !this.coopPos || + ![ViewMode.ROUTE, ViewMode.ROUTE_MODAL].includes(this.view.modal.mode) + ) { + return; + } + this.markModes = [ + 'OPENDATA', + 'EDITDATA', + 'DISPLAYOPPERSON', + 'NOTICERELOAD', + ]; + this.coopPos.initMessageModes(this.markModes); + this.doActions = []; + this.doActions.push('EDIT', 'VIEW', 'UPDATE', 'CLOSE'); + this.view.evt.on('onUpdateAccessState', async () => { + this.sendViewDataAction(); + }); + this.doMarkDataAction(); + } + + /** + * 发送编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:06 + * @protected + * @return {*} {void} + */ + protected sendEditAction(): void { + if (this.isWait) { + return; + } + const data = this.getData()[0]; + if (!data) { + return; + } + this.isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + this.isWait = false; + }, + 1000 * 60 * 5, + ); + } + + /** + * 执行标记数据行为 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:36 + * @protected + */ + protected doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('VIEW')) { + this.view.evt.on('onMounted', () => this.sendViewDataAction()); + } + if (this.doActions.includes('EDIT')) { + this.view.evt.onAll(eventName => { + if (this.editEventNames.includes(eventName)) { + this.sendEditAction(); + } + }); + } + if (this.doActions.includes('UPDATE')) { + this.view.evt.on('onSaveSuccess', () => { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + }); + } + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:00 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.refreshView(); + } + + /** + * 初始化属性视图 + * + * @author zhanghengfeng + * @date 2025-02-27 21:02:39 + * @protected + */ + protected initPropertyView(): void { + this.view.layoutPanel?.evt?.on('onPresetPanelItemEvent', (event: IData) => { + if (!event) { + return; + } + const { panelItemEventName, panelItemName, presetParams } = event; + if ( + panelItemName === 'nav_pos' && + panelItemEventName === 'onViewCreated' && + presetParams + ) { + this.activePropertyView = presetParams.view; + if (this.doActions.includes('EDIT')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onFormDataChange', () => + this.sendEditAction(), + ); + }); + } + } + }); + } + /** * 初始化tab导航 * @@ -112,7 +288,7 @@ export class X6DesignViewEngine extends ViewEngineBase { this.view.select.on(this.onSelect); this.view.modal.hooks.shouldDismiss.tapPromise(async context => { const uiDomain = ibiz.uiDomainManager.get(this.view.context.srfsessionid); - if (uiDomain.dataModification === true && context.allowClose == null) { + if (uiDomain?.dataModification === true && context.allowClose == null) { const isAllow = await ibiz.confirm.error({ title: '关闭提醒', desc: '数据已经修改,确定要关闭?', @@ -144,6 +320,7 @@ export class X6DesignViewEngine extends ViewEngineBase { this.x6 = this.view.layoutPanel!.panelItems .x6_panel_item as X6PanelItemController; this.activeRoot(); + this.initPropertyView(); this.view.evt.emit('onViewInfoChange', { dataInfo: this.view.state.data.srfmajortext || '', }); diff --git a/packages/bi-report-design/src/panel-items/bi-report-content/bi-report-content.controller.ts b/packages/bi-report-design/src/panel-items/bi-report-content/bi-report-content.controller.ts index 8cc112572dbf3d666e055255b13e09b9e6686195..6993f39c1249961cf1bee6e959dd1a2760ce82da 100644 --- a/packages/bi-report-design/src/panel-items/bi-report-content/bi-report-content.controller.ts +++ b/packages/bi-report-design/src/panel-items/bi-report-content/bi-report-content.controller.ts @@ -160,6 +160,9 @@ export class BIReportContentController extends PanelItemController { + await this.load(); + }); } /** @@ -357,6 +360,7 @@ export class BIReportContentController extends PanelItemController { + this.state.isBuilded = false; + // 初始化选中图表类型 + this.state.selectedChartType = + this.view.state.data?.chart_type || 'NUMBER'; + // 更新选中图表表单 + this.state.selectedFormModel = await this.getSelectedChartFormModel( + this.state.selectedChartType, + ); + this.state.isBuilded = true; + }); } /** @@ -369,6 +380,7 @@ export class BIReportOperationController extends PanelItemController { + this.load(); + }); } /** @@ -214,6 +217,7 @@ export class ReportDesignCtx { if (type === 'DIMENSION') { this.loadCubeDimension(); } + this.view.evt.emit('onEditAction', undefined); } /** diff --git a/packages/chart-design/src/panel-items/chart_design_operation/chart-design-operation.controller.ts b/packages/chart-design/src/panel-items/chart_design_operation/chart-design-operation.controller.ts index e8569ef98e898bed8ec8ffbb8a12e8357c2accac..6a5ad419f67d907a813a168b93027488265273a3 100644 --- a/packages/chart-design/src/panel-items/chart_design_operation/chart-design-operation.controller.ts +++ b/packages/chart-design/src/panel-items/chart_design_operation/chart-design-operation.controller.ts @@ -558,6 +558,7 @@ export class ChartDesignOperationController extends PanelItemController { + this.sendViewDataAction(); + }); + this.doMarkDataAction(); + } + + /** + * 发送编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:37 + * @protected + * @return {*} {void} + */ + protected sendEditAction(): void { + if (this.isWait) { + return; + } + const data = this.getData()[0]; + if (!data) { + return; + } + this.isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + this.isWait = false; + }, + 1000 * 60 * 5, + ); + } + + /** + * 执行标记数据行为 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:05 + * @protected + */ + protected doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('VIEW')) { + this.view.evt.on('onMounted', () => this.sendViewDataAction()); + } + if (this.doActions.includes('EDIT')) { + this.view.evt.onAll(eventName => { + if (this.editEventNames.includes(eventName)) { + this.sendEditAction(); + } + }); + } + if (this.doActions.includes('UPDATE')) { + this.view.evt.on('onSaveSuccess', () => { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + }); + } + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:33 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.refreshView(); + } + /** * 初始化tab导航 * @@ -213,7 +349,17 @@ export class DesignViewEngineBase extends ViewEngineBase { panelItemName === 'nav_pos' && panelItemEventName === 'onViewCreated' ) { - this.activePropertyView = presetParams.view; + this.activePropertyView = presetParams?.view; + if (this.doActions.includes('EDIT')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onFormDataChange', () => + this.sendEditAction(), + ); + }); + } } }, ); diff --git a/packages/dnd-design/src/panel-items/dnd-design/dnd-design.controller.ts b/packages/dnd-design/src/panel-items/dnd-design/dnd-design.controller.ts index b4c24c51aeea5827a3dc69a05992b066868c09d6..995b6ca1d2ab4da26fe7fd95cca5f43f07de01e7 100644 --- a/packages/dnd-design/src/panel-items/dnd-design/dnd-design.controller.ts +++ b/packages/dnd-design/src/panel-items/dnd-design/dnd-design.controller.ts @@ -645,6 +645,7 @@ export class DndDesignPanelItemController type: 'COMMAND', subtype: 'OBJECTCREATED', }); + this.view.evt.emit('onCreateSuccess', undefined); items.splice(index, 0, data2); this.view.select.set(res2.data); await this.move(items, index, items.length - 1); @@ -686,6 +687,7 @@ export class DndDesignPanelItemController if (Array.isArray(res.data)) { this.sendMessage(res.data, 'OBJECTUPDATED'); } + this.view.evt.emit('onUpdateSuccess', undefined); ibiz.log.debug('排序成功'); } } @@ -709,6 +711,7 @@ export class DndDesignPanelItemController items.splice(index2, 1); this.removeController(item); this.sendMessage([item], 'OBJECTREMOVED'); + this.view.evt.emit('onRemoveSuccess', undefined); // 删除后默认选中第一个,如果没有则选中父节点,如果没有父节点则选中根节点 const select = items[0] || this.items.find(it => it.srfkey === item.srfpkey); diff --git a/packages/dnd-design/src/panel-items/dnd-stencil/dnd-stencil.controller.ts b/packages/dnd-design/src/panel-items/dnd-stencil/dnd-stencil.controller.ts index 1d789dbf3d63b03abc8a3571617b7dea4744f2e4..0d6bff51d14cc6f2097fddcb8c02ece8beefe3f8 100644 --- a/packages/dnd-design/src/panel-items/dnd-stencil/dnd-stencil.controller.ts +++ b/packages/dnd-design/src/panel-items/dnd-stencil/dnd-stencil.controller.ts @@ -159,11 +159,12 @@ export class DndStencilPanelItemController extends PanelItemController { const actionId = detail.uiactionId; - + const context = this.view.context.clone(); + delete context.srfrunmode; await UIActionUtil.execAndResolved( actionId!, { - context: this.panel.context, + context, params: this.panel.params, data: [], view: this.panel.view, diff --git a/packages/dnd-design/src/panel-items/dnd-structure/dnd-structure.controller.ts b/packages/dnd-design/src/panel-items/dnd-structure/dnd-structure.controller.ts index 7f7cc8bb0bbb6a5238a2ca05e7950168094813b9..da4cf40a6c672c6ec344e9349f75e30063af0ef2 100644 --- a/packages/dnd-design/src/panel-items/dnd-structure/dnd-structure.controller.ts +++ b/packages/dnd-design/src/panel-items/dnd-structure/dnd-structure.controller.ts @@ -424,6 +424,7 @@ export class DndStructurePanelItemController extends PanelItemController { + this.sendViewDataAction(); + }); + this.doMarkDataAction(); + } + + /** + * 发送编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:50 + * @protected + * @return {*} {void} + */ + protected sendEditAction(): void { + if (this.isWait) { + return; + } + const data = this.getData()[0]; + if (!data) { + return; + } + this.isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + this.isWait = false; + }, + 1000 * 60 * 5, + ); + } + + /** + * 执行标记数据行为 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:22 + * @protected + */ + protected doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('VIEW')) { + this.view.evt.on('onMounted', () => this.sendViewDataAction()); + } + if (this.doActions.includes('EDIT')) { + this.view.evt.onAll(eventName => { + if (this.editEventNames.includes(eventName)) { + this.sendEditAction(); + } + }); + } + if (this.doActions.includes('UPDATE')) { + this.view.evt.on('onSaveSuccess', () => { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + }); + } + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:10 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.refreshView(); + } + + /** + * 初始化属性视图 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:44 + * @protected + */ + protected initPropertyView(): void { + this.view.layoutPanel?.evt?.on('onPresetPanelItemEvent', (event: IData) => { + if (!event) { + return; + } + const { panelItemEventName, panelItemName, presetParams } = event; + if ( + panelItemName === 'nav_pos' && + panelItemEventName === 'onViewCreated' && + presetParams + ) { + this.activePropertyView = presetParams.view; + if (this.doActions.includes('EDIT')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onFormDataChange', () => + this.sendEditAction(), + ); + }); + } + } + }); + } + /** * 初始化tab导航 * @@ -141,6 +320,7 @@ export class DndDesignViewEngine extends ViewEngineBase { ); this.navPos = this.view.layoutPanel!.panelItems.nav_pos as NavPosController; this.activeRoot(); + this.initPropertyView(); this.view.evt.emit('onViewInfoChange', { dataInfo: this.view.state.data.srfmajortext || '', }); diff --git a/packages/dnd-design/src/views/dnd-design-view/interface/dnd-design-view.event.ts b/packages/dnd-design/src/views/dnd-design-view/interface/dnd-design-view.event.ts index 83f3ae21138e6a09afc1bdde34583bc0147346c4..8092d4be41c80fa600f28d9c127d0f46b3942511 100644 --- a/packages/dnd-design/src/views/dnd-design-view/interface/dnd-design-view.event.ts +++ b/packages/dnd-design/src/views/dnd-design-view/interface/dnd-design-view.event.ts @@ -76,4 +76,49 @@ export interface DndDesignViewEvent extends IViewEvent { event: EventBase & { isPreview: boolean }; emitArgs: { isPreview: boolean }; }; + + /** + * 更新成功 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:28 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onUpdateSuccess: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 删除成功 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:37 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onRemoveSuccess: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 创建成功 + * + * @author zhanghengfeng + * @date 2025-02-27 22:02:50 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onCreateSuccess: { + event: EventBase; + emitArgs: undefined; + }; } diff --git a/packages/er-design/src/panel-items/er_design_content/er-design-content.controller.ts b/packages/er-design/src/panel-items/er_design_content/er-design-content.controller.ts index 733b9b8e84ac8541c202d16be898f798a19cbdd9..8da78b486f2d2f5622c10447428e84a8b19fc60b 100644 --- a/packages/er-design/src/panel-items/er_design_content/er-design-content.controller.ts +++ b/packages/er-design/src/panel-items/er_design_content/er-design-content.controller.ts @@ -80,6 +80,12 @@ export class ERDesignContentController extends PanelItemController { + if (!this.x6 || this.x6.g.disposed) { + return; + } + await this.x6.refresh(); + }); this.onPanelCreated = this.onPanelCreated.bind(this); this.panel.evt.on('onCreated', this.onPanelCreated); this.onPanelActivated = this.onPanelActivated.bind(this); diff --git a/packages/er-design/src/views/er-design-view/er-design-view.engine.ts b/packages/er-design/src/views/er-design-view/er-design-view.engine.ts index 65c1eb9dcaeb4768142db94468b5ffa36bf77ba8..284b8e4a94d79a3a7298b4b85ce7fe414dc07d64 100644 --- a/packages/er-design/src/views/er-design-view/er-design-view.engine.ts +++ b/packages/er-design/src/views/er-design-view/er-design-view.engine.ts @@ -1,25 +1,18 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { - ControlController, + DEMainViewEngine, + EditFormController, EditFormService, IDataEntity, IEditFormController, - IPanelItemCoopPosController, SysUIActionTag, ViewController, - ViewEngineBase, ViewMode, - calcDeCodeNameById, convertNavData, getControl, } from '@ibiz-template/runtime'; import { IDEEditForm } from '@ibiz/model-core'; -import { - IHttpResponse, - IMarkOpenData, - IPortalMessage, - RuntimeModelError, -} from '@ibiz-template/core'; +import { RuntimeModelError } from '@ibiz-template/core'; import { NavPosController } from '@ibiz-template/vue3-util'; import { ERDesignViewController } from './er-design-view.controller'; import { ERDesignContentController } from '../../panel-items/er_design_content/er-design-content.controller'; @@ -33,7 +26,7 @@ import { ERDesignContentController } from '../../panel-items/er_design_content/e * @class ERDesignViewEngine * @extends {ViewEngineBase} */ -export class ERDesignViewEngine extends ViewEngineBase { +export class ERDesignViewEngine extends DEMainViewEngine { /** * 视图控制器 * @@ -94,19 +87,6 @@ export class ERDesignViewEngine extends ViewEngineBase { */ protected activePropertyView!: ViewController; - /** - * 协同消息占位控制器 - * - * @author tony001 - * @date 2024-08-30 13:08:54 - * @readonly - * @type {(IPanelItemCoopPosController | undefined)} - */ - get coopPos(): IPanelItemCoopPosController | undefined { - return this.view.layoutPanel?.panelItems - .coop_pos as IPanelItemCoopPosController; - } - /** * 设计区控制器 * @@ -120,6 +100,152 @@ export class ERDesignViewEngine extends ViewEngineBase { .er_design_content as ERDesignContentController; } + /** + * 更新事件列表 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:23 + * @protected + * @type {string[]} + */ + protected updateEventNames: string[] = [ + 'onNodeCreated', + 'onNodeUpdated', + 'onNodeRemoved', + 'onLinkCreated', + 'onLinkUpdated', + 'onLinkRemoved', + 'onVerticesChange', + ]; + + /** + * 是否正在等待定时器 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:01 + * @protected + * @type {boolean} + */ + protected isWait: boolean = false; + + /** + * 获取数据 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:35 + * @return {*} {IData[]} + */ + getData(): IData[] { + return [this.view.state.data]; + } + + /** + * 初始化标记打开数据相关逻辑 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:03 + * @protected + * @return {*} {void} + */ + protected initMarkOpenData(): void { + if ( + !this.coopPos || + ![ViewMode.ROUTE, ViewMode.ROUTE_MODAL].includes(this.view.modal.mode) + ) { + return; + } + this.markModes = [ + 'OPENDATA', + 'EDITDATA', + 'DISPLAYOPPERSON', + 'NOTICERELOAD', + ]; + this.coopPos.initMessageModes(this.markModes); + this.doActions = []; + this.doActions.push('EDIT', 'VIEW', 'UPDATE', 'CLOSE'); + this.view.evt.on('onUpdateAccessState', async () => { + this.sendViewDataAction(); + }); + this.doMarkDataAction(); + } + + /** + * 发送编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:16 + * @protected + * @return {*} {void} + */ + protected sendEditAction(): void { + if (this.isWait) { + return; + } + const data = this.getData()[0]; + if (!data) { + return; + } + this.isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + this.isWait = false; + }, + 1000 * 60 * 5, + ); + } + + /** + * 执行标记数据行为 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:53 + * @protected + */ + protected doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('VIEW')) { + this.view.evt.on('onMounted', () => this.sendViewDataAction()); + } + if (this.doActions.includes('UPDATE')) { + this.erDesignContent?.x6?.evt?.onAll(eventName => { + if (this.updateEventNames.includes(eventName)) { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + } + }); + } + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:10 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.load(); + if (this.view.select.data?.id === this.view.state.data?.srfkey) { + if (this.activePropertyView) { + this.activePropertyView.redrawView({ + context: this.activePropertyView.context, + params: this.activePropertyView.params, + }); + } + } else { + this.activeRoot(); + } + this.view.evt.emit('onRefreshView', undefined); + this.view.evt.emit('onViewInfoChange', { + dataInfo: this.view.state.data?.srfmajortext || '', + }); + } + /** * 初始化tab导航 * @@ -206,10 +332,6 @@ export class ERDesignViewEngine extends ViewEngineBase { ); this.navPos = this.view.layoutPanel!.panelItems.nav_pos as NavPosController; this.activeRoot(); - // 配置有协同消息占位,才初始化markopendata服务 - if (this.coopPos) { - this.initMarkOpenData(); - } // 初始化属性视图 this.initPropertyView(); @@ -232,108 +354,33 @@ export class ERDesignViewEngine extends ViewEngineBase { panelItemName === 'nav_pos' && panelItemEventName === 'onViewCreated' ) { - this.activePropertyView = presetParams.view; - } - }); - } - - /** - * 监听实体数据变更 - * - * @author tony001 - * @date 2024-08-30 13:08:09 - * @protected - * @param {IPortalMessage} msg - */ - protected onDEDataChange(msg: IPortalMessage): void { - const propertyForm = this.activePropertyView?.getController( - 'form', - ) as ControlController; - if (propertyForm && propertyForm.triggerKey === msg.triggerKey) { - const deName = calcDeCodeNameById(this.form.appDataEntityId!); - const srfkey = this.view.state.data.srfkey; - // 发送更新通知 - ibiz.markOpenData.action(deName, srfkey, 'UPDATE'); - } - } - - /** - * 初始化标记打开数据相关逻辑 - * - * @author tony001 - * @date 2024-08-30 13:08:52 - * @return {*} {Promise} - */ - async initMarkOpenData(): Promise { - // 非路由视图不需要触发(防止多个界面同时操作一条数据,消息重复) - if ( - ![ViewMode.ROUTE, ViewMode.ROUTE_MODAL].includes(this.view.modal.mode) || - !this.coopPos - ) { - return; - } - // 初始化协同编辑占位消息模式 - 显示操作人员 - this.coopPos.initMessageModes(['DISPLAYOPPERSON']); - - this.onDEDataChange = this.onDEDataChange.bind(this); - ibiz.mc.command.change.on(this.onDEDataChange); - - const deName = calcDeCodeNameById(this.form.appDataEntityId!); - const srfkey = this.view.state.data.srfkey; - - const updateCoopPosMsg = (data: IMarkOpenData): void => { - this.coopPos?.updateMessage({ - data, - }); - }; - - // 发送查看通知 - const result = (await ibiz.markOpenData.action( - deName, - srfkey, - 'VIEW', - )) as IHttpResponse; - - if (result.ok && result.data.length > 0) { - result.data.forEach(item => { - if (item.data) { - this.coopPos?.updateMessage({ - data: item.data, + this.activePropertyView = presetParams?.view; + if (this.doActions.includes('EDIT')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onFormDataChange', () => + this.sendEditAction(), + ); + }); + } + if (this.doActions.includes('UPDATE')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onSaveSuccess', () => { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + }); }); } - }); - } - - // 监听消息 - ibiz.markOpenData.subscribe(deName, srfkey, updateCoopPosMsg); - - // 设计区值变更发送更新通知 - this.erDesignContent?.x6.evt.onAll(eventName => { - if ( - [ - 'onNodeCreated', - 'onNodeUpdated', - 'onNodeRemoved', - 'onLinkCreated', - 'onLinkUpdated', - 'onLinkRemoved', - 'onVerticesChange', - ].includes(eventName) - ) { - ibiz.markOpenData.action(deName, srfkey, 'UPDATE'); } }); - - // 发送关闭通知 - this.view.evt.on('onCloseView', () => { - ibiz.markOpenData.action(deName, srfkey, 'CLOSE'); - }); - - // 销毁监听 - this.view.evt.on('onDestroyed', () => { - ibiz.mc.command.change.off(this.onDEDataChange); - ibiz.markOpenData.unsubscribe(deName, srfkey, updateCoopPosMsg); - }); } /** diff --git a/packages/er-design/src/views/er-design-view/interface/er-design-view.event.ts b/packages/er-design/src/views/er-design-view/interface/er-design-view.event.ts index 8900690b6b51761c16c3a3a98149492e511a366b..b36151827575aa1e69d9101b7fd17c70ac48c3de 100644 --- a/packages/er-design/src/views/er-design-view/interface/er-design-view.event.ts +++ b/packages/er-design/src/views/er-design-view/interface/er-design-view.event.ts @@ -15,4 +15,19 @@ export interface ERDesignViewEvent extends IViewEvent { event: EventBase; emitArgs: undefined; }; + + /** + * 刷新视图 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:19 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onRefreshView: { + event: EventBase; + emitArgs: undefined; + }; } diff --git a/packages/md-design/src/panel-items/de-data-view-design-material-area/de-data-view-design-material-area.controller.ts b/packages/md-design/src/panel-items/de-data-view-design-material-area/de-data-view-design-material-area.controller.ts index 79fdc06197d1b716b7728a6364230c7f6ab8d88f..d8b91de8846c6ed2bdd948a380d9a3a21914b768 100644 --- a/packages/md-design/src/panel-items/de-data-view-design-material-area/de-data-view-design-material-area.controller.ts +++ b/packages/md-design/src/panel-items/de-data-view-design-material-area/de-data-view-design-material-area.controller.ts @@ -224,6 +224,7 @@ export class DEDataViewDesignMaterialAreaController extends PanelDesignMaterialA this.view.call('onActiveRoot'); } await this.loadDataItems(); + this.view.evt.emit('onRefreshListItem', undefined); } } @@ -245,6 +246,7 @@ export class DEDataViewDesignMaterialAreaController extends PanelDesignMaterialA this.view.call('onActiveRoot'); } await this.loadDataViewLogicItems(); + this.view.evt.emit('onRefreshDataViewLogic', undefined); } } } diff --git a/packages/md-design/src/panel-items/de-list-design-material-area/de-list-design-material-area.controller.ts b/packages/md-design/src/panel-items/de-list-design-material-area/de-list-design-material-area.controller.ts index 13d62c853b578a1400aaaab09b102a9bf40060ac..e6b458b09fad468bd07e5d763c2bb25373275b64 100644 --- a/packages/md-design/src/panel-items/de-list-design-material-area/de-list-design-material-area.controller.ts +++ b/packages/md-design/src/panel-items/de-list-design-material-area/de-list-design-material-area.controller.ts @@ -224,6 +224,7 @@ export class DEListDesignMaterialAreaController extends PanelDesignMaterialAreaC this.view.call('onActiveRoot'); } await this.loadDataItems(); + this.view.evt.emit('onRefreshListItem', undefined); } } @@ -242,6 +243,7 @@ export class DEListDesignMaterialAreaController extends PanelDesignMaterialAreaC this.view.call('onActiveRoot'); } await this.loadListLogicItems(); + this.view.evt.emit('onRefreshListLogic', undefined); } } } diff --git a/packages/md-design/src/views/md-design-view/interface/md-design-view.event.ts b/packages/md-design/src/views/md-design-view/interface/md-design-view.event.ts index 62832688e043abab737669f8245f9ae11b8ce0ff..5e3304613e8c6f51fb6b43b88ebb0cb585b74bb3 100644 --- a/packages/md-design/src/views/md-design-view/interface/md-design-view.event.ts +++ b/packages/md-design/src/views/md-design-view/interface/md-design-view.event.ts @@ -1,3 +1,49 @@ import { PanelDesignBaseEvent } from '@ibiz-template-plugin/panel-design'; +import { EventBase } from '@ibiz-template/runtime'; -export interface MDDesignViewEvent extends PanelDesignBaseEvent {} +export interface MDDesignViewEvent extends PanelDesignBaseEvent { + /** + * 刷新数据项 + * + * @author zhanghengfeng + * @date 2025-02-24 20:02:03 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onRefreshListItem: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 刷新列表逻辑 + * + * @author zhanghengfeng + * @date 2025-02-24 20:02:18 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onRefreshListLogic: { + event: EventBase; + emitArgs: undefined; + }; + + /** + * 刷新卡片逻辑 + * + * @author zhanghengfeng + * @date 2025-02-24 20:02:35 + * @type {{ + * event: EventBase; + * emitArgs: undefined; + * }} + */ + onRefreshDataViewLogic: { + event: EventBase; + emitArgs: undefined; + }; +} diff --git a/packages/md-design/src/views/md-design-view/md-design-view.engine.ts b/packages/md-design/src/views/md-design-view/md-design-view.engine.ts index 6374387045402f3388242f6dff34d120c5c1f7dd..3025939901819622888241d71d2f7605b3932677 100644 --- a/packages/md-design/src/views/md-design-view/md-design-view.engine.ts +++ b/packages/md-design/src/views/md-design-view/md-design-view.engine.ts @@ -31,6 +31,22 @@ export class MDDesignViewEngine extends PanelDesignViewEngine { } } + /** + * 初始化标记打开数据相关逻辑 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:28 + * @protected + */ + protected initMarkOpenData(): void { + this.editEventNames.push( + 'onRefreshListItem', + 'onRefreshListLogic', + 'onRefreshDataViewLogic', + ); + super.initMarkOpenData(); + } + /** * 重置布局 * diff --git a/packages/panel-design/src/providers/item/panel-item-provider-impl/panel-item-provider-impl.ts b/packages/panel-design/src/providers/item/panel-item-provider-impl/panel-item-provider-impl.ts index ac30784d25b3302146639fe7725137a65a2ae3b1..ba42b39e67035daddbef1432f6deeae28572d1d3 100644 --- a/packages/panel-design/src/providers/item/panel-item-provider-impl/panel-item-provider-impl.ts +++ b/packages/panel-design/src/providers/item/panel-item-provider-impl/panel-item-provider-impl.ts @@ -190,6 +190,11 @@ export class PanelItemProviderImpl implements PanelItemProvider { if (Array.isArray(data) && data.length > 0) { msg = data[0] as AppDataEntity; } + if (msg) { + Object.defineProperty(msg, 'srfsessionid', { + value: this.panelDesignMetaData.view?.context.srfsessionid, + }); + } switch (type) { case 'create': ibiz.mc.command.create.send(msg as AppDataEntity); diff --git a/packages/panel-design/src/views/panel-design-base/interface/panel-design-base.event.ts b/packages/panel-design/src/views/panel-design-base/interface/panel-design-base.event.ts index 4d071b74da747f2aa06e81fc7f2c38246006db8d..b708161c56331b8622ad863d76401001819dabf7 100644 --- a/packages/panel-design/src/views/panel-design-base/interface/panel-design-base.event.ts +++ b/packages/panel-design/src/views/panel-design-base/interface/panel-design-base.event.ts @@ -68,11 +68,11 @@ export interface PanelDesignBaseEvent extends IViewEvent { * @date 2024-10-22 18:10:10 * @type {{ * event: EventBase; - * emitArgs: undefined; + * emitArgs: undefined | IData; * }} */ onRefreshPanel: { event: EventBase; - emitArgs: undefined; + emitArgs: undefined | IData; }; } diff --git a/packages/panel-design/src/views/panel-design-base/panel-design-base.engine.ts b/packages/panel-design/src/views/panel-design-base/panel-design-base.engine.ts index bcc5f8f5d44ecfec3492ad0d1c6bb56e43e3f225..109a863e22d7574fc9fb75232c6df06c370b63b7 100644 --- a/packages/panel-design/src/views/panel-design-base/panel-design-base.engine.ts +++ b/packages/panel-design/src/views/panel-design-base/panel-design-base.engine.ts @@ -4,12 +4,14 @@ import { AppDataEntity, convertNavData, + DEMainViewEngine, + EditFormController, findModelChild, getControl, IAppDEService, SysUIActionTag, ViewController, - ViewEngineBase, + ViewMode, } from '@ibiz-template/runtime'; import { IAppDataEntity, @@ -23,6 +25,7 @@ import { } from '@ibiz/model-core'; import { NavPosController } from '@ibiz-template/vue3-util'; import { createUUID } from 'qx-util'; +import { IPortalMessage } from '@ibiz-template/core'; import { PanelDesignBaseController } from './panel-design-base.controller'; import { PanelBaseMetaItem, @@ -40,7 +43,7 @@ import { import { PanelDesignBaseState } from './interface/panel-design-base.state'; import { PanelDesignBaseEvent } from './interface/panel-design-base.event'; -export class PanelDesignViewEngine extends ViewEngineBase { +export class PanelDesignViewEngine extends DEMainViewEngine { /** * 视图控制器 * @@ -192,6 +195,152 @@ export class PanelDesignViewEngine extends ViewEngineBase { */ protected activePropertyView!: ViewController; + /** + * 编辑事件列表 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:46 + * @protected + * @type {string[]} + */ + protected editEventNames: string[] = ['onRefreshPanel']; + + /** + * 是否正在等待定时器 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:00 + * @protected + * @type {boolean} + */ + protected isWait: boolean = false; + + /** + * 获取数据 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:12 + * @return {*} {IData[]} + */ + getData(): IData[] { + return [this.view.state.data]; + } + + /** + * 初始化标记打开数据相关逻辑 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:28 + * @protected + * @return {*} {void} + */ + protected initMarkOpenData(): void { + if ( + !this.coopPos || + ![ViewMode.ROUTE, ViewMode.ROUTE_MODAL].includes(this.view.modal.mode) + ) { + return; + } + this.markModes = [ + 'OPENDATA', + 'EDITDATA', + 'DISPLAYOPPERSON', + 'NOTICERELOAD', + ]; + this.coopPos.initMessageModes(this.markModes); + this.doActions = []; + this.doActions.push('EDIT', 'VIEW', 'UPDATE', 'CLOSE'); + this.view.evt.on('onUpdateAccessState', async () => { + this.sendViewDataAction(); + }); + this.doMarkDataAction(); + } + + /** + * 发送编辑行为 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:05 + * @protected + * @return {*} {void} + */ + protected sendEditAction(): void { + if (this.isWait) { + return; + } + const data = this.getData()[0]; + if (!data) { + return; + } + this.isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + this.isWait = false; + }, + 1000 * 60 * 5, + ); + } + + /** + * 执行标记数据行为 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:36 + * @protected + */ + protected doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('VIEW')) { + this.view.evt.on('onMounted', () => this.sendViewDataAction()); + } + if (this.doActions.includes('EDIT')) { + this.view.evt.onAll((eventName, e: IData) => { + if (eventName === 'onRefreshPanel') { + if (e && e.isSave) { + return; + } + } + if (this.editEventNames.includes(eventName)) { + this.sendEditAction(); + } + }); + const handleChange = (msg: IPortalMessage) => { + if (msg && msg.data) { + const srfsessionid = (msg.data as IData).srfsessionid; + if (srfsessionid === this.view.context.srfsessionid) { + this.sendEditAction(); + } + } + }; + ibiz.mc.command.change.on(handleChange); + this.view.evt.on('onDestroyed', () => { + ibiz.mc.command.change.off(handleChange); + }); + } + if (this.doActions.includes('UPDATE')) { + this.view.evt.on('onSaveSuccess', () => { + const data = this.getData()[0]; + if (!data) { + return; + } + this.sendMarkDataAction('UPDATE', data.srfkey); + }); + } + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2025-02-28 16:02:48 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.refreshView(); + } + /** * 初始化tab导航 * @@ -498,7 +647,17 @@ export class PanelDesignViewEngine extends ViewEngineBase { panelItemName === 'nav_pos' && panelItemEventName === 'onViewCreated' ) { - this.activePropertyView = presetParams.view; + this.activePropertyView = presetParams?.view; + if (this.doActions.includes('EDIT')) { + this.activePropertyView?.evt?.on('onMounted', () => { + const propertyForm = this.activePropertyView?.getController( + 'form', + ) as EditFormController; + propertyForm?.evt?.on('onFormDataChange', () => + this.sendEditAction(), + ); + }); + } } }, ); @@ -639,8 +798,9 @@ export class PanelDesignViewEngine extends ViewEngineBase { this.view.evt.emit('onViewInfoChange', { dataInfo: this.view.state.data.srfmajortext || '', }); + this.view.evt.emit('onSaveSuccess', undefined); // 刷新数据 - this.call('refresh'); + this.call('refresh', { isSave: true }); ibiz.message.success(`${this.view.state.data.srfmajortext}保存成功!`); return res.data; } @@ -674,11 +834,11 @@ export class PanelDesignViewEngine extends ViewEngineBase { } if (key === 'refresh') { await this.load(false); - this.view.evt.emit('onRefreshPanel', undefined); + this.view.evt.emit('onRefreshPanel', args); return undefined; } if (key === 'refreshPanel') { - this.view.evt.emit('onRefreshPanel', undefined); + this.view.evt.emit('onRefreshPanel', args); return undefined; } if (key === 'Refresh') { @@ -705,7 +865,7 @@ export class PanelDesignViewEngine extends ViewEngineBase { protected async refreshView(): Promise { await this.load(); this.activeRoot(true); - this.view.evt.emit('onRefreshPanel', undefined); + this.view.evt.emit('onRefreshPanel', { isSave: true }); this.view.evt.emit('onViewInfoChange', { dataInfo: this.view.state.data?.srfmajortext || '', }); diff --git a/packages/portal-design/src/panel-items/portal-design-content/portal-design-content.controller.ts b/packages/portal-design/src/panel-items/portal-design-content/portal-design-content.controller.ts index ef0d147702a97690b99da9921d215166c9695ca2..5f288f3555ca6301e05356da026f0e4ef818ce43 100644 --- a/packages/portal-design/src/panel-items/portal-design-content/portal-design-content.controller.ts +++ b/packages/portal-design/src/panel-items/portal-design-content/portal-design-content.controller.ts @@ -511,10 +511,13 @@ export class PortalDesignContentController extends PanelItemController { ); } const args = this.panel.getEventArgs(); + const context = this.view.context.clone(); + delete context.srfrunmode; await UIActionUtil.execAndResolved( actionId, { ...args, + context, data: [item], }, action.appId, diff --git a/packages/view-design/src/views/app-view-panel-design/app-view-panel-design.engine.ts b/packages/view-design/src/views/app-view-panel-design/app-view-panel-design.engine.ts index 57052b3861210cf6bb012028bd8f1199265b9b7d..4187b7cc16c2de1cd770d8d9e3b9957f34b7cb46 100644 --- a/packages/view-design/src/views/app-view-panel-design/app-view-panel-design.engine.ts +++ b/packages/view-design/src/views/app-view-panel-design/app-view-panel-design.engine.ts @@ -36,6 +36,23 @@ export class AppViewPanelDesignEngine extends PanelDesignViewEngine { } } + /** + * 初始化标记打开数据相关逻辑 + * + * @author zhanghengfeng + * @date 2025-02-28 17:02:34 + * @protected + */ + protected initMarkOpenData(): void { + this.editEventNames.push( + 'onRefreshViewCtrl', + 'onRefreshViewRV', + 'onRefreshViewLogic', + 'onAddViewCtrl', + ); + super.initMarkOpenData(); + } + /** * 重置布局 *