@appello/web-ui
Version:
Web ui library for a better development experience
48 lines (47 loc) • 3.6 kB
TypeScript
import './styles.scss';
import { ForwardedRef, ReactElement, ReactNode } from 'react';
import { GroupBase, OptionsOrGroups, Props as ReactSelectProps, PropsValue, SelectComponentsConfig } from 'react-select';
import BaseReactSelect from 'react-select/base';
import { InputSize } from '../../../components/form/TextInput';
export interface SelectOption<T> {
label: string;
value: T;
[key: string]: any;
}
export interface NewSelectOption {
label: string;
value: string;
__isNew__: true;
}
export type SelectValueType<TValue, TIsMulti extends boolean, TIsClearable extends boolean, TIsCreatable extends boolean> = TIsCreatable extends true ? TIsMulti extends true ? TValue extends unknown[] ? Extract<TValue[number], NewSelectOption> extends never ? never : TValue : never : Extract<TValue, NewSelectOption> extends never ? never : TIsClearable extends true ? Extract<TValue, null> extends never ? never : TValue : TValue : TIsMulti extends true ? TValue extends unknown[] ? TValue : never : TIsClearable extends true ? Extract<TValue, null> extends never ? never : TValue : TValue;
export type SelectOnChange<TValue, TIsMulti extends boolean, TIsClearable extends boolean, TIsCreatable extends boolean> = (value: SelectValueType<TValue, TIsMulti, TIsClearable, TIsCreatable>) => void;
export type SelectOptionType<TValue> = SelectOption<TValue extends unknown[] ? TValue[number] : TValue>;
export type SelectRefProps<TValue, TIsMulti extends boolean = false> = BaseReactSelect<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>;
export interface SelectProps<TValue, TIsMulti extends boolean, TIsClearable extends boolean, TIsCreatable extends boolean> {
variantMulti?: 'simple' | 'tags';
multiValueContent?: (values: PropsValue<SelectOptionType<TValue>>, options: OptionsOrGroups<SelectOptionType<TValue>, GroupBase<SelectOptionType<TValue>>>) => ReactNode;
value: SelectValueType<TValue, TIsMulti, TIsClearable, TIsCreatable>;
inputSize?: InputSize;
options: SelectOptionType<TValue>[];
isMulti?: TIsMulti;
onChange?: SelectOnChange<TValue, TIsMulti, TIsClearable, TIsCreatable>;
placeholder?: string;
className?: string;
isClearable?: TIsClearable;
hasError?: boolean;
disabled?: boolean;
maxMenuHeight?: number;
hideSelectedOptions?: boolean;
isCreatable?: TIsCreatable;
isSearchable?: boolean;
isOptionDisabled?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['isOptionDisabled'];
onBlur?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['onBlur'];
menuPlacement?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['menuPlacement'];
components?: SelectComponentsConfig<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>;
menuPortalTarget?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['menuPortalTarget'];
closeMenuOnScroll?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['closeMenuOnScroll'];
formatOptionLabel?: ReactSelectProps<SelectOptionType<TValue>, TIsMulti, GroupBase<SelectOptionType<TValue>>>['formatOptionLabel'];
}
export declare const Select: <TValue, TIsMulti extends boolean = false, TIsClearable extends boolean = false, TIsCreatable extends boolean = false>(props: SelectProps<TValue, TIsMulti, TIsClearable, TIsCreatable> & {
ref?: ForwardedRef<SelectRefProps<TValue, TIsMulti>>;
}) => ReactElement;