diff --git a/CHANGELOG.md b/CHANGELOG.md index 22809a911ca5d4931ef18dfbc03e13f979d8dfcd..5a6fbadcf14742c009ba3caf57e028c171261fba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ - 图表新增内置导航功能 - 新增部件参数batchtoolbarmode、全局参数batchToolbarMode,用于设置批操作工具栏显示模式(default 选数据即显示,multiple 需选 2 条以上),仅限卡片、列表、表格、树表格使用 - 新增列表部件样式-扩展视图3:仅非分组列表和分组样式2列表支持,实现列表的从下往上的绘制,同时滚动加载也支持上滚加载 +- 新增数据多项选择视图,数据多项选择视图(左右关系)视图参数checkstrictly(是否严格的遵循穿梭空左右互相关联) + +### Fixed + +- 修复树选中异常 ## [0.7.41-alpha.24] - 2025-09-04 diff --git a/src/control/tree/tree.tsx b/src/control/tree/tree.tsx index 9513aa6017565b4e354edfd1d6d6d7377a3754bc..a1d32e617b43a10a9a2757dd2087e2af31869cd0 100644 --- a/src/control/tree/tree.tsx +++ b/src/control/tree/tree.tsx @@ -110,7 +110,7 @@ export const TreeControl = defineComponent({ data: { type: Array, required: false }, }, setup(props) { - const c = useControlController( + const c: TreeController = useControlController( (...args) => new TreeController(...args), ); @@ -205,6 +205,17 @@ export const TreeControl = defineComponent({ }, ); + c.evt.on('onSelectionChange', async () => { + if (!treeRef.value) return; + if (c.state.singleSelect) { + treeRef.value.setCurrentKey(c.state.selectedData[0]?._id); + } else { + treeRef.value.setCheckedKeys( + c.state.selectedData.map(item => item._id), + ); + } + }); + /** * 编辑当前节点的文本 * @author lxm diff --git a/src/view-engine/mpickup-view-engine.ts b/src/view-engine/mpickup-view-engine.ts index 7618f0b0917677da6e99ced39437deb0d003e7b2..0745a58105c238aea881a01fdc0729ea74a9a7cd 100644 --- a/src/view-engine/mpickup-view-engine.ts +++ b/src/view-engine/mpickup-view-engine.ts @@ -26,6 +26,13 @@ export class MPickupViewEngine extends PickupViewEngine { IMPickupViewEvent >; + /** + * @description 是否严格的遵循穿梭空左右互相关联 + * @type {boolean} + * @memberof MPickupViewEngine + */ + checkStrictly: boolean = true; + /** * 简单列表控制器 * @@ -67,6 +74,12 @@ export class MPickupViewEngine extends PickupViewEngine { this.view.slotProps.simplelist.isSimple = true; this.view.slotProps.simplelist.singleSelect = false; this.view.slotProps.pickupviewpanel.singleSelect = false; + if (this.view.params.checkstrictly) { + this.checkStrictly = + this.view.params.checkstrictly === 'true' || + this.view.params.checkstrictly === true; + delete this.view.params.checkstrictly; + } } /** @@ -167,14 +180,22 @@ export class MPickupViewEngine extends PickupViewEngine { * @memberof MPickupViewEngine */ protected async handlePushSimpleListItems(data: IData[]): Promise { - // 每次添加的都是多数据部件当前页数据,因此需先将原来简单列表的当前页数据过滤掉 - const items = await this.pickupViewPanel.getAllData(); - // 过滤出非当前页数据 - const selectItems = this.simpleList - .getAllData() - .filter(selected => !items.some(item => item.srfkey === selected.srfkey)); - // 将多数据部件当前页数据加入简单列表选中 - selectItems.push(...data); + let selectItems: IData[] = []; + if (this.checkStrictly) { + // 每次添加的都是多数据部件当前页数据,因此需先将原来简单列表的当前页数据过滤掉 + const items = await this.pickupViewPanel.getAllData(); + // 过滤出非当前页数据 + selectItems = this.simpleList + .getAllData() + .filter( + selected => !items.some(item => item.srfkey === selected.srfkey), + ); + // 将多数据部件当前页数据加入简单列表选中 + selectItems.push(...data); + } else { + const allData = this.simpleList.getAllData(); + selectItems = [...allData, ...data]; + } // 去重items const uniqueItems = this.handleUniqueItems(selectItems); this.setSelectedData(uniqueItems); @@ -245,7 +266,8 @@ export class MPickupViewEngine extends PickupViewEngine { * @memberof MPickupViewEngine */ protected setSelectedData(items: IData[]): void { - super.setSelectedData(items); + // 严格检查模式时需同步穿梭框左右的选中数据 + if (this.checkStrictly) super.setSelectedData(items); this.simpleList.setData(items); } diff --git a/src/view-engine/tree-view.engine.ts b/src/view-engine/tree-view.engine.ts index 652e7d93803ae92a8e8cbe77c31ec940d30ca314..018e5713acb4116a44202fad5aebb39e8d83b278 100644 --- a/src/view-engine/tree-view.engine.ts +++ b/src/view-engine/tree-view.engine.ts @@ -22,9 +22,13 @@ export class TreeViewEngine extends MDViewEngine { async onCreated(): Promise { await super.onCreated(); + const { model } = this.view; if (!this.view.slotProps.tree) { this.view.slotProps.tree = {}; } + this.view.slotProps.tree.mdctrlActiveMode = ( + model as IData + ).mdctrlActiveMode!; } get tree(): ITreeController {