ant-design-vue/components/vc-tree-select/hooks/useCheckedKeys.ts

39 lines
1.4 KiB
TypeScript

import type { Key } from '../../_util/type';
import type { DataEntity } from '../../vc-tree/interface';
import { conductCheck } from '../../vc-tree/utils/conductUtil';
import type { LabeledValueType, RawValueType } from '../TreeSelect';
import type { Ref, ShallowRef } from 'vue';
import { shallowRef, watchEffect } from 'vue';
export default (
rawLabeledValues: ShallowRef<LabeledValueType[]>,
rawHalfCheckedValues: ShallowRef<LabeledValueType[]>,
treeConduction: Ref<boolean>,
keyEntities: Ref<Record<Key, DataEntity>>,
maxLevel: Ref<number>,
levelEntities: ShallowRef<Map<number, Set<DataEntity>>>,
) => {
const newRawCheckedValues = shallowRef<RawValueType[]>([]);
const newRawHalfCheckedValues = shallowRef<RawValueType[]>([]);
watchEffect(() => {
let checkedKeys: RawValueType[] = rawLabeledValues.value.map(({ value }) => value);
let halfCheckedKeys: RawValueType[] = rawHalfCheckedValues.value.map(({ value }) => value);
const missingValues = checkedKeys.filter(key => !keyEntities.value[key]);
if (treeConduction.value) {
({ checkedKeys, halfCheckedKeys } = conductCheck(
checkedKeys,
true,
keyEntities.value,
maxLevel.value,
levelEntities.value,
));
}
newRawCheckedValues.value = Array.from(new Set([...missingValues, ...checkedKeys]));
newRawHalfCheckedValues.value = halfCheckedKeys;
});
return [newRawCheckedValues, newRawHalfCheckedValues];
};