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 16ff569bbd8d45008a7314a51cd4817c29e40bfc..9c0ace7c307ebedf040629eb54fca2dd4c14e9cc 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; } } } 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 c0af37212041e141ac89cde35c9c1bbef844b0a7..92872bd4683737849c1c823136085023c8a105a9 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 b166ea71797e21b86da6fb780db18b48511945ad..e77b34fd09a581a26e2123c17c2f3ebcfcb18a88 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 98fe2381637546a19277e9d7eb81cab0dfc30359..72637770404f9009f9f8c247ed34ec1cb26910aa 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 da14e04292f21c09d9db0859bdd69658feb506b3..0e2e9bebb321cfdb33a906a7062973273082d0df 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 0000000000000000000000000000000000000000..488577de9bd68e115921b7809851a9bb06a75f43 --- /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 {}; + } +}