ant-design-vue/components/vc-cascader/utils/treeUtil.ts

61 lines
1.8 KiB
TypeScript
Raw Normal View History

import type { Key } from '../../_util/type';
import type {
SingleValueType,
DefaultOptionType,
InternalFieldNames,
ShowCheckedStrategy,
} from '../Cascader';
import type { OptionsInfo } from '../hooks/useEntities';
import { SHOW_CHILD } from './commonUtil';
export function formatStrategyValues(
pathKeys: Key[],
keyPathEntities: OptionsInfo['pathKeyEntities'],
showCheckedStrategy: ShowCheckedStrategy,
) {
const valueSet = new Set(pathKeys);
return pathKeys.filter(key => {
const entity = keyPathEntities[key];
const parent = entity ? entity.parent : null;
const children = entity ? entity.children : null;
return showCheckedStrategy === SHOW_CHILD
? !(children && children.some(child => child.key && valueSet.has(child.key)))
: !(parent && !parent.node.disabled && valueSet.has(parent.key));
});
}
export function toPathOptions(
valueCells: SingleValueType,
options: DefaultOptionType[],
fieldNames: InternalFieldNames,
// Used for loadingKeys which saved loaded keys as string
stringMode = false,
) {
let currentList = options;
const valueOptions: {
value: SingleValueType[number];
index: number;
option: DefaultOptionType;
}[] = [];
for (let i = 0; i < valueCells.length; i += 1) {
const valueCell = valueCells[i];
const foundIndex = currentList?.findIndex(option => {
const val = option[fieldNames.value];
return stringMode ? String(val) === String(valueCell) : val === valueCell;
});
const foundOption = foundIndex !== -1 ? currentList?.[foundIndex] : null;
valueOptions.push({
value: foundOption?.[fieldNames.value] ?? valueCell,
index: foundIndex,
option: foundOption,
});
currentList = foundOption?.[fieldNames.children];
}
return valueOptions;
}