feat(design): a channel's and a Plex playlist's one action list (C1) — the row's "…", Delete + undo, an action toast's 8 s floor (E28 S3e2)

- Channels: the row's full-history, hide and unsubscribe buttons become its "…" at the row end
  (useChannelActions: open, pin, YouTube, copy name / link, full history or the admin reset,
  hide with an undo toast, unsubscribe behind its danger confirm); the card layout docks the "…"
  beside the name (ChannelLayoutGrid moreKey). The admin reset's confirm now names the reset.
- Plex playlist page: a title, a show group and a season each open the page's one row menu (a
  title's is its usePlexCardActions list plus the removal); no X at rest; removals take an undo
  toast whose Undo puts every row back at its own index in one request (bulk add `positions`);
  j/k walk the visible rows, Delete removes the walked one; rename and delete in the header's "…".
- notify: a toast with an action lives at least 8 s (the owner's call), whatever the toast setting.
This commit is contained in:
2026-09-26 05:56:07 +02:00
parent b0e51c6f89
commit 1b946113c6
27 changed files with 1354 additions and 293 deletions
+7 -6
View File
@@ -107,18 +107,18 @@
"fullySynced": "fully synced",
"fullySyncedHint": "Recent uploads and the full back-catalog are both in.",
"backfillThis": "Backfill this channel",
"backfillThisHint": "Fetch this channel's full back-catalog (older videos + complete search). Click again to cancel the request.",
"backfillThisHint": "Fetch this channel's full back-catalog (older videos + complete search).",
"resetBackfill": "Reset & re-fetch this channel",
"cancelBackfill": "Cancel the full-history request",
"resetHint": "Admin: re-fetch this channel from scratch (recent + full back-catalog), regardless of its current sync state.",
"queuedRequestedHint": "Full history requested — this channel's whole back-catalog will backfill as the shared quota allows. Click to cancel your request.",
"queuedRequestedHint": "Full history requested — this channel's whole back-catalog will backfill as the shared quota allows.",
"queuedByOtherHint": "Another subscriber already requested this channel's full history, so its whole back-catalog is on its way to everyone — nothing to do here.",
"hiddenHint": "Hidden — this channel's videos are kept out of your Feed. Click to show them again.",
"hideHint": "Hide this channel's videos from your Feed. It stays subscribed; this doesn't unsubscribe on YouTube.",
"unhide": "Unhide",
"hideFromFeed": "Hide from Feed",
"unsubscribeHint": "Unsubscribe from this channel on YouTube (changes your real account). Read-only mode hides this — use Hide instead.",
"unsubscribeOnYoutube": "Unsubscribe on YouTube",
"thisChannel": "This channel"
"thisChannel": "This channel",
"menu": "Channel actions"
},
"notify": {
"synced": "Synced {{count}} subscriptions",
@@ -131,7 +131,8 @@
"connect": "Connect",
"filteredByTag": "Feed filtered by tag: {{name}}",
"resetDone": "{{name}} reset — re-fetching now",
"resetFailed": "Couldn't reset this channel"
"resetFailed": "Couldn't reset this channel",
"hidden": "“{{name}}” hidden from your Feed"
},
"confirmUnsubscribe": "Unsubscribe from \"{{name}}\" on YouTube? This changes your real YouTube account. To just remove it from your Feed, hide it instead.",
"confirmReset": "Re-fetch \"{{name}}\" from scratch? This re-runs its backfill (recent + full history) and spends some API quota.",
+8 -2
View File
@@ -326,8 +326,14 @@
"renameFailed": "Couldn't rename the playlist.",
"deleteFailed": "Couldn't delete the playlist.",
"reorderFailed": "Couldn't save the new order.",
"removeItem": "Remove “{{title}}” from the playlist",
"reorderItem": "Move “{{title}}”"
"reorderItem": "Move “{{title}}”",
"rowMenu": "Item actions",
"menu": "Playlist actions",
"playShow": "Play the show",
"playSeason": "Play the season",
"removeFromPlaylist": "Remove from the playlist",
"removedToast": "“{{title}}” removed from the playlist",
"undoRemoveFailed": "Couldn't put it back in the playlist."
},
"people": {
"count_one": "{{count}} title",
+1 -1
View File
@@ -45,7 +45,7 @@
"sound": "Sound on alerts",
"soundHint": "Play a short tone when a notification needs your attention (e.g. errors, prompts).",
"autoDismiss": "Auto-dismiss toasts",
"autoDismissHint": "When off, pop-up toasts stay until you close them. When on, they fade after the set time.",
"autoDismissHint": "When off, pop-up toasts stay until you close them. When on, they fade after the set time; one with a button (Undo) stays at least 8 seconds.",
"dismissAfter": "Dismiss after",
"sendTest": "Send a test notification",
"testTitle": "Test notification",
+7 -6
View File
@@ -107,18 +107,18 @@
"fullySynced": "teljesen szinkronban",
"fullySyncedHint": "A legutóbbi feltöltések és a teljes archívum is megvan.",
"backfillThis": "Csatorna teljes letöltése",
"backfillThisHint": "A csatorna teljes archívumának letöltése (régebbi videók + teljes keresés). Újra kattintva visszavonod a kérést.",
"backfillThisHint": "A csatorna teljes archívumának letöltése (régebbi videók + teljes keresés).",
"resetBackfill": "Csatorna resetelése és újraletöltése",
"cancelBackfill": "A teljes letöltés kérésének visszavonása",
"resetHint": "Admin: a csatorna teljes újraletöltése a nulláról (legutóbbi + teljes archívum), a jelenlegi szinkron-állapottól függetlenül.",
"queuedRequestedHint": "Teljes előzmény kérve — a csatorna teljes archívuma letöltődik, ahogy a megosztott kvóta engedi. Kattints a kérés visszavonásához.",
"queuedRequestedHint": "Teljes előzmény kérve — a csatorna teljes archívuma letöltődik, ahogy a megosztott kvóta engedi.",
"queuedByOtherHint": "Egy másik feliratkozó már kérte ennek a csatornának a teljes előzményét, így a teljes archívuma már úton van mindenkihez — itt nincs teendőd.",
"hiddenHint": "Elrejtve — a csatorna videói nem jelennek meg a Feededben. Kattints, hogy újra láthatóak legyenek.",
"hideHint": "A csatorna videóinak elrejtése a Feededből. Feliratkozva marad; ez nem iratkoztat le a YouTube-on.",
"unhide": "Megjelenítés",
"hideFromFeed": "Elrejtés a Feedből",
"unsubscribeHint": "Leiratkozás erről a csatornáról a YouTube-on (megváltoztatja a valódi fiókodat). Csak olvasható módban ez rejtve van — használd helyette az Elrejtést.",
"unsubscribeOnYoutube": "Leiratkozás a YouTube-on",
"thisChannel": "Ez a csatorna"
"thisChannel": "Ez a csatorna",
"menu": "Csatorna műveletei"
},
"notify": {
"synced": "{{count}} feliratkozás szinkronizálva",
@@ -131,7 +131,8 @@
"connect": "Csatlakoztatás",
"filteredByTag": "Feed szűrve címkére: {{name}}",
"resetDone": "{{name}} resetelve — újraletöltés folyamatban",
"resetFailed": "Nem sikerült resetelni a csatornát"
"resetFailed": "Nem sikerült resetelni a csatornát",
"hidden": "„{{name}}” elrejtve a Feedből"
},
"confirmUnsubscribe": "Leiratkozol a(z) „{{name}}” csatornáról a YouTube-on? Ez megváltoztatja a valódi YouTube-fiókodat. Ha csak a Feededből szeretnéd eltávolítani, inkább rejtsd el.",
"confirmReset": "Újraletöltöd a(z) „{{name}}” csatornát a nulláról? Ez újrafuttatja a backfillt (legutóbbi + teljes előzmény), és némi API-kvótát fogyaszt.",
+8 -2
View File
@@ -326,8 +326,14 @@
"renameFailed": "Nem sikerült átnevezni a lejátszási listát.",
"deleteFailed": "Nem sikerült törölni a lejátszási listát.",
"reorderFailed": "Nem sikerült menteni az új sorrendet.",
"removeItem": "„{{title}}” eltávolítása a listáról",
"reorderItem": "„{{title}}” áthelyezése"
"reorderItem": "„{{title}}” áthelyezése",
"rowMenu": "Elem műveletei",
"menu": "Lista műveletei",
"playShow": "Sorozat lejátszása",
"playSeason": "Évad lejátszása",
"removeFromPlaylist": "Eltávolítás a listáról",
"removedToast": "„{{title}}” eltávolítva a listáról",
"undoRemoveFailed": "Nem sikerült visszatenni a listára."
},
"people": {
"count_one": "{{count}} cím",
+1 -1
View File
@@ -45,7 +45,7 @@
"sound": "Hang riasztásoknál",
"soundHint": "Rövid hangjelzés, ha egy értesítés a figyelmedet igényli (pl. hibák, kérdések).",
"autoDismiss": "Buborékok automatikus eltüntetése",
"autoDismissHint": "Kikapcsolva a felugró buborékok addig maradnak, amíg be nem zárod őket. Bekapcsolva a beállított idő után elhalványulnak.",
"autoDismissHint": "Kikapcsolva a felugró buborékok addig maradnak, amíg be nem zárod őket. Bekapcsolva a beállított idő után elhalványulnak; a gombos (Visszavonás) legalább 8 másodpercig marad.",
"dismissAfter": "Eltüntetés ennyi után",
"sendTest": "Tesztértesítés küldése",
"testTitle": "Tesztértesítés",