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; };