tree: several nodes picked up and moved at once

m now adds the row under the cursor to a set of marks and steps on, so
mmm picks up three; M takes the whole folder, Esc or :unmark puts it all
back. Marks stay while the list walks, so they can be gathered from
several folders. p, :mv and Shift+digit move the whole set.

With a pointer, Ctrl- or Cmd-click marks a row and Shift-click every row
from the cursor to it. Rows drag onto a folder row, a crumb or a space
pill; a marked row carries every marked node with it.

POST /api/nodes/move takes { ids, parent_id } and moves them all or
none: every node is checked before any moves, sealing into a sealed
folder happens before the one transaction that moves them, and two of a
name get slugs of their own. The single move goes the same way.
This commit is contained in:
nvrl committed 2026-10-20 11:13:52 +02:00
1 parent b19fb21fc4
commit 6bf88e7ffd
15 files changed
+407 -111

No files matched your search

+2
View File
@@ -119,6 +119,8 @@ a.button { display: inline-flex; align-items: center; justify-content: center; t
:is(button, a.button):hover { background: var(--surface-alt); color: var(--light); border-color: var(--outline); }
:is(button, a.button):active { transform: translateY(1px); }
:is(button, a.button):focus-visible { background: var(--light); color: var(--ink); border-color: var(--light); outline: none; }
/* A folder, crumb or space that rows dragged from the list would land in. */
.carry-over { outline: 1px dashed var(--light); outline-offset: -1px; border-radius: var(--radius-s); }
button:disabled { color: var(--muted); cursor: default; }
input, textarea {