@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.
- package/dist/eventfullymanaged/EventfullyManagedRoot.d.ts.map +1 -1
- package/dist/eventfullymanaged/EventfullyManagedRoot.js +31 -19
- package/dist/eventfullymanaged/EventfullyManagedRoot.js.map +1 -1
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +104 -107
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +77 -77
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +180 -180
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +56 -56
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -1
- package/dist/services/createSandboxAssistantTransport.js +6 -4
- package/dist/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/shared/hooks/index.d.ts +2 -0
- package/dist/shared/hooks/index.d.ts.map +1 -0
- package/dist/shared/hooks/useTr.d.ts +17 -0
- package/dist/shared/hooks/useTr.d.ts.map +1 -0
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/dist/utils/pageContext.d.ts +66 -0
- package/dist/utils/pageContext.d.ts.map +1 -0
- package/dist/utils/pageContext.js +133 -0
- package/dist/utils/pageContext.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":"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"}
|
|
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 {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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 } =
|
|
25
|
+
let { t: O } = u(), k = (e, t) => {
|
|
26
26
|
let n = O(e);
|
|
27
27
|
return n === e ? t : n;
|
|
28
|
-
}, { id: A = "" } =
|
|
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__ */
|
|
82
|
+
return /* @__PURE__ */ p("div", {
|
|
83
83
|
className: "space-y-6 p-6",
|
|
84
84
|
children: [
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
/* @__PURE__ */
|
|
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__ */
|
|
91
|
+
children: [/* @__PURE__ */ f(m, { className: "h-4 w-4" }), k("eventfullymanaged.venues.form.backToVenues", "Back to Venues")]
|
|
92
92
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
104
|
-
/* @__PURE__ */
|
|
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__ */
|
|
108
|
+
/* @__PURE__ */ p("div", {
|
|
109
109
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
110
|
+
children: [/* @__PURE__ */ p("label", {
|
|
111
111
|
className: "space-y-1 text-sm",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
120
|
+
}), /* @__PURE__ */ p("label", {
|
|
121
121
|
className: "space-y-1 text-sm",
|
|
122
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
133
|
+
/* @__PURE__ */ p("label", {
|
|
134
134
|
className: "block space-y-1 text-sm",
|
|
135
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
144
|
+
/* @__PURE__ */ p("div", {
|
|
145
145
|
className: "grid grid-cols-1 gap-4 md:grid-cols-4",
|
|
146
146
|
children: [
|
|
147
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ p("label", {
|
|
148
148
|
className: "space-y-1 text-sm md:col-span-2",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
152
|
+
}), /* @__PURE__ */ f(y, {
|
|
153
153
|
value: R.addressLine1,
|
|
154
154
|
onChange: (e) => B("addressLine1", e.target.value)
|
|
155
155
|
})]
|
|
156
156
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ p("label", {
|
|
158
158
|
className: "space-y-1 text-sm",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
162
|
+
}), /* @__PURE__ */ f(y, {
|
|
163
163
|
value: R.city,
|
|
164
164
|
onChange: (e) => B("city", e.target.value)
|
|
165
165
|
})]
|
|
166
166
|
}),
|
|
167
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ p("label", {
|
|
168
168
|
className: "space-y-1 text-sm",
|
|
169
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
179
|
+
/* @__PURE__ */ p("div", {
|
|
180
180
|
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
181
181
|
children: [
|
|
182
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ p("label", {
|
|
183
183
|
className: "space-y-1 text-sm",
|
|
184
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
187
|
+
}), /* @__PURE__ */ f(y, {
|
|
188
188
|
value: R.country,
|
|
189
189
|
onChange: (e) => B("country", e.target.value)
|
|
190
190
|
})]
|
|
191
191
|
}),
|
|
192
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ p("label", {
|
|
193
193
|
className: "space-y-1 text-sm",
|
|
194
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
197
|
+
}), /* @__PURE__ */ f(y, {
|
|
198
198
|
value: R.postalCode,
|
|
199
199
|
onChange: (e) => B("postalCode", e.target.value)
|
|
200
200
|
})]
|
|
201
201
|
}),
|
|
202
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ p("label", {
|
|
203
203
|
className: "space-y-1 text-sm",
|
|
204
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
207
|
+
}), /* @__PURE__ */ p(x, {
|
|
208
208
|
value: R.status,
|
|
209
209
|
onValueChange: (e) => B("status", e),
|
|
210
|
-
children: [/* @__PURE__ */
|
|
210
|
+
children: [/* @__PURE__ */ f(w, {
|
|
211
211
|
"aria-label": k("eventfullymanaged.venues.form.fields.status", "Status"),
|
|
212
|
-
children: /* @__PURE__ */
|
|
213
|
-
}), /* @__PURE__ */
|
|
214
|
-
/* @__PURE__ */
|
|
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__ */
|
|
218
|
+
/* @__PURE__ */ f(C, {
|
|
219
219
|
value: "INACTIVE",
|
|
220
220
|
children: k("eventfullymanaged.venues.form.statusOptions.inactive", "Inactive")
|
|
221
221
|
}),
|
|
222
|
-
/* @__PURE__ */
|
|
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__ */
|
|
231
|
+
/* @__PURE__ */ p("label", {
|
|
232
232
|
className: "block space-y-1 text-sm",
|
|
233
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
242
|
+
/* @__PURE__ */ f("div", {
|
|
243
243
|
className: "flex justify-end",
|
|
244
|
-
children: /* @__PURE__ */
|
|
244
|
+
children: /* @__PURE__ */ p(g, {
|
|
245
245
|
type: "submit",
|
|
246
246
|
disabled: H,
|
|
247
|
-
children: [/* @__PURE__ */
|
|
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;
|
|
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 {
|
|
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
|
|
4
|
-
return
|
|
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 {
|
|
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":"
|
|
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 @@
|
|
|
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"}
|