1 | import * as React from 'react';
|
2 | import { Props as SelectProps } from './Select';
|
3 |
|
4 | export interface OptionTypeBase {
|
5 | [key: string]: any;
|
6 | }
|
7 |
|
8 | export type OptionsType<OptionType extends OptionTypeBase> = ReadonlyArray<OptionType>;
|
9 |
|
10 | export interface GroupTypeBase<OptionType extends OptionTypeBase> {
|
11 | options: OptionsType<OptionType>;
|
12 | [key: string]: any;
|
13 | }
|
14 |
|
15 | export type GroupedOptionsType<
|
16 | OptionType extends OptionTypeBase,
|
17 | GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>
|
18 | > = ReadonlyArray<GroupType>;
|
19 |
|
20 | export type ValueType<OptionType extends OptionTypeBase, IsMulti extends boolean> = IsMulti extends true
|
21 | ? OptionsType<OptionType>
|
22 | : OptionType | null;
|
23 |
|
24 | export type FocusEventHandler = (event: React.FocusEvent<HTMLElement>) => void;
|
25 | export type MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;
|
26 | export type KeyboardEventHandler = (event: React.KeyboardEvent<HTMLElement>) => void;
|
27 |
|
28 | export type InnerRef = React.Ref<any>;
|
29 | export interface PropsWithInnerRef {
|
30 |
|
31 | innerRef: React.Ref<any>;
|
32 | }
|
33 |
|
34 | export type ClassNameList = string[];
|
35 | export type ClassNamesState = { [key: string]: boolean } | undefined;
|
36 |
|
37 | export interface CommonProps<
|
38 | OptionType extends OptionTypeBase,
|
39 | IsMulti extends boolean,
|
40 | GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>
|
41 | > {
|
42 | clearValue: () => void;
|
43 | className?: string;
|
44 | cx: (state: ClassNamesState | undefined, className: string | undefined) => string;
|
45 | |
46 |
|
47 |
|
48 |
|
49 |
|
50 | getStyles: (name: string, props: any) => {};
|
51 | getValue: () => OptionsType<OptionType>;
|
52 |
|
53 | hasValue: boolean;
|
54 |
|
55 | isMulti: boolean;
|
56 |
|
57 | isRtl: boolean;
|
58 | options: OptionsType<OptionType>;
|
59 | selectOption: (option: OptionType) => void;
|
60 | selectProps: SelectProps<OptionType, IsMulti, GroupType>;
|
61 | setValue: (newValue: ValueType<OptionType, IsMulti>, action: SetValueAction, option?: OptionType) => void;
|
62 | theme: Theme;
|
63 | }
|
64 |
|
65 | export interface SelectOptionActionMeta<OptionType extends OptionTypeBase> {
|
66 | action: 'select-option';
|
67 | option: OptionType | undefined;
|
68 | name?: string;
|
69 | }
|
70 |
|
71 | export interface DeselectOptionActionMeta<OptionType extends OptionTypeBase> {
|
72 | action: 'deselect-option';
|
73 | option: OptionType | undefined;
|
74 | name?: string;
|
75 | }
|
76 |
|
77 | export interface RemoveValueActionMeta<OptionType extends OptionTypeBase> {
|
78 | action: 'remove-value';
|
79 | removedValue: OptionType;
|
80 | name?: string;
|
81 | }
|
82 |
|
83 | export interface PopValueActionMeta<OptionType extends OptionTypeBase> {
|
84 | action: 'pop-value';
|
85 | removedValue: OptionType;
|
86 | name?: string;
|
87 | }
|
88 |
|
89 | export interface ClearActionMeta<OptionType extends OptionTypeBase> {
|
90 | action: 'clear';
|
91 | removedValues: OptionType[];
|
92 | name?: string;
|
93 | }
|
94 |
|
95 | export interface CreateOptionActionMeta {
|
96 | action: 'create-option';
|
97 | name?: string;
|
98 | }
|
99 |
|
100 | export type ActionMeta<OptionType extends OptionTypeBase> =
|
101 | | SelectOptionActionMeta<OptionType>
|
102 | | DeselectOptionActionMeta<OptionType>
|
103 | | RemoveValueActionMeta<OptionType>
|
104 | | PopValueActionMeta<OptionType>
|
105 | | ClearActionMeta<OptionType>
|
106 | | CreateOptionActionMeta;
|
107 |
|
108 | export type Action = ActionMeta<OptionTypeBase>['action'];
|
109 | export type SetValueAction = 'select-option' | 'deselect-option';
|
110 |
|
111 | export type InputActionTypes = 'set-value' | 'input-change' | 'input-blur' | 'menu-close';
|
112 |
|
113 | export interface InputActionMeta {
|
114 | action: InputActionTypes;
|
115 | }
|
116 |
|
117 | export type MenuPlacement = 'auto' | 'bottom' | 'top';
|
118 | export type MenuPosition = 'absolute' | 'fixed';
|
119 |
|
120 | export type FocusDirection = 'up' | 'down' | 'pageup' | 'pagedown' | 'first' | 'last';
|
121 |
|
122 | export type OptionProps = PropsWithInnerRef & {
|
123 | data: any;
|
124 | id: number;
|
125 | index: number;
|
126 | isDisabled: boolean;
|
127 | isFocused: boolean;
|
128 | isSelected: boolean;
|
129 | label: string;
|
130 | onClick: MouseEventHandler;
|
131 | onMouseOver: MouseEventHandler;
|
132 | value: any;
|
133 | };
|
134 |
|
135 | export interface ThemeSpacing {
|
136 | baseUnit: number;
|
137 | controlHeight: number;
|
138 | menuGutter: number;
|
139 | }
|
140 |
|
141 | export interface Theme {
|
142 | borderRadius: number;
|
143 | colors: { [key: string]: string };
|
144 | spacing: ThemeSpacing;
|
145 | }
|