All checks were successful
CD / Build and push images (push) Successful in 3m1s
CI / Lint, typecheck, test (push) Successful in 2m13s
CI / Auth e2e pack (push) Successful in 2m36s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 9s
CD / Smoke tests against Test (push) Successful in 1m13s
CD / Promote to Int (push) Successful in 11s
Enable the third sidebar sort mode — a freely defined order. - api: `PATCH /pages/:id/position` (before/after neighbour) recomputes only the moved page's fractional `sort_key`. Pure `sort-key.ts` helpers (`nextKeyOrRebalance`, `evenlySpacedKeys`) decide between the cheap single-key path and a full pond rebalance to evenly-spaced keys when a key would exceed MAX_SORT_KEY_LENGTH or the client's neighbours are stale; rebalance runs in one transaction. Order is server-authoritative. - web: enable 'manual' in the sort-mode switch; in manual mode the owner can reorder via native drag-and-drop (drop above/below by pointer half) or the keyboard (per-row up/down buttons), each announced through an aria-live region. Reordering is hidden while a label filter narrows the list. New pages already append at the end (create uses generateKeyBetween(last, null)). Pure `reorder.ts` neighbour helpers, unit-tested. - i18n: manual sort mode + reorder strings (de + en). - tests: sort-key property test (10.000 adversarial reorders never collide or overflow — rebalance verified); reposition db test (persist, server-order, sort-mode switch keeps manual order); reorder e2e pack (keyboard reorder persists across reload + identical on a fresh read; aria-live announced). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PGdhRiwU1WRL4XxJfZYipY
52 lines
1.3 KiB
JSON
52 lines
1.3 KiB
JSON
{
|
||
"layout": {
|
||
"sidebar": {
|
||
"expand": "Show sidebar",
|
||
"collapse": "Hide sidebar",
|
||
"label": "Pages",
|
||
"placeholder": "Your ponds and pages will appear here.",
|
||
"empty": "No pages yet.",
|
||
"sortLabel": "Sort pages",
|
||
"sortMode": {
|
||
"alpha": "A–Z",
|
||
"created": "Creation date",
|
||
"manual": "Manual order"
|
||
},
|
||
"reorder": {
|
||
"up": "Move up",
|
||
"down": "Move down",
|
||
"dragHint": "Drag to reorder",
|
||
"moved": "Moved {{title}} to position {{position}} of {{count}}."
|
||
},
|
||
"newPage": "+ New page",
|
||
"newPageTitle": "Title",
|
||
"create": "Create",
|
||
"cancel": "Cancel"
|
||
},
|
||
"pondSwitcher": {
|
||
"label": "Switch pond",
|
||
"trigger": "Select a pond"
|
||
},
|
||
"user": {
|
||
"anonymous": "Not signed in"
|
||
}
|
||
},
|
||
"pondHome": {
|
||
"empty": "This pond doesn't have any pages yet — create one from the sidebar."
|
||
},
|
||
"home": {
|
||
"title": "Welcome to Dorfteich",
|
||
"intro": "Dorfteich is an open-source wiki with real-time collaboration. This instance is being set up.",
|
||
"api": {
|
||
"checking": "Checking API …",
|
||
"ok": "API reachable",
|
||
"error": "API not reachable"
|
||
}
|
||
},
|
||
"notFound": {
|
||
"title": "Page not found",
|
||
"body": "The address you opened does not exist.",
|
||
"home": "Back to the start page"
|
||
}
|
||
}
|