@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/eventfullymanaged/EventfullyManagedRoutes.js +154 -66
  2. package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
  3. package/dist/eventfullymanaged/api/eventApi.js +546 -67
  4. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  5. package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
  6. package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
  7. package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
  8. package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
  9. package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
  10. package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
  11. package/dist/eventfullymanaged/components/Pagination.js +84 -0
  12. package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
  13. package/dist/eventfullymanaged/components/SafeLink.js +32 -0
  14. package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
  15. package/dist/eventfullymanaged/components/index.js +7 -0
  16. package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
  17. package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
  18. package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
  19. package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
  20. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
  21. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
  22. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
  23. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
  24. package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
  25. package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
  26. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
  27. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
  28. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
  29. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
  30. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
  31. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
  32. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
  33. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  34. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
  35. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  36. package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
  37. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  38. package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
  39. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  40. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
  41. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  42. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +289 -77
  43. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  44. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
  45. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
  46. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
  47. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  48. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
  49. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  50. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
  51. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
  52. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
  53. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
  54. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
  55. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
  56. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
  57. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
  58. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +414 -0
  59. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
  60. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
  61. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
  62. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
  63. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
  64. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
  65. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  66. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
  67. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  68. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
  69. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  70. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
  71. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  72. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
  73. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  74. package/package.json +1 -1
@@ -1,90 +1,260 @@
1
1
  import { notify as e } from "../../lib/toast.js";
