@burdenoff/microfe-eventfullymanaged 2026.828.1 → 2026.1030.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.
@@ -1 +1 @@
1
- {"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Award,\n CalendarClock,\n CalendarDays,\n CalendarPlus,\n LayoutGrid,\n MapPin,\n Rows3,\n Search,\n Ticket,\n UserCheck,\n Users,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Badge,\n Button,\n EmphasisPanel,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n NextSteps,\n PagePurpose,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useEventsQuery, useSponsorsQuery, useVenuesQuery } from '../../api/eventApi';\nimport { useEventDelete } from '../../hooks';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { formatDateTime } from '../events/eventFormUtils';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n capacity?: number | null;\n visibility?: string;\n metadata?: Record<string, unknown> | null;\n};\n\n// Per-event registration + check-in counts, computed once from a real registrations\n// read (no per-row queries) so each card can show live mini-stats.\nconst EVENTS_REGISTRATIONS_QUERY = gql`\n query EventfullymanagedEventsRegistrations($limit: Int) {\n registrations: eventfullyManagedRegistrations(limit: $limit, offset: 0) {\n total\n items {\n id\n eventId\n checkedInAt\n }\n }\n }\n`;\n\ntype RegistrationStat = { id: string; eventId: string; checkedInAt?: string | null };\ntype EventsRegistrationsResponse = { registrations: { total: number; items: RegistrationStat[] } };\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 formatDateRange(startAt?: string, endAt?: string): string {\n const start = startAt ? formatDateTime(startAt) : '';\n const end = endAt ? formatDateTime(endAt) : '';\n if (start && end) {\n return `${start} — ${end}`;\n }\n return start || end || 'No schedule set';\n}\n\ntype Lifecycle = 'upcoming' | 'live' | 'past';\ntype LifecycleFilter = 'all' | Lifecycle;\n\n// Derive an event's lifecycle from its schedule (DateTime scalars arrive as ISO\n// strings, so parse via `new Date(...)`). Upcoming = starts in the future, Live =\n// now falls within start–end (open-ended if no end), Past = already ended.\nfunction eventLifecycle(startAt?: string, endAt?: string): Lifecycle | null {\n const now = Date.now();\n const start = startAt ? new Date(startAt).getTime() : Number.NaN;\n const end = endAt ? new Date(endAt).getTime() : Number.NaN;\n const hasStart = !Number.isNaN(start);\n const hasEnd = !Number.isNaN(end);\n if (!hasStart && !hasEnd) {\n return null;\n }\n if (hasStart && now < start) {\n return 'upcoming';\n }\n if (hasEnd && now > end) {\n return 'past';\n }\n if (hasStart) {\n return 'live';\n }\n return 'upcoming';\n}\n\nfunction PortfolioStat({\n icon: Icon,\n label,\n value,\n loading,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n loading: boolean;\n}) {\n return (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n {loading ? (\n <Skeleton className=\"h-6 w-12\" />\n ) : (\n <p className=\"truncate text-xl font-bold tabular-nums text-text-primary\">{value}</p>\n )}\n <p className=\"truncate text-xs text-text-muted\">{label}</p>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nfunction MiniStat({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3.5 w-3.5 text-text-muted\" />\n <span className=\"tabular-nums font-medium text-text-primary\">{value}</span>\n <span className=\"text-text-muted\">{label}</span>\n </div>\n );\n}\n\nexport default function EventsPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<LifecycleFilter>('all');\n // BOFF-4007 — table is the default density (matches the efm-02 mock's\n // name/date/status/attendees/actions columns); cards remain available as\n // an alternative layout via the toggle below.\n const [viewMode, setViewMode] = useState<'table' | 'cards'>('table');\n const pagination = usePagination({ resetKey: search });\n const { data, loading, refetch } = useEventsQuery({ search, limit: pagination.limit, offset: pagination.offset });\n const { onDeleteEvent } = useEventDelete();\n const { data: venuesData, loading: venuesLoading } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: sponsorsData, loading: sponsorsLoading } = useSponsorsQuery({ limit: 1, offset: 0 });\n const { data: registrationsData, loading: registrationsLoading } = useQuery<\n EventsRegistrationsResponse,\n { limit: number }\n >(EVENTS_REGISTRATIONS_QUERY, { variables: { limit: 500 } });\n\n const total = data?.events?.total ?? 0;\n const rows = useMemo(() => (data?.events?.items ?? []) as EventRow[], [data]);\n\n const registrationsTotal = registrationsData?.registrations?.total ?? 0;\n const venuesTotal = venuesData?.venues?.total ?? 0;\n const sponsorsTotal = sponsorsData?.sponsors?.total ?? 0;\n\n const handleDeleteEvent = async (event: EventRow) => {\n await onDeleteEvent(event.id, { name: event.name, onSuccess: () => void refetch() });\n };\n\n const visibleRows = useMemo(() => {\n if (statusFilter === 'all') {\n return rows;\n }\n return rows.filter((event) => eventLifecycle(event.startAt, event.endAt) === statusFilter);\n }, [rows, statusFilter]);\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 statsByEvent = useMemo(() => {\n const map = new Map<string, { registrations: number; checkedIn: number }>();\n for (const registration of registrationsData?.registrations?.items ?? []) {\n const entry = map.get(registration.eventId) ?? { registrations: 0, checkedIn: 0 };\n entry.registrations += 1;\n if (registration.checkedInAt) {\n entry.checkedIn += 1;\n }\n map.set(registration.eventId, entry);\n }\n return map;\n }, [registrationsData]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.events.purpose',\n 'Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event, open it to reveal its agenda, speakers and ticket types, then publish it when it is ready.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.events.title', 'Events')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.events.description', 'Create and manage live events from the workspace graph.')}\n </p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n </div>\n </EmphasisPanel>\n\n {/* Portfolio summary — real aggregate totals across the whole workspace graph. */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <PortfolioStat\n icon={CalendarDays}\n label={t('eventfullymanaged.events.portfolio.events', 'Events')}\n value={total.toLocaleString()}\n loading={loading && total === 0}\n />\n <PortfolioStat\n icon={Users}\n label={t('eventfullymanaged.events.portfolio.registrations', 'Registrations')}\n value={registrationsTotal.toLocaleString()}\n loading={registrationsLoading && !registrationsData}\n />\n <PortfolioStat\n icon={MapPin}\n label={t('eventfullymanaged.events.portfolio.venues', 'Venues')}\n value={venuesTotal.toLocaleString()}\n loading={venuesLoading && !venuesData}\n />\n <PortfolioStat\n icon={Award}\n label={t('eventfullymanaged.events.portfolio.sponsors', 'Sponsors')}\n value={sponsorsTotal.toLocaleString()}\n loading={sponsorsLoading && !sponsorsData}\n />\n </div>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative flex-1\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n aria-label={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n className=\"pl-10\"\n />\n </div>\n <Tabs\n value={statusFilter}\n onValueChange={(value) => setStatusFilter(value as LifecycleFilter)}\n className=\"w-full sm:w-auto\"\n >\n <TabsList className=\"w-full overflow-x-auto sm:w-auto\">\n <TabsTrigger value=\"all\">{t('eventfullymanaged.events.filters.all', 'All')}</TabsTrigger>\n <TabsTrigger value=\"upcoming\">{t('eventfullymanaged.events.filters.upcoming', 'Upcoming')}</TabsTrigger>\n <TabsTrigger value=\"live\">{t('eventfullymanaged.events.filters.live', 'Live')}</TabsTrigger>\n <TabsTrigger value=\"past\">{t('eventfullymanaged.events.filters.past', 'Past')}</TabsTrigger>\n </TabsList>\n </Tabs>\n <div className=\"flex shrink-0 items-center gap-1 self-start rounded-button border border-border-seam p-1 sm:self-auto\">\n <Button\n type=\"button\"\n variant={viewMode === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n aria-pressed={viewMode === 'table'}\n aria-label={t('eventfullymanaged.events.view.table', 'Table view')}\n onClick={() => setViewMode('table')}\n >\n <Rows3 className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={viewMode === 'cards' ? 'default' : 'ghost'}\n size=\"sm\"\n aria-pressed={viewMode === 'cards'}\n aria-label={t('eventfullymanaged.events.view.cards', 'Card view')}\n onClick={() => setViewMode('cards')}\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {loading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n </div>\n ) : rows.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-data'}\n title={\n search\n ? t('eventfullymanaged.events.list.emptySearch', 'No events match your search.')\n : t('eventfullymanaged.events.list.empty', 'No events yet.')\n }\n description={\n search\n ? t('eventfullymanaged.events.list.emptySearchHint', 'Try a different name.')\n : t('eventfullymanaged.events.list.emptyHint', 'Create your first event to get started.')\n }\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : visibleRows.length === 0 ? (\n <div className=\"space-y-3\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <p className=\"px-2 py-8 text-center text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.events.filters.empty',\n `No ${statusFilter} events on this page. Switch tabs or move to another page.`\n )}\n </p>\n </GlassCard>\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=\"events\"\n loading={loading}\n />\n </div>\n ) : viewMode === 'table' ? (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-card border border-border-seam\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('eventfullymanaged.events.table.name', 'Event')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.date', 'Date')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.venue', 'Venue')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.status', 'Status')}</TableHead>\n <TableHead className=\"text-right\">\n {t('eventfullymanaged.events.table.attendees', 'Attendees')}\n </TableHead>\n <TableHead className=\"w-10\" aria-label={t('eventfullymanaged.events.table.actions', 'Actions')} />\n </TableRow>\n </TableHeader>\n <TableBody>\n {visibleRows.map((event) => {\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <TableRow\n key={event.id}\n className=\"cursor-pointer\"\n tabIndex={0}\n aria-label={event.name}\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n <TableCell className=\"max-w-[18rem]\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">{event.name}</span>\n {event.type ? (\n <Badge variant=\"secondary\" className=\"shrink-0 capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDateRange(event.startAt, event.endAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </TableCell>\n <TableCell>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-right tabular-nums text-text-primary\">\n {registrations.toLocaleString()}\n <span className=\"ml-1 text-xs text-text-muted\">({checkInPct}%)</span>\n </TableCell>\n <TableCell\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n >\n <ActionMenu\n ariaLabel={`Event actions for ${event.name}`}\n entityName={event.name}\n deleteLabel=\"Delete event\"\n onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\n onDelete={() => handleDeleteEvent(event)}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\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=\"events\"\n loading={loading}\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {visibleRows.map((event) => {\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <GlassCard\n key={event.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={event.name}\n className=\"group relative cursor-pointer overflow-hidden border-border-seam p-0 outline-none transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n {/* Cover accent strip */}\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 left-0 w-1.5 bg-gradient-to-b from-[var(--color-chart-1)] to-[var(--color-chart-2)]\"\n />\n <div className=\"flex flex-col gap-3 py-4 pl-5 pr-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-lg font-semibold text-text-primary\">{event.name}</p>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : null}\n {event.type ? (\n <Badge variant=\"secondary\" className=\"capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n <div className=\"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 shrink-0 text-text-muted\" />\n {formatDateRange(event.startAt, event.endAt)}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.registered', 'registered')}\n value={registrations.toLocaleString()}\n />\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.checkedIn', 'checked in')}\n value={`${checkInPct}%`}\n />\n <MiniStat\n icon={Users}\n label={t('eventfullymanaged.events.card.capacity', 'capacity')}\n value={event.capacity != null ? event.capacity.toLocaleString() : '—'}\n />\n </div>\n </div>\n <div\n className=\"flex shrink-0 items-center gap-2 self-start sm:self-center\"\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n role=\"presentation\"\n >\n <ActionMenu\n ariaLabel={`Event actions for ${event.name}`}\n entityName={event.name}\n deleteLabel=\"Delete event\"\n onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\n onDelete={() => handleDeleteEvent(event)}\n />\n </div>\n </div>\n </GlassCard>\n );\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=\"events\"\n loading={loading}\n />\n </div>\n )}\n\n <NextSteps\n storageKey=\"eventfullymanaged-events\"\n title={t('eventfullymanaged.events.nextSteps.title', 'Finish setting up your event')}\n steps={[\n {\n id: 'configure-registration',\n label: t('eventfullymanaged.events.nextSteps.registration', 'Configure registration & tickets'),\n description: t(\n 'eventfullymanaged.events.nextSteps.registrationDesc',\n 'Open an event and define ticket types so people can register.'\n ),\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'plan-networking',\n label: t('eventfullymanaged.events.nextSteps.networking', 'Plan networking & sessions'),\n description: t(\n 'eventfullymanaged.events.nextSteps.networkingDesc',\n 'Set up attendee matchmaking and meeting schedules.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'announce',\n label: t('eventfullymanaged.events.nextSteps.announce', 'Announce to attendees'),\n description: t(\n 'eventfullymanaged.events.nextSteps.announceDesc',\n 'Send announcements and run communication campaigns.'\n ),\n icon: <CalendarPlus className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4DA,IAAM,KAA6B,CAAG;;;;;;;;;;;;AAgBtC,SAAS,EAAc,GAA8D;CACnF,IAAM,IAAQ,EAAO,aAAa;AAUlC,QATI;EAAC;EAAU;EAAa;EAAQ;EAAa;EAAa;EAAW,CAAC,SAAS,EAAM,GAChF,YAEL;EAAC;EAAY;EAAa;EAAY;EAAU;EAAU,CAAC,SAAS,EAAM,GACrE,YAEL;EAAC;EAAS;EAAW;EAAW;EAAY,CAAC,SAAS,EAAM,GACvD,SAEF;;AAGT,SAAS,EAAgB,GAAkB,GAAwB;CACjE,IAAM,IAAQ,IAAU,EAAe,EAAQ,GAAG,IAC5C,IAAM,IAAQ,EAAe,EAAM,GAAG;AAI5C,QAHI,KAAS,IACJ,GAAG,EAAM,KAAK,MAEhB,KAAS,KAAO;;AASzB,SAAS,EAAe,GAAkB,GAAkC;CAC1E,IAAM,IAAM,KAAK,KAAK,EAChB,IAAQ,IAAU,IAAI,KAAK,EAAQ,CAAC,SAAS,GAAG,KAChD,IAAM,IAAQ,IAAI,KAAK,EAAM,CAAC,SAAS,GAAG,KAC1C,IAAW,CAAC,OAAO,MAAM,EAAM,EAC/B,IAAS,CAAC,OAAO,MAAM,EAAI;AAajC,QAZI,CAAC,KAAY,CAAC,IACT,OAEL,KAAY,IAAM,IACb,aAEL,KAAU,IAAM,IACX,SAEL,IACK,SAEF;;AAGT,SAAS,EAAc,EACrB,MAAM,GACN,UACA,UACA,cAMC;AACD,QACE,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAU;YACrC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cACd,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;IACvB,CAAA,EACP,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,IACC,kBAAC,GAAD,EAAU,WAAU,YAAa,CAAA,GAEjC,kBAAC,KAAD;KAAG,WAAU;eAA6D;KAAU,CAAA,EAEtF,kBAAC,KAAD;KAAG,WAAU;eAAoC;KAAU,CAAA,CACvD;MACF;;EACI,CAAA;;AAIhB,SAAS,EAAS,EAChB,MAAM,GACN,UACA,YAKC;AACD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAM,WAAU,+BAAgC,CAAA;GAChD,kBAAC,QAAD;IAAM,WAAU;cAA8C;IAAa,CAAA;GAC3E,kBAAC,QAAD;IAAM,WAAU;cAAmB;IAAa,CAAA;GAC5C;;;AAIV,SAAwB,IAAa;CACnC,IAAM,EAAK,MAAc,IAAS,EAC5B,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,gBAAa,GAAsB,EACrC,CAAC,GAAQ,MAAa,EAAS,GAAG,EAClC,CAAC,GAAc,MAAmB,EAA0B,MAAM,EAIlE,CAAC,GAAU,KAAe,EAA4B,QAAQ,EAC9D,IAAa,GAAc,EAAE,UAAU,GAAQ,CAAC,EAChD,EAAE,SAAM,YAAS,gBAAY,EAAe;EAAE;EAAQ,OAAO,EAAW;EAAO,QAAQ,EAAW;EAAQ,CAAC,EAC3G,EAAE,sBAAkB,GAAgB,EACpC,EAAE,MAAM,GAAY,SAAS,OAAkB,EAAe;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACxF,EAAE,MAAM,GAAc,SAAS,OAAoB,EAAiB;EAAE,OAAO;EAAG,QAAQ;EAAG,CAAC,EAC5F,EAAE,MAAM,GAAmB,SAAS,OAAyB,EAGjE,IAA4B,EAAE,WAAW,EAAE,OAAO,KAAK,EAAE,CAAC,EAEtD,IAAQ,GAAM,QAAQ,SAAS,GAC/B,IAAO,QAAe,GAAM,QAAQ,SAAS,EAAE,EAAiB,CAAC,EAAK,CAAC,EAEvE,KAAqB,GAAmB,eAAe,SAAS,GAChE,KAAc,GAAY,QAAQ,SAAS,GAC3C,KAAgB,GAAc,UAAU,SAAS,GAEjD,IAAoB,OAAO,MAAoB;AACnD,QAAM,GAAc,EAAM,IAAI;GAAE,MAAM,EAAM;GAAM,iBAAiB,KAAK,IAAS;GAAE,CAAC;IAGhF,IAAc,QACd,MAAiB,QACZ,IAEF,EAAK,QAAQ,MAAU,EAAe,EAAM,SAAS,EAAM,MAAM,KAAK,EAAa,EACzF,CAAC,GAAM,EAAa,CAAC,EAElB,IAAgB,QAAc;EAClC,IAAM,oBAAM,IAAI,KAAqB;AACrC,OAAK,IAAM,KAAS,GAAY,QAAQ,SAAS,EAAE,CACjD,GAAI,IAAI,EAAM,IAAI,EAAM,KAAK;AAE/B,SAAO;IACN,CAAC,EAAW,CAAC,EAEV,IAAe,QAAc;EACjC,IAAM,oBAAM,IAAI,KAA2D;AAC3E,OAAK,IAAM,KAAgB,GAAmB,eAAe,SAAS,EAAE,EAAE;GACxE,IAAM,IAAQ,EAAI,IAAI,EAAa,QAAQ,IAAI;IAAE,eAAe;IAAG,WAAW;IAAG;AAKjF,GAJA,EAAM,iBAAiB,GACnB,EAAa,gBACf,EAAM,aAAa,IAErB,EAAI,IAAI,EAAa,SAAS,EAAM;;AAEtC,SAAO;IACN,CAAC,EAAkB,CAAC;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,IAAD,EAAA,UACG,EACC,oCACA,8OACD,EACW,CAAA;GAEd,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAe,EAAE,kCAAkC,SAAS,EAAgB,CAAA;KACzE,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAE,wCAAwC,0DAA0D;KACnG,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;KAAS,eAAe,EAAS,iBAAiB;eAA/D,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EACnC,EAAE,2CAA2C,eAAe,CACtD;OACL;OACQ,CAAA;GAGhB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,EAAE,6CAA6C,SAAS;MAC/D,OAAO,EAAM,gBAAgB;MAC7B,SAAS,KAAW,MAAU;MAC9B,CAAA;KACF,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,EAAE,oDAAoD,gBAAgB;MAC7E,OAAO,GAAmB,gBAAgB;MAC1C,SAAS,MAAwB,CAAC;MAClC,CAAA;KACF,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,EAAE,6CAA6C,SAAS;MAC/D,OAAO,GAAY,gBAAgB;MACnC,SAAS,MAAiB,CAAC;MAC3B,CAAA;KACF,kBAAC,GAAD;MACE,MAAM;MACN,OAAO,EAAE,+CAA+C,WAAW;MACnE,OAAO,GAAc,gBAAgB;MACrC,SAAS,MAAmB,CAAC;MAC7B,CAAA;KACE;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wFAAyF,CAAA,EAC3G,kBAAC,IAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAU,GAAU,EAAM,OAAO,MAAM;OAClD,aAAa,EAAE,8CAA8C,gBAAgB;OAC7E,cAAY,EAAE,8CAA8C,gBAAgB;OAC5E,WAAU;OACV,CAAA,CACE;;KACN,kBAAC,IAAD;MACE,OAAO;MACP,gBAAgB,MAAU,GAAgB,EAAyB;MACnE,WAAU;gBAEV,kBAAC,IAAD;OAAU,WAAU;iBAApB;QACE,kBAAC,GAAD;SAAa,OAAM;mBAAO,EAAE,wCAAwC,MAAM;SAAe,CAAA;QACzF,kBAAC,GAAD;SAAa,OAAM;mBAAY,EAAE,6CAA6C,WAAW;SAAe,CAAA;QACxG,kBAAC,GAAD;SAAa,OAAM;mBAAQ,EAAE,yCAAyC,OAAO;SAAe,CAAA;QAC5F,kBAAC,GAAD;SAAa,OAAM;mBAAQ,EAAE,yCAAyC,OAAO;SAAe,CAAA;QACnF;;MACN,CAAA;KACP,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAK;OACL,SAAS,MAAa,UAAU,YAAY;OAC5C,MAAK;OACL,gBAAc,MAAa;OAC3B,cAAY,EAAE,uCAAuC,aAAa;OAClE,eAAe,EAAY,QAAQ;iBAEnC,kBAAC,IAAD,EAAO,WAAU,WAAY,CAAA;OACtB,CAAA,EACT,kBAAC,GAAD;OACE,MAAK;OACL,SAAS,MAAa,UAAU,YAAY;OAC5C,MAAK;OACL,gBAAc,MAAa;OAC3B,cAAY,EAAE,uCAAuC,YAAY;OACjE,eAAe,EAAY,QAAQ;iBAEnC,kBAAC,IAAD,EAAY,WAAU,WAAY,CAAA;OAC3B,CAAA,CACL;;KACF;;GAEL,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA;KACjD,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA;KACjD,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA;KAC7C;QACJ,EAAK,WAAW,IAClB,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KACE,cAAc,IAAS,iBAAiB;KACxC,OACE,IACI,EAAE,6CAA6C,+BAA+B,GAC9E,EAAE,uCAAuC,iBAAiB;KAEhE,aACE,IACI,EAAE,iDAAiD,wBAAwB,GAC3E,EAAE,2CAA2C,0CAA0C;KAE7F,QACG,IAKG,KAAA,IAJF,kBAAC,GAAD;MAAQ,MAAK;MAAS,eAAe,EAAS,iBAAiB;gBAA/D,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EACnC,EAAE,2CAA2C,eAAe,CACtD;;KAGb,CAAA;IACQ,CAAA,GACV,EAAY,WAAW,IACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAW,WAAU;KAAQ,WAAU;eACrC,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,0CACA,MAAM,EAAa,4DACpB;MACC,CAAA;KACM,CAAA,EACZ,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,OAAO,EAAW;KAClB,aAAa,EAAK;KACX;KACP,QAAQ,EAAW;KACnB,QAAQ,EAAW;KACnB,WAAU;KACD;KACT,CAAA,CACE;QACJ,MAAa,UACf,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD,EAAA,UAAY,EAAE,uCAAuC,QAAQ,EAAa,CAAA;MAC1E,kBAAC,GAAD,EAAA,UAAY,EAAE,uCAAuC,OAAO,EAAa,CAAA;MACzE,kBAAC,GAAD,EAAA,UAAY,EAAE,wCAAwC,QAAQ,EAAa,CAAA;MAC3E,kBAAC,GAAD,EAAA,UAAY,EAAE,yCAAyC,SAAS,EAAa,CAAA;MAC7E,kBAAC,GAAD;OAAW,WAAU;iBAClB,EAAE,4CAA4C,YAAY;OACjD,CAAA;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAO,cAAY,EAAE,0CAA0C,UAAU;OAAI,CAAA;MACzF,EAAA,CAAA,EACC,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EAAY,KAAK,MAAU;MAC1B,IAAM,IAAY,EAAM,YAAY,EAAE,EAChC,IAAU,OAAO,EAAS,WAAY,WAAW,EAAS,UAAU,IACpE,IAAY,IAAU,EAAc,IAAI,EAAQ,GAAG,KAAA,GACnD,IAAO,EAAa,IAAI,EAAM,GAAG,EACjC,IAAgB,GAAM,iBAAiB,GACvC,IAAa,IAAgB,IAAI,KAAK,OAAQ,GAAM,aAAa,KAAK,IAAiB,IAAI,GAAG;AACpG,aACE,kBAAC,GAAD;OAEE,WAAU;OACV,UAAU;OACV,cAAY,EAAM;OAClB,eAAe,EAAS,WAAW,EAAM,KAAK;OAC9C,YAAY,MAAa;AACvB,SAAI,EAAS,QAAQ,WAAW,EAAS,QAAQ,SAC/C,EAAS,gBAAgB,EACzB,EAAS,WAAW,EAAM,KAAK;;iBATrC;QAaE,kBAAC,GAAD;SAAW,WAAU;mBACnB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAA0C,EAAM;WAAY,CAAA,EAC3E,EAAM,OACL,kBAAC,GAAD;WAAO,SAAQ;WAAY,WAAU;qBAClC,EAAM,KAAK,aAAa,CAAC,QAAQ,MAAM,IAAI;WACtC,CAAA,GACN,KACA;;SACI,CAAA;QACZ,kBAAC,GAAD;SAAW,WAAU;mBAClB,EAAgB,EAAM,SAAS,EAAM,MAAM;SAClC,CAAA;QACZ,kBAAC,GAAD;SAAW,WAAU;mBAClB,KAAa,EAAE,yCAAyC,WAAW;SAC1D,CAAA;QACZ,kBAAC,GAAD,EAAA,UACG,EAAM,SACL,kBAAC,GAAD;SAAO,SAAS,EAAc,EAAM,OAAO;SAAE,WAAU;mBACpD,EAAM;SACD,CAAA,GAER,KAEQ,CAAA;QACZ,kBAAC,GAAD;SAAW,WAAU;mBAArB,CACG,EAAc,gBAAgB,EAC/B,kBAAC,QAAD;UAAM,WAAU;oBAAhB;WAA+C;WAAE;WAAW;WAAS;YAC3D;;QACZ,kBAAC,GAAD;SACE,UAAU,MAAe,EAAW,iBAAiB;SACrD,YAAY,MAAa,EAAS,iBAAiB;mBAEnD,kBAAC,GAAD;UACE,WAAW,qBAAqB,EAAM;UACtC,YAAY,EAAM;UAClB,aAAY;UACZ,cAAc,EAAS,WAAW,EAAM,KAAK;UAC7C,cAAc,EAAS,WAAW,EAAM,GAAG,OAAO;UAClD,gBAAgB,EAAkB,EAAM;UACxC,CAAA;SACQ,CAAA;QACH;SAtDJ,EAAM,GAsDF;OAEb,EACQ,CAAA,CACN,EAAA,CAAA;KACJ,CAAA,EAEN,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,OAAO,EAAW;KAClB,aAAa,EAAK;KACX;KACP,QAAQ,EAAW;KACnB,QAAQ,EAAW;KACnB,WAAU;KACD;KACT,CAAA,CACE;QAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAY,KAAK,MAAU;KAC1B,IAAM,IAAY,EAAM,YAAY,EAAE,EAChC,IAAU,OAAO,EAAS,WAAY,WAAW,EAAS,UAAU,IACpE,IAAY,IAAU,EAAc,IAAI,EAAQ,GAAG,KAAA,GACnD,IAAO,EAAa,IAAI,EAAM,GAAG,EACjC,IAAgB,GAAM,iBAAiB,GACvC,IAAa,IAAgB,IAAI,KAAK,OAAQ,GAAM,aAAa,KAAK,IAAiB,IAAI,GAAG;AACpG,YACE,kBAAC,GAAD;MAEE,WAAU;MACV,MAAK;MACL,UAAU;MACV,cAAY,EAAM;MAClB,WAAU;MACV,eAAe,EAAS,WAAW,EAAM,KAAK;MAC9C,YAAY,MAAa;AACvB,QAAI,EAAS,QAAQ,WAAW,EAAS,QAAQ,SAC/C,EAAS,gBAAgB,EACzB,EAAS,WAAW,EAAM,KAAK;;gBAXrC,CAgBE,kBAAC,QAAD;OACE,eAAY;OACZ,WAAU;OACV,CAAA,EACF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,KAAD;YAAG,WAAU;sBAAoD,EAAM;YAAS,CAAA;WAC/E,EAAM,SACL,kBAAC,GAAD;YAAO,SAAS,EAAc,EAAM,OAAO;YAAE,WAAU;sBACpD,EAAM;YACD,CAAA,GACN;WACH,EAAM,OACL,kBAAC,GAAD;YAAO,SAAQ;YAAY,WAAU;sBAClC,EAAM,KAAK,aAAa,CAAC,QAAQ,MAAM,IAAI;YACtC,CAAA,GACN;WACA;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,IAAD,EAAe,WAAU,oCAAqC,CAAA,EAC7D,EAAgB,EAAM,SAAS,EAAM,MAAM,CACvC;cACP,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAQ,WAAU,oCAAqC,CAAA,EACtD,KAAa,EAAE,yCAAyC,WAAW,CAC/D;aACH;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YACE,MAAM;YACN,OAAO,EAAE,4CAA4C,aAAa;YAClE,OAAO,EAAc,gBAAgB;YACrC,CAAA;WACF,kBAAC,GAAD;YACE,MAAM;YACN,OAAO,EAAE,2CAA2C,aAAa;YACjE,OAAO,GAAG,EAAW;YACrB,CAAA;WACF,kBAAC,GAAD;YACE,MAAM;YACN,OAAO,EAAE,0CAA0C,WAAW;YAC9D,OAAO,EAAM,YAAY,OAAyC,MAAlC,EAAM,SAAS,gBAAgB;YAC/D,CAAA;WACE;;SACF;WACN,kBAAC,OAAD;QACE,WAAU;QACV,UAAU,MAAe,EAAW,iBAAiB;QACrD,YAAY,MAAa,EAAS,iBAAiB;QACnD,MAAK;kBAEL,kBAAC,GAAD;SACE,WAAW,qBAAqB,EAAM;SACtC,YAAY,EAAM;SAClB,aAAY;SACZ,cAAc,EAAS,WAAW,EAAM,KAAK;SAC7C,cAAc,EAAS,WAAW,EAAM,GAAG,OAAO;SAClD,gBAAgB,EAAkB,EAAM;SACxC,CAAA;QACE,CAAA,CACF;SACI;QA9EL,EAAM,GA8ED;MAEd,EAEF,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,OAAO,EAAW;KAClB,aAAa,EAAK;KACX;KACP,QAAQ,EAAW;KACnB,QAAQ,EAAW;KACnB,WAAU;KACD;KACT,CAAA,CACE;;GAGR,kBAAC,IAAD;IACE,YAAW;IACX,OAAO,EAAE,4CAA4C,+BAA+B;IACpF,OAAO;KACL;MACE,IAAI;MACJ,OAAO,EAAE,mDAAmD,mCAAmC;MAC/F,aAAa,EACX,uDACA,gEACD;MACD,MAAM,kBAAC,IAAD,EAAQ,WAAU,WAAY,CAAA;MACpC,eAAe,EAAS,gBAAgB;MACzC;KACD;MACE,IAAI;MACJ,OAAO,EAAE,iDAAiD,6BAA6B;MACvF,aAAa,EACX,qDACA,qDACD;MACD,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,eAAe,EAAS,cAAc;MACvC;KACD;MACE,IAAI;MACJ,OAAO,EAAE,+CAA+C,wBAAwB;MAChF,aAAa,EACX,mDACA,sDACD;MACD,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,eAAe,EAAS,iBAAiB;MAC1C;KACF;IACD,CAAA;GACE"}
1
+ {"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Award,\n CalendarClock,\n CalendarDays,\n CalendarPlus,\n LayoutGrid,\n MapPin,\n Rows3,\n Search,\n Ticket,\n UserCheck,\n Users,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Badge,\n Button,\n EmphasisPanel,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n NextSteps,\n PagePurpose,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useEventsQuery, useSponsorsQuery, useVenuesQuery } from '../../api/eventApi';\nimport { useEventDelete } from '../../hooks';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { formatDateTime } from '../events/eventFormUtils';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n capacity?: number | null;\n visibility?: string;\n metadata?: Record<string, unknown> | null;\n};\n\n// Per-event registration + check-in counts, computed once from a real registrations\n// read (no per-row queries) so each card can show live mini-stats.\nconst EVENTS_REGISTRATIONS_QUERY = gql`\n query EventfullymanagedEventsRegistrations($limit: Int) {\n registrations: eventfullyManagedRegistrations(limit: $limit, offset: 0) {\n total\n items {\n id\n eventId\n checkedInAt\n }\n }\n }\n`;\n\ntype RegistrationStat = { id: string; eventId: string; checkedInAt?: string | null };\ntype EventsRegistrationsResponse = { registrations: { total: number; items: RegistrationStat[] } };\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 formatDateRange(startAt?: string, endAt?: string): string {\n const start = startAt ? formatDateTime(startAt) : '';\n const end = endAt ? formatDateTime(endAt) : '';\n if (start && end) {\n return `${start} — ${end}`;\n }\n return start || end || 'No schedule set';\n}\n\ntype Lifecycle = 'upcoming' | 'live' | 'past';\ntype LifecycleFilter = 'all' | Lifecycle;\n\n// Derive an event's lifecycle from its schedule (DateTime scalars arrive as ISO\n// strings, so parse via `new Date(...)`). Upcoming = starts in the future, Live =\n// now falls within start–end (open-ended if no end), Past = already ended.\nfunction eventLifecycle(startAt?: string, endAt?: string): Lifecycle | null {\n const now = Date.now();\n const start = startAt ? new Date(startAt).getTime() : Number.NaN;\n const end = endAt ? new Date(endAt).getTime() : Number.NaN;\n const hasStart = !Number.isNaN(start);\n const hasEnd = !Number.isNaN(end);\n if (!hasStart && !hasEnd) {\n return null;\n }\n if (hasStart && now < start) {\n return 'upcoming';\n }\n if (hasEnd && now > end) {\n return 'past';\n }\n if (hasStart) {\n return 'live';\n }\n return 'upcoming';\n}\n\nfunction PortfolioStat({\n icon: Icon,\n label,\n value,\n loading,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n loading: boolean;\n}) {\n return (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n {loading ? (\n <Skeleton className=\"h-6 w-12\" />\n ) : (\n <p className=\"truncate text-xl font-bold tabular-nums text-text-primary\">{value}</p>\n )}\n <p className=\"truncate text-xs text-text-muted\">{label}</p>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nfunction MiniStat({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3.5 w-3.5 text-text-muted\" />\n <span className=\"tabular-nums font-medium text-text-primary\">{value}</span>\n <span className=\"text-text-muted\">{label}</span>\n </div>\n );\n}\n\nexport default function EventsPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState<LifecycleFilter>('all');\n // BOFF-4007 — table is the default density (matches the efm-02 mock's\n // name/date/status/attendees/actions columns); cards remain available as\n // an alternative layout via the toggle below.\n const [viewMode, setViewMode] = useState<'table' | 'cards'>('table');\n const pagination = usePagination({ resetKey: search });\n const { data, loading, refetch } = useEventsQuery({ search, limit: pagination.limit, offset: pagination.offset });\n const { onDeleteEvent } = useEventDelete();\n const { data: venuesData, loading: venuesLoading } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: sponsorsData, loading: sponsorsLoading } = useSponsorsQuery({ limit: 1, offset: 0 });\n const { data: registrationsData, loading: registrationsLoading } = useQuery<\n EventsRegistrationsResponse,\n { limit: number }\n >(EVENTS_REGISTRATIONS_QUERY, { variables: { limit: 500 } });\n\n const total = data?.events?.total ?? 0;\n const rows = useMemo(() => (data?.events?.items ?? []) as EventRow[], [data]);\n\n const registrationsTotal = registrationsData?.registrations?.total ?? 0;\n const venuesTotal = venuesData?.venues?.total ?? 0;\n const sponsorsTotal = sponsorsData?.sponsors?.total ?? 0;\n\n const handleDeleteEvent = async (event: EventRow) => {\n await onDeleteEvent(event.id, { name: event.name, onSuccess: () => void refetch() });\n };\n\n const visibleRows = useMemo(() => {\n if (statusFilter === 'all') {\n return rows;\n }\n return rows.filter((event) => eventLifecycle(event.startAt, event.endAt) === statusFilter);\n }, [rows, statusFilter]);\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 statsByEvent = useMemo(() => {\n const map = new Map<string, { registrations: number; checkedIn: number }>();\n for (const registration of registrationsData?.registrations?.items ?? []) {\n const entry = map.get(registration.eventId) ?? { registrations: 0, checkedIn: 0 };\n entry.registrations += 1;\n if (registration.checkedInAt) {\n entry.checkedIn += 1;\n }\n map.set(registration.eventId, entry);\n }\n return map;\n }, [registrationsData]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.events.purpose',\n 'Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event, open it to reveal its agenda, speakers and ticket types, then publish it when it is ready.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.events.title', 'Events')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.events.description', 'Create and manage live events from the workspace graph.')}\n </p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n </div>\n </EmphasisPanel>\n\n {/* Portfolio summary — real aggregate totals across the whole workspace graph. */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <PortfolioStat\n icon={CalendarDays}\n label={t('eventfullymanaged.events.portfolio.events', 'Events')}\n value={total.toLocaleString()}\n loading={loading && total === 0}\n />\n <PortfolioStat\n icon={Users}\n label={t('eventfullymanaged.events.portfolio.registrations', 'Registrations')}\n value={registrationsTotal.toLocaleString()}\n loading={registrationsLoading && !registrationsData}\n />\n <PortfolioStat\n icon={MapPin}\n label={t('eventfullymanaged.events.portfolio.venues', 'Venues')}\n value={venuesTotal.toLocaleString()}\n loading={venuesLoading && !venuesData}\n />\n <PortfolioStat\n icon={Award}\n label={t('eventfullymanaged.events.portfolio.sponsors', 'Sponsors')}\n value={sponsorsTotal.toLocaleString()}\n loading={sponsorsLoading && !sponsorsData}\n />\n </div>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative flex-1\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n aria-label={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n className=\"pl-10\"\n />\n </div>\n <Tabs\n value={statusFilter}\n onValueChange={(value) => setStatusFilter(value as LifecycleFilter)}\n className=\"w-full sm:w-auto\"\n >\n <TabsList className=\"w-full overflow-x-auto sm:w-auto\">\n <TabsTrigger value=\"all\">{t('eventfullymanaged.events.filters.all', 'All')}</TabsTrigger>\n <TabsTrigger value=\"upcoming\">{t('eventfullymanaged.events.filters.upcoming', 'Upcoming')}</TabsTrigger>\n <TabsTrigger value=\"live\">{t('eventfullymanaged.events.filters.live', 'Live')}</TabsTrigger>\n <TabsTrigger value=\"past\">{t('eventfullymanaged.events.filters.past', 'Past')}</TabsTrigger>\n </TabsList>\n </Tabs>\n <div className=\"flex shrink-0 items-center gap-1 self-start rounded-button border border-border-seam p-1 sm:self-auto\">\n <Button\n type=\"button\"\n variant={viewMode === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n aria-pressed={viewMode === 'table'}\n aria-label={t('eventfullymanaged.events.view.table', 'Table view')}\n onClick={() => setViewMode('table')}\n >\n <Rows3 className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={viewMode === 'cards' ? 'default' : 'ghost'}\n size=\"sm\"\n aria-pressed={viewMode === 'cards'}\n aria-label={t('eventfullymanaged.events.view.cards', 'Card view')}\n onClick={() => setViewMode('cards')}\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {loading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n </div>\n ) : rows.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-data'}\n title={\n search\n ? t('eventfullymanaged.events.list.emptySearch', 'No events match your search.')\n : t('eventfullymanaged.events.list.empty', 'No events yet.')\n }\n description={\n search\n ? t('eventfullymanaged.events.list.emptySearchHint', 'Try a different name.')\n : t('eventfullymanaged.events.list.emptyHint', 'Create your first event to get started.')\n }\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : visibleRows.length === 0 ? (\n <div className=\"space-y-3\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <p className=\"px-2 py-8 text-center text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.events.filters.empty',\n `No ${statusFilter} events on this page. Switch tabs or move to another page.`\n )}\n </p>\n </GlassCard>\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=\"events\"\n loading={loading}\n />\n </div>\n ) : viewMode === 'table' ? (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-card border border-border-seam\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('eventfullymanaged.events.table.name', 'Event')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.date', 'Date')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.venue', 'Venue')}</TableHead>\n <TableHead>{t('eventfullymanaged.events.table.status', 'Status')}</TableHead>\n <TableHead className=\"text-right\">\n {t('eventfullymanaged.events.table.attendees', 'Attendees')}\n </TableHead>\n <TableHead className=\"w-10\" aria-label={t('eventfullymanaged.events.table.actions', 'Actions')} />\n </TableRow>\n </TableHeader>\n <TableBody>\n {visibleRows.map((event) => {\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <TableRow\n key={event.id}\n className=\"cursor-pointer\"\n tabIndex={0}\n aria-label={event.name}\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n <TableCell className=\"max-w-[18rem]\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">{event.name}</span>\n {event.type ? (\n <Badge variant=\"secondary\" className=\"shrink-0 capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDateRange(event.startAt, event.endAt)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </TableCell>\n <TableCell>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-right tabular-nums text-text-primary\">\n {registrations.toLocaleString()}\n <span className=\"ml-1 text-xs text-text-muted\">({checkInPct}%)</span>\n </TableCell>\n <TableCell\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n >\n <ActionMenu\n ariaLabel={`Event actions for ${event.name}`}\n entityName={event.name}\n deleteLabel=\"Delete event\"\n onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\n onDelete={() => handleDeleteEvent(event)}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\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=\"events\"\n loading={loading}\n />\n </div>\n ) : (\n <div className=\"space-y-3\">\n {visibleRows.map((event) => {\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <GlassCard\n key={event.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={event.name}\n className=\"group relative cursor-pointer overflow-hidden border-border-seam p-0 outline-none transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n {/* Cover accent strip */}\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 left-0 w-1.5 bg-gradient-to-b from-[var(--color-chart-1)] to-[var(--color-chart-2)]\"\n />\n <div className=\"flex flex-col gap-3 py-4 pl-5 pr-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-lg font-semibold text-text-primary\">{event.name}</p>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : null}\n {event.type ? (\n <Badge variant=\"secondary\" className=\"capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n <div className=\"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 shrink-0 text-text-muted\" />\n {formatDateRange(event.startAt, event.endAt)}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.registered', 'registered')}\n value={registrations.toLocaleString()}\n />\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.checkedIn', 'checked in')}\n value={`${checkInPct}%`}\n />\n <MiniStat\n icon={Users}\n label={t('eventfullymanaged.events.card.capacity', 'capacity')}\n value={event.capacity != null ? event.capacity.toLocaleString() : '—'}\n />\n </div>\n </div>\n <div\n className=\"flex shrink-0 items-center gap-2 self-start sm:self-center\"\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n role=\"presentation\"\n >\n <ActionMenu\n ariaLabel={`Event actions for ${event.name}`}\n entityName={event.name}\n deleteLabel=\"Delete event\"\n onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\n onDelete={() => handleDeleteEvent(event)}\n />\n </div>\n </div>\n </GlassCard>\n );\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=\"events\"\n loading={loading}\n />\n </div>\n )}\n\n <NextSteps\n storageKey=\"eventfullymanaged-events\"\n title={t('eventfullymanaged.events.nextSteps.title', 'Finish setting up your event')}\n steps={[\n {\n id: 'configure-registration',\n label: t('eventfullymanaged.events.nextSteps.registration', 'Configure registration & tickets'),\n description: t(\n 'eventfullymanaged.events.nextSteps.registrationDesc',\n 'Open an event and define ticket types so people can register.'\n ),\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'plan-networking',\n label: t('eventfullymanaged.events.nextSteps.networking', 'Plan networking & sessions'),\n description: t(\n 'eventfullymanaged.events.nextSteps.networkingDesc',\n 'Set up attendee matchmaking and meeting schedules.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'announce',\n label: t('eventfullymanaged.events.nextSteps.announce', 'Announce to attendees'),\n description: t(\n 'eventfullymanaged.events.nextSteps.announceDesc',\n 'Send announcements and run communication campaigns.'\n ),\n icon: <CalendarPlus className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -3,10 +3,10 @@ import { notify as t } from "../../lib/toast.js";
3
3
  import { useCreateVenueMutation as n, useUpdateVenueMutation as r, useVenueQuery as i } from "../../api/eventApi.js";
4
4
  import { describeError as a, mutationSucceeded as o } from "../../lib/mutationResult.js";
5
5
  import { useEffect as s, useMemo as c, useState as l } from "react";
6
- import { useParams as u } from "react-router";
7
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
- import { ArrowLeft as p, Save as m } from "lucide-react";
9
- import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { useParams as d } from "react-router";
8
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
+ import { ArrowLeft as m, Save as h } from "lucide-react";
10
10
  import { Button as g, EmphasisPanel as _, GradientText as v, Input as y, PagePurpose as b, Select as x, SelectContent as S, SelectItem as C, SelectTrigger as w, SelectValue as T, Textarea as E } from "@burdenoff/fe-libs/ui";
11
11
  //#region src/eventfullymanaged/pages/venues/VenueFormPage.tsx
12
12
  var D = {
@@ -22,10 +22,10 @@ var D = {
22
22
  status: "ACTIVE"
23
23
  };
24
24
  function O() {
25
- let { t: O } = h(), k = (e, t) => {
25
+ let { t: O } = u(), k = (e, t) => {
26
26
  let n = O(e);
27
27
  return n === e ? t : n;
28
- }, { id: A = "" } = u(), j = c(() => !!A, [A]), { navigate: M } = e(), { data: N } = i(A), [P, { loading: F }] = n(), [I, { loading: L }] = r(), [R, z] = l(D);
28
+ }, { id: A = "" } = d(), j = c(() => !!A, [A]), { navigate: M } = e(), { data: N } = i(A), [P, { loading: F }] = n(), [I, { loading: L }] = r(), [R, z] = l(D);
29
29
  s(() => {
30
30
  !j || !N?.venue || z({
31
31
  name: N.venue.name ?? "",
@@ -79,50 +79,50 @@ function O() {
79
79
  t.error("Could not save venue", a(e));
80
80
  }
81
81
  }, H = F || L;
82
- return /* @__PURE__ */ f("div", {
82
+ return /* @__PURE__ */ p("div", {
83
83
  className: "space-y-6 p-6",
84
84
  children: [
85
- /* @__PURE__ */ f("div", { children: [
86
- /* @__PURE__ */ f(g, {
85
+ /* @__PURE__ */ p("div", { children: [
86
+ /* @__PURE__ */ p(g, {
87
87
  type: "button",
88
88
  variant: "ghost",
89
89
  size: "sm",
90
90
  onClick: () => M("/venues"),
91
- children: [/* @__PURE__ */ d(p, { className: "h-4 w-4" }), k("eventfullymanaged.venues.form.backToVenues", "Back to Venues")]
91
+ children: [/* @__PURE__ */ f(m, { className: "h-4 w-4" }), k("eventfullymanaged.venues.form.backToVenues", "Back to Venues")]
92
92
  }),
93
- /* @__PURE__ */ d(v, {
93
+ /* @__PURE__ */ f(v, {
94
94
  as: "h1",
95
95
  className: "mt-3 text-2xl font-bold",
96
96
  children: j ? k("eventfullymanaged.venues.form.editTitle", "Edit Venue") : k("eventfullymanaged.venues.form.createTitle", "Create Venue")
97
97
  }),
98
- /* @__PURE__ */ d("p", {
98
+ /* @__PURE__ */ f("p", {
99
99
  className: "mt-1 text-sm text-text-secondary",
100
100
  children: k("eventfullymanaged.venues.form.description", "Manage venue details with live backend persistence.")
101
101
  })
102
102
  ] }),
103
- /* @__PURE__ */ d(b, { children: k("eventfullymanaged.venues.form.purpose", "Describe a space so you can reuse it across events. Capacity drives how many attendees you can register, the address helps people find it, and amenities tell organizers what is already provided. Fill this in once and every future event can simply point at this venue.") }),
104
- /* @__PURE__ */ d(_, { children: /* @__PURE__ */ f("form", {
103
+ /* @__PURE__ */ f(b, { children: k("eventfullymanaged.venues.form.purpose", "Describe a space so you can reuse it across events. Capacity drives how many attendees you can register, the address helps people find it, and amenities tell organizers what is already provided. Fill this in once and every future event can simply point at this venue.") }),
104
+ /* @__PURE__ */ f(_, { children: /* @__PURE__ */ p("form", {
105
105
  onSubmit: V,
106
106
  className: "space-y-4",
107
107
  children: [
108
- /* @__PURE__ */ f("div", {
108
+ /* @__PURE__ */ p("div", {
109
109
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
110
- children: [/* @__PURE__ */ f("label", {
110
+ children: [/* @__PURE__ */ p("label", {
111
111
  className: "space-y-1 text-sm",
112
- children: [/* @__PURE__ */ d("span", {
112
+ children: [/* @__PURE__ */ f("span", {
113
113
  className: "font-medium text-text-primary",
114
114
  children: k("eventfullymanaged.venues.form.fields.name", "Name")
115
- }), /* @__PURE__ */ d(y, {
115
+ }), /* @__PURE__ */ f(y, {
116
116
  value: R.name,
117
117
  onChange: (e) => B("name", e.target.value),
118
118
  required: !0
119
119
  })]
120
- }), /* @__PURE__ */ f("label", {
120
+ }), /* @__PURE__ */ p("label", {
121
121
  className: "space-y-1 text-sm",
122
- children: [/* @__PURE__ */ d("span", {
122
+ children: [/* @__PURE__ */ f("span", {
123
123
  className: "font-medium text-text-primary",
124
124
  children: k("eventfullymanaged.venues.form.fields.capacity", "Capacity")
125
- }), /* @__PURE__ */ d(y, {
125
+ }), /* @__PURE__ */ f(y, {
126
126
  value: R.capacity,
127
127
  onChange: (e) => B("capacity", e.target.value),
128
128
  type: "number",
@@ -130,96 +130,96 @@ function O() {
130
130
  })]
131
131
  })]
132
132
  }),
133
- /* @__PURE__ */ f("label", {
133
+ /* @__PURE__ */ p("label", {
134
134
  className: "block space-y-1 text-sm",
135
- children: [/* @__PURE__ */ d("span", {
135
+ children: [/* @__PURE__ */ f("span", {
136
136
  className: "font-medium text-text-primary",
137
137
  children: k("eventfullymanaged.venues.form.fields.description", "Description")
138
- }), /* @__PURE__ */ d(E, {
138
+ }), /* @__PURE__ */ f(E, {
139
139
  value: R.description,
140
140
  onChange: (e) => B("description", e.target.value),
141
141
  rows: 3
142
142
  })]
143
143
  }),
144
- /* @__PURE__ */ f("div", {
144
+ /* @__PURE__ */ p("div", {
145
145
  className: "grid grid-cols-1 gap-4 md:grid-cols-4",
146
146
  children: [
147
- /* @__PURE__ */ f("label", {
147
+ /* @__PURE__ */ p("label", {
148
148
  className: "space-y-1 text-sm md:col-span-2",
149
- children: [/* @__PURE__ */ d("span", {
149
+ children: [/* @__PURE__ */ f("span", {
150
150
  className: "font-medium text-text-primary",
151
151
  children: k("eventfullymanaged.venues.form.fields.address", "Address")
152
- }), /* @__PURE__ */ d(y, {
152
+ }), /* @__PURE__ */ f(y, {
153
153
  value: R.addressLine1,
154
154
  onChange: (e) => B("addressLine1", e.target.value)
155
155
  })]
156
156
  }),
157
- /* @__PURE__ */ f("label", {
157
+ /* @__PURE__ */ p("label", {
158
158
  className: "space-y-1 text-sm",
159
- children: [/* @__PURE__ */ d("span", {
159
+ children: [/* @__PURE__ */ f("span", {
160
160
  className: "font-medium text-text-primary",
161
161
  children: k("eventfullymanaged.venues.form.fields.city", "City")
162
- }), /* @__PURE__ */ d(y, {
162
+ }), /* @__PURE__ */ f(y, {
163
163
  value: R.city,
164
164
  onChange: (e) => B("city", e.target.value)
165
165
  })]
166
166
  }),
167
- /* @__PURE__ */ f("label", {
167
+ /* @__PURE__ */ p("label", {
168
168
  className: "space-y-1 text-sm",
169
- children: [/* @__PURE__ */ d("span", {
169
+ children: [/* @__PURE__ */ f("span", {
170
170
  className: "font-medium text-text-primary",
171
171
  children: k("eventfullymanaged.venues.form.fields.state", "State")
172
- }), /* @__PURE__ */ d(y, {
172
+ }), /* @__PURE__ */ f(y, {
173
173
  value: R.state,
174
174
  onChange: (e) => B("state", e.target.value)
175
175
  })]
176
176
  })
177
177
  ]
178
178
  }),
179
- /* @__PURE__ */ f("div", {
179
+ /* @__PURE__ */ p("div", {
180
180
  className: "grid grid-cols-1 gap-4 md:grid-cols-3",
181
181
  children: [
182
- /* @__PURE__ */ f("label", {
182
+ /* @__PURE__ */ p("label", {
183
183
  className: "space-y-1 text-sm",
184
- children: [/* @__PURE__ */ d("span", {
184
+ children: [/* @__PURE__ */ f("span", {
185
185
  className: "font-medium text-text-primary",
186
186
  children: k("eventfullymanaged.venues.form.fields.country", "Country")
187
- }), /* @__PURE__ */ d(y, {
187
+ }), /* @__PURE__ */ f(y, {
188
188
  value: R.country,
189
189
  onChange: (e) => B("country", e.target.value)
190
190
  })]
191
191
  }),
192
- /* @__PURE__ */ f("label", {
192
+ /* @__PURE__ */ p("label", {
193
193
  className: "space-y-1 text-sm",
194
- children: [/* @__PURE__ */ d("span", {
194
+ children: [/* @__PURE__ */ f("span", {
195
195
  className: "font-medium text-text-primary",
196
196
  children: k("eventfullymanaged.venues.form.fields.postalCode", "Postal Code")
197
- }), /* @__PURE__ */ d(y, {
197
+ }), /* @__PURE__ */ f(y, {
198
198
  value: R.postalCode,
199
199
  onChange: (e) => B("postalCode", e.target.value)
200
200
  })]
201
201
  }),
202
- /* @__PURE__ */ f("label", {
202
+ /* @__PURE__ */ p("label", {
203
203
  className: "space-y-1 text-sm",
204
- children: [/* @__PURE__ */ d("span", {
204
+ children: [/* @__PURE__ */ f("span", {
205
205
  className: "font-medium text-text-primary",
206
206
  children: k("eventfullymanaged.venues.form.fields.status", "Status")
207
- }), /* @__PURE__ */ f(x, {
207
+ }), /* @__PURE__ */ p(x, {
208
208
  value: R.status,
209
209
  onValueChange: (e) => B("status", e),
210
- children: [/* @__PURE__ */ d(w, {
210
+ children: [/* @__PURE__ */ f(w, {
211
211
  "aria-label": k("eventfullymanaged.venues.form.fields.status", "Status"),
212
- children: /* @__PURE__ */ d(T, {})
213
- }), /* @__PURE__ */ f(S, { children: [
214
- /* @__PURE__ */ d(C, {
212
+ children: /* @__PURE__ */ f(T, {})
213
+ }), /* @__PURE__ */ p(S, { children: [
214
+ /* @__PURE__ */ f(C, {
215
215
  value: "ACTIVE",
216
216
  children: k("eventfullymanaged.venues.form.statusOptions.active", "Active")
217
217
  }),
218
- /* @__PURE__ */ d(C, {
218
+ /* @__PURE__ */ f(C, {
219
219
  value: "INACTIVE",
220
220
  children: k("eventfullymanaged.venues.form.statusOptions.inactive", "Inactive")
221
221
  }),
222
- /* @__PURE__ */ d(C, {
222
+ /* @__PURE__ */ f(C, {
223
223
  value: "MAINTENANCE",
224
224
  children: k("eventfullymanaged.venues.form.statusOptions.maintenance", "Maintenance")
225
225
  })
@@ -228,23 +228,23 @@ function O() {
228
228
  })
229
229
  ]
230
230
  }),
231
- /* @__PURE__ */ f("label", {
231
+ /* @__PURE__ */ p("label", {
232
232
  className: "block space-y-1 text-sm",
233
- children: [/* @__PURE__ */ d("span", {
233
+ children: [/* @__PURE__ */ f("span", {
234
234
  className: "font-medium text-text-primary",
235
235
  children: k("eventfullymanaged.venues.form.fields.amenities", "Amenities (comma separated)")
236
- }), /* @__PURE__ */ d(y, {
236
+ }), /* @__PURE__ */ f(y, {
237
237
  value: R.amenities,
238
238
  onChange: (e) => B("amenities", e.target.value),
239
239
  placeholder: k("eventfullymanaged.venues.form.amenitiesPlaceholder", "wifi, parking, catering")
240
240
  })]
241
241
  }),
242
- /* @__PURE__ */ d("div", {
242
+ /* @__PURE__ */ f("div", {
243
243
  className: "flex justify-end",
244
- children: /* @__PURE__ */ f(g, {
244
+ children: /* @__PURE__ */ p(g, {
245
245
  type: "submit",
246
246
  disabled: H,
247
- children: [/* @__PURE__ */ d(m, { className: "h-4 w-4" }), H ? k("eventfullymanaged.venues.form.actions.saving", "Saving...") : k("eventfullymanaged.venues.form.actions.save", "Save Venue")]
247
+ children: [/* @__PURE__ */ f(h, { className: "h-4 w-4" }), H ? k("eventfullymanaged.venues.form.actions.saving", "Saving...") : k("eventfullymanaged.venues.form.actions.save", "Save Venue")]
248
248
  })
249
249
  })
250
250
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../src/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../src/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAQjE"}
@@ -1,12 +1,14 @@
1
- import { useSandboxAssistantTransport as e } from "@burdenoff/fe-libs/shared/assistant";
1
+ import { gatherPageContext as e } from "../utils/pageContext.js";
2
+ import { useSandboxAssistantTransport as t } from "@burdenoff/fe-libs/shared/assistant";
2
3
  //#region src/services/createSandboxAssistantTransport.ts
3
- function t() {
4
- return e({
4
+ function n() {
5
+ return t({
5
6
  product: "eventfullymanaged",
7
+ gatherPageContext: e,
6
8
  enableCredits: !0
7
9
  });
8
10
  }
9
11
  //#endregion
10
- export { t as useSandboxAssistantTransport };
12
+ export { n as useSandboxAssistantTransport };
11
13
 
12
14
  //# sourceMappingURL=createSandboxAssistantTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../src/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * eventfullymanaged adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'eventfullymanaged',\n\n enableCredits: true,\n });\n}\n"],"mappings":";;AAwBA,SAAgB,IAAmD;AACjE,QAAO,EAAmB;EACxB,SAAS;EAET,eAAe;EAChB,CAAC"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../src/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * eventfullymanaged adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\nimport { gatherPageContext } from '../utils/pageContext';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'eventfullymanaged',\n // Route-derived ids only (BOFF-3741): lets the assistant act on \"this\n // event / session / sponsor\" without a clarifying question.\n gatherPageContext,\n enableCredits: true,\n });\n}\n"],"mappings":";;;AAyBA,SAAgB,IAAmD;AACjE,QAAO,EAAmB;EACxB,SAAS;EAGT;EACA,eAAe;EAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { useTr } from './useTr';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * useTr — translation hook with fallback semantics.
3
+ *
4
+ * Wraps `useI18n().t()` so that when a key has no translation (i.e. the
5
+ * provider returns the key itself), the caller's English fallback is used
6
+ * instead. This keeps consumer call sites consistent and avoids leaking
7
+ * untranslated keys into the UI.
8
+ *
9
+ * Supports optional interpolation params using `{{key}}` placeholders.
10
+ *
11
+ * @example
12
+ * const tr = useTr();
13
+ * return <h1>{tr('eventfullymanaged.dashboard.title', 'Dashboard')}</h1>;
14
+ * return <p>{tr('eventfullymanaged.delete.confirm', 'Delete {{count}} items?', { count: 5 })}</p>;
15
+ */
16
+ export declare function useTr(): (key: string, fallback: string, params?: Record<string, string | number>) => string;
17
+ //# sourceMappingURL=useTr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTr.d.ts","sourceRoot":"","sources":["../../../src/shared/hooks/useTr.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAc3G"}
@@ -0,0 +1,14 @@
1
+ import { useCallback as e } from "react";
2
+ import { useI18n as t } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
+ //#region src/shared/hooks/useTr.ts
4
+ function n() {
5
+ let { t: n } = t();
6
+ return e((e, t, r) => {
7
+ let i = n(e), a = i === e ? t : i;
8
+ return r ? Object.entries(r).reduce((e, [t, n]) => e.replace(RegExp(`\\{\\{${t}\\}\\}`, "g"), String(n)), a) : a;
9
+ }, [n]);
10
+ }
11
+ //#endregion
12
+ export { n as useTr };
13
+
14
+ //# sourceMappingURL=useTr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTr.js","names":[],"sources":["../../../src/shared/hooks/useTr.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n/**\n * useTr — translation hook with fallback semantics.\n *\n * Wraps `useI18n().t()` so that when a key has no translation (i.e. the\n * provider returns the key itself), the caller's English fallback is used\n * instead. This keeps consumer call sites consistent and avoids leaking\n * untranslated keys into the UI.\n *\n * Supports optional interpolation params using `{{key}}` placeholders.\n *\n * @example\n * const tr = useTr();\n * return <h1>{tr('eventfullymanaged.dashboard.title', 'Dashboard')}</h1>;\n * return <p>{tr('eventfullymanaged.delete.confirm', 'Delete {{count}} items?', { count: 5 })}</p>;\n */\nexport function useTr(): (key: string, fallback: string, params?: Record<string, string | number>) => string {\n const { t } = useI18n();\n return useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>): string => {\n const translated = t(key);\n const raw = translated === key ? fallback : translated;\n if (!params) return raw;\n return Object.entries(params).reduce(\n (str, [k, v]) => str.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), String(v)),\n raw\n );\n },\n [t]\n );\n}\n"],"mappings":";;;AAkBA,SAAgB,IAA6F;CAC3G,IAAM,EAAE,SAAM,GAAS;AACvB,QAAO,GACJ,GAAa,GAAkB,MAAqD;EACnF,IAAM,IAAa,EAAE,EAAI,EACnB,IAAM,MAAe,IAAM,IAAW;AAE5C,SADK,IACE,OAAO,QAAQ,EAAO,CAAC,QAC3B,GAAK,CAAC,GAAG,OAAO,EAAI,QAAY,OAAO,SAAS,EAAE,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,EAC5E,EACD,GAJmB;IAMtB,CAAC,EAAE,CACJ"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Page context for the EventfullyManaged AI assistant (BOFF-3741).
3
+ *
4
+ * Captures where the organizer is in the app — the URL, the page and the record
5
+ * on screen — so the floating assistant can act on "this event", "this session"
6
+ * or "here" without asking which record the user means.
7
+ *
8
+ * Data boundary: this module emits ids and route names only. It never reads the
9
+ * DOM, the Apollo cache or any form state, so attendee names and emails, lead
10
+ * contact details, speaker bios and networking-profile free text cannot reach
11
+ * the assistant through it. The query string and fragment are dropped from
12
+ * `currentUrl` as well: they can carry search text or tokens, and the sandbox's
13
+ * key allow-list only filters keys after the payload has left the browser.
14
+ */
15
+ /**
16
+ * Entity types the assistant understands for EventfullyManaged. The api-calls
17
+ * guide in algoshred/ai-assistant (`context/api-calls/products/eventfullymanaged.md`)
18
+ * documents each one with the query that reads it; keep the two in step.
19
+ */
20
+ export declare const EVENTFULLYMANAGED_ENTITY_TYPES: readonly ["EVENTFULLYMANAGED_EVENT", "EVENTFULLYMANAGED_SESSION", "EVENTFULLYMANAGED_TICKET_TYPE", "EVENTFULLYMANAGED_VENUE", "EVENTFULLYMANAGED_SPONSOR", "EVENTFULLYMANAGED_SPEAKER", "EVENTFULLYMANAGED_ATTENDEE", "EVENTFULLYMANAGED_PROMO_CODE", "EVENTFULLYMANAGED_NETWORKING_PROFILE", "EVENTFULLYMANAGED_MEETING", "EVENTFULLYMANAGED_EXHIBITOR"];
21
+ export type EventfullyManagedEntityType = (typeof EVENTFULLYMANAGED_ENTITY_TYPES)[number];
22
+ /**
23
+ * A `type` alias rather than an `interface`, on purpose: TypeScript gives a type
24
+ * alias an implicit index signature, which keeps it assignable to the shared
25
+ * transport's `gatherPageContext: () => object` seam without a cast.
26
+ *
27
+ * Every key here is on the sandbox agent's allow-list
28
+ * (`ALLOWED_CONTEXT_KEYS` in ai-assistant `src/context-loader.ts`). In particular
29
+ * the URL key is `currentUrl`: an `activeUrl` key would be silently dropped.
30
+ */
31
+ export type PageContext = {
32
+ currentUrl: string;
33
+ currentPage: string;
34
+ entityType?: EventfullyManagedEntityType;
35
+ entityId?: string;
36
+ activeTab?: string;
37
+ platform: string;
38
+ version: string;
39
+ viewportSize: string;
40
+ };
41
+ export interface ResolvedEntity {
42
+ entityType?: EventfullyManagedEntityType;
43
+ entityId?: string;
44
+ activeTab?: string;
45
+ }
46
+ /**
47
+ * Strip the mount prefix and any trailing slash, so the table above matches
48
+ * the same page whether the MFE runs inside the app shell
49
+ * (`/eventfullymanaged/events/abc`) or standalone in dev (`/events/abc`).
50
+ */
51
+ export declare function toProductPath(pathname: string): string;
52
+ /**
53
+ * Resolve the record the user is looking at from the route alone.
54
+ *
55
+ * Returns an empty object on list, dashboard and create pages: there is no
56
+ * "this" there, and a guessed entity is worse than none because the assistant
57
+ * would act on it confidently.
58
+ */
59
+ export declare function resolveEventfullyManagedEntity(pathname: string): ResolvedEntity;
60
+ /**
61
+ * Up to three path segments under the product, e.g. `events/<id>/sessions`.
62
+ * Matches the shape every other product sends, so the agent can name the page.
63
+ */
64
+ export declare function toCurrentPage(pathname: string): string;
65
+ export declare function gatherPageContext(): PageContext;
66
+ //# sourceMappingURL=pageContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../src/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,2VAYjC,CAAC;AAEX,MAAM,MAAM,2BAA2B,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1F;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+FD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtD;AAUD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAc/E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAcD,wBAAgB,iBAAiB,IAAI,WAAW,CAY/C"}