diff --git a/.eslintrc.cjs b/.eslintrc.cjs index b85e4dc0816dd20b8ce81158fd239357836a5c20..083ef381d3afbadb836b467df4d485aa15a7bbf3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -39,5 +39,6 @@ module.exports = { '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], '@typescript-eslint/no-inferrable-types': [0], '@typescript-eslint/no-explicit-any': ['error'], + 'no-param-reassign': [0], }, }; diff --git a/src/control/drbar/drbar.controller.ts b/src/control/drbar/drbar.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3ca952aa231278509a8c9997397923725104261 --- /dev/null +++ b/src/control/drbar/drbar.controller.ts @@ -0,0 +1,303 @@ +import { + ControlController, + IDRBarController, + IDRBarEvent, + IDRBarState, + IDRBarItemsState, + IEditFormController, + calcNavParams, + Srfuf, +} from '@ibiz-template/runtime'; +import { IDEDRBar, IDEDRBarItem } from '@ibiz/model-core'; +import { Router } from 'vue-router'; +import { NavPosController } from '../../panel-component'; +import { ViewLayoutPanelController } from '../panel'; + +/** + * 数据关系栏控制器 + * + * @export + * @class DRBarController + * @extends {ControlController} + * @implements {IDRBarController} + */ +export class DRBarController + extends ControlController + implements IDRBarController +{ + /** + * 视图布局面板 + * + * @readonly + * @memberof DRBarController + */ + get layoutPanel() { + return this.view.getController('layoutpanel') as ViewLayoutPanelController; + } + + /** + * 导航占位控制器 + * + * @readonly + * @memberof DRBarController + */ + get navPos() { + return this.layoutPanel?.panelItems.nav_pos as NavPosController; + } + + /** + * 表单部件 + * + * @readonly + * @memberof DRBarController + */ + get form() { + return this.view.getController('form') as IEditFormController; + } + + /** + * 获取数据 + * + * @return {*} {IData[]} + * @memberof DRBarController + */ + getData(): IData[] { + return this.form?.getData() || [{}]; + } + + /** + * Router 对象 + * + * @type {Router} + * @memberof DRTabController + */ + router!: Router; + + /** + * 设置 Router 对象 + * + * @param {Router} router + * @memberof DRTabController + */ + setRouter(router: Router) { + this.router = router; + } + + /** + * 路由层级 + * + * @readonly + * @type {(number | undefined)} + * @memberof DRBarController + */ + get routeDepth(): number | undefined { + return this.view.modal.routeDepth; + } + + /** + * 初始化state的属性 + * + * @protected + * @memberof DRBarController + */ + protected initState(): void { + super.initState(); + this.state.drBarItems = []; + } + + /** + * 创建完成 + * + * @return {*} {Promise} + * @memberof DRBarController + */ + async doCreated(): Promise { + await super.doCreated(); + this.initDRBarItems(); + } + + /** + * 加载完成 + * + * @return {*} {Promise} + * @memberof DRBarController + */ + async doMounted(): Promise { + await super.doMounted(); + if (this.form) { + this.form.evt.on('onLoadSuccess', () => { + this.handleFormChange(); + }); + this.form.evt.on('onLoadDraftSuccess', () => { + this.handleFormChange(); + }); + this.form.evt.on('onSaveSuccess', () => { + this.handleFormChange(); + }); + } + } + + /** + * 处理表单数据变更 + * + * @memberof DRBarController + */ + handleFormChange() { + const disabled = this.getData()[0].srfuf !== Srfuf.UPDATE; + this.setDRBarItemsState(this.state.drBarItems, disabled); + } + + /** + * 设置关系项状态 + * + * @param {IDRBarItemsState[]} drBarItems 关系项 + * @param {boolean} disabled 禁用状态 + * @memberof DRBarController + */ + setDRBarItemsState(drBarItems: IDRBarItemsState[], disabled: boolean) { + drBarItems.forEach(item => { + // 排除首项 + if (item.tag !== this.model.uniqueTag) { + item.disabled = disabled; + } + if (item.children) { + this.setDRBarItemsState(item.children, disabled); + } + }); + } + + /** + * 初始化关系项数据 + * + * @memberof DRBarController + */ + initDRBarItems() { + const { + editItemCaption, + hideEditItem, + editItemSysImage, + uniqueTag, + dedrbarGroups, + dedrctrlItems, + } = this.model; + const drBarItems: IDRBarItemsState[] = []; + // 首项 + drBarItems.push({ + tag: uniqueTag!, + caption: editItemCaption, + hidden: !!hideEditItem, + disabled: false, + sysImage: editItemSysImage, + fullPath: this.router.currentRoute.value.fullPath, + }); + // 关系项 + dedrbarGroups?.forEach(group => { + const drBarItem: IDRBarItemsState = { + tag: group.id!, + caption: group.caption, + hidden: !!group.hidden, + sysImage: group.sysImage, + disabled: false, + children: [], + }; + dedrctrlItems?.forEach((item: IDEDRBarItem) => { + if (item.dedrbarGroupId === group.id) { + drBarItem.children!.push({ + tag: item.id!, + caption: item.caption, + sysImage: item.sysImage, + hidden: false, + disabled: false, + }); + } + }); + drBarItems.push(drBarItem); + }); + this.state.drBarItems = drBarItems; + } + + /** + * 处理选中改变 + * + * @param {string} key + * @memberof DRBarController + */ + handleSelectChange(key: string) { + const drBarItem = this.model.dedrctrlItems?.find(item => item.id === key); + if (drBarItem) { + this.setVisible('navPos'); + this.openNavPosView(drBarItem); + } else { + this.setVisible('form'); + if (this.routeDepth) { + this.router.push(this.state.drBarItems[0].fullPath!); + } + } + } + + /** + * 设置显示状态 + * + * @param {('form' | 'navPos')} ctrlName 显示的部件名称 + * @memberof DRBarController + */ + setVisible(ctrlName: 'form' | 'navPos') { + const viewForm = this.layoutPanel?.panelItems.view_form; + if (ctrlName === 'form') { + if (viewForm) { + viewForm.state.visible = true; + } + if (this.navPos) { + this.navPos.state.visible = false; + } + } else { + if (viewForm) { + viewForm.state.visible = false; + } + if (this.navPos) { + this.navPos.state.visible = true; + } + } + } + + /** + * 准备参数 + * + * @param {IDEDRBarItem} drBarItem 关系项 + * @return {*} + * @memberof DRBarController + */ + prepareParams(drBarItem: IDEDRBarItem) { + const { navigateContexts, navigateParams } = drBarItem; + const model = { + navContexts: navigateContexts, + navParams: navigateParams, + }; + const originParams = { + context: this.context, + params: this.params, + data: this.getData()[0], + }; + const { resultContext, resultParams } = calcNavParams(model, originParams); + const context = Object.assign(this.context.clone(), resultContext); + const params = { ...this.params, ...resultParams }; + return { context, params }; + } + + /** + * 打开导航占位视图 + * + * @param {IDEDRBarItem} drBarItem 关系项 + * @memberof DRBarController + */ + async openNavPosView(drBarItem: IDEDRBarItem) { + const viewModel = await ibiz.hub.getAppView(drBarItem.appViewId!); + const { context, params } = this.prepareParams(drBarItem); + this.navPos?.openView({ + key: drBarItem.id!, + context, + params, + viewModel, + }); + } +} diff --git a/src/control/drbar/drbar.provider.ts b/src/control/drbar/drbar.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..b4c711351bc27b6d67648780fb9f05ca59bcda6e --- /dev/null +++ b/src/control/drbar/drbar.provider.ts @@ -0,0 +1,12 @@ +import { IControlProvider } from '@ibiz-template/runtime'; + +/** + * 数据关系栏适配器 + * + * @export + * @class DRBarProvider + * @implements {IControlProvider} + */ +export class DRBarProvider implements IControlProvider { + component: string = 'IBizDrBarControl'; +} diff --git a/src/control/drbar/drbar.tsx b/src/control/drbar/drbar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6c6082933872e1fda4abacc670ef25e6ad2f2514 --- /dev/null +++ b/src/control/drbar/drbar.tsx @@ -0,0 +1,84 @@ +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { defineComponent, PropType } from 'vue'; +import { IDEDRBar } from '@ibiz/model-core'; +import { useRouter } from 'vue-router'; +import { DRBarController } from './drbar.controller'; +import { IDRBarItemsState } from '@ibiz-template/runtime'; + +export const DRBarControl = defineComponent({ + name: 'IBizDrBarControl', + props: { + modelData: { type: Object as PropType, required: true }, + context: { type: Object as PropType, required: true }, + params: { type: Object as PropType, default: () => ({}) }, + }, + setup() { + const c = useControlController((...args) => new DRBarController(...args)); + const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`); + const router = useRouter(); + + c.setRouter(router); + const handleSelect = (key: string) => { + c.handleSelectChange(key); + }; + + const renderMenuItems = (item: IDRBarItemsState) => { + if (!item.hidden) { + if (item.children) { + return ( + + {{ + default: () => + item.children!.map(child => { + return renderMenuItems(child); + }), + title: () => [ + , + {item.caption}, + ], + }} + + ); + } else { + return ( + + + {item.caption} + + ); + } + } + }; + + return { + c, + ns, + handleSelect, + renderMenuItems, + }; + }, + render() { + const { isCreated, drBarItems } = this.c.state; + return ( + + {isCreated && ( + + {drBarItems.map(item => { + return this.renderMenuItems(item); + })} + + )} + + ); + }, +}); diff --git a/src/control/drbar/index.ts b/src/control/drbar/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a3e4f084bbee8f44d1f8f18c28f94f1cb2defba5 --- /dev/null +++ b/src/control/drbar/index.ts @@ -0,0 +1,15 @@ +import { registerControlProvider, ControlType } from '@ibiz-template/runtime'; +import { withInstall } from '@ibiz-template/vue3-util'; +import { App } from 'vue'; +import { DRBarControl } from './drbar'; +import { DRBarProvider } from './drbar.provider'; + +export * from './drbar.provider'; +export * from './drbar.controller'; + +export const IBizDRBarControl = withInstall(DRBarControl, function (v: App) { + v.component(DRBarControl.name, DRBarControl); + registerControlProvider(ControlType.DRBAR, () => new DRBarProvider()); +}); + +export default IBizDRBarControl; diff --git a/src/control/drtab/drtab.controller.ts b/src/control/drtab/drtab.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..30422b94dcca67b05073990192bbc6e6f23740be --- /dev/null +++ b/src/control/drtab/drtab.controller.ts @@ -0,0 +1,290 @@ +import { + ControlController, + IDRTabController, + IDRTabEvent, + IDRTabState, + IDRTabPagesState, + IEditFormController, + calcNavParams, + Srfuf, +} from '@ibiz-template/runtime'; +import { IDEDRCtrlItem, IDEDRTab } from '@ibiz/model-core'; +import { Router } from 'vue-router'; +import { NavPosController } from '../../panel-component'; +import { ViewLayoutPanelController } from '../panel'; + +/** + * 数据关系栏控制器 + * + * @export + * @class DRTabController + * @extends {ControlController} + * @implements {IDRTabController} + */ +export class DRTabController + extends ControlController + implements IDRTabController +{ + /** + * 视图布局面板 + * + * @readonly + * @memberof DRTabController + */ + get layoutPanel() { + return this.view.getController('layoutpanel') as ViewLayoutPanelController; + } + + /** + * 导航占位控制器 + * + * @readonly + * @memberof DRTabController + */ + get navPos() { + return this.layoutPanel?.panelItems.nav_pos as NavPosController; + } + + /** + * 表单部件 + * + * @readonly + * @memberof DRTabController + */ + get form() { + return this.view.getController('form') as IEditFormController; + } + + /** + * 路由层级 + * + * @readonly + * @type {(number | undefined)} + * @memberof DRTabController + */ + get routeDepth(): number | undefined { + return this.view.modal.routeDepth; + } + + /** + * Router 对象 + * + * @type {Router} + * @memberof DRTabController + */ + router!: Router; + + /** + * 设置 Router 对象 + * + * @param {Router} router + * @memberof DRTabController + */ + setRouter(router: Router) { + this.router = router; + } + + /** + * 获取数据 + * + * @return {*} {IData[]} + * @memberof DRTabController + */ + getData(): IData[] { + return this.form?.getData() || [{}]; + } + + /** + * 初始化state的属性 + * + * @protected + * @memberof DRTabController + */ + protected initState(): void { + super.initState(); + this.state.drTabPages = []; + } + + /** + * 创建完成 + * + * @return {*} {Promise} + * @memberof DRTabController + */ + async doCreated(): Promise { + await super.doCreated(); + this.initDRTabPages(); + } + + /** + * 加载完成 + * + * @return {*} {Promise} + * @memberof DRTabController + */ + async doMounted(): Promise { + await super.doMounted(); + if (this.form) { + this.form.evt.on('onLoadSuccess', () => { + this.handleFormChange(); + }); + this.form.evt.on('onLoadDraftSuccess', () => { + this.handleFormChange(); + }); + this.form.evt.on('onSaveSuccess', () => { + this.handleFormChange(); + }); + } + } + + /** + * 处理表单数据变更 + * + * @memberof DRTabController + */ + handleFormChange() { + const disabled = this.getData()[0].srfuf !== Srfuf.UPDATE; + this.setDRTabPagesState(this.state.drTabPages, disabled); + } + + /** + * 设置关系分页状态 + * + * @param {IDRTabPagesState[]} drTabPages 关系分页 + * @param {boolean} disabled 禁用状态 + * @memberof DRTabController + */ + setDRTabPagesState(drTabPages: IDRTabPagesState[], disabled: boolean) { + drTabPages.forEach(item => { + // 排除首项 + if (item.tag !== this.model.uniqueTag) { + item.disabled = disabled; + } + }); + } + + /** + * 初始化关系分页数据 + * + * @memberof DRTabController + */ + initDRTabPages() { + const { + editItemCaption, + hideEditItem, + editItemSysImage, + uniqueTag, + dedrtabPages, + } = this.model; + const drTabPages: IDRTabPagesState[] = []; + // 首项 + drTabPages.push({ + tag: uniqueTag!, + caption: editItemCaption, + hidden: !!hideEditItem, + disabled: false, + sysImage: editItemSysImage, + fullPath: this.router.currentRoute.value.fullPath, + }); + // 关系项 + dedrtabPages?.forEach((item: IDEDRCtrlItem) => { + drTabPages.push({ + tag: item.id!, + caption: item.caption, + sysImage: item.sysImage, + hidden: false, + disabled: false, + }); + }); + this.state.drTabPages = drTabPages; + this.state.activeName = drTabPages[0].tag; + } + + /** + * 处理分页改变 + * + * @memberof DRTabController + */ + handleTabChange() { + const { activeName } = this.state; + const drBarItem = this.model.dedrtabPages?.find( + item => item.id === activeName, + ); + + if (drBarItem) { + this.setVisible('navPos'); + this.openNavPosView(drBarItem); + } else { + this.setVisible('form'); + if (this.routeDepth) { + this.router.push(this.state.drTabPages[0].fullPath!); + } + } + } + + /** + * 设置显示状态 + * + * @param {('form' | 'navPos')} ctrlName 显示的部件名称 + * @memberof DRTabController + */ + setVisible(ctrlName: 'form' | 'navPos') { + const viewForm = this.layoutPanel?.panelItems.view_form; + if (ctrlName === 'form') { + if (viewForm) { + viewForm.state.visible = true; + } + if (this.navPos) { + this.navPos.state.visible = false; + } + } else { + if (viewForm) { + viewForm.state.visible = false; + } + if (this.navPos) { + this.navPos.state.visible = true; + } + } + } + + /** + * 准备参数 + * + * @param {IDEDRCtrlItem} drTabPages 关系分页 + * @return {*} + * @memberof DRTabController + */ + prepareParams(drTabPages: IDEDRCtrlItem) { + const { navigateContexts, navigateParams } = drTabPages; + const model = { + navContexts: navigateContexts, + navParams: navigateParams, + }; + const originParams = { + context: this.context, + params: this.params, + data: this.getData()[0], + }; + const { resultContext, resultParams } = calcNavParams(model, originParams); + const context = Object.assign(this.context.clone(), resultContext); + const params = { ...this.params, ...resultParams }; + return { context, params }; + } + + /** + * 打开导航占位视图 + * + * @param {IDEDRCtrlItem} drTabPages 关系分页 + * @memberof DRTabController + */ + async openNavPosView(drTabPages: IDEDRCtrlItem) { + const viewModel = await ibiz.hub.getAppView(drTabPages.appViewId!); + const { context, params } = this.prepareParams(drTabPages); + this.navPos?.openView({ + key: drTabPages.id!, + context, + params, + viewModel, + }); + } +} diff --git a/src/control/drtab/drtab.provider.ts b/src/control/drtab/drtab.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..d68b0bec6048d9137a6fb75551ef482ddbce6e2f --- /dev/null +++ b/src/control/drtab/drtab.provider.ts @@ -0,0 +1,12 @@ +import { IControlProvider } from '@ibiz-template/runtime'; + +/** + * 数据关系分页适配器 + * + * @export + * @class DRTabProvider + * @implements {IControlProvider} + */ +export class DRTabProvider implements IControlProvider { + component: string = 'IBizDrTabControl'; +} diff --git a/src/control/drtab/drtab.tsx b/src/control/drtab/drtab.tsx new file mode 100644 index 0000000000000000000000000000000000000000..60768ff34000f92188fadae842df1d9db384779e --- /dev/null +++ b/src/control/drtab/drtab.tsx @@ -0,0 +1,55 @@ +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { defineComponent, PropType } from 'vue'; +import { IDEDRTab } from '@ibiz/model-core'; +import { useRouter } from 'vue-router'; +import { DRTabController } from './drtab.controller'; + +export const DRTabControl = defineComponent({ + name: 'IBizDrTabControl', + props: { + modelData: { type: Object as PropType, required: true }, + context: { type: Object as PropType, required: true }, + params: { type: Object as PropType, default: () => ({}) }, + }, + setup() { + const c = useControlController((...args) => new DRTabController(...args)); + const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`); + const router = useRouter(); + + c.setRouter(router); + + const handleTabChange = () => { + c.handleTabChange(); + }; + + return { + c, + ns, + handleTabChange, + }; + }, + render() { + const { isCreated, drTabPages } = this.c.state; + return ( + + {isCreated && ( + + {drTabPages.map(tab => { + return ( + + ); + })} + + )} + + ); + }, +}); diff --git a/src/control/drtab/index.ts b/src/control/drtab/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..eff77f037339c07573c7be7c158b33cd8f20a272 --- /dev/null +++ b/src/control/drtab/index.ts @@ -0,0 +1,15 @@ +import { registerControlProvider, ControlType } from '@ibiz-template/runtime'; +import { withInstall } from '@ibiz-template/vue3-util'; +import { App } from 'vue'; +import { DRTabControl } from './drtab'; +import { DRTabProvider } from './drtab.provider'; + +export * from './drtab.provider'; +export * from './drtab.controller'; + +export const IBizDRTabControl = withInstall(DRTabControl, function (v: App) { + v.component(DRTabControl.name, DRTabControl); + registerControlProvider(ControlType.DRTAB, () => new DRTabProvider()); +}); + +export default IBizDRTabControl; diff --git a/src/control/index.ts b/src/control/index.ts index c6e80ef9baf2b7484df7663577f7cff06089d32f..fa5f42df876eab7e66a1862d927ebe10fea18978 100644 --- a/src/control/index.ts +++ b/src/control/index.ts @@ -12,3 +12,5 @@ export * from './tab-exp-panel'; export * from './exp-bar'; export * from './search-bar'; export * from './wizard-panel'; +export * from './drbar'; +export * from './drtab'; diff --git a/src/control/tab-exp-panel/tab-exp-panel.controller.ts b/src/control/tab-exp-panel/tab-exp-panel.controller.ts index 04ba6f8537192f5eba2d6699274d90fb3dc65025..5de327d4779502729288d929909c78db6e850a27 100644 --- a/src/control/tab-exp-panel/tab-exp-panel.controller.ts +++ b/src/control/tab-exp-panel/tab-exp-panel.controller.ts @@ -3,7 +3,7 @@ import { ITabExpPanelController, ITabExpPanelState, ITabExpPanelEvent, - TabExpPanelPagesState, + ITabExpPanelPagesState, calcNavParams, calcDeCodeNameById, } from '@ibiz-template/runtime'; @@ -76,7 +76,7 @@ export class TabExpPanelController */ initTabPages() { const viewPanel = this.model.controls as IDETabViewPanel[]; - const tabPages: TabExpPanelPagesState[] = []; + const tabPages: ITabExpPanelPagesState[] = []; viewPanel.forEach((panel: IDETabViewPanel) => { tabPages.push({ caption: panel.caption!, @@ -99,7 +99,7 @@ export class TabExpPanelController const { activeName } = this.state; const viewPanel = this.model.controls!.find(tab => tab.id === activeName); if (viewPanel) { - this.openNavPosParams(viewPanel); + this.openNavPosView(viewPanel); } } @@ -136,12 +136,12 @@ export class TabExpPanelController } /** - * 设置导航占位参数 + * 打开导航占位视图 * * @param {IParams} params * @memberof TabExpPanelController */ - async openNavPosParams(tabViewPanel: IDETabViewPanel) { + async openNavPosView(tabViewPanel: IDETabViewPanel) { const viewModel = await ibiz.hub.getAppView( tabViewPanel.embeddedAppDEViewId!, ); diff --git a/src/index.ts b/src/index.ts index 69f9ab65dcba998845d8d81530a674929c39837a..2c7db5b612d24dfdfc411a55aee44c159af980db 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,8 @@ import { IBizTreeExpBarControl, IBizSearchBarControl, IBizWizardPanelControl, + IBizDRBarControl, + IBizDRTabControl, } from './control'; import IBizEditor from './editor'; import { IBizView } from './view'; @@ -58,6 +60,8 @@ export default { v.use(IBizTreeExpBarControl); v.use(IBizSearchBarControl); v.use(IBizWizardPanelControl); + v.use(IBizDRBarControl); + v.use(IBizDRTabControl); // 编辑器 v.use(IBizEditor); }, diff --git a/src/view-engine/edit-view.engine.ts b/src/view-engine/edit-view.engine.ts index f67a3a20520f26ccaec0300a33cd8725b9d62d50..391e20688c9e64e1fc128ba80e073367507e63e2 100644 --- a/src/view-engine/edit-view.engine.ts +++ b/src/view-engine/edit-view.engine.ts @@ -4,17 +4,28 @@ import { IEditFormController, SysUIActionTag, EventBase, - IViewState, + IEditViewState, IEditViewEvent, ControlVO, calcDeCodeNameById, } from '@ibiz-template/runtime'; import { IAppDEEditView } from '@ibiz/model-core'; -export class EditVIewEngine extends ViewEngineBase { +export class EditViewEngine extends ViewEngineBase { + /** + * 视图控制器 + * + * @protected + * @type {ViewController< + * IAppDEEditView, + * IEditViewState, + * IEditViewEvent + * >} + * @memberof EditViewEngine + */ protected declare view: ViewController< IAppDEEditView, - IViewState, + IEditViewState, IEditViewEvent >; @@ -117,7 +128,7 @@ export class EditVIewEngine extends ViewEngineBase { * @author zk * @date 2023-06-01 01:06:59 * @return {*} - * @memberof EditVIewEngine + * @memberof EditViewEngine */ async saveAndNew() { await this.form.save(); diff --git a/src/view-engine/edit-view2.engine.ts b/src/view-engine/edit-view2.engine.ts new file mode 100644 index 0000000000000000000000000000000000000000..56dcae27d1e9a6fccaa4ee75afb39b317c43d079 --- /dev/null +++ b/src/view-engine/edit-view2.engine.ts @@ -0,0 +1,44 @@ +import { + IDRBarController, + IEditView2Event, + IEditView2State, + ViewController, +} from '@ibiz-template/runtime'; +import { IAppDEEditView } from '@ibiz/model-core'; +import { EditViewEngine } from './edit-view.engine'; + +/** + * 编辑视图2(左右关系) + * + * @export + * @class EditView2Engine + * @extends {EditViewEngine} + */ +export class EditView2Engine extends EditViewEngine { + /** + * 视图控制器 + * + * @protected + * @type {ViewController< + * IAppDEEditView, + * IEditView2State, + * IEditView2Event + * >} + * @memberof EditView2Engine + */ + protected declare view: ViewController< + IAppDEEditView, + IEditView2State, + IEditView2Event + >; + + /** + * 数据关系栏 + * + * @readonly + * @memberof EditView2Engine + */ + get drbar() { + return this.view.getController('drbar') as IDRBarController; + } +} diff --git a/src/view-engine/edit-view3.engine.ts b/src/view-engine/edit-view3.engine.ts new file mode 100644 index 0000000000000000000000000000000000000000..8719d29a44f7f9a5940c28d9a9b8063e46f65bf5 --- /dev/null +++ b/src/view-engine/edit-view3.engine.ts @@ -0,0 +1,44 @@ +import { + IDRTabController, + IEditView3Event, + IEditView3State, + ViewController, +} from '@ibiz-template/runtime'; +import { IAppDEEditView } from '@ibiz/model-core'; +import { EditViewEngine } from './edit-view.engine'; + +/** + * 编辑视图3(分页关系) + * + * @export + * @class EditView3Engine + * @extends {EditViewEngine} + */ +export class EditView3Engine extends EditViewEngine { + /** + * 视图控制器 + * + * @protected + * @type {ViewController< + * IAppDEEditView, + * IEditView3State, + * IEditView3Event + * >} + * @memberof EditView3Engine + */ + protected declare view: ViewController< + IAppDEEditView, + IEditView3State, + IEditView3Event + >; + + /** + * 数据分页栏 + * + * @readonly + * @memberof EditView3Engine + */ + get drtab() { + return this.view.getController('drtab') as IDRTabController; + } +} diff --git a/src/view-engine/index.ts b/src/view-engine/index.ts index 5b6da54608fe58080230a083629f1d84c52534d2..253766082cd8f7043e1f871c1654384eb6469577 100644 --- a/src/view-engine/index.ts +++ b/src/view-engine/index.ts @@ -1,6 +1,8 @@ import { IViewController } from '@ibiz-template/runtime'; import { App } from 'vue'; -import { EditVIewEngine } from './edit-view.engine'; +import { EditViewEngine } from './edit-view.engine'; +import { EditView2Engine } from './edit-view2.engine'; +import { EditView3Engine } from './edit-view3.engine'; import { GridViewEngine } from './grid-view.engine'; import { IndexViewEngine } from './index-view.engine'; import { ListViewEngine } from './list-view.engine'; @@ -48,7 +50,15 @@ export const IBizViewEngine = { ); ibiz.engine.register( 'VIEW_EditView', - (c: IViewController) => new EditVIewEngine(c), + (c: IViewController) => new EditViewEngine(c), + ); + ibiz.engine.register( + 'VIEW_EditView2', + (c: IViewController) => new EditView2Engine(c), + ); + ibiz.engine.register( + 'VIEW_EditView3', + (c: IViewController) => new EditView3Engine(c), ); ibiz.engine.register( 'VIEW_DataView',