E5 S7: Plex filter UI — listbox-select pickers + studio filter

Reworks the always-expanded filter chip walls into compact, Seerr-style
"+ Add" → searchable-popover pickers (the user's space-saving ask), and adds
the missing studio filter.

- New MultiSelectChips: selected values as removable chips + a "+ Add" trigger
  opening a searchable checklist (AnchoredPopover platform — menuitemcheckbox,
  arrow/Escape, anchor flip). Options carry facet counts; a large vocabulary
  renders a 50-row cap + "N more — refine with search" footer (studios run to
  ~1500). Replaces the flat Genre + Age-rating chip lists.
- New Studio filter via the same picker. Backend: /facets now aggregates the
  studio vocabulary (distinct studio + count, self-excluded like genres). The
  studio filter itself already existed (only addable from the detail page before).
- Collection converted to the same "+ Add" pattern (CollectionPicker): a
  single-select popover with server-side search + the 50-cap; the selected
  collection still shows as a removable chip. Retires the always-inline search+list.

New i18n plex.filter.studio/add/moreRefine + common.search/remove/noResults
(en+hu). Tests: MultiSelectChips.dom.test.tsx (5, incl. the cap) +
test_plex_facets studio-vocabulary. Browser-E2E'd: Genre→Horror(402),
Studio→A24(14, capped/searched), Collection→James Bond(26)/harry-search.
Gate: vitest 342, backend lane 403.
This commit is contained in:
2026-08-21 00:40:31 +02:00
parent 187b8007f8
commit d56a791c04
10 changed files with 470 additions and 97 deletions
+4 -1
View File
@@ -22,5 +22,8 @@
"loadError": "Couldn't load this — check your connection and try again.",
"seeAll": "See all",
"scrollLeft": "Scroll left",
"scrollRight": "Scroll right"
"scrollRight": "Scroll right",
"search": "Search",
"remove": "Remove",
"noResults": "No matches"
}
+4 -1
View File
@@ -70,7 +70,10 @@
"collection": "Collection",
"collectionSearch": "Search collections…",
"collectionEmpty": "No collections",
"matchLabel": "Match"
"matchLabel": "Match",
"studio": "Studio",
"add": "Add",
"moreRefine": "{{count}} more — refine with search"
},
"count": "{{count}} titles",
"searchCount": "{{count}} matches",
+4 -1
View File
@@ -22,5 +22,8 @@
"loadError": "Nem sikerült betölteni — ellenőrizd a kapcsolatot, és próbáld újra.",
"seeAll": "Összes",
"scrollLeft": "Görgetés balra",
"scrollRight": "Görgetés jobbra"
"scrollRight": "Görgetés jobbra",
"search": "Keresés",
"remove": "Eltávolítás",
"noResults": "Nincs találat"
}
+4 -1
View File
@@ -70,7 +70,10 @@
"collection": "Kollekció",
"collectionSearch": "Kollekciók keresése…",
"collectionEmpty": "Nincs kollekció",
"matchLabel": "Egyezés"
"matchLabel": "Egyezés",
"studio": "Stúdió",
"add": "Hozzáadás",
"moreRefine": "még {{count}} — finomíts kereséssel"
},
"count": "{{count}} cím",
"searchCount": "{{count}} találat",