import React from 'react'; import { GlobalDefaultTheme, PartialGlobalDefaultTheme } from '../../utils/useTheme'; import { COMPONENTS_NAMESPACES } from '../../constants'; import { CustomEventHandler, CustomRender, SetState, SomeObject, TransformSuggestionToMatchFilter } from '../../commonTypes'; import { SuggestionListProps, SuggestionTarget } from '../../src/SuggestionList/types'; import { ValidationProps } from '../Validation/types'; import { FilterRules } from '../DropDownSelect/types'; import { DivProps } from '../Div'; import { TagProps } from '../Tags/types'; export interface BlurData { setFilterValue: SetState; setFocused: SetState; validateCurrent: () => boolean; value: MultiSelectValue; } export interface BlurEvent extends React.FocusEvent { component: { isValid?: boolean; name?: string; value: T[]; }; } export declare type ChangeEvent = MouseSelectEvent | EnterSelectEvent | ClearEvent | ResetEvent; export interface ClearData { setValue: SetState; value: MultiSelectValue; } export interface ClearEvent extends React.MouseEvent { component: { deselectedValues: T[]; name?: string; selectedValue: undefined; value: T[]; }; } export interface EnterPressEvent extends React.KeyboardEvent { component: { name?: string; value: T[] | string; }; } export interface EnterSelectEvent extends React.KeyboardEvent { component: { deselectedValues: undefined; name?: string; selectedValue: T | T[]; value: T[]; }; } export interface FilterDataParams { compareObjectsBy: MultiSelectProps['compareObjectsBy']; /** * Data to display in list. * If array of objects is passed, you need to specify "textField" - field of object that contains data to be displayed in list */ data: MultiSelectProps['data']; /** * Filter data by rule. "smart" - default search, startsWith - search by first chars, "includes" - search by occurrence. * With large amounts of data(more 1-2 thousand values) is undesirable to use "smart search". */ filterRule?: FilterRules; /** Fields, when containing search data */ searchFields?: string[]; /** Selected fields in multiselect */ selectedValues: MultiSelectValue; /** Permanent list, items do not disappear when clicked */ shouldKeepSuggestions?: boolean; /** Object's field name from which data will be rendered as list items */ textField?: string; /** Eliminates differences between suggestions from filtered list and value in input */ transformSuggestionToMatchFilter?: TransformSuggestionToMatchFilter; /** Value by which filtering is performed */ value: string; } export interface FocusData { setFocused: SetState; value: MultiSelectValue; } export interface FocusEvent extends React.FocusEvent { component: { name?: string; value: T[]; }; } export interface GetSortedSuggestionsProps { filteredData?: Value[]; selectedSuggestions?: Value[]; shouldSelectedGoFirst?: boolean; sortSuggestions: MultiSelectProps['sortSuggestions']; } export interface KeyDownData { filterValue: string; handleSelect: CustomEventHandler & SuggestionTarget>; highlightedSuggestion: Value; setHighlightedSuggestion: SetState; value: MultiSelectValue; } export interface MouseDownData { inputRef: React.MutableRefObject; isDisabled: boolean | undefined; isFocused: boolean; setFocused: SetState; } export interface MouseSelectEvent extends React.MouseEvent { component: { deselectedValues?: T[]; name?: string; selectedValue?: T | T[]; value: T[]; }; } export interface MultiSelectComponent { (props: MultiSelectProps): React.ReactElement; displayName?: string; } export interface MultiSelectProps extends ValidationProps { /** Custom prop */ [x: string]: unknown; /** Browser-based autofill of input field, by default "off" */ autoComplete?: string; /** "Select all" in drop-down list */ canSelectAll?: boolean; /** Comparing objects by an arbitrary field, not by reference */ compareObjectsBy?: T extends object ? ((suggestionListItems: SomeObject) => any) | string : never; /** * Data to display in list. * If array of objects is passed, you need to specify "textField" - field of object that contains data to be displayed in list */ data?: MultiSelectValue; /** Default value */ defaultValue?: T; /** * Filter data by rule. "smart" - default search, startsWith - search by first chars, "includes" - search by occurrence. * With large amounts of data(more 1-2 thousand values) is undesirable to use "smart search". */ filterRule?: FilterRules; /** Key for grouping */ groupBy?: (option: Value) => string | undefined; /** Checkboxes in drop-down list */ hasCheckBoxes?: boolean; /** Button for clearing data in input. Appears only in non-empty input */ hasClearButton?: boolean; /** Custom input render */ inputRender?: CustomRender & { ref?: React.Ref; }>; /** Off input state */ isDisabled?: boolean; /** Loader will be displayed instead of list at the time of loading */ isLoading?: boolean; /** Sets open state of list */ isOpen?: boolean; /** Customization of appearance of drop-down list item */ itemRender?: SuggestionListProps['itemRender']; /** Customization of appearance of drop-down list */ listRender?: SuggestionListProps['listRender']; /** Limit on number of selected items. After reaching limit, drop-down window stops appearing */ maxSelected?: number; /** Number of tags after which they will be combined into one "n values selected" */ maxTags?: number; /** Component name */ name?: string; /** Attribute for displaying drop-down list if there are no values in data equal to contents of input data. Accepts JSX */ noSuggestionsRender?: any; /** Handler for focus loss event */ onBlur?: (event: FocusEvent) => void; /** Handler for data changes in input */ onChange?: (event: ChangeEvent) => void; /** Handler for Enter press event */ onEnterPress?: (ev: EnterPressEvent) => void; /** Element focus handler */ onFocus?: (event: FocusEvent) => void; /** Placeholder of input */ placeholder?: string; /** Ref */ ref?: React.Ref; /** Fields, when containing search data */ searchFields?: string[]; /** Customization of "Select all" text in drop-down list */ selectAllItemRender?: SuggestionListProps['selectAllItemRender']; /** Display component without filter */ shouldHideInput?: boolean; /** Permanent list, items do not disappear when clicked */ shouldKeepSuggestions?: boolean; /** Output selected values in list first */ shouldSelectedGoFirst?: boolean; /** Sorting drop-down list */ sortSuggestions?: (a: Value, b: Value) => number; /** Custom tag rendering */ tagRender?: CustomRender; /** Custom message about combined tags */ tagsUnionRender?: CustomRender; /** Object's field name from which data will be rendered as list items */ textField?: T extends object ? string : never; /** Theme of component */ theme?: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.multiSelect]; /** Eliminates differences between suggestions from filtered list and value in input */ transformSuggestionToMatchFilter?: TransformSuggestionToMatchFilter; /** Sets value in input (will be displayed as selected tags) */ value?: T; /** Custom render of wrapper */ wrapperRender?: CustomRender; } export interface MultiSelectRefCurrent { input: HTMLInputElement | null; wrapper: HTMLElement | null; } export interface MultiSelectState { filterValue: string; isFocused: boolean; value: MultiSelectValue; } export declare type MultiSelectValue = Value[]; export interface ResetEvent { component: { deselectedValues: undefined; name?: string; selectedValue: undefined; value: T[]; }; } export interface SelectData { data: MultiSelectProps['data']; setFilterValue: SetState; setFocused: SetState; setValue: SetState; value: MultiSelectValue; } export interface TagsContainerProps { children: React.ReactElement; hasClearButton?: boolean; isDisabled?: boolean; isFocused: boolean; isLoading?: boolean; onClearIconClick: React.MouseEventHandler; onMouseDown: React.MouseEventHandler; onTagClick: CustomEventHandler & SuggestionTarget>; placeholder?: MultiSelectProps['placeholder']; shouldHideInput?: MultiSelectProps['shouldHideInput']; textField?: string; theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.multiSelect]; value: MultiSelectValue; } export interface IconsProps { hasClearButton?: boolean; isDisabled?: boolean; isFocused: boolean; isLoading?: boolean; onClearIconClick?: React.MouseEventHandler; theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.multiSelect]; value: Value[]; } export declare type Value = SomeObject | string | number | null;