@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.
- package/dist/eventfullymanaged/EventfullyManagedRoutes.js +151 -67
- package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
- package/dist/eventfullymanaged/api/eventApi.js +546 -67
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
- package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
- package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
- package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
- package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
- package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
- package/dist/eventfullymanaged/components/Pagination.js +84 -0
- package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
- package/dist/eventfullymanaged/components/SafeLink.js +32 -0
- package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
- package/dist/eventfullymanaged/components/index.js +7 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
- package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +295 -76
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +415 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useAttendeesQuery as n, useCreateAttendeeMutation as r, useCreateRegistrationMutation as i, useEventsQuery as a, usePromoCodesQuery as ee, useTicketTypesQuery as te } from "../../api/eventApi.js";
|
|
4
|
+
import { describeError as ne, mutationSucceeded as o } from "../../lib/mutationResult.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 { ArrowLeft as d, CheckCircle2 as re, Ticket as f } from "lucide-react";
|
|
8
|
+
import { Button as p, EmphasisPanel as ie, GlassCard as ae, Input as m, PagePurpose as oe, Select as h, SelectContent as g, SelectItem as _, SelectTrigger as v, SelectValue as y } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
//#region src/eventfullymanaged/pages/registration/RegisterAttendeePage.tsx
|
|
10
|
+
var b = "__new__";
|
|
11
|
+
function x() {
|
|
12
|
+
let { navigate: x } = e(), [S, se] = c(""), [C, w] = c(""), [T, E] = c(b), [D, O] = c(""), [k, ce] = c(""), [le, A] = c(""), [j, M] = c(""), [N, P] = c("1"), [F, I] = c(""), [L, R] = c(""), [z, B] = c(null), { data: ue } = a({
|
|
13
|
+
limit: 100,
|
|
14
|
+
offset: 0
|
|
15
|
+
}), { data: V } = te({
|
|
16
|
+
eventId: S || void 0,
|
|
17
|
+
limit: 100,
|
|
18
|
+
offset: 0
|
|
19
|
+
}), { data: H } = n({
|
|
20
|
+
eventId: S || void 0,
|
|
21
|
+
limit: 100,
|
|
22
|
+
offset: 0
|
|
23
|
+
}), { data: U } = ee({
|
|
24
|
+
eventId: S || void 0,
|
|
25
|
+
limit: 100,
|
|
26
|
+
offset: 0
|
|
27
|
+
}), [de, { loading: fe }] = r(), [pe, { loading: me }] = i(), W = ue?.events.items ?? [], G = s(() => (V?.ticketTypes.items ?? []).filter((e) => !S || e.eventId === S), [V, S]), K = s(() => (H?.attendees.items ?? []).filter((e) => !S || e.eventId === S), [H, S]), q = s(() => (U?.promoCodes.items ?? []).filter((e) => e.isActive && (!S || e.eventId === S)), [U, S]), J = s(() => G.find((e) => e.id === C), [G, C]), Y = Math.max(1, Number(N) || 1), he = J ? Number(J.price) : 0, X = J?.currency ?? "USD", Z = Number.isFinite(he) ? he * Y : 0, Q = Z > 0, ge = (e) => {
|
|
28
|
+
se(e), w(""), E(b), I("");
|
|
29
|
+
}, $ = fe || me, _e = () => {
|
|
30
|
+
w(""), E(b), O(""), ce(""), A(""), M(""), P("1"), I(""), R("");
|
|
31
|
+
};
|
|
32
|
+
return z ? /* @__PURE__ */ u("div", {
|
|
33
|
+
className: "space-y-6 p-6",
|
|
34
|
+
children: [/* @__PURE__ */ l("div", { children: /* @__PURE__ */ u(p, {
|
|
35
|
+
type: "button",
|
|
36
|
+
variant: "ghost",
|
|
37
|
+
size: "sm",
|
|
38
|
+
onClick: () => x("/registration"),
|
|
39
|
+
children: [/* @__PURE__ */ l(d, { className: "h-4 w-4" }), "Back to Registration"]
|
|
40
|
+
}) }), /* @__PURE__ */ u(ae, {
|
|
41
|
+
treatment: "glass",
|
|
42
|
+
glow: !0,
|
|
43
|
+
className: "p-8 text-center",
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ l(re, {
|
|
46
|
+
className: "mx-auto h-12 w-12 text-status-success-text",
|
|
47
|
+
"aria-hidden": "true"
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ l("h1", {
|
|
50
|
+
className: "mt-4 text-2xl font-bold text-text-primary",
|
|
51
|
+
children: "Registration confirmed"
|
|
52
|
+
}),
|
|
53
|
+
/* @__PURE__ */ u("p", {
|
|
54
|
+
className: "mt-2 text-sm text-text-secondary",
|
|
55
|
+
children: [
|
|
56
|
+
z.attendeeName,
|
|
57
|
+
" is registered for ",
|
|
58
|
+
z.eventName,
|
|
59
|
+
"."
|
|
60
|
+
]
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ u("dl", {
|
|
63
|
+
className: "mx-auto mt-6 max-w-sm space-y-2 text-left text-sm",
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ u("div", {
|
|
66
|
+
className: "flex justify-between",
|
|
67
|
+
children: [/* @__PURE__ */ l("dt", {
|
|
68
|
+
className: "text-text-secondary",
|
|
69
|
+
children: "Ticket"
|
|
70
|
+
}), /* @__PURE__ */ l("dd", {
|
|
71
|
+
className: "font-medium text-text-primary",
|
|
72
|
+
children: z.ticketName
|
|
73
|
+
})]
|
|
74
|
+
}),
|
|
75
|
+
/* @__PURE__ */ u("div", {
|
|
76
|
+
className: "flex justify-between",
|
|
77
|
+
children: [/* @__PURE__ */ l("dt", {
|
|
78
|
+
className: "text-text-secondary",
|
|
79
|
+
children: "Quantity"
|
|
80
|
+
}), /* @__PURE__ */ l("dd", {
|
|
81
|
+
className: "font-medium tabular-nums text-text-primary",
|
|
82
|
+
children: z.quantity
|
|
83
|
+
})]
|
|
84
|
+
}),
|
|
85
|
+
/* @__PURE__ */ u("div", {
|
|
86
|
+
className: "flex justify-between",
|
|
87
|
+
children: [/* @__PURE__ */ l("dt", {
|
|
88
|
+
className: "text-text-secondary",
|
|
89
|
+
children: "Status"
|
|
90
|
+
}), /* @__PURE__ */ l("dd", {
|
|
91
|
+
className: "font-medium text-text-primary",
|
|
92
|
+
children: z.status
|
|
93
|
+
})]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ u("div", {
|
|
96
|
+
className: "flex justify-between",
|
|
97
|
+
children: [/* @__PURE__ */ l("dt", {
|
|
98
|
+
className: "text-text-secondary",
|
|
99
|
+
children: "Amount"
|
|
100
|
+
}), /* @__PURE__ */ l("dd", {
|
|
101
|
+
className: "font-medium tabular-nums text-text-primary",
|
|
102
|
+
children: z.amountLabel
|
|
103
|
+
})]
|
|
104
|
+
})
|
|
105
|
+
]
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ u("div", {
|
|
108
|
+
className: "mt-8 flex justify-center gap-3",
|
|
109
|
+
children: [/* @__PURE__ */ l(p, {
|
|
110
|
+
type: "button",
|
|
111
|
+
variant: "outline",
|
|
112
|
+
onClick: () => x("/registration"),
|
|
113
|
+
children: "Back to Registrations"
|
|
114
|
+
}), /* @__PURE__ */ l(p, {
|
|
115
|
+
type: "button",
|
|
116
|
+
onClick: () => B(null),
|
|
117
|
+
children: "Register another"
|
|
118
|
+
})]
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
})]
|
|
122
|
+
}) : /* @__PURE__ */ u("div", {
|
|
123
|
+
className: "space-y-6 p-6",
|
|
124
|
+
children: [
|
|
125
|
+
/* @__PURE__ */ u("div", { children: [
|
|
126
|
+
/* @__PURE__ */ u(p, {
|
|
127
|
+
type: "button",
|
|
128
|
+
variant: "ghost",
|
|
129
|
+
size: "sm",
|
|
130
|
+
onClick: () => x("/registration"),
|
|
131
|
+
children: [/* @__PURE__ */ l(d, { className: "h-4 w-4" }), "Back to Registration"]
|
|
132
|
+
}),
|
|
133
|
+
/* @__PURE__ */ l("h1", {
|
|
134
|
+
className: "mt-3 text-2xl font-bold text-text-primary",
|
|
135
|
+
children: "Register Attendee"
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ l("p", {
|
|
138
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
139
|
+
children: "Sign someone up for an event against a ticket type."
|
|
140
|
+
})
|
|
141
|
+
] }),
|
|
142
|
+
/* @__PURE__ */ l(oe, { children: "Register a person for an event in one step. Pick the event and the ticket they are buying, then either choose an existing attendee or enter a new one. Apply a promo code if they have one. Pricing and payment are handled by the billing service — you just confirm who is coming and on which ticket." }),
|
|
143
|
+
/* @__PURE__ */ l(ie, { children: /* @__PURE__ */ u("form", {
|
|
144
|
+
onSubmit: async (e) => {
|
|
145
|
+
if (e.preventDefault(), !S) {
|
|
146
|
+
t.error("Event required", "Choose the event to register for.");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!C) {
|
|
150
|
+
t.error("Ticket required", "Choose a ticket type.");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
let n = T === b;
|
|
154
|
+
if (n && (!D.trim() || !k.trim())) {
|
|
155
|
+
t.error("Attendee required", "Enter a name and email, or pick an existing attendee.");
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
let e = T, r = K.find((e) => e.id === T)?.fullName ?? "";
|
|
160
|
+
if (n) {
|
|
161
|
+
let t = await de({ variables: { input: {
|
|
162
|
+
eventId: S,
|
|
163
|
+
fullName: D.trim(),
|
|
164
|
+
email: k.trim(),
|
|
165
|
+
company: le.trim() || null,
|
|
166
|
+
phone: j.trim() || null,
|
|
167
|
+
profile: {},
|
|
168
|
+
metadata: {}
|
|
169
|
+
} } }), n = t.data?.createAttendee?.id;
|
|
170
|
+
if (!o(t, n, "Could not create attendee") || !n) return;
|
|
171
|
+
e = n, r = D.trim();
|
|
172
|
+
}
|
|
173
|
+
let i = {};
|
|
174
|
+
F && (i.promoCode = F), Q && L.trim() && (i.billingAccountId = L.trim());
|
|
175
|
+
let a = await pe({ variables: { input: {
|
|
176
|
+
eventId: S,
|
|
177
|
+
attendeeId: e,
|
|
178
|
+
ticketTypeId: C,
|
|
179
|
+
quantity: Y,
|
|
180
|
+
currency: X,
|
|
181
|
+
status: "CONFIRMED",
|
|
182
|
+
metadata: i
|
|
183
|
+
} } });
|
|
184
|
+
if (!o(a, a.data?.createRegistration?.id, "Could not create registration")) return;
|
|
185
|
+
let ee = a.data?.createRegistration;
|
|
186
|
+
B({
|
|
187
|
+
attendeeName: r || "Attendee",
|
|
188
|
+
eventName: W.find((e) => e.id === S)?.name ?? "Event",
|
|
189
|
+
ticketName: J?.name ?? "Ticket",
|
|
190
|
+
quantity: Y,
|
|
191
|
+
status: ee?.status ?? "CONFIRMED",
|
|
192
|
+
amountLabel: Q ? `${Z.toLocaleString()} ${X} — billed by the billing service` : "Free"
|
|
193
|
+
}), t.success("Registration confirmed", r || void 0), _e();
|
|
194
|
+
} catch (e) {
|
|
195
|
+
t.error("Could not register attendee", ne(e));
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
className: "space-y-4",
|
|
199
|
+
children: [
|
|
200
|
+
/* @__PURE__ */ u("div", {
|
|
201
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
202
|
+
children: [/* @__PURE__ */ u("label", {
|
|
203
|
+
className: "space-y-1 text-sm",
|
|
204
|
+
children: [/* @__PURE__ */ l("span", {
|
|
205
|
+
className: "font-medium text-text-primary",
|
|
206
|
+
children: "Event"
|
|
207
|
+
}), /* @__PURE__ */ u(h, {
|
|
208
|
+
value: S,
|
|
209
|
+
onValueChange: ge,
|
|
210
|
+
children: [/* @__PURE__ */ l(v, {
|
|
211
|
+
"aria-label": "Event",
|
|
212
|
+
children: /* @__PURE__ */ l(y, { placeholder: "Select Event" })
|
|
213
|
+
}), /* @__PURE__ */ l(g, { children: W.map((e) => /* @__PURE__ */ l(_, {
|
|
214
|
+
value: e.id,
|
|
215
|
+
children: e.name
|
|
216
|
+
}, e.id)) })]
|
|
217
|
+
})]
|
|
218
|
+
}), /* @__PURE__ */ u("label", {
|
|
219
|
+
className: "space-y-1 text-sm",
|
|
220
|
+
children: [/* @__PURE__ */ l("span", {
|
|
221
|
+
className: "font-medium text-text-primary",
|
|
222
|
+
children: "Ticket Type"
|
|
223
|
+
}), /* @__PURE__ */ u(h, {
|
|
224
|
+
value: C,
|
|
225
|
+
onValueChange: w,
|
|
226
|
+
disabled: !S,
|
|
227
|
+
children: [/* @__PURE__ */ l(v, {
|
|
228
|
+
"aria-label": "Ticket Type",
|
|
229
|
+
children: /* @__PURE__ */ l(y, { placeholder: S ? "Select Ticket" : "Select an event first" })
|
|
230
|
+
}), /* @__PURE__ */ l(g, { children: G.map((e) => /* @__PURE__ */ u(_, {
|
|
231
|
+
value: e.id,
|
|
232
|
+
children: [
|
|
233
|
+
e.name,
|
|
234
|
+
" — ",
|
|
235
|
+
e.price,
|
|
236
|
+
" ",
|
|
237
|
+
e.currency
|
|
238
|
+
]
|
|
239
|
+
}, e.id)) })]
|
|
240
|
+
})]
|
|
241
|
+
})]
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ u("label", {
|
|
244
|
+
className: "space-y-1 text-sm",
|
|
245
|
+
children: [/* @__PURE__ */ l("span", {
|
|
246
|
+
className: "font-medium text-text-primary",
|
|
247
|
+
children: "Attendee"
|
|
248
|
+
}), /* @__PURE__ */ u(h, {
|
|
249
|
+
value: T,
|
|
250
|
+
onValueChange: E,
|
|
251
|
+
children: [/* @__PURE__ */ l(v, {
|
|
252
|
+
"aria-label": "Attendee",
|
|
253
|
+
children: /* @__PURE__ */ l(y, {})
|
|
254
|
+
}), /* @__PURE__ */ u(g, { children: [/* @__PURE__ */ l(_, {
|
|
255
|
+
value: b,
|
|
256
|
+
children: "+ New attendee"
|
|
257
|
+
}), K.map((e) => /* @__PURE__ */ u(_, {
|
|
258
|
+
value: e.id,
|
|
259
|
+
children: [
|
|
260
|
+
e.fullName,
|
|
261
|
+
" · ",
|
|
262
|
+
e.email
|
|
263
|
+
]
|
|
264
|
+
}, e.id))] })]
|
|
265
|
+
})]
|
|
266
|
+
}),
|
|
267
|
+
T === b ? /* @__PURE__ */ u("div", {
|
|
268
|
+
className: "grid grid-cols-1 gap-4 rounded-input border border-border-seam bg-bg-surface p-4 md:grid-cols-2",
|
|
269
|
+
children: [
|
|
270
|
+
/* @__PURE__ */ u("label", {
|
|
271
|
+
className: "space-y-1 text-sm",
|
|
272
|
+
children: [/* @__PURE__ */ l("span", {
|
|
273
|
+
className: "font-medium text-text-primary",
|
|
274
|
+
children: "Full Name"
|
|
275
|
+
}), /* @__PURE__ */ l(m, {
|
|
276
|
+
value: D,
|
|
277
|
+
onChange: (e) => O(e.target.value),
|
|
278
|
+
required: !0
|
|
279
|
+
})]
|
|
280
|
+
}),
|
|
281
|
+
/* @__PURE__ */ u("label", {
|
|
282
|
+
className: "space-y-1 text-sm",
|
|
283
|
+
children: [/* @__PURE__ */ l("span", {
|
|
284
|
+
className: "font-medium text-text-primary",
|
|
285
|
+
children: "Email"
|
|
286
|
+
}), /* @__PURE__ */ l(m, {
|
|
287
|
+
type: "email",
|
|
288
|
+
value: k,
|
|
289
|
+
onChange: (e) => ce(e.target.value),
|
|
290
|
+
required: !0
|
|
291
|
+
})]
|
|
292
|
+
}),
|
|
293
|
+
/* @__PURE__ */ u("label", {
|
|
294
|
+
className: "space-y-1 text-sm",
|
|
295
|
+
children: [/* @__PURE__ */ l("span", {
|
|
296
|
+
className: "font-medium text-text-primary",
|
|
297
|
+
children: "Company"
|
|
298
|
+
}), /* @__PURE__ */ l(m, {
|
|
299
|
+
value: le,
|
|
300
|
+
onChange: (e) => A(e.target.value)
|
|
301
|
+
})]
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ u("label", {
|
|
304
|
+
className: "space-y-1 text-sm",
|
|
305
|
+
children: [/* @__PURE__ */ l("span", {
|
|
306
|
+
className: "font-medium text-text-primary",
|
|
307
|
+
children: "Phone"
|
|
308
|
+
}), /* @__PURE__ */ l(m, {
|
|
309
|
+
value: j,
|
|
310
|
+
onChange: (e) => M(e.target.value)
|
|
311
|
+
})]
|
|
312
|
+
})
|
|
313
|
+
]
|
|
314
|
+
}) : null,
|
|
315
|
+
/* @__PURE__ */ u("div", {
|
|
316
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
317
|
+
children: [/* @__PURE__ */ u("label", {
|
|
318
|
+
className: "space-y-1 text-sm",
|
|
319
|
+
children: [/* @__PURE__ */ l("span", {
|
|
320
|
+
className: "font-medium text-text-primary",
|
|
321
|
+
children: "Quantity"
|
|
322
|
+
}), /* @__PURE__ */ l(m, {
|
|
323
|
+
type: "number",
|
|
324
|
+
min: "1",
|
|
325
|
+
value: N,
|
|
326
|
+
onChange: (e) => P(e.target.value),
|
|
327
|
+
required: !0
|
|
328
|
+
})]
|
|
329
|
+
}), /* @__PURE__ */ u("label", {
|
|
330
|
+
className: "space-y-1 text-sm",
|
|
331
|
+
children: [/* @__PURE__ */ l("span", {
|
|
332
|
+
className: "font-medium text-text-primary",
|
|
333
|
+
children: "Promo Code (optional)"
|
|
334
|
+
}), /* @__PURE__ */ u(h, {
|
|
335
|
+
value: F,
|
|
336
|
+
onValueChange: I,
|
|
337
|
+
disabled: q.length === 0,
|
|
338
|
+
children: [/* @__PURE__ */ l(v, {
|
|
339
|
+
"aria-label": "Promo Code",
|
|
340
|
+
children: /* @__PURE__ */ l(y, { placeholder: q.length === 0 ? "No active codes" : "No promo code" })
|
|
341
|
+
}), /* @__PURE__ */ l(g, { children: q.map((e) => /* @__PURE__ */ u(_, {
|
|
342
|
+
value: e.code,
|
|
343
|
+
children: [
|
|
344
|
+
e.code,
|
|
345
|
+
" —",
|
|
346
|
+
" ",
|
|
347
|
+
e.discountType === "PERCENT" ? `${e.discountValue}%` : e.discountValue
|
|
348
|
+
]
|
|
349
|
+
}, e.id)) })]
|
|
350
|
+
})]
|
|
351
|
+
})]
|
|
352
|
+
}),
|
|
353
|
+
Q ? /* @__PURE__ */ u("div", {
|
|
354
|
+
className: "space-y-3 rounded-input border border-border-seam bg-bg-surface p-4",
|
|
355
|
+
children: [/* @__PURE__ */ u("div", {
|
|
356
|
+
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
357
|
+
children: [/* @__PURE__ */ l(f, {
|
|
358
|
+
className: "h-4 w-4 text-text-muted",
|
|
359
|
+
"aria-hidden": "true"
|
|
360
|
+
}), /* @__PURE__ */ u("span", { children: [
|
|
361
|
+
"Estimated total",
|
|
362
|
+
" ",
|
|
363
|
+
/* @__PURE__ */ u("span", {
|
|
364
|
+
className: "font-semibold tabular-nums text-text-primary",
|
|
365
|
+
children: [
|
|
366
|
+
Z.toLocaleString(),
|
|
367
|
+
" ",
|
|
368
|
+
X
|
|
369
|
+
]
|
|
370
|
+
}),
|
|
371
|
+
" ",
|
|
372
|
+
"— final pricing and payment are handled by the billing service."
|
|
373
|
+
] })]
|
|
374
|
+
}), /* @__PURE__ */ u("label", {
|
|
375
|
+
className: "space-y-1 text-sm",
|
|
376
|
+
children: [
|
|
377
|
+
/* @__PURE__ */ l("span", {
|
|
378
|
+
className: "font-medium text-text-primary",
|
|
379
|
+
children: "Billing Account ID (optional)"
|
|
380
|
+
}),
|
|
381
|
+
/* @__PURE__ */ l(m, {
|
|
382
|
+
value: L,
|
|
383
|
+
onChange: (e) => R(e.target.value),
|
|
384
|
+
placeholder: "Attach an existing billing account"
|
|
385
|
+
}),
|
|
386
|
+
/* @__PURE__ */ l("span", {
|
|
387
|
+
className: "text-xs text-text-secondary",
|
|
388
|
+
children: "When provided, the charge is attached to this billing account."
|
|
389
|
+
})
|
|
390
|
+
]
|
|
391
|
+
})]
|
|
392
|
+
}) : null,
|
|
393
|
+
/* @__PURE__ */ u("div", {
|
|
394
|
+
className: "flex justify-end gap-3",
|
|
395
|
+
children: [/* @__PURE__ */ l(p, {
|
|
396
|
+
type: "button",
|
|
397
|
+
variant: "outline",
|
|
398
|
+
onClick: () => x("/registration"),
|
|
399
|
+
disabled: $,
|
|
400
|
+
children: "Cancel"
|
|
401
|
+
}), /* @__PURE__ */ u(p, {
|
|
402
|
+
type: "submit",
|
|
403
|
+
disabled: $,
|
|
404
|
+
children: [/* @__PURE__ */ l(f, { className: "h-4 w-4" }), $ ? "Registering…" : "Register Attendee"]
|
|
405
|
+
})]
|
|
406
|
+
})
|
|
407
|
+
]
|
|
408
|
+
}) })
|
|
409
|
+
]
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
//#endregion
|
|
413
|
+
export { x as default };
|
|
414
|
+
|
|
415
|
+
//# sourceMappingURL=RegisterAttendeePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegisterAttendeePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/registration/RegisterAttendeePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { ArrowLeft, CheckCircle2, Ticket } from 'lucide-react';\nimport {\n Button,\n EmphasisPanel,\n GlassCard,\n Input,\n PagePurpose,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useAttendeesQuery,\n useCreateAttendeeMutation,\n useCreateRegistrationMutation,\n useEventsQuery,\n usePromoCodesQuery,\n useTicketTypesQuery,\n} from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype Confirmation = {\n attendeeName: string;\n eventName: string;\n ticketName: string;\n quantity: number;\n status: string;\n amountLabel: string;\n};\n\nconst NEW_ATTENDEE = '__new__';\n\nexport default function RegisterAttendeePage() {\n const { navigate } = useEventfullyManaged();\n\n const [eventId, setEventId] = useState('');\n const [ticketTypeId, setTicketTypeId] = useState('');\n const [attendeeId, setAttendeeId] = useState(NEW_ATTENDEE);\n const [fullName, setFullName] = useState('');\n const [email, setEmail] = useState('');\n const [company, setCompany] = useState('');\n const [phone, setPhone] = useState('');\n const [quantity, setQuantity] = useState('1');\n const [promoCode, setPromoCode] = useState('');\n const [billingAccountId, setBillingAccountId] = useState('');\n const [confirmation, setConfirmation] = useState<Confirmation | null>(null);\n\n const { data: eventsData } = useEventsQuery({ limit: 100, offset: 0 });\n const { data: ticketData } = useTicketTypesQuery({ eventId: eventId || undefined, limit: 100, offset: 0 });\n const { data: attendeesData } = useAttendeesQuery({ eventId: eventId || undefined, limit: 100, offset: 0 });\n const { data: promoData } = usePromoCodesQuery({ eventId: eventId || undefined, limit: 100, offset: 0 });\n\n const [createAttendee, { loading: creatingAttendee }] = useCreateAttendeeMutation();\n const [createRegistration, { loading: creatingRegistration }] = useCreateRegistrationMutation();\n\n const events = eventsData?.events.items ?? [];\n const tickets = useMemo(\n () => (ticketData?.ticketTypes.items ?? []).filter((ticket) => !eventId || ticket.eventId === eventId),\n [ticketData, eventId]\n );\n const attendees = useMemo(\n () => (attendeesData?.attendees.items ?? []).filter((attendee) => !eventId || attendee.eventId === eventId),\n [attendeesData, eventId]\n );\n const promoCodes = useMemo(\n () =>\n (promoData?.promoCodes.items ?? []).filter((promo) => promo.isActive && (!eventId || promo.eventId === eventId)),\n [promoData, eventId]\n );\n\n const selectedTicket = useMemo(() => tickets.find((ticket) => ticket.id === ticketTypeId), [tickets, ticketTypeId]);\n const qty = Math.max(1, Number(quantity) || 1);\n const unitPrice = selectedTicket ? Number(selectedTicket.price) : 0;\n const currency = selectedTicket?.currency ?? 'USD';\n const grossAmount = Number.isFinite(unitPrice) ? unitPrice * qty : 0;\n const hasPositiveAmount = grossAmount > 0;\n\n const onEventChange = (value: string) => {\n setEventId(value);\n // Reset dependent selections so the user can't submit a stale ticket/attendee.\n setTicketTypeId('');\n setAttendeeId(NEW_ATTENDEE);\n setPromoCode('');\n };\n\n const saving = creatingAttendee || creatingRegistration;\n\n const resetForm = () => {\n setTicketTypeId('');\n setAttendeeId(NEW_ATTENDEE);\n setFullName('');\n setEmail('');\n setCompany('');\n setPhone('');\n setQuantity('1');\n setPromoCode('');\n setBillingAccountId('');\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!eventId) {\n notify.error('Event required', 'Choose the event to register for.');\n return;\n }\n if (!ticketTypeId) {\n notify.error('Ticket required', 'Choose a ticket type.');\n return;\n }\n\n const isNewAttendee = attendeeId === NEW_ATTENDEE;\n if (isNewAttendee && (!fullName.trim() || !email.trim())) {\n notify.error('Attendee required', 'Enter a name and email, or pick an existing attendee.');\n return;\n }\n\n try {\n let resolvedAttendeeId = attendeeId;\n let resolvedAttendeeName = attendees.find((attendee) => attendee.id === attendeeId)?.fullName ?? '';\n\n if (isNewAttendee) {\n const attendeeResponse = await createAttendee({\n variables: {\n input: {\n eventId,\n fullName: fullName.trim(),\n email: email.trim(),\n company: company.trim() || null,\n phone: phone.trim() || null,\n profile: {},\n metadata: {},\n },\n },\n });\n const createdId = attendeeResponse.data?.createAttendee?.id;\n if (!mutationSucceeded(attendeeResponse, createdId, 'Could not create attendee') || !createdId) {\n return;\n }\n resolvedAttendeeId = createdId;\n resolvedAttendeeName = fullName.trim();\n }\n\n // The money leg is owned by global-billing-svc — never price locally. We\n // only forward a billing account reference (when supplied) via metadata so\n // the backend can attach the charge; totalAmount is left for the backend.\n const metadata: Record<string, unknown> = {};\n if (promoCode) {\n metadata.promoCode = promoCode;\n }\n if (hasPositiveAmount && billingAccountId.trim()) {\n metadata.billingAccountId = billingAccountId.trim();\n }\n\n const registrationResponse = await createRegistration({\n variables: {\n input: {\n eventId,\n attendeeId: resolvedAttendeeId,\n ticketTypeId,\n quantity: qty,\n currency,\n status: 'CONFIRMED',\n metadata,\n },\n },\n });\n if (\n !mutationSucceeded(\n registrationResponse,\n registrationResponse.data?.createRegistration?.id,\n 'Could not create registration'\n )\n ) {\n return;\n }\n\n const registration = registrationResponse.data?.createRegistration;\n setConfirmation({\n attendeeName: resolvedAttendeeName || 'Attendee',\n eventName: events.find((item) => item.id === eventId)?.name ?? 'Event',\n ticketName: selectedTicket?.name ?? 'Ticket',\n quantity: qty,\n status: registration?.status ?? 'CONFIRMED',\n amountLabel: hasPositiveAmount\n ? `${grossAmount.toLocaleString()} ${currency} — billed by the billing service`\n : 'Free',\n });\n notify.success('Registration confirmed', resolvedAttendeeName || undefined);\n resetForm();\n } catch (error) {\n notify.error('Could not register attendee', describeError(error));\n }\n };\n\n if (confirmation) {\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/registration')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Registration\n </Button>\n </div>\n <GlassCard treatment=\"glass\" glow className=\"p-8 text-center\">\n <CheckCircle2 className=\"mx-auto h-12 w-12 text-status-success-text\" aria-hidden=\"true\" />\n <h1 className=\"mt-4 text-2xl font-bold text-text-primary\">Registration confirmed</h1>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {confirmation.attendeeName} is registered for {confirmation.eventName}.\n </p>\n <dl className=\"mx-auto mt-6 max-w-sm space-y-2 text-left text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Ticket</dt>\n <dd className=\"font-medium text-text-primary\">{confirmation.ticketName}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Quantity</dt>\n <dd className=\"font-medium tabular-nums text-text-primary\">{confirmation.quantity}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd className=\"font-medium text-text-primary\">{confirmation.status}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Amount</dt>\n <dd className=\"font-medium tabular-nums text-text-primary\">{confirmation.amountLabel}</dd>\n </div>\n </dl>\n <div className=\"mt-8 flex justify-center gap-3\">\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('/registration')}>\n Back to Registrations\n </Button>\n <Button type=\"button\" onClick={() => setConfirmation(null)}>\n Register another\n </Button>\n </div>\n </GlassCard>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/registration')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Registration\n </Button>\n <h1 className=\"mt-3 text-2xl font-bold text-text-primary\">Register Attendee</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Sign someone up for an event against a ticket type.</p>\n </div>\n\n <PagePurpose>\n Register a person for an event in one step. Pick the event and the ticket they are buying, then either choose an\n existing attendee or enter a new one. Apply a promo code if they have one. Pricing and payment are handled by\n the billing service — you just confirm who is coming and on which ticket.\n </PagePurpose>\n\n <EmphasisPanel>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Event</span>\n <Select value={eventId} onValueChange={onEventChange}>\n <SelectTrigger aria-label=\"Event\">\n <SelectValue placeholder=\"Select Event\" />\n </SelectTrigger>\n <SelectContent>\n {events.map((eventItem) => (\n <SelectItem key={eventItem.id} value={eventItem.id}>\n {eventItem.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Ticket Type</span>\n <Select value={ticketTypeId} onValueChange={setTicketTypeId} disabled={!eventId}>\n <SelectTrigger aria-label=\"Ticket Type\">\n <SelectValue placeholder={eventId ? 'Select Ticket' : 'Select an event first'} />\n </SelectTrigger>\n <SelectContent>\n {tickets.map((ticket) => (\n <SelectItem key={ticket.id} value={ticket.id}>\n {ticket.name} — {ticket.price} {ticket.currency}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Attendee</span>\n <Select value={attendeeId} onValueChange={setAttendeeId}>\n <SelectTrigger aria-label=\"Attendee\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NEW_ATTENDEE}>+ New attendee</SelectItem>\n {attendees.map((attendee) => (\n <SelectItem key={attendee.id} value={attendee.id}>\n {attendee.fullName} · {attendee.email}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n {attendeeId === NEW_ATTENDEE ? (\n <div className=\"grid grid-cols-1 gap-4 rounded-input border border-border-seam bg-bg-surface p-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Full Name</span>\n <Input value={fullName} onChange={(e) => setFullName(e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Email</span>\n <Input type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Company</span>\n <Input value={company} onChange={(e) => setCompany(e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Phone</span>\n <Input value={phone} onChange={(e) => setPhone(e.target.value)} />\n </label>\n </div>\n ) : null}\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Quantity</span>\n <Input type=\"number\" min=\"1\" value={quantity} onChange={(e) => setQuantity(e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Promo Code (optional)</span>\n <Select value={promoCode} onValueChange={setPromoCode} disabled={promoCodes.length === 0}>\n <SelectTrigger aria-label=\"Promo Code\">\n <SelectValue placeholder={promoCodes.length === 0 ? 'No active codes' : 'No promo code'} />\n </SelectTrigger>\n <SelectContent>\n {promoCodes.map((promo) => (\n <SelectItem key={promo.id} value={promo.code}>\n {promo.code} —{' '}\n {promo.discountType === 'PERCENT' ? `${promo.discountValue}%` : promo.discountValue}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {hasPositiveAmount ? (\n <div className=\"space-y-3 rounded-input border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Ticket className=\"h-4 w-4 text-text-muted\" aria-hidden=\"true\" />\n <span>\n Estimated total{' '}\n <span className=\"font-semibold tabular-nums text-text-primary\">\n {grossAmount.toLocaleString()} {currency}\n </span>{' '}\n — final pricing and payment are handled by the billing service.\n </span>\n </div>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Billing Account ID (optional)</span>\n <Input\n value={billingAccountId}\n onChange={(e) => setBillingAccountId(e.target.value)}\n placeholder=\"Attach an existing billing account\"\n />\n <span className=\"text-xs text-text-secondary\">\n When provided, the charge is attached to this billing account.\n </span>\n </label>\n </div>\n ) : null}\n\n <div className=\"flex justify-end gap-3\">\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('/registration')} disabled={saving}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={saving}>\n <Ticket className=\"h-4 w-4\" />\n {saving ? 'Registering…' : 'Register Attendee'}\n </Button>\n </div>\n </form>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
|