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>
Renames every .js module under src/ to .ts (api, useResource,
adminSchema, navConfig, adminNav and src/data/*) and points imports,
comments and the seed script's module paths at the new names. Their
types now come from inference; no .d.ts files and no shape
interfaces.
tsc stays strict (noImplicitAny off). The errors inference leaves
behind get the lightest fix that clears them: `any` on empty state,
contexts and list defaults, `: any` on components with optional or
spread props, class fields on ApiError, and option shapes on
get/useResource.
Kept as real types, since they belong to modules that were already
TypeScript and later features import them: PageShell's ShellSection
and props, useContent's corrected record types (website/email/
instagram are bare strings) and EventListItem, and TimelineRef's
orgKind.
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>