Voeg CMS voor de Publieke Website toe (overgenomen van rikx-org)

Pagina-editor, hoofdmenu, SEO en media onder Publieke Website → Pagina's
(/website), los van het CMS in rikx-org: eigen tabellen in de beheerdatabase.
Blokken (hero, tekstblok, testimonial, voordelenlijst, call-to-action) met
Quill, NL/EN/DE met terugval op NL, en afbeeldingsupload naar MEDIA_DIR met
een openbare /media-route (CSP-sandbox).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 15:27:12 +02:00
parent f9e4a1aa5d
commit 9be692974e
19 changed files with 2505 additions and 87 deletions
+43
View File
@@ -117,6 +117,49 @@ function migrate(db: DatabaseSync) {
addColumnIfMissing(db, "projects", "impactmaker_account_id", "INTEGER");
addColumnIfMissing(db, "projects", "ronde_id", "INTEGER REFERENCES rikx_rondes(id) ON DELETE SET NULL");
db.exec("CREATE INDEX IF NOT EXISTS idx_projects_ronde ON projects(ronde_id)");
// Publieke Website (CMS), overgenomen van rikx-org; functies in lib/cms.ts.
// NL staat in pages/content_blocks zelf, EN/DE in de *_translations-tabellen.
db.exec(`
CREATE TABLE IF NOT EXISTS pages (
slug TEXT PRIMARY KEY,
meta_title TEXT NOT NULL DEFAULT '',
meta_description TEXT NOT NULL DEFAULT '',
og_image TEXT,
canonical_url TEXT,
noindex INTEGER NOT NULL DEFAULT 0,
nav_label TEXT,
nav_order INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS content_blocks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
page_slug TEXT NOT NULL REFERENCES pages(slug) ON DELETE CASCADE,
block_key TEXT NOT NULL,
type TEXT NOT NULL CHECK (type IN ('hero','richtext','testimonial','benefits','cta')),
label TEXT NOT NULL,
content TEXT NOT NULL DEFAULT '{}',
sort_order INTEGER NOT NULL DEFAULT 0,
UNIQUE (page_slug, block_key)
);
CREATE TABLE IF NOT EXISTS page_translations (
page_slug TEXT NOT NULL REFERENCES pages(slug) ON DELETE CASCADE,
lang TEXT NOT NULL CHECK (lang IN ('en','de')),
meta_title TEXT NOT NULL DEFAULT '',
meta_description TEXT NOT NULL DEFAULT '',
nav_label TEXT NOT NULL DEFAULT '',
PRIMARY KEY (page_slug, lang)
);
CREATE TABLE IF NOT EXISTS block_translations (
block_id INTEGER NOT NULL REFERENCES content_blocks(id) ON DELETE CASCADE,
lang TEXT NOT NULL CHECK (lang IN ('en','de')),
content TEXT NOT NULL DEFAULT '{}',
PRIMARY KEY (block_id, lang)
);
`);
}
function addColumnIfMissing(db: DatabaseSync, table: string, column: string, definition: string) {