ant-design-vue/components/vc-tree/useMaxLevel.ts
2022-03-20 16:42:00 +08:00

39 lines
1.3 KiB
TypeScript

import type { ShallowRef } from 'vue';
import { shallowRef, ref, watchEffect } from 'vue';
import type { BasicDataNode, DataEntity, DataNode, Key } from './interface';
export default function useMaxLevel<TreeDataType extends BasicDataNode = DataNode>(
keyEntities: ShallowRef<Record<Key, DataEntity<TreeDataType>>>,
) {
const maxLevel = ref(0);
const levelEntities = shallowRef<Map<number, Set<DataEntity<TreeDataType>>>>();
watchEffect(() => {
const newLevelEntities = new Map<number, Set<DataEntity<TreeDataType>>>();
let newMaxLevel = 0;
const keyEntitiesValue = keyEntities.value || {};
// Convert entities by level for calculation
for (const key in keyEntitiesValue) {
if (Object.prototype.hasOwnProperty.call(keyEntitiesValue, key)) {
const entity = keyEntitiesValue[key];
const { level } = entity;
let levelSet: Set<DataEntity<TreeDataType>> = newLevelEntities.get(level);
if (!levelSet) {
levelSet = new Set();
newLevelEntities.set(level, levelSet);
}
levelSet.add(entity);
newMaxLevel = Math.max(newMaxLevel, level);
}
}
maxLevel.value = newMaxLevel;
levelEntities.value = newLevelEntities;
});
return {
maxLevel,
levelEntities,
};
}