import type { IContext, IOpenViewHelper, IOpenViewResult, IParam, IViewDetail, } from '@/core'; import { router } from '@/router'; import { buildUpRoutePath, getIndexRoutePath } from '@/utils'; import { DrawerHelper } from './drawer-helper'; import { ModalHelper } from './modal-helper'; export class OpenViewHelper implements IOpenViewHelper { /** * @description 单例变量声明 * @protected * @static * @type {IOpenViewHelper} * @memberof OpenViewHelper */ protected static service: IOpenViewHelper; /** * @description 获取实例 * @static * @return {*} {IOpenViewHelper} * @memberof OpenViewHelper */ static getInstance(): IOpenViewHelper { if (!this.service) { this.service = new OpenViewHelper(); } return this.service; } /** * @description 打开视图 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {(void | Promise)} * @memberof OpenViewHelper */ openPage( view: IViewDetail, context: IContext, viewParams: IParam ): void | Promise { const { openMode } = view; if (view.redirectView) { return this.openReDirectView(view, context, viewParams); } switch (openMode) { case 'INDEXVIEWTAB': return this.openIndexViewTab(view, context, viewParams); case 'POPUP': return this.openPopup(view, context, viewParams); case 'POPUPMODAL': return this.openModal(view, context, viewParams); case 'POPUPAPP': return this.openApp(view, context, viewParams); case 'POPOVER': return this.openPopover(view, context, viewParams); case 'DRAWER_LEFT': return this.openLeftDrawer(view, context, viewParams); case 'DRAWER_RIGHT': return this.openRightDrawer(view, context, viewParams); case 'DRAWER_TOP': return this.openTopDrawer(view, context, viewParams); case 'DRAWER_BOTTOM': return this.openBottomDrawer(view, context, viewParams); case 'USER': console.log('自定义模式,暂时不实现'); break; default: return this.openIndexViewTab(view, context, viewParams); } } /** * @description 打开重定向视图 * @param {IViewDetail} view * @param {IContext} context * @param {IParam} viewParams * @memberof OpenViewHelper */ async openReDirectView( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const { appEntityCodeName } = view; if (appEntityCodeName) { const UIService = await App.getUIService(appEntityCodeName, context); const srfkey = context[appEntityCodeName?.toLowerCase()]; const response = await UIService.getAppRDView( context, viewParams, { [appEntityCodeName.toLowerCase()]: srfkey }, { isEnableWorkflow: false } ) if (response && response.viewName && response.srfappde) { const { currentRoute, push } = router; const indexPath = getIndexRoutePath(currentRoute.value); let routePath: string = `${indexPath}/${ response.srfappde }/${srfkey}/views/${response.viewName.toLowerCase()}`; push(routePath); return Promise.resolve({ ok: true, data: response }); } else { App.getNotificationHelper().error( App.ts('app.notificationtitle.error', '错误'), App.ts('app.common.nofindredirected', '未查找到重定向视图') ); return Promise.reject({ ok: false, data: response }); } } else { return Promise.reject({ ok: false, data: null }); } } /** * @description 顶级分页打开视图 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @memberof OpenViewHelper */ openIndexViewTab( view: IViewDetail, context: IContext, viewParams: IParam ): void { const { currentRoute, push } = router; const routePath = buildUpRoutePath( currentRoute.value, view, context, [], viewParams ); push(routePath); } /** * @description 非模式弹出 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openPopup( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { throw new Error('-----POPUP-----非模式弹出,暂时不实现'); } /** * @description 模态弹出 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openModal( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const modalInstance = ModalHelper.getInstance(); return modalInstance.openModal(view, context, viewParams); } /** * @description 独立程序弹出 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openApp( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { return new Promise((resolve, reject) => { const { currentRoute } = router; const routePath = buildUpRoutePath( currentRoute.value, view, context, [], viewParams ); window.open('./#' + routePath, '_blank'); resolve({ ok: true, data: null }); }); } /** * @description 气泡打开 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openPopover( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { // todo 气泡打开待补充 throw new Error('暂未实现气泡打开视图'); } /** * @description 打开上方抽屉 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openTopDrawer( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const drawerInstance = DrawerHelper.getInstance(); return drawerInstance.openDrawer(view, context, viewParams, 'top'); } /** * @description 打开下方抽屉 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openBottomDrawer( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const drawerInstance = DrawerHelper.getInstance(); return drawerInstance.openDrawer(view, context, viewParams, 'bottom'); } /** * @description 打开左侧抽屉 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openLeftDrawer( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const drawerInstance = DrawerHelper.getInstance(); return drawerInstance.openDrawer(view, context, viewParams, 'left'); } /** * @description 打开右侧抽屉 * @param {IViewDetail} view 视图详情 * @param {IContext} context 应用上下文 * @param {IParam} viewParams 视图参数 * @return {*} {Promise} * @memberof OpenViewHelper */ openRightDrawer( view: IViewDetail, context: IContext, viewParams: IParam ): Promise { const drawerInstance = DrawerHelper.getInstance(); return drawerInstance.openDrawer(view, context, viewParams, 'right'); } }