feat(dict): records filter — search + scope chips client-side

На странице словаря над таблицей появилась filter bar:
- SearchInput (поиск по businessKey + JSON.stringify(data) — покрывает
  локализованные name, code, описания)
- 3 scope chips PUBLIC/INTERNAL/RESTRICTED с цветными dot'ами,
  toggle включает/исключает scope. Empty Set = все scope видны
  (default state).
- Когда фильтры активны — показываем 'Найдено X из Y' + кнопка
  Сбросить.
- Если фильтр выдал 0 результатов — EmptyState с пояснением
  что под фильтр ничего не подошло.

Фильтрация client-side через useMemo. Записей в одном словаре
обычно ≤100, JSON.stringify + includes() мгновенно. AOI остаётся
server-side (геометрия требует PostGIS) — фильтры комбинируются.

i18n: RU + EN ключи.
This commit is contained in:
Zimin A.N.
2026-05-06 20:21:05 +03:00
parent 668f1b8b5b
commit b4281de41f
2 changed files with 123 additions and 21 deletions
+10
View File
@@ -235,6 +235,11 @@ i18n
'error.failed': 'Не удалось загрузить данные',
'auth.login': 'Войти',
'auth.logout': 'Выйти',
'dict.filter.searchPlaceholder': 'Поиск по записям…',
'dict.filter.scopeLabel': 'Фильтр по scope',
'dict.filter.matched': 'Найдено {{count}} из {{total}}',
'dict.filter.clear': 'Сбросить',
'dict.filter.noMatches': 'По фильтру записей не найдено',
'aoi.button': 'AOI фильтр',
'aoi.activeBbox': 'AOI: bbox {{value}}',
'aoi.activePolygon': 'AOI: полигон ({{points}} точек)',
@@ -470,6 +475,11 @@ i18n
'error.failed': 'Failed to load data',
'auth.login': 'Sign in',
'auth.logout': 'Sign out',
'dict.filter.searchPlaceholder': 'Search records…',
'dict.filter.scopeLabel': 'Filter by scope',
'dict.filter.matched': 'Matched {{count}} of {{total}}',
'dict.filter.clear': 'Clear',
'dict.filter.noMatches': 'No records match the filter',
'aoi.button': 'AOI filter',
'aoi.activeBbox': 'AOI: bbox {{value}}',
'aoi.activePolygon': 'AOI: polygon ({{points}} points)',