feat(views): editable saved-view detail — removable filter chips + undo + save-current (S7)

The Personal-views manager's detail pane becomes editable instead of
read-only:

- Captured filters render as REMOVABLE chips. Removing one prunes the set
  and writes it straight back to the stored view (PATCH filters), via the
  same live-row builders (useActiveFilters / buildPlexActiveFilters) that
  already compute the pruned snapshot — so the modal and the live chip row
  can't drift. The prune is wrapped in useUndoable + the shared UndoToolbar,
  so undo/redo re-persist the same way. The undoable draft is the single
  source of truth for the chip row, so a chip-prune refetch never clobbers
  the history.
- A "Save current" button beside Apply stores the module's currently-applied
  filters INTO the view (the live→stored inverse of Apply). Disabled when the
  view already equals the live filters (it's the active one). On save the
  draft re-seeds to the saved snapshot and clears the stale undo history.
- Rename gains a visible commit affordance: a check button beside the name
  input that enables once the name changes (Enter and blur still commit).

Provider gains two methods mirroring `rename`: updateFilters(id, filters)
and saveCurrent(id). One shared provider serves feed + plex, so both get it.
PATCH filters was already supported end-to-end — FE-only.

New i18n: views.saveCurrent / saveCurrentHint / saveCurrentUpToDate (HU+EN).
Tests: 5 new in PersonalViewsModal.dom.test.tsx (chip-remove persists, undo
re-persists, save-current fires + disables when up-to-date, rename commit).
This commit is contained in:
2026-08-27 04:22:07 +02:00
parent 00527d0cf3
commit 9cd4ae09d4
5 changed files with 292 additions and 30 deletions
+3
View File
@@ -19,6 +19,9 @@
"capturedFilters": "Captured filters",
"capturedNone": "No filters — matches every video.",
"default": "Default",
"saveCurrent": "Save current",
"saveCurrentHint": "Overwrite this view with the filters currently applied",
"saveCurrentUpToDate": "This view already matches the current filters",
"selectPrompt": "Select a view to see and edit it.",
"modified": "Modified — the current filters differ from this saved view."
}
+3
View File
@@ -19,6 +19,9 @@
"capturedFilters": "Rögzített szűrők",
"capturedNone": "Nincs szűrő — minden videóra illeszkedik.",
"default": "Alapértelmezett",
"saveCurrent": "Aktuális mentése",
"saveCurrentHint": "Felülírja ezt a nézetet a jelenleg alkalmazott szűrőkkel",
"saveCurrentUpToDate": "Ez a nézet már megegyezik a jelenlegi szűrőkkel",
"selectPrompt": "Válassz egy nézetet a megtekintéshez és szerkesztéshez.",
"modified": "Módosítva — a jelenlegi szűrők eltérnek a mentett nézettől."
}