UNPKG

6.09 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 { RenderNode, Mode, RenderDOMFunc } from './interface';
11import { GetLabeledValue, FilterOptions, FilterFunc, DefaultValueType, RawValueType, LabelValueType, Key, FlattenOptionsType, SingleType, OnClear, SelectSource, CustomTagProps } from './interface/generator';
12import { OptionListProps, RefOptionListProps } from './OptionList';
13export interface RefSelectProps {
14 focus: () => void;
15 blur: () => void;
16}
17export interface SelectProps<OptionsType extends object[], ValueType> extends React.AriaAttributes {
18 prefixCls?: string;
19 id?: string;
20 className?: string;
21 style?: React.CSSProperties;
22 options?: OptionsType;
23 children?: React.ReactNode;
24 mode?: Mode;
25 value?: ValueType;
26 defaultValue?: ValueType;
27 labelInValue?: boolean;
28 inputValue?: string;
29 searchValue?: string;
30 optionFilterProp?: string;
31 /**
32 * In Select, `false` means do nothing.
33 * In TreeSelect, `false` will highlight match item.
34 * It's by design.
35 */
36 filterOption?: boolean | FilterFunc<OptionsType[number]>;
37 showSearch?: boolean;
38 autoClearSearchValue?: boolean;
39 onSearch?: (value: string) => void;
40 onClear?: OnClear;
41 allowClear?: boolean;
42 clearIcon?: React.ReactNode;
43 showArrow?: boolean;
44 inputIcon?: RenderNode;
45 removeIcon?: React.ReactNode;
46 menuItemSelectedIcon?: RenderNode;
47 open?: boolean;
48 defaultOpen?: boolean;
49 listHeight?: number;
50 listItemHeight?: number;
51 dropdownStyle?: React.CSSProperties;
52 dropdownClassName?: string;
53 dropdownMatchSelectWidth?: boolean | number;
54 virtual?: boolean;
55 dropdownRender?: (menu: React.ReactElement) => React.ReactElement;
56 dropdownAlign?: any;
57 animation?: string;
58 transitionName?: string;
59 getPopupContainer?: RenderDOMFunc;
60 direction?: string;
61 disabled?: boolean;
62 loading?: boolean;
63 autoFocus?: boolean;
64 defaultActiveFirstOption?: boolean;
65 notFoundContent?: React.ReactNode;
66 placeholder?: React.ReactNode;
67 backfill?: boolean;
68 getInputElement?: () => JSX.Element;
69 optionLabelProp?: string;
70 maxTagTextLength?: number;
71 maxTagCount?: number;
72 maxTagPlaceholder?: React.ReactNode | ((omittedValues: LabelValueType[]) => React.ReactNode);
73 tokenSeparators?: string[];
74 tagRender?: (props: CustomTagProps) => React.ReactElement;
75 showAction?: ('focus' | 'click')[];
76 tabIndex?: number;
77 onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;
78 onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
79 onPopupScroll?: React.UIEventHandler<HTMLDivElement>;
80 onDropdownVisibleChange?: (open: boolean) => void;
81 onSelect?: (value: SingleType<ValueType>, option: OptionsType[number]) => void;
82 onDeselect?: (value: SingleType<ValueType>, option: OptionsType[number]) => void;
83 onInputKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
84 onClick?: React.MouseEventHandler;
85 onChange?: (value: ValueType, option: OptionsType[number] | OptionsType) => void;
86 onBlur?: React.FocusEventHandler<HTMLElement>;
87 onFocus?: React.FocusEventHandler<HTMLElement>;
88 onMouseDown?: React.MouseEventHandler<HTMLDivElement>;
89 onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
90 onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;
91 choiceTransitionName?: string;
92 /**
93 * Only used in current version for internal event process.
94 * Do not use in production environment.
95 */
96 internalProps?: {
97 mark?: string;
98 onClear?: OnClear;
99 skipTriggerChange?: boolean;
100 skipTriggerSelect?: boolean;
101 onRawSelect?: (value: RawValueType, option: OptionsType[number], source: SelectSource) => void;
102 onRawDeselect?: (value: RawValueType, option: OptionsType[number], source: SelectSource) => void;
103 };
104}
105export interface GenerateConfig<OptionsType extends object[]> {
106 prefixCls: string;
107 components: {
108 optionList: React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<OptionListProps<OptionsType>, 'options'> & {
109 options: OptionsType;
110 }> & React.RefAttributes<RefOptionListProps>>;
111 };
112 /** Convert jsx tree into `OptionsType` */
113 convertChildrenToData: (children: React.ReactNode) => OptionsType;
114 /** Flatten nest options into raw option list */
115 flattenOptions: (options: OptionsType, props: any) => FlattenOptionsType<OptionsType>;
116 /** Convert single raw value into { label, value } format. Will be called by each value */
117 getLabeledValue: GetLabeledValue<FlattenOptionsType<OptionsType>>;
118 filterOptions: FilterOptions<OptionsType>;
119 findValueOption: ((values: RawValueType[], options: FlattenOptionsType<OptionsType>) => OptionsType) | ((values: RawValueType[], options: FlattenOptionsType<OptionsType>, info?: {
120 prevValueOptions?: OptionsType[];
121 }) => OptionsType);
122 /** Check if a value is disabled */
123 isValueDisabled: (value: RawValueType, options: FlattenOptionsType<OptionsType>) => boolean;
124 warningProps?: (props: any) => void;
125 fillOptionsWithMissingValue?: (options: OptionsType, value: DefaultValueType, optionLabelProp: string, labelInValue: boolean) => OptionsType;
126 omitDOMProps?: (props: object) => object;
127}
128/**
129 * This function is in internal usage.
130 * Do not use it in your prod env since we may refactor this.
131 */
132export default function generateSelector<OptionsType extends {
133 value?: RawValueType;
134 label?: React.ReactNode;
135 key?: Key;
136 disabled?: boolean;
137}[]>(config: GenerateConfig<OptionsType>): React.ForwardRefExoticComponent<SelectProps<OptionsType, DefaultValueType> & React.RefAttributes<RefSelectProps>>;