@burdenoff/microfe-eventfullymanaged 2026.625.1 → 2026.703.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eventfullymanaged/api/eventApi.js +83 -38
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
- package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
- package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
- package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
- package/dist/eventfullymanaged/lib/toast.js +36 -0
- package/dist/eventfullymanaged/lib/toast.js.map +1 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +63 -51
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +137 -78
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -45
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +89 -52
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +73 -24
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +132 -77
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +81 -48
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +161 -133
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +103 -61
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +156 -147
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,92 +1,94 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { useAnalyticsSnapshotsQuery as t, useAnnouncementsQuery as n, useAutomationRulesQuery as r, useCheckInRecordsQuery as i, useCommunicationCampaignsQuery as a, useDashboardSummaryQuery as o, useEventSessionsQuery as s, useExhibitorsQuery as c, useLeadsQuery as l, useNetworkingProfilesQuery as u, usePromoCodesQuery as d, useRegistrationsQuery as f, useSponsorsQuery as p, useTicketTypesQuery as m, useVenuesQuery as h, useWorkflowTemplatesQuery as g } from "../../api/eventApi.js";
|
|
3
|
+
import { EntityListSection as _ } from "./EntityListSection.js";
|
|
4
|
+
import { useMemo as v } from "react";
|
|
5
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
6
|
+
import { LayoutDashboard as x, Megaphone as S, Workflow as C } from "lucide-react";
|
|
7
|
+
import { EmphasisPanel as w, GlassCard as T, GradientText as E, NextSteps as D, PagePurpose as ee, ShowMore as te } from "@burdenoff/fe-libs/ui";
|
|
6
8
|
//#region src/eventfullymanaged/pages/modules/OperationsHubPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let
|
|
9
|
+
function O({ title: O, description: k, sectionKeys: A }) {
|
|
10
|
+
let { navigate: j } = e(), M = o(), N = n({
|
|
9
11
|
limit: 100,
|
|
10
12
|
offset: 0
|
|
11
|
-
}),
|
|
13
|
+
}), P = a({
|
|
12
14
|
limit: 100,
|
|
13
15
|
offset: 0
|
|
14
|
-
}),
|
|
16
|
+
}), F = g({
|
|
15
17
|
limit: 100,
|
|
16
18
|
offset: 0
|
|
17
|
-
}),
|
|
19
|
+
}), I = r({
|
|
18
20
|
limit: 100,
|
|
19
21
|
offset: 0
|
|
20
|
-
}),
|
|
22
|
+
}), L = t({
|
|
21
23
|
limit: 100,
|
|
22
24
|
offset: 0
|
|
23
|
-
}),
|
|
25
|
+
}), R = f({
|
|
24
26
|
limit: 100,
|
|
25
27
|
offset: 0
|
|
26
|
-
}),
|
|
28
|
+
}), z = m({
|
|
27
29
|
limit: 100,
|
|
28
30
|
offset: 0
|
|
29
|
-
}),
|
|
31
|
+
}), B = d({
|
|
30
32
|
limit: 100,
|
|
31
33
|
offset: 0
|
|
32
|
-
}),
|
|
34
|
+
}), V = p({
|
|
33
35
|
limit: 100,
|
|
34
36
|
offset: 0
|
|
35
|
-
}),
|
|
37
|
+
}), H = c({
|
|
36
38
|
limit: 100,
|
|
37
39
|
offset: 0
|
|
38
|
-
}),
|
|
40
|
+
}), U = l({
|
|
39
41
|
limit: 100,
|
|
40
42
|
offset: 0
|
|
41
|
-
}),
|
|
43
|
+
}), W = h({
|
|
42
44
|
limit: 100,
|
|
43
45
|
offset: 0
|
|
44
|
-
}),
|
|
46
|
+
}), G = s({
|
|
45
47
|
limit: 100,
|
|
46
48
|
offset: 0
|
|
47
|
-
}),
|
|
49
|
+
}), K = i({
|
|
48
50
|
limit: 100,
|
|
49
51
|
offset: 0
|
|
50
|
-
}),
|
|
52
|
+
}), q = u({
|
|
51
53
|
limit: 100,
|
|
52
54
|
offset: 0
|
|
53
|
-
}),
|
|
55
|
+
}), J = M.data?.dashboardSummary, Y = v(() => R.data?.registrations.items ?? [], [R.data]), X = v(() => Y.reduce((e, t) => {
|
|
54
56
|
let n = Number(t.totalAmount ?? 0);
|
|
55
57
|
return Number.isFinite(n) ? e + n : e;
|
|
56
|
-
}, 0), [
|
|
58
|
+
}, 0), [Y]), Z = [
|
|
57
59
|
{
|
|
58
60
|
label: "Events",
|
|
59
|
-
value:
|
|
61
|
+
value: J?.totalEvents ?? 0
|
|
60
62
|
},
|
|
61
63
|
{
|
|
62
64
|
label: "Active",
|
|
63
|
-
value:
|
|
65
|
+
value: J?.activeEvents ?? 0
|
|
64
66
|
},
|
|
65
67
|
{
|
|
66
68
|
label: "Registrations",
|
|
67
|
-
value:
|
|
69
|
+
value: J?.totalRegistrations ?? 0
|
|
68
70
|
},
|
|
69
71
|
{
|
|
70
72
|
label: "Attendees",
|
|
71
|
-
value:
|
|
73
|
+
value: J?.totalAttendees ?? 0
|
|
72
74
|
},
|
|
73
75
|
{
|
|
74
76
|
label: "Venues",
|
|
75
|
-
value:
|
|
77
|
+
value: J?.totalVenues ?? 0
|
|
76
78
|
},
|
|
77
79
|
{
|
|
78
80
|
label: "Sponsors",
|
|
79
|
-
value:
|
|
81
|
+
value: J?.totalSponsors ?? 0
|
|
80
82
|
},
|
|
81
83
|
{
|
|
82
84
|
label: "Tracked Revenue",
|
|
83
|
-
value:
|
|
85
|
+
value: X.toFixed(2)
|
|
84
86
|
}
|
|
85
|
-
],
|
|
87
|
+
], Q = (e) => {
|
|
86
88
|
if (e === "announcements") {
|
|
87
|
-
let e =
|
|
88
|
-
return /* @__PURE__ */
|
|
89
|
-
heading:
|
|
89
|
+
let e = N.data?.announcements.items ?? [];
|
|
90
|
+
return /* @__PURE__ */ y(_, {
|
|
91
|
+
heading: N.loading ? "Loading announcements..." : `Announcements (${e.length})`,
|
|
90
92
|
emptyLabel: "No announcements recorded.",
|
|
91
93
|
rows: e.map((e) => ({
|
|
92
94
|
id: e.id,
|
|
@@ -96,9 +98,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
96
98
|
});
|
|
97
99
|
}
|
|
98
100
|
if (e === "campaigns") {
|
|
99
|
-
let e =
|
|
100
|
-
return /* @__PURE__ */
|
|
101
|
-
heading:
|
|
101
|
+
let e = P.data?.communicationCampaigns.items ?? [];
|
|
102
|
+
return /* @__PURE__ */ y(_, {
|
|
103
|
+
heading: P.loading ? "Loading campaigns..." : `Campaigns (${e.length})`,
|
|
102
104
|
emptyLabel: "No communication campaigns available.",
|
|
103
105
|
rows: e.map((e) => ({
|
|
104
106
|
id: e.id,
|
|
@@ -108,9 +110,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
108
110
|
});
|
|
109
111
|
}
|
|
110
112
|
if (e === "templates") {
|
|
111
|
-
let e =
|
|
112
|
-
return /* @__PURE__ */
|
|
113
|
-
heading:
|
|
113
|
+
let e = F.data?.workflowTemplates.items ?? [];
|
|
114
|
+
return /* @__PURE__ */ y(_, {
|
|
115
|
+
heading: F.loading ? "Loading templates..." : `Workflow Templates (${e.length})`,
|
|
114
116
|
emptyLabel: "No workflow templates configured.",
|
|
115
117
|
rows: e.map((e) => ({
|
|
116
118
|
id: e.id,
|
|
@@ -120,9 +122,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
120
122
|
});
|
|
121
123
|
}
|
|
122
124
|
if (e === "rules") {
|
|
123
|
-
let e =
|
|
124
|
-
return /* @__PURE__ */
|
|
125
|
-
heading:
|
|
125
|
+
let e = I.data?.automationRules.items ?? [];
|
|
126
|
+
return /* @__PURE__ */ y(_, {
|
|
127
|
+
heading: I.loading ? "Loading rules..." : `Automation Rules (${e.length})`,
|
|
126
128
|
emptyLabel: "No automation rules configured.",
|
|
127
129
|
rows: e.map((e) => ({
|
|
128
130
|
id: e.id,
|
|
@@ -132,9 +134,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
132
134
|
});
|
|
133
135
|
}
|
|
134
136
|
if (e === "snapshots") {
|
|
135
|
-
let e =
|
|
136
|
-
return /* @__PURE__ */
|
|
137
|
-
heading:
|
|
137
|
+
let e = L.data?.analyticsSnapshots.items ?? [];
|
|
138
|
+
return /* @__PURE__ */ y(_, {
|
|
139
|
+
heading: L.loading ? "Loading analytics snapshots..." : `Snapshots (${e.length})`,
|
|
138
140
|
emptyLabel: "No analytics snapshots generated.",
|
|
139
141
|
rows: e.map((e) => ({
|
|
140
142
|
id: e.id,
|
|
@@ -143,10 +145,10 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
143
145
|
}))
|
|
144
146
|
});
|
|
145
147
|
}
|
|
146
|
-
if (e === "registrations") return /* @__PURE__ */
|
|
147
|
-
heading:
|
|
148
|
+
if (e === "registrations") return /* @__PURE__ */ y(_, {
|
|
149
|
+
heading: R.loading ? "Loading registrations..." : `Registrations (${Y.length})`,
|
|
148
150
|
emptyLabel: "No registrations available.",
|
|
149
|
-
rows:
|
|
151
|
+
rows: Y.map((e) => ({
|
|
150
152
|
id: e.id,
|
|
151
153
|
title: e.attendeeId ? `Attendee ${e.attendeeId}` : `Registration ${e.id}`,
|
|
152
154
|
subtitle: e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}`.trim() : void 0,
|
|
@@ -154,9 +156,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
154
156
|
}))
|
|
155
157
|
});
|
|
156
158
|
if (e === "ticketTypes") {
|
|
157
|
-
let e =
|
|
158
|
-
return /* @__PURE__ */
|
|
159
|
-
heading:
|
|
159
|
+
let e = z.data?.ticketTypes.items ?? [];
|
|
160
|
+
return /* @__PURE__ */ y(_, {
|
|
161
|
+
heading: z.loading ? "Loading ticket types..." : `Ticket Types (${e.length})`,
|
|
160
162
|
emptyLabel: "No ticket types configured.",
|
|
161
163
|
rows: e.map((e) => ({
|
|
162
164
|
id: e.id,
|
|
@@ -167,9 +169,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
167
169
|
});
|
|
168
170
|
}
|
|
169
171
|
if (e === "promoCodes") {
|
|
170
|
-
let e =
|
|
171
|
-
return /* @__PURE__ */
|
|
172
|
-
heading:
|
|
172
|
+
let e = B.data?.promoCodes.items ?? [];
|
|
173
|
+
return /* @__PURE__ */ y(_, {
|
|
174
|
+
heading: B.loading ? "Loading promo codes..." : `Promo Codes (${e.length})`,
|
|
173
175
|
emptyLabel: "No promo codes configured.",
|
|
174
176
|
rows: e.map((e) => ({
|
|
175
177
|
id: e.id,
|
|
@@ -180,9 +182,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
180
182
|
});
|
|
181
183
|
}
|
|
182
184
|
if (e === "sponsors") {
|
|
183
|
-
let e =
|
|
184
|
-
return /* @__PURE__ */
|
|
185
|
-
heading:
|
|
185
|
+
let e = V.data?.sponsors.items ?? [];
|
|
186
|
+
return /* @__PURE__ */ y(_, {
|
|
187
|
+
heading: V.loading ? "Loading sponsors..." : `Sponsors (${e.length})`,
|
|
186
188
|
emptyLabel: "No sponsors onboarded.",
|
|
187
189
|
rows: e.map((e) => ({
|
|
188
190
|
id: e.id,
|
|
@@ -192,9 +194,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
192
194
|
});
|
|
193
195
|
}
|
|
194
196
|
if (e === "exhibitors") {
|
|
195
|
-
let e =
|
|
196
|
-
return /* @__PURE__ */
|
|
197
|
-
heading:
|
|
197
|
+
let e = H.data?.exhibitors.items ?? [];
|
|
198
|
+
return /* @__PURE__ */ y(_, {
|
|
199
|
+
heading: H.loading ? "Loading exhibitors..." : `Exhibitors (${e.length})`,
|
|
198
200
|
emptyLabel: "No exhibitors onboarded.",
|
|
199
201
|
rows: e.map((e) => ({
|
|
200
202
|
id: e.id,
|
|
@@ -205,9 +207,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
205
207
|
});
|
|
206
208
|
}
|
|
207
209
|
if (e === "leads") {
|
|
208
|
-
let e =
|
|
209
|
-
return /* @__PURE__ */
|
|
210
|
-
heading:
|
|
210
|
+
let e = U.data?.leads.items ?? [];
|
|
211
|
+
return /* @__PURE__ */ y(_, {
|
|
212
|
+
heading: U.loading ? "Loading leads..." : `Leads (${e.length})`,
|
|
211
213
|
emptyLabel: "No leads captured.",
|
|
212
214
|
rows: e.map((e) => ({
|
|
213
215
|
id: e.id,
|
|
@@ -218,9 +220,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
218
220
|
});
|
|
219
221
|
}
|
|
220
222
|
if (e === "venues") {
|
|
221
|
-
let e =
|
|
222
|
-
return /* @__PURE__ */
|
|
223
|
-
heading:
|
|
223
|
+
let e = W.data?.venues.items ?? [];
|
|
224
|
+
return /* @__PURE__ */ y(_, {
|
|
225
|
+
heading: W.loading ? "Loading venues..." : `Venues (${e.length})`,
|
|
224
226
|
emptyLabel: "No venues configured.",
|
|
225
227
|
rows: e.map((e) => ({
|
|
226
228
|
id: e.id,
|
|
@@ -231,9 +233,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
231
233
|
});
|
|
232
234
|
}
|
|
233
235
|
if (e === "checkInRecords") {
|
|
234
|
-
let e =
|
|
235
|
-
return /* @__PURE__ */
|
|
236
|
-
heading:
|
|
236
|
+
let e = K.data?.checkInRecords.items ?? [];
|
|
237
|
+
return /* @__PURE__ */ y(_, {
|
|
238
|
+
heading: K.loading ? "Loading check-in records..." : `Check-In Records (${e.length})`,
|
|
237
239
|
emptyLabel: "No check-in records found.",
|
|
238
240
|
rows: e.map((e) => ({
|
|
239
241
|
id: e.id,
|
|
@@ -244,9 +246,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
244
246
|
});
|
|
245
247
|
}
|
|
246
248
|
if (e === "networkingProfiles") {
|
|
247
|
-
let e =
|
|
248
|
-
return /* @__PURE__ */
|
|
249
|
-
heading:
|
|
249
|
+
let e = q.data?.networkingProfiles.items ?? [];
|
|
250
|
+
return /* @__PURE__ */ y(_, {
|
|
251
|
+
heading: q.loading ? "Loading networking profiles..." : `Profiles (${e.length})`,
|
|
250
252
|
emptyLabel: "No networking profiles available.",
|
|
251
253
|
rows: e.map((e) => ({
|
|
252
254
|
id: e.id,
|
|
@@ -256,9 +258,9 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
256
258
|
}))
|
|
257
259
|
});
|
|
258
260
|
}
|
|
259
|
-
let t =
|
|
260
|
-
return /* @__PURE__ */
|
|
261
|
-
heading:
|
|
261
|
+
let t = G.data?.eventSessions.items ?? [];
|
|
262
|
+
return /* @__PURE__ */ y(_, {
|
|
263
|
+
heading: G.loading ? "Loading sessions..." : `Sessions (${t.length})`,
|
|
262
264
|
emptyLabel: "No sessions scheduled.",
|
|
263
265
|
rows: t.map((e) => ({
|
|
264
266
|
id: e.id,
|
|
@@ -267,51 +269,79 @@ function w({ title: w, description: T, sectionKeys: E }) {
|
|
|
267
269
|
status: e.status ?? void 0
|
|
268
270
|
}))
|
|
269
271
|
});
|
|
270
|
-
},
|
|
271
|
-
return /* @__PURE__ */
|
|
272
|
+
}, ne = A.slice(0, 3), $ = A.slice(3);
|
|
273
|
+
return /* @__PURE__ */ b("div", {
|
|
272
274
|
className: "space-y-6 p-6",
|
|
273
275
|
children: [
|
|
274
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ b(ee, { children: [
|
|
277
|
+
"A focused operations hub that pulls together the live records most relevant to ",
|
|
278
|
+
O,
|
|
279
|
+
". Instead of jumping between modules, you get the key metrics plus the specific lists you need for this area in one place — handy for a quick health check or a stand-up update."
|
|
280
|
+
] }),
|
|
281
|
+
/* @__PURE__ */ b(w, { children: [/* @__PURE__ */ y("h1", {
|
|
275
282
|
className: "text-2xl font-bold text-text-primary",
|
|
276
|
-
children: /* @__PURE__ */
|
|
277
|
-
}), /* @__PURE__ */
|
|
283
|
+
children: /* @__PURE__ */ y(E, { children: O })
|
|
284
|
+
}), /* @__PURE__ */ y("p", {
|
|
278
285
|
className: "mt-1 text-sm text-text-secondary",
|
|
279
|
-
children:
|
|
286
|
+
children: k
|
|
280
287
|
})] }),
|
|
281
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ b("section", { children: [/* @__PURE__ */ y("h2", {
|
|
282
289
|
className: "text-lg font-semibold text-text-primary",
|
|
283
290
|
children: "Operational Metrics"
|
|
284
|
-
}), /* @__PURE__ */
|
|
291
|
+
}), /* @__PURE__ */ y("div", {
|
|
285
292
|
className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4",
|
|
286
|
-
children:
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
children: e.value
|
|
298
|
-
})]
|
|
299
|
-
}, e.label);
|
|
300
|
-
})
|
|
293
|
+
children: Z.map((e) => /* @__PURE__ */ b(T, {
|
|
294
|
+
treatment: "metric",
|
|
295
|
+
className: "p-3",
|
|
296
|
+
children: [/* @__PURE__ */ y("p", {
|
|
297
|
+
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
298
|
+
children: e.label
|
|
299
|
+
}), /* @__PURE__ */ y("p", {
|
|
300
|
+
className: "mt-1 text-xl font-semibold tabular-nums text-text-primary",
|
|
301
|
+
children: e.value
|
|
302
|
+
})]
|
|
303
|
+
}, e.label))
|
|
301
304
|
})] }),
|
|
302
|
-
|
|
303
|
-
|
|
305
|
+
ne.map((e) => /* @__PURE__ */ y("div", { children: Q(e) }, e)),
|
|
306
|
+
$.length > 0 ? /* @__PURE__ */ y(te, {
|
|
304
307
|
collapsedHeight: 160,
|
|
305
308
|
label: "Show all sections",
|
|
306
|
-
children: /* @__PURE__ */
|
|
309
|
+
children: /* @__PURE__ */ y("div", {
|
|
307
310
|
className: "space-y-6",
|
|
308
|
-
children:
|
|
311
|
+
children: $.map((e) => /* @__PURE__ */ y("div", { children: Q(e) }, e))
|
|
309
312
|
})
|
|
310
|
-
}) : null
|
|
313
|
+
}) : null,
|
|
314
|
+
/* @__PURE__ */ y(D, {
|
|
315
|
+
storageKey: "eventfullymanaged-operations-hub",
|
|
316
|
+
title: "Where to go from here",
|
|
317
|
+
steps: [
|
|
318
|
+
{
|
|
319
|
+
id: "overview",
|
|
320
|
+
label: "Back to the dashboard",
|
|
321
|
+
description: "See the big picture across every part of your events.",
|
|
322
|
+
icon: /* @__PURE__ */ y(x, { className: "h-4 w-4" }),
|
|
323
|
+
onClick: () => j("/")
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: "automate",
|
|
327
|
+
label: "Automate routine work",
|
|
328
|
+
description: "Set up workflow templates and rules to save time.",
|
|
329
|
+
icon: /* @__PURE__ */ y(C, { className: "h-4 w-4" }),
|
|
330
|
+
onClick: () => j("/workflows")
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
id: "communicate",
|
|
334
|
+
label: "Reach your audience",
|
|
335
|
+
description: "Send announcements and run campaigns.",
|
|
336
|
+
icon: /* @__PURE__ */ y(S, { className: "h-4 w-4" }),
|
|
337
|
+
onClick: () => j("/communication")
|
|
338
|
+
}
|
|
339
|
+
]
|
|
340
|
+
})
|
|
311
341
|
]
|
|
312
342
|
});
|
|
313
343
|
}
|
|
314
344
|
//#endregion
|
|
315
|
-
export {
|
|
345
|
+
export { O as default };
|
|
316
346
|
|
|
317
347
|
//# sourceMappingURL=OperationsHubPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationsHubPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/OperationsHubPage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText, ShowMore } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport {\n useExhibitorsQuery,\n useLeadsQuery,\n useCheckInRecordsQuery,\n useNetworkingProfilesQuery,\n usePromoCodesQuery,\n useTicketTypesQuery,\n useAnalyticsSnapshotsQuery,\n useAnnouncementsQuery,\n useAutomationRulesQuery,\n useCommunicationCampaignsQuery,\n useDashboardSummaryQuery,\n useEventSessionsQuery,\n useRegistrationsQuery,\n useSponsorsQuery,\n useVenuesQuery,\n useWorkflowTemplatesQuery,\n} from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SectionKey =\n | 'announcements'\n | 'campaigns'\n | 'templates'\n | 'rules'\n | 'snapshots'\n | 'registrations'\n | 'ticketTypes'\n | 'promoCodes'\n | 'sponsors'\n | 'exhibitors'\n | 'leads'\n | 'venues'\n | 'sessions'\n | 'checkInRecords'\n | 'networkingProfiles';\n\ninterface OperationsHubPageProps {\n title: string;\n description: string;\n sectionKeys: SectionKey[];\n}\n\ntype NamedEntity = {\n id: string;\n name?: string | null;\n title?: string | null;\n status?: string | null;\n};\n\ntype RegistrationEntity = {\n id: string;\n attendeeId?: string | null;\n status?: string | null;\n totalAmount?: string | null;\n currency?: string | null;\n};\n\ntype SponsorEntity = {\n id: string;\n name: string;\n level: string;\n};\n\ntype VenueEntity = {\n id: string;\n name: string;\n city?: string | null;\n status: string;\n};\n\ntype SessionEntity = {\n id: string;\n title?: string | null;\n sessionType?: string | null;\n status?: string | null;\n};\n\ntype ExhibitorEntity = {\n id: string;\n name: string;\n boothCode?: string | null;\n category?: string | null;\n status: string;\n};\n\ntype LeadEntity = {\n id: string;\n attendeeName: string;\n attendeeEmail: string;\n status: string;\n score?: number | null;\n};\n\nexport default function OperationsHubPage({ title, description, sectionKeys }: OperationsHubPageProps) {\n const summaryQuery = useDashboardSummaryQuery();\n const announcementsQuery = useAnnouncementsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n const templatesQuery = useWorkflowTemplatesQuery({ limit: 100, offset: 0 });\n const rulesQuery = useAutomationRulesQuery({ limit: 100, offset: 0 });\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const ticketTypesQuery = useTicketTypesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const exhibitorsQuery = useExhibitorsQuery({ limit: 100, offset: 0 });\n const leadsQuery = useLeadsQuery({ limit: 100, offset: 0 });\n const venuesQuery = useVenuesQuery({ limit: 100, offset: 0 });\n const sessionsQuery = useEventSessionsQuery({ limit: 100, offset: 0 });\n const checkInRecordsQuery = useCheckInRecordsQuery({ limit: 100, offset: 0 });\n const networkingProfilesQuery = useNetworkingProfilesQuery({ limit: 100, offset: 0 });\n\n const summary = summaryQuery.data?.dashboardSummary;\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationEntity[],\n [registrationsQuery.data]\n );\n\n const trackedRevenue = useMemo(\n () =>\n registrations.reduce((total, registration) => {\n const value = Number(registration.totalAmount ?? 0);\n return Number.isFinite(value) ? total + value : total;\n }, 0),\n [registrations]\n );\n\n const cards = [\n { label: 'Events', value: summary?.totalEvents ?? 0 },\n { label: 'Active', value: summary?.activeEvents ?? 0 },\n { label: 'Registrations', value: summary?.totalRegistrations ?? 0 },\n { label: 'Attendees', value: summary?.totalAttendees ?? 0 },\n { label: 'Venues', value: summary?.totalVenues ?? 0 },\n { label: 'Sponsors', value: summary?.totalSponsors ?? 0 },\n { label: 'Tracked Revenue', value: trackedRevenue.toFixed(2) },\n ];\n\n const renderSection = (sectionKey: SectionKey) => {\n if (sectionKey === 'announcements') {\n const rows = (announcementsQuery.data?.announcements.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={announcementsQuery.loading ? 'Loading announcements...' : `Announcements (${rows.length})`}\n emptyLabel=\"No announcements recorded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Announcement ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'campaigns') {\n const rows = (campaignsQuery.data?.communicationCampaigns.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaigns (${rows.length})`}\n emptyLabel=\"No communication campaigns available.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Campaign ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'templates') {\n const rows = (templatesQuery.data?.workflowTemplates.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={templatesQuery.loading ? 'Loading templates...' : `Workflow Templates (${rows.length})`}\n emptyLabel=\"No workflow templates configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Template ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'rules') {\n const rows = (rulesQuery.data?.automationRules.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={rulesQuery.loading ? 'Loading rules...' : `Automation Rules (${rows.length})`}\n emptyLabel=\"No automation rules configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Rule ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'snapshots') {\n const rows = (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={snapshotsQuery.loading ? 'Loading analytics snapshots...' : `Snapshots (${rows.length})`}\n emptyLabel=\"No analytics snapshots generated.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Snapshot ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'registrations') {\n return (\n <EntityListSection\n heading={registrationsQuery.loading ? 'Loading registrations...' : `Registrations (${registrations.length})`}\n emptyLabel=\"No registrations available.\"\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Registration ${row.id}`,\n subtitle: row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}`.trim() : undefined,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'ticketTypes') {\n const rows = ticketTypesQuery.data?.ticketTypes.items ?? [];\n return (\n <EntityListSection\n heading={ticketTypesQuery.loading ? 'Loading ticket types...' : `Ticket Types (${rows.length})`}\n emptyLabel=\"No ticket types configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: `${row.price} ${row.currency} • Sold ${row.soldCount}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n );\n }\n\n if (sectionKey === 'promoCodes') {\n const rows = promoCodesQuery.data?.promoCodes.items ?? [];\n return (\n <EntityListSection\n heading={promoCodesQuery.loading ? 'Loading promo codes...' : `Promo Codes (${rows.length})`}\n emptyLabel=\"No promo codes configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n );\n }\n\n if (sectionKey === 'sponsors') {\n const rows = (sponsorsQuery.data?.sponsors.items ?? []) as SponsorEntity[];\n return (\n <EntityListSection\n heading={sponsorsQuery.loading ? 'Loading sponsors...' : `Sponsors (${rows.length})`}\n emptyLabel=\"No sponsors onboarded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: row.level,\n }))}\n />\n );\n }\n\n if (sectionKey === 'exhibitors') {\n const rows = (exhibitorsQuery.data?.exhibitors.items ?? []) as ExhibitorEntity[];\n return (\n <EntityListSection\n heading={exhibitorsQuery.loading ? 'Loading exhibitors...' : `Exhibitors (${rows.length})`}\n emptyLabel=\"No exhibitors onboarded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: [row.boothCode, row.category].filter(Boolean).join(' • '),\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'leads') {\n const rows = (leadsQuery.data?.leads.items ?? []) as LeadEntity[];\n return (\n <EntityListSection\n heading={leadsQuery.loading ? 'Loading leads...' : `Leads (${rows.length})`}\n emptyLabel=\"No leads captured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeName,\n subtitle: [row.attendeeEmail, row.score != null ? `Score ${row.score}` : undefined]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'venues') {\n const rows = (venuesQuery.data?.venues.items ?? []) as VenueEntity[];\n return (\n <EntityListSection\n heading={venuesQuery.loading ? 'Loading venues...' : `Venues (${rows.length})`}\n emptyLabel=\"No venues configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: row.city ?? undefined,\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'checkInRecords') {\n const rows = checkInRecordsQuery.data?.checkInRecords.items ?? [];\n return (\n <EntityListSection\n heading={checkInRecordsQuery.loading ? 'Loading check-in records...' : `Check-In Records (${rows.length})`}\n emptyLabel=\"No check-in records found.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Record ${row.id}`,\n subtitle: `${row.method} • ${row.direction}`,\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'networkingProfiles') {\n const rows = networkingProfilesQuery.data?.networkingProfiles.items ?? [];\n return (\n <EntityListSection\n heading={networkingProfilesQuery.loading ? 'Loading networking profiles...' : `Profiles (${rows.length})`}\n emptyLabel=\"No networking profiles available.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Profile ${row.id}`,\n subtitle: [row.role, row.industry].filter(Boolean).join(' • '),\n status: row.visibility,\n }))}\n />\n );\n }\n\n const rows = (sessionsQuery.data?.eventSessions.items ?? []) as SessionEntity[];\n return (\n <EntityListSection\n heading={sessionsQuery.loading ? 'Loading sessions...' : `Sessions (${rows.length})`}\n emptyLabel=\"No sessions scheduled.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? `Session ${row.id}`,\n subtitle: row.sessionType ?? undefined,\n status: row.status ?? undefined,\n }))}\n />\n );\n };\n\n const primarySections = sectionKeys.slice(0, 3);\n const secondarySections = sectionKeys.slice(3);\n\n return (\n <div className=\"space-y-6 p-6\">\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{title}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>\n </EmphasisPanel>\n\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary\">Operational Metrics</h2>\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4\">\n {cards.map((card, index) => {\n const featured = index === 0;\n return (\n <GlassCard key={card.label} treatment={featured ? 'glass' : 'metric'} glow={featured} className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">{card.label}</p>\n <p className=\"mt-1 text-xl font-semibold tabular-nums text-text-primary\">{card.value}</p>\n </GlassCard>\n );\n })}\n </div>\n </section>\n\n {primarySections.map((sectionKey) => (\n <div key={sectionKey}>{renderSection(sectionKey)}</div>\n ))}\n\n {secondarySections.length > 0 ? (\n <ShowMore collapsedHeight={160} label=\"Show all sections\">\n <div className=\"space-y-6\">\n {secondarySections.map((sectionKey) => (\n <div key={sectionKey}>{renderSection(sectionKey)}</div>\n ))}\n </div>\n </ShowMore>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationsHubPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/OperationsHubPage.tsx"],"sourcesContent":["import { LayoutDashboard, Megaphone, Workflow } from 'lucide-react';\nimport { EmphasisPanel, GlassCard, GradientText, NextSteps, PagePurpose, ShowMore } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport {\n useExhibitorsQuery,\n useLeadsQuery,\n useCheckInRecordsQuery,\n useNetworkingProfilesQuery,\n usePromoCodesQuery,\n useTicketTypesQuery,\n useAnalyticsSnapshotsQuery,\n useAnnouncementsQuery,\n useAutomationRulesQuery,\n useCommunicationCampaignsQuery,\n useDashboardSummaryQuery,\n useEventSessionsQuery,\n useRegistrationsQuery,\n useSponsorsQuery,\n useVenuesQuery,\n useWorkflowTemplatesQuery,\n} from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SectionKey =\n | 'announcements'\n | 'campaigns'\n | 'templates'\n | 'rules'\n | 'snapshots'\n | 'registrations'\n | 'ticketTypes'\n | 'promoCodes'\n | 'sponsors'\n | 'exhibitors'\n | 'leads'\n | 'venues'\n | 'sessions'\n | 'checkInRecords'\n | 'networkingProfiles';\n\ninterface OperationsHubPageProps {\n title: string;\n description: string;\n sectionKeys: SectionKey[];\n}\n\ntype NamedEntity = {\n id: string;\n name?: string | null;\n title?: string | null;\n status?: string | null;\n};\n\ntype RegistrationEntity = {\n id: string;\n attendeeId?: string | null;\n status?: string | null;\n totalAmount?: string | null;\n currency?: string | null;\n};\n\ntype SponsorEntity = {\n id: string;\n name: string;\n level: string;\n};\n\ntype VenueEntity = {\n id: string;\n name: string;\n city?: string | null;\n status: string;\n};\n\ntype SessionEntity = {\n id: string;\n title?: string | null;\n sessionType?: string | null;\n status?: string | null;\n};\n\ntype ExhibitorEntity = {\n id: string;\n name: string;\n boothCode?: string | null;\n category?: string | null;\n status: string;\n};\n\ntype LeadEntity = {\n id: string;\n attendeeName: string;\n attendeeEmail: string;\n status: string;\n score?: number | null;\n};\n\nexport default function OperationsHubPage({ title, description, sectionKeys }: OperationsHubPageProps) {\n const { navigate } = useEventfullyManaged();\n const summaryQuery = useDashboardSummaryQuery();\n const announcementsQuery = useAnnouncementsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n const templatesQuery = useWorkflowTemplatesQuery({ limit: 100, offset: 0 });\n const rulesQuery = useAutomationRulesQuery({ limit: 100, offset: 0 });\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const ticketTypesQuery = useTicketTypesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const exhibitorsQuery = useExhibitorsQuery({ limit: 100, offset: 0 });\n const leadsQuery = useLeadsQuery({ limit: 100, offset: 0 });\n const venuesQuery = useVenuesQuery({ limit: 100, offset: 0 });\n const sessionsQuery = useEventSessionsQuery({ limit: 100, offset: 0 });\n const checkInRecordsQuery = useCheckInRecordsQuery({ limit: 100, offset: 0 });\n const networkingProfilesQuery = useNetworkingProfilesQuery({ limit: 100, offset: 0 });\n\n const summary = summaryQuery.data?.dashboardSummary;\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationEntity[],\n [registrationsQuery.data]\n );\n\n const trackedRevenue = useMemo(\n () =>\n registrations.reduce((total, registration) => {\n const value = Number(registration.totalAmount ?? 0);\n return Number.isFinite(value) ? total + value : total;\n }, 0),\n [registrations]\n );\n\n const cards = [\n { label: 'Events', value: summary?.totalEvents ?? 0 },\n { label: 'Active', value: summary?.activeEvents ?? 0 },\n { label: 'Registrations', value: summary?.totalRegistrations ?? 0 },\n { label: 'Attendees', value: summary?.totalAttendees ?? 0 },\n { label: 'Venues', value: summary?.totalVenues ?? 0 },\n { label: 'Sponsors', value: summary?.totalSponsors ?? 0 },\n { label: 'Tracked Revenue', value: trackedRevenue.toFixed(2) },\n ];\n\n const renderSection = (sectionKey: SectionKey) => {\n if (sectionKey === 'announcements') {\n const rows = (announcementsQuery.data?.announcements.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={announcementsQuery.loading ? 'Loading announcements...' : `Announcements (${rows.length})`}\n emptyLabel=\"No announcements recorded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Announcement ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'campaigns') {\n const rows = (campaignsQuery.data?.communicationCampaigns.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaigns (${rows.length})`}\n emptyLabel=\"No communication campaigns available.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Campaign ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'templates') {\n const rows = (templatesQuery.data?.workflowTemplates.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={templatesQuery.loading ? 'Loading templates...' : `Workflow Templates (${rows.length})`}\n emptyLabel=\"No workflow templates configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Template ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'rules') {\n const rows = (rulesQuery.data?.automationRules.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={rulesQuery.loading ? 'Loading rules...' : `Automation Rules (${rows.length})`}\n emptyLabel=\"No automation rules configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Rule ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'snapshots') {\n const rows = (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as NamedEntity[];\n return (\n <EntityListSection\n heading={snapshotsQuery.loading ? 'Loading analytics snapshots...' : `Snapshots (${rows.length})`}\n emptyLabel=\"No analytics snapshots generated.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Snapshot ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'registrations') {\n return (\n <EntityListSection\n heading={registrationsQuery.loading ? 'Loading registrations...' : `Registrations (${registrations.length})`}\n emptyLabel=\"No registrations available.\"\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Registration ${row.id}`,\n subtitle: row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}`.trim() : undefined,\n status: row.status ?? undefined,\n }))}\n />\n );\n }\n\n if (sectionKey === 'ticketTypes') {\n const rows = ticketTypesQuery.data?.ticketTypes.items ?? [];\n return (\n <EntityListSection\n heading={ticketTypesQuery.loading ? 'Loading ticket types...' : `Ticket Types (${rows.length})`}\n emptyLabel=\"No ticket types configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: `${row.price} ${row.currency} • Sold ${row.soldCount}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n );\n }\n\n if (sectionKey === 'promoCodes') {\n const rows = promoCodesQuery.data?.promoCodes.items ?? [];\n return (\n <EntityListSection\n heading={promoCodesQuery.loading ? 'Loading promo codes...' : `Promo Codes (${rows.length})`}\n emptyLabel=\"No promo codes configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n );\n }\n\n if (sectionKey === 'sponsors') {\n const rows = (sponsorsQuery.data?.sponsors.items ?? []) as SponsorEntity[];\n return (\n <EntityListSection\n heading={sponsorsQuery.loading ? 'Loading sponsors...' : `Sponsors (${rows.length})`}\n emptyLabel=\"No sponsors onboarded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: row.level,\n }))}\n />\n );\n }\n\n if (sectionKey === 'exhibitors') {\n const rows = (exhibitorsQuery.data?.exhibitors.items ?? []) as ExhibitorEntity[];\n return (\n <EntityListSection\n heading={exhibitorsQuery.loading ? 'Loading exhibitors...' : `Exhibitors (${rows.length})`}\n emptyLabel=\"No exhibitors onboarded.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: [row.boothCode, row.category].filter(Boolean).join(' • '),\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'leads') {\n const rows = (leadsQuery.data?.leads.items ?? []) as LeadEntity[];\n return (\n <EntityListSection\n heading={leadsQuery.loading ? 'Loading leads...' : `Leads (${rows.length})`}\n emptyLabel=\"No leads captured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeName,\n subtitle: [row.attendeeEmail, row.score != null ? `Score ${row.score}` : undefined]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'venues') {\n const rows = (venuesQuery.data?.venues.items ?? []) as VenueEntity[];\n return (\n <EntityListSection\n heading={venuesQuery.loading ? 'Loading venues...' : `Venues (${rows.length})`}\n emptyLabel=\"No venues configured.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: row.city ?? undefined,\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'checkInRecords') {\n const rows = checkInRecordsQuery.data?.checkInRecords.items ?? [];\n return (\n <EntityListSection\n heading={checkInRecordsQuery.loading ? 'Loading check-in records...' : `Check-In Records (${rows.length})`}\n emptyLabel=\"No check-in records found.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Record ${row.id}`,\n subtitle: `${row.method} • ${row.direction}`,\n status: row.status,\n }))}\n />\n );\n }\n\n if (sectionKey === 'networkingProfiles') {\n const rows = networkingProfilesQuery.data?.networkingProfiles.items ?? [];\n return (\n <EntityListSection\n heading={networkingProfilesQuery.loading ? 'Loading networking profiles...' : `Profiles (${rows.length})`}\n emptyLabel=\"No networking profiles available.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Profile ${row.id}`,\n subtitle: [row.role, row.industry].filter(Boolean).join(' • '),\n status: row.visibility,\n }))}\n />\n );\n }\n\n const rows = (sessionsQuery.data?.eventSessions.items ?? []) as SessionEntity[];\n return (\n <EntityListSection\n heading={sessionsQuery.loading ? 'Loading sessions...' : `Sessions (${rows.length})`}\n emptyLabel=\"No sessions scheduled.\"\n rows={rows.map((row) => ({\n id: row.id,\n title: row.title ?? `Session ${row.id}`,\n subtitle: row.sessionType ?? undefined,\n status: row.status ?? undefined,\n }))}\n />\n );\n };\n\n const primarySections = sectionKeys.slice(0, 3);\n const secondarySections = sectionKeys.slice(3);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n A focused operations hub that pulls together the live records most relevant to {title}. Instead of jumping\n between modules, you get the key metrics plus the specific lists you need for this area in one place — handy\n for a quick health check or a stand-up update.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{title}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>\n </EmphasisPanel>\n\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary\">Operational Metrics</h2>\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4\">\n {cards.map((card) => (\n <GlassCard key={card.label} treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">{card.label}</p>\n <p className=\"mt-1 text-xl font-semibold tabular-nums text-text-primary\">{card.value}</p>\n </GlassCard>\n ))}\n </div>\n </section>\n\n {primarySections.map((sectionKey) => (\n <div key={sectionKey}>{renderSection(sectionKey)}</div>\n ))}\n\n {secondarySections.length > 0 ? (\n <ShowMore collapsedHeight={160} label=\"Show all sections\">\n <div className=\"space-y-6\">\n {secondarySections.map((sectionKey) => (\n <div key={sectionKey}>{renderSection(sectionKey)}</div>\n ))}\n </div>\n </ShowMore>\n ) : null}\n\n <NextSteps\n storageKey=\"eventfullymanaged-operations-hub\"\n title=\"Where to go from here\"\n steps={[\n {\n id: 'overview',\n label: 'Back to the dashboard',\n description: 'See the big picture across every part of your events.',\n icon: <LayoutDashboard className=\"h-4 w-4\" />,\n onClick: () => navigate('/'),\n },\n {\n id: 'automate',\n label: 'Automate routine work',\n description: 'Set up workflow templates and rules to save time.',\n icon: <Workflow className=\"h-4 w-4\" />,\n onClick: () => navigate('/workflows'),\n },\n {\n id: 'communicate',\n label: 'Reach your audience',\n description: 'Send announcements and run campaigns.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|