2
- import { useAnnouncementsQuery as t, useCommunicationCampaignsQuery as n, useUpsertAnnouncementMutation as r } from "../../api/eventApi.js";
3
- import { describeError as i, mutationSucceeded as a } from "../../lib/mutationResult.js";
4
- import { EntityListSection as o } from "./EntityListSection.js";
5
- import { useMemo as s, useState as c } from "react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
- import { Megaphone as d } from "lucide-react";
8
- import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
- import { Button as p, EmphasisPanel as m, GradientText as h, Input as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
2
+ import { useAnnouncementsQuery as t, useCommunicationCampaignsQuery as n, usePublishAnnouncementMutation as r, useSendCommunicationCampaignMutation as i, useUpsertAnnouncementMutation as a, useUpsertCommunicationCampaignMutation as o } from "../../api/eventApi.js";
3
+ import { ActionMenu as s } from "../../components/ActionMenu.js";
4
+ import { Pagination as c, usePagination as l } from "../../components/Pagination.js";
5
+ import { describeError as u, mutationSucceeded as d } from "../../lib/mutationResult.js";
6
+ import { useMemo as f, useState as p } from "react";
7
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
8
+ import { Megaphone as g, Send as _, Upload as v } from "lucide-react";
9
+ import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { Badge as b, Button as x, EmphasisPanel as S, GlassCard as C, GradientText as w, IllustratedEmptyState as T, Input as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/eventfullymanaged/pages/modules/CommunicationPage.tsx
11
- function v() {
12
- let { t: v } = f(), y = (e, t) => {
13
- let n = v(e);
12
+ function O(e) {
13
+ let t = e.toLowerCase();
14
+ return [
15
+ "published",
16
+ "sent",
17
+ "active",
18
+ "completed"
19
+ ].includes(t) ? "success" : [
20
+ "cancelled",
21
+ "archived",
22
+ "failed",
23
+ "expired"
24
+ ].includes(t) ? "warning" : [
25
+ "draft",
26
+ "created",
27
+ "pending",
28
+ "scheduled"
29
+ ].includes(t) ? "info" : "secondary";
30
+ }
31
+ var k = (e) => {
32
+ let t = (e ?? "").toLowerCase();
33
+ return t === "" || t === "draft" || t === "created";
34
+ }, A = (e, t) => e.title ?? e.name ?? `${t} ${e.id}`;
35
+ function j({ title: e, status: t, actions: n, ariaLabel: r }) {
36
+ return /* @__PURE__ */ h("li", {
37
+ 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",
38
+ children: [/* @__PURE__ */ m("p", {
39
+ className: "min-w-0 truncate font-medium text-text-primary",
40
+ children: e
41
+ }), /* @__PURE__ */ h("div", {
42
+ className: "flex shrink-0 items-center gap-2",
43
+ children: [t ? /* @__PURE__ */ m(b, {
44
+ variant: O(t),
45
+ className: "uppercase",
46
+ children: t
47
+ }) : null, n.length > 0 ? /* @__PURE__ */ m(s, {
48
+ ariaLabel: r,
49
+ extraItems: n
50
+ }) : null]
51
+ })]
52
+ });
53
+ }
54
+ function M() {
55
+ let { t: s } = y(), b = (e, t) => {
56
+ let n = s(e);
14
57
  return n === e ? t : n;
15
- }, b = t({
16
- limit: 100,
17
- offset: 0
18
- }), x = n({
19
- limit: 100,
20
- offset: 0
21
- }), [S, { loading: C }] = r(), [w, T] = c(""), E = s(() => b.data?.announcements.items ?? [], [b.data]), D = s(() => x.data?.communicationCampaigns.items ?? [], [x.data]);
22
- return /* @__PURE__ */ u("div", {
58
+ }, O = l({ pageSize: 10 }), M = l({ pageSize: 10 }), N = t({
59
+ limit: O.limit,
60
+ offset: O.offset
61
+ }), P = n({
62
+ limit: M.limit,
63
+ offset: M.offset
64
+ }), [F, { loading: I }] = a(), [L, { loading: R }] = r(), [z, { loading: B }] = o(), [V, { loading: H }] = i(), [U, W] = p(""), [G, K] = p(""), q = f(() => N.data?.announcements.items ?? [], [N.data]), J = N.data?.announcements.total ?? 0, Y = f(() => P.data?.communicationCampaigns.items ?? [], [P.data]), X = P.data?.communicationCampaigns.total ?? 0, Z = async () => {
65
+ if (!U.trim()) return;
66
+ let t = b("eventfullymanaged.communication.errors.create", "Could not create announcement");
67
+ try {
68
+ let n = await F({ variables: { input: {
69
+ title: U,
70
+ name: U,
71
+ status: "draft",
72
+ metadata: {}
73
+ } } });
74
+ if (!d(n, n.data?.upsertAnnouncement?.id, t)) return;
75
+ W(""), e.success(b("eventfullymanaged.communication.created", "Announcement created")), await N.refetch();
76
+ } catch (n) {
77
+ e.error(t, u(n));
78
+ }
79
+ }, Q = async (t) => {
80
+ let n = b("eventfullymanaged.communication.errors.publish", "Could not publish announcement");
81
+ try {
82
+ let r = await L({ variables: { id: t.id } });
83
+ if (!d(r, r.data?.publishAnnouncement?.id, n)) return;
84
+ e.success(b("eventfullymanaged.communication.published", "Announcement published"));
85
+ } catch (t) {
86
+ e.error(n, u(t));
87
+ }
88
+ }, $ = async () => {
89
+ if (!G.trim()) return;
90
+ let t = b("eventfullymanaged.communication.errors.createCampaign", "Could not create campaign");
91
+ try {
92
+ let n = await z({ variables: { input: {
93
+ title: G,
94
+ name: G,
95
+ status: "draft",
96
+ metadata: {}
97
+ } } });
98
+ if (!d(n, n.data?.upsertCommunicationCampaign?.id, t)) return;
99
+ K(""), e.success(b("eventfullymanaged.communication.campaignCreated", "Campaign created")), await P.refetch();
100
+ } catch (n) {
101
+ e.error(t, u(n));
102
+ }
103
+ }, ee = async (t) => {
104
+ let n = b("eventfullymanaged.communication.errors.send", "Could not send campaign");
105
+ try {
106
+ let r = await V({ variables: { id: t.id } });
107
+ if (!d(r, r.data?.sendCommunicationCampaign?.id, n)) return;
108
+ e.success(b("eventfullymanaged.communication.sent", "Campaign delivery started"));
109
+ } catch (t) {
110
+ e.error(n, u(t));
111
+ }
112
+ };
113
+ return /* @__PURE__ */ h("div", {
23
114
  className: "space-y-6 p-6",
24
115
  children: [
25
- /* @__PURE__ */ l(_, { children: y("eventfullymanaged.communication.purpose", "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). Use this page to draft and publish everything you need to say before, during and after an event.") }),
26
- /* @__PURE__ */ u(m, { children: [
27
- /* @__PURE__ */ l("h1", {
116
+ /* @__PURE__ */ m(D, { children: b("eventfullymanaged.communication.purpose", "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). Draft each one here, then publish an announcement or send a campaign — delivery runs server-side through the notification service.") }),
117
+ /* @__PURE__ */ h(S, { children: [
118
+ /* @__PURE__ */ m("h1", {
28
119
  className: "text-2xl font-bold text-text-primary",
29
- children: /* @__PURE__ */ l(h, { children: y("eventfullymanaged.communication.title", "Communication") })
120
+ children: /* @__PURE__ */ m(w, { children: b("eventfullymanaged.communication.title", "Communication") })
30
121
  }),
31
- /* @__PURE__ */ l("p", {
122
+ /* @__PURE__ */ m("p", {
32
123
  className: "mt-1 text-sm text-text-secondary",
33
- children: y("eventfullymanaged.communication.description", "Announcements and campaigns managed via workspace APIs.")
124
+ children: b("eventfullymanaged.communication.description", "Draft announcements and campaigns, then publish or send them via workspace APIs.")
34
125
  }),
35
- /* @__PURE__ */ u("div", {
36
- className: "mt-4 flex flex-col gap-3 sm:flex-row",
37
- children: [/* @__PURE__ */ l(g, {
38
- value: w,
39
- onChange: (e) => T(e.target.value),
40
- placeholder: y("eventfullymanaged.communication.inputPlaceholder", "Emergency schedule update"),
41
- "aria-label": y("eventfullymanaged.communication.inputPlaceholder", "Emergency schedule update"),
42
- className: "flex-1"
43
- }), /* @__PURE__ */ u(p, {
44
- type: "button",
45
- disabled: C,
46
- onClick: async () => {
47
- if (!w.trim()) return;
48
- let t = y("eventfullymanaged.communication.errors.create", "Could not create announcement");
49
- try {
50
- let n = await S({ variables: { input: {
51
- title: w,
52
- name: w,
53
- status: "draft",
54
- metadata: {}
55
- } } });
56
- if (!a(n, n.data?.upsertAnnouncement?.id, t)) return;
57
- T(""), e.success(y("eventfullymanaged.communication.created", "Announcement created"));
58
- } catch (n) {
59
- e.error(t, i(n));
60
- }
61
- },
62
- children: [/* @__PURE__ */ l(d, { className: "h-4 w-4" }), C ? y("eventfullymanaged.communication.actions.creating", "Creating...") : y("eventfullymanaged.communication.actions.createAnnouncement", "Create Announcement")]
126
+ /* @__PURE__ */ h("div", {
127
+ className: "mt-4 grid grid-cols-1 gap-4 lg:grid-cols-2",
128
+ children: [/* @__PURE__ */ h("div", {
129
+ className: "space-y-2",
130
+ children: [/* @__PURE__ */ m("p", {
131
+ className: "text-sm font-medium text-text-primary",
132
+ children: b("eventfullymanaged.communication.announcements.heading", "Announcements")
133
+ }), /* @__PURE__ */ h("div", {
134
+ className: "flex flex-col gap-2 sm:flex-row",
135
+ children: [/* @__PURE__ */ m(E, {
136
+ value: U,
137
+ onChange: (e) => W(e.target.value),
138
+ placeholder: b("eventfullymanaged.communication.inputPlaceholder", "Emergency schedule update"),
139
+ "aria-label": b("eventfullymanaged.communication.inputPlaceholder", "Emergency schedule update"),
140
+ className: "flex-1"
141
+ }), /* @__PURE__ */ h(x, {
142
+ type: "button",
143
+ disabled: I,
144
+ onClick: Z,
145
+ children: [/* @__PURE__ */ m(g, { className: "h-4 w-4" }), I ? b("eventfullymanaged.communication.actions.creating", "Creating...") : b("eventfullymanaged.communication.actions.createAnnouncement", "Create Announcement")]
146
+ })]
147
+ })]
148
+ }), /* @__PURE__ */ h("div", {
149
+ className: "space-y-2",
150
+ children: [/* @__PURE__ */ m("p", {
151
+ className: "text-sm font-medium text-text-primary",
152
+ children: b("eventfullymanaged.communication.campaigns.heading", "Campaigns")
153
+ }), /* @__PURE__ */ h("div", {
154
+ className: "flex flex-col gap-2 sm:flex-row",
155
+ children: [/* @__PURE__ */ m(E, {
156
+ value: G,
157
+ onChange: (e) => K(e.target.value),
158
+ placeholder: b("eventfullymanaged.communication.campaignPlaceholder", "Week-before reminder"),
159
+ "aria-label": b("eventfullymanaged.communication.campaignPlaceholder", "Week-before reminder"),
160
+ className: "flex-1"
161
+ }), /* @__PURE__ */ h(x, {
162
+ type: "button",
163
+ variant: "outline",
164
+ disabled: B,
165
+ onClick: $,
166
+ children: [/* @__PURE__ */ m(_, { className: "h-4 w-4" }), B ? b("eventfullymanaged.communication.actions.creating", "Creating...") : b("eventfullymanaged.communication.actions.createCampaign", "New Campaign")]
167
+ })]
168
+ })]
63
169
  })]
64
170
  })
65
171
  ] }),
66
- /* @__PURE__ */ l(o, {
67
- heading: b.loading ? y("eventfullymanaged.communication.announcements.loading", "Loading announcements...") : `${y("eventfullymanaged.communication.announcements.heading", "Announcements")} (${E.length})`,
68
- emptyLabel: y("eventfullymanaged.communication.announcements.empty", "No announcements published yet."),
69
- rows: E.map((e) => ({
70
- id: e.id,
71
- title: e.title ?? e.name ?? `${y("eventfullymanaged.communication.announcements.itemPrefix", "Announcement")} ${e.id}`,
72
- status: e.status ?? void 0
73
- }))
172
+ /* @__PURE__ */ h(C, {
173
+ treatment: "plain",
174
+ className: "border-border-seam p-5",
175
+ children: [/* @__PURE__ */ m("h2", {
176
+ className: "text-lg font-semibold text-text-primary",
177
+ children: N.loading ? b("eventfullymanaged.communication.announcements.loading", "Loading announcements...") : `${b("eventfullymanaged.communication.announcements.heading", "Announcements")} (${J})`
178
+ }), /* @__PURE__ */ h("div", {
179
+ className: "mt-4",
180
+ children: [q.length === 0 ? /* @__PURE__ */ m(T, {
181
+ illustration: "empty-data",
182
+ title: b("eventfullymanaged.communication.announcements.empty", "No announcements published yet."),
183
+ className: "py-8"
184
+ }) : /* @__PURE__ */ m("ul", {
185
+ className: "space-y-2.5",
186
+ children: q.map((e) => {
187
+ let t = k(e.status) ? [{
188
+ key: "publish",
189
+ label: b("eventfullymanaged.communication.actions.publish", "Publish"),
190
+ icon: v,
191
+ disabled: R,
192
+ onSelect: () => void Q(e)
193
+ }] : [];
194
+ return /* @__PURE__ */ m(j, {
195
+ title: A(e, b("eventfullymanaged.communication.announcements.itemPrefix", "Announcement")),
196
+ status: e.status,
197
+ actions: t,
198
+ ariaLabel: b("eventfullymanaged.communication.announcements.rowActions", "Announcement actions")
199
+ }, e.id);
200
+ })
201
+ }), /* @__PURE__ */ m(c, {
202
+ offset: O.offset,
203
+ limit: O.limit,
204
+ loadedCount: q.length,
205
+ total: J,
206
+ onPrev: O.prevPage,
207
+ onNext: O.nextPage,
208
+ itemLabel: b("eventfullymanaged.communication.announcements.heading", "Announcements").toLowerCase(),
209
+ loading: N.loading
210
+ })]
211
+ })]
74
212
  }),
75
- /* @__PURE__ */ l(o, {
76
- heading: x.loading ? y("eventfullymanaged.communication.campaigns.loading", "Loading campaigns...") : `${y("eventfullymanaged.communication.campaigns.heading", "Campaigns")} (${D.length})`,
77
- emptyLabel: y("eventfullymanaged.communication.campaigns.empty", "No communication campaigns created yet."),
78
- rows: D.map((e) => ({
79
- id: e.id,
80
- title: e.title ?? e.name ?? `${y("eventfullymanaged.communication.campaigns.itemPrefix", "Campaign")} ${e.id}`,
81
- status: e.status ?? void 0
82
- }))
213
+ /* @__PURE__ */ h(C, {
214
+ treatment: "plain",
215
+ className: "border-border-seam p-5",
216
+ children: [/* @__PURE__ */ m("h2", {
217
+ className: "text-lg font-semibold text-text-primary",
218
+ children: P.loading ? b("eventfullymanaged.communication.campaigns.loading", "Loading campaigns...") : `${b("eventfullymanaged.communication.campaigns.heading", "Campaigns")} (${X})`
219
+ }), /* @__PURE__ */ h("div", {
220
+ className: "mt-4",
221
+ children: [Y.length === 0 ? /* @__PURE__ */ m(T, {
222
+ illustration: "empty-data",
223
+ title: b("eventfullymanaged.communication.campaigns.empty", "No communication campaigns created yet."),
224
+ className: "py-8"
225
+ }) : /* @__PURE__ */ m("ul", {
226
+ className: "space-y-2.5",
227
+ children: Y.map((e) => {
228
+ let t = k(e.status) ? [{
229
+ key: "send",
230
+ label: b("eventfullymanaged.communication.actions.send", "Send Campaign"),
231
+ icon: _,
232
+ disabled: H,
233
+ onSelect: () => void ee(e)
234
+ }] : [];
235
+ return /* @__PURE__ */ m(j, {
236
+ title: A(e, b("eventfullymanaged.communication.campaigns.itemPrefix", "Campaign")),
237
+ status: e.status,
238
+ actions: t,
239
+ ariaLabel: b("eventfullymanaged.communication.campaigns.rowActions", "Campaign actions")
240
+ }, e.id);
241
+ })
242
+ }), /* @__PURE__ */ m(c, {
243
+ offset: M.offset,
244
+ limit: M.limit,
245
+ loadedCount: Y.length,
246
+ total: X,
247
+ onPrev: M.prevPage,
248
+ onNext: M.nextPage,
249
+ itemLabel: b("eventfullymanaged.communication.campaigns.heading", "Campaigns").toLowerCase(),
250
+ loading: P.loading
251
+ })]
252
+ })]
83
253
  })
84
254
  ]
85
255
  });
86
256
  }
87
257
  //#endregion
88
- export { v as default };
258
+ export { M as default };
89
259
 
90
260
  //# sourceMappingURL=CommunicationPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommunicationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/CommunicationPage.tsx"],"sourcesContent":["import { Megaphone } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Button, EmphasisPanel, GradientText, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport {\n useAnnouncementsQuery,\n useCommunicationCampaignsQuery,\n useUpsertAnnouncementMutation,\n} from '../../api/eventApi';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport { EntityListSection } from './EntityListSection';\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\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 const announcementsQuery = useAnnouncementsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n const [createAnnouncement, { loading: creating }] = useUpsertAnnouncementMutation();\n const [announcementTitle, setAnnouncementTitle] = useState('');\n\n const announcements = useMemo(\n () => (announcementsQuery.data?.announcements.items ?? []) as SimpleRow[],\n [announcementsQuery.data]\n );\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as SimpleRow[],\n [campaignsQuery.data]\n );\n\n const onCreate = async () => {\n if (!announcementTitle.trim()) return;\n const failureMessage = t('eventfullymanaged.communication.errors.create', 'Could not create announcement');\n try {\n const response = await createAnnouncement({\n variables: {\n input: {\n title: announcementTitle,\n name: announcementTitle,\n status: 'draft',\n metadata: {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.upsertAnnouncement?.id, failureMessage)) {\n return;\n }\n setAnnouncementTitle('');\n notify.success(t('eventfullymanaged.communication.created', 'Announcement created'));\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). Use this page to draft and publish everything you need to say before, during and after an event.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.communication.title', 'Communication')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.communication.description', 'Announcements and campaigns managed via workspace APIs.')}\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <Input\n value={announcementTitle}\n onChange={(e) => setAnnouncementTitle(e.target.value)}\n placeholder={t('eventfullymanaged.communication.inputPlaceholder', 'Emergency schedule update')}\n aria-label={t('eventfullymanaged.communication.inputPlaceholder', 'Emergency schedule update')}\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creating} onClick={onCreate}>\n <Megaphone className=\"h-4 w-4\" />\n {creating\n ? t('eventfullymanaged.communication.actions.creating', 'Creating...')\n : t('eventfullymanaged.communication.actions.createAnnouncement', 'Create Announcement')}\n </Button>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n announcementsQuery.loading\n ? t('eventfullymanaged.communication.announcements.loading', 'Loading announcements...')\n : `${t('eventfullymanaged.communication.announcements.heading', 'Announcements')} (${announcements.length})`\n }\n emptyLabel={t('eventfullymanaged.communication.announcements.empty', 'No announcements published yet.')}\n rows={announcements.map((row) => ({\n id: row.id,\n title:\n row.title ??\n row.name ??\n `${t('eventfullymanaged.communication.announcements.itemPrefix', 'Announcement')} ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading={\n campaignsQuery.loading\n ? t('eventfullymanaged.communication.campaigns.loading', 'Loading campaigns...')\n : `${t('eventfullymanaged.communication.campaigns.heading', 'Campaigns')} (${campaigns.length})`\n }\n emptyLabel={t('eventfullymanaged.communication.campaigns.empty', 'No communication campaigns created yet.')}\n rows={campaigns.map((row) => ({\n id: row.id,\n title:\n row.title ??\n row.name ??\n `${t('eventfullymanaged.communication.campaigns.itemPrefix', 'Campaign')} ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\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 { Megaphone, Send, Upload } 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 PagePurpose,\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 { ActionMenu, type ActionMenuItem } from '../../components/ActionMenu';\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\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\nfunction EntityRow({\n title,\n status,\n actions,\n ariaLabel,\n}: {\n title: string;\n status?: string | null;\n actions: ActionMenuItem[];\n ariaLabel: string;\n}) {\n return (\n <li 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 <p className=\"min-w-0 truncate font-medium text-text-primary\">{title}</p>\n <div className=\"flex shrink-0 items-center gap-2\">\n {status ? (\n <Badge variant={statusVariant(status)} className=\"uppercase\">\n {status}\n </Badge>\n ) : null}\n {actions.length > 0 ? <ActionMenu ariaLabel={ariaLabel} extraItems={actions} /> : null}\n </div>\n </li>\n );\n}\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: 10 });\n const campaignPagination = usePagination({ pageSize: 10 });\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 [announcementTitle, setAnnouncementTitle] = useState('');\n const [campaignTitle, setCampaignTitle] = 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 onCreateAnnouncement = async () => {\n if (!announcementTitle.trim()) return;\n const failureMessage = t('eventfullymanaged.communication.errors.create', 'Could not create announcement');\n try {\n const response = await createAnnouncement({\n variables: { input: { title: announcementTitle, name: announcementTitle, status: 'draft', metadata: {} } },\n });\n if (!mutationSucceeded(response, response.data?.upsertAnnouncement?.id, failureMessage)) {\n return;\n }\n setAnnouncementTitle('');\n notify.success(t('eventfullymanaged.communication.created', 'Announcement created'));\n await announcementsQuery.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)) {\n return;\n }\n notify.success(t('eventfullymanaged.communication.published', 'Announcement published'));\n } catch (error) {\n notify.error(failureMessage, describeError(error));\n }\n };\n\n const onCreateCampaign = async () => {\n if (!campaignTitle.trim()) return;\n const failureMessage = t('eventfullymanaged.communication.errors.createCampaign', 'Could not create campaign');\n try {\n const response = await createCampaign({\n variables: { input: { title: campaignTitle, name: campaignTitle, status: 'draft', metadata: {} } },\n });\n if (!mutationSucceeded(response, response.data?.upsertCommunicationCampaign?.id, failureMessage)) {\n return;\n }\n setCampaignTitle('');\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 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)) {\n return;\n }\n notify.success(t('eventfullymanaged.communication.sent', 'Campaign delivery started'));\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). Draft each one here, then publish an announcement or send a campaign — delivery runs server-side through the notification service.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.communication.title', 'Communication')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.communication.description',\n 'Draft announcements and campaigns, then publish or send them via workspace APIs.'\n )}\n </p>\n <div className=\"mt-4 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {t('eventfullymanaged.communication.announcements.heading', 'Announcements')}\n </p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n value={announcementTitle}\n onChange={(e) => setAnnouncementTitle(e.target.value)}\n placeholder={t('eventfullymanaged.communication.inputPlaceholder', 'Emergency schedule update')}\n aria-label={t('eventfullymanaged.communication.inputPlaceholder', 'Emergency schedule update')}\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creatingAnnouncement} onClick={onCreateAnnouncement}>\n <Megaphone className=\"h-4 w-4\" />\n {creatingAnnouncement\n ? t('eventfullymanaged.communication.actions.creating', 'Creating...')\n : t('eventfullymanaged.communication.actions.createAnnouncement', 'Create Announcement')}\n </Button>\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {t('eventfullymanaged.communication.campaigns.heading', 'Campaigns')}\n </p>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n value={campaignTitle}\n onChange={(e) => setCampaignTitle(e.target.value)}\n placeholder={t('eventfullymanaged.communication.campaignPlaceholder', 'Week-before reminder')}\n aria-label={t('eventfullymanaged.communication.campaignPlaceholder', 'Week-before reminder')}\n className=\"flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" disabled={creatingCampaign} onClick={onCreateCampaign}>\n <Send className=\"h-4 w-4\" />\n {creatingCampaign\n ? t('eventfullymanaged.communication.actions.creating', 'Creating...')\n : t('eventfullymanaged.communication.actions.createCampaign', 'New Campaign')}\n </Button>\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {announcementsQuery.loading\n ? t('eventfullymanaged.communication.announcements.loading', 'Loading announcements...')\n : `${t('eventfullymanaged.communication.announcements.heading', 'Announcements')} (${announcementTotal})`}\n </h2>\n <div className=\"mt-4\">\n {announcements.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.announcements.empty', 'No announcements published yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {announcements.map((row) => {\n const publishAction: ActionMenuItem[] = isDraft(row.status)\n ? [\n {\n key: 'publish',\n label: t('eventfullymanaged.communication.actions.publish', 'Publish'),\n icon: Upload,\n disabled: publishing,\n onSelect: () => void onPublishAnnouncement(row),\n },\n ]\n : [];\n return (\n <EntityRow\n key={row.id}\n title={rowLabel(row, t('eventfullymanaged.communication.announcements.itemPrefix', 'Announcement'))}\n status={row.status}\n actions={publishAction}\n ariaLabel={t('eventfullymanaged.communication.announcements.rowActions', 'Announcement actions')}\n />\n );\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 <h2 className=\"text-lg font-semibold text-text-primary\">\n {campaignsQuery.loading\n ? t('eventfullymanaged.communication.campaigns.loading', 'Loading campaigns...')\n : `${t('eventfullymanaged.communication.campaigns.heading', 'Campaigns')} (${campaignTotal})`}\n </h2>\n <div className=\"mt-4\">\n {campaigns.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={t('eventfullymanaged.communication.campaigns.empty', 'No communication campaigns created yet.')}\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {campaigns.map((row) => {\n const sendAction: ActionMenuItem[] = isDraft(row.status)\n ? [\n {\n key: 'send',\n label: t('eventfullymanaged.communication.actions.send', 'Send Campaign'),\n icon: Send,\n disabled: sending,\n onSelect: () => void onSendCampaign(row),\n },\n ]\n : [];\n return (\n <EntityRow\n key={row.id}\n title={rowLabel(row, t('eventfullymanaged.communication.campaigns.itemPrefix', 'Campaign'))}\n status={row.status}\n actions={sendAction}\n ariaLabel={t('eventfullymanaged.communication.campaigns.rowActions', 'Campaign actions')}\n />\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 );\n}\n"],"mappings":"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"}