import { ChipChoiceRowProps, FiltersState } from '@cloud-ru/ds-chips';
import { WithSupportProps } from '@cloud-ru/ds-utils';
import { ReactNode } from 'react';
import { RequestPayloadParams } from '@cloud-ru/ft-request-payload-transform';
import { BulkActionsProps, DataViewProps, DataViewValue, MoreActionsProps, SearchProps } from '../../helperComponents';
import { NeverOrUndefined, RequireAtLeastOne } from './typesUtils';
export type ToolbarDataViewValue = DataViewValue;
export type ToolbarDataViewProps = DataViewProps & {
/** Показать переключатель вида. Если `dataView` не передан — равносильно `show: false` */
show?: boolean;
};
type OptionalProps = {
/** Колбек обновления */
onRefresh?(): void;
/** Дополнительный слот между поиском и переключателем вида (+ slotExtraButton в Figma).
* На mobile-раскладке (из `AdaptiveProvider`) не рендерится в строке — кнопки переносятся в меню «⋯»
* (`Button` с `onClick` и `label` / `icon` / `aria-label`, одна обёртка вокруг кнопки
* или элемент с `data-toolbar-after-overflow`). Иначе — в `moreActions`. */
after?: ReactNode;
/** Переключатель вида данных — SegmentControl (showDataView в Figma) */
dataView?: ToolbarDataViewProps;
/** Элементы выпадающего списка кнопки с действиями */
moreActions?: MoreActionsProps['moreActions'];
};
export type CommonToolbarProps = {
/** Параметры отвечают за строку поиска
* value: Значение строки поиска
* onChange: Колбэк смены значения
* onSubmit: Колбэк на подтверждение поиска по строке
* placeholder: Плейсхолдер
* loading: Состояние загрузки
* */
search?: SearchProps;
/** Класснейм */
className?: string;
/** Внешний бордер */
outline?: boolean;
};
export type ToolbarBulkActionProps = Omit & {
/** Список массовых действий */
bulkActions?: BulkActionsProps['actions'];
};
export type CheckedToolbarProps = CommonToolbarProps & ToolbarBulkActionProps & OptionalProps;
export type DefaultToolbarProps = CommonToolbarProps &
NeverOrUndefined &
RequireAtLeastOne;
export type FilterRow> = Omit<
ChipChoiceRowProps,
'size' | 'data-test-id'
> & {
open?: boolean;
/** Начальное состояние filter-row (mobile) */
initialOpen?: boolean;
onOpenChange?(isOpen: boolean): void;
};
export type PersistedFilterState = {
pagination?: RequestPayloadParams['pagination'];
ordering?: RequestPayloadParams['ordering'];
search?: string;
filter?: T;
};
export type ToolbarPersistConfig = {
/** Уникальный id для текущего инстанса компонента */
id?: string;
/** Ключ для queryParams */
filterQueryKey?: string;
/** Валидатор сохраненных */
validateData?(value: unknown): value is PersistedFilterState;
/** Custom-сериализация состояния перед сохранением в queryParams */
serializer?(value: PersistedFilterState): string;
/** Custom-парсер queryParams для преобразования в данные состояния */
parser?(value: string): PersistedFilterState;
/** Состояние для сохранения */
state?: PersistedFilterState;
/** Колбэк при первом рендере для получения сохраненных данных и установки их в стейт */
onLoad?(state: PersistedFilterState): void;
};
export type ToolbarProps> = WithSupportProps<
DefaultToolbarProps | CheckedToolbarProps
> & {
filterRow?: FilterRow;
/** Конфиг для сохранения состояния в localStorage и queryParams.
* Поле id должно быть уникальным для каждого инстанса компонента.
* */
persist?: ToolbarPersistConfig;
};