import * as React from 'react'; import { PartialGlobalDefaultTheme } from '../../utils/useTheme'; import { COMPONENTS_NAMESPACES } from '../../constants'; import { ArrayElement, CustomRender, SetState, SomeObject } from '../../commonTypes'; import { ButtonProps } from '../Button/types'; import { ValidationProps } from '../Validation/types'; export declare type Value = string | SomeObject | number | null; export interface ResetEvent { component: { name?: string; /** Значение - элемент из data */ value?: T; }; } export interface ButtonClickEvent extends React.MouseEvent { component: { name?: string; /** Значение - элемент из data */ value: T; }; } export declare type ChangeEvent = ButtonClickEvent | ResetEvent; export interface ButtonGroupProps extends ValidationProps { /** Классы переданные через _ */ [x: string]: unknown; /** Кастомизация кнопки при передаче data. По дефолту используется L.Button */ buttonRender?: CustomRender; /** Данные для элементов. Массив обьектов или строк или чисел. ВАЖНО! В компоненте не может быть двух кнопок с одинаковым текстом */ data?: ArrayElement[]; /** Значение по-умолчанию */ defaultValue?: Value | Value[]; /** Выключенное состояние компонента */ isDisabled?: boolean; /** Обработчик события изменения активного айтема. Отдает value и index */ onChange?: (ev: ChangeEvent) => void; /** Обработчик клика */ onClick?: React.MouseEventHandler; /** Реф */ ref?: React.Ref; /** При передаче массива обьектов указать текстовое поле из которого брать значение */ textField?: string; /** Тема компонента */ theme?: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.buttonGroup]; /** Тип компонента, если radio - может выбрана только одна кнопка, иначе - несколько. По-умолчанию radio */ type?: 'radio' | 'checkbox'; /** Значение активного элемента. Использовать при контролируемом режиме */ value?: T; /** Кастомный рендер для враппера */ wrapperRender?: CustomRender; } export interface ButtonGroupState { value: Value | Value[]; } export interface ButtonGroupRefCurrent { wrapper: HTMLElement | null; } export interface WrapperProps extends React.HTMLAttributes { ref?: React.Ref; } export interface ChangeData { setUncontrolledValue: SetState; validateCurrent: (value: ButtonGroupProps['value']) => boolean; value: ButtonGroupProps['value']; }