@burdenoff/microfe-eventfullymanaged 2026.825.1 → 2026.828.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/eventfullymanaged/hooks/index.d.ts +1 -0
  2. package/dist/eventfullymanaged/hooks/index.d.ts.map +1 -1
  3. package/dist/eventfullymanaged/hooks/index.js +3 -0
  4. package/dist/eventfullymanaged/hooks/useEventDelete.d.ts +19 -0
  5. package/dist/eventfullymanaged/hooks/useEventDelete.d.ts.map +1 -0
  6. package/dist/eventfullymanaged/hooks/useEventDelete.js +16 -0
  7. package/dist/eventfullymanaged/hooks/useEventDelete.js.map +1 -0
  8. package/dist/eventfullymanaged/lib/format.d.ts +9 -0
  9. package/dist/eventfullymanaged/lib/format.d.ts.map +1 -1
  10. package/dist/eventfullymanaged/lib/format.js +11 -3
  11. package/dist/eventfullymanaged/lib/format.js.map +1 -1
  12. package/dist/eventfullymanaged/pages/events/EventDetailPage.d.ts.map +1 -1
  13. package/dist/eventfullymanaged/pages/events/EventDetailPage.js +315 -277
  14. package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -1
  16. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +91 -81
  17. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -1
  18. package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/EventsPage.js +231 -229
  20. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/NetworkingPage.d.ts.map +1 -1
  22. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +120 -102
  23. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  24. package/dist/eventfullymanaged/pages/modules/RegistrationPage.d.ts.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +128 -120
  26. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.d.ts.map +1 -1
  28. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +68 -75
  29. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -1
  30. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +41 -41
  31. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
  32. package/dist/eventfullymanaged/store/eventfullyManagedStore.js +15 -0
  33. package/dist/eventfullymanaged/store/eventfullyManagedStore.js.map +1 -0
  34. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EventDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/EventDetailPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n ArrowLeft,\n CalendarClock,\n Clock,\n Edit,\n Eye,\n MapPin,\n Mic2,\n Plus,\n Ticket as TicketIcon,\n Users,\n Video,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n IllustratedEmptyState,\n Skeleton,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\n\nimport {\n useDeleteEventSessionMutation,\n useDeleteSpeakerMutation,\n useDeleteTicketTypeMutation,\n useEventQuery,\n useSpeakersQuery,\n useTicketTypesQuery,\n useVenuesQuery,\n type TicketTypeGql,\n} from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { CHART_COLORS } from '../../components/EventCharts';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { notify } from '../../lib/toast';\nimport { formatDateTime } from './eventFormUtils';\n\nfunction statusVariant(status: string): 'success' | 'warning' | 'secondary' | 'info' {\n const value = status.toLowerCase();\n if (['active', 'published', 'live', 'confirmed', 'completed', 'approved'].includes(value)) {\n return 'success';\n }\n if (['inactive', 'cancelled', 'archived', 'closed', 'expired'].includes(value)) {\n return 'warning';\n }\n if (['draft', 'created', 'pending', 'scheduled'].includes(value)) {\n return 'info';\n }\n return 'secondary';\n}\n\nfunction formatDuration(startsAt: string, endsAt: string): string {\n const start = new Date(startsAt).getTime();\n const end = new Date(endsAt).getTime();\n if (Number.isNaN(start) || Number.isNaN(end) || end <= start) {\n return '';\n }\n const totalMinutes = Math.round((end - start) / 60000);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours && minutes) {\n return `${hours}h ${minutes}m`;\n }\n if (hours) {\n return `${hours}h`;\n }\n return `${minutes}m`;\n}\n\nfunction formatHour(hour: number): string {\n const period = hour < 12 ? 'AM' : 'PM';\n const display = hour % 12 === 0 ? 12 : hour % 12;\n return `${display}:00 ${period}`;\n}\n\nfunction formatClock(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n}\n\n// ---------------------------------------------------------------------------\n// Sessions tab — multi-track schedule grid.\n//\n// The shared EVENT_SESSIONS_QUERY omits `metadata` (which carries speakerId) and\n// `description`/`capacity`, so this tab owns a fuller read that selects them; the\n// grid resolves room names from venues and speaker names from speakers.\n// ---------------------------------------------------------------------------\n\nconst SCHEDULE_SESSIONS_QUERY = gql`\n query EventfullymanagedScheduleSessions($eventId: ID, $limit: Int, $offset: Int) {\n eventSessions: eventfullyManagedEventSessions(eventId: $eventId, limit: $limit, offset: $offset) {\n total\n items {\n id\n eventId\n venueId\n title\n sessionType\n track\n startsAt\n endsAt\n status\n metadata\n }\n }\n }\n`;\n\ntype ScheduleSession = {\n id: string;\n eventId: string;\n venueId?: string | null;\n title: string;\n sessionType: string;\n track?: string | null;\n startsAt: string;\n endsAt: string;\n status: string;\n metadata?: Record<string, unknown> | null;\n};\n\ntype ScheduleSessionsResponse = { eventSessions: { total: number; items: ScheduleSession[] } };\n\nconst UNTRACKED = 'General';\n\nfunction dayKey(iso: string): string {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? 'unknown' : date.toISOString().slice(0, 10);\n}\n\nfunction SessionBlock({\n session,\n color,\n speakerName,\n roomName,\n onEdit,\n onDelete,\n}: {\n session: ScheduleSession;\n color: string;\n speakerName?: string;\n roomName?: string;\n onEdit: () => void;\n onDelete: () => void | Promise<void>;\n}) {\n const duration = formatDuration(session.startsAt, session.endsAt);\n return (\n <div\n className=\"relative rounded-card border border-border-subtle p-3 shadow-elevation-1\"\n style={{\n borderLeftWidth: '3px',\n borderLeftColor: color,\n background: `color-mix(in srgb, ${color} 8%, var(--color-bg-surface))`,\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"min-w-0 pr-1 text-sm font-semibold leading-snug text-text-primary\">{session.title}</p>\n <div className=\"-mr-1 -mt-1 shrink-0\">\n <ActionMenu\n ariaLabel={`Session actions for ${session.title}`}\n entityName={session.title}\n deleteLabel=\"Delete session\"\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </div>\n </div>\n <dl className=\"mt-2 space-y-1 text-xs text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Mic2 className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span className=\"truncate\">{speakerName ?? 'Speaker TBD'}</span>\n </div>\n {roomName ? (\n <div className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span className=\"truncate\">{roomName}</span>\n </div>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span>\n {formatClock(session.startsAt)}\n {duration ? ` · ${duration}` : ''}\n </span>\n </div>\n </dl>\n </div>\n );\n}\n\nfunction SessionsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useQuery<\n ScheduleSessionsResponse,\n { eventId?: string; limit?: number; offset?: number }\n >(SCHEDULE_SESSIONS_QUERY, {\n variables: { eventId, limit: pagination.limit, offset: pagination.offset },\n });\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: speakersData } = useSpeakersQuery({ limit: 100, offset: 0 });\n const [deleteEventSession] = useDeleteEventSessionMutation();\n\n const total = data?.eventSessions?.total ?? 0;\n const rows = useMemo(() => data?.eventSessions?.items ?? [], [data]);\n\n const venueNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const venue of venuesData?.venues?.items ?? []) {\n map.set(venue.id, venue.name);\n }\n return map;\n }, [venuesData]);\n\n const speakerNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const speaker of speakersData?.speakers?.items ?? []) {\n map.set(speaker.id, speaker.fullName);\n }\n return map;\n }, [speakersData]);\n\n // Distinct tracks (ordered by first appearance) → stable colour per track.\n const trackColor = useMemo(() => {\n const map = new Map<string, string>();\n let index = 0;\n for (const session of rows) {\n const track = session.track?.trim() || UNTRACKED;\n if (!map.has(track)) {\n map.set(track, CHART_COLORS[index % CHART_COLORS.length]);\n index += 1;\n }\n }\n return map;\n }, [rows]);\n\n // Group sessions by day, then by track, keyed by the hour they start.\n const days = useMemo(() => {\n const byDay = new Map<string, ScheduleSession[]>();\n for (const session of [...rows].sort((a, b) => new Date(a.startsAt).getTime() - new Date(b.startsAt).getTime())) {\n const key = dayKey(session.startsAt);\n const list = byDay.get(key) ?? [];\n list.push(session);\n byDay.set(key, list);\n }\n return Array.from(byDay.entries()).map(([key, sessions]) => {\n const tracks = Array.from(new Set(sessions.map((s) => s.track?.trim() || UNTRACKED)));\n const hours = sessions.map((s) => new Date(s.startsAt).getHours()).filter((h) => !Number.isNaN(h));\n const minHour = hours.length ? Math.min(...hours) : 9;\n const maxHour = hours.length ? Math.max(...hours) : 17;\n const hourRange: number[] = [];\n for (let hour = minHour; hour <= maxHour; hour += 1) {\n hourRange.push(hour);\n }\n return { key, sessions, tracks, hourRange };\n });\n }, [rows]);\n\n const onDelete = async (session: ScheduleSession) => {\n const response = await deleteEventSession({ variables: { id: session.id } });\n if (response.error) {\n notify.error('Could not delete session', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteEventSession) {\n notify.error('Could not delete session', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Session deleted', session.title);\n await refetch();\n };\n\n const resolveSpeaker = (session: ScheduleSession): string | undefined => {\n const metadata = (session.metadata ?? {}) as Record<string, unknown>;\n const speakerId = typeof metadata.speakerId === 'string' ? metadata.speakerId : '';\n return speakerId ? speakerNameById.get(speakerId) : undefined;\n };\n const resolveRoom = (session: ScheduleSession): string | undefined =>\n session.venueId ? venueNameById.get(session.venueId) : undefined;\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Agenda &amp; Sessions</h2>\n <p className=\"text-sm text-text-secondary\">A multi-track schedule of everything happening on the day.</p>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/sessions/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Session\n </Button>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-64 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No sessions yet.\"\n description=\"Build the agenda by adding your first session.\"\n action={\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/sessions/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Session\n </Button>\n }\n className=\"py-10\"\n />\n ) : (\n <div className=\"space-y-8\">\n {days.map((day) => (\n <section key={day.key} className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {new Date(`${day.key}T00:00:00`).toLocaleDateString(undefined, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n })}\n </h3>\n\n {/* Desktop / tablet: multi-track grid */}\n <div className=\"hidden overflow-x-auto rounded-card border border-border-seam md:block\">\n <div\n className=\"grid min-w-max\"\n style={{ gridTemplateColumns: `88px repeat(${day.tracks.length}, minmax(200px, 1fr))` }}\n >\n {/* Header row */}\n <div className=\"sticky left-0 z-10 border-b border-border-seam bg-bg-sunken px-3 py-2.5\" />\n {day.tracks.map((track) => (\n <div\n key={track}\n className=\"border-b border-l border-border-seam bg-bg-sunken px-3 py-2.5 text-center text-sm font-semibold text-text-primary\"\n >\n <span className=\"inline-flex items-center gap-2\">\n <span\n className=\"h-2 w-2 rounded-full\"\n style={{ background: trackColor.get(track) }}\n aria-hidden=\"true\"\n />\n {track}\n </span>\n </div>\n ))}\n\n {/* Hour rows */}\n {day.hourRange.map((hour) => (\n <div key={hour} className=\"contents\">\n <div className=\"sticky left-0 z-10 border-b border-border-subtle bg-bg-surface px-3 py-3 text-xs font-medium text-text-muted\">\n {formatHour(hour)}\n </div>\n {day.tracks.map((track) => {\n const cellSessions = day.sessions.filter(\n (session) =>\n (session.track?.trim() || UNTRACKED) === track &&\n new Date(session.startsAt).getHours() === hour\n );\n return (\n <div\n key={`${hour}-${track}`}\n className=\"space-y-2 border-b border-l border-border-subtle p-2 align-top\"\n >\n {cellSessions.map((session) => (\n <SessionBlock\n key={session.id}\n session={session}\n color={trackColor.get(track) ?? CHART_COLORS[0]}\n speakerName={resolveSpeaker(session)}\n roomName={resolveRoom(session)}\n onEdit={() => navigate(`/events/${eventId}/sessions/${session.id}/edit`)}\n onDelete={() => onDelete(session)}\n />\n ))}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Mobile: clean time-ordered day list */}\n <ul className=\"space-y-2.5 md:hidden\">\n {day.sessions.map((session) => {\n const track = session.track?.trim() || UNTRACKED;\n return (\n <li key={session.id}>\n <SessionBlock\n session={session}\n color={trackColor.get(track) ?? CHART_COLORS[0]}\n speakerName={resolveSpeaker(session)}\n roomName={resolveRoom(session) ?? track}\n onEdit={() => navigate(`/events/${eventId}/sessions/${session.id}/edit`)}\n onDelete={() => onDelete(session)}\n />\n </li>\n );\n })}\n </ul>\n </section>\n ))}\n </div>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"sessions\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\ntype SpeakerRow = { id: string; fullName: string; title?: string | null; organization?: string | null };\n\nfunction SpeakersTab() {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useSpeakersQuery({ limit: pagination.limit, offset: pagination.offset });\n const [deleteSpeaker] = useDeleteSpeakerMutation();\n\n const total = data?.speakers?.total ?? 0;\n const rows = (data?.speakers?.items ?? []) as unknown as SpeakerRow[];\n\n const onDelete = async (speaker: SpeakerRow) => {\n const response = await deleteSpeaker({ variables: { id: speaker.id } });\n if (response.error) {\n notify.error('Could not delete speaker', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteSpeaker) {\n notify.error('Could not delete speaker', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Speaker deleted', speaker.fullName);\n await refetch();\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Speakers</h2>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate('/speakers')}>\n Manage speakers\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate('/speakers/create')}>\n <Plus className=\"h-4 w-4\" />\n New Speaker\n </Button>\n </div>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-40 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No speakers yet.\"\n description=\"Add speakers so you can assign them to sessions.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {rows.map((speaker) => (\n <li\n key={speaker.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-accent-wash text-sm font-semibold text-action-primary-bg\">\n {speaker.fullName.slice(0, 1).toUpperCase()}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{speaker.fullName}</p>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">\n {[speaker.title, speaker.organization].filter(Boolean).join(' • ') || 'Speaker'}\n </p>\n </div>\n </div>\n <ActionMenu\n ariaLabel={`Speaker actions for ${speaker.fullName}`}\n entityName={speaker.fullName}\n deleteLabel=\"Delete speaker\"\n onEdit={() => navigate(`/speakers/${speaker.id}/edit`)}\n onDelete={() => onDelete(speaker)}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"speakers\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nfunction TicketsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useTicketTypesQuery({\n eventId,\n limit: pagination.limit,\n offset: pagination.offset,\n });\n const [deleteTicketType] = useDeleteTicketTypeMutation();\n\n const total = data?.ticketTypes?.total ?? 0;\n const rows = (data?.ticketTypes?.items ?? []) as TicketTypeGql[];\n\n const onDelete = async (ticket: TicketTypeGql) => {\n const response = await deleteTicketType({ variables: { id: ticket.id } });\n if (response.error) {\n notify.error('Could not delete ticket type', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteTicketType) {\n notify.error('Could not delete ticket type', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Ticket type deleted');\n await refetch();\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Ticket Types</h2>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/tickets/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Ticket Type\n </Button>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-40 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No ticket types yet.\"\n description=\"Add a ticket type so attendees can register.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {rows.map((ticket) => {\n const hasCapacity = ticket.capacity != null && ticket.capacity > 0;\n const pct = hasCapacity\n ? Math.min(100, Math.round((ticket.soldCount / (ticket.capacity as number)) * 100))\n : 0;\n const nearlyFull = pct >= 90;\n return (\n <li\n key={ticket.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-4 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{ticket.name}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">\n {ticket.price} {ticket.currency}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant={ticket.isActive ? 'success' : 'warning'} className=\"uppercase\">\n {ticket.isActive ? 'Active' : 'Inactive'}\n </Badge>\n <ActionMenu\n ariaLabel={`Ticket actions for ${ticket.name}`}\n entityName={ticket.name}\n deleteLabel=\"Delete ticket type\"\n onEdit={() => navigate(`/events/${eventId}/tickets/${ticket.id}/edit`)}\n onDelete={() => onDelete(ticket)}\n />\n </div>\n </div>\n\n <div className=\"mt-3\">\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <span>\n <span className=\"font-medium tabular-nums text-text-primary\">\n {ticket.soldCount.toLocaleString()}\n </span>{' '}\n sold\n {hasCapacity ? (\n <> / {(ticket.capacity as number).toLocaleString()} capacity</>\n ) : (\n ' • unlimited capacity'\n )}\n </span>\n {hasCapacity ? (\n <span className={nearlyFull ? 'font-medium text-text-primary' : ''}>{pct}%</span>\n ) : null}\n </div>\n {hasCapacity ? (\n <div\n className=\"mt-1.5 h-2 overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${ticket.name} sold`}\n >\n <div\n className=\"h-full rounded-full transition-[width] duration-500\"\n style={{\n width: `${pct}%`,\n background: 'linear-gradient(90deg, var(--color-chart-1), var(--color-chart-2))',\n }}\n />\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"ticket types\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nfunction MetricTile({\n label,\n value,\n icon: Icon,\n}: {\n label: string;\n value: string;\n icon: React.ComponentType<{ className?: string }>;\n}) {\n return (\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-button bg-accent-wash text-action-primary-bg\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"mt-2.5 text-xl font-semibold tabular-nums text-text-primary\">{value}</div>\n <div className=\"mt-0.5 text-xs text-text-muted\">{label}</div>\n </GlassCard>\n );\n}\n\nexport default function EventDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useEventQuery(id);\n const { data: sessionsData } = useQuery<ScheduleSessionsResponse, { eventId?: string; limit?: number }>(\n SCHEDULE_SESSIONS_QUERY,\n { variables: { eventId: id, limit: 200 }, skip: !id }\n );\n const { data: ticketsData } = useTicketTypesQuery({ eventId: id, limit: 100, offset: 0 });\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const [tab, setTab] = useState('overview');\n\n const event = data?.event ?? null;\n const venueId = useMemo(() => {\n const metadata = (event?.metadata ?? {}) as Record<string, unknown>;\n return typeof metadata.venueId === 'string' ? (metadata.venueId as string) : '';\n }, [event]);\n const venueName = useMemo(\n () => (venueId ? venuesData?.venues?.items?.find((venue) => venue.id === venueId)?.name : undefined),\n [venueId, venuesData]\n );\n\n const sessionCount = sessionsData?.eventSessions?.total ?? 0;\n const ticketsSold = useMemo(\n () => (ticketsData?.ticketTypes?.items ?? []).reduce((sum, ticket) => sum + (ticket.soldCount ?? 0), 0),\n [ticketsData]\n );\n\n if (loading) {\n return (\n <div className=\"space-y-4 p-6\">\n <Skeleton className=\"h-8 w-40\" />\n <Skeleton className=\"h-24 w-full rounded-card\" />\n <Skeleton className=\"h-64 w-full rounded-card\" />\n </div>\n );\n }\n\n if (!event) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Event not found.\"\n description=\"This event may have been removed or is outside your current scope.\"\n />\n </GlassCard>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <div>\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-2xl font-bold text-text-primary\">{event.name}</h1>\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n </div>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <CalendarClock className=\"h-4 w-4 text-text-muted\" />\n {formatDateTime(event.startAt)} — {formatDateTime(event.endAt)}\n </span>\n {venueName ? (\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-muted\" />\n {venueName}\n </span>\n ) : null}\n </p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {event.type === 'VIRTUAL' || event.type === 'HYBRID' ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate(`/events/${id}/virtual`)}>\n <Video className=\"h-4 w-4\" />\n Virtual Session\n </Button>\n ) : null}\n <Button type=\"button\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Event\n </Button>\n </div>\n </div>\n\n {/* Metrics strip */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <MetricTile label=\"Capacity\" value={(event.capacity ?? 0).toLocaleString()} icon={Users} />\n <MetricTile label=\"Sessions\" value={sessionCount.toLocaleString()} icon={CalendarClock} />\n <MetricTile\n label=\"Ticket types\"\n value={(ticketsData?.ticketTypes?.total ?? 0).toLocaleString()}\n icon={TicketIcon}\n />\n <MetricTile label=\"Tickets sold\" value={ticketsSold.toLocaleString()} icon={Eye} />\n </div>\n\n <Tabs value={tab} onValueChange={setTab}>\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"sessions\">Sessions</TabsTrigger>\n <TabsTrigger value=\"speakers\">Speakers</TabsTrigger>\n <TabsTrigger value=\"tickets\">Tickets</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"mt-4\">\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5 lg:col-span-2\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Event Details</h2>\n <dl className=\"mt-4 space-y-4 text-sm\">\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Dates</dt>\n <dd className=\"text-text-primary\">\n {formatDateTime(event.startAt)} — {formatDateTime(event.endAt)}\n </dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Venue</dt>\n <dd className=\"text-text-primary\">\n {venueName ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"h-auto p-0\"\n onClick={() => navigate(`/venues/${venueId}`)}\n >\n {venueName}\n </Button>\n ) : (\n 'No venue assigned'\n )}\n </dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Capacity</dt>\n <dd className=\"text-text-primary\">{(event.capacity ?? 0).toLocaleString()} attendees</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Type</dt>\n <dd className=\"capitalize text-text-primary\">{event.type.toLowerCase().replace(/_/g, ' ')}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Timezone</dt>\n <dd className=\"text-text-primary\">{event.timezone}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Visibility</dt>\n <dd className=\"capitalize text-text-primary\">{event.visibility}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Description</dt>\n <dd className=\"text-text-secondary\">\n {event.description?.trim() ? event.description : 'No description provided.'}\n </dd>\n </div>\n </dl>\n <div className=\"mt-5\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit event details\n </Button>\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Key Metrics</h2>\n <dl className=\"mt-4 space-y-4\">\n <div>\n <dt className=\"text-sm text-text-secondary\">Capacity</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {(event.capacity ?? 0).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Sessions</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {sessionCount.toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Ticket types</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {(ticketsData?.ticketTypes?.total ?? 0).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Tickets sold</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {ticketsSold.toLocaleString()}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n </TabsContent>\n\n <TabsContent value=\"sessions\" className=\"mt-4\">\n <SessionsTab eventId={id} />\n </TabsContent>\n\n <TabsContent value=\"speakers\" className=\"mt-4\">\n <SpeakersTab />\n </TabsContent>\n\n <TabsContent value=\"tickets\" className=\"mt-4\">\n <TicketsTab eventId={id} />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EventDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/EventDetailPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n ArrowLeft,\n CalendarClock,\n Clock,\n Edit,\n Eye,\n MapPin,\n Mic2,\n Plus,\n Ticket as TicketIcon,\n Users,\n Video,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n IllustratedEmptyState,\n Skeleton,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\n\nimport {\n useDeleteEventSessionMutation,\n useDeleteSpeakerMutation,\n useDeleteTicketTypeMutation,\n useEventQuery,\n useRegistrationsQuery,\n useSpeakersQuery,\n useTicketTypesQuery,\n useVenuesQuery,\n type TicketTypeGql,\n} from '../../api/eventApi';\nimport { useEventDelete } from '../../hooks';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { CHART_COLORS } from '../../components/EventCharts';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeValidity } from '../../lib/format';\nimport { notify } from '../../lib/toast';\nimport { formatDateTime } from './eventFormUtils';\n\nfunction statusVariant(status: string): 'success' | 'warning' | 'secondary' | 'info' {\n const value = status.toLowerCase();\n if (['active', 'published', 'live', 'confirmed', 'completed', 'approved'].includes(value)) {\n return 'success';\n }\n if (['inactive', 'cancelled', 'archived', 'closed', 'expired'].includes(value)) {\n return 'warning';\n }\n if (['draft', 'created', 'pending', 'scheduled'].includes(value)) {\n return 'info';\n }\n return 'secondary';\n}\n\nfunction formatDuration(startsAt: string, endsAt: string): string {\n const start = new Date(startsAt).getTime();\n const end = new Date(endsAt).getTime();\n if (Number.isNaN(start) || Number.isNaN(end) || end <= start) {\n return '';\n }\n const totalMinutes = Math.round((end - start) / 60000);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours && minutes) {\n return `${hours}h ${minutes}m`;\n }\n if (hours) {\n return `${hours}h`;\n }\n return `${minutes}m`;\n}\n\nfunction formatHour(hour: number): string {\n const period = hour < 12 ? 'AM' : 'PM';\n const display = hour % 12 === 0 ? 12 : hour % 12;\n return `${display}:00 ${period}`;\n}\n\nfunction formatClock(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n}\n\n// ---------------------------------------------------------------------------\n// Sessions tab — multi-track schedule grid.\n//\n// The shared EVENT_SESSIONS_QUERY omits `metadata` (which carries speakerId) and\n// `description`/`capacity`, so this tab owns a fuller read that selects them; the\n// grid resolves room names from venues and speaker names from speakers.\n// ---------------------------------------------------------------------------\n\nconst SCHEDULE_SESSIONS_QUERY = gql`\n query EventfullymanagedScheduleSessions($eventId: ID, $limit: Int, $offset: Int) {\n eventSessions: eventfullyManagedEventSessions(eventId: $eventId, limit: $limit, offset: $offset) {\n total\n items {\n id\n eventId\n venueId\n title\n sessionType\n track\n startsAt\n endsAt\n status\n metadata\n }\n }\n }\n`;\n\ntype ScheduleSession = {\n id: string;\n eventId: string;\n venueId?: string | null;\n title: string;\n sessionType: string;\n track?: string | null;\n startsAt: string;\n endsAt: string;\n status: string;\n metadata?: Record<string, unknown> | null;\n};\n\ntype ScheduleSessionsResponse = { eventSessions: { total: number; items: ScheduleSession[] } };\n\nconst UNTRACKED = 'General';\n\nfunction dayKey(iso: string): string {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? 'unknown' : date.toISOString().slice(0, 10);\n}\n\nfunction SessionBlock({\n session,\n color,\n speakerName,\n roomName,\n onEdit,\n onDelete,\n}: {\n session: ScheduleSession;\n color: string;\n speakerName?: string;\n roomName?: string;\n onEdit: () => void;\n onDelete: () => void | Promise<void>;\n}) {\n const duration = formatDuration(session.startsAt, session.endsAt);\n return (\n <div\n className=\"relative rounded-card border border-border-subtle p-3 shadow-elevation-1\"\n style={{\n borderLeftWidth: '3px',\n borderLeftColor: color,\n background: `color-mix(in srgb, ${color} 8%, var(--color-bg-surface))`,\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"min-w-0 pr-1 text-sm font-semibold leading-snug text-text-primary\">{session.title}</p>\n <div className=\"-mr-1 -mt-1 shrink-0\">\n <ActionMenu\n ariaLabel={`Session actions for ${session.title}`}\n entityName={session.title}\n deleteLabel=\"Delete session\"\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </div>\n </div>\n <dl className=\"mt-2 space-y-1 text-xs text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Mic2 className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span className=\"truncate\">{speakerName ?? 'Speaker TBD'}</span>\n </div>\n {roomName ? (\n <div className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span className=\"truncate\">{roomName}</span>\n </div>\n ) : null}\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-3.5 w-3.5 shrink-0 text-text-muted\" />\n <span>\n {formatClock(session.startsAt)}\n {duration ? ` · ${duration}` : ''}\n </span>\n </div>\n </dl>\n </div>\n );\n}\n\nfunction SessionsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useQuery<\n ScheduleSessionsResponse,\n { eventId?: string; limit?: number; offset?: number }\n >(SCHEDULE_SESSIONS_QUERY, {\n variables: { eventId, limit: pagination.limit, offset: pagination.offset },\n });\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: speakersData } = useSpeakersQuery({ limit: 100, offset: 0 });\n const [deleteEventSession] = useDeleteEventSessionMutation();\n\n const total = data?.eventSessions?.total ?? 0;\n const rows = useMemo(() => data?.eventSessions?.items ?? [], [data]);\n\n const venueNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const venue of venuesData?.venues?.items ?? []) {\n map.set(venue.id, venue.name);\n }\n return map;\n }, [venuesData]);\n\n const speakerNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const speaker of speakersData?.speakers?.items ?? []) {\n map.set(speaker.id, speaker.fullName);\n }\n return map;\n }, [speakersData]);\n\n // Distinct tracks (ordered by first appearance) → stable colour per track.\n const trackColor = useMemo(() => {\n const map = new Map<string, string>();\n let index = 0;\n for (const session of rows) {\n const track = session.track?.trim() || UNTRACKED;\n if (!map.has(track)) {\n map.set(track, CHART_COLORS[index % CHART_COLORS.length]);\n index += 1;\n }\n }\n return map;\n }, [rows]);\n\n // Group sessions by day, then by track, keyed by the hour they start.\n const days = useMemo(() => {\n const byDay = new Map<string, ScheduleSession[]>();\n for (const session of [...rows].sort((a, b) => new Date(a.startsAt).getTime() - new Date(b.startsAt).getTime())) {\n const key = dayKey(session.startsAt);\n const list = byDay.get(key) ?? [];\n list.push(session);\n byDay.set(key, list);\n }\n return Array.from(byDay.entries()).map(([key, sessions]) => {\n const tracks = Array.from(new Set(sessions.map((s) => s.track?.trim() || UNTRACKED)));\n const hours = sessions.map((s) => new Date(s.startsAt).getHours()).filter((h) => !Number.isNaN(h));\n const minHour = hours.length ? Math.min(...hours) : 9;\n const maxHour = hours.length ? Math.max(...hours) : 17;\n const hourRange: number[] = [];\n for (let hour = minHour; hour <= maxHour; hour += 1) {\n hourRange.push(hour);\n }\n return { key, sessions, tracks, hourRange };\n });\n }, [rows]);\n\n const onDelete = async (session: ScheduleSession) => {\n const response = await deleteEventSession({ variables: { id: session.id } });\n if (response.error) {\n notify.error('Could not delete session', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteEventSession) {\n notify.error('Could not delete session', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Session deleted', session.title);\n await refetch();\n };\n\n const resolveSpeaker = (session: ScheduleSession): string | undefined => {\n const metadata = (session.metadata ?? {}) as Record<string, unknown>;\n const speakerId = typeof metadata.speakerId === 'string' ? metadata.speakerId : '';\n return speakerId ? speakerNameById.get(speakerId) : undefined;\n };\n const resolveRoom = (session: ScheduleSession): string | undefined =>\n session.venueId ? venueNameById.get(session.venueId) : undefined;\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Agenda &amp; Sessions</h2>\n <p className=\"text-sm text-text-secondary\">A multi-track schedule of everything happening on the day.</p>\n </div>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/sessions/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Session\n </Button>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-64 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No sessions yet.\"\n description=\"Build the agenda by adding your first session.\"\n action={\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/sessions/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Session\n </Button>\n }\n className=\"py-10\"\n />\n ) : (\n <div className=\"space-y-8\">\n {days.map((day) => (\n <section key={day.key} className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {new Date(`${day.key}T00:00:00`).toLocaleDateString(undefined, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n })}\n </h3>\n\n {/* Desktop / tablet: multi-track grid */}\n <div className=\"hidden overflow-x-auto rounded-card border border-border-seam md:block\">\n <div\n className=\"grid min-w-max\"\n style={{ gridTemplateColumns: `88px repeat(${day.tracks.length}, minmax(200px, 1fr))` }}\n >\n {/* Header row */}\n <div className=\"sticky left-0 z-10 border-b border-border-seam bg-bg-sunken px-3 py-2.5\" />\n {day.tracks.map((track) => (\n <div\n key={track}\n className=\"border-b border-l border-border-seam bg-bg-sunken px-3 py-2.5 text-center text-sm font-semibold text-text-primary\"\n >\n <span className=\"inline-flex items-center gap-2\">\n <span\n className=\"h-2 w-2 rounded-full\"\n style={{ background: trackColor.get(track) }}\n aria-hidden=\"true\"\n />\n {track}\n </span>\n </div>\n ))}\n\n {/* Hour rows */}\n {day.hourRange.map((hour) => (\n <div key={hour} className=\"contents\">\n <div className=\"sticky left-0 z-10 border-b border-border-subtle bg-bg-surface px-3 py-3 text-xs font-medium text-text-muted\">\n {formatHour(hour)}\n </div>\n {day.tracks.map((track) => {\n const cellSessions = day.sessions.filter(\n (session) =>\n (session.track?.trim() || UNTRACKED) === track &&\n new Date(session.startsAt).getHours() === hour\n );\n return (\n <div\n key={`${hour}-${track}`}\n className=\"space-y-2 border-b border-l border-border-subtle p-2 align-top\"\n >\n {cellSessions.map((session) => (\n <SessionBlock\n key={session.id}\n session={session}\n color={trackColor.get(track) ?? CHART_COLORS[0]}\n speakerName={resolveSpeaker(session)}\n roomName={resolveRoom(session)}\n onEdit={() => navigate(`/events/${eventId}/sessions/${session.id}/edit`)}\n onDelete={() => onDelete(session)}\n />\n ))}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Mobile: clean time-ordered day list */}\n <ul className=\"space-y-2.5 md:hidden\">\n {day.sessions.map((session) => {\n const track = session.track?.trim() || UNTRACKED;\n return (\n <li key={session.id}>\n <SessionBlock\n session={session}\n color={trackColor.get(track) ?? CHART_COLORS[0]}\n speakerName={resolveSpeaker(session)}\n roomName={resolveRoom(session) ?? track}\n onEdit={() => navigate(`/events/${eventId}/sessions/${session.id}/edit`)}\n onDelete={() => onDelete(session)}\n />\n </li>\n );\n })}\n </ul>\n </section>\n ))}\n </div>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"sessions\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\ntype SpeakerRow = { id: string; fullName: string; title?: string | null; organization?: string | null };\n\nfunction SpeakersTab() {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useSpeakersQuery({ limit: pagination.limit, offset: pagination.offset });\n const [deleteSpeaker] = useDeleteSpeakerMutation();\n\n const total = data?.speakers?.total ?? 0;\n const rows = (data?.speakers?.items ?? []) as unknown as SpeakerRow[];\n\n const onDelete = async (speaker: SpeakerRow) => {\n const response = await deleteSpeaker({ variables: { id: speaker.id } });\n if (response.error) {\n notify.error('Could not delete speaker', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteSpeaker) {\n notify.error('Could not delete speaker', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Speaker deleted', speaker.fullName);\n await refetch();\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Speakers</h2>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate('/speakers')}>\n Manage speakers\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate('/speakers/create')}>\n <Plus className=\"h-4 w-4\" />\n New Speaker\n </Button>\n </div>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-40 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No speakers yet.\"\n description=\"Add speakers so you can assign them to sessions.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {rows.map((speaker) => (\n <li\n key={speaker.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-accent-wash text-sm font-semibold text-action-primary-bg\">\n {speaker.fullName.slice(0, 1).toUpperCase()}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{speaker.fullName}</p>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">\n {[speaker.title, speaker.organization].filter(Boolean).join(' • ') || 'Speaker'}\n </p>\n </div>\n </div>\n <ActionMenu\n ariaLabel={`Speaker actions for ${speaker.fullName}`}\n entityName={speaker.fullName}\n deleteLabel=\"Delete speaker\"\n onEdit={() => navigate(`/speakers/${speaker.id}/edit`)}\n onDelete={() => onDelete(speaker)}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"speakers\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nfunction TicketsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useTicketTypesQuery({\n eventId,\n limit: pagination.limit,\n offset: pagination.offset,\n });\n const [deleteTicketType] = useDeleteTicketTypeMutation();\n\n const total = data?.ticketTypes?.total ?? 0;\n const rows = (data?.ticketTypes?.items ?? []) as TicketTypeGql[];\n\n const onDelete = async (ticket: TicketTypeGql) => {\n const response = await deleteTicketType({ variables: { id: ticket.id } });\n if (response.error) {\n notify.error('Could not delete ticket type', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteTicketType) {\n notify.error('Could not delete ticket type', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Ticket type deleted');\n await refetch();\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Ticket Types</h2>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/tickets/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Ticket Type\n </Button>\n </div>\n\n {loading ? (\n <Skeleton className=\"h-40 w-full rounded-card\" />\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No ticket types yet.\"\n description=\"Add a ticket type so attendees can register.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {rows.map((ticket) => {\n const hasCapacity = ticket.capacity != null && ticket.capacity > 0;\n const pct = hasCapacity\n ? Math.min(100, Math.round((ticket.soldCount / (ticket.capacity as number)) * 100))\n : 0;\n const nearlyFull = pct >= 90;\n return (\n <li\n key={ticket.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-4 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{ticket.name}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">\n {ticket.price} {ticket.currency}\n </p>\n <p className=\"mt-1 flex items-center gap-1.5 text-xs text-text-muted\">\n <CalendarClock className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">\n Sales window · {describeValidity(ticket.salesStartAt ?? '', ticket.salesEndAt ?? '')}\n </span>\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant={ticket.isActive ? 'success' : 'warning'} className=\"uppercase\">\n {ticket.isActive ? 'Active' : 'Inactive'}\n </Badge>\n <ActionMenu\n ariaLabel={`Ticket actions for ${ticket.name}`}\n entityName={ticket.name}\n deleteLabel=\"Delete ticket type\"\n onEdit={() => navigate(`/events/${eventId}/tickets/${ticket.id}/edit`)}\n onDelete={() => onDelete(ticket)}\n />\n </div>\n </div>\n\n <div className=\"mt-3\">\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <span>\n <span className=\"font-medium tabular-nums text-text-primary\">\n {ticket.soldCount.toLocaleString()}\n </span>{' '}\n sold\n {hasCapacity ? (\n <> / {(ticket.capacity as number).toLocaleString()} capacity</>\n ) : (\n ' • unlimited capacity'\n )}\n </span>\n {hasCapacity ? (\n <span className={nearlyFull ? 'font-medium text-text-primary' : ''}>{pct}%</span>\n ) : null}\n </div>\n {hasCapacity ? (\n <div\n className=\"mt-1.5 h-2 overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${ticket.name} sold`}\n >\n <div\n className=\"h-full rounded-full transition-[width] duration-500\"\n style={{\n width: `${pct}%`,\n background: 'linear-gradient(90deg, var(--color-chart-1), var(--color-chart-2))',\n }}\n />\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"ticket types\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nfunction MetricTile({\n label,\n value,\n icon: Icon,\n}: {\n label: string;\n value: string;\n icon: React.ComponentType<{ className?: string }>;\n}) {\n return (\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-button bg-accent-wash text-action-primary-bg\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"mt-2.5 text-xl font-semibold tabular-nums text-text-primary\">{value}</div>\n <div className=\"mt-0.5 text-xs text-text-muted\">{label}</div>\n </GlassCard>\n );\n}\n\nexport default function EventDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useEventQuery(id);\n const { data: sessionsData } = useQuery<ScheduleSessionsResponse, { eventId?: string; limit?: number }>(\n SCHEDULE_SESSIONS_QUERY,\n { variables: { eventId: id, limit: 200 }, skip: !id }\n );\n const { data: ticketsData } = useTicketTypesQuery({ eventId: id, limit: 100, offset: 0 });\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n // Key-metric count only — the server returns `total` from a separate count over\n // the same eventId-scoped filter, so one row is all we need to fetch for it.\n const { data: registrationsData } = useRegistrationsQuery({ eventId: id, limit: 1, offset: 0 });\n const { onDeleteEvent } = useEventDelete();\n const [tab, setTab] = useState('overview');\n\n const handleDeleteEvent = async () => {\n await onDeleteEvent(id, { onSuccess: () => navigate('/events') });\n };\n\n const event = data?.event ?? null;\n const venueId = useMemo(() => {\n const metadata = (event?.metadata ?? {}) as Record<string, unknown>;\n return typeof metadata.venueId === 'string' ? (metadata.venueId as string) : '';\n }, [event]);\n const venueName = useMemo(\n () => (venueId ? venuesData?.venues?.items?.find((venue) => venue.id === venueId)?.name : undefined),\n [venueId, venuesData]\n );\n\n const sessionCount = sessionsData?.eventSessions?.total ?? 0;\n const registrationCount = registrationsData?.registrations?.total ?? 0;\n const ticketsSold = useMemo(\n () => (ticketsData?.ticketTypes?.items ?? []).reduce((sum, ticket) => sum + (ticket.soldCount ?? 0), 0),\n [ticketsData]\n );\n\n if (loading) {\n return (\n <div className=\"space-y-4 p-6\">\n <Skeleton className=\"h-8 w-40\" />\n <Skeleton className=\"h-24 w-full rounded-card\" />\n <Skeleton className=\"h-64 w-full rounded-card\" />\n </div>\n );\n }\n\n if (!event) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Event not found.\"\n description=\"This event may have been removed or is outside your current scope.\"\n />\n </GlassCard>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <div>\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-2xl font-bold text-text-primary\">{event.name}</h1>\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n </div>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <CalendarClock className=\"h-4 w-4 text-text-muted\" />\n {formatDateTime(event.startAt)} — {formatDateTime(event.endAt)}\n </span>\n {venueName ? (\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-muted\" />\n {venueName}\n </span>\n ) : null}\n </p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {event.type === 'VIRTUAL' || event.type === 'HYBRID' ? (\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate(`/events/${id}/virtual`)}>\n <Video className=\"h-4 w-4\" />\n Virtual Session\n </Button>\n ) : null}\n <Button type=\"button\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Event\n </Button>\n <ActionMenu\n ariaLabel=\"Event actions\"\n entityName={event.name}\n deleteLabel=\"Delete event\"\n onDelete={handleDeleteEvent}\n />\n </div>\n </div>\n\n {/* Metrics strip */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <MetricTile label=\"Capacity\" value={(event.capacity ?? 0).toLocaleString()} icon={Users} />\n <MetricTile label=\"Sessions\" value={sessionCount.toLocaleString()} icon={CalendarClock} />\n <MetricTile\n label=\"Ticket types\"\n value={(ticketsData?.ticketTypes?.total ?? 0).toLocaleString()}\n icon={TicketIcon}\n />\n <MetricTile label=\"Tickets sold\" value={ticketsSold.toLocaleString()} icon={Eye} />\n </div>\n\n <Tabs value={tab} onValueChange={setTab}>\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"sessions\">Sessions</TabsTrigger>\n <TabsTrigger value=\"speakers\">Speakers</TabsTrigger>\n <TabsTrigger value=\"tickets\">Tickets</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"mt-4\">\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5 lg:col-span-2\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Event Details</h2>\n <dl className=\"mt-4 space-y-4 text-sm\">\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Dates</dt>\n <dd className=\"text-text-primary\">\n {formatDateTime(event.startAt)} — {formatDateTime(event.endAt)}\n </dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Venue</dt>\n <dd className=\"text-text-primary\">\n {venueName ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"h-auto p-0\"\n onClick={() => navigate(`/venues/${venueId}`)}\n >\n {venueName}\n </Button>\n ) : (\n 'No venue assigned'\n )}\n </dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Capacity</dt>\n <dd className=\"text-text-primary\">{(event.capacity ?? 0).toLocaleString()} attendees</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Type</dt>\n <dd className=\"capitalize text-text-primary\">{event.type.toLowerCase().replace(/_/g, ' ')}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Timezone</dt>\n <dd className=\"text-text-primary\">{event.timezone}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Visibility</dt>\n <dd className=\"capitalize text-text-primary\">{event.visibility}</dd>\n </div>\n <div className=\"grid grid-cols-1 gap-1 sm:grid-cols-[140px_1fr]\">\n <dt className=\"text-text-muted\">Description</dt>\n <dd className=\"text-text-secondary\">\n {event.description?.trim() ? event.description : 'No description provided.'}\n </dd>\n </div>\n </dl>\n <div className=\"mt-5\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit event details\n </Button>\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Key Metrics</h2>\n <dl className=\"mt-4 space-y-4\">\n <div>\n <dt className=\"text-sm text-text-secondary\">Registrations</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {registrationCount.toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Capacity</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {(event.capacity ?? 0).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Sessions</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {sessionCount.toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Ticket types</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {(ticketsData?.ticketTypes?.total ?? 0).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm text-text-secondary\">Tickets sold</dt>\n <dd className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {ticketsSold.toLocaleString()}\n </dd>\n </div>\n </dl>\n </GlassCard>\n </div>\n </TabsContent>\n\n <TabsContent value=\"sessions\" className=\"mt-4\">\n <SessionsTab eventId={id} />\n </TabsContent>\n\n <TabsContent value=\"speakers\" className=\"mt-4\">\n <SpeakersTab />\n </TabsContent>\n\n <TabsContent value=\"tickets\" className=\"mt-4\">\n <TicketsTab eventId={id} />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SessionFormPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/events/SessionFormPage.tsx"],"names":[],"mappings":"AAoGA,MAAM,CAAC,OAAO,UAAU,eAAe,4CAqQtC"}
1
+ {"version":3,"file":"SessionFormPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/events/SessionFormPage.tsx"],"names":[],"mappings":"AA6GA,MAAM,CAAC,OAAO,UAAU,eAAe,4CA8QtC"}