import type { CSSProperties, InputHTMLAttributes, ChangeEventHandler, Dispatch, ReactNode } from 'react'; import { SafeExtract } from '../../types'; import type { RequiredProps, HintProps, LabelProps } from '../../components/TextField/TextField.types'; import { FocusedPathState, TreePathState, TreePathAction } from './reducers'; import type { ValueToCheckedMapType, CheckedType } from './hooks'; export type Value = string | string[]; export type Placement = 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end'; export type ItemOption = { /** * Значение у item. */ value: string; /** * Метка-подпись к item. */ label: string; /** * Сторона открытия вложенного выпадающего списка относительно текущего элемента. * @default bottom-start */ placement?: Placement; /** * Список дочерних items. */ items?: ItemOption[]; /** * Item не активен. */ disabled?: boolean; /** * Слот для контента слева. */ contentLeft?: ReactNode; /** * Слот для контента справа. */ contentRight?: ReactNode; /** * Classname для item. */ className?: string; /** * Максимальная высота дочернего выпадающего списка. */ listMaxHeight?: CSSProperties['height']; }; export type ItemOptionTransformed = Omit & { items?: ItemOptionTransformed[]; parent?: ItemOptionTransformed | null; }; export type SelectAllProps = { checked?: boolean; indeterminate?: boolean; label?: string; onClick?: () => void; sticky?: boolean; }; type ComboboxSingleProps = { multiple?: false; value?: string; defaultValue?: string; onChange?: (value: string, item: T | null) => void; isTargetAmount?: false; targetAmount?: never; renderValue?: never; selectAllOptions?: never; chipClickArea?: never; }; type ComboboxMultipleProps = { multiple: true; value?: string[]; defaultValue?: string[]; onChange?: (value: string[], item: T | null) => void; isTargetAmount?: true; targetAmount?: number; renderValue?: (item: T) => string; selectAllOptions?: SelectAllProps; chipClickArea?: 'full' | 'close-icon'; }; type ComboboxSingleNativeProps = Omit, 'onChange' | 'value'> & { /** * Имя поля. Используется для нативной формы и react-hook-form register. */ name: string; value?: never; onChange?: ChangeEventHandler; }; type ComboboxMultipleNativeProps = Omit, 'onChange' | 'value'> & { name: string; value?: never; onChange?: ChangeEventHandler; }; /** * Описание режимов работы компонента: * * 1. Если value !== null && value !== undefined, компонент controlled. * name не включает native-режим, onChange вызывается как (value, item). * 2. Если value нет и name есть, компонент uncontrolled внутри, * но изменения дополнительно прокидываются в hidden