diff --git a/packages/portal-design/public/assets/svg/container.svg b/packages/portal-design/public/assets/svg/container.svg deleted file mode 100644 index bfb2bf45f0196f27bab2735f758a179028f3d72f..0000000000000000000000000000000000000000 --- a/packages/portal-design/public/assets/svg/container.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/portal-design/public/assets/svg/rawitem.svg b/packages/portal-design/public/assets/svg/rawitem.svg deleted file mode 100644 index 4c63f8335a0f3575638bfdecb8a750f7637cb6e5..0000000000000000000000000000000000000000 --- a/packages/portal-design/public/assets/svg/rawitem.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/portal-design/public/assets/svg/sysportlet.svg b/packages/portal-design/public/assets/svg/sysportlet.svg deleted file mode 100644 index 8c506557bb076ae59226c91666cf346db6db532f..0000000000000000000000000000000000000000 --- a/packages/portal-design/public/assets/svg/sysportlet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/portal-design/src/entity/pssys-dbpart/pssys-dbpart.ts b/packages/portal-design/src/entity/pssys-dbpart/pssys-dbpart.ts index 7d791bbdab15c918e544d621b9ba58782d82f8db..6aca2f661aa3db646ff4492f73c9c95940e2330b 100644 --- a/packages/portal-design/src/entity/pssys-dbpart/pssys-dbpart.ts +++ b/packages/portal-design/src/entity/pssys-dbpart/pssys-dbpart.ts @@ -15,6 +15,16 @@ export class PSSysDBPart extends AppDataEntity { : this.pssysdbpartname; } + // @ts-expect-error + get srfordervalue(): number { + return this.ordervalue; + } + + // @ts-expect-error + set srfordervalue(value): number { + this.ordervalue = value; + } + clone(): PSSysDBPart { const entity = new PSSysDBPart(this._entity, this._data); entity.srfkey = this.srfkey; diff --git a/packages/portal-design/src/panel-items/index.ts b/packages/portal-design/src/panel-items/index.ts index 8beaf915cd6f0c2fdbf78ab70697f3841cbd7261..e4a64155d28f233d23ece55693602f34a8b7614d 100644 --- a/packages/portal-design/src/panel-items/index.ts +++ b/packages/portal-design/src/panel-items/index.ts @@ -2,11 +2,13 @@ import { App } from 'vue'; import PortalDesignMaterial from './portal-design-material'; import PortalDesignStructure from './portal-design-structure'; import PortalDesignContent from './portal-design-content'; +import PortalDesignModeSwitch from './portal-design-mode-switch'; export default { install(app: App): void { app.use(PortalDesignMaterial); app.use(PortalDesignStructure); app.use(PortalDesignContent); + app.use(PortalDesignModeSwitch); }, }; diff --git a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.controller.ts b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.controller.ts index c8e6350c8ca5935d2377b7910dc549057634b212..a474aa55e06d8a62e4d2d3c1b768b65d6635baa2 100644 --- a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.controller.ts +++ b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.controller.ts @@ -1,5 +1,6 @@ -import { PanelItemController } from '@ibiz-template/runtime'; -import { ICodeItem } from '@ibiz/model-core'; +import { PanelItemController, getControl } from '@ibiz-template/runtime'; +import { IDEEditForm, IDEFormGroupPanel } from '@ibiz/model-core'; +import { clone } from 'ramda'; import { PortalDesignMaterialState } from './portal-design-material.state'; export class PortalDesignMaterialController extends PanelItemController { @@ -13,10 +14,10 @@ export class PortalDesignMaterialController extends PanelItemController { * 素材分组 * * @author zhanghengfeng - * @date 2024-11-20 17:11:48 - * @type {ICodeItem[]} + * @date 2024-11-20 20:11:19 + * @type {IDEFormGroupPanel[]} */ - groups: ICodeItem[] = []; + materialGroups: IDEFormGroupPanel[] = []; /** * 初始化 @@ -28,38 +29,31 @@ export class PortalDesignMaterialController extends PanelItemController { */ protected async onInit(): Promise { await super.onInit(); - const appId = this.model.appId; - this.groups = [ - { - appId, - text: '布局容器', - codeItems: [ - { - appId, - text: '布局容器', - value: 'CONTAINER', - iconPath: './assets/svg/container.svg', - }, - ], - }, - { - appId, - text: '基础项成员', - codeItems: [ - { - appId, - text: '系统门户部件', - value: 'SYSPORTLET', - iconPath: './assets/svg/sysportlet.svg', - }, - { - appId, - text: '直接内容', - value: 'RAWITEM', - iconPath: './assets/svg/rawitem.svg', - }, - ], - }, - ]; + this.initMaterialGroups(); + } + + /** + * 初始化素材分组 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:33 + */ + initMaterialGroups(): void { + const materialForm = getControl( + this.panel.view.model, + 'material', + ) as IDEEditForm; + const formPages = materialForm.deformPages || []; + const materialPage = formPages[0]; + if (materialPage) { + const details = materialPage.deformDetails; + const groups: IDEFormGroupPanel[] = []; + details?.forEach(detail => { + if (detail.detailType === 'GROUPPANEL') { + groups.push(detail); + } + }); + this.materialGroups = clone(groups); + } } } diff --git a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.scss b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.scss index fc9a241ac06e00acc8ad20386a95353e0e2a1ca2..27375811d5ece56f5d852315830678eaee0b8bf5 100644 --- a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.scss +++ b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.scss @@ -55,6 +55,7 @@ @include b(portal-design-material-group-content) { display: flex; flex-wrap: wrap; + color: getCssVar(color, text, 1); @include m(empty) { justify-content: center; @@ -109,8 +110,10 @@ width: 16px; font-size: 16px; - img { - width: 100%; + svg { + width: 16px; + height: 16px; + fill: currentcolor; } } diff --git a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.tsx b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.tsx index ea9f791f4a9c086233a596b03feba8a181cf49f1..0e069fe879b8c7b5fc6cbd48a3ec334b03fb8558 100644 --- a/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.tsx +++ b/packages/portal-design/src/panel-items/portal-design-material/portal-design-material.tsx @@ -1,8 +1,7 @@ import { useNamespace } from '@ibiz-template/vue3-util'; -import { ICodeItem, IPanelItem } from '@ibiz/model-core'; +import { IDEFormDetail, IPanelItem } from '@ibiz/model-core'; import { PropType, defineComponent, ref } from 'vue'; import draggable from 'vuedraggable'; -import { resource } from '../../global'; import { PortalDesignMaterialController } from './portal-design-material.controller'; import './portal-design-material.scss'; @@ -28,7 +27,9 @@ export default defineComponent({ const searchValue = ref(''); // 收缩面板值 - const collapseValue = ref(props.controller.groups.map((_, i) => `${i}`)); + const collapseValue = ref( + props.controller.materialGroups.map((_, i) => `${i}`), + ); return { ns, @@ -49,11 +50,11 @@ export default defineComponent({ - {this.controller.groups.map((group, i) => { - const items = group.codeItems?.filter(item => { + {this.controller.materialGroups.map((group, i) => { + const items = group.deformDetails?.filter(item => { if (this.searchValue) { const regExp = this.searchValue.trim().toLowerCase(); - const text = item.text?.toLowerCase(); + const text = item.caption?.toLowerCase(); if (text && text.indexOf(regExp) === -1) { return false; } @@ -66,7 +67,7 @@ export default defineComponent({ title: () => { return ( - {group.text} + {group.caption} ); }, @@ -96,12 +97,12 @@ export default defineComponent({ sort={false} > {{ - item: ({ element }: { element: ICodeItem }) => { + item: ({ element }: { element: IDEFormDetail }) => { const item = element; return ( - - {item.iconPath ? ( - - ) : null} - + icon={item.sysImage} + > - {item.text} + {item.caption} diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/index.ts b/packages/portal-design/src/panel-items/portal-design-mode-switch/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2fed5c41c31e275ea2b8099a47f13dbd17db865 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/index.ts @@ -0,0 +1,14 @@ +import { App } from 'vue'; +import { registerPanelItemProvider } from '@ibiz-template/runtime'; +import PortalDesignModeSwitch from './portal-design-mode-switch'; +import { PortalDesignModeSwitchProvider } from './portal-design-mode-switch.provider'; + +export default { + install(app: App): void { + app.component('IBizPortalDesignModeSwitch', PortalDesignModeSwitch); + registerPanelItemProvider( + 'RAWITEM_PORTAL_DESIGN_MODE_SWITCH', + () => new PortalDesignModeSwitchProvider(), + ); + }, +}; diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.controller.ts b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..d032ecf88941860c3a75088c1c02b96436267ad0 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.controller.ts @@ -0,0 +1,10 @@ +import { PanelItemController } from '@ibiz-template/runtime'; +import { PortalDesignModeSwitchState } from './portal-design-mode-switch.state'; + +export class PortalDesignModeSwitchController extends PanelItemController { + declare state: PortalDesignModeSwitchState; + + protected createState(): PortalDesignModeSwitchState { + return new PortalDesignModeSwitchState(this.parent?.state); + } +} diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.provider.ts b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..dee3d4aebfe87ed4b85374c8ff42cfb6d85e79e0 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.provider.ts @@ -0,0 +1,21 @@ +import { + IPanelItemController, + IPanelItemProvider, + IPanelController, +} from '@ibiz-template/runtime'; +import { IPanelItem } from '@ibiz/model-core'; +import { PortalDesignModeSwitchController } from './portal-design-mode-switch.controller'; + +export class PortalDesignModeSwitchProvider implements IPanelItemProvider { + component = 'IBizPortalDesignModeSwitch'; + + async createController( + panelItem: IPanelItem, + panel: IPanelController, + parent?: IPanelItemController, + ): Promise { + const c = new PortalDesignModeSwitchController(panelItem, panel, parent); + await c.init(); + return c; + } +} diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.scss b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.scss new file mode 100644 index 0000000000000000000000000000000000000000..cf27ef9cbf2c76be91f5f6f6585cd33795ac2824 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.scss @@ -0,0 +1,12 @@ +@include b(portal-design-mode-switch) { + display: flex; + align-items: center; + + .el-button { + padding: 5px 6px; + + + .el-button { + margin-left: 2px; + } + } +} diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.state.ts b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.state.ts new file mode 100644 index 0000000000000000000000000000000000000000..274c54d5ccbd20d7906e7dc69fee4464fcd82624 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.state.ts @@ -0,0 +1,3 @@ +import { PanelItemState } from '@ibiz-template/runtime'; + +export class PortalDesignModeSwitchState extends PanelItemState {} diff --git a/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.tsx b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.tsx new file mode 100644 index 0000000000000000000000000000000000000000..090736292b07645a947c941bec30a1ea7ebfb7a4 --- /dev/null +++ b/packages/portal-design/src/panel-items/portal-design-mode-switch/portal-design-mode-switch.tsx @@ -0,0 +1,38 @@ +import { PropType, defineComponent } from 'vue'; +import { IPanelItem } from '@ibiz/model-core'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { PortalDesignModeSwitchController } from './portal-design-mode-switch.controller'; +import './portal-design-mode-switch.scss'; + +export default defineComponent({ + name: 'IBizPortalDesignModeSwitch', + props: { + modelData: { + type: Object as PropType, + required: true, + }, + controller: { + type: PortalDesignModeSwitchController, + required: true, + }, + }, + setup() { + const ns = useNamespace('portal-design-mode-switch'); + + return { + ns, + }; + }, + render() { + return ( + + + + + + + + + ); + }, +}); diff --git a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.controller.ts b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.controller.ts index dee0507902783cbf982af65a4867700027a5b256..7ead3aec75261bb3fa04807309dd421a11326623 100644 --- a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.controller.ts +++ b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.controller.ts @@ -1,5 +1,13 @@ -import { PanelItemController } from '@ibiz-template/runtime'; +/* eslint-disable no-await-in-loop */ +import { + IAppDEService, + PanelItemController, + getControl, +} from '@ibiz-template/runtime'; +import { IAppDataEntity, IDEEditForm } from '@ibiz/model-core'; +import { generateOrderValue, isNilOrEmpty } from 'qx-util'; import { PortalDesignStructureState } from './portal-design-structure.state'; +import { PortalDesignViewController } from '../../views/portal-design-view/portal-design-view.controller'; export class PortalDesignStructureController extends PanelItemController { declare state: PortalDesignStructureState; @@ -7,4 +15,270 @@ export class PortalDesignStructureController extends PanelItemController { protected createState(): PortalDesignStructureState { return new PortalDesignStructureState(this.parent?.state); } + + /** + * 视图控制器 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:37 + * @readonly + * @type {PortalDesignViewController} + */ + get view(): PortalDesignViewController { + return this.panel.view as PortalDesignViewController; + } + + /** + * 项表单 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:55 + * @readonly + * @type {IDEEditForm} + */ + get itemForm(): IDEEditForm { + return getControl(this.view.model, 'item') as IDEEditForm; + } + + /** + * 项实体 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:17 + * @protected + * @type {IAppDataEntity} + */ + protected itemEntity!: IAppDataEntity; + + /** + * 项服务 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:27 + * @protected + * @type {IAppDEService} + */ + protected itemService!: IAppDEService; + + /** + * 初始化 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:39 + * @protected + * @return {*} {Promise} + */ + protected async onInit(): Promise { + await super.onInit(); + this.handleSelectDataChange = this.handleSelectDataChange.bind(this); + this.view.select.on(this.handleSelectDataChange); + // 初始化当前数据服务 + await this.initBaseResource(); + // 加载数据 + await this.load(); + } + + /** + * 处理选中数据改变 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:12 + * @param {(IData | null)} [data] + */ + handleSelectDataChange(data?: IData | null): void { + this.state.activeItem = data?.id || ''; + } + + /** + * 初始化基础资源 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:49 + * @protected + * @return {*} {Promise} + */ + protected async initBaseResource(): Promise { + const app = ibiz.hub.getApp(this.view.model.appId); + this.itemEntity = await ibiz.hub.getAppDataEntity( + this.itemForm!.appDataEntityId!, + this.view.model.appId, + ); + this.itemService = await app.deService.getService( + this.panel.context, + this.itemForm!.appDataEntityId!, + ); + } + + /** + * 生成树节点数据 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:23 + * @param {IData} data + * @return {*} {IData} + */ + generateTreeNode(data: IData): IData { + return { + text: data.text, + id: data.srfkey, + data, + }; + } + + /** + * 计算树层级 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:38 + * @param {IData} node + * @param {IData[]} items + */ + calcTreeLevel(node: IData, items: IData[]): void { + node.children = items + .filter( + item => + item[`p${this.itemEntity.codeName?.toLowerCase()}id`] === node.id, + ) + .map(item => { + const childNode = this.generateTreeNode(item); + this.calcTreeLevel(childNode, items); + return childNode; + }); + } + + /** + * 加载数据 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:15 + * @protected + * @return {*} {Promise} + */ + protected async load(): Promise { + const res = await this.itemService.fetchDefault( + this.panel.context, + this.panel.params, + ); + if (res.ok && Array.isArray(res.data)) { + await this.afterLoad({ + items: res.data, + }); + } + } + + /** + * 加载之后 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:55 + * @protected + * @param {IData} args + * @return {*} {Promise} + */ + protected async afterLoad(args: IData): Promise { + const items: IData[] = args.items; + this.state.items = items; + const treeNode: IData[] = []; + items.forEach(item => { + if (isNilOrEmpty(item[`p${this.itemEntity.codeName?.toLowerCase()}id`])) { + const node = this.generateTreeNode(item); + this.calcTreeLevel(node, items); + treeNode.push(node); + } + }); + this.state.treeData = treeNode; + } + + /** + * 刷新 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:00 + * @protected + * @return {*} {Promise} + */ + protected async refresh(): Promise { + await this.load(); + } + + /** + * 节点拖拽完成 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:15 + * @param {IData} _draggingNode + * @param {IData} dropNode + * @param {string} dropType + * @return {*} {Promise} + */ + async onNodeDrop( + _draggingNode: IData, + dropNode: IData, + dropType: string, + ): Promise { + let parent = dropNode.parent; + if (dropType === 'inner') { + parent = dropNode; + } + const pData = parent?.data?.data; + const updateFn = async (data: IData, index: number): Promise => { + if (!data) { + return; + } + data.ordervalue = generateOrderValue(index); + const id = `p${this.itemEntity.codeName?.toLowerCase()}id`; + const name = `p${this.itemEntity.codeName?.toLowerCase()}name`; + if (pData) { + data[id] = pData.srfkey; + data[name] = pData.srfmajortext; + } else { + data[id] = null; + data[name] = null; + } + await this.itemService.update(this.panel.context, data); + }; + if (parent && parent.childNodes) { + for (let i = 0; i < parent.childNodes.length; i++) { + const { data } = parent.childNodes[i].data; + await updateFn(data, i); + } + } + this.refresh(); + } + + /** + * 节点选中 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:56 + * @param {IData} data + * @param {IData} _node + * @return {*} {void} + */ + onNodeSelect(data: IData, _node: IData): void { + if (!data) { + return; + } + const sourceData = data.data; + if (!sourceData) { + return; + } + this.view.call('onActive', { + id: sourceData.srfkey!, + label: sourceData.srfmajortext!, + type: sourceData.itemtype, + data: sourceData, + }); + } + + /** + * 销毁方法 + * + * @author zhanghengfeng + * @date 2024-11-20 21:11:23 + */ + destroy(): void { + super.destroy(); + this.view.select.off(this.handleSelectDataChange); + } } diff --git a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.scss b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.scss index 3afd363adef29c66c32fc3548b597ae560087bcf..4a1704c9966ad21f1c62c8793523b5e8092f30dc 100644 --- a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.scss +++ b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.scss @@ -3,6 +3,10 @@ flex-direction: column; width: 100%; height: 100%; + + .el-tree { + --el-tree-text-color: #{getCssVar(color, text, 1)}; + } } @include b(portal-design-structure-header) { diff --git a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.state.ts b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.state.ts index aaa374a63ac5b883d1e580bbab46fbbd8e837751..6a5eeceaaa7484754882fa8b64682575900c1a3d 100644 --- a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.state.ts +++ b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.state.ts @@ -9,4 +9,22 @@ export class PortalDesignStructureState extends PanelItemState { * @type {IData[]} */ treeData: IData[] = []; + + /** + * 项数据 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:18 + * @type {IData[]} + */ + items: IData[] = []; + + /** + * 激活项 + * + * @author zhanghengfeng + * @date 2024-11-20 20:11:42 + * @type {string} + */ + activeItem: string = ''; } diff --git a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.tsx b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.tsx index 48039fb1a6a1274001e173a3b932799a738f0dcc..cd32be2b2f36eda15923dbfb86f74b28403ed449 100644 --- a/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.tsx +++ b/packages/portal-design/src/panel-items/portal-design-structure/portal-design-structure.tsx @@ -1,6 +1,6 @@ import { useNamespace } from '@ibiz-template/vue3-util'; import { IPanelItem } from '@ibiz/model-core'; -import { PropType, defineComponent, ref } from 'vue'; +import { PropType, defineComponent, ref, watch } from 'vue'; import { PortalDesignStructureController } from './portal-design-structure.controller'; import './portal-design-structure.scss'; @@ -16,7 +16,7 @@ export default defineComponent({ required: true, }, }, - setup() { + setup(props) { const ns = useNamespace('portal-design-structure'); // 搜索值 @@ -33,9 +33,9 @@ export default defineComponent({ // 是否允许放置 const allowDrop = (_draggingNode: IData, dropNode: IData, type: string) => { if (Object.is(type, 'inner')) { - return false; - } - if (dropNode.level === 1) { + if (dropNode && dropNode.data?.data?.itemtype === 'CONTAINER') { + return true; + } return false; } return true; @@ -70,6 +70,20 @@ export default defineComponent({ return true; }; + watch( + () => props.controller.state.activeItem, + () => { + if (tree.value) { + const { items, activeItem } = props.controller.state; + if (activeItem && items.some(item => item.srfkey === activeItem)) { + tree.value.setCurrentKey?.(activeItem); + } else { + tree.value.setCurrentKey?.(null); + } + } + }, + ); + return { ns, searchValue, @@ -106,8 +120,19 @@ export default defineComponent({ expand-on-click-node={false} auto-expand-parent={false} default-expand-all={true} + current-node-key={this.controller.state.activeItem} render-content={this.renderTreeItem} filter-node-method={this.filterTreeNode} + onNodeDrop={( + draggingNode: IData, + dropNode: IData, + dropType: string, + ) => { + this.controller.onNodeDrop(draggingNode, dropNode, dropType); + }} + onCurrentChange={(data: IData, node: IData) => { + this.controller.onNodeSelect(data, node); + }} >