import { ComponentType, JSX, default as React } from 'react'; import { AllOptionAccessor, ComponentVariant, LabelVariant, OptionAccessor, SizeVariant } from '../Shared/types'; import { InputPropsWithLegacy as InputProps } from '../Input/types'; export type SelectDisplayMode = "compact" | "chips"; export type SelectSize = SizeVariant; export type SelectOptionType = { label: string; value: string | number; id: string | number; isGroupHeader?: boolean; groupLabelNode?: React.ReactNode; groupData?: unknown; originalOption?: unknown; }; export type CustomSelectionDisplayProps = { selectedOptions: T[]; placeholder?: string; multiple: boolean; onRemoveOption: (optionId: string | number) => void; disabled?: boolean; }; interface SelectOptionRendererProps { option: SelectOptionType | T; isSelected: boolean; onSelect: (option: SelectOptionType) => void; multiple: boolean; disabled?: boolean; isOptionActive?: boolean; isLoading?: boolean; } export interface CustomSelectOptionRendererProps extends Omit, "onSelect"> { option: T; onSelect: (closeOnSelect?: boolean) => void; disabled?: boolean; isLoading?: boolean; isOptionActive?: boolean; renderContext?: TContext; } export interface CustomSelectOptionGroupHeaderProps { group: T; label: React.ReactNode | string; groupOptions: T[]; groupSelectedIds: string[]; multiple: boolean; disabled?: boolean; expanded: boolean; toggleGroup: (nextExpanded?: boolean) => void; selectGroup: (mode?: "toggle" | "select" | "deselect") => void; renderContext?: TContext; } export type SelectVariant = "default" | "error" | "success"; export type SelectControlsHandler = { open: () => void; close: () => void; toggle: () => void; handleOptionSelect: (option: SelectOptionType, closeOnSelect: boolean) => void; subscribeOpenChange: (cb: (open: boolean) => void) => () => void; searchInputRef: React.RefObject; }; export type SelectControlsRef = React.RefObject; export interface DropdownOptionsProps { hideSearchBar?: boolean; inputProps?: Partial; dropdownHeight?: string; controledSearchValue?: string; onSearchValueChange?: (value: string) => void; onSearchClear?: () => void; inputSearchPlaceholder?: string; isLoading?: boolean; footer?: React.ReactNode; loadingComponent?: React.ReactNode; enableGroupToggle?: boolean; focusSearchInputOnOpen?: boolean; optionContainerClassName?: string; groupContainerClassName?: string; } export interface BaseSelectProps { id?: string; name?: string; label: string; options: T[]; optionLabel: OptionAccessor; optionActive?: AllOptionAccessor; optionValue: OptionAccessor; renderOption?: ComponentType>; renderOptionGroupHeader?: ComponentType>; renderSelection?: ComponentType>; renderOptionContext?: TContext; disabled?: boolean; className?: string; isLoading?: boolean; emptyMessage?: string; placeholder?: string; errorComponent?: React.ReactNode; helperComponent?: React.ReactNode; variant?: ComponentVariant; overflow?: "wrap" | "scroll"; containerClassName?: string; buttonClassName?: string; dropdownClassName?: string; width?: string; height?: string; tabIndex?: number; controls?: SelectControlsRef; labelVariant?: LabelVariant; attachToParent?: boolean; disableOpenOnFocus?: boolean; onClose?: () => void; onClear?: () => void; onRemoveOption?: (option: T) => void; onOptionClick?: (option: SelectOptionType, name?: string) => void; dropdownOptions?: DropdownOptionsProps; size?: SelectSize; } export interface MultipleSelectProps extends BaseSelectProps { multiple: true; value: (string | number)[]; onChange?: (newValue: SelectOptionType[], name?: string) => void; displayMode?: "compact" | "chips"; } export interface SingleSelectProps extends BaseSelectProps { multiple?: false; value: string | number | undefined; onChange?: (newValue: SelectOptionType | undefined, name?: string) => void; displayMode?: "compact"; } export type SelectProps = MultipleSelectProps | SingleSelectProps; declare const SelectWithOverloads: { (props: MultipleSelectProps): JSX.Element; (props: SingleSelectProps): JSX.Element; }; export default SelectWithOverloads;