@burdenoff/microfe-eventfullymanaged 2026.716.1 → 2026.719.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +15 -0
  2. package/dist/eventfullymanaged/api/eventApi.d.ts +40 -0
  3. package/dist/eventfullymanaged/api/eventApi.d.ts.map +1 -1
  4. package/dist/eventfullymanaged/api/eventApi.js +147 -117
  5. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  6. package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -1
  7. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +152 -135
  8. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -1
  9. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.d.ts.map +1 -1
  10. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +154 -117
  11. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  12. package/dist/eventfullymanaged/pages/modules/CommunicationPage.d.ts.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +228 -187
  14. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -1
  16. package/dist/eventfullymanaged/pages/modules/EventsPage.js +233 -122
  17. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  18. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.d.ts.map +1 -1
  19. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +255 -254
  20. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
  21. package/dist/eventfullymanaged/types/index.d.ts.map +1 -1
  22. package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -1
  23. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  24. package/dist/test/setup.d.ts +11 -0
  25. package/dist/test/setup.d.ts.map +1 -0
  26. package/package.json +11 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CommunicationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/CommunicationPage.tsx"],"sourcesContent":["import { Mail, Megaphone, Plus, Send, Upload } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Badge,\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport {\n useAnnouncementsQuery,\n useCommunicationCampaignsQuery,\n usePublishAnnouncementMutation,\n useSendCommunicationCampaignMutation,\n useUpsertAnnouncementMutation,\n useUpsertCommunicationCampaignMutation,\n} from '../../api/eventApi';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype SimpleRow = {\n id: string;\n name?: string | null;\n title?: string | null;\n status?: string | null;\n};\n\ntype ComposeKind = 'announcement' | 'campaign';\n\nfunction statusVariant(status: string): 'success' | 'warning' | 'secondary' | 'info' {\n const value = status.toLowerCase();\n if (['published', 'sent', 'active', 'completed'].includes(value)) return 'success';\n if (['cancelled', 'archived', 'failed', 'expired'].includes(value)) return 'warning';\n if (['draft', 'created', 'pending', 'scheduled'].includes(value)) return 'info';\n return 'secondary';\n}\n\nconst isDraft = (status?: string | null): boolean => {\n const value = (status ?? '').toLowerCase();\n return value === '' || value === 'draft' || value === 'created';\n};\n\nconst rowLabel = (row: SimpleRow, fallback: string): string => row.title ?? row.name ?? `${fallback} ${row.id}`;\n\nexport default function CommunicationPage() {\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\n const announcementPagination = usePagination({ pageSize: 8 });\n const campaignPagination = usePagination({ pageSize: 8 });\n\n const announcementsQuery = useAnnouncementsQuery({\n limit: announcementPagination.limit,\n offset: announcementPagination.offset,\n });\n const campaignsQuery = useCommunicationCampaignsQuery({\n limit: campaignPagination.limit,\n offset: campaignPagination.offset,\n });\n\n const [createAnnouncement, { loading: creatingAnnouncement }] = useUpsertAnnouncementMutation();\n const [publishAnnouncement, { loading: publishing }] = usePublishAnnouncementMutation();\n const [createCampaign, { loading: creatingCampaign }] = useUpsertCommunicationCampaignMutation();\n const [sendCampaign, { loading: sending }] = useSendCommunicationCampaignMutation();\n\n const [kind, setKind] = useState<ComposeKind>('announcement');\n const [subject, setSubject] = useState('');\n const [audience, setAudience] = useState('');\n const [body, setBody] = useState('');\n\n const announcements = useMemo(\n () => (announcementsQuery.data?.announcements.items ?? []) as SimpleRow[],\n [announcementsQuery.data]\n );\n const announcementTotal = announcementsQuery.data?.announcements.total ?? 0;\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as SimpleRow[],\n [campaignsQuery.data]\n );\n const campaignTotal = campaignsQuery.data?.communicationCampaigns.total ?? 0;\n\n const composing = kind === 'announcement' ? creatingAnnouncement : creatingCampaign;\n const resetCompose = () => {\n setSubject('');\n setAudience('');\n setBody('');\n };\n\n const onCompose = async () => {\n if (!subject.trim()) {\n notify.error(t('eventfullymanaged.communication.subjectRequired', 'Subject required'), '');\n return;\n }\n const metadata: Record<string, unknown> = {};\n if (body.trim()) metadata.body = body.trim();\n if (audience.trim()) metadata.audience = audience.trim();\n\n if (kind === 'announcement') {\n const failureMessage = t('eventfullymanaged.communication.errors.create', 'Could not create announcement');\n try {\n const response = await createAnnouncement({\n variables: { input: { title: subject, name: subject, status: 'draft', metadata } },\n });\n if (!mutationSucceeded(response, response.data?.upsertAnnouncement?.id, failureMessage)) return;\n resetCompose();\n notify.success(t('eventfullymanaged.communication.created', 'Announcement created'));\n await announcementsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n return;\n }\n\n const failureMessage = t('eventfullymanaged.communication.errors.createCampaign', 'Could not create campaign');\n try {\n const response = await createCampaign({\n variables: { input: { title: subject, name: subject, status: 'draft', metadata } },\n });\n if (!mutationSucceeded(response, response.data?.upsertCommunicationCampaign?.id, failureMessage)) return;\n resetCompose();\n notify.success(t('eventfullymanaged.communication.campaignCreated', 'Campaign created'));\n await campaignsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n const onPublishAnnouncement = async (row: SimpleRow) => {\n const failureMessage = t('eventfullymanaged.communication.errors.publish', 'Could not publish announcement');\n try {\n const response = await publishAnnouncement({ variables: { id: row.id } });\n if (!mutationSucceeded(response, response.data?.publishAnnouncement?.id, failureMessage)) return;\n notify.success(t('eventfullymanaged.communication.published', 'Announcement published'));\n await announcementsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n const onSendCampaign = async (row: SimpleRow) => {\n const failureMessage = t('eventfullymanaged.communication.errors.send', 'Could not send campaign');\n try {\n const response = await sendCampaign({ variables: { id: row.id } });\n if (!mutationSucceeded(response, response.data?.sendCommunicationCampaign?.id, failureMessage)) return;\n notify.success(t('eventfullymanaged.communication.sent', 'Campaign delivery started'));\n await campaignsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.communication.purpose',\n 'Keep attendees informed and engaged. Announcements are one-off broadcasts (a schedule change, a welcome message); campaigns are scheduled, multi-step outreach (reminder emails, follow-ups). Compose each one here, then publish an announcement or send a campaign — delivery runs server-side through the notification service.'\n )}\n </PagePurpose>\n\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.communication.title', 'Communications')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.description', 'Draft, publish and send from one place.')}\n </p>\n </div>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Button\n type=\"button\"\n variant={kind === 'announcement' ? 'default' : 'outline'}\n onClick={() => setKind('announcement')}\n >\n <Plus className=\"h-4 w-4\" />\n {t('eventfullymanaged.communication.actions.newAnnouncement', 'New announcement')}\n </Button>\n <Button\n type=\"button\"\n variant={kind === 'campaign' ? 'default' : 'outline'}\n onClick={() => setKind('campaign')}\n >\n <Plus className=\"h-4 w-4\" />\n {t('eventfullymanaged.communication.actions.newCampaign', 'New campaign')}\n </Button>\n </div>\n </div>\n\n {/* Compose + live preview */}\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {kind === 'announcement' ? (\n <Megaphone className=\"h-4 w-4 text-accent-primary\" />\n ) : (\n <Mail className=\"h-4 w-4 text-accent-primary\" />\n )}\n <h2 className=\"text-base font-semibold text-text-primary\">\n {kind === 'announcement'\n ? t('eventfullymanaged.communication.compose.announcement', 'Compose announcement')\n : t('eventfullymanaged.communication.compose.campaign', 'Compose campaign')}\n </h2>\n </div>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.subject', 'Subject')}\n </span>\n <Input\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n placeholder={t(\n 'eventfullymanaged.communication.fields.subjectPlaceholder',\n 'Q4 Product Roadmap Update'\n )}\n aria-label={t('eventfullymanaged.communication.fields.subject', 'Subject')}\n />\n </label>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.audience', 'Audience')}\n </span>\n <Input\n value={audience}\n onChange={(e) => setAudience(e.target.value)}\n placeholder={t('eventfullymanaged.communication.fields.audiencePlaceholder', 'All attendees')}\n aria-label={t('eventfullymanaged.communication.fields.audience', 'Audience')}\n />\n </label>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.body', 'Message')}\n </span>\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n rows={5}\n placeholder={t(\n 'eventfullymanaged.communication.fields.bodyPlaceholder',\n 'Hi there, here are the latest updates…'\n )}\n aria-label={t('eventfullymanaged.communication.fields.body', 'Message')}\n />\n </label>\n <div className=\"flex justify-end\">\n <Button type=\"button\" disabled={composing} onClick={onCompose}>\n {composing\n ? t('eventfullymanaged.communication.actions.saving', 'Saving…')\n : kind === 'announcement'\n ? t('eventfullymanaged.communication.actions.createAnnouncement', 'Create draft')\n : t('eventfullymanaged.communication.actions.createCampaign', 'Create draft')}\n </Button>\n </div>\n </div>\n\n {/* Live preview */}\n <div className=\"rounded-card border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center justify-between border-b border-border-seam pb-2\">\n <span className=\"flex items-center gap-2 text-xs font-medium uppercase tracking-wide text-text-muted\">\n <Mail className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.preview.label', 'Preview')}\n </span>\n <Badge variant=\"info\" className=\"uppercase\">\n {t('eventfullymanaged.communication.preview.draft', 'Draft')}\n </Badge>\n </div>\n <div className=\"mt-3 space-y-2\">\n <p className=\"text-base font-semibold text-text-primary\">\n {subject.trim() || t('eventfullymanaged.communication.preview.noSubject', 'Your subject line')}\n </p>\n {audience.trim() ? (\n <p className=\"text-xs text-text-secondary\">\n {t('eventfullymanaged.communication.preview.to', 'To')}: {audience.trim()}\n </p>\n ) : null}\n <p className=\"whitespace-pre-wrap text-sm text-text-secondary\">\n {body.trim() ||\n t('eventfullymanaged.communication.preview.noBody', 'Start typing to see your message preview here.')}\n </p>\n </div>\n </div>\n </div>\n </GlassCard>\n\n {/* Two-pane lists */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('eventfullymanaged.communication.announcements.heading', 'Announcements')}\n </h2>\n {announcementTotal > 0 ? <span className=\"text-sm text-text-muted\">{announcementTotal}</span> : null}\n </div>\n <div className=\"mt-4\">\n {announcementsQuery.loading && announcements.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.announcements.loading', 'Loading announcements…')}\n </p>\n ) : announcements.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.announcements.empty', 'No announcements yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {announcements.map((row) => (\n <li\n key={row.id}\n className=\"flex items-center justify-between gap-3 rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <p className=\"min-w-0 truncate font-medium text-text-primary\">\n {rowLabel(row, t('eventfullymanaged.communication.announcements.itemPrefix', 'Announcement'))}\n </p>\n <div className=\"flex shrink-0 items-center gap-2\">\n {row.status ? (\n <Badge variant={statusVariant(row.status)} className=\"uppercase\">\n {row.status}\n </Badge>\n ) : null}\n {isDraft(row.status) ? (\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={publishing}\n onClick={() => void onPublishAnnouncement(row)}\n >\n <Upload className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.actions.publish', 'Publish')}\n </Button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n )}\n <Pagination\n offset={announcementPagination.offset}\n limit={announcementPagination.limit}\n loadedCount={announcements.length}\n total={announcementTotal}\n onPrev={announcementPagination.prevPage}\n onNext={announcementPagination.nextPage}\n itemLabel={t('eventfullymanaged.communication.announcements.heading', 'Announcements').toLowerCase()}\n loading={announcementsQuery.loading}\n />\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('eventfullymanaged.communication.campaigns.heading', 'Campaigns')}\n </h2>\n {campaignTotal > 0 ? <span className=\"text-sm text-text-muted\">{campaignTotal}</span> : null}\n </div>\n <div className=\"mt-4\">\n {campaignsQuery.loading && campaigns.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.campaigns.loading', 'Loading campaigns…')}\n </p>\n ) : campaigns.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.campaigns.empty', 'No campaigns yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {campaigns.map((row) => (\n <li\n key={row.id}\n className=\"flex items-center justify-between gap-3 rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <p className=\"min-w-0 truncate font-medium text-text-primary\">\n {rowLabel(row, t('eventfullymanaged.communication.campaigns.itemPrefix', 'Campaign'))}\n </p>\n <div className=\"flex shrink-0 items-center gap-2\">\n {row.status ? (\n <Badge variant={statusVariant(row.status)} className=\"uppercase\">\n {row.status}\n </Badge>\n ) : null}\n {isDraft(row.status) ? (\n <Button type=\"button\" size=\"sm\" disabled={sending} onClick={() => void onSendCampaign(row)}>\n <Send className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.actions.send', 'Send campaign')}\n </Button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n )}\n <Pagination\n offset={campaignPagination.offset}\n limit={campaignPagination.limit}\n loadedCount={campaigns.length}\n total={campaignTotal}\n onPrev={campaignPagination.prevPage}\n onNext={campaignPagination.nextPage}\n itemLabel={t('eventfullymanaged.communication.campaigns.heading', 'Campaigns').toLowerCase()}\n loading={campaignsQuery.loading}\n />\n </div>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CommunicationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/CommunicationPage.tsx"],"sourcesContent":["import { Mail, Megaphone, Plus, Send, Upload } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Badge,\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport {\n useAnnouncementsQuery,\n useCommunicationCampaignsQuery,\n usePublishAnnouncementMutation,\n useSendCommunicationCampaignMutation,\n useUpsertAnnouncementMutation,\n useUpsertCommunicationCampaignMutation,\n} from '../../api/eventApi';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype SimpleRow = {\n id: string;\n name?: string | null;\n title?: string | null;\n status?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\n/** Read `metadata.schedule.sendAt` back off a campaign row, if present. */\nfunction scheduledSendAt(row: SimpleRow): string | null {\n const schedule = row.metadata?.schedule;\n if (!schedule || typeof schedule !== 'object' || Array.isArray(schedule)) return null;\n const sendAt = (schedule as Record<string, unknown>).sendAt;\n return typeof sendAt === 'string' && sendAt ? sendAt : null;\n}\n\ntype ComposeKind = 'announcement' | 'campaign';\n\nfunction statusVariant(status: string): 'success' | 'warning' | 'secondary' | 'info' {\n const value = status.toLowerCase();\n if (['published', 'sent', 'active', 'completed'].includes(value)) return 'success';\n if (['cancelled', 'archived', 'failed', 'expired'].includes(value)) return 'warning';\n if (['draft', 'created', 'pending', 'scheduled'].includes(value)) return 'info';\n return 'secondary';\n}\n\nconst isDraft = (status?: string | null): boolean => {\n const value = (status ?? '').toLowerCase();\n // 'scheduled' keeps the Send action visible so an organizer can trigger a\n // scheduled campaign early, or once its sendAt has passed (BOFF-4000).\n return value === '' || value === 'draft' || value === 'created' || value === 'scheduled';\n};\n\nconst rowLabel = (row: SimpleRow, fallback: string): string => row.title ?? row.name ?? `${fallback} ${row.id}`;\n\nexport default function CommunicationPage() {\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\n const announcementPagination = usePagination({ pageSize: 8 });\n const campaignPagination = usePagination({ pageSize: 8 });\n\n const announcementsQuery = useAnnouncementsQuery({\n limit: announcementPagination.limit,\n offset: announcementPagination.offset,\n });\n const campaignsQuery = useCommunicationCampaignsQuery({\n limit: campaignPagination.limit,\n offset: campaignPagination.offset,\n });\n\n const [createAnnouncement, { loading: creatingAnnouncement }] = useUpsertAnnouncementMutation();\n const [publishAnnouncement, { loading: publishing }] = usePublishAnnouncementMutation();\n const [createCampaign, { loading: creatingCampaign }] = useUpsertCommunicationCampaignMutation();\n const [sendCampaign, { loading: sending }] = useSendCommunicationCampaignMutation();\n\n const [kind, setKind] = useState<ComposeKind>('announcement');\n const [subject, setSubject] = useState('');\n const [audience, setAudience] = useState('');\n const [body, setBody] = useState('');\n const [scheduleAt, setScheduleAt] = useState('');\n\n const announcements = useMemo(\n () => (announcementsQuery.data?.announcements.items ?? []) as SimpleRow[],\n [announcementsQuery.data]\n );\n const announcementTotal = announcementsQuery.data?.announcements.total ?? 0;\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as SimpleRow[],\n [campaignsQuery.data]\n );\n const campaignTotal = campaignsQuery.data?.communicationCampaigns.total ?? 0;\n\n const composing = kind === 'announcement' ? creatingAnnouncement : creatingCampaign;\n const resetCompose = () => {\n setSubject('');\n setAudience('');\n setBody('');\n setScheduleAt('');\n };\n\n const onCompose = async () => {\n if (!subject.trim()) {\n notify.error(t('eventfullymanaged.communication.subjectRequired', 'Subject required'), '');\n return;\n }\n\n if (kind === 'announcement') {\n const metadata: Record<string, unknown> = {};\n if (body.trim()) metadata.body = body.trim();\n if (audience.trim()) metadata.audience = audience.trim();\n const failureMessage = t('eventfullymanaged.communication.errors.create', 'Could not create announcement');\n try {\n const response = await createAnnouncement({\n variables: { input: { title: subject, name: subject, status: 'draft', metadata } },\n });\n if (!mutationSucceeded(response, response.data?.upsertAnnouncement?.id, failureMessage)) return;\n resetCompose();\n notify.success(t('eventfullymanaged.communication.created', 'Announcement created'));\n await announcementsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n return;\n }\n\n // Campaigns persist structured content/targetAudience/schedule nested\n // under metadata — the backend reads them from there and stores each in\n // its own dedicated column (BOFF-4000).\n const segments = audience\n .split(',')\n .map((segment) => segment.trim())\n .filter(Boolean);\n const metadata: Record<string, unknown> = {};\n if (body.trim()) metadata.content = { body: body.trim() };\n if (segments.length > 0) metadata.targetAudience = { segments };\n if (scheduleAt) metadata.schedule = { sendAt: new Date(scheduleAt).toISOString() };\n\n const failureMessage = t('eventfullymanaged.communication.errors.createCampaign', 'Could not create campaign');\n try {\n const response = await createCampaign({\n variables: { input: { title: subject, name: subject, status: 'draft', metadata } },\n });\n if (!mutationSucceeded(response, response.data?.upsertCommunicationCampaign?.id, failureMessage)) return;\n resetCompose();\n notify.success(t('eventfullymanaged.communication.campaignCreated', 'Campaign created'));\n await campaignsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n const onPublishAnnouncement = async (row: SimpleRow) => {\n const failureMessage = t('eventfullymanaged.communication.errors.publish', 'Could not publish announcement');\n try {\n const response = await publishAnnouncement({ variables: { id: row.id } });\n if (!mutationSucceeded(response, response.data?.publishAnnouncement?.id, failureMessage)) return;\n notify.success(t('eventfullymanaged.communication.published', 'Announcement published'));\n await announcementsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n const onSendCampaign = async (row: SimpleRow) => {\n const failureMessage = t('eventfullymanaged.communication.errors.send', 'Could not send campaign');\n try {\n const response = await sendCampaign({ variables: { id: row.id } });\n if (!mutationSucceeded(response, response.data?.sendCommunicationCampaign?.id, failureMessage)) return;\n // A future schedule.sendAt keeps the campaign in `scheduled` rather than\n // dispatching immediately (BOFF-4000) — reflect that in the toast.\n if (response.data?.sendCommunicationCampaign?.status === 'scheduled') {\n notify.success(t('eventfullymanaged.communication.scheduled', 'Campaign scheduled for its send time'));\n } else {\n notify.success(t('eventfullymanaged.communication.sent', 'Campaign delivery started'));\n }\n await campaignsQuery.refetch();\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.communication.purpose',\n 'Keep attendees informed and engaged. Announcements are one-off broadcasts (a schedule change, a welcome message); campaigns are scheduled, multi-step outreach (reminder emails, follow-ups). Compose each one here, then publish an announcement or send a campaign — delivery runs server-side through the notification service.'\n )}\n </PagePurpose>\n\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.communication.title', 'Communications')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.description', 'Draft, publish and send from one place.')}\n </p>\n </div>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Button\n type=\"button\"\n variant={kind === 'announcement' ? 'default' : 'outline'}\n onClick={() => setKind('announcement')}\n >\n <Plus className=\"h-4 w-4\" />\n {t('eventfullymanaged.communication.actions.newAnnouncement', 'New announcement')}\n </Button>\n <Button\n type=\"button\"\n variant={kind === 'campaign' ? 'default' : 'outline'}\n onClick={() => setKind('campaign')}\n >\n <Plus className=\"h-4 w-4\" />\n {t('eventfullymanaged.communication.actions.newCampaign', 'New campaign')}\n </Button>\n </div>\n </div>\n\n {/* Compose + live preview */}\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {kind === 'announcement' ? (\n <Megaphone className=\"h-4 w-4 text-accent-primary\" />\n ) : (\n <Mail className=\"h-4 w-4 text-accent-primary\" />\n )}\n <h2 className=\"text-base font-semibold text-text-primary\">\n {kind === 'announcement'\n ? t('eventfullymanaged.communication.compose.announcement', 'Compose announcement')\n : t('eventfullymanaged.communication.compose.campaign', 'Compose campaign')}\n </h2>\n </div>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.subject', 'Subject')}\n </span>\n <Input\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n placeholder={t(\n 'eventfullymanaged.communication.fields.subjectPlaceholder',\n 'Q4 Product Roadmap Update'\n )}\n aria-label={t('eventfullymanaged.communication.fields.subject', 'Subject')}\n />\n </label>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.audience', 'Audience')}\n </span>\n <Input\n value={audience}\n onChange={(e) => setAudience(e.target.value)}\n placeholder={\n kind === 'campaign'\n ? t(\n 'eventfullymanaged.communication.fields.audienceSegmentsPlaceholder',\n 'vip, early-bird, speakers (comma-separated segments)'\n )\n : t('eventfullymanaged.communication.fields.audiencePlaceholder', 'All attendees')\n }\n aria-label={t('eventfullymanaged.communication.fields.audience', 'Audience')}\n />\n </label>\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.body', 'Message')}\n </span>\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n rows={5}\n placeholder={t(\n 'eventfullymanaged.communication.fields.bodyPlaceholder',\n 'Hi there, here are the latest updates…'\n )}\n aria-label={t('eventfullymanaged.communication.fields.body', 'Message')}\n />\n </label>\n {kind === 'campaign' ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.communication.fields.scheduleAt', 'Schedule send (optional)')}\n </span>\n <Input\n type=\"datetime-local\"\n value={scheduleAt}\n onChange={(e) => setScheduleAt(e.target.value)}\n aria-label={t('eventfullymanaged.communication.fields.scheduleAt', 'Schedule send (optional)')}\n />\n <span className=\"block text-xs text-text-muted\">\n {t(\n 'eventfullymanaged.communication.fields.scheduleHint',\n 'Leave blank to send immediately when you click Send campaign.'\n )}\n </span>\n </label>\n ) : null}\n <div className=\"flex justify-end\">\n <Button type=\"button\" disabled={composing} onClick={onCompose}>\n {composing\n ? t('eventfullymanaged.communication.actions.saving', 'Saving…')\n : kind === 'announcement'\n ? t('eventfullymanaged.communication.actions.createAnnouncement', 'Create draft')\n : t('eventfullymanaged.communication.actions.createCampaign', 'Create draft')}\n </Button>\n </div>\n </div>\n\n {/* Live preview */}\n <div className=\"rounded-card border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center justify-between border-b border-border-seam pb-2\">\n <span className=\"flex items-center gap-2 text-xs font-medium uppercase tracking-wide text-text-muted\">\n <Mail className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.preview.label', 'Preview')}\n </span>\n <Badge variant=\"info\" className=\"uppercase\">\n {t('eventfullymanaged.communication.preview.draft', 'Draft')}\n </Badge>\n </div>\n <div className=\"mt-3 space-y-2\">\n <p className=\"text-base font-semibold text-text-primary\">\n {subject.trim() || t('eventfullymanaged.communication.preview.noSubject', 'Your subject line')}\n </p>\n {audience.trim() ? (\n <p className=\"text-xs text-text-secondary\">\n {t('eventfullymanaged.communication.preview.to', 'To')}: {audience.trim()}\n </p>\n ) : null}\n <p className=\"whitespace-pre-wrap text-sm text-text-secondary\">\n {body.trim() ||\n t('eventfullymanaged.communication.preview.noBody', 'Start typing to see your message preview here.')}\n </p>\n </div>\n </div>\n </div>\n </GlassCard>\n\n {/* Two-pane lists */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('eventfullymanaged.communication.announcements.heading', 'Announcements')}\n </h2>\n {announcementTotal > 0 ? <span className=\"text-sm text-text-muted\">{announcementTotal}</span> : null}\n </div>\n <div className=\"mt-4\">\n {announcementsQuery.loading && announcements.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.announcements.loading', 'Loading announcements…')}\n </p>\n ) : announcements.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.announcements.empty', 'No announcements yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {announcements.map((row) => (\n <li\n key={row.id}\n className=\"flex items-center justify-between gap-3 rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <p className=\"min-w-0 truncate font-medium text-text-primary\">\n {rowLabel(row, t('eventfullymanaged.communication.announcements.itemPrefix', 'Announcement'))}\n </p>\n <div className=\"flex shrink-0 items-center gap-2\">\n {row.status ? (\n <Badge variant={statusVariant(row.status)} className=\"uppercase\">\n {row.status}\n </Badge>\n ) : null}\n {isDraft(row.status) ? (\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={publishing}\n onClick={() => void onPublishAnnouncement(row)}\n >\n <Upload className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.actions.publish', 'Publish')}\n </Button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n )}\n <Pagination\n offset={announcementPagination.offset}\n limit={announcementPagination.limit}\n loadedCount={announcements.length}\n total={announcementTotal}\n onPrev={announcementPagination.prevPage}\n onNext={announcementPagination.nextPage}\n itemLabel={t('eventfullymanaged.communication.announcements.heading', 'Announcements').toLowerCase()}\n loading={announcementsQuery.loading}\n />\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('eventfullymanaged.communication.campaigns.heading', 'Campaigns')}\n </h2>\n {campaignTotal > 0 ? <span className=\"text-sm text-text-muted\">{campaignTotal}</span> : null}\n </div>\n <div className=\"mt-4\">\n {campaignsQuery.loading && campaigns.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.campaigns.loading', 'Loading campaigns…')}\n </p>\n ) : campaigns.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.campaigns.empty', 'No campaigns yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {campaigns.map((row) => {\n const sendAt = scheduledSendAt(row);\n return (\n <li\n key={row.id}\n className=\"flex items-center justify-between gap-3 rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">\n {rowLabel(row, t('eventfullymanaged.communication.campaigns.itemPrefix', 'Campaign'))}\n </p>\n {sendAt ? (\n <p className=\"truncate text-xs text-text-muted\">\n {t('eventfullymanaged.communication.campaigns.scheduledFor', 'Scheduled for')}{' '}\n {new Date(sendAt).toLocaleString()}\n </p>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {row.status ? (\n <Badge variant={statusVariant(row.status)} className=\"uppercase\">\n {row.status}\n </Badge>\n ) : null}\n {isDraft(row.status) ? (\n <Button type=\"button\" size=\"sm\" disabled={sending} onClick={() => void onSendCampaign(row)}>\n <Send className=\"h-3.5 w-3.5\" />\n {t('eventfullymanaged.communication.actions.send', 'Send campaign')}\n </Button>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n <Pagination\n offset={campaignPagination.offset}\n limit={campaignPagination.limit}\n loadedCount={campaigns.length}\n total={campaignTotal}\n onPrev={campaignPagination.prevPage}\n onNext={campaignPagination.nextPage}\n itemLabel={t('eventfullymanaged.communication.campaigns.heading', 'Campaigns').toLowerCase()}\n loading={campaignsQuery.loading}\n />\n </div>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"names":[],"mappings":"AAqKA,MAAM,CAAC,OAAO,UAAU,UAAU,4CAqUjC"}
1
+ {"version":3,"file":"EventsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"names":[],"mappings":"AA6KA,MAAM,CAAC,OAAO,UAAU,UAAU,4CA8bjC"}