v1.5 - history and timeline as well as many datastructure updates added, polished, fixes
This commit is contained in:
parent
1f0aa3078f
commit
1d84400aef
63 changed files with 7927 additions and 208 deletions
46
src/lib/eventTypes.ts
Normal file
46
src/lib/eventTypes.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/* ═══════════════════════════════════════════════════════════════
|
||||
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 ?? '')
|
||||
Loading…
Add table
Add a link
Reference in a new issue