@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.
Files changed (29) hide show
  1. package/dist/eventfullymanaged/api/eventApi.d.ts +40 -0
  2. package/dist/eventfullymanaged/api/eventApi.d.ts.map +1 -1
  3. package/dist/eventfullymanaged/api/eventApi.js +147 -117
  4. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  5. package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -1
  6. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +152 -135
  7. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -1
  8. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.d.ts.map +1 -1
  9. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +154 -117
  10. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/CommunicationPage.d.ts.map +1 -1
  12. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +228 -187
  13. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  14. package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/EventsPage.js +233 -122
  16. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.d.ts.map +1 -1
  18. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +255 -254
  19. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
  20. package/dist/eventfullymanaged/types/index.d.ts.map +1 -1
  21. package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -1
  22. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  23. package/dist/stories/ActionMenu.stories.d.ts +10 -0
  24. package/dist/stories/ActionMenu.stories.d.ts.map +1 -0
  25. package/dist/stories/Pagination.stories.d.ts +11 -0
  26. package/dist/stories/Pagination.stories.d.ts.map +1 -0
  27. package/dist/stories/SafeLink.stories.d.ts +11 -0
  28. package/dist/stories/SafeLink.stories.d.ts.map +1 -0
  29. 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, useSpeakersQuery as o, useUpdateEventSessionMutation as s, useVenuesQuery as c } 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-dom";
12
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
13
- import { Input as C, Select as w, SelectContent as T, SelectItem as E, SelectTrigger as D, SelectValue as O, Textarea as k } from "@burdenoff/fe-libs/ui";
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 A = "speakerId", j = t`
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 M() {
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: f(e.toISOString()),
45
- endsAt: f(t.toISOString()),
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 N() {
52
- let { id: t = "", sid: N = "" } = b(), P = v(() => !!N, [N]), { navigate: F } = e(), { data: I } = a(t), { data: L } = n(j, {
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: !N
59
- }), { data: R } = c({
58
+ skip: !P
59
+ }), { data: z } = l({
60
60
  limit: 100,
61
61
  offset: 0
62
- }), { data: z } = o({
62
+ }), { data: B } = s({
63
63
  limit: 100,
64
64
  offset: 0
65
- }), [B, { loading: V }] = i(), [H, { loading: U }] = s(), [W, G] = y(M), K = v(() => (L?.eventSessions?.items ?? []).find((e) => e.id === N), [L, N]);
66
- _(() => {
67
- if (!P || !K) return;
68
- let e = K.metadata ?? {};
69
- G({
70
- title: K.title ?? "",
71
- sessionType: K.sessionType ?? "TALK",
72
- track: K.track ?? "",
73
- venueId: K.venueId ?? "",
74
- speakerId: typeof e[A] == "string" ? e[A] : "",
75
- startsAt: f(K.startsAt),
76
- endsAt: f(K.endsAt),
77
- capacity: K.capacity == null ? "" : String(K.capacity),
78
- status: K.status ?? "SCHEDULED",
79
- description: K.description ?? ""
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
- }, [K, P]);
82
- let q = R?.venues?.items ?? [], J = z?.speakers?.items ?? [], Y = I?.event?.name ?? "Event", X = (e, t) => {
83
- G((n) => ({
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
- }, Z = async (e) => {
88
- if (e.preventDefault(), !W.title.trim()) {
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 = d(W.startsAt), i = d(W.endsAt);
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 = K?.metadata ?? {}, o = {
108
+ let a = Y?.metadata ?? {}, o = {
102
109
  eventId: t,
103
- title: W.title.trim(),
104
- sessionType: W.sessionType,
105
- track: W.track || null,
106
- venueId: W.venueId || null,
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: W.capacity ? Number(W.capacity) : null,
110
- status: W.status,
111
- description: W.description || null,
116
+ capacity: q.capacity ? Number(q.capacity) : null,
117
+ status: q.status,
118
+ description: q.description || null,
112
119
  metadata: {
113
120
  ...a,
114
- [A]: W.speakerId || null
121
+ [j]: q.speakerId || null
115
122
  }
116
123
  };
117
124
  try {
118
- if (P) {
119
- let e = await H({ variables: {
120
- id: N,
125
+ if (F) {
126
+ let e = await G({ variables: {
127
+ id: P,
121
128
  input: o
122
129
  } });
123
- if (!h(e, e.data?.updateEventSession?.id, "Could not update session")) return;
124
- r.success("Session updated"), F(`/events/${t}`);
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 B({ variables: { input: o } });
128
- if (!h(e, e.data?.createEventSession?.id, "Could not create session")) return;
129
- r.success("Session created"), F(`/events/${t}`);
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", m(e));
138
+ r.error("Could not save session", h(e));
132
139
  }
133
- }, Q = V || U;
134
- return /* @__PURE__ */ S(p, {
135
- title: P ? "Edit Session" : "Add Session",
136
- description: `Agenda item for ${Y}.`,
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: () => F(`/events/${t}`),
140
- onSubmit: Z,
146
+ onBack: () => I(`/events/${t}`),
147
+ onSubmit: ee,
141
148
  submitLabel: "Save Session",
142
- saving: Q,
149
+ saving: te,
143
150
  children: [
144
- /* @__PURE__ */ S("div", {
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__ */ S("label", {
163
+ children: [/* @__PURE__ */ C("label", {
147
164
  className: "space-y-1 text-sm",
148
- children: [/* @__PURE__ */ x("span", {
165
+ children: [/* @__PURE__ */ S("span", {
149
166
  className: "font-medium text-text-primary",
150
167
  children: "Title"
151
- }), /* @__PURE__ */ x(C, {
152
- value: W.title,
153
- onChange: (e) => X("title", e.target.value),
168
+ }), /* @__PURE__ */ S(w, {
169
+ value: q.title,
170
+ onChange: (e) => $("title", e.target.value),
154
171
  required: !0
155
172
  })]
156
- }), /* @__PURE__ */ S("label", {
173
+ }), /* @__PURE__ */ C("label", {
157
174
  className: "space-y-1 text-sm",
158
- children: [/* @__PURE__ */ x("span", {
175
+ children: [/* @__PURE__ */ S("span", {
159
176
  className: "font-medium text-text-primary",
160
177
  children: "Track"
161
- }), /* @__PURE__ */ x(C, {
162
- value: W.track,
163
- onChange: (e) => X("track", e.target.value),
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__ */ S("div", {
185
+ /* @__PURE__ */ C("div", {
169
186
  className: "grid grid-cols-1 gap-4 md:grid-cols-3",
170
187
  children: [
171
- /* @__PURE__ */ S("label", {
188
+ /* @__PURE__ */ C("label", {
172
189
  className: "space-y-1 text-sm",
173
- children: [/* @__PURE__ */ x("span", {
190
+ children: [/* @__PURE__ */ S("span", {
174
191
  className: "font-medium text-text-primary",
175
192
  children: "Room / Venue"
176
- }), /* @__PURE__ */ S(w, {
177
- value: W.venueId || "none",
178
- onValueChange: (e) => X("venueId", e === "none" ? "" : e),
179
- children: [/* @__PURE__ */ x(D, {
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__ */ x(O, { placeholder: "Select a room" })
182
- }), /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(E, {
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
- }), q.map((e) => /* @__PURE__ */ x(E, {
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__ */ S("label", {
208
+ /* @__PURE__ */ C("label", {
192
209
  className: "space-y-1 text-sm",
193
- children: [/* @__PURE__ */ x("span", {
210
+ children: [/* @__PURE__ */ S("span", {
194
211
  className: "font-medium text-text-primary",
195
212
  children: "Speaker"
196
- }), /* @__PURE__ */ S(w, {
197
- value: W.speakerId || "none",
198
- onValueChange: (e) => X("speakerId", e === "none" ? "" : e),
199
- children: [/* @__PURE__ */ x(D, {
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__ */ x(O, { placeholder: "Select a speaker" })
202
- }), /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(E, {
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
- }), J.map((e) => /* @__PURE__ */ x(E, {
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__ */ S("label", {
228
+ /* @__PURE__ */ C("label", {
212
229
  className: "space-y-1 text-sm",
213
- children: [/* @__PURE__ */ x("span", {
230
+ children: [/* @__PURE__ */ S("span", {
214
231
  className: "font-medium text-text-primary",
215
232
  children: "Capacity"
216
- }), /* @__PURE__ */ x(C, {
233
+ }), /* @__PURE__ */ S(w, {
217
234
  type: "number",
218
235
  min: "0",
219
- value: W.capacity,
220
- onChange: (e) => X("capacity", e.target.value)
236
+ value: q.capacity,
237
+ onChange: (e) => $("capacity", e.target.value)
221
238
  })]
222
239
  })
223
240
  ]
224
241
  }),
225
- /* @__PURE__ */ S("div", {
242
+ /* @__PURE__ */ C("div", {
226
243
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
227
- children: [/* @__PURE__ */ S("label", {
244
+ children: [/* @__PURE__ */ C("label", {
228
245
  className: "space-y-1 text-sm",
229
- children: [/* @__PURE__ */ x("span", {
246
+ children: [/* @__PURE__ */ S("span", {
230
247
  className: "font-medium text-text-primary",
231
248
  children: "Start"
232
- }), /* @__PURE__ */ x(C, {
249
+ }), /* @__PURE__ */ S(w, {
233
250
  type: "datetime-local",
234
- value: W.startsAt,
235
- onChange: (e) => X("startsAt", e.target.value),
251
+ value: q.startsAt,
252
+ onChange: (e) => $("startsAt", e.target.value),
236
253
  required: !0
237
254
  })]
238
- }), /* @__PURE__ */ S("label", {
255
+ }), /* @__PURE__ */ C("label", {
239
256
  className: "space-y-1 text-sm",
240
- children: [/* @__PURE__ */ x("span", {
257
+ children: [/* @__PURE__ */ S("span", {
241
258
  className: "font-medium text-text-primary",
242
259
  children: "End"
243
- }), /* @__PURE__ */ x(C, {
260
+ }), /* @__PURE__ */ S(w, {
244
261
  type: "datetime-local",
245
- value: W.endsAt,
246
- onChange: (e) => X("endsAt", e.target.value),
262
+ value: q.endsAt,
263
+ onChange: (e) => $("endsAt", e.target.value),
247
264
  required: !0
248
265
  })]
249
266
  })]
250
267
  }),
251
- /* @__PURE__ */ S("div", {
268
+ /* @__PURE__ */ C("div", {
252
269
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
253
- children: [/* @__PURE__ */ S("label", {
270
+ children: [/* @__PURE__ */ C("label", {
254
271
  className: "space-y-1 text-sm",
255
- children: [/* @__PURE__ */ x("span", {
272
+ children: [/* @__PURE__ */ S("span", {
256
273
  className: "font-medium text-text-primary",
257
274
  children: "Type"
258
- }), /* @__PURE__ */ S(w, {
259
- value: W.sessionType,
260
- onValueChange: (e) => X("sessionType", e),
261
- children: [/* @__PURE__ */ x(D, {
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__ */ x(O, {})
264
- }), /* @__PURE__ */ x(T, { children: u.map((e) => /* @__PURE__ */ x(E, {
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__ */ S("label", {
286
+ }), /* @__PURE__ */ C("label", {
270
287
  className: "space-y-1 text-sm",
271
- children: [/* @__PURE__ */ x("span", {
288
+ children: [/* @__PURE__ */ S("span", {
272
289
  className: "font-medium text-text-primary",
273
290
  children: "Status"
274
- }), /* @__PURE__ */ S(w, {
275
- value: W.status,
276
- onValueChange: (e) => X("status", e),
277
- children: [/* @__PURE__ */ x(D, {
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__ */ x(O, {})
280
- }), /* @__PURE__ */ x(T, { children: l.map((e) => /* @__PURE__ */ x(E, {
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__ */ S("label", {
304
+ /* @__PURE__ */ C("label", {
288
305
  className: "block space-y-1 text-sm",
289
- children: [/* @__PURE__ */ x("span", {
306
+ children: [/* @__PURE__ */ S("span", {
290
307
  className: "font-medium text-text-primary",
291
308
  children: "Description"
292
- }), /* @__PURE__ */ x(k, {
293
- value: W.description,
294
- onChange: (e) => X("description", e.target.value),
309
+ }), /* @__PURE__ */ S(A, {
310
+ value: q.description,
311
+ onChange: (e) => $("description", e.target.value),
295
312
  rows: 3
296
313
  })]
297
314
  }),
298
- P ? /* @__PURE__ */ x(g, {
315
+ F ? /* @__PURE__ */ S(_, {
299
316
  entityType: "EVENTFULLYMANAGED_SESSION",
300
- entityId: N
317
+ entityId: P
301
318
  }) : null
302
319
  ]
303
320
  });
304
321
  }
305
322
  //#endregion
306
- export { N as default };
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":"AAwIA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAuRpC"}
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"}