/* ═══════════════════════════════════════════════════════════════ EVENT TYPES The client half of the CHECK on events.event_type. Order here is display order — the filter chips read it straight off this array, so moving a line moves a chip. What this is not: event_sections. A section owns presentation — Retreats.tsx keys its title, accent and background on the id, so an unrecognised section_id makes an event vanish with no error, which is why that one is a real table with a real foreign key. A type carries no presentation of its own and an unknown value renders as its own name, so a CHECK is enough. Adding a type is three edits: the CHECK in a migration, the enum in both descriptor halves, and this list. Adding it here alone means the site offers a filter the database will refuse to store. ═══════════════════════════════════════════════════════════════ */ export type EventType = 'retreat' | 'class' | 'workshop' | 'meeting' | 'other' export const EVENT_TYPES: { id: EventType; label: string; plural: string }[] = [ { id: 'retreat', label: 'Retreat', plural: 'Retreats' }, { id: 'class', label: 'Class', plural: 'Classes' }, { id: 'workshop', label: 'Workshop', plural: 'Workshops' }, { id: 'meeting', label: 'Meeting', plural: 'Meetings' }, { id: 'other', label: 'Other', plural: 'Other' }, ] export const EVENT_TYPE_IDS: EventType[] = EVENT_TYPES.map((entry) => entry.id) const BY_ID = new Map( EVENT_TYPES.map((entry) => [entry.id as string, entry]), ) const capitalize = (word: string) => word ? word.charAt(0).toUpperCase() + word.slice(1) : '' /* A value the CHECK has gained since this file was written renders as itself rather than vanishing — the same rule EventDetail's ROLE_ORDER follows for billing roles. */ export const eventTypeLabel = (id?: string | null): string => (id ? BY_ID.get(id)?.label : null) ?? capitalize(id ?? '') export const eventTypePlural = (id?: string | null): string => (id ? BY_ID.get(id)?.plural : null) ?? capitalize(id ?? '')