@burdenoff/microfe-eventfullymanaged 2026.819.1 → 2026.825.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 { 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 } = useEventsQuery({ search, limit: pagination.limit, offset: pagination.offset });\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 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 onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\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 onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\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 { useDeleteEventMutation, useEventsQuery, useSponsorsQuery, useVenuesQuery } from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { notify } from '../../lib/toast';\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 [deleteEvent] = useDeleteEventMutation();\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 onDeleteEvent = async (event: EventRow) => {\n const response = await deleteEvent({ variables: { id: event.id } });\n if (response.error || !response.data?.deleteEvent) {\n notify.error('Could not delete event', response.error?.message ?? 'The server did not confirm the change.');\n throw response.error ?? new Error('delete-unconfirmed');\n }\n notify.success('Event deleted', event.name);\n await 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={() => onDeleteEvent(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={() => onDeleteEvent(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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-eventfullymanaged",
3
- "version": "2026.819.1",
3
+ "version": "2026.825.1",
4
4
  "description": "EventfullyManaged - End-to-end event management platform",
5
5
  "type": "module",
6
6
  "files": [