From a9dce488d020c2bc5ad7964473427e5044f77f0d Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Fri, 22 Nov 2024 20:12:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E9=9D=A2=E6=9D=BF=E5=88=87=E6=8D=A2=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts b/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts index 6895f069..effedcd5 100644 --- a/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts +++ b/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts @@ -135,6 +135,9 @@ export function useCtrlPos(props, ctx) { * @return {*} {Promise} */ const loadCtrlsByType = async (): Promise => { + if (props.context.srfpreview === true) { + return; + } if (ctrlType !== 'APPMENU') { const app = ibiz.hub.getApp(props.context.srfappid); const viewCtrlService = await app.deService.getService( -- Gitee From 761b724041dad411e6702029ce519336aa4a297d Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Fri, 22 Nov 2024 20:21:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E5=BA=94=E7=94=A8=E7=9C=8B?= =?UTF-8?q?=E6=9D=BF=E8=A7=86=E5=9B=BE=E8=AE=BE=E8=AE=A1=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF=E9=A1=B9=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../portal-items/appmenu/appmenu.provider.ts | 23 ++++++ .../src/portal-items/appmenu/appmenu.scss | 48 +++++++++++ .../src/portal-items/appmenu/appmenu.tsx | 79 +++++++++++++++++++ .../src/portal-items/appmenu/index.ts | 6 ++ .../portal-items/appview/appview.provider.ts | 23 ++++++ .../src/portal-items/appview/appview.scss | 48 +++++++++++ .../src/portal-items/appview/appview.tsx | 79 +++++++++++++++++++ .../src/portal-items/appview/index.ts | 6 ++ .../portal-design/src/portal-items/index.ts | 6 ++ .../src/portal-items/other/index.ts | 14 ++++ .../src/portal-items/other/other.provider.ts | 23 ++++++ .../src/portal-items/other/other.scss | 8 ++ .../src/portal-items/other/other.tsx | 31 ++++++++ .../psapp-pvpart/psapp-pvpart.service.ts | 4 +- .../pssys-dbpart/pssys-dbpart.service.ts | 4 +- .../utils/portal-item-provider-register.tsx | 2 +- .../portal-design-view.engine.ts | 23 ++++++ 17 files changed, 422 insertions(+), 5 deletions(-) create mode 100644 packages/portal-design/src/portal-items/appmenu/appmenu.provider.ts create mode 100644 packages/portal-design/src/portal-items/appmenu/appmenu.scss create mode 100644 packages/portal-design/src/portal-items/appmenu/appmenu.tsx create mode 100644 packages/portal-design/src/portal-items/appview/appview.provider.ts create mode 100644 packages/portal-design/src/portal-items/appview/appview.scss create mode 100644 packages/portal-design/src/portal-items/appview/appview.tsx create mode 100644 packages/portal-design/src/portal-items/other/index.ts create mode 100644 packages/portal-design/src/portal-items/other/other.provider.ts create mode 100644 packages/portal-design/src/portal-items/other/other.scss create mode 100644 packages/portal-design/src/portal-items/other/other.tsx diff --git a/packages/portal-design/src/portal-items/appmenu/appmenu.provider.ts b/packages/portal-design/src/portal-items/appmenu/appmenu.provider.ts new file mode 100644 index 00000000..6f5bdcb3 --- /dev/null +++ b/packages/portal-design/src/portal-items/appmenu/appmenu.provider.ts @@ -0,0 +1,23 @@ +import { IDataEntity, PanelItemController } from '@ibiz-template/runtime'; +import { IDEForm } from '@ibiz/model-core'; +import { IPortalItemController, IPortalItemProvider } from '../../interface'; +import { PortalItemController } from '../../controller'; +import { PortalDesignContentController } from '../../panel-items/portal-design-content/portal-design-content.controller'; + +export class AppMenuProvider implements IPortalItemProvider { + type: string = 'APPMENU'; + + component: string = 'IBizPortalDesignAppMenu'; + + createController( + c: PanelItemController, + model: IDEForm, + item: IDataEntity, + ): IPortalItemController { + return new PortalItemController( + c as PortalDesignContentController, + model, + item, + ); + } +} diff --git a/packages/portal-design/src/portal-items/appmenu/appmenu.scss b/packages/portal-design/src/portal-items/appmenu/appmenu.scss new file mode 100644 index 00000000..8827491b --- /dev/null +++ b/packages/portal-design/src/portal-items/appmenu/appmenu.scss @@ -0,0 +1,48 @@ +/* stylelint-disable selector-class-pattern */ +@include b(portal-design-app-menu) { + position: relative; + display: flex; + align-items: center; + width: 100%; + height: 100%; + min-height: 40px; + padding: 0 10px; + + &:hover { + @include b(portal-design-app-menu-mask) { + background-color: rgb(0 0 0 / 40%); + } + } + + @include when(active) { + @include b(portal-design-app-menu-mask) { + background-color: rgb(0 0 0 / 40%); + } + } +} + +@include b(portal-design-app-menu-text) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@include b(portal-design-app-menu-mask) { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; +} + +@include b(portal-design-app-menu-action) { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + svg { + width: 30px; + height: 30px; + } +} diff --git a/packages/portal-design/src/portal-items/appmenu/appmenu.tsx b/packages/portal-design/src/portal-items/appmenu/appmenu.tsx new file mode 100644 index 00000000..fc5c53be --- /dev/null +++ b/packages/portal-design/src/portal-items/appmenu/appmenu.tsx @@ -0,0 +1,79 @@ +import { defineComponent } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { PortalItemController } from '../../controller'; +import './appmenu.scss'; + +export default defineComponent({ + name: 'IBizPortalDesignAppMenu', + props: { + controller: { + type: PortalItemController, + required: true, + }, + isActive: { + type: Boolean, + }, + }, + setup() { + const ns = useNamespace('portal-design-app-menu'); + + // 部件设计 + const ctrlDesign = (e: MouseEvent) => { + e.stopPropagation(); + }; + + return { ns, ctrlDesign }; + }, + render() { + const data = this.controller.data; + if (!data) { + return; + } + return ( +
+
{`${data.text}-[快速菜单栏]`}
+
+
{ + this.ctrlDesign(e); + }} + > + + + + + + + + + + + + + + +
+
+
+ ); + }, +}); diff --git a/packages/portal-design/src/portal-items/appmenu/index.ts b/packages/portal-design/src/portal-items/appmenu/index.ts index 637696eb..b332e1b3 100644 --- a/packages/portal-design/src/portal-items/appmenu/index.ts +++ b/packages/portal-design/src/portal-items/appmenu/index.ts @@ -1,8 +1,14 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { App } from 'vue'; +import Component from './appmenu'; +import { AppMenuProvider } from './appmenu.provider'; +import { portalItemProviderRegister } from '../../utils'; export default { install(app: App) { // 注册组件 + app.component(Component.name!, Component); + const provider = new AppMenuProvider(); + portalItemProviderRegister.registerItemProvider(provider.type, provider); }, }; diff --git a/packages/portal-design/src/portal-items/appview/appview.provider.ts b/packages/portal-design/src/portal-items/appview/appview.provider.ts new file mode 100644 index 00000000..8a9d4ae4 --- /dev/null +++ b/packages/portal-design/src/portal-items/appview/appview.provider.ts @@ -0,0 +1,23 @@ +import { IDataEntity, PanelItemController } from '@ibiz-template/runtime'; +import { IDEForm } from '@ibiz/model-core'; +import { IPortalItemController, IPortalItemProvider } from '../../interface'; +import { PortalItemController } from '../../controller'; +import { PortalDesignContentController } from '../../panel-items/portal-design-content/portal-design-content.controller'; + +export class AppViewProvider implements IPortalItemProvider { + type: string = 'APPVIEW'; + + component: string = 'IBizPortalDesignAppView'; + + createController( + c: PanelItemController, + model: IDEForm, + item: IDataEntity, + ): IPortalItemController { + return new PortalItemController( + c as PortalDesignContentController, + model, + item, + ); + } +} diff --git a/packages/portal-design/src/portal-items/appview/appview.scss b/packages/portal-design/src/portal-items/appview/appview.scss new file mode 100644 index 00000000..8b27f5de --- /dev/null +++ b/packages/portal-design/src/portal-items/appview/appview.scss @@ -0,0 +1,48 @@ +/* stylelint-disable selector-class-pattern */ +@include b(portal-design-app-view) { + position: relative; + display: flex; + align-items: center; + width: 100%; + height: 100%; + min-height: 40px; + padding: 0 10px; + + &:hover { + @include b(portal-design-app-view-mask) { + background-color: rgb(0 0 0 / 40%); + } + } + + @include when(active) { + @include b(portal-design-app-view-mask) { + background-color: rgb(0 0 0 / 40%); + } + } +} + +@include b(portal-design-app-view-text) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@include b(portal-design-app-view-mask) { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; +} + +@include b(portal-design-app-view-action) { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + svg { + width: 30px; + height: 30px; + } +} diff --git a/packages/portal-design/src/portal-items/appview/appview.tsx b/packages/portal-design/src/portal-items/appview/appview.tsx new file mode 100644 index 00000000..fbd20a88 --- /dev/null +++ b/packages/portal-design/src/portal-items/appview/appview.tsx @@ -0,0 +1,79 @@ +import { defineComponent } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { PortalItemController } from '../../controller'; +import './appview.scss'; + +export default defineComponent({ + name: 'IBizPortalDesignAppView', + props: { + controller: { + type: PortalItemController, + required: true, + }, + isActive: { + type: Boolean, + }, + }, + setup() { + const ns = useNamespace('portal-design-app-view'); + + // 部件设计 + const ctrlDesign = (e: MouseEvent) => { + e.stopPropagation(); + }; + + return { ns, ctrlDesign }; + }, + render() { + const data = this.controller.data; + if (!data) { + return; + } + return ( +
+
{`${data.text}-[嵌入视图]`}
+
+
{ + this.ctrlDesign(e); + }} + > + + + + + + + + + + + + + + +
+
+
+ ); + }, +}); diff --git a/packages/portal-design/src/portal-items/appview/index.ts b/packages/portal-design/src/portal-items/appview/index.ts index 637696eb..3996eca4 100644 --- a/packages/portal-design/src/portal-items/appview/index.ts +++ b/packages/portal-design/src/portal-items/appview/index.ts @@ -1,8 +1,14 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { App } from 'vue'; +import Component from './appview'; +import { AppViewProvider } from './appview.provider'; +import { portalItemProviderRegister } from '../../utils'; export default { install(app: App) { // 注册组件 + app.component(Component.name!, Component); + const provider = new AppViewProvider(); + portalItemProviderRegister.registerItemProvider(provider.type, provider); }, }; diff --git a/packages/portal-design/src/portal-items/index.ts b/packages/portal-design/src/portal-items/index.ts index 1c27e9e7..b6263423 100644 --- a/packages/portal-design/src/portal-items/index.ts +++ b/packages/portal-design/src/portal-items/index.ts @@ -2,11 +2,17 @@ import { App } from 'vue'; import Container from './container'; import SysPortlet from './sysportlet'; import RawItem from './raw-item'; +import AppMenu from './appmenu'; +import AppView from './appview'; +import Other from './other'; export default { install(app: App) { app.use(Container); app.use(SysPortlet); app.use(RawItem); + app.use(AppMenu); + app.use(AppView); + app.use(Other); }, }; diff --git a/packages/portal-design/src/portal-items/other/index.ts b/packages/portal-design/src/portal-items/other/index.ts new file mode 100644 index 00000000..b71d1fe6 --- /dev/null +++ b/packages/portal-design/src/portal-items/other/index.ts @@ -0,0 +1,14 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { App } from 'vue'; +import Component from './other'; +import { OtherProvider } from './other.provider'; +import { portalItemProviderRegister } from '../../utils'; + +export default { + install(app: App) { + // 注册组件 + app.component(Component.name!, Component); + const provider = new OtherProvider(); + portalItemProviderRegister.registerItemProvider(provider.type, provider); + }, +}; diff --git a/packages/portal-design/src/portal-items/other/other.provider.ts b/packages/portal-design/src/portal-items/other/other.provider.ts new file mode 100644 index 00000000..909d12b8 --- /dev/null +++ b/packages/portal-design/src/portal-items/other/other.provider.ts @@ -0,0 +1,23 @@ +import { IDataEntity, PanelItemController } from '@ibiz-template/runtime'; +import { IDEForm } from '@ibiz/model-core'; +import { IPortalItemController, IPortalItemProvider } from '../../interface'; +import { PortalItemController } from '../../controller'; +import { PortalDesignContentController } from '../../panel-items/portal-design-content/portal-design-content.controller'; + +export class OtherProvider implements IPortalItemProvider { + type: string = 'OTHER'; + + component: string = 'IBizPortalDesignOther'; + + createController( + c: PanelItemController, + model: IDEForm, + item: IDataEntity, + ): IPortalItemController { + return new PortalItemController( + c as PortalDesignContentController, + model, + item, + ); + } +} diff --git a/packages/portal-design/src/portal-items/other/other.scss b/packages/portal-design/src/portal-items/other/other.scss new file mode 100644 index 00000000..69e04ad5 --- /dev/null +++ b/packages/portal-design/src/portal-items/other/other.scss @@ -0,0 +1,8 @@ +@include b(portal-design-other) { + display: flex; + align-items: center; + width: 100%; + height: 100%; + min-height: 40px; + padding: 0 10px; +} \ No newline at end of file diff --git a/packages/portal-design/src/portal-items/other/other.tsx b/packages/portal-design/src/portal-items/other/other.tsx new file mode 100644 index 00000000..849f2bae --- /dev/null +++ b/packages/portal-design/src/portal-items/other/other.tsx @@ -0,0 +1,31 @@ +import { defineComponent } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { PortalItemController } from '../../controller'; +import './other.scss'; + +export default defineComponent({ + name: 'IBizPortalDesignOther', + props: { + controller: { + type: PortalItemController, + required: true, + }, + isActive: { + type: Boolean, + }, + }, + setup() { + const ns = useNamespace('portal-design-other'); + + return { ns }; + }, + render() { + const data = this.controller.data; + if (!data) { + return; + } + return ( +
+ ); + }, +}); diff --git a/packages/portal-design/src/services/psapp-pvpart/psapp-pvpart.service.ts b/packages/portal-design/src/services/psapp-pvpart/psapp-pvpart.service.ts index 3ff0cfa6..e1eaee8c 100644 --- a/packages/portal-design/src/services/psapp-pvpart/psapp-pvpart.service.ts +++ b/packages/portal-design/src/services/psapp-pvpart/psapp-pvpart.service.ts @@ -1,6 +1,6 @@ /* eslint-disable no-constant-condition */ /* eslint-disable no-plusplus */ -import { notNilEmpty } from 'qx-util'; +import { notNilEmpty, createUUID } from 'qx-util'; import { isEmpty, isNil } from 'ramda'; import { DEService, IDataEntity } from '@ibiz-template/runtime'; import { IHttpResponse } from '@ibiz-template/core'; @@ -36,6 +36,7 @@ export class PSAppPVPartService extends DEService { * @return {*} {Promise} */ async fillDefault(context: IContext, entity: PSAppPVPart): Promise { + entity.psapppvpartid = createUUID(); let nStartIndex = 1; const strDetailType = entity.itemtype; let strRootName: string = strDetailType; @@ -64,7 +65,6 @@ export class PSAppPVPartService extends DEService { strRootName + (nStartIndex === 0 ? '' : nStartIndex); if (!detailMap.has(strDefaultName) && !detailMap2.has(strDefaultName)) { entity.psapppvpartname = strDefaultName; - entity.psapppvpartid = strDefaultName; break; } nStartIndex++; diff --git a/packages/portal-design/src/services/pssys-dbpart/pssys-dbpart.service.ts b/packages/portal-design/src/services/pssys-dbpart/pssys-dbpart.service.ts index 2d32d42b..f5bd3998 100644 --- a/packages/portal-design/src/services/pssys-dbpart/pssys-dbpart.service.ts +++ b/packages/portal-design/src/services/pssys-dbpart/pssys-dbpart.service.ts @@ -3,7 +3,7 @@ /* eslint-disable eqeqeq */ import { DEService, IDataEntity } from '@ibiz-template/runtime'; import { IHttpResponse } from '@ibiz-template/core'; -import { notNilEmpty } from 'qx-util'; +import { createUUID, notNilEmpty } from 'qx-util'; import { isEmpty, isNil } from 'ramda'; import { PSSysDBPart } from '../../entity'; @@ -37,6 +37,7 @@ export class PSSysDBPartService extends DEService { * @return {*} {Promise} */ async fillDefault(context: IContext, entity: PSSysDBPart): Promise { + entity.pssysdbpartid = createUUID(); let nStartIndex = 1; const strDetailType = entity.itemtype; let strRootName: string = strDetailType; @@ -65,7 +66,6 @@ export class PSSysDBPartService extends DEService { strRootName + (nStartIndex == 0 ? '' : nStartIndex); if (!detailMap.has(strDefaultName) && !detailMap2.has(strDefaultName)) { entity.pssysdbpartname = strDefaultName; - entity.pssysdbpartid = strDefaultName; break; } nStartIndex++; diff --git a/packages/portal-design/src/utils/portal-item-provider-register.tsx b/packages/portal-design/src/utils/portal-item-provider-register.tsx index cd2f9dc4..4b96cb10 100644 --- a/packages/portal-design/src/utils/portal-item-provider-register.tsx +++ b/packages/portal-design/src/utils/portal-item-provider-register.tsx @@ -37,7 +37,7 @@ export class PortalItemProviderRegister { * @param {string} type * @return {*} {IPortalItemProvider} */ - getItemProvider(type: string): IPortalItemProvider { + getItemProvider(type: string = 'OTHER'): IPortalItemProvider { const upperType = type.toUpperCase(); if (this.portalItemProviderMap.has(upperType)) { return this.portalItemProviderMap.get(upperType)!; diff --git a/packages/portal-design/src/views/portal-design-view/portal-design-view.engine.ts b/packages/portal-design/src/views/portal-design-view/portal-design-view.engine.ts index 3244a04d..41f09101 100644 --- a/packages/portal-design/src/views/portal-design-view/portal-design-view.engine.ts +++ b/packages/portal-design/src/views/portal-design-view/portal-design-view.engine.ts @@ -1,4 +1,5 @@ import { DesignViewEngineBase } from '@ibiz-template-plugin/design-base'; +import { SysUIActionTag } from '@ibiz-template/runtime'; import { PortalDesignViewController } from './portal-design-view.controller'; /** @@ -47,4 +48,26 @@ export class PortalDesignViewEngine extends DesignViewEngineBase { this.view.evt.emit('onSaveSuccess', undefined); return result; } + + /** + * 视图能力调用 + * + * @author zhanghengfeng + * @date 2024-11-22 20:11:55 + * @param {string} key + * @param {IData} [args] + * @return {*} {(Promise)} + */ + async call(key: string, args?: IData): Promise { + if (key === SysUIActionTag.REFRESH) { + await this.load(); + this.view.evt.emit('onUpdateSuccess', undefined); + this.navPos.openView({ key: '' }); + requestAnimationFrame(() => { + this.activeRoot(); + }); + return; + } + return super.call(key, args); + } } -- Gitee