UNPKG

6.76 kBTypeScriptView Raw
1/**
2 * To match accessibility requirement, we always provide an input in the component.
3 * Other element will not set `tabIndex` to avoid `onBlur` sequence problem.
4 * For focused select, we set `aria-live="polite"` to update the accessibility content.
5 *
6 * ref:
7 * - keyboard: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#Keyboard_interactions
8 */
9import * as React from 'react';
10import type { ScrollTo } from 'rc-virtual-list/lib/List';
11import type { RenderNode, Mode, RenderDOMFunc, FieldNames } from './interface';
12import type { GetLabeledValue, FilterOptions, FilterFunc, DefaultValueType, RawValueType, LabelValueType, Key, FlattenOptionsType, SingleType, OnClear, SelectSource, CustomTagProps } from './interface/generator';
13import type { OptionListProps, RefOptionListProps } from './OptionList';
14export interface RefSelectProps {
15 focus: () => void;
16 blur: () => void;
17 scrollTo?: ScrollTo;
18}
19export declare type Placement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';
20export interface SelectProps<OptionsType extends object[], ValueType> extends React.AriaAttributes {
21 prefixCls?: string;
22 id?: string;
23 className?: string;
24 style?: React.CSSProperties;
25 options?: OptionsType;
26 children?: React.ReactNode;
27 mode?: Mode;
28 value?: ValueType;
29 defaultValue?: ValueType;
30 labelInValue?: boolean;
31 /** Config max length of input. This is only work when `mode` is `combobox` */
32 maxLength?: number;
33 fieldNames?: FieldNames;
34 inputValue?: string;
35 searchValue?: string;
36 optionFilterProp?: string;
37 /**
38 * In Select, `false` means do nothing.
39 * In TreeSelect, `false` will highlight match item.
40 * It's by design.
41 */
42 filterOption?: boolean | FilterFunc<OptionsType[number]>;
43 filterSort?: (optionA: OptionsType[number], optionB: OptionsType[number]) => number;
44 showSearch?: boolean;
45 autoClearSearchValue?: boolean;
46 onSearch?: (value: string) => void;
47 onClear?: OnClear;
48 allowClear?: boolean;
49 clearIcon?: React.ReactNode;
50 showArrow?: boolean;
51 inputIcon?: RenderNode;
52 removeIcon?: React.ReactNode;
53 menuItemSelectedIcon?: RenderNode;
54 open?: boolean;
55 defaultOpen?: boolean;
56 listHeight?: number;
57 listItemHeight?: number;
58 dropdownStyle?: React.CSSProperties;
59 dropdownClassName?: string;
60 dropdownMatchSelectWidth?: boolean | number;
61 placement?: Placement;
62 virtual?: boolean;
63 dropdownRender?: (menu: React.ReactElement) => React.ReactElement;
64 dropdownAlign?: any;
65 animation?: string;
66 transitionName?: string;
67 getPopupContainer?: RenderDOMFunc;
68 direction?: 'ltr' | 'rtl';
69 disabled?: boolean;
70 loading?: boolean;
71 autoFocus?: boolean;
72 defaultActiveFirstOption?: boolean;
73 notFoundContent?: React.ReactNode;
74 placeholder?: React.ReactNode;
75 backfill?: boolean;
76 /** @private Internal usage. Do not use in your production. */
77 getInputElement?: () => JSX.Element;
78 /** @private Internal usage. Do not use in your production. */
79 getRawInputElement?: () => JSX.Element;
80 optionLabelProp?: string;
81 maxTagTextLength?: number;
82 maxTagCount?: number | 'responsive';
83 maxTagPlaceholder?: React.ReactNode | ((omittedValues: LabelValueType[]) => React.ReactNode);
84 tokenSeparators?: string[];
85 tagRender?: (props: CustomTagProps) => React.ReactElement;
86 showAction?: ('focus' | 'click')[];
87 tabIndex?: number;
88 onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;
89 onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
90 onPopupScroll?: React.UIEventHandler<HTMLDivElement>;
91 onDropdownVisibleChange?: (open: boolean) => void;
92 onSelect?: (value: SingleType<ValueType>, option: OptionsType[number]) => void;
93 onDeselect?: (value: SingleType<ValueType>, option: OptionsType[number]) => void;
94 onInputKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
95 onClick?: React.MouseEventHandler;
96 onChange?: (value: ValueType, option: OptionsType[number] | OptionsType) => void;
97 onBlur?: React.FocusEventHandler<HTMLElement>;
98 onFocus?: React.FocusEventHandler<HTMLElement>;
99 onMouseDown?: React.MouseEventHandler<HTMLDivElement>;
100 onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
101 onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;
102 choiceTransitionName?: string;
103 /**
104 * Only used in current version for internal event process.
105 * Do not use in production environment.
106 */
107 internalProps?: {
108 mark?: string;
109 onClear?: OnClear;
110 skipTriggerChange?: boolean;
111 skipTriggerSelect?: boolean;
112 onRawSelect?: (value: RawValueType, option: OptionsType[number], source: SelectSource) => void;
113 onRawDeselect?: (value: RawValueType, option: OptionsType[number], source: SelectSource) => void;
114 };
115}
116export interface GenerateConfig<OptionsType extends object[]> {
117 prefixCls: string;
118 components: {
119 optionList: React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<OptionListProps<OptionsType>, 'options'> & {
120 options: OptionsType;
121 }> & React.RefAttributes<RefOptionListProps>>;
122 };
123 /** Convert jsx tree into `OptionsType` */
124 convertChildrenToData: (children: React.ReactNode) => OptionsType;
125 /** Flatten nest options into raw option list */
126 flattenOptions: (options: OptionsType, props: any) => FlattenOptionsType<OptionsType>;
127 /** Convert single raw value into { label, value } format. Will be called by each value */
128 getLabeledValue: GetLabeledValue<FlattenOptionsType<OptionsType>>;
129 filterOptions: FilterOptions<OptionsType>;
130 findValueOption: ((values: RawValueType[], options: FlattenOptionsType<OptionsType>) => OptionsType) | ((values: RawValueType[], options: FlattenOptionsType<OptionsType>, info?: {
131 prevValueOptions?: OptionsType[];
132 props?: any;
133 }) => OptionsType);
134 /** Check if a value is disabled */
135 isValueDisabled: (value: RawValueType, options: FlattenOptionsType<OptionsType>) => boolean;
136 warningProps?: (props: any) => void;
137 fillOptionsWithMissingValue?: (options: OptionsType, value: DefaultValueType, optionLabelProp: string, labelInValue: boolean) => OptionsType;
138 omitDOMProps?: (props: object) => object;
139}
140/**
141 * This function is in internal usage.
142 * Do not use it in your prod env since we may refactor this.
143 */
144export default function generateSelector<OptionsType extends {
145 value?: RawValueType;
146 label?: React.ReactNode;
147 key?: Key;
148 disabled?: boolean;
149}[]>(config: GenerateConfig<OptionsType>): React.ForwardRefExoticComponent<SelectProps<OptionsType, DefaultValueType> & React.RefAttributes<RefSelectProps>>;