import OptionList from './OptionList'; import TreeNode from './TreeNode'; import { formatStrategyValues, SHOW_ALL, SHOW_PARENT, SHOW_CHILD } from './utils/strategyUtil'; import type { CheckedStrategy } from './utils/strategyUtil'; import TreeSelectContext from './TreeSelectContext'; import type { TreeSelectContextProps } from './TreeSelectContext'; import LegacyContext from './LegacyContext'; import useTreeData from './hooks/useTreeData'; import { toArray, fillFieldNames, isNil } from './utils/valueUtil'; import useCache from './hooks/useCache'; import useRefFunc from './hooks/useRefFunc'; import useDataEntities from './hooks/useDataEntities'; import { fillAdditionalInfo, fillLegacyProps } from './utils/legacyUtil'; import useCheckedKeys from './hooks/useCheckedKeys'; import useFilterTreeData from './hooks/useFilterTreeData'; import warningProps from './utils/warningPropsUtil'; import type { Key } from './interface'; import { baseSelectPropsWithoutPrivate } from '../vc-select/BaseSelect'; import { defineComponent } from 'vue'; import type { ExtractPropTypes, PropType } from 'vue'; import omit from '../_util/omit'; import PropTypes from '../_util/vue-types'; import type { SelectProps } from '../vc-select'; export type OnInternalSelect = (value: RawValueType, info: { selected: boolean }) => void; export type RawValueType = string | number; export interface LabeledValueType { key?: Key; value?: RawValueType; label?: any; /** Only works on `treeCheckStrictly` */ halfChecked?: boolean; } export type SelectSource = 'option' | 'selection' | 'input' | 'clear'; export type DraftValueType = RawValueType | LabeledValueType | (RawValueType | LabeledValueType)[]; /** @deprecated This is only used for legacy compatible. Not works on new code. */ export interface LegacyCheckedNode { pos: string; node: any; children?: LegacyCheckedNode[]; } export interface ChangeEventExtra { /** @deprecated Please save prev value by control logic instead */ preValue: LabeledValueType[]; triggerValue: RawValueType; /** @deprecated Use `onSelect` or `onDeselect` instead. */ selected?: boolean; /** @deprecated Use `onSelect` or `onDeselect` instead. */ checked?: boolean; // Not sure if exist user still use this. We have to keep but not recommend user to use /** @deprecated This prop not work as react node anymore. */ triggerNode: any; /** @deprecated This prop not work as react node anymore. */ allCheckedNodes: LegacyCheckedNode[]; } export interface FieldNames { value?: string; label?: string; children?: string; } export interface InternalFieldName extends Omit { _title: string[]; } export interface SimpleModeConfig { id?: Key; pId?: Key; rootPId?: Key; } export interface BaseOptionType { disabled?: boolean; checkable?: boolean; disableCheckbox?: boolean; children?: BaseOptionType[]; [name: string]: any; } export interface DefaultOptionType extends BaseOptionType { value?: RawValueType; title?: any; label?: any; key?: Key; children?: DefaultOptionType[]; } export interface LegacyDataNode extends DefaultOptionType { props: any; } export function treeSelectProps< ValueType = any, OptionType extends BaseOptionType = DefaultOptionType, >() { return { ...omit(baseSelectPropsWithoutPrivate(), ['mode']), prefixCls: String, id: String, value: { type: [String, Number, Object, Array] as PropType }, defaultValue: { type: [String, Number, Object, Array] as PropType }, onChange: { type: Function as PropType< (value: ValueType, labelList: any[], extra: ChangeEventExtra) => void >, }, searchValue: String, /** @deprecated Use `searchValue` instead */ inputValue: String, onSearch: { type: Function as PropType<(value: string) => void> }, autoClearSearchValue: { type: Boolean, default: undefined }, filterTreeNode: { type: [Boolean, Function] as PropType< boolean | ((inputValue: string, treeNode: DefaultOptionType) => boolean) >, default: undefined, }, treeNodeFilterProp: String, // >>> Select onSelect: Function as PropType, onDeselect: Function as PropType, showCheckedStrategy: { type: String as PropType }, treeNodeLabelProp: String, fieldNames: { type: Object as PropType }, // >>> Mode multiple: { type: Boolean, default: undefined }, treeCheckable: { type: Boolean, default: undefined }, treeCheckStrictly: { type: Boolean, default: undefined }, labelInValue: { type: Boolean, default: undefined }, // >>> Data treeData: { type: Array as PropType }, treeDataSimpleMode: { type: [Boolean, Object] as PropType, default: undefined, }, treeLoadedKeys: { type: Array as PropType }, onTreeLoad: { type: Function as PropType<(loadedKeys: Key[]) => void> }, // >>> Options virtual: { type: Boolean, default: undefined }, listHeight: Number, listItemHeight: Number, onDropdownVisibleChange: { type: Function as PropType<(open: boolean) => void> }, // >>> Tree treeLine: { type: Boolean, default: undefined }, treeIcon: PropTypes.any, showTreeIcon: { type: Boolean, default: undefined }, switcherIcon: PropTypes.any, treeMotion: PropTypes.any, // showArrow: { type: Boolean, default: undefined }, // showSearch: { type: Boolean, default: undefined }, // open: { type: Boolean, default: undefined }, // defaultOpen: { type: Boolean, default: undefined }, // disabled: { type: Boolean, default: undefined }, // placeholder: PropTypes.any, // maxTagPlaceholder: { type: Function as PropType<(omittedValues: LabelValueType[]) => any> }, // loadData: { type: Function as PropType<(dataNode: LegacyDataNode) => Promise> }, // treeExpandedKeys: { type: Array as PropType }, // treeDefaultExpandedKeys: { type: Array as PropType }, // treeDefaultExpandAll: { type: Boolean, default: undefined }, // children: Array, // dropdownPopupAlign: PropTypes.any, // // Event // onTreeExpand: { type: Function as PropType<(expandedKeys: Key[]) => void> }, }; } export type TreeSelectProps = Partial>>; function isRawValue(value: RawValueType | LabeledValueType): value is RawValueType { return !value || typeof value !== 'object'; } export default defineComponent({ name: 'TreeSelect', inheritAttrs: false, props: treeSelectProps(), setup() { return () => { return null; }; }, });