fix(playlists): what the first review of bulk actions found

An Esc during a pointer drag is spent on the drag and leaves the selection.
A wheel over the rail re-reads the target each frame, so a drop lands on the
row under the pointer. After a bulk removal the focus goes to the next row
left, and to the list's menu when the list is emptied.

remove-bulk names the videos that went, and its Undo brings back only those.
An Undo of a move keeps each row (and when it was saved), leaves out a video
that moved on from the target, closes up its place, and says how many came
back. Delete with every tick hidden removes nothing and says why. A list gone
before the lock answers 404, and a body without its videos 422.

One removal path now: the single row goes through the bulk one, the same
toast and undo, which also retires the add-at-position route. railDrop reuses
the store and scrollParent, the drag image the overlay and the z-index token,
and the sensors keep their number. The count is read out from a region that
outlives the band. Tests fill the gaps the review named, each seen failing.
This commit is contained in:
2026-11-02 03:41:08 +01:00
parent d09b5d6abb
commit 1a1e9d9542
24 changed files with 1168 additions and 379 deletions
+1 -1
View File
@@ -35,7 +35,7 @@
"listStep": "Next / previous item",
"gridMove": "Move around the list",
"open": "Open the current item",
"listRemove": "Remove the selected rows, or else the current one",
"listRemove": "Remove from the list",
"listSelect": "Select or deselect the current item",
"listClearSelection": "Clear the selection",
"cap": {
@@ -117,6 +117,15 @@
"removedManyToast_other": "{{count}} videos removed from the playlist",
"moveNoneLeft": "Nothing moved: they aren’t in this playlist any more",
"removeNoneLeft": "Nothing removed: they aren’t in this playlist any more",
"selectionCleared": "Selection cleared",
"removeAllHidden": "The selected rows are hidden by the filter",
"undoNoneBack": "Nothing came back: those videos aren’t where they were any more",
"undoSomeBack_one": "Only {{count}} video came back: the rest aren’t where they were any more",
"undoSomeBack_other": "Only {{count}} videos came back: the rest aren’t where they were any more",
"dragCancelledMany_one": "Move cancelled; {{count}} video stays where it was",
"dragCancelledMany_other": "Move cancelled; {{count}} videos stay where they were",
"moveTargetsFailed": "Your playlists couldn’t be loaded",
"moveTargetsLoading": "Loading your playlists…",
"moveManyFailed": "Couldn't move the videos",
"removeManyFailed": "Couldn't remove the videos",
"undoMoveFailed": "Couldn't move the video back",
+2 -2
View File
@@ -35,8 +35,8 @@
"listStep": "Következő / előző elem",
"gridMove": "Mozgás a listában",
"open": "Az aktuális elem megnyitása",
"listRemove": "A kijelölt sorok, vagy az aktuális eltávolítása",
"listSelect": "Az aktuális elem kijelölése vagy levétele",
"listRemove": "Eltávolítás a listából",
"listSelect": "Az aktuális elem kijelölése, vagy a kijelölés törlése",
"listClearSelection": "A kijelölés törlése",
"cap": {
"space": "Szóköz",
@@ -117,6 +117,15 @@
"removedManyToast_other": "{{count}} videó eltávolítva a listáról",
"moveNoneLeft": "Nem történt áthelyezés: ezek már nincsenek ebben a listában",
"removeNoneLeft": "Nem történt eltávolítás: ezek már nincsenek ebben a listában",
"selectionCleared": "Kijelölés törölve",
"removeAllHidden": "A kijelölt sorokat a szűrő elrejti",
"undoNoneBack": "Semmi nem került vissza: ezek a videók már nincsenek ott, ahol voltak",
"undoSomeBack_one": "Csak {{count}} videó került vissza: a többi már nincs ott, ahol volt",
"undoSomeBack_other": "Csak {{count}} videó került vissza: a többi már nincs ott, ahol volt",
"dragCancelledMany_one": "Áthelyezés megszakítva; {{count}} videó a helyén marad",
"dragCancelledMany_other": "Áthelyezés megszakítva; {{count}} videó a helyén marad",
"moveTargetsFailed": "Nem sikerült betölteni a listáidat",
"moveTargetsLoading": "A listáid betöltése…",
"moveManyFailed": "Nem sikerült áthelyezni a videókat",
"removeManyFailed": "Nem sikerült eltávolítani a videókat",
"undoMoveFailed": "Nem sikerült visszahelyezni a videót",