The home page is rebuilt from scratch and configured from a new Front page tab in the admin, backed by migration 017 and served by GET /api/front-page. Hero: brand, photos (crossfading slideshow with progress and pause) or livestream (YouTube/Facebook/Vimeo embed with a LIVE badge), switched by hand. After it, bands the admin can reorder, retitle or hide: a countdown to the next event (series-aware), the National Retreats carousel, a numbers band (typed in or counted from the database), a horizontal rail of featured timeline entries, and a "Find your way in" pathfinder replacing the old connect section. The CRUD engine gains a `singleton` flag: the entity has one row, made by its migration, and create and delete are refused. The list screen opens that row and the editor drops the slug, back link and delete. shapeSeries moves to shape.js so /front-page can share it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
16 lines
891 B
SQL
16 lines
891 B
SQL
-- ═══════════════════════════════════════════════════════════════
|
|
-- FRONT PAGE updated_at
|
|
--
|
|
-- Same rule as the other touch triggers in 002: an UPDATE that
|
|
-- doesn't set updated_at itself gets it set, which is what the
|
|
-- admin engine's optimistic concurrency compares against. On its
|
|
-- own because the migration runner may drop anything that follows
|
|
-- a BEGIN...END body.
|
|
-- ═══════════════════════════════════════════════════════════════
|
|
|
|
CREATE TRIGGER front_page_touch
|
|
AFTER UPDATE ON front_page
|
|
FOR EACH ROW WHEN new.updated_at = old.updated_at
|
|
BEGIN
|
|
UPDATE front_page SET updated_at = datetime('now') WHERE id = new.id;
|
|
END;
|