@burdenoff/microfe-eventfullymanaged 2026.825.1 → 2026.828.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/hooks/index.d.ts +1 -0
- package/dist/eventfullymanaged/hooks/index.d.ts.map +1 -1
- package/dist/eventfullymanaged/hooks/index.js +3 -0
- package/dist/eventfullymanaged/hooks/useEventDelete.d.ts +19 -0
- package/dist/eventfullymanaged/hooks/useEventDelete.d.ts.map +1 -0
- package/dist/eventfullymanaged/hooks/useEventDelete.js +16 -0
- package/dist/eventfullymanaged/hooks/useEventDelete.js.map +1 -0
- package/dist/eventfullymanaged/lib/format.d.ts +9 -0
- package/dist/eventfullymanaged/lib/format.d.ts.map +1 -1
- package/dist/eventfullymanaged/lib/format.js +11 -3
- package/dist/eventfullymanaged/lib/format.js.map +1 -1
- package/dist/eventfullymanaged/pages/events/EventDetailPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js +315 -277
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js +91 -81
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +231 -229
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +120 -102
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +128 -120
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +68 -75
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +41 -41
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
- package/dist/eventfullymanaged/store/eventfullyManagedStore.js +15 -0
- package/dist/eventfullymanaged/store/eventfullyManagedStore.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,15 +2,15 @@ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContex
|
|
|
2
2
|
import { gql as t } from "../../../node_modules/graphql-tag/lib/index.js";
|
|
3
3
|
import { useQuery as n } from "../../../node_modules/@apollo/client/react/hooks/useQuery.js";
|
|
4
4
|
import { notify as r } from "../../lib/toast.js";
|
|
5
|
-
import { useCreateEventSessionMutation as i, useEventQuery as a, useSessionConflictsQuery as o, useSpeakersQuery as s, useUpdateEventSessionMutation as c, useVenuesQuery as
|
|
6
|
-
import { SESSION_STATUS_OPTIONS as
|
|
7
|
-
import { EntityFormShell as
|
|
8
|
-
import { describeError as
|
|
9
|
-
import { EntityTagsField as
|
|
10
|
-
import { useEffect as
|
|
11
|
-
import { useParams as
|
|
12
|
-
import { jsx as
|
|
13
|
-
import { Input as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k, Textarea as A } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { useCreateEventSessionMutation as i, useEventQuery as a, useSessionConflictsQuery as o, useSpeakersQuery as s, useUpdateEventSessionMutation as c, useVenuesQuery as ee } from "../../api/eventApi.js";
|
|
6
|
+
import { SESSION_STATUS_OPTIONS as l, SESSION_TYPE_OPTIONS as u, inputValueToIso as d, isoToInputValue as f } from "./eventFormUtils.js";
|
|
7
|
+
import { EntityFormShell as p } from "../../components/EntityFormShell.js";
|
|
8
|
+
import { describeError as m, mutationSucceeded as h } from "../../lib/mutationResult.js";
|
|
9
|
+
import { EntityTagsField as g } from "../../components/EntityTagsField.js";
|
|
10
|
+
import { useEffect as _, useMemo as v, useState as y } from "react";
|
|
11
|
+
import { useParams as b } from "react-router";
|
|
12
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
13
|
+
import { Badge as C, Input as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k, Textarea as A } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
//#region src/eventfullymanaged/pages/events/SessionFormPage.tsx
|
|
15
15
|
var j = "speakerId", M = t`
|
|
16
16
|
query EventfullymanagedSessionFormSessions($eventId: ID, $limit: Int, $offset: Int) {
|
|
@@ -41,36 +41,36 @@ function N() {
|
|
|
41
41
|
track: "",
|
|
42
42
|
venueId: "",
|
|
43
43
|
speakerId: "",
|
|
44
|
-
startsAt:
|
|
45
|
-
endsAt:
|
|
44
|
+
startsAt: f(e.toISOString()),
|
|
45
|
+
endsAt: f(t.toISOString()),
|
|
46
46
|
capacity: "",
|
|
47
47
|
status: "SCHEDULED",
|
|
48
48
|
description: ""
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
function P() {
|
|
52
|
-
let { id: t = "", sid: P = "" } =
|
|
52
|
+
let { id: t = "", sid: P = "" } = b(), F = v(() => !!P, [P]), { navigate: I } = e(), { data: L } = a(t), { data: R } = n(M, {
|
|
53
53
|
variables: {
|
|
54
54
|
eventId: t,
|
|
55
55
|
limit: 100,
|
|
56
56
|
offset: 0
|
|
57
57
|
},
|
|
58
58
|
skip: !P
|
|
59
|
-
}), { data: z } =
|
|
59
|
+
}), { data: z } = ee({
|
|
60
60
|
limit: 100,
|
|
61
61
|
offset: 0
|
|
62
62
|
}), { data: B } = s({
|
|
63
63
|
limit: 100,
|
|
64
64
|
offset: 0
|
|
65
|
-
}), { data: V } = o({ eventId: t }), H =
|
|
65
|
+
}), { data: V } = o({ eventId: t }), H = v(() => {
|
|
66
66
|
let e = V?.sessionConflicts ?? [];
|
|
67
67
|
return F ? e.filter((e) => e.sessionAId === P || e.sessionBId === P) : e;
|
|
68
68
|
}, [
|
|
69
69
|
V,
|
|
70
70
|
F,
|
|
71
71
|
P
|
|
72
|
-
]), [U, { loading: W }] = i(), [G, { loading: K }] = c(), [q, J] =
|
|
73
|
-
|
|
72
|
+
]), [U, { loading: W }] = i(), [G, { loading: K }] = c(), [q, J] = y(N), Y = v(() => (R?.eventSessions?.items ?? []).find((e) => e.id === P), [R, P]);
|
|
73
|
+
_(() => {
|
|
74
74
|
if (!F || !Y) return;
|
|
75
75
|
let e = Y.metadata ?? {};
|
|
76
76
|
J({
|
|
@@ -79,8 +79,8 @@ function P() {
|
|
|
79
79
|
track: Y.track ?? "",
|
|
80
80
|
venueId: Y.venueId ?? "",
|
|
81
81
|
speakerId: typeof e[j] == "string" ? e[j] : "",
|
|
82
|
-
startsAt:
|
|
83
|
-
endsAt:
|
|
82
|
+
startsAt: f(Y.startsAt),
|
|
83
|
+
endsAt: f(Y.endsAt),
|
|
84
84
|
capacity: Y.capacity == null ? "" : String(Y.capacity),
|
|
85
85
|
status: Y.status ?? "SCHEDULED",
|
|
86
86
|
description: Y.description ?? ""
|
|
@@ -91,12 +91,12 @@ function P() {
|
|
|
91
91
|
...n,
|
|
92
92
|
[e]: t
|
|
93
93
|
}));
|
|
94
|
-
},
|
|
94
|
+
}, te = async (e) => {
|
|
95
95
|
if (e.preventDefault(), !q.title.trim()) {
|
|
96
96
|
r.error("Title required", "Give the session a title before saving.");
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
99
|
-
let n =
|
|
99
|
+
let n = d(q.startsAt), i = d(q.endsAt);
|
|
100
100
|
if (!n || !i) {
|
|
101
101
|
r.error("Times required", "Set both a start and an end time.");
|
|
102
102
|
return;
|
|
@@ -127,110 +127,120 @@ function P() {
|
|
|
127
127
|
id: P,
|
|
128
128
|
input: o
|
|
129
129
|
} });
|
|
130
|
-
if (!
|
|
130
|
+
if (!h(e, e.data?.updateEventSession?.id, "Could not update session")) return;
|
|
131
131
|
r.success("Session updated"), I(`/events/${t}`);
|
|
132
132
|
return;
|
|
133
133
|
}
|
|
134
134
|
let e = await U({ variables: { input: o } });
|
|
135
|
-
if (!
|
|
135
|
+
if (!h(e, e.data?.createEventSession?.id, "Could not create session")) return;
|
|
136
136
|
r.success("Session created"), I(`/events/${t}`);
|
|
137
137
|
} catch (e) {
|
|
138
|
-
r.error("Could not save session",
|
|
138
|
+
r.error("Could not save session", m(e));
|
|
139
139
|
}
|
|
140
|
-
},
|
|
141
|
-
return /* @__PURE__ */
|
|
140
|
+
}, ne = W || K;
|
|
141
|
+
return /* @__PURE__ */ S(p, {
|
|
142
142
|
title: F ? "Edit Session" : "Add Session",
|
|
143
143
|
description: `Agenda item for ${Q}.`,
|
|
144
144
|
purpose: "Sessions make up the agenda attendees follow on the day — a talk, workshop or panel with a time, a room and a speaker. Set the slot and assign a room so two sessions never clash, and pick the speaker who will present it.",
|
|
145
145
|
backLabel: "Back to Event",
|
|
146
146
|
onBack: () => I(`/events/${t}`),
|
|
147
|
-
onSubmit:
|
|
147
|
+
onSubmit: te,
|
|
148
148
|
submitLabel: "Save Session",
|
|
149
|
-
saving:
|
|
149
|
+
saving: ne,
|
|
150
150
|
children: [
|
|
151
|
-
H.length > 0 ? /* @__PURE__ */
|
|
151
|
+
H.length > 0 ? /* @__PURE__ */ S("div", {
|
|
152
152
|
className: "rounded-card border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text",
|
|
153
|
-
children: [/* @__PURE__ */
|
|
153
|
+
children: [/* @__PURE__ */ x("p", {
|
|
154
154
|
className: "font-medium",
|
|
155
155
|
children: H.length === 1 ? "1 agenda conflict detected" : `${H.length} agenda conflicts detected`
|
|
156
|
-
}), /* @__PURE__ */
|
|
157
|
-
className: "mt-
|
|
158
|
-
children: H.map((e, t) => /* @__PURE__ */ S("li", {
|
|
156
|
+
}), /* @__PURE__ */ x("ul", {
|
|
157
|
+
className: "mt-2 space-y-1.5",
|
|
158
|
+
children: H.map((e, t) => /* @__PURE__ */ S("li", {
|
|
159
|
+
className: "flex items-start gap-2",
|
|
160
|
+
children: [/* @__PURE__ */ x(C, {
|
|
161
|
+
variant: e.type.toLowerCase() === "venue" ? "warning" : "info",
|
|
162
|
+
className: "mt-0.5 shrink-0 uppercase",
|
|
163
|
+
children: e.type
|
|
164
|
+
}), /* @__PURE__ */ x("span", {
|
|
165
|
+
className: "min-w-0",
|
|
166
|
+
children: e.message
|
|
167
|
+
})]
|
|
168
|
+
}, `${e.type}-${e.sessionAId}-${e.sessionBId}-${t}`))
|
|
159
169
|
})]
|
|
160
170
|
}) : null,
|
|
161
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ S("div", {
|
|
162
172
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
163
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ S("label", {
|
|
164
174
|
className: "space-y-1 text-sm",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ x("span", {
|
|
166
176
|
className: "font-medium text-text-primary",
|
|
167
177
|
children: "Title"
|
|
168
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), /* @__PURE__ */ x(w, {
|
|
169
179
|
value: q.title,
|
|
170
180
|
onChange: (e) => $("title", e.target.value),
|
|
171
181
|
required: !0
|
|
172
182
|
})]
|
|
173
|
-
}), /* @__PURE__ */
|
|
183
|
+
}), /* @__PURE__ */ S("label", {
|
|
174
184
|
className: "space-y-1 text-sm",
|
|
175
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ x("span", {
|
|
176
186
|
className: "font-medium text-text-primary",
|
|
177
187
|
children: "Track"
|
|
178
|
-
}), /* @__PURE__ */
|
|
188
|
+
}), /* @__PURE__ */ x(w, {
|
|
179
189
|
value: q.track,
|
|
180
190
|
onChange: (e) => $("track", e.target.value),
|
|
181
191
|
placeholder: "Main stage, Product, Engineering…"
|
|
182
192
|
})]
|
|
183
193
|
})]
|
|
184
194
|
}),
|
|
185
|
-
/* @__PURE__ */
|
|
195
|
+
/* @__PURE__ */ S("div", {
|
|
186
196
|
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
187
197
|
children: [
|
|
188
|
-
/* @__PURE__ */
|
|
198
|
+
/* @__PURE__ */ S("label", {
|
|
189
199
|
className: "space-y-1 text-sm",
|
|
190
|
-
children: [/* @__PURE__ */
|
|
200
|
+
children: [/* @__PURE__ */ x("span", {
|
|
191
201
|
className: "font-medium text-text-primary",
|
|
192
202
|
children: "Room / Venue"
|
|
193
|
-
}), /* @__PURE__ */
|
|
203
|
+
}), /* @__PURE__ */ S(T, {
|
|
194
204
|
value: q.venueId || "none",
|
|
195
205
|
onValueChange: (e) => $("venueId", e === "none" ? "" : e),
|
|
196
|
-
children: [/* @__PURE__ */
|
|
206
|
+
children: [/* @__PURE__ */ x(O, {
|
|
197
207
|
"aria-label": "Room or venue",
|
|
198
|
-
children: /* @__PURE__ */
|
|
199
|
-
}), /* @__PURE__ */
|
|
208
|
+
children: /* @__PURE__ */ x(k, { placeholder: "Select a room" })
|
|
209
|
+
}), /* @__PURE__ */ S(E, { children: [/* @__PURE__ */ x(D, {
|
|
200
210
|
value: "none",
|
|
201
211
|
children: "No room"
|
|
202
|
-
}), X.map((e) => /* @__PURE__ */
|
|
212
|
+
}), X.map((e) => /* @__PURE__ */ x(D, {
|
|
203
213
|
value: e.id,
|
|
204
214
|
children: e.name
|
|
205
215
|
}, e.id))] })]
|
|
206
216
|
})]
|
|
207
217
|
}),
|
|
208
|
-
/* @__PURE__ */
|
|
218
|
+
/* @__PURE__ */ S("label", {
|
|
209
219
|
className: "space-y-1 text-sm",
|
|
210
|
-
children: [/* @__PURE__ */
|
|
220
|
+
children: [/* @__PURE__ */ x("span", {
|
|
211
221
|
className: "font-medium text-text-primary",
|
|
212
222
|
children: "Speaker"
|
|
213
|
-
}), /* @__PURE__ */
|
|
223
|
+
}), /* @__PURE__ */ S(T, {
|
|
214
224
|
value: q.speakerId || "none",
|
|
215
225
|
onValueChange: (e) => $("speakerId", e === "none" ? "" : e),
|
|
216
|
-
children: [/* @__PURE__ */
|
|
226
|
+
children: [/* @__PURE__ */ x(O, {
|
|
217
227
|
"aria-label": "Speaker",
|
|
218
|
-
children: /* @__PURE__ */
|
|
219
|
-
}), /* @__PURE__ */
|
|
228
|
+
children: /* @__PURE__ */ x(k, { placeholder: "Select a speaker" })
|
|
229
|
+
}), /* @__PURE__ */ S(E, { children: [/* @__PURE__ */ x(D, {
|
|
220
230
|
value: "none",
|
|
221
231
|
children: "No speaker"
|
|
222
|
-
}), Z.map((e) => /* @__PURE__ */
|
|
232
|
+
}), Z.map((e) => /* @__PURE__ */ x(D, {
|
|
223
233
|
value: e.id,
|
|
224
234
|
children: e.fullName
|
|
225
235
|
}, e.id))] })]
|
|
226
236
|
})]
|
|
227
237
|
}),
|
|
228
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ S("label", {
|
|
229
239
|
className: "space-y-1 text-sm",
|
|
230
|
-
children: [/* @__PURE__ */
|
|
240
|
+
children: [/* @__PURE__ */ x("span", {
|
|
231
241
|
className: "font-medium text-text-primary",
|
|
232
242
|
children: "Capacity"
|
|
233
|
-
}), /* @__PURE__ */
|
|
243
|
+
}), /* @__PURE__ */ x(w, {
|
|
234
244
|
type: "number",
|
|
235
245
|
min: "0",
|
|
236
246
|
value: q.capacity,
|
|
@@ -239,25 +249,25 @@ function P() {
|
|
|
239
249
|
})
|
|
240
250
|
]
|
|
241
251
|
}),
|
|
242
|
-
/* @__PURE__ */
|
|
252
|
+
/* @__PURE__ */ S("div", {
|
|
243
253
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
244
|
-
children: [/* @__PURE__ */
|
|
254
|
+
children: [/* @__PURE__ */ S("label", {
|
|
245
255
|
className: "space-y-1 text-sm",
|
|
246
|
-
children: [/* @__PURE__ */
|
|
256
|
+
children: [/* @__PURE__ */ x("span", {
|
|
247
257
|
className: "font-medium text-text-primary",
|
|
248
258
|
children: "Start"
|
|
249
|
-
}), /* @__PURE__ */
|
|
259
|
+
}), /* @__PURE__ */ x(w, {
|
|
250
260
|
type: "datetime-local",
|
|
251
261
|
value: q.startsAt,
|
|
252
262
|
onChange: (e) => $("startsAt", e.target.value),
|
|
253
263
|
required: !0
|
|
254
264
|
})]
|
|
255
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ S("label", {
|
|
256
266
|
className: "space-y-1 text-sm",
|
|
257
|
-
children: [/* @__PURE__ */
|
|
267
|
+
children: [/* @__PURE__ */ x("span", {
|
|
258
268
|
className: "font-medium text-text-primary",
|
|
259
269
|
children: "End"
|
|
260
|
-
}), /* @__PURE__ */
|
|
270
|
+
}), /* @__PURE__ */ x(w, {
|
|
261
271
|
type: "datetime-local",
|
|
262
272
|
value: q.endsAt,
|
|
263
273
|
onChange: (e) => $("endsAt", e.target.value),
|
|
@@ -265,54 +275,54 @@ function P() {
|
|
|
265
275
|
})]
|
|
266
276
|
})]
|
|
267
277
|
}),
|
|
268
|
-
/* @__PURE__ */
|
|
278
|
+
/* @__PURE__ */ S("div", {
|
|
269
279
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
270
|
-
children: [/* @__PURE__ */
|
|
280
|
+
children: [/* @__PURE__ */ S("label", {
|
|
271
281
|
className: "space-y-1 text-sm",
|
|
272
|
-
children: [/* @__PURE__ */
|
|
282
|
+
children: [/* @__PURE__ */ x("span", {
|
|
273
283
|
className: "font-medium text-text-primary",
|
|
274
284
|
children: "Type"
|
|
275
|
-
}), /* @__PURE__ */
|
|
285
|
+
}), /* @__PURE__ */ S(T, {
|
|
276
286
|
value: q.sessionType,
|
|
277
287
|
onValueChange: (e) => $("sessionType", e),
|
|
278
|
-
children: [/* @__PURE__ */
|
|
288
|
+
children: [/* @__PURE__ */ x(O, {
|
|
279
289
|
"aria-label": "Session type",
|
|
280
|
-
children: /* @__PURE__ */
|
|
281
|
-
}), /* @__PURE__ */
|
|
290
|
+
children: /* @__PURE__ */ x(k, {})
|
|
291
|
+
}), /* @__PURE__ */ x(E, { children: u.map((e) => /* @__PURE__ */ x(D, {
|
|
282
292
|
value: e.value,
|
|
283
293
|
children: e.label
|
|
284
294
|
}, e.value)) })]
|
|
285
295
|
})]
|
|
286
|
-
}), /* @__PURE__ */
|
|
296
|
+
}), /* @__PURE__ */ S("label", {
|
|
287
297
|
className: "space-y-1 text-sm",
|
|
288
|
-
children: [/* @__PURE__ */
|
|
298
|
+
children: [/* @__PURE__ */ x("span", {
|
|
289
299
|
className: "font-medium text-text-primary",
|
|
290
300
|
children: "Status"
|
|
291
|
-
}), /* @__PURE__ */
|
|
301
|
+
}), /* @__PURE__ */ S(T, {
|
|
292
302
|
value: q.status,
|
|
293
303
|
onValueChange: (e) => $("status", e),
|
|
294
|
-
children: [/* @__PURE__ */
|
|
304
|
+
children: [/* @__PURE__ */ x(O, {
|
|
295
305
|
"aria-label": "Status",
|
|
296
|
-
children: /* @__PURE__ */
|
|
297
|
-
}), /* @__PURE__ */
|
|
306
|
+
children: /* @__PURE__ */ x(k, {})
|
|
307
|
+
}), /* @__PURE__ */ x(E, { children: l.map((e) => /* @__PURE__ */ x(D, {
|
|
298
308
|
value: e.value,
|
|
299
309
|
children: e.label
|
|
300
310
|
}, e.value)) })]
|
|
301
311
|
})]
|
|
302
312
|
})]
|
|
303
313
|
}),
|
|
304
|
-
/* @__PURE__ */
|
|
314
|
+
/* @__PURE__ */ S("label", {
|
|
305
315
|
className: "block space-y-1 text-sm",
|
|
306
|
-
children: [/* @__PURE__ */
|
|
316
|
+
children: [/* @__PURE__ */ x("span", {
|
|
307
317
|
className: "font-medium text-text-primary",
|
|
308
318
|
children: "Description"
|
|
309
|
-
}), /* @__PURE__ */
|
|
319
|
+
}), /* @__PURE__ */ x(A, {
|
|
310
320
|
value: q.description,
|
|
311
321
|
onChange: (e) => $("description", e.target.value),
|
|
312
322
|
rows: 3
|
|
313
323
|
})]
|
|
314
324
|
}),
|
|
315
|
-
F ? /* @__PURE__ */
|
|
325
|
+
F ? /* @__PURE__ */ x(g, {
|
|
316
326
|
entityType: "EVENTFULLYMANAGED_SESSION",
|
|
317
327
|
entityId: P
|
|
318
328
|
}) : null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/SessionFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea } from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\n\nimport {\n useCreateEventSessionMutation,\n useEventQuery,\n useSessionConflictsQuery,\n useSpeakersQuery,\n useUpdateEventSessionMutation,\n useVenuesQuery,\n} from '../../api/eventApi';\nimport { EntityFormShell } from '../../components/EntityFormShell';\nimport { EntityTagsField } from '../../components/EntityTagsField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport { inputValueToIso, isoToInputValue, SESSION_STATUS_OPTIONS, SESSION_TYPE_OPTIONS } from './eventFormUtils';\n\nconst SPEAKER_METADATA_KEY = 'speakerId';\n\n// The foundation EVENT_SESSIONS_QUERY omits description/capacity/metadata, but the\n// backend `updateEventSession` resolver is a FULL replace — editing with a partial\n// initial state would blank those columns. There is no by-id session resolver, so\n// this fuller list query is the edit-hydration source: it selects every editable\n// field and the form finds its row by id client-side.\nconst FULL_EVENT_SESSIONS_QUERY = gql`\n query EventfullymanagedSessionFormSessions($eventId: ID, $limit: Int, $offset: Int) {\n eventSessions: eventfullyManagedEventSessions(eventId: $eventId, limit: $limit, offset: $offset) {\n total\n items {\n id\n eventId\n venueId\n title\n description\n sessionType\n track\n startsAt\n endsAt\n capacity\n status\n metadata\n }\n }\n }\n`;\n\ntype FullSessionsResponse = {\n eventSessions: { total: number; items: SessionListItem[] };\n};\n\ntype SessionListItem = {\n id: string;\n eventId: string;\n venueId?: string | null;\n title: string;\n sessionType: string;\n track?: string | null;\n startsAt: string;\n endsAt: string;\n status: string;\n capacity?: number | null;\n description?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype SessionFormState = {\n title: string;\n sessionType: string;\n track: string;\n venueId: string;\n speakerId: string;\n startsAt: string;\n endsAt: string;\n capacity: string;\n status: string;\n description: string;\n};\n\nfunction defaultState(): SessionFormState {\n const now = new Date();\n const later = new Date(now.getTime() + 60 * 60 * 1000);\n return {\n title: '',\n sessionType: 'TALK',\n track: '',\n venueId: '',\n speakerId: '',\n startsAt: isoToInputValue(now.toISOString()),\n endsAt: isoToInputValue(later.toISOString()),\n capacity: '',\n status: 'SCHEDULED',\n description: '',\n };\n}\n\nexport default function SessionFormPage() {\n const { id = '', sid = '' } = useParams<{ id: string; sid: string }>();\n const isEdit = useMemo(() => Boolean(sid), [sid]);\n const { navigate } = useEventfullyManaged();\n\n const { data: eventData } = useEventQuery(id);\n // No by-id session resolver — derive the edit initial state from the (fuller) list query.\n const { data: sessionsData } = useQuery<FullSessionsResponse, { eventId?: string; limit?: number; offset?: number }>(\n FULL_EVENT_SESSIONS_QUERY,\n { variables: { eventId: id, limit: 100, offset: 0 }, skip: !sid }\n );\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: speakersData } = useSpeakersQuery({ limit: 100, offset: 0 });\n // BOFF-4331 — surface venue/speaker double-bookings for this event's agenda\n // right where an organizer is scheduling a session.\n const { data: conflictsData } = useSessionConflictsQuery({ eventId: id });\n const relevantConflicts = useMemo(() => {\n const conflicts = conflictsData?.sessionConflicts ?? [];\n return isEdit ? conflicts.filter((c) => c.sessionAId === sid || c.sessionBId === sid) : conflicts;\n }, [conflictsData, isEdit, sid]);\n const [createSession, { loading: creating }] = useCreateEventSessionMutation();\n const [updateSession, { loading: updating }] = useUpdateEventSessionMutation();\n const [form, setForm] = useState<SessionFormState>(defaultState);\n\n const existingSession = useMemo(\n () => (sessionsData?.eventSessions?.items ?? []).find((item) => item.id === sid),\n [sessionsData, sid]\n );\n\n useEffect(() => {\n if (!isEdit || !existingSession) {\n return;\n }\n const metadata = (existingSession.metadata ?? {}) as Record<string, unknown>;\n setForm({\n title: existingSession.title ?? '',\n sessionType: existingSession.sessionType ?? 'TALK',\n track: existingSession.track ?? '',\n venueId: existingSession.venueId ?? '',\n speakerId: typeof metadata[SPEAKER_METADATA_KEY] === 'string' ? (metadata[SPEAKER_METADATA_KEY] as string) : '',\n startsAt: isoToInputValue(existingSession.startsAt),\n endsAt: isoToInputValue(existingSession.endsAt),\n capacity: existingSession.capacity != null ? String(existingSession.capacity) : '',\n status: existingSession.status ?? 'SCHEDULED',\n description: existingSession.description ?? '',\n });\n }, [existingSession, isEdit]);\n\n const venues = venuesData?.venues?.items ?? [];\n const speakers = (speakersData?.speakers?.items ?? []) as Array<{ id: string; fullName: string }>;\n const eventName = eventData?.event?.name ?? 'Event';\n\n const onChange = (field: keyof SessionFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.title.trim()) {\n notify.error('Title required', 'Give the session a title before saving.');\n return;\n }\n const startIso = inputValueToIso(form.startsAt);\n const endIso = inputValueToIso(form.endsAt);\n if (!startIso || !endIso) {\n notify.error('Times required', 'Set both a start and an end time.');\n return;\n }\n if (new Date(endIso).getTime() < new Date(startIso).getTime()) {\n notify.error('Invalid times', 'The end time cannot be before the start time.');\n return;\n }\n\n const existingMetadata = (existingSession?.metadata ?? {}) as Record<string, unknown>;\n const input = {\n eventId: id,\n title: form.title.trim(),\n sessionType: form.sessionType,\n track: form.track || null,\n venueId: form.venueId || null,\n startsAt: startIso,\n endsAt: endIso,\n capacity: form.capacity ? Number(form.capacity) : null,\n status: form.status,\n description: form.description || null,\n metadata: { ...existingMetadata, [SPEAKER_METADATA_KEY]: form.speakerId || null },\n };\n\n try {\n if (isEdit) {\n const response = await updateSession({ variables: { id: sid, input } });\n if (!mutationSucceeded(response, response.data?.updateEventSession?.id, 'Could not update session')) {\n return;\n }\n notify.success('Session updated');\n navigate(`/events/${id}`);\n return;\n }\n const response = await createSession({ variables: { input } });\n if (!mutationSucceeded(response, response.data?.createEventSession?.id, 'Could not create session')) {\n return;\n }\n notify.success('Session created');\n navigate(`/events/${id}`);\n } catch (error) {\n notify.error('Could not save session', describeError(error));\n }\n };\n\n const saving = creating || updating;\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit Session' : 'Add Session'}\n description={`Agenda item for ${eventName}.`}\n purpose=\"Sessions make up the agenda attendees follow on the day — a talk, workshop or panel with a time, a room and a speaker. Set the slot and assign a room so two sessions never clash, and pick the speaker who will present it.\"\n backLabel=\"Back to Event\"\n onBack={() => navigate(`/events/${id}`)}\n onSubmit={onSubmit}\n submitLabel=\"Save Session\"\n saving={saving}\n >\n {relevantConflicts.length > 0 ? (\n <div className=\"rounded-card border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n <p className=\"font-medium\">\n {relevantConflicts.length === 1\n ? '1 agenda conflict detected'\n : `${relevantConflicts.length} agenda conflicts detected`}\n </p>\n <ul className=\"mt-1 list-inside list-disc space-y-0.5\">\n {relevantConflicts.map((conflict, index) => (\n <li key={`${conflict.type}-${conflict.sessionAId}-${conflict.sessionBId}-${index}`}>\n {conflict.message}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\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\">Title</span>\n <Input value={form.title} onChange={(e) => onChange('title', e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Track</span>\n <Input\n value={form.track}\n onChange={(e) => onChange('track', e.target.value)}\n placeholder=\"Main stage, Product, Engineering…\"\n />\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Room / Venue</span>\n <Select\n value={form.venueId || 'none'}\n onValueChange={(value) => onChange('venueId', value === 'none' ? '' : value)}\n >\n <SelectTrigger aria-label=\"Room or venue\">\n <SelectValue placeholder=\"Select a room\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">No room</SelectItem>\n {venues.map((venue: { id: string; name: string }) => (\n <SelectItem key={venue.id} value={venue.id}>\n {venue.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\">Speaker</span>\n <Select\n value={form.speakerId || 'none'}\n onValueChange={(value) => onChange('speakerId', value === 'none' ? '' : value)}\n >\n <SelectTrigger aria-label=\"Speaker\">\n <SelectValue placeholder=\"Select a speaker\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">No speaker</SelectItem>\n {speakers.map((speaker) => (\n <SelectItem key={speaker.id} value={speaker.id}>\n {speaker.fullName}\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\">Capacity</span>\n <Input type=\"number\" min=\"0\" value={form.capacity} onChange={(e) => onChange('capacity', e.target.value)} />\n </label>\n </div>\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\">Start</span>\n <Input\n type=\"datetime-local\"\n value={form.startsAt}\n onChange={(e) => onChange('startsAt', e.target.value)}\n required\n />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">End</span>\n <Input\n type=\"datetime-local\"\n value={form.endsAt}\n onChange={(e) => onChange('endsAt', e.target.value)}\n required\n />\n </label>\n </div>\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\">Type</span>\n <Select value={form.sessionType} onValueChange={(value) => onChange('sessionType', value)}>\n <SelectTrigger aria-label=\"Session type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SESSION_TYPE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\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\">Status</span>\n <Select value={form.status} onValueChange={(value) => onChange('status', value)}>\n <SelectTrigger aria-label=\"Status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SESSION_STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Description</span>\n <Textarea value={form.description} onChange={(e) => onChange('description', e.target.value)} rows={3} />\n </label>\n\n {isEdit ? <EntityTagsField entityType=\"EVENTFULLYMANAGED_SESSION\" entityId={sid} /> : null}\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/SessionFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Badge,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\n\nimport {\n useCreateEventSessionMutation,\n useEventQuery,\n useSessionConflictsQuery,\n useSpeakersQuery,\n useUpdateEventSessionMutation,\n useVenuesQuery,\n} from '../../api/eventApi';\nimport { EntityFormShell } from '../../components/EntityFormShell';\nimport { EntityTagsField } from '../../components/EntityTagsField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport { inputValueToIso, isoToInputValue, SESSION_STATUS_OPTIONS, SESSION_TYPE_OPTIONS } from './eventFormUtils';\n\nconst SPEAKER_METADATA_KEY = 'speakerId';\n\n// The foundation EVENT_SESSIONS_QUERY omits description/capacity/metadata, but the\n// backend `updateEventSession` resolver is a FULL replace — editing with a partial\n// initial state would blank those columns. There is no by-id session resolver, so\n// this fuller list query is the edit-hydration source: it selects every editable\n// field and the form finds its row by id client-side.\nconst FULL_EVENT_SESSIONS_QUERY = gql`\n query EventfullymanagedSessionFormSessions($eventId: ID, $limit: Int, $offset: Int) {\n eventSessions: eventfullyManagedEventSessions(eventId: $eventId, limit: $limit, offset: $offset) {\n total\n items {\n id\n eventId\n venueId\n title\n description\n sessionType\n track\n startsAt\n endsAt\n capacity\n status\n metadata\n }\n }\n }\n`;\n\ntype FullSessionsResponse = {\n eventSessions: { total: number; items: SessionListItem[] };\n};\n\ntype SessionListItem = {\n id: string;\n eventId: string;\n venueId?: string | null;\n title: string;\n sessionType: string;\n track?: string | null;\n startsAt: string;\n endsAt: string;\n status: string;\n capacity?: number | null;\n description?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype SessionFormState = {\n title: string;\n sessionType: string;\n track: string;\n venueId: string;\n speakerId: string;\n startsAt: string;\n endsAt: string;\n capacity: string;\n status: string;\n description: string;\n};\n\nfunction defaultState(): SessionFormState {\n const now = new Date();\n const later = new Date(now.getTime() + 60 * 60 * 1000);\n return {\n title: '',\n sessionType: 'TALK',\n track: '',\n venueId: '',\n speakerId: '',\n startsAt: isoToInputValue(now.toISOString()),\n endsAt: isoToInputValue(later.toISOString()),\n capacity: '',\n status: 'SCHEDULED',\n description: '',\n };\n}\n\nexport default function SessionFormPage() {\n const { id = '', sid = '' } = useParams<{ id: string; sid: string }>();\n const isEdit = useMemo(() => Boolean(sid), [sid]);\n const { navigate } = useEventfullyManaged();\n\n const { data: eventData } = useEventQuery(id);\n // No by-id session resolver — derive the edit initial state from the (fuller) list query.\n const { data: sessionsData } = useQuery<FullSessionsResponse, { eventId?: string; limit?: number; offset?: number }>(\n FULL_EVENT_SESSIONS_QUERY,\n { variables: { eventId: id, limit: 100, offset: 0 }, skip: !sid }\n );\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: speakersData } = useSpeakersQuery({ limit: 100, offset: 0 });\n // BOFF-4331 — surface venue/speaker double-bookings for this event's agenda\n // right where an organizer is scheduling a session.\n const { data: conflictsData } = useSessionConflictsQuery({ eventId: id });\n const relevantConflicts = useMemo(() => {\n const conflicts = conflictsData?.sessionConflicts ?? [];\n return isEdit ? conflicts.filter((c) => c.sessionAId === sid || c.sessionBId === sid) : conflicts;\n }, [conflictsData, isEdit, sid]);\n const [createSession, { loading: creating }] = useCreateEventSessionMutation();\n const [updateSession, { loading: updating }] = useUpdateEventSessionMutation();\n const [form, setForm] = useState<SessionFormState>(defaultState);\n\n const existingSession = useMemo(\n () => (sessionsData?.eventSessions?.items ?? []).find((item) => item.id === sid),\n [sessionsData, sid]\n );\n\n useEffect(() => {\n if (!isEdit || !existingSession) {\n return;\n }\n const metadata = (existingSession.metadata ?? {}) as Record<string, unknown>;\n setForm({\n title: existingSession.title ?? '',\n sessionType: existingSession.sessionType ?? 'TALK',\n track: existingSession.track ?? '',\n venueId: existingSession.venueId ?? '',\n speakerId: typeof metadata[SPEAKER_METADATA_KEY] === 'string' ? (metadata[SPEAKER_METADATA_KEY] as string) : '',\n startsAt: isoToInputValue(existingSession.startsAt),\n endsAt: isoToInputValue(existingSession.endsAt),\n capacity: existingSession.capacity != null ? String(existingSession.capacity) : '',\n status: existingSession.status ?? 'SCHEDULED',\n description: existingSession.description ?? '',\n });\n }, [existingSession, isEdit]);\n\n const venues = venuesData?.venues?.items ?? [];\n const speakers = (speakersData?.speakers?.items ?? []) as Array<{ id: string; fullName: string }>;\n const eventName = eventData?.event?.name ?? 'Event';\n\n const onChange = (field: keyof SessionFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.title.trim()) {\n notify.error('Title required', 'Give the session a title before saving.');\n return;\n }\n const startIso = inputValueToIso(form.startsAt);\n const endIso = inputValueToIso(form.endsAt);\n if (!startIso || !endIso) {\n notify.error('Times required', 'Set both a start and an end time.');\n return;\n }\n if (new Date(endIso).getTime() < new Date(startIso).getTime()) {\n notify.error('Invalid times', 'The end time cannot be before the start time.');\n return;\n }\n\n const existingMetadata = (existingSession?.metadata ?? {}) as Record<string, unknown>;\n const input = {\n eventId: id,\n title: form.title.trim(),\n sessionType: form.sessionType,\n track: form.track || null,\n venueId: form.venueId || null,\n startsAt: startIso,\n endsAt: endIso,\n capacity: form.capacity ? Number(form.capacity) : null,\n status: form.status,\n description: form.description || null,\n metadata: { ...existingMetadata, [SPEAKER_METADATA_KEY]: form.speakerId || null },\n };\n\n try {\n if (isEdit) {\n const response = await updateSession({ variables: { id: sid, input } });\n if (!mutationSucceeded(response, response.data?.updateEventSession?.id, 'Could not update session')) {\n return;\n }\n notify.success('Session updated');\n navigate(`/events/${id}`);\n return;\n }\n const response = await createSession({ variables: { input } });\n if (!mutationSucceeded(response, response.data?.createEventSession?.id, 'Could not create session')) {\n return;\n }\n notify.success('Session created');\n navigate(`/events/${id}`);\n } catch (error) {\n notify.error('Could not save session', describeError(error));\n }\n };\n\n const saving = creating || updating;\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit Session' : 'Add Session'}\n description={`Agenda item for ${eventName}.`}\n purpose=\"Sessions make up the agenda attendees follow on the day — a talk, workshop or panel with a time, a room and a speaker. Set the slot and assign a room so two sessions never clash, and pick the speaker who will present it.\"\n backLabel=\"Back to Event\"\n onBack={() => navigate(`/events/${id}`)}\n onSubmit={onSubmit}\n submitLabel=\"Save Session\"\n saving={saving}\n >\n {relevantConflicts.length > 0 ? (\n <div className=\"rounded-card border border-status-warning-border bg-status-warning-bg-subtle p-3 text-sm text-status-warning-text\">\n <p className=\"font-medium\">\n {relevantConflicts.length === 1\n ? '1 agenda conflict detected'\n : `${relevantConflicts.length} agenda conflicts detected`}\n </p>\n <ul className=\"mt-2 space-y-1.5\">\n {relevantConflicts.map((conflict, index) => (\n <li\n key={`${conflict.type}-${conflict.sessionAId}-${conflict.sessionBId}-${index}`}\n className=\"flex items-start gap-2\"\n >\n <Badge\n variant={conflict.type.toLowerCase() === 'venue' ? 'warning' : 'info'}\n className=\"mt-0.5 shrink-0 uppercase\"\n >\n {conflict.type}\n </Badge>\n <span className=\"min-w-0\">{conflict.message}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\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\">Title</span>\n <Input value={form.title} onChange={(e) => onChange('title', e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Track</span>\n <Input\n value={form.track}\n onChange={(e) => onChange('track', e.target.value)}\n placeholder=\"Main stage, Product, Engineering…\"\n />\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Room / Venue</span>\n <Select\n value={form.venueId || 'none'}\n onValueChange={(value) => onChange('venueId', value === 'none' ? '' : value)}\n >\n <SelectTrigger aria-label=\"Room or venue\">\n <SelectValue placeholder=\"Select a room\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">No room</SelectItem>\n {venues.map((venue: { id: string; name: string }) => (\n <SelectItem key={venue.id} value={venue.id}>\n {venue.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\">Speaker</span>\n <Select\n value={form.speakerId || 'none'}\n onValueChange={(value) => onChange('speakerId', value === 'none' ? '' : value)}\n >\n <SelectTrigger aria-label=\"Speaker\">\n <SelectValue placeholder=\"Select a speaker\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">No speaker</SelectItem>\n {speakers.map((speaker) => (\n <SelectItem key={speaker.id} value={speaker.id}>\n {speaker.fullName}\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\">Capacity</span>\n <Input type=\"number\" min=\"0\" value={form.capacity} onChange={(e) => onChange('capacity', e.target.value)} />\n </label>\n </div>\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\">Start</span>\n <Input\n type=\"datetime-local\"\n value={form.startsAt}\n onChange={(e) => onChange('startsAt', e.target.value)}\n required\n />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">End</span>\n <Input\n type=\"datetime-local\"\n value={form.endsAt}\n onChange={(e) => onChange('endsAt', e.target.value)}\n required\n />\n </label>\n </div>\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\">Type</span>\n <Select value={form.sessionType} onValueChange={(value) => onChange('sessionType', value)}>\n <SelectTrigger aria-label=\"Session type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SESSION_TYPE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\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\">Status</span>\n <Select value={form.status} onValueChange={(value) => onChange('status', value)}>\n <SelectTrigger aria-label=\"Status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SESSION_STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Description</span>\n <Textarea value={form.description} onChange={(e) => onChange('description', e.target.value)} rows={3} />\n </label>\n\n {isEdit ? <EntityTagsField entityType=\"EVENTFULLYMANAGED_SESSION\" entityId={sid} /> : null}\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"names":[],"mappings":"AA8KA,MAAM,CAAC,OAAO,UAAU,UAAU,
|
|
1
|
+
{"version":3,"file":"EventsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"names":[],"mappings":"AA8KA,MAAM,CAAC,OAAO,UAAU,UAAU,4CAycjC"}
|