Migrations 020–023, with the code that reads each:
- 020 drops people_lists, people_list_members, v_chapters and
v_person_affiliations. Nothing queried any of them.
- 021 renames event_sections to event_scopes and events.section_id
to scope_id, finishing what 015 described. The API sends `scopes`
and `scope_id`, and useEvents, EventListCards and EventCalendar
take `scope`. It also inserts national/regional/partner, which only
the retired seed ever created: a database built from migrations
alone had no scope for the Retreats bands.
- 022 drops events.sort_order and people.sort_order. Events now sort
by date (upcoming soonest first, past latest first, undated last)
on /events, org pages and the countdown. People were only ever
sorted by sort_name on the site. Every other sort_order stays.
- 023 rebuilds teams with created_at and updated_at plus a touch
trigger, so the teams editor gets the same optimistic concurrency
as the other entities.
Awards can be drafted: is_published (added in 011) is on both
descriptor halves with a Publishing group, and the award list, award
page, org awards and event awards leave drafts out.
The migration runner now turns foreign keys off around the per-file
transactions and runs foreign_key_check before each commit. PRAGMA
foreign_keys is a no-op inside a transaction, so 009's warning was
right and a rebuild of a referenced table (023) couldn't be written
otherwise. CLAUDE.md is updated to match.
Also removes the stray src/App.tsx.save.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EventCalendar shows events on a month grid or as a list of the
month. Multi-day events are lane-packed bars that break at week
edges, series events appear on every meeting with their time, and
clicking a day lists everything on it. Phones get the list. Visitors
can narrow by scope, type, online only and search, all starting at
"all"; a page can pin section, host or type through props, which
hides that control.
Migration 019 rebuilds front_page_sections to allow a 'calendar'
band and slots it in after the retreats carousel, so it can be
reordered, retitled or hidden from the Front page editor.
useEvents drops its empty fallback so a failed request surfaces as
an error rather than an empty list, and returns the scope list
alongside the events for the calendar's scope filter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
A Series checkbox under When opens a panel for the schedule:
weekly on chosen weekdays, monthly by date, or monthly by weekday
position, every N weeks or months, with meeting times and an
optional meeting count. starts_on anchors the schedule and ends_on
bounds it, so effective_status needs no change.
Occurrences are derived, not stored. src/lib/eventSeries.ts builds
the schedule label shown on cards and the event page, and the
upcoming dates listed on the event page.
Migration 016 adds the columns; the CRUD engine gains a time type.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>