From 1bb64a1d280132f9153dcb4f2cdaf315e140b47a Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Tue, 8 Apr 2025 15:41:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=20=E6=96=B0=E5=A2=9E=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=A8=A1=E5=9E=8B=E7=B2=98=E8=B4=B4=E6=9D=BF=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E8=A1=8C=E4=B8=BA=E6=8F=92=E4=BB=B6=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=B0=E5=BB=BA=E7=B2=98=E8=B4=B4=E6=9D=BF=E9=A1=B9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E5=A4=8Ddsl=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=8B=B7=E8=B4=9D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model-clipboard-item.tsx | 17 +++-- .../src/interface/i-clipboard-params.ts | 24 ++++-- .../model-design/src/model/clipboard-data.ts | 12 +-- packages/model-design/src/ui-action/index.ts | 6 ++ .../open-model-clipboard-provider.ts | 76 +++++++++++++++++++ 5 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 packages/model-design/src/ui-action/open-model-clipboard-provider.ts diff --git a/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx b/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx index c0af3721..92872bd4 100644 --- a/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx +++ b/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx @@ -103,11 +103,18 @@ export default defineComponent({ const el = document.createElement('textarea'); el.style.position = 'absolute'; el.style.left = '-9999px'; - el.value = JSON.stringify( - props.data.models.map(item => item.model), - null, - 2, - ); + if (props.data.type === 'dsl') { + const dslModels = props.data.models + .filter(m => !!m.dsl) + .map(m => m.dsl); + el.value = dslModels.join('\n'); + } else { + el.value = JSON.stringify( + props.data.models.map(item => item.model), + null, + 2, + ); + } document.body.appendChild(el); el.select(); const result = document.execCommand('copy'); diff --git a/packages/model-design/src/interface/i-clipboard-params.ts b/packages/model-design/src/interface/i-clipboard-params.ts index b166ea71..e77b34fd 100644 --- a/packages/model-design/src/interface/i-clipboard-params.ts +++ b/packages/model-design/src/interface/i-clipboard-params.ts @@ -1,3 +1,5 @@ +import { IModelData } from './i-model-data'; + /** * 剪切板参数 * @@ -23,18 +25,26 @@ export interface IClipboardParams { /** * 剪切板源数据 - * - * @author zhanghengfeng - * @date 2024-10-25 20:10:35 + * - 数据项必须包含srfkey字段 + * - 没有传models时,会根据实体标识加载对应数据的模型 * @type {IData[]} + * @memberof IClipboardParams + */ + items?: IData[]; + + /** + * 剪切板模型 + * - 手动传入的剪切项的模型,该模型集合数据格式必须和加载回来的数据模型数据格式一致 + * @type {IModelData[]} + * @memberof IClipboardParams */ - items: IData[]; + models?: IModelData[]; /** - * 类型 + * 数据剪切类型 * - * @type {('default' | 'advanced')}(默认 | 高级 | dsl) - * @memberof IModelParams + * @type {('default' | 'advanced' | 'dsl')} (默认模型) | (高级模型) | (dsl模型) + * @memberof IClipboardParams */ type?: 'default' | 'advanced' | 'dsl'; } diff --git a/packages/model-design/src/model/clipboard-data.ts b/packages/model-design/src/model/clipboard-data.ts index 98fe2381..72637770 100644 --- a/packages/model-design/src/model/clipboard-data.ts +++ b/packages/model-design/src/model/clipboard-data.ts @@ -81,10 +81,10 @@ export class ClipboardData { models: IModelData[] = []; /** - * 类型 + * 模型类型 * - * @type {('default' | 'advanced')}(默认 | 高级 | dsl) - * @memberof ModelData + * @type {('default' | 'advanced' | 'dsl')} (默认模型) | (高级模型) | (dsl模型) + * @memberof ClipboardData */ type: 'default' | 'advanced' | 'dsl' = 'default'; @@ -97,8 +97,10 @@ export class ClipboardData { this.title = data.title; this.codeName = data.codeName; this.type = data.type || 'default'; - if (data.items) { - this.items = data.items; + if (data.items?.length) this.items = data.items; + if (data.models?.length) { + this.isExport = true; + this.models = data.models; } } } diff --git a/packages/model-design/src/ui-action/index.ts b/packages/model-design/src/ui-action/index.ts index da14e042..0e2e9beb 100644 --- a/packages/model-design/src/ui-action/index.ts +++ b/packages/model-design/src/ui-action/index.ts @@ -9,6 +9,7 @@ import { OpenModelRuntimeProvider } from './open-model-runtime'; import { DSLModelExportProvider } from './dsl-model-export-provider'; import { DSLModelImportProvider } from './dsl-model-import-provider'; import { DSLModelEditProvider } from './dsl-model-edit-provider'; +import { OpenModelClipboardProvider } from './open-model-clipboard-provider'; export default { install(): void { @@ -53,5 +54,10 @@ export default { ); const dslModelEditProvider = new DSLModelEditProvider(); registerUIActionProvider('DEUIACTION_DSL_EDIT', () => dslModelEditProvider); + const openModelClipboardProvider = new OpenModelClipboardProvider(); + registerUIActionProvider( + 'DEUIACTION_OPEN_MODEL_CLIPBOARD', + () => openModelClipboardProvider, + ); }, }; diff --git a/packages/model-design/src/ui-action/open-model-clipboard-provider.ts b/packages/model-design/src/ui-action/open-model-clipboard-provider.ts new file mode 100644 index 00000000..488577de --- /dev/null +++ b/packages/model-design/src/ui-action/open-model-clipboard-provider.ts @@ -0,0 +1,76 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { h, resolveComponent } from 'vue'; +import { + IModal, + IUIActionResult, + IUILogicParams, + UIActionProviderBase, + convertNavData, + formatMultiData, +} from '@ibiz-template/runtime'; +import { IAppDEUIAction } from '@ibiz/model-core'; +import { notNilEmpty } from 'qx-util'; + +/** + * 打开模型粘贴版 + * + * @export + * @class OpenModelClipboardProvider + * @extends {UIActionProviderBase} + */ +export class OpenModelClipboardProvider extends UIActionProviderBase { + async execAction( + action: IAppDEUIAction, + args: IUILogicParams, + ): Promise { + const { context, params, data } = args; + if (!ibiz.modelClipboard) return {}; + // 是否是多数据 + const isMultiData = + ['MULTIKEY', 'MULTIDATA'].includes(action.actionTarget!) && + data.length > 0; + // 处理自定义导航上下文 + const resultContext = context.clone(); + const navContexts = action.navigateContexts; + if (notNilEmpty(navContexts)) { + Object.assign( + resultContext, + convertNavData( + navContexts, + isMultiData ? formatMultiData(navContexts, data) : data[0] || {}, + params, + context, + ), + ); + } + // 处理自定义导航参数 + const resultParams: IParams = {}; + const navParams = action.navigateParams; + if (notNilEmpty(navParams)) { + Object.assign( + resultParams, + convertNavData( + navParams, + isMultiData ? formatMultiData(navParams, data) : data[0] || {}, + params, + context, + ), + ); + } + const overlay = ibiz.overlay.createDrawer( + (modal: IModal) => { + return h(resolveComponent('IBizModelClipboard'), { + modal, + type: resultParams.type, + context: resultContext, + params: resultParams, + }); + }, + undefined, + { placement: 'right', width: 500, showClose: false } as any, + ); + overlay.present(); + await overlay.onWillDismiss(); + return {}; + } +} -- Gitee From 912014625378cbe99963ea4e92f4cf58076b96a3 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Tue, 8 Apr 2025 15:41:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=20=E4=BC=98=E5=8C=96=E5=BA=95?= =?UTF-8?q?=E9=83=A8=E8=8F=9C=E5=8D=95=E6=A0=8F=E7=82=B9=E5=87=BB=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design-bottom-menu.controller.ts | 67 +++++++------------ 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/packages/layout-design/src/design-index-view/components/design-bottom-menu/design-bottom-menu.controller.ts b/packages/layout-design/src/design-index-view/components/design-bottom-menu/design-bottom-menu.controller.ts index 16ff569b..9c0ace7c 100644 --- a/packages/layout-design/src/design-index-view/components/design-bottom-menu/design-bottom-menu.controller.ts +++ b/packages/layout-design/src/design-index-view/components/design-bottom-menu/design-bottom-menu.controller.ts @@ -1,13 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { - IModal, getControl, ViewController, + AppFuncCommand, PanelItemController, - IOverlayContainer, } from '@ibiz-template/runtime'; -import { h, resolveComponent } from 'vue'; import { IAppMenu, IAppMenuItem, IPanelContainer } from '@ibiz/model-core'; import { DesignBottomMenuState } from './design-bottom-menu.state'; @@ -71,14 +69,6 @@ export class DesignBottomMenuController extends PanelItemController { - // 关闭飘窗 - await this.overlay?.dismiss(); - if (menuItem.id !== this.state.activeMenuItem?.id) { - this.state.activeMenuItem = menuItem; - if (menuItem.id === 'clipboard') { - this.state.showDrawer = false; - (ibiz as IData).devTool.triggerVisible(false); - this.overlay = ibiz.overlay.createDrawer( - (modal: IModal) => { - return h(resolveComponent('IBizModelClipboard'), { - modal, - context: this.context, - params: this.params, - }); - }, - undefined, - { placement: 'right', width: 500, showClose: false } as any, - ); - this.overlay.present(); - this.overlay.onWillDismiss().then(() => { - this.overlay = undefined; - this.state.activeMenuItem = undefined; - }); - } else if (menuItem.id === 'debug') { - this.state.showDrawer = false; - (ibiz as IData).devTool.triggerVisible(true); - } else { - (ibiz as IData).devTool.triggerVisible(false); + this.state.showDrawer = false; + this.state.activeMenuItem = + menuItem.id !== this.state.activeMenuItem?.id ? menuItem : undefined; + (ibiz as IData).devTool.triggerVisible(false); + if (!this.state.activeMenuItem) return; + const context = this.panel.context.clone(); + switch (menuItem.id) { + case 'terminal': this.state.activeViewModelId = this.getViewIDByMenuItem(menuItem); this.state.showDrawer = true; - } - } else { - this.state.showDrawer = false; - this.state.activeMenuItem = undefined; - (ibiz as IData).devTool.triggerVisible(false); + break; + case 'debug': + (ibiz as IData).devTool.triggerVisible(true); + break; + default: + Object.assign(context, { srfappid: menuItem.appId }); + await ibiz.commands.execute( + AppFuncCommand.TAG, + menuItem.appFuncId, + context, + this.panel.params, + { view: this.view }, + ); + break; } } } -- Gitee