The column sort and the filters are a VIEW; the playlist's stored order only changes when the user presses "Save this order", which still goes through the undoable path. Picking a sort used to write straight to the server, so merely looking at the list by title rewrote the playlist and marked a YouTube-linked mirror dirty. The table: - playlistColumns.tsx holds the column defs; the body renders them as table rows and fills the grip cell itself, since the handle needs the row's sortable listeners that a render closure can't reach. - The # column shows the STORED position, so a view-sort never renumbers the playlist under the reader. - Saving is withheld while a filter is active (it would drop the hidden items), and drag is disabled under any view, with the reason spelled out rather than silently doing nothing. - applyView/sameOrder live in lib/playlistView.ts with tests: the sort and the channel grouping compose, and getting that wrong produces a plausible order that the save button would then persist. - dnd-kit KeyboardSensor: the grip was focusable and called itself "reorder", but only a pointer could move it. The guards: - Delete is ONE dialog with every outcome. It was two chained confirms where the second one's Cancel/Escape/backdrop meant "delete here only" — dismissing the dialog deleted the playlist. ConfirmProvider gained useChoice() for it. - ConfirmProvider focuses Cancel when an offered action is destructive; the confirm button took autoFocus unconditionally, so a stray Enter on an open dialog ran "Delete user" or "Clear audit log". - Removing an item asks first, and rebases the undo history instead of throwing it away: useUndoable.rebase maps every snapshot, so the reorder history stays valid for the remaining items. - A failed detail query showed "Loading…" forever; it now says so and offers a retry. Rename and reorder failures are surfaced instead of swallowed (reorder was a bare .then(), which also produced an unhandled rejection). - Local reorder/remove no longer require YouTube write scope. - playlistName() replaces the watch-later localizer copied into three files.
23 lines
890 B
JSON
23 lines
890 B
JSON
{
|
|
"privacyPolicy": "Adatvédelmi irányelvek",
|
|
"termsOfService": "Felhasználási feltételek",
|
|
"sourceCode": "Forráskód",
|
|
"close": "Bezárás",
|
|
"cancel": "Mégse",
|
|
"confirm": "Megerősítés",
|
|
"confirmTitle": "Biztos vagy benne?",
|
|
"save": "Mentés",
|
|
"undo": "Visszavonás",
|
|
"redo": "Újra",
|
|
"loading": "Betöltés…",
|
|
"language": "Nyelv",
|
|
"somethingWrong": "Hiba történt.",
|
|
"accessRequestsTitle": "Hozzáférési kérések",
|
|
"accessRequestsMessage": "{{count}} függőben — nézd át a Felhasználók oldalon.",
|
|
"accessRequestsReview": "Áttekintés",
|
|
"demoTitle": "Demo fiók",
|
|
"demoSharedNotice": "Egy közös demo fiókban vagy. Minden, amit itt csinálsz — lejátszási listák, elrejtett videók, beállítások — közös, és más demo látogatók egyszerre módosíthatják.",
|
|
"backToTop": "Vissza a tetejére",
|
|
"retry": "Újra"
|
|
}
|