@aplus-frontend/antdv
Version:
Vue basic component library maintained based on ant-design-vue
542 lines (541 loc) • 18.2 kB
TypeScript
/**
* To match accessibility requirement, we always provide an input in the component.
* Other element will not set `tabindex` to avoid `onBlur` sequence problem.
* For focused select, we set `aria-live="polite"` to update the accessibility content.
*
* ref:
* - keyboard: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#Keyboard_interactions
*
* New api:
* - listHeight
* - listItemHeight
* - component
*
* Remove deprecated api:
* - multiple
* - tags
* - combobox
* - firstActiveValue
* - dropdownMenuStyle
* - openClassName (Not list in api)
*
* Update:
* - `backfill` only support `combobox` mode
* - `combobox` mode not support `labelInValue` since it's meaningless
* - `getInputElement` only support `combobox` mode
* - `onChange` return OptionData instead of ReactNode
* - `filterOption` `onChange` `onSelect` accept OptionData instead of ReactNode
* - `combobox` mode trigger `onChange` will get `undefined` if no `value` match in Option
* - `combobox` mode not support `optionLabelProp`
*/
import type { DisplayValueType } from './BaseSelect';
import type { Key, VueNode } from '../_util/type';
import type { ExtractPropTypes, PropType } from 'vue';
type ArrayElementType<T> = T extends (infer E)[] ? E : T;
export type OnActiveValue = (active: RawValueType, index: number, info?: {
source?: 'keyboard' | 'mouse';
}) => void;
export type OnInternalSelect = (value: RawValueType, info: {
selected: boolean;
}) => void;
export type RawValueType = string | number;
export interface LabelInValueType {
label: any;
originLabel?: any;
value: RawValueType;
/** @deprecated `key` is useless since it should always same as `value` */
key?: Key;
}
export type DraftValueType = RawValueType | LabelInValueType | DisplayValueType | (RawValueType | LabelInValueType | DisplayValueType)[];
export type FilterFunc<OptionType> = (inputValue: string, option?: OptionType) => boolean;
export interface FieldNames {
value?: string;
label?: string;
options?: string;
}
export interface BaseOptionType {
disabled?: boolean;
[name: string]: any;
}
export interface DefaultOptionType extends BaseOptionType {
label?: any;
value?: string | number | null;
children?: Omit<DefaultOptionType, 'children'>[];
}
export type SelectHandler<ValueType = any, OptionType extends BaseOptionType = DefaultOptionType> = ((value: RawValueType | LabelInValueType, option: OptionType) => void) | ((value: ValueType, option: OptionType) => void);
export declare function selectProps<ValueType = any, OptionType extends BaseOptionType = DefaultOptionType>(): {
prefixCls: StringConstructor;
id: StringConstructor;
backfill: {
type: BooleanConstructor;
default: any;
};
fieldNames: PropType<FieldNames>;
/** @deprecated Use `searchValue` instead */
inputValue: StringConstructor;
searchValue: StringConstructor;
onSearch: PropType<(value: string) => void>;
autoClearSearchValue: {
type: BooleanConstructor;
default: any;
};
onSelect: PropType<SelectHandler<ArrayElementType<ValueType>, OptionType>>;
onDeselect: PropType<SelectHandler<ArrayElementType<ValueType>, OptionType>>;
/**
* In Select, `false` means do nothing.
* In TreeSelect, `false` will highlight match item.
* It's by design.
*/
filterOption: {
type: PropType<boolean | FilterFunc<OptionType>>;
default: any;
};
filterSort: PropType<(optionA: OptionType, optionB: OptionType) => number>;
optionFilterProp: StringConstructor;
optionLabelProp: StringConstructor;
options: PropType<OptionType[]>;
defaultActiveFirstOption: {
type: BooleanConstructor;
default: any;
};
virtual: {
type: BooleanConstructor;
default: any;
};
listHeight: NumberConstructor;
listItemHeight: NumberConstructor;
onClickOption: PropType<(e: MouseEvent, value: ValueType, selected: boolean) => boolean | Promise<boolean>>;
menuItemSelectedIcon: import("vue-types").VueTypeValidableDef<any>;
mode: PropType<"multiple" | "tags" | "combobox">;
labelInValue: {
type: BooleanConstructor;
default: any;
};
value: import("vue-types").VueTypeValidableDef<any>;
defaultValue: import("vue-types").VueTypeValidableDef<any>;
onChange: PropType<(value: ValueType, option: OptionType | OptionType[]) => void>;
children: PropType<VueNode[]>;
showSearch: {
type: BooleanConstructor;
default: any;
};
tagRender: {
type: PropType<(props: import("./BaseSelect").CustomTagProps) => any>;
};
optionLabelRender: {
type: PropType<(option: Record<string, any>) => any>;
};
direction: {
type: PropType<"rtl" | "ltr">;
};
tabindex: NumberConstructor;
autofocus: BooleanConstructor;
notFoundContent: import("vue-types").VueTypeValidableDef<any>;
placeholder: import("vue-types").VueTypeValidableDef<any>;
onClear: PropType<() => void>;
choiceTransitionName: StringConstructor;
disabled: {
type: BooleanConstructor;
default: any;
};
loading: {
type: BooleanConstructor;
default: any;
};
open: {
type: BooleanConstructor;
default: any;
};
defaultOpen: {
type: BooleanConstructor;
default: any;
};
onDropdownVisibleChange: {
type: PropType<(open: boolean) => void>;
};
getInputElement: {
type: PropType<() => any>;
};
getRawInputElement: {
type: PropType<() => any>;
};
maxTagTextLength: NumberConstructor;
maxTagCount: {
type: PropType<number | "responsive">;
};
maxTagPlaceholder: import("vue-types").VueTypeValidableDef<any>;
tokenSeparators: {
type: PropType<string[]>;
};
allowClear: {
type: BooleanConstructor;
default: any;
};
showArrow: {
type: BooleanConstructor;
default: any;
};
inputIcon: import("vue-types").VueTypeValidableDef<any>;
clearIcon: import("vue-types").VueTypeValidableDef<any>;
removeIcon: import("vue-types").VueTypeValidableDef<any>;
animation: StringConstructor;
transitionName: StringConstructor;
dropdownStyle: {
type: PropType<import("vue").CSSProperties>;
};
dropdownClassName: StringConstructor;
dropdownMatchSelectWidth: {
type: PropType<number | boolean>;
default: any;
};
dropdownRender: {
type: PropType<import("./BaseSelect").DropdownRender>;
};
dropdownAlign: PropType<import("../vc-trigger/interface").AlignType>;
placement: {
type: PropType<import("./BaseSelect").Placement>;
};
getPopupContainer: {
type: PropType<import("./BaseSelect").RenderDOMFunc>;
};
showAction: {
type: PropType<("click" | "focus")[]>;
};
onBlur: {
type: PropType<(e: FocusEvent) => void>;
};
onFocus: {
type: PropType<(e: FocusEvent) => void>;
};
onKeyup: PropType<(e: KeyboardEvent) => void>;
onKeydown: PropType<(e: KeyboardEvent) => void>;
onMousedown: PropType<(e: MouseEvent) => void>;
onPopupScroll: PropType<(e: UIEvent) => void>;
onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
onMouseenter: PropType<(e: MouseEvent) => void>;
onMouseleave: PropType<(e: MouseEvent) => void>;
onClick: PropType<(e: MouseEvent) => void>;
};
export type SelectProps = Partial<ExtractPropTypes<ReturnType<typeof selectProps>>>;
declare const _default: import("vue").DefineComponent<ExtractPropTypes<{
prefixCls: StringConstructor;
id: StringConstructor;
backfill: {
type: BooleanConstructor;
default: any;
};
fieldNames: PropType<FieldNames>;
/** @deprecated Use `searchValue` instead */
inputValue: StringConstructor;
searchValue: StringConstructor;
onSearch: PropType<(value: string) => void>;
autoClearSearchValue: {
type: BooleanConstructor;
default: any;
};
onSelect: PropType<SelectHandler<any, DefaultOptionType>>;
onDeselect: PropType<SelectHandler<any, DefaultOptionType>>;
/**
* In Select, `false` means do nothing.
* In TreeSelect, `false` will highlight match item.
* It's by design.
*/
filterOption: {
type: PropType<boolean | FilterFunc<DefaultOptionType>>;
default: any;
};
filterSort: PropType<(optionA: DefaultOptionType, optionB: DefaultOptionType) => number>;
optionFilterProp: StringConstructor;
optionLabelProp: StringConstructor;
options: PropType<DefaultOptionType[]>;
defaultActiveFirstOption: {
type: BooleanConstructor;
default: any;
};
virtual: {
type: BooleanConstructor;
default: any;
};
listHeight: NumberConstructor;
listItemHeight: NumberConstructor;
onClickOption: PropType<(e: MouseEvent, value: any, selected: boolean) => boolean | Promise<boolean>>;
menuItemSelectedIcon: import("vue-types").VueTypeValidableDef<any>;
mode: PropType<"multiple" | "tags" | "combobox">;
labelInValue: {
type: BooleanConstructor;
default: any;
};
value: import("vue-types").VueTypeValidableDef<any>;
defaultValue: import("vue-types").VueTypeValidableDef<any>;
onChange: PropType<(value: any, option: DefaultOptionType | DefaultOptionType[]) => void>;
children: PropType<VueNode[]>;
showSearch: {
type: BooleanConstructor;
default: any;
};
tagRender: {
type: PropType<(props: import("./BaseSelect").CustomTagProps) => any>;
};
optionLabelRender: {
type: PropType<(option: Record<string, any>) => any>;
};
direction: {
type: PropType<"rtl" | "ltr">;
};
tabindex: NumberConstructor;
autofocus: BooleanConstructor;
notFoundContent: import("vue-types").VueTypeValidableDef<any>;
placeholder: import("vue-types").VueTypeValidableDef<any>;
onClear: PropType<() => void>;
choiceTransitionName: StringConstructor;
disabled: {
type: BooleanConstructor;
default: any;
};
loading: {
type: BooleanConstructor;
default: any;
};
open: {
type: BooleanConstructor;
default: any;
};
defaultOpen: {
type: BooleanConstructor;
default: any;
};
onDropdownVisibleChange: {
type: PropType<(open: boolean) => void>;
};
getInputElement: {
type: PropType<() => any>;
};
getRawInputElement: {
type: PropType<() => any>;
};
maxTagTextLength: NumberConstructor;
maxTagCount: {
type: PropType<number | "responsive">;
};
maxTagPlaceholder: import("vue-types").VueTypeValidableDef<any>;
tokenSeparators: {
type: PropType<string[]>;
};
allowClear: {
type: BooleanConstructor;
default: any;
};
showArrow: {
type: BooleanConstructor;
default: any;
};
inputIcon: import("vue-types").VueTypeValidableDef<any>;
clearIcon: import("vue-types").VueTypeValidableDef<any>;
removeIcon: import("vue-types").VueTypeValidableDef<any>;
animation: StringConstructor;
transitionName: StringConstructor;
dropdownStyle: {
type: PropType<import("vue").CSSProperties>;
};
dropdownClassName: StringConstructor;
dropdownMatchSelectWidth: {
type: PropType<number | boolean>;
default: any;
};
dropdownRender: {
type: PropType<import("./BaseSelect").DropdownRender>;
};
dropdownAlign: PropType<import("../vc-trigger/interface").AlignType>;
placement: {
type: PropType<import("./BaseSelect").Placement>;
};
getPopupContainer: {
type: PropType<import("./BaseSelect").RenderDOMFunc>;
};
showAction: {
type: PropType<("click" | "focus")[]>;
};
onBlur: {
type: PropType<(e: FocusEvent) => void>;
};
onFocus: {
type: PropType<(e: FocusEvent) => void>;
};
onKeyup: PropType<(e: KeyboardEvent) => void>;
onKeydown: PropType<(e: KeyboardEvent) => void>;
onMousedown: PropType<(e: MouseEvent) => void>;
onPopupScroll: PropType<(e: UIEvent) => void>;
onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
onMouseenter: PropType<(e: MouseEvent) => void>;
onMouseleave: PropType<(e: MouseEvent) => void>;
onClick: PropType<(e: MouseEvent) => void>;
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ExtractPropTypes<{
prefixCls: StringConstructor;
id: StringConstructor;
backfill: {
type: BooleanConstructor;
default: any;
};
fieldNames: PropType<FieldNames>;
/** @deprecated Use `searchValue` instead */
inputValue: StringConstructor;
searchValue: StringConstructor;
onSearch: PropType<(value: string) => void>;
autoClearSearchValue: {
type: BooleanConstructor;
default: any;
};
onSelect: PropType<SelectHandler<any, DefaultOptionType>>;
onDeselect: PropType<SelectHandler<any, DefaultOptionType>>;
/**
* In Select, `false` means do nothing.
* In TreeSelect, `false` will highlight match item.
* It's by design.
*/
filterOption: {
type: PropType<boolean | FilterFunc<DefaultOptionType>>;
default: any;
};
filterSort: PropType<(optionA: DefaultOptionType, optionB: DefaultOptionType) => number>;
optionFilterProp: StringConstructor;
optionLabelProp: StringConstructor;
options: PropType<DefaultOptionType[]>;
defaultActiveFirstOption: {
type: BooleanConstructor;
default: any;
};
virtual: {
type: BooleanConstructor;
default: any;
};
listHeight: NumberConstructor;
listItemHeight: NumberConstructor;
onClickOption: PropType<(e: MouseEvent, value: any, selected: boolean) => boolean | Promise<boolean>>;
menuItemSelectedIcon: import("vue-types").VueTypeValidableDef<any>;
mode: PropType<"multiple" | "tags" | "combobox">;
labelInValue: {
type: BooleanConstructor;
default: any;
};
value: import("vue-types").VueTypeValidableDef<any>;
defaultValue: import("vue-types").VueTypeValidableDef<any>;
onChange: PropType<(value: any, option: DefaultOptionType | DefaultOptionType[]) => void>;
children: PropType<VueNode[]>;
showSearch: {
type: BooleanConstructor;
default: any;
};
tagRender: {
type: PropType<(props: import("./BaseSelect").CustomTagProps) => any>;
};
optionLabelRender: {
type: PropType<(option: Record<string, any>) => any>;
};
direction: {
type: PropType<"rtl" | "ltr">;
};
tabindex: NumberConstructor;
autofocus: BooleanConstructor;
notFoundContent: import("vue-types").VueTypeValidableDef<any>;
placeholder: import("vue-types").VueTypeValidableDef<any>;
onClear: PropType<() => void>;
choiceTransitionName: StringConstructor;
disabled: {
type: BooleanConstructor;
default: any;
};
loading: {
type: BooleanConstructor;
default: any;
};
open: {
type: BooleanConstructor;
default: any;
};
defaultOpen: {
type: BooleanConstructor;
default: any;
};
onDropdownVisibleChange: {
type: PropType<(open: boolean) => void>;
};
getInputElement: {
type: PropType<() => any>;
};
getRawInputElement: {
type: PropType<() => any>;
};
maxTagTextLength: NumberConstructor;
maxTagCount: {
type: PropType<number | "responsive">;
};
maxTagPlaceholder: import("vue-types").VueTypeValidableDef<any>;
tokenSeparators: {
type: PropType<string[]>;
};
allowClear: {
type: BooleanConstructor;
default: any;
};
showArrow: {
type: BooleanConstructor;
default: any;
};
inputIcon: import("vue-types").VueTypeValidableDef<any>;
clearIcon: import("vue-types").VueTypeValidableDef<any>;
removeIcon: import("vue-types").VueTypeValidableDef<any>;
animation: StringConstructor;
transitionName: StringConstructor;
dropdownStyle: {
type: PropType<import("vue").CSSProperties>;
};
dropdownClassName: StringConstructor;
dropdownMatchSelectWidth: {
type: PropType<number | boolean>;
default: any;
};
dropdownRender: {
type: PropType<import("./BaseSelect").DropdownRender>;
};
dropdownAlign: PropType<import("../vc-trigger/interface").AlignType>;
placement: {
type: PropType<import("./BaseSelect").Placement>;
};
getPopupContainer: {
type: PropType<import("./BaseSelect").RenderDOMFunc>;
};
showAction: {
type: PropType<("click" | "focus")[]>;
};
onBlur: {
type: PropType<(e: FocusEvent) => void>;
};
onFocus: {
type: PropType<(e: FocusEvent) => void>;
};
onKeyup: PropType<(e: KeyboardEvent) => void>;
onKeydown: PropType<(e: KeyboardEvent) => void>;
onMousedown: PropType<(e: MouseEvent) => void>;
onPopupScroll: PropType<(e: UIEvent) => void>;
onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
onMouseenter: PropType<(e: MouseEvent) => void>;
onMouseleave: PropType<(e: MouseEvent) => void>;
onClick: PropType<(e: MouseEvent) => void>;
}>> & Readonly<{}>, {
open: boolean;
disabled: boolean;
autofocus: boolean;
virtual: boolean;
dropdownMatchSelectWidth: number | boolean;
loading: boolean;
allowClear: boolean;
showSearch: boolean;
defaultOpen: boolean;
showArrow: boolean;
backfill: boolean;
autoClearSearchValue: boolean;
filterOption: boolean | FilterFunc<DefaultOptionType>;
defaultActiveFirstOption: boolean;
labelInValue: boolean;
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
export default _default;