import { DEViewActionType, IContext, IDECtrlAbility, IDEViewAbility, IDEViewController, IDEViewControllerParams, IDEViewStore, IParam, IViewActionResult, IViewDetail, IViewModel, } from '@/core/interface'; import { AuthUtil, computedNavData, deepCopy } from '@/core/utils'; import { ViewController } from './view-controller'; /** * 实体视图控制器 * * @export * @class DEViewController * @extends {ViewController} * @template T 视图行为接口 * @template S 视图仓库数据接口 * @template A 视图能力接口 */ export class DEViewController< T, S extends IDEViewStore, A extends IDEViewAbility > extends ViewController implements IDEViewController { /** * 处理视图初始化 * * @protected * @param {IDEViewControllerParams} params * @memberof DEViewController */ protected processViewInit(params: IDEViewControllerParams) { super.processViewInit(params); Object.assign(this.store, { openView: this.openData.bind(this), newView: this.newData.bind(this), toolbarItems: this.model.toolbarItems || [], }); } /** * 打开数据 * * @param {IContext} context * @param {IParam} viewParams * @param {IParam[]} data * @return {*} * @memberof DEViewController */ public async openData(context: IContext, viewParams: IParam, data: IParam[]) { const _data = data.length > 0 ? data[data.length - 1] : {}; const openDataModel = this.getModel().openData; if (!openDataModel) { App.getNotificationHelper().warning(App.ts('app.notificationtitle.warn','警告'), App.ts('app.common.noconfigmainview','未配置主数据视图')); return; } const { redirectView, redirectParam, openDataViewName, navContext, navViewParam, deCodeName, } = openDataModel; if (deCodeName && _data[deCodeName.toLowerCase()]) { Object.assign(context, { [deCodeName.toLowerCase()]: _data[deCodeName.toLowerCase()] }); } const _context = deepCopy(context); const _viewParams = deepCopy(viewParams); if (navContext) { const navData = computedNavData(_data, context, viewParams, navContext); navData && Object.assign(_context, navData); } if (navViewParam) { const navData = computedNavData(_data, context, viewParams, navViewParam); navData && Object.assign(_viewParams, navData); } let view: IViewDetail = App.getAppViewConfig()?.[openDataViewName]; // todo 工作流已读标记 if (redirectView) { if (redirectParam.minorDERSs && redirectParam.minorDERSs.length > 0) { redirectParam.minorDERSs.forEach((minor: any) => { if (minor.parentDeField && minor.majorDeCodeName && _data[minor.parentDeField.toLowerCase()] && !_context[minor.majorDeCodeName.toLowerCase()]) { Object.assign(_context, { [minor.majorDeCodeName.toLowerCase()]: _data[minor.parentDeField.toLowerCase()] }) } }); } const UIService = await App.getUIService(deCodeName, context); const response = await UIService.getAppRDView(_context, _viewParams, _data, { isEnableWorkflow: false, redirectAction: redirectParam.redirectAction }); if (response && response.viewName) { view = App.getAppViewConfig()?.[response.viewName]; } } if (view) { App.getOpenViewHelper().openPage(view, _context, _viewParams); } else { App.getNotificationHelper().error( App.ts('app.notificationtitle.error'), App.ts('app.common.noeditview') ); } } /** * 新建数据 * * @param {IContext} context * @param {IParam} viewParams * @param {IParam[]} data * @return {*} * @memberof DEViewController */ public newData(context: IContext, viewParams: IParam, data: IParam[]) { const _data = data.length > 0 ? data[data.length - 1] : {}; const newDataModel = this.getModel().newData; if (!newDataModel) { App.getNotificationHelper().warning(App.ts("app.notificationtitle.warn","警告"), App.ts("app.common.noconfignewview","未配置新建数据视图")); return; } const { enableWizardAdd, enableBatchAdd, batchAddOnly, newDataViewName, entityName, navContext, navViewParam, } = newDataModel; if (enableWizardAdd) { // todo } else if (enableBatchAdd) { // todo } else if (batchAddOnly) { // todo } else if (newDataViewName) { const _context = deepCopy(context); const _viewParams = deepCopy(viewParams); // 新建视图且不是拷贝模式时 删除上下文主键信息 if ( entityName && _context[entityName.toLowerCase()] && !viewParams.copymode ) { delete _context[entityName.toLowerCase()]; } if (navContext) { const navData = computedNavData(data, context, viewParams, navContext); navData && Object.assign(_context, navData); } if (navViewParam) { const navData = computedNavData( _data, context, viewParams, navViewParam ); navData && Object.assign(_viewParams, navData); } const view: IViewDetail = App.getAppViewConfig()?.[newDataViewName]; if (!view) { console.warn(App.ts("app.common.nonewview","新建视图不存在")); return; } App.getOpenViewHelper().openPage(view, _context, _viewParams); } } /** * 计算工具栏权限状态 * * @protected * @param {IParam} data * @memberof MDViewController */ protected async calcToolbarItemAuthState(data: IParam) { if (this.model.entityCodeName) { const UIService = await App.getUIService( this.model.entityCodeName, this.store.context ); AuthUtil.calcToolbarItemAuthState( data, this.store.toolbarItems, UIService, this.model ); } } /** * 加载视图 * * @memberof DEViewController */ public load(args?: IParam): Promise { if (this.model.xDataCtrlName) { const ability = this.getSubAbility( this.model.xDataCtrlName ); if (ability) { return ability.load(args); } } return Promise.resolve({ ok: false, rowData: {}, data: [] }); } }