46 lines
2.3 KiB
TypeScript
46 lines
2.3 KiB
TypeScript
/* ═══════════════════════════════════════════════════════════════
|
|
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<string, { label: string; plural: string }>(
|
|
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 ?? '')
|