Add curator Movement links config with proof URLs and admin-gated delete votes.

Persist lineage in PostgreSQL, seed documented edges, and keep timeline/tree consumers API-backed with a static fallback.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Danila KhodjaefandCursor committed 2026-09-08 14:37:20 +03:00
1 parent 2b4cdc5a9f
commit 1b760faf0d
36 files changed
+2051 -43

No files matched your search

+1
View File
@@ -15,6 +15,7 @@
"checkup": "Checkup",
"translations": "Translations",
"influences": "Influences",
"movementLinks": "Movement links",
"tours": "Tours",
"toursEditor": "Tour editor",
"users": "Users",
+1
View File
@@ -1,6 +1,7 @@
{
"title": "Influence links",
"back": "← Back to gallery",
"openMovementLinks": "Movement links →",
"tabList": "List",
"tabImport": "Import",
"tabGraph": "Graph",
+52
View File
@@ -0,0 +1,52 @@
{
"title": "Movement links",
"back": "← Back to gallery",
"intro": "Predecessor → successor edges used by the timeline flow and Tree of Art. Every link needs a proof URL (museum essay, literature, or other web reference).",
"introCurator": "Curators can vote to delete a link and must give a reason. Only an admin can perform the final delete after reviewing votes.",
"introAdmin": "As admin you can delete links directly. Review curator delete votes (reasons) before confirming.",
"loadFailed": "Failed to load movement links",
"saveFailed": "Failed to save movement link",
"deleteFailed": "Failed to delete movement link",
"voteFailed": "Failed to cast delete vote",
"withdrawFailed": "Failed to withdraw vote",
"searchPlaceholder": "Search source, target, proof…",
"refresh": "Refresh",
"loading": "Loading…",
"loadingVotes": "Loading votes…",
"votesLoadFailed": "Could not load votes.",
"total": "{{count}} links",
"noLinks": "No movement links yet.",
"addLink": "Add link",
"cancelAdd": "Cancel",
"addTitle": "New movement link",
"source": "Source (from)",
"target": "Target (to)",
"pickMovement": "Select movement…",
"proofUrl": "Proof URL",
"proofLabel": "Proof label",
"proofLabelPlaceholder": "e.g. Met — Cubism",
"linkYear": "Link date ≈",
"linkYearPlaceholder": "e.g. 1907",
"notes": "Notes",
"saveLink": "Save link",
"saving": "Saving…",
"addRequiresMovements": "Pick both source and target movements",
"proofRequired": "Proof URL is required",
"voteTitle": "Vote to delete",
"voteReason": "Reason",
"voteReasonPlaceholder": "Explain why this link should be removed (min. 10 characters)…",
"voteReasonRequired": "Reason must be at least 10 characters",
"submitVote": "Submit vote",
"cancelVote": "Cancel",
"voteDelete": "Vote to delete",
"withdrawVote": "Withdraw vote",
"voteCount": "{{count}} vote(s)",
"colSource": "Source",
"colTarget": "Target",
"colYear": "Link date ≈",
"colProof": "Reference / proof",
"colVotes": "Delete votes",
"colActions": "Actions",
"delete": "Delete",
"confirmDelete": "Delete this movement link? Curator vote reasons will be recorded in the audit log."
}
+1 -1
View File
@@ -25,7 +25,7 @@
"perm_checkup": "Checkup",
"perm_curator_notes": "Curator notes",
"perm_translations": "Translations",
"perm_influences": "Influences",
"perm_influences": "Influences & movement links",
"perm_tours": "Tours",
"perm_users": "Users",
"adminAllPerms": "Admins have all permissions automatically.",