@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.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 (74) hide show
  1. package/dist/eventfullymanaged/EventfullyManagedRoutes.js +151 -67
  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 +295 -76
  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 +415 -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,51 +1,761 @@
1
- import { useCheckInRecordsQuery as e, useCheckInStationsQuery as t } from "../../api/eventApi.js";
2
- import { EntityListSection as n } from "./EntityListSection.js";
3
- import { useMemo as r } from "react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
- import { EmphasisPanel as o, GradientText as s, PagePurpose as c } from "@burdenoff/fe-libs/ui";
1
+ import { notify as e } from "../../lib/toast.js";
2
+ import { useAttendeesQuery as t, useCheckInRecordsQuery as n, useCheckInStationsQuery as r, useCreateCheckInRecordMutation as i, useCreateCheckInStationMutation as a, useDeleteCheckInRecordMutation as o, useDeleteCheckInStationMutation as s, useEventSessionsQuery as c, useEventsQuery as l, useUpdateCheckInRecordMutation as u, useUpdateCheckInStationMutation as d } from "../../api/eventApi.js";
3
+ import { ActionMenu as f } from "../../components/ActionMenu.js";
4
+ import { Pagination as p, usePagination as m } from "../../components/Pagination.js";
5
+ import { describeError as h, mutationSucceeded as g } from "../../lib/mutationResult.js";
6
+ import "../../components/index.js";
7
+ import { useMemo as _, useState as v } from "react";
8
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
9
+ import { LogIn as x, MonitorSmartphone as S, Plus as C, ScanLine as w } from "lucide-react";
10
+ import { Badge as T, Button as E, EmphasisPanel as D, GlassCard as O, GradientText as k, IllustratedEmptyState as A, Input as j, Label as M, PagePurpose as N, ResponsiveDialog as P, ResponsiveDialogContent as F, ResponsiveDialogDescription as I, ResponsiveDialogFooter as L, ResponsiveDialogHeader as R, ResponsiveDialogTitle as z, Select as B, SelectContent as V, SelectItem as H, SelectTrigger as U, SelectValue as W, Switch as G } from "@burdenoff/fe-libs/ui";
6
11
  //#region src/eventfullymanaged/pages/modules/KioskPage.tsx
7
- function l() {
8
- let l = t({
12
+ var K = [
13
+ "DESK",
14
+ "GATE",
15
+ "SELF_SERVICE",
16
+ "MOBILE"
17
+ ], q = ["QR", "MANUAL"], J = ["IN", "OUT"];
18
+ function Y(e) {
19
+ if (!e || typeof e != "object") return {};
20
+ let t = e;
21
+ return {
22
+ code: typeof t.code == "string" ? t.code : void 0,
23
+ location: typeof t.location == "string" ? t.location : void 0,
24
+ type: typeof t.type == "string" ? t.type : void 0,
25
+ isActive: typeof t.isActive == "boolean" ? t.isActive : void 0
26
+ };
27
+ }
28
+ function X(e) {
29
+ return e.trim().toUpperCase().replace(/[^A-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 24) || "STATION";
30
+ }
31
+ function ee({ open: t, onOpenChange: n, eventId: r, eventName: i, station: o }) {
32
+ let s = !!o, [c, { loading: l }] = a(), [u, { loading: f }] = d(), p = _(() => {
33
+ if (!o) return {
34
+ name: "",
35
+ code: "",
36
+ location: "",
37
+ type: "DESK",
38
+ isActive: !0
39
+ };
40
+ let e = Y(o.metadata);
41
+ return {
42
+ name: o.name ?? "",
43
+ code: e.code ?? X(o.name ?? ""),
44
+ location: e.location ?? "",
45
+ type: e.type ?? "DESK",
46
+ isActive: e.isActive ?? !0
47
+ };
48
+ }, [o]), [m, x] = v(p), [S, C] = v(null), w = `${t ? "open" : "closed"}:${o?.id ?? "new"}`;
49
+ t && S !== w && (C(w), x(p)), !t && S !== null && C(null);
50
+ let T = (e, t) => {
51
+ x((n) => ({
52
+ ...n,
53
+ [e]: t
54
+ }));
55
+ }, D = l || f;
56
+ return /* @__PURE__ */ y(P, {
57
+ open: t,
58
+ onOpenChange: n,
59
+ children: /* @__PURE__ */ b(F, {
60
+ className: "max-w-lg",
61
+ children: [
62
+ /* @__PURE__ */ b(R, { children: [/* @__PURE__ */ y(z, { children: s ? "Edit check-in station" : "New check-in station" }), /* @__PURE__ */ b(I, { children: [
63
+ "A station is a desk, gate or device where attendees scan in at ",
64
+ i,
65
+ "."
66
+ ] })] }),
67
+ /* @__PURE__ */ b("form", {
68
+ id: "station-form",
69
+ onSubmit: async (t) => {
70
+ t.preventDefault();
71
+ let a = m.code.trim() || X(m.name), l = {
72
+ eventId: r,
73
+ name: m.name.trim(),
74
+ code: a,
75
+ location: m.location.trim() || null,
76
+ isActive: m.isActive,
77
+ kioskConfig: { type: m.type },
78
+ metadata: {
79
+ code: a,
80
+ location: m.location.trim(),
81
+ type: m.type,
82
+ isActive: m.isActive
83
+ }
84
+ };
85
+ try {
86
+ if (s && o) {
87
+ let t = await u({ variables: {
88
+ id: o.id,
89
+ input: l
90
+ } });
91
+ if (!g(t, t.data?.updateCheckInStation?.id, "Could not update station")) return;
92
+ e.success("Station updated", `“${l.name}” is now ${m.isActive ? "active" : "disabled"}.`);
93
+ } else {
94
+ let t = await c({ variables: { input: l } });
95
+ if (!g(t, t.data?.createCheckInStation?.id, "Could not create station")) return;
96
+ e.success("Station created", `“${l.name}” is ready at ${i}.`);
97
+ }
98
+ n(!1);
99
+ } catch (t) {
100
+ e.error("Could not save station", h(t));
101
+ }
102
+ },
103
+ className: "space-y-4",
104
+ children: [
105
+ /* @__PURE__ */ b("div", {
106
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
107
+ children: [/* @__PURE__ */ b("label", {
108
+ className: "space-y-1 text-sm",
109
+ children: [/* @__PURE__ */ y("span", {
110
+ className: "font-medium text-text-primary",
111
+ children: "Name"
112
+ }), /* @__PURE__ */ y(j, {
113
+ value: m.name,
114
+ onChange: (e) => T("name", e.target.value),
115
+ placeholder: "Main entrance",
116
+ required: !0
117
+ })]
118
+ }), /* @__PURE__ */ b("label", {
119
+ className: "space-y-1 text-sm",
120
+ children: [/* @__PURE__ */ y("span", {
121
+ className: "font-medium text-text-primary",
122
+ children: "Code"
123
+ }), /* @__PURE__ */ y(j, {
124
+ value: m.code,
125
+ onChange: (e) => T("code", e.target.value),
126
+ placeholder: "Auto from name"
127
+ })]
128
+ })]
129
+ }),
130
+ /* @__PURE__ */ b("div", {
131
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
132
+ children: [/* @__PURE__ */ b("label", {
133
+ className: "space-y-1 text-sm",
134
+ children: [/* @__PURE__ */ y("span", {
135
+ className: "font-medium text-text-primary",
136
+ children: "Location"
137
+ }), /* @__PURE__ */ y(j, {
138
+ value: m.location,
139
+ onChange: (e) => T("location", e.target.value),
140
+ placeholder: "North lobby"
141
+ })]
142
+ }), /* @__PURE__ */ b("label", {
143
+ className: "space-y-1 text-sm",
144
+ children: [/* @__PURE__ */ y("span", {
145
+ className: "font-medium text-text-primary",
146
+ children: "Type"
147
+ }), /* @__PURE__ */ b(B, {
148
+ value: m.type,
149
+ onValueChange: (e) => T("type", e),
150
+ children: [/* @__PURE__ */ y(U, {
151
+ "aria-label": "Station type",
152
+ children: /* @__PURE__ */ y(W, {})
153
+ }), /* @__PURE__ */ y(V, { children: K.map((e) => /* @__PURE__ */ y(H, {
154
+ value: e,
155
+ children: e.replace("_", " ")
156
+ }, e)) })]
157
+ })]
158
+ })]
159
+ }),
160
+ /* @__PURE__ */ b("div", {
161
+ className: "flex items-center justify-between rounded-card border border-border-seam bg-bg-surface p-3",
162
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y(M, {
163
+ htmlFor: "station-active",
164
+ className: "text-text-primary",
165
+ children: "Active"
166
+ }), /* @__PURE__ */ y("p", {
167
+ className: "text-xs text-text-secondary",
168
+ children: "Disabled stations stay configured but cannot accept scans."
169
+ })] }), /* @__PURE__ */ y(G, {
170
+ id: "station-active",
171
+ checked: m.isActive,
172
+ onCheckedChange: (e) => T("isActive", e),
173
+ "aria-label": "Station active"
174
+ })]
175
+ })
176
+ ]
177
+ }),
178
+ /* @__PURE__ */ b(L, { children: [/* @__PURE__ */ y(E, {
179
+ type: "button",
180
+ variant: "outline",
181
+ onClick: () => n(!1),
182
+ disabled: D,
183
+ children: "Cancel"
184
+ }), /* @__PURE__ */ y(E, {
185
+ type: "submit",
186
+ form: "station-form",
187
+ disabled: D,
188
+ children: D ? "Saving…" : s ? "Save station" : "Create station"
189
+ })] })
190
+ ]
191
+ })
192
+ });
193
+ }
194
+ function te({ open: t, onOpenChange: n, record: r, stations: i }) {
195
+ let [a, { loading: o }] = u(), s = _(() => ({
196
+ method: r?.method ?? "MANUAL",
197
+ direction: r?.direction ?? "IN",
198
+ status: r?.status ?? "checked_in",
199
+ stationId: r?.stationId ?? "",
200
+ attendeeId: r?.attendeeId ?? ""
201
+ }), [r]), [c, l] = v(s), [d, f] = v(null), p = `${t ? "open" : "closed"}:${r?.id ?? "none"}`;
202
+ t && d !== p && (f(p), l(s)), !t && d !== null && f(null);
203
+ let m = (e, t) => {
204
+ l((n) => ({
205
+ ...n,
206
+ [e]: t
207
+ }));
208
+ };
209
+ return /* @__PURE__ */ y(P, {
210
+ open: t,
211
+ onOpenChange: n,
212
+ children: /* @__PURE__ */ b(F, {
213
+ className: "max-w-lg",
214
+ children: [
215
+ /* @__PURE__ */ b(R, { children: [/* @__PURE__ */ y(z, { children: "Edit check-in record" }), /* @__PURE__ */ y(I, { children: "Correct the direction, method or station for this scan." })] }),
216
+ /* @__PURE__ */ b("form", {
217
+ id: "record-form",
218
+ onSubmit: async (t) => {
219
+ if (t.preventDefault(), !r) return;
220
+ let i = {
221
+ eventId: r.eventId,
222
+ attendeeId: c.attendeeId.trim() || null,
223
+ registrationId: r.registrationId ?? null,
224
+ stationId: c.stationId || null,
225
+ method: c.method,
226
+ direction: c.direction,
227
+ status: c.status.trim() || "checked_in",
228
+ metadata: r.metadata ?? {}
229
+ };
230
+ try {
231
+ let t = await a({ variables: {
232
+ id: r.id,
233
+ input: i
234
+ } });
235
+ if (!g(t, t.data?.updateCheckInRecord?.id, "Could not update record")) return;
236
+ e.success("Check-in updated"), n(!1);
237
+ } catch (t) {
238
+ e.error("Could not update record", h(t));
239
+ }
240
+ },
241
+ className: "space-y-4",
242
+ children: [
243
+ /* @__PURE__ */ b("label", {
244
+ className: "block space-y-1 text-sm",
245
+ children: [/* @__PURE__ */ y("span", {
246
+ className: "font-medium text-text-primary",
247
+ children: "Attendee ID"
248
+ }), /* @__PURE__ */ y(j, {
249
+ value: c.attendeeId,
250
+ onChange: (e) => m("attendeeId", e.target.value)
251
+ })]
252
+ }),
253
+ /* @__PURE__ */ b("div", {
254
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
255
+ children: [/* @__PURE__ */ b("label", {
256
+ className: "space-y-1 text-sm",
257
+ children: [/* @__PURE__ */ y("span", {
258
+ className: "font-medium text-text-primary",
259
+ children: "Method"
260
+ }), /* @__PURE__ */ b(B, {
261
+ value: c.method,
262
+ onValueChange: (e) => m("method", e),
263
+ children: [/* @__PURE__ */ y(U, {
264
+ "aria-label": "Method",
265
+ children: /* @__PURE__ */ y(W, {})
266
+ }), /* @__PURE__ */ y(V, { children: q.map((e) => /* @__PURE__ */ y(H, {
267
+ value: e,
268
+ children: e
269
+ }, e)) })]
270
+ })]
271
+ }), /* @__PURE__ */ b("label", {
272
+ className: "space-y-1 text-sm",
273
+ children: [/* @__PURE__ */ y("span", {
274
+ className: "font-medium text-text-primary",
275
+ children: "Direction"
276
+ }), /* @__PURE__ */ b(B, {
277
+ value: c.direction,
278
+ onValueChange: (e) => m("direction", e),
279
+ children: [/* @__PURE__ */ y(U, {
280
+ "aria-label": "Direction",
281
+ children: /* @__PURE__ */ y(W, {})
282
+ }), /* @__PURE__ */ y(V, { children: J.map((e) => /* @__PURE__ */ y(H, {
283
+ value: e,
284
+ children: e
285
+ }, e)) })]
286
+ })]
287
+ })]
288
+ }),
289
+ /* @__PURE__ */ b("div", {
290
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
291
+ children: [/* @__PURE__ */ b("label", {
292
+ className: "space-y-1 text-sm",
293
+ children: [/* @__PURE__ */ y("span", {
294
+ className: "font-medium text-text-primary",
295
+ children: "Status"
296
+ }), /* @__PURE__ */ y(j, {
297
+ value: c.status,
298
+ onChange: (e) => m("status", e.target.value)
299
+ })]
300
+ }), /* @__PURE__ */ b("label", {
301
+ className: "space-y-1 text-sm",
302
+ children: [/* @__PURE__ */ y("span", {
303
+ className: "font-medium text-text-primary",
304
+ children: "Station"
305
+ }), /* @__PURE__ */ b(B, {
306
+ value: c.stationId || "none",
307
+ onValueChange: (e) => m("stationId", e === "none" ? "" : e),
308
+ children: [/* @__PURE__ */ y(U, {
309
+ "aria-label": "Station",
310
+ children: /* @__PURE__ */ y(W, {})
311
+ }), /* @__PURE__ */ b(V, { children: [/* @__PURE__ */ y(H, {
312
+ value: "none",
313
+ children: "No station"
314
+ }), i.map((e) => /* @__PURE__ */ y(H, {
315
+ value: e.id,
316
+ children: e.name ?? e.id
317
+ }, e.id))] })]
318
+ })]
319
+ })]
320
+ })
321
+ ]
322
+ }),
323
+ /* @__PURE__ */ b(L, { children: [/* @__PURE__ */ y(E, {
324
+ type: "button",
325
+ variant: "outline",
326
+ onClick: () => n(!1),
327
+ disabled: o,
328
+ children: "Cancel"
329
+ }), /* @__PURE__ */ y(E, {
330
+ type: "submit",
331
+ form: "record-form",
332
+ disabled: o,
333
+ children: o ? "Saving…" : "Save record"
334
+ })] })
335
+ ]
336
+ })
337
+ });
338
+ }
339
+ function ne({ eventId: n, stations: r, onCheckedIn: a }) {
340
+ let [o, s] = v(""), [l, u] = v("QR"), [d, f] = v("IN"), [p, m] = v(""), [_, S] = v(""), [C, { loading: T }] = i(), D = t({
341
+ eventId: n,
9
342
  limit: 100,
10
343
  offset: 0
11
- }), u = e({
344
+ }), k = c({
345
+ eventId: n,
12
346
  limit: 100,
13
347
  offset: 0
14
- }), d = r(() => l.data?.checkInStations.items ?? [], [l.data]), f = r(() => u.data?.checkInRecords.items ?? [], [u.data]);
15
- return /* @__PURE__ */ a("div", {
16
- className: "space-y-6 p-6",
348
+ }), A = D.data?.attendees.items ?? [], M = k.data?.eventSessions.items ?? [], N = (e) => {
349
+ let t = e.trim();
350
+ if (!t) return {
351
+ attendeeId: null,
352
+ label: "attendee"
353
+ };
354
+ if (t.includes("@")) {
355
+ let e = A.find((e) => e.email?.toLowerCase() === t.toLowerCase());
356
+ return {
357
+ attendeeId: e?.id ?? null,
358
+ label: e?.fullName ?? t
359
+ };
360
+ }
361
+ return {
362
+ attendeeId: t,
363
+ label: A.find((e) => e.id === t)?.fullName ?? `attendee ${t}`
364
+ };
365
+ };
366
+ return /* @__PURE__ */ b(O, {
367
+ treatment: "plain",
368
+ className: "border-border-seam p-5",
17
369
  children: [
18
- /* @__PURE__ */ i(c, { children: "Kiosks are the front desk of your event. Each check-in station is a device or counter where attendees scan in, and check-in records are the live log of who arrived and when. Use this page to confirm your stations are online before doors open and to watch arrivals flow in on the day." }),
19
- /* @__PURE__ */ a(o, { children: [/* @__PURE__ */ a("h1", {
20
- className: "text-2xl font-bold text-text-primary",
21
- children: [/* @__PURE__ */ i(s, { children: "Kiosk" }), " & Check-In"]
22
- }), /* @__PURE__ */ i("p", {
370
+ /* @__PURE__ */ b("div", {
371
+ className: "flex items-center gap-2",
372
+ children: [/* @__PURE__ */ y(w, {
373
+ className: "h-5 w-5 text-text-secondary",
374
+ "aria-hidden": "true"
375
+ }), /* @__PURE__ */ y("h2", {
376
+ className: "text-lg font-semibold text-text-primary",
377
+ children: "Check in an attendee"
378
+ })]
379
+ }),
380
+ /* @__PURE__ */ y("p", {
23
381
  className: "mt-1 text-sm text-text-secondary",
24
- children: "View configured check-in stations and station status."
25
- })] }),
26
- /* @__PURE__ */ i(n, {
27
- heading: l.loading ? "Loading check-in stations..." : `Stations (${d.length})`,
28
- emptyLabel: "No check-in stations configured yet.",
29
- rows: d.map((e) => ({
30
- id: e.id,
31
- title: e.name ?? e.title ?? `Station ${e.id}`,
32
- status: e.status ?? void 0
33
- }))
382
+ children: "Scan a QR badge or type an attendee ID or email, then record the arrival."
383
+ }),
384
+ /* @__PURE__ */ b("form", {
385
+ onSubmit: async (t) => {
386
+ t.preventDefault();
387
+ let { attendeeId: r, label: i } = N(o);
388
+ if (o.trim().includes("@") && !r) {
389
+ e.error("Attendee not found", `No attendee at this event matches “${o.trim()}”.`);
390
+ return;
391
+ }
392
+ let c = {
393
+ eventId: n,
394
+ attendeeId: r,
395
+ stationId: p || null,
396
+ method: l,
397
+ direction: d,
398
+ status: "checked_in",
399
+ recordedAt: (/* @__PURE__ */ new Date()).toISOString(),
400
+ metadata: _ ? { sessionId: _ } : {}
401
+ };
402
+ try {
403
+ let t = await C({ variables: { input: c } });
404
+ if (!g(t, t.data?.createCheckInRecord?.id, "Could not record check-in")) return;
405
+ e.success(`${i} checked ${d === "OUT" ? "out" : "in"}`, `Recorded via ${l}${p ? "" : " • no station"}.`), s(""), a();
406
+ } catch (t) {
407
+ e.error("Could not record check-in", h(t));
408
+ }
409
+ },
410
+ className: "mt-4 space-y-4",
411
+ children: [
412
+ /* @__PURE__ */ b("label", {
413
+ className: "block space-y-1 text-sm",
414
+ children: [/* @__PURE__ */ y("span", {
415
+ className: "font-medium text-text-primary",
416
+ children: "Attendee ID / email / QR"
417
+ }), /* @__PURE__ */ y(j, {
418
+ value: o,
419
+ onChange: (e) => s(e.target.value),
420
+ placeholder: "Scan badge or paste attendee ID / email",
421
+ autoComplete: "off"
422
+ })]
423
+ }),
424
+ /* @__PURE__ */ b("div", {
425
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
426
+ children: [
427
+ /* @__PURE__ */ b("label", {
428
+ className: "space-y-1 text-sm",
429
+ children: [/* @__PURE__ */ y("span", {
430
+ className: "font-medium text-text-primary",
431
+ children: "Method"
432
+ }), /* @__PURE__ */ b(B, {
433
+ value: l,
434
+ onValueChange: u,
435
+ children: [/* @__PURE__ */ y(U, {
436
+ "aria-label": "Check-in method",
437
+ children: /* @__PURE__ */ y(W, {})
438
+ }), /* @__PURE__ */ y(V, { children: q.map((e) => /* @__PURE__ */ y(H, {
439
+ value: e,
440
+ children: e
441
+ }, e)) })]
442
+ })]
443
+ }),
444
+ /* @__PURE__ */ b("label", {
445
+ className: "space-y-1 text-sm",
446
+ children: [/* @__PURE__ */ y("span", {
447
+ className: "font-medium text-text-primary",
448
+ children: "Direction"
449
+ }), /* @__PURE__ */ b(B, {
450
+ value: d,
451
+ onValueChange: f,
452
+ children: [/* @__PURE__ */ y(U, {
453
+ "aria-label": "Direction",
454
+ children: /* @__PURE__ */ y(W, {})
455
+ }), /* @__PURE__ */ y(V, { children: J.map((e) => /* @__PURE__ */ y(H, {
456
+ value: e,
457
+ children: e
458
+ }, e)) })]
459
+ })]
460
+ }),
461
+ /* @__PURE__ */ b("label", {
462
+ className: "space-y-1 text-sm",
463
+ children: [/* @__PURE__ */ y("span", {
464
+ className: "font-medium text-text-primary",
465
+ children: "Station"
466
+ }), /* @__PURE__ */ b(B, {
467
+ value: p || "none",
468
+ onValueChange: (e) => m(e === "none" ? "" : e),
469
+ children: [/* @__PURE__ */ y(U, {
470
+ "aria-label": "Station",
471
+ children: /* @__PURE__ */ y(W, {})
472
+ }), /* @__PURE__ */ b(V, { children: [/* @__PURE__ */ y(H, {
473
+ value: "none",
474
+ children: "No station"
475
+ }), r.map((e) => /* @__PURE__ */ y(H, {
476
+ value: e.id,
477
+ children: e.name ?? e.id
478
+ }, e.id))] })]
479
+ })]
480
+ }),
481
+ /* @__PURE__ */ b("label", {
482
+ className: "space-y-1 text-sm",
483
+ children: [/* @__PURE__ */ y("span", {
484
+ className: "font-medium text-text-primary",
485
+ children: "Session"
486
+ }), /* @__PURE__ */ b(B, {
487
+ value: _ || "none",
488
+ onValueChange: (e) => S(e === "none" ? "" : e),
489
+ children: [/* @__PURE__ */ y(U, {
490
+ "aria-label": "Session",
491
+ children: /* @__PURE__ */ y(W, {})
492
+ }), /* @__PURE__ */ b(V, { children: [/* @__PURE__ */ y(H, {
493
+ value: "none",
494
+ children: "Whole event"
495
+ }), M.map((e) => /* @__PURE__ */ y(H, {
496
+ value: e.id,
497
+ children: e.title
498
+ }, e.id))] })]
499
+ })]
500
+ })
501
+ ]
502
+ }),
503
+ /* @__PURE__ */ y("div", {
504
+ className: "flex justify-end",
505
+ children: /* @__PURE__ */ b(E, {
506
+ type: "submit",
507
+ disabled: T || !o.trim(),
508
+ children: [/* @__PURE__ */ y(x, { className: "h-4 w-4" }), T ? "Recording…" : "Record check-in"]
509
+ })
510
+ })
511
+ ]
512
+ })
513
+ ]
514
+ });
515
+ }
516
+ var Z = 10;
517
+ function Q() {
518
+ let t = l({
519
+ limit: 100,
520
+ offset: 0
521
+ }).data?.events.items ?? [], [i, a] = v(""), c = i || void 0, u = t.find((e) => e.id === i), d = m({
522
+ pageSize: Z,
523
+ resetKey: i
524
+ }), h = m({
525
+ pageSize: Z,
526
+ resetKey: i
527
+ }), _ = r({
528
+ eventId: c,
529
+ limit: d.limit,
530
+ offset: d.offset
531
+ }), x = n({
532
+ eventId: c,
533
+ limit: h.limit,
534
+ offset: h.offset
535
+ }), w = _.data?.checkInStations.items ?? [], j = _.data?.checkInStations.total ?? 0, M = x.data?.checkInRecords.items ?? [], P = x.data?.checkInRecords.total ?? 0, [F] = s(), [I] = o(), [L, R] = v(!1), [z, G] = v(void 0), [K, q] = v(!1), [J, X] = v(null), Q = () => {
536
+ G(void 0), R(!0);
537
+ }, re = (e) => {
538
+ G(e), R(!0);
539
+ }, ie = (e) => {
540
+ X(e), q(!0);
541
+ }, ae = async (t) => {
542
+ let n = await F({ variables: { id: t.id } });
543
+ g(n, n.data?.deleteCheckInStation ? t.id : null, "Could not delete station") && e.success("Station deleted", `“${t.name ?? t.id}” was removed.`);
544
+ }, oe = async (t) => {
545
+ let n = await I({ variables: { id: t.id } });
546
+ g(n, n.data?.deleteCheckInRecord ? t.id : null, "Could not delete record") && e.success("Check-in record deleted");
547
+ }, $ = !!i;
548
+ return /* @__PURE__ */ b("div", {
549
+ className: "space-y-6 p-6",
550
+ children: [
551
+ /* @__PURE__ */ y(N, { children: "Kiosks are the front desk of your event. Each check-in station is a device or counter where attendees scan in, and check-in records are the live log of who arrived and when. Configure your stations before doors open, then check attendees in from this page and watch arrivals flow in on the day." }),
552
+ /* @__PURE__ */ y(D, { children: /* @__PURE__ */ b("div", {
553
+ className: "flex flex-wrap items-start justify-between gap-4",
554
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("h1", {
555
+ className: "text-2xl font-bold text-text-primary",
556
+ children: [/* @__PURE__ */ y(k, { children: "Kiosk" }), " & Check-In"]
557
+ }), /* @__PURE__ */ y("p", {
558
+ className: "mt-1 text-sm text-text-secondary",
559
+ children: "Manage check-in stations and record attendee arrivals against a live backend."
560
+ })] }), /* @__PURE__ */ b("div", {
561
+ className: "flex flex-wrap items-end gap-3",
562
+ children: [/* @__PURE__ */ b("label", {
563
+ className: "space-y-1 text-sm",
564
+ children: [/* @__PURE__ */ y("span", {
565
+ className: "font-medium text-text-primary",
566
+ children: "Event"
567
+ }), /* @__PURE__ */ b(B, {
568
+ value: i || "all",
569
+ onValueChange: (e) => a(e === "all" ? "" : e),
570
+ children: [/* @__PURE__ */ y(U, {
571
+ "aria-label": "Event",
572
+ className: "min-w-52",
573
+ children: /* @__PURE__ */ y(W, { placeholder: "All events" })
574
+ }), /* @__PURE__ */ b(V, { children: [/* @__PURE__ */ y(H, {
575
+ value: "all",
576
+ children: "All events"
577
+ }), t.map((e) => /* @__PURE__ */ y(H, {
578
+ value: e.id,
579
+ children: e.name
580
+ }, e.id))] })]
581
+ })]
582
+ }), /* @__PURE__ */ b(E, {
583
+ type: "button",
584
+ onClick: Q,
585
+ disabled: !$,
586
+ children: [/* @__PURE__ */ y(C, { className: "h-4 w-4" }), "New station"]
587
+ })]
588
+ })]
589
+ }) }),
590
+ $ ? /* @__PURE__ */ y(ne, {
591
+ eventId: i,
592
+ stations: w,
593
+ onCheckedIn: () => {
594
+ h.reset(), x.refetch();
595
+ }
596
+ }) : /* @__PURE__ */ y(O, {
597
+ treatment: "plain",
598
+ className: "border-border-seam p-5",
599
+ children: /* @__PURE__ */ y(A, {
600
+ illustration: "empty-data",
601
+ title: "Select an event to check attendees in",
602
+ description: "Check-in stations and records belong to a specific event. Pick one above to configure stations and record arrivals.",
603
+ className: "py-8"
604
+ })
605
+ }),
606
+ /* @__PURE__ */ b(O, {
607
+ treatment: "plain",
608
+ className: "border-border-seam p-5",
609
+ children: [
610
+ /* @__PURE__ */ b("div", {
611
+ className: "flex items-center gap-2",
612
+ children: [/* @__PURE__ */ y(S, {
613
+ className: "h-5 w-5 text-text-secondary",
614
+ "aria-hidden": "true"
615
+ }), /* @__PURE__ */ y("h2", {
616
+ className: "text-lg font-semibold text-text-primary",
617
+ children: _.loading ? "Loading stations…" : `Stations (${j})`
618
+ })]
619
+ }),
620
+ /* @__PURE__ */ y("div", {
621
+ className: "mt-4",
622
+ children: w.length === 0 ? /* @__PURE__ */ y(A, {
623
+ illustration: "empty-data",
624
+ title: "No check-in stations yet",
625
+ description: $ ? "Create a station to start scanning attendees in." : "No stations configured.",
626
+ className: "py-8"
627
+ }) : /* @__PURE__ */ y("ul", {
628
+ className: "space-y-2.5",
629
+ children: w.map((e) => {
630
+ let t = Y(e.metadata), n = t.isActive ?? !0, r = [
631
+ t.type?.replace("_", " "),
632
+ t.location,
633
+ t.code
634
+ ].filter(Boolean).join(" • ");
635
+ return /* @__PURE__ */ y("li", {
636
+ className: "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",
637
+ children: /* @__PURE__ */ b("div", {
638
+ className: "flex items-center justify-between gap-3",
639
+ children: [/* @__PURE__ */ b("div", {
640
+ className: "min-w-0",
641
+ children: [/* @__PURE__ */ y("p", {
642
+ className: "truncate font-medium text-text-primary",
643
+ children: e.name ?? e.id
644
+ }), r ? /* @__PURE__ */ y("p", {
645
+ className: "mt-0.5 truncate text-sm text-text-secondary",
646
+ children: r
647
+ }) : null]
648
+ }), /* @__PURE__ */ b("div", {
649
+ className: "flex items-center gap-2",
650
+ children: [/* @__PURE__ */ y(T, {
651
+ variant: n ? "success" : "warning",
652
+ className: "shrink-0 uppercase",
653
+ children: n ? "active" : "disabled"
654
+ }), /* @__PURE__ */ y(f, {
655
+ ariaLabel: `Station ${e.name ?? e.id} actions`,
656
+ entityName: e.name ?? void 0,
657
+ onEdit: () => re(e),
658
+ onDelete: () => ae(e)
659
+ })]
660
+ })]
661
+ })
662
+ }, e.id);
663
+ })
664
+ })
665
+ }),
666
+ /* @__PURE__ */ y(p, {
667
+ offset: d.offset,
668
+ limit: d.limit,
669
+ loadedCount: w.length,
670
+ total: j,
671
+ onPrev: d.prevPage,
672
+ onNext: d.nextPage,
673
+ itemLabel: "stations",
674
+ loading: _.loading
675
+ })
676
+ ]
677
+ }),
678
+ /* @__PURE__ */ b(O, {
679
+ treatment: "plain",
680
+ className: "border-border-seam p-5",
681
+ children: [
682
+ /* @__PURE__ */ y("h2", {
683
+ className: "text-lg font-semibold text-text-primary",
684
+ children: x.loading ? "Loading check-in records…" : `Check-In Records (${P})`
685
+ }),
686
+ /* @__PURE__ */ y("div", {
687
+ className: "mt-4",
688
+ children: M.length === 0 ? /* @__PURE__ */ y(A, {
689
+ illustration: "empty-data",
690
+ title: "No check-in records yet",
691
+ description: "Arrivals recorded from this page show up here, newest first.",
692
+ className: "py-8"
693
+ }) : /* @__PURE__ */ y("ul", {
694
+ className: "space-y-2.5",
695
+ children: M.map((e) => /* @__PURE__ */ y("li", {
696
+ className: "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",
697
+ children: /* @__PURE__ */ b("div", {
698
+ className: "flex items-center justify-between gap-3",
699
+ children: [/* @__PURE__ */ b("div", {
700
+ className: "min-w-0",
701
+ children: [/* @__PURE__ */ y("p", {
702
+ className: "truncate font-medium text-text-primary",
703
+ children: e.attendeeId ? `Attendee ${e.attendeeId}` : `Record ${e.id}`
704
+ }), /* @__PURE__ */ b("p", {
705
+ className: "mt-0.5 truncate text-sm text-text-secondary",
706
+ children: [
707
+ e.method,
708
+ " • ",
709
+ e.direction,
710
+ " • ",
711
+ new Date(e.recordedAt).toLocaleString()
712
+ ]
713
+ })]
714
+ }), /* @__PURE__ */ b("div", {
715
+ className: "flex items-center gap-2",
716
+ children: [/* @__PURE__ */ y(T, {
717
+ variant: "secondary",
718
+ className: "shrink-0 uppercase",
719
+ children: e.status
720
+ }), /* @__PURE__ */ y(f, {
721
+ ariaLabel: `Check-in record ${e.id} actions`,
722
+ onEdit: () => ie(e),
723
+ onDelete: () => oe(e)
724
+ })]
725
+ })]
726
+ })
727
+ }, e.id))
728
+ })
729
+ }),
730
+ /* @__PURE__ */ y(p, {
731
+ offset: h.offset,
732
+ limit: h.limit,
733
+ loadedCount: M.length,
734
+ total: P,
735
+ onPrev: h.prevPage,
736
+ onNext: h.nextPage,
737
+ itemLabel: "records",
738
+ loading: x.loading
739
+ })
740
+ ]
34
741
  }),
35
- /* @__PURE__ */ i(n, {
36
- heading: u.loading ? "Loading check-in records..." : `Check-In Records (${f.length})`,
37
- emptyLabel: "No check-in records found.",
38
- rows: f.map((e) => ({
39
- id: e.id,
40
- title: e.attendeeId ? `Attendee ${e.attendeeId}` : `Record ${e.id}`,
41
- subtitle: `${e.method} • ${e.direction}`,
42
- status: e.status
43
- }))
742
+ i ? /* @__PURE__ */ y(ee, {
743
+ open: L,
744
+ onOpenChange: R,
745
+ eventId: i,
746
+ eventName: u?.name ?? "this event",
747
+ station: z
748
+ }) : null,
749
+ /* @__PURE__ */ y(te, {
750
+ open: K,
751
+ onOpenChange: q,
752
+ record: J,
753
+ stations: w
44
754
  })
45
755
  ]
46
756
  });
47
757
  }
48
758
  //#endregion
49
- export { l as default };
759
+ export { Q as default };
50
760
 
51
761
  //# sourceMappingURL=KioskPage.js.map