Filters.List

Фильтр по списку значений — автор, статус, связанная запись. Варианты рисуются ячейками Cell: label — заголовок (и подпись на теге), description — описание под ним, avatar — аватар слева.

По умолчанию выбирают несколько вариантов — в value уходит { op: "in", value: string[] }. Пустой выбор снимает условие целиком: пустого in в value не бывает.

Тег показывает первый выбранный вариант и число остальных: «Автор: Иван +2». Подписи выбранных вариантов фильтр помнит сам. Если значение пришло снаружи, а варианта с ним нет в items, вместо подписи показывается количество: «Автор: 3».

Вариант с disabled: true гаснет и не выбирается — например, когда выбрано уже столько, сколько можно. Уже выбранный вариант с disabled в списке не снимается — только крестиком на теге.

[]

Примеры

Одиночный выбор

mode="single" — радио вместо чекбоксов: выбор заменяет прежний и закрывает поповер, условие пишется оператором { op: "eq", value: string }. Снять выбор можно крестиком на теге.

[
  {
    "key": "status",
    "op": "eq",
    "value": "review"
  }
]

Поиск и подгрузка

С onSearch над списком появляется поле поиска: колбэк вызывается через 300 мс после ввода, а на закрытии поповера — с пустой строкой. С hasMore под списком появляется «Показать ещё» (onLoadMore); пока isLoading, пустой список показывает «Загрузка…», а кнопка подгрузки недоступна. Сами запросы делает потребитель — в items приходит уже суженный и догруженный список. onOpenChange сообщает об открытии и закрытии поповера: по нему варианты можно грузить только в открытом.

API

PropTypeDefault
field*

Поле фильтра — ключ его условия в value у Filters.Root

string-
label*

Название фильтра на теге

string-
mode

Сколько вариантов можно выбрать. multiple пишет условие { op: "in", value: string[] }, single — { op: "eq", value: string }

"single" | "multiple""multiple"
items*

Варианты списка. Запросы делает потребитель: список приходит готовым, уже суженным поиском и догруженным по onLoadMore

FiltersListItem[]-
isLoading

Идёт загрузка вариантов: пустой список показывает «Загрузка…», а кнопка «Показать ещё» недоступна

booleanfalse
onSearch

Поиск по вариантам: с ним над списком появляется поле поиска. Вызывается через 300 мс после ввода, а на закрытии поповера — с пустой строкой

(search: string) => void-
hasMore

Есть ещё варианты — под списком появляется «Показать ещё»

booleanfalse
onLoadMore

Клик по «Показать ещё»

() => void-
onOpenChange

Вызывается на открытие и закрытие поповера, включая Esc и клик вне его, — например, чтобы грузить варианты только в открытом

(open: boolean) => void-
emptyText

Текст пустого списка

string"Ничего не найдено"