61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
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;
|
|
}
|