1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | import * as React from 'react';
|
10 | import { RenderNode, Mode, RenderDOMFunc } from './interface';
|
11 | import { GetLabeledValue, FilterOptions, FilterFunc, DefaultValueType, RawValueType, LabelValueType, Key, FlattenOptionsType, SingleType, OnClear, SelectSource, CustomTagProps } from './interface/generator';
|
12 | import { OptionListProps, RefOptionListProps } from './OptionList';
|
13 | export interface RefSelectProps {
|
14 | focus: () => void;
|
15 | blur: () => void;
|
16 | }
|
17 | export 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 |
|
33 |
|
34 |
|
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 |
|
94 |
|
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 | }
|
105 | export 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 |
|
113 | convertChildrenToData: (children: React.ReactNode) => OptionsType;
|
114 |
|
115 | flattenOptions: (options: OptionsType, props: any) => FlattenOptionsType<OptionsType>;
|
116 |
|
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 |
|
130 |
|
131 |
|
132 | export 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>>;
|