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