feat(17-02): tree reorder page and singleton form in the admin

- ReorderView: indented tree with drag handle, move up/down, outdent and
  indent (buttons and arrow keys on the handle), pointer drag before, after
  or inside a row and never into its own subtree; one POST with the whole
  node set 400 ms after the last move, flushed on leave; a failed save
  restores the saved tree, a 409 reloads; loading, empty, load-failure and
  403 states; partition selector
- ListView: outline Reorder button before New record, passing the filtered
  partition
- SettingsIndexView opens a singleton controller's record through
  GET …/singleton; FormView in singleton mode has no Delete and returns to
  the settings index
- reorder.* and messages.list.reorder phrase keys (en, pl), smoke spec, docs
This commit is contained in:
2026-10-12 16:18:31 +02:00
parent 204149ccd2
commit 872fd6535f
15 changed files with 1092 additions and 19 deletions

View File

@@ -181,6 +181,7 @@ messages:
one: ":count record"
other: ":count records"
create: New record
reorder: Reorder records
empty_search: Nothing found
empty_search_hint: No record matches “:term”. Try another search.
selected: ":count selected"
@@ -381,3 +382,17 @@ repeater:
reorder:
stale: The records changed in the meantime. The list has been reloaded.
load_failed: The records could not be loaded. Refresh the page to try again.
failed: The new order could not be saved. The previous order is back.
saved: Order saved
empty: There is nothing to reorder yet
empty_hint: Add records first, then come back to set their order.
untitled: "Untitled (#:id)"
tree: Order of records
move: "Move: :name"
move_up: "Move up: :name"
move_down: "Move down: :name"
indent: "Move inside the previous item: :name"
outdent: "Move out one level: :name"
moved: ":name moved to position :position of :total."
nested: ":name is now inside :parent."
unnested: ":name moved out to level :level."

View File

@@ -195,6 +195,7 @@ messages:
many: ":count rekordów"
other: ":count rekordu"
create: Nowy rekord
reorder: Zmień kolejność rekordów
empty_search: Nic nie znaleziono
empty_search_hint: Żaden rekord nie pasuje do frazy „:term”. Spróbuj innej frazy.
selected: "Zaznaczono :count"
@@ -409,3 +410,17 @@ repeater:
reorder:
stale: Rekordy zmieniły się w międzyczasie. Lista została wczytana ponownie.
load_failed: Nie udało się wczytać rekordów. Odśwież stronę, aby spróbować ponownie.
failed: Nie udało się zapisać nowej kolejności. Przywrócono poprzednią.
saved: Zapisano kolejność
empty: Nie ma jeszcze czego porządkować
empty_hint: Najpierw dodaj rekordy, a potem wróć tutaj, aby ustalić ich kolejność.
untitled: "Bez tytułu (#:id)"
tree: Kolejność rekordów
move: "Przenieś: :name"
move_up: "Przenieś wyżej: :name"
move_down: "Przenieś niżej: :name"
indent: "Przenieś do poprzedniej pozycji: :name"
outdent: "Przenieś poziom wyżej: :name"
moved: "Przeniesiono :name na pozycję :position z :total."
nested: ":name jest teraz wewnątrz :parent."
unnested: "Przeniesiono :name na poziom :level."