@burdenoff/microfe-eventfullymanaged 2026.713.1 → 2026.719.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eventfullymanaged/api/eventApi.d.ts +40 -0
- package/dist/eventfullymanaged/api/eventApi.d.ts.map +1 -1
- package/dist/eventfullymanaged/api/eventApi.js +147 -117
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js +152 -135
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +154 -117
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +228 -187
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +233 -122
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.d.ts.map +1 -1
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +255 -254
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
- package/dist/eventfullymanaged/types/index.d.ts.map +1 -1
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -1
- package/dist/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/stories/ActionMenu.stories.d.ts +10 -0
- package/dist/stories/ActionMenu.stories.d.ts.map +1 -0
- package/dist/stories/Pagination.stories.d.ts +11 -0
- package/dist/stories/Pagination.stories.d.ts.map +1 -0
- package/dist/stories/SafeLink.stories.d.ts +11 -0
- package/dist/stories/SafeLink.stories.d.ts.map +1 -0
- package/package.json +12 -1
|
@@ -2,17 +2,17 @@ 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,
|
|
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
|
|
5
|
+
import { useCreateEventSessionMutation as i, useEventQuery as a, useSessionConflictsQuery as o, useSpeakersQuery as s, useUpdateEventSessionMutation as c, useVenuesQuery as l } from "../../api/eventApi.js";
|
|
6
|
+
import { SESSION_STATUS_OPTIONS as u, SESSION_TYPE_OPTIONS as d, inputValueToIso as f, isoToInputValue as p } from "./eventFormUtils.js";
|
|
7
|
+
import { EntityFormShell as m } from "../../components/EntityFormShell.js";
|
|
8
|
+
import { describeError as h, mutationSucceeded as g } from "../../lib/mutationResult.js";
|
|
9
|
+
import { EntityTagsField as _ } from "../../components/EntityTagsField.js";
|
|
10
|
+
import { useEffect as v, useMemo as y, useState as b } from "react";
|
|
11
|
+
import { useParams as x } from "react-router-dom";
|
|
12
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
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";
|
|
14
14
|
//#region src/eventfullymanaged/pages/events/SessionFormPage.tsx
|
|
15
|
-
var
|
|
15
|
+
var j = "speakerId", M = t`
|
|
16
16
|
query EventfullymanagedSessionFormSessions($eventId: ID, $limit: Int, $offset: Int) {
|
|
17
17
|
eventSessions: eventfullyManagedEventSessions(eventId: $eventId, limit: $limit, offset: $offset) {
|
|
18
18
|
total
|
|
@@ -33,7 +33,7 @@ var A = "speakerId", j = t`
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
`;
|
|
36
|
-
function
|
|
36
|
+
function N() {
|
|
37
37
|
let e = /* @__PURE__ */ new Date(), t = new Date(e.getTime() + 3600 * 1e3);
|
|
38
38
|
return {
|
|
39
39
|
title: "",
|
|
@@ -41,55 +41,62 @@ function M() {
|
|
|
41
41
|
track: "",
|
|
42
42
|
venueId: "",
|
|
43
43
|
speakerId: "",
|
|
44
|
-
startsAt:
|
|
45
|
-
endsAt:
|
|
44
|
+
startsAt: p(e.toISOString()),
|
|
45
|
+
endsAt: p(t.toISOString()),
|
|
46
46
|
capacity: "",
|
|
47
47
|
status: "SCHEDULED",
|
|
48
48
|
description: ""
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
function
|
|
52
|
-
let { id: t = "", sid:
|
|
51
|
+
function P() {
|
|
52
|
+
let { id: t = "", sid: P = "" } = x(), F = y(() => !!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
|
-
skip: !
|
|
59
|
-
}), { data:
|
|
58
|
+
skip: !P
|
|
59
|
+
}), { data: z } = l({
|
|
60
60
|
limit: 100,
|
|
61
61
|
offset: 0
|
|
62
|
-
}), { data:
|
|
62
|
+
}), { data: B } = s({
|
|
63
63
|
limit: 100,
|
|
64
64
|
offset: 0
|
|
65
|
-
}),
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
65
|
+
}), { data: V } = o({ eventId: t }), H = y(() => {
|
|
66
|
+
let e = V?.sessionConflicts ?? [];
|
|
67
|
+
return F ? e.filter((e) => e.sessionAId === P || e.sessionBId === P) : e;
|
|
68
|
+
}, [
|
|
69
|
+
V,
|
|
70
|
+
F,
|
|
71
|
+
P
|
|
72
|
+
]), [U, { loading: W }] = i(), [G, { loading: K }] = c(), [q, J] = b(N), Y = y(() => (R?.eventSessions?.items ?? []).find((e) => e.id === P), [R, P]);
|
|
73
|
+
v(() => {
|
|
74
|
+
if (!F || !Y) return;
|
|
75
|
+
let e = Y.metadata ?? {};
|
|
76
|
+
J({
|
|
77
|
+
title: Y.title ?? "",
|
|
78
|
+
sessionType: Y.sessionType ?? "TALK",
|
|
79
|
+
track: Y.track ?? "",
|
|
80
|
+
venueId: Y.venueId ?? "",
|
|
81
|
+
speakerId: typeof e[j] == "string" ? e[j] : "",
|
|
82
|
+
startsAt: p(Y.startsAt),
|
|
83
|
+
endsAt: p(Y.endsAt),
|
|
84
|
+
capacity: Y.capacity == null ? "" : String(Y.capacity),
|
|
85
|
+
status: Y.status ?? "SCHEDULED",
|
|
86
|
+
description: Y.description ?? ""
|
|
80
87
|
});
|
|
81
|
-
}, [
|
|
82
|
-
let
|
|
83
|
-
|
|
88
|
+
}, [Y, F]);
|
|
89
|
+
let X = z?.venues?.items ?? [], Z = B?.speakers?.items ?? [], Q = L?.event?.name ?? "Event", $ = (e, t) => {
|
|
90
|
+
J((n) => ({
|
|
84
91
|
...n,
|
|
85
92
|
[e]: t
|
|
86
93
|
}));
|
|
87
|
-
},
|
|
88
|
-
if (e.preventDefault(), !
|
|
94
|
+
}, ee = async (e) => {
|
|
95
|
+
if (e.preventDefault(), !q.title.trim()) {
|
|
89
96
|
r.error("Title required", "Give the session a title before saving.");
|
|
90
97
|
return;
|
|
91
98
|
}
|
|
92
|
-
let n =
|
|
99
|
+
let n = f(q.startsAt), i = f(q.endsAt);
|
|
93
100
|
if (!n || !i) {
|
|
94
101
|
r.error("Times required", "Set both a start and an end time.");
|
|
95
102
|
return;
|
|
@@ -98,211 +105,221 @@ function N() {
|
|
|
98
105
|
r.error("Invalid times", "The end time cannot be before the start time.");
|
|
99
106
|
return;
|
|
100
107
|
}
|
|
101
|
-
let a =
|
|
108
|
+
let a = Y?.metadata ?? {}, o = {
|
|
102
109
|
eventId: t,
|
|
103
|
-
title:
|
|
104
|
-
sessionType:
|
|
105
|
-
track:
|
|
106
|
-
venueId:
|
|
110
|
+
title: q.title.trim(),
|
|
111
|
+
sessionType: q.sessionType,
|
|
112
|
+
track: q.track || null,
|
|
113
|
+
venueId: q.venueId || null,
|
|
107
114
|
startsAt: n,
|
|
108
115
|
endsAt: i,
|
|
109
|
-
capacity:
|
|
110
|
-
status:
|
|
111
|
-
description:
|
|
116
|
+
capacity: q.capacity ? Number(q.capacity) : null,
|
|
117
|
+
status: q.status,
|
|
118
|
+
description: q.description || null,
|
|
112
119
|
metadata: {
|
|
113
120
|
...a,
|
|
114
|
-
[
|
|
121
|
+
[j]: q.speakerId || null
|
|
115
122
|
}
|
|
116
123
|
};
|
|
117
124
|
try {
|
|
118
|
-
if (
|
|
119
|
-
let e = await
|
|
120
|
-
id:
|
|
125
|
+
if (F) {
|
|
126
|
+
let e = await G({ variables: {
|
|
127
|
+
id: P,
|
|
121
128
|
input: o
|
|
122
129
|
} });
|
|
123
|
-
if (!
|
|
124
|
-
r.success("Session updated"),
|
|
130
|
+
if (!g(e, e.data?.updateEventSession?.id, "Could not update session")) return;
|
|
131
|
+
r.success("Session updated"), I(`/events/${t}`);
|
|
125
132
|
return;
|
|
126
133
|
}
|
|
127
|
-
let e = await
|
|
128
|
-
if (!
|
|
129
|
-
r.success("Session created"),
|
|
134
|
+
let e = await U({ variables: { input: o } });
|
|
135
|
+
if (!g(e, e.data?.createEventSession?.id, "Could not create session")) return;
|
|
136
|
+
r.success("Session created"), I(`/events/${t}`);
|
|
130
137
|
} catch (e) {
|
|
131
|
-
r.error("Could not save session",
|
|
138
|
+
r.error("Could not save session", h(e));
|
|
132
139
|
}
|
|
133
|
-
},
|
|
134
|
-
return /* @__PURE__ */
|
|
135
|
-
title:
|
|
136
|
-
description: `Agenda item for ${
|
|
140
|
+
}, te = W || K;
|
|
141
|
+
return /* @__PURE__ */ C(m, {
|
|
142
|
+
title: F ? "Edit Session" : "Add Session",
|
|
143
|
+
description: `Agenda item for ${Q}.`,
|
|
137
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.",
|
|
138
145
|
backLabel: "Back to Event",
|
|
139
|
-
onBack: () =>
|
|
140
|
-
onSubmit:
|
|
146
|
+
onBack: () => I(`/events/${t}`),
|
|
147
|
+
onSubmit: ee,
|
|
141
148
|
submitLabel: "Save Session",
|
|
142
|
-
saving:
|
|
149
|
+
saving: te,
|
|
143
150
|
children: [
|
|
144
|
-
/* @__PURE__ */
|
|
151
|
+
H.length > 0 ? /* @__PURE__ */ C("div", {
|
|
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__ */ S("p", {
|
|
154
|
+
className: "font-medium",
|
|
155
|
+
children: H.length === 1 ? "1 agenda conflict detected" : `${H.length} agenda conflicts detected`
|
|
156
|
+
}), /* @__PURE__ */ S("ul", {
|
|
157
|
+
className: "mt-1 list-inside list-disc space-y-0.5",
|
|
158
|
+
children: H.map((e, t) => /* @__PURE__ */ S("li", { children: e.message }, `${e.type}-${e.sessionAId}-${e.sessionBId}-${t}`))
|
|
159
|
+
})]
|
|
160
|
+
}) : null,
|
|
161
|
+
/* @__PURE__ */ C("div", {
|
|
145
162
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
146
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ C("label", {
|
|
147
164
|
className: "space-y-1 text-sm",
|
|
148
|
-
children: [/* @__PURE__ */
|
|
165
|
+
children: [/* @__PURE__ */ S("span", {
|
|
149
166
|
className: "font-medium text-text-primary",
|
|
150
167
|
children: "Title"
|
|
151
|
-
}), /* @__PURE__ */
|
|
152
|
-
value:
|
|
153
|
-
onChange: (e) =>
|
|
168
|
+
}), /* @__PURE__ */ S(w, {
|
|
169
|
+
value: q.title,
|
|
170
|
+
onChange: (e) => $("title", e.target.value),
|
|
154
171
|
required: !0
|
|
155
172
|
})]
|
|
156
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ C("label", {
|
|
157
174
|
className: "space-y-1 text-sm",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ S("span", {
|
|
159
176
|
className: "font-medium text-text-primary",
|
|
160
177
|
children: "Track"
|
|
161
|
-
}), /* @__PURE__ */
|
|
162
|
-
value:
|
|
163
|
-
onChange: (e) =>
|
|
178
|
+
}), /* @__PURE__ */ S(w, {
|
|
179
|
+
value: q.track,
|
|
180
|
+
onChange: (e) => $("track", e.target.value),
|
|
164
181
|
placeholder: "Main stage, Product, Engineering…"
|
|
165
182
|
})]
|
|
166
183
|
})]
|
|
167
184
|
}),
|
|
168
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ C("div", {
|
|
169
186
|
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
170
187
|
children: [
|
|
171
|
-
/* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ C("label", {
|
|
172
189
|
className: "space-y-1 text-sm",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
190
|
+
children: [/* @__PURE__ */ S("span", {
|
|
174
191
|
className: "font-medium text-text-primary",
|
|
175
192
|
children: "Room / Venue"
|
|
176
|
-
}), /* @__PURE__ */
|
|
177
|
-
value:
|
|
178
|
-
onValueChange: (e) =>
|
|
179
|
-
children: [/* @__PURE__ */
|
|
193
|
+
}), /* @__PURE__ */ C(T, {
|
|
194
|
+
value: q.venueId || "none",
|
|
195
|
+
onValueChange: (e) => $("venueId", e === "none" ? "" : e),
|
|
196
|
+
children: [/* @__PURE__ */ S(O, {
|
|
180
197
|
"aria-label": "Room or venue",
|
|
181
|
-
children: /* @__PURE__ */
|
|
182
|
-
}), /* @__PURE__ */
|
|
198
|
+
children: /* @__PURE__ */ S(k, { placeholder: "Select a room" })
|
|
199
|
+
}), /* @__PURE__ */ C(E, { children: [/* @__PURE__ */ S(D, {
|
|
183
200
|
value: "none",
|
|
184
201
|
children: "No room"
|
|
185
|
-
}),
|
|
202
|
+
}), X.map((e) => /* @__PURE__ */ S(D, {
|
|
186
203
|
value: e.id,
|
|
187
204
|
children: e.name
|
|
188
205
|
}, e.id))] })]
|
|
189
206
|
})]
|
|
190
207
|
}),
|
|
191
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ C("label", {
|
|
192
209
|
className: "space-y-1 text-sm",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
210
|
+
children: [/* @__PURE__ */ S("span", {
|
|
194
211
|
className: "font-medium text-text-primary",
|
|
195
212
|
children: "Speaker"
|
|
196
|
-
}), /* @__PURE__ */
|
|
197
|
-
value:
|
|
198
|
-
onValueChange: (e) =>
|
|
199
|
-
children: [/* @__PURE__ */
|
|
213
|
+
}), /* @__PURE__ */ C(T, {
|
|
214
|
+
value: q.speakerId || "none",
|
|
215
|
+
onValueChange: (e) => $("speakerId", e === "none" ? "" : e),
|
|
216
|
+
children: [/* @__PURE__ */ S(O, {
|
|
200
217
|
"aria-label": "Speaker",
|
|
201
|
-
children: /* @__PURE__ */
|
|
202
|
-
}), /* @__PURE__ */
|
|
218
|
+
children: /* @__PURE__ */ S(k, { placeholder: "Select a speaker" })
|
|
219
|
+
}), /* @__PURE__ */ C(E, { children: [/* @__PURE__ */ S(D, {
|
|
203
220
|
value: "none",
|
|
204
221
|
children: "No speaker"
|
|
205
|
-
}),
|
|
222
|
+
}), Z.map((e) => /* @__PURE__ */ S(D, {
|
|
206
223
|
value: e.id,
|
|
207
224
|
children: e.fullName
|
|
208
225
|
}, e.id))] })]
|
|
209
226
|
})]
|
|
210
227
|
}),
|
|
211
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ C("label", {
|
|
212
229
|
className: "space-y-1 text-sm",
|
|
213
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ S("span", {
|
|
214
231
|
className: "font-medium text-text-primary",
|
|
215
232
|
children: "Capacity"
|
|
216
|
-
}), /* @__PURE__ */
|
|
233
|
+
}), /* @__PURE__ */ S(w, {
|
|
217
234
|
type: "number",
|
|
218
235
|
min: "0",
|
|
219
|
-
value:
|
|
220
|
-
onChange: (e) =>
|
|
236
|
+
value: q.capacity,
|
|
237
|
+
onChange: (e) => $("capacity", e.target.value)
|
|
221
238
|
})]
|
|
222
239
|
})
|
|
223
240
|
]
|
|
224
241
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ C("div", {
|
|
226
243
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ C("label", {
|
|
228
245
|
className: "space-y-1 text-sm",
|
|
229
|
-
children: [/* @__PURE__ */
|
|
246
|
+
children: [/* @__PURE__ */ S("span", {
|
|
230
247
|
className: "font-medium text-text-primary",
|
|
231
248
|
children: "Start"
|
|
232
|
-
}), /* @__PURE__ */
|
|
249
|
+
}), /* @__PURE__ */ S(w, {
|
|
233
250
|
type: "datetime-local",
|
|
234
|
-
value:
|
|
235
|
-
onChange: (e) =>
|
|
251
|
+
value: q.startsAt,
|
|
252
|
+
onChange: (e) => $("startsAt", e.target.value),
|
|
236
253
|
required: !0
|
|
237
254
|
})]
|
|
238
|
-
}), /* @__PURE__ */
|
|
255
|
+
}), /* @__PURE__ */ C("label", {
|
|
239
256
|
className: "space-y-1 text-sm",
|
|
240
|
-
children: [/* @__PURE__ */
|
|
257
|
+
children: [/* @__PURE__ */ S("span", {
|
|
241
258
|
className: "font-medium text-text-primary",
|
|
242
259
|
children: "End"
|
|
243
|
-
}), /* @__PURE__ */
|
|
260
|
+
}), /* @__PURE__ */ S(w, {
|
|
244
261
|
type: "datetime-local",
|
|
245
|
-
value:
|
|
246
|
-
onChange: (e) =>
|
|
262
|
+
value: q.endsAt,
|
|
263
|
+
onChange: (e) => $("endsAt", e.target.value),
|
|
247
264
|
required: !0
|
|
248
265
|
})]
|
|
249
266
|
})]
|
|
250
267
|
}),
|
|
251
|
-
/* @__PURE__ */
|
|
268
|
+
/* @__PURE__ */ C("div", {
|
|
252
269
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
253
|
-
children: [/* @__PURE__ */
|
|
270
|
+
children: [/* @__PURE__ */ C("label", {
|
|
254
271
|
className: "space-y-1 text-sm",
|
|
255
|
-
children: [/* @__PURE__ */
|
|
272
|
+
children: [/* @__PURE__ */ S("span", {
|
|
256
273
|
className: "font-medium text-text-primary",
|
|
257
274
|
children: "Type"
|
|
258
|
-
}), /* @__PURE__ */
|
|
259
|
-
value:
|
|
260
|
-
onValueChange: (e) =>
|
|
261
|
-
children: [/* @__PURE__ */
|
|
275
|
+
}), /* @__PURE__ */ C(T, {
|
|
276
|
+
value: q.sessionType,
|
|
277
|
+
onValueChange: (e) => $("sessionType", e),
|
|
278
|
+
children: [/* @__PURE__ */ S(O, {
|
|
262
279
|
"aria-label": "Session type",
|
|
263
|
-
children: /* @__PURE__ */
|
|
264
|
-
}), /* @__PURE__ */
|
|
280
|
+
children: /* @__PURE__ */ S(k, {})
|
|
281
|
+
}), /* @__PURE__ */ S(E, { children: d.map((e) => /* @__PURE__ */ S(D, {
|
|
265
282
|
value: e.value,
|
|
266
283
|
children: e.label
|
|
267
284
|
}, e.value)) })]
|
|
268
285
|
})]
|
|
269
|
-
}), /* @__PURE__ */
|
|
286
|
+
}), /* @__PURE__ */ C("label", {
|
|
270
287
|
className: "space-y-1 text-sm",
|
|
271
|
-
children: [/* @__PURE__ */
|
|
288
|
+
children: [/* @__PURE__ */ S("span", {
|
|
272
289
|
className: "font-medium text-text-primary",
|
|
273
290
|
children: "Status"
|
|
274
|
-
}), /* @__PURE__ */
|
|
275
|
-
value:
|
|
276
|
-
onValueChange: (e) =>
|
|
277
|
-
children: [/* @__PURE__ */
|
|
291
|
+
}), /* @__PURE__ */ C(T, {
|
|
292
|
+
value: q.status,
|
|
293
|
+
onValueChange: (e) => $("status", e),
|
|
294
|
+
children: [/* @__PURE__ */ S(O, {
|
|
278
295
|
"aria-label": "Status",
|
|
279
|
-
children: /* @__PURE__ */
|
|
280
|
-
}), /* @__PURE__ */
|
|
296
|
+
children: /* @__PURE__ */ S(k, {})
|
|
297
|
+
}), /* @__PURE__ */ S(E, { children: u.map((e) => /* @__PURE__ */ S(D, {
|
|
281
298
|
value: e.value,
|
|
282
299
|
children: e.label
|
|
283
300
|
}, e.value)) })]
|
|
284
301
|
})]
|
|
285
302
|
})]
|
|
286
303
|
}),
|
|
287
|
-
/* @__PURE__ */
|
|
304
|
+
/* @__PURE__ */ C("label", {
|
|
288
305
|
className: "block space-y-1 text-sm",
|
|
289
|
-
children: [/* @__PURE__ */
|
|
306
|
+
children: [/* @__PURE__ */ S("span", {
|
|
290
307
|
className: "font-medium text-text-primary",
|
|
291
308
|
children: "Description"
|
|
292
|
-
}), /* @__PURE__ */
|
|
293
|
-
value:
|
|
294
|
-
onChange: (e) =>
|
|
309
|
+
}), /* @__PURE__ */ S(A, {
|
|
310
|
+
value: q.description,
|
|
311
|
+
onChange: (e) => $("description", e.target.value),
|
|
295
312
|
rows: 3
|
|
296
313
|
})]
|
|
297
314
|
}),
|
|
298
|
-
|
|
315
|
+
F ? /* @__PURE__ */ S(_, {
|
|
299
316
|
entityType: "EVENTFULLYMANAGED_SESSION",
|
|
300
|
-
entityId:
|
|
317
|
+
entityId: P
|
|
301
318
|
}) : null
|
|
302
319
|
]
|
|
303
320
|
});
|
|
304
321
|
}
|
|
305
322
|
//#endregion
|
|
306
|
-
export {
|
|
323
|
+
export { P as default };
|
|
307
324
|
|
|
308
325
|
//# sourceMappingURL=SessionFormPage.js.map
|
|
@@ -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-dom';\n\nimport {\n useCreateEventSessionMutation,\n useEventQuery,\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 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 <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 { Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea } from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"names":[],"mappings":"AA+IA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAuUpC"}
|