diff --git a/CHANGELOG.md b/CHANGELOG.md index f9a13b295eba7daead4ae21b13760aedddf1c217..b89b3bb41ea5cb8f672c438449b28ab9933c11d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ ## [Unreleased] +### Added + +- 新增实体首页视图,实体数据看板视图,实体导航视图,实体报表视图标记数据打开模式 + ## [0.7.38-alpha.35] - 2024-12-14 ### Added diff --git a/src/view-engine/edit-view.engine.ts b/src/view-engine/edit-view.engine.ts index 133467b1e9d3c8c384958b30b64c5a9db610e4a1..acff66d36aca4ab381c213e1c3d24e093d27744b 100644 --- a/src/view-engine/edit-view.engine.ts +++ b/src/view-engine/edit-view.engine.ts @@ -1,10 +1,5 @@ +import { RuntimeError, IMarkOpenData } from '@ibiz-template/core'; import { - RuntimeError, - IMarkOpenData, - IHttpResponse, -} from '@ibiz-template/core'; -import { - ViewEngineBase, ViewController, IEditFormController, SysUIActionTag, @@ -19,16 +14,15 @@ import { ViewCallTag, getControl, getControlsByView, - MarkOpenDataActionType, - ViewMode, IPanelItemCoopPosController, getDeDataMajorField, calcDynaSysParams, convertNavData, + DEViewEngine, } from '@ibiz-template/runtime'; import { IAppDEEditView } from '@ibiz/model-core'; -export class EditViewEngine extends ViewEngineBase { +export class EditViewEngine extends DEViewEngine { /** * 视图控制器 * @@ -55,14 +49,6 @@ export class EditViewEngine extends ViewEngineBase { .coop_pos as IPanelItemCoopPosController; } - /** - * 实体名称 - * @author lxm - * @date 2024-01-31 11:05:49 - * @type {string} - */ - deName!: string; - protected init(): void { super.init(); if (this.view.model.multiFormMode === 1 && this.view.params.srfdatatype) { @@ -132,8 +118,6 @@ export class EditViewEngine extends ViewEngineBase { this.formDataStateChange = this.formDataStateChange.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 = {}; @@ -171,7 +155,6 @@ export class EditViewEngine extends ViewEngineBase { async onMounted(): Promise { await super.onMounted(); - this.initMarkOpenData(); const { model, evt } = this.view; @@ -445,109 +428,21 @@ export class EditViewEngine extends ViewEngineBase { } /** - * 初始化标记打开数据相关逻辑 - * @author lxm - * @date 2024-01-31 11:52:13 - * @return {*} {void} + * 执行数据标记新闻给 + * + * @memberof EditViewEngine */ - initMarkOpenData(): void { - // 非路由的编辑视图不需要触发(防止多个界面同时操作一条数据,消息重复) - if ( - ![ViewMode.ROUTE, ViewMode.ROUTE_MODAL].includes(this.view.modal.mode) || - !this.view.model.markOpenDataMode - ) { - return; - } - - const modes = this.view.model.markOpenDataMode!.split(';'); - let hasOpenConfirm = false; - // 初始化协同编辑占位消息模式 - this.coopPos?.initMessageModes(modes); - const callback = async (data: IMarkOpenData) => { - // 非激活不触发提示 - if (!this.view.state.activated) { - return; - } - - const dataInfo = this.form.getData()[0].srfmajortext; - - let actionMsg = ''; - switch (data.action) { - case 'VIEW': - actionMsg = ibiz.i18n.t('viewEngine.browseMsg'); - break; - case 'EDIT': - actionMsg = ibiz.i18n.t('viewEngine.editMsg'); - break; - case 'UPDATE': - actionMsg = ibiz.i18n.t('viewEngine.updateMsg'); - break; - default: - break; - } - - const message = `${data.username} ${actionMsg} ${this.view.state.caption}-${dataInfo}`; - - if (this.coopPos) { - this.coopPos.updateMessage({ - title: message, - data, - }); - } else { - ibiz.message.notice({ - message, - showClose: true, - duration: 3, - styleType: 'alert', - }); - } - - if ( - hasOpenConfirm === false && - data.action === 'UPDATE' && - modes.includes('NOTICERELOAD') - ) { - hasOpenConfirm = true; - const isReload = await this.reloadConfirm(); - if (isReload) { - this.refresh(); - } - hasOpenConfirm = false; - } - }; - - // OPENDATA:登记打开数据、 EDITDATA:登记更新数据、 DISPLAYOPPERSON:显示操作人员、 NOTICERELOAD:提示刷新数据 - // *触发markopendata行为控制 - const doActions: MarkOpenDataActionType[] = []; - if ( - modes.includes('EDITDATA') || - modes.includes('DISPLAYOPPERSON') || - modes.includes('NOTICERELOAD') - ) { - doActions.push('EDIT', 'VIEW', 'UPDATE', 'CLOSE'); - } else if (modes.includes('OPENDATA')) { - doActions.push('VIEW', 'CLOSE'); - } - - // 没有配置就不监听了 - if (doActions.length === 0) { - return; - } - - let srfkey: string | undefined; - let hasSubscribe = false; - - if (doActions.includes('VIEW')) { + doMarkDataAction(): void { + if (this.doActions.includes('VIEW')) { + const callback = async (data: IMarkOpenData) => { + const dataInfo = this.form.getData()[0].srfmajortext; + this.markOpenDataCallback(data, dataInfo); + }; this.form.evt.on('onLoadSuccess', async event => { - const formData = event.data[0]; - srfkey = formData.srfkey; - const result = (await ibiz.markOpenData.action( - this.deName, - srfkey!, - 'VIEW', - )) as IHttpResponse; + const data = event.data[0]; + const result = await this.sendMarkDataAction('VIEW', data.srfkey); if (result.ok && result.data.length > 0) { - result.data.forEach(item => { + (result.data as IData[]).forEach(item => { if (item.data) { this.coopPos?.updateMessage({ data: item.data, @@ -555,48 +450,37 @@ export class EditViewEngine extends ViewEngineBase { } }); } - // 只监听一次 - if (!hasSubscribe) { - ibiz.markOpenData.subscribe(this.deName, srfkey!, callback); - this.view.evt.on('onDestroyed', () => { - ibiz.markOpenData.unsubscribe(this.deName, srfkey!, callback); - }); - hasSubscribe = true; - } + this.subscribeMarkDataAction(data.srfkey, callback); }); } - - if (doActions.includes('EDIT')) { + if (this.doActions.includes('EDIT')) { let isWait = false; - const actionEdit = () => { - if (!srfkey || isWait) { + this.form.evt.on('onFormDataChange', event => { + const data = event.data[0]; + if (isWait) { return; } isWait = true; - ibiz.markOpenData.action(this.deName, srfkey, 'EDIT'); + this.sendMarkDataAction('EDIT', data.srfkey); setTimeout( () => { isWait = false; }, 1000 * 60 * 5, ); - }; - - this.form.evt.on('onFormDataChange', actionEdit); + }); } - - if (doActions.includes('UPDATE')) { - this.form.evt.on('onSaveSuccess', () => { - if (srfkey) { - ibiz.markOpenData.action(this.deName, srfkey, 'UPDATE'); - } + if (this.doActions.includes('UPDATE')) { + this.form.evt.on('onSaveSuccess', event => { + const data = event.data[0]; + this.sendMarkDataAction('UPDATE', data.srfkey); }); } - - if (doActions.includes('CLOSE')) { + if (this.doActions.includes('CLOSE')) { this.view.evt.on('onCloseView', () => { - if (srfkey) { - ibiz.markOpenData.action(this.deName, srfkey, 'CLOSE'); + const data = this.form.getData()[0]; + if (data?.srfkey) { + this.sendMarkDataAction('CLOSE', data.srfkey); } }); } @@ -609,10 +493,7 @@ export class EditViewEngine extends ViewEngineBase { * @return {*} {Promise} */ async reloadConfirm(): Promise { - const result = await ibiz.confirm.info({ - title: ibiz.i18n.t('viewEngine.refreshPrompt'), - desc: ibiz.i18n.t('viewEngine.refreshPagePrompt'), - }); + const result = await super.reloadConfirm(); if (result && this.form.state.modified) { return ibiz.confirm.warning({ title: ibiz.i18n.t('viewEngine.refreshRemind'), diff --git a/src/view-engine/exp-view.engine.ts b/src/view-engine/exp-view.engine.ts index 734f4abe1fa4c6d16321d7adbe25536a97e9c7a5..5e57600a88de8b887bffae7653ec29fdd93db132 100644 --- a/src/view-engine/exp-view.engine.ts +++ b/src/view-engine/exp-view.engine.ts @@ -148,4 +148,37 @@ export class ExpViewEngine extends MDViewEngine { protected async load(_args?: MDCtrlLoadParams): Promise { await this.expBar.load(); } + + /** + * 执行标记数据行为 + * + * @memberof ExpViewEngine + */ + doMarkDataAction(): void { + if (this.doActions.includes('VIEW')) { + this.xdataControl.evt.on('onLoadSuccess', async () => { + const result = await this.sendMarkDataAction('VIEW', ''); + if (result.ok && result.data.length > 0) { + (result.data as IData[]).forEach(item => { + if (item.data) { + this.coopPos?.updateMessage({ + data: item.data, + }); + } + }); + } + this.subscribeMarkDataAction('', this.markOpenDataCallback); + }); + } + if (this.doActions.includes('UPDATE')) { + this.xdataControl.evt.on('onSaveSuccess', () => { + this.sendMarkDataAction('UPDATE', ''); + }); + } + if (this.doActions.includes('CLOSE')) { + this.view.evt.on('onCloseView', () => { + this.sendMarkDataAction('CLOSE', ''); + }); + } + } } diff --git a/src/view-engine/grid-exp-view.engine.ts b/src/view-engine/grid-exp-view.engine.ts index c870ce22ee6d73a1c55f7ee7a6e82251334f6096..8b651e8281439c21ea7d5c02dd2ef72ef4892e2e 100644 --- a/src/view-engine/grid-exp-view.engine.ts +++ b/src/view-engine/grid-exp-view.engine.ts @@ -1,4 +1,5 @@ import { + GridController, IGridExpViewEvent, IGridExpViewState, ViewController, @@ -43,4 +44,29 @@ export class GridExpViewEngine extends ExpViewEngine { get expBarName(): string { return 'gridexpbar'; } + + /** + * 执行标记数据行为 + * + * @memberof GridExpViewEngine + */ + doMarkDataAction(): void { + super.doMarkDataAction(); + if (this.doActions.includes('EDIT')) { + let isWait = false; + (this.xdataControl as GridController).evt.on('onGridDataChange', () => { + if (isWait) { + return; + } + isWait = true; + this.sendMarkDataAction('EDIT', ''); + setTimeout( + () => { + isWait = false; + }, + 1000 * 60 * 5, + ); + }); + } + } } diff --git a/src/view-engine/portal-view-engine.ts b/src/view-engine/portal-view-engine.ts index e5b302ab3f5ffb801818cb009429164beb3d8f5d..541eeb8830eaf65ce9edda36749c9dab1d5e1eed 100644 --- a/src/view-engine/portal-view-engine.ts +++ b/src/view-engine/portal-view-engine.ts @@ -1,16 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { IMarkOpenData } from '@ibiz-template/core'; import { - ViewEngineBase, ViewController, IPortalViewState, IPortalViewEvent, SysUIActionTag, IDashboardController, + DEViewEngine, } from '@ibiz-template/runtime'; import { IAppView } from '@ibiz/model-core'; -export class PortalViewEngine extends ViewEngineBase { +export class PortalViewEngine extends DEViewEngine { /** * 视图控制器 * @@ -49,11 +50,10 @@ export class PortalViewEngine extends ViewEngineBase { /** * 视图刷新 * - * @protected * @return {*} {Promise} * @memberof PortalViewEngine */ - protected async refresh(): Promise { + async refresh(): Promise { await this.dashboard.refresh(); } @@ -84,4 +84,62 @@ export class PortalViewEngine extends ViewEngineBase { await this.loadEntityData(); } } + + /** + * 执行标记数据行为 + * + * @memberof PortalViewEngine + */ + doMarkDataAction(): void { + let data: IData | undefined; + if (this.doActions.includes('VIEW')) { + const callback = async (_data: IMarkOpenData) => { + this.markOpenDataCallback(_data, data?.srfmajortext); + }; + this.view.evt.on('onDataChange', async event => { + data = event.data[0]; + const result = await this.sendMarkDataAction('VIEW', data.srfkey); + if (result.ok && result.data.length > 0) { + (result.data as IData[]).forEach(item => { + if (item.data) { + this.coopPos?.updateMessage({ + data: item.data, + }); + } + }); + } + this.subscribeMarkDataAction(data.srfkey, callback); + }); + } + if (this.doActions.includes('EDIT')) { + let isWait = false; + this.dashboard.evt.on('onConfigChange', () => { + if (!data?.srfkey || isWait) { + return; + } + isWait = true; + this.sendMarkDataAction('EDIT', data.srfkey); + setTimeout( + () => { + isWait = false; + }, + 1000 * 60 * 5, + ); + }); + } + if (this.doActions.includes('UPDATE')) { + this.dashboard.evt.on('onSavePortlet', () => { + if (data?.srfkey) { + this.sendMarkDataAction('UPDATE', data?.srfkey); + } + }); + } + if (this.doActions.includes('CLOSE')) { + this.view.evt.on('onCloseView', () => { + if (data?.srfkey) { + this.sendMarkDataAction('CLOSE', data.srfkey); + } + }); + } + } } diff --git a/src/view-engine/report-view.engine.ts b/src/view-engine/report-view.engine.ts index e6c135bfa9ffbb4d0cbfdcdb9201b3ca6ff9e7ae..49a17bc64300c8530ceced0332425434257a588a 100644 --- a/src/view-engine/report-view.engine.ts +++ b/src/view-engine/report-view.engine.ts @@ -1,4 +1,6 @@ +import { IMarkOpenData } from '@ibiz-template/core'; import { + DEViewEngine, IReportPanelController, IReportViewEvent, IReportViewState, @@ -6,12 +8,11 @@ import { ISearchFormController, SysUIActionTag, ViewController, - ViewEngineBase, getControl, } from '@ibiz-template/runtime'; import { IAppDEReportView, ISearchBar } from '@ibiz/model-core'; -export class ReportViewEngine extends ViewEngineBase { +export class ReportViewEngine extends DEViewEngine { /** * 视图控制器 * @@ -259,4 +260,39 @@ export class ReportViewEngine extends ViewEngineBase { } } } + + /** + * 执行标记数据行为 + * + * @memberof ReportViewEngine + */ + doMarkDataAction(): void { + let data: IData | undefined; + if (this.doActions.includes('VIEW')) { + const callback = async (_data: IMarkOpenData) => { + this.markOpenDataCallback(_data, data?.srfmajortext); + }; + this.reportpanel.evt.on('onLoadSuccess', async event => { + data = event.data[0]; + const result = await this.sendMarkDataAction('VIEW', data.srfkey); + if (result.ok && result.data.length > 0) { + (result.data as IData[]).forEach(item => { + if (item.data) { + this.coopPos?.updateMessage({ + data: item.data, + }); + } + }); + } + this.subscribeMarkDataAction(data.srfkey, callback); + }); + } + if (this.doActions.includes('CLOSE')) { + this.view.evt.on('onCloseView', () => { + if (data?.srfkey) { + this.sendMarkDataAction('CLOSE', data.srfkey); + } + }); + } + } }