@burdenoff/microfe-eventfullymanaged 2026.625.1 → 2026.703.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 (57) hide show
  1. package/dist/eventfullymanaged/api/eventApi.js +83 -38
  2. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  3. package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
  4. package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
  5. package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
  6. package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
  7. package/dist/eventfullymanaged/lib/toast.js +36 -0
  8. package/dist/eventfullymanaged/lib/toast.js.map +1 -0
  9. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
  10. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +63 -51
  12. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +137 -78
  14. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -45
  16. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/EventsPage.js +89 -52
  18. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
  20. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +73 -24
  22. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
  24. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
  26. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +132 -77
  28. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  29. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
  30. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  31. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
  32. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
  33. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +81 -48
  34. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  35. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +161 -133
  36. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  37. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
  38. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  39. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +103 -61
  40. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  41. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
  42. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  43. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +156 -147
  44. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  45. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
  46. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  47. package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
  48. package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
  49. package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
  50. package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
  51. package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
  52. package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
  53. package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
  54. package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
  55. package/dist/node_modules/sonner/dist/index.js +163 -0
  56. package/dist/node_modules/sonner/dist/index.js.map +1 -0
  57. package/package.json +2 -2
@@ -1,13 +1,15 @@
1
1
  import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
- import { useCreateVenueMutation as t, useUpdateVenueMutation as n, useVenueQuery as r } from "../../api/eventApi.js";
3
- import { useEffect as i, useMemo as a, useState as o } from "react";
4
- import { useParams as s } from "react-router-dom";
5
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
- import { ArrowLeft as u, Save as d } from "lucide-react";
7
- import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Button as p, GlassCard as m, Input as h, Textarea as g } from "@burdenoff/fe-libs/ui";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useCreateVenueMutation as n, useUpdateVenueMutation as r, useVenueQuery as i } from "../../api/eventApi.js";
4
+ import { describeError as a, mutationSucceeded as o } from "../../lib/mutationResult.js";
5
+ import { useEffect as s, useMemo as c, useState as l } from "react";
6
+ import { useParams as u } from "react-router-dom";
7
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ import { ArrowLeft as p, Save as m } from "lucide-react";
9
+ import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { Button as g, EmphasisPanel as _, Input as v, PagePurpose as y, Textarea as b } from "@burdenoff/fe-libs/ui";
9
11
  //#region src/eventfullymanaged/pages/venues/VenueFormPage.tsx
10
- var _ = {
12
+ var x = {
11
13
  name: "",
12
14
  description: "",
13
15
  addressLine1: "",
@@ -19,228 +21,235 @@ var _ = {
19
21
  amenities: "",
20
22
  status: "ACTIVE"
21
23
  };
22
- function v() {
23
- let { t: v } = f(), y = (e, t) => {
24
- let n = v(e);
24
+ function S() {
25
+ let { t: S } = h(), C = (e, t) => {
26
+ let n = S(e);
25
27
  return n === e ? t : n;
26
- }, { id: b = "" } = s(), x = a(() => !!b, [b]), { navigate: S } = e(), { data: C } = r(b), [w, { loading: T }] = t(), [E, { loading: D }] = n(), [O, k] = o(_);
27
- i(() => {
28
- !x || !C?.venue || k({
29
- name: C.venue.name ?? "",
30
- description: C.venue.description ?? "",
31
- addressLine1: C.venue.addressLine1 ?? "",
32
- city: C.venue.city ?? "",
33
- state: C.venue.state ?? "",
34
- country: C.venue.country ?? "India",
35
- postalCode: C.venue.postalCode ?? "",
36
- capacity: C.venue.capacity ? String(C.venue.capacity) : "",
37
- amenities: (C.venue.amenities ?? []).join(", "),
38
- status: C.venue.status ?? "ACTIVE"
28
+ }, { id: w = "" } = u(), T = c(() => !!w, [w]), { navigate: E } = e(), { data: D } = i(w), [O, { loading: k }] = n(), [A, { loading: j }] = r(), [M, N] = l(x);
29
+ s(() => {
30
+ !T || !D?.venue || N({
31
+ name: D.venue.name ?? "",
32
+ description: D.venue.description ?? "",
33
+ addressLine1: D.venue.addressLine1 ?? "",
34
+ city: D.venue.city ?? "",
35
+ state: D.venue.state ?? "",
36
+ country: D.venue.country ?? "India",
37
+ postalCode: D.venue.postalCode ?? "",
38
+ capacity: D.venue.capacity ? String(D.venue.capacity) : "",
39
+ amenities: (D.venue.amenities ?? []).join(", "),
40
+ status: D.venue.status ?? "ACTIVE"
39
41
  });
40
- }, [C, x]);
41
- let A = (e, t) => {
42
- k((n) => ({
42
+ }, [D, T]);
43
+ let P = (e, t) => {
44
+ N((n) => ({
43
45
  ...n,
44
46
  [e]: t
45
47
  }));
46
- }, j = async (e) => {
48
+ }, F = async (e) => {
47
49
  e.preventDefault();
48
- let t = {
49
- name: O.name,
50
- description: O.description,
51
- addressLine1: O.addressLine1,
52
- city: O.city,
53
- state: O.state,
54
- country: O.country,
55
- postalCode: O.postalCode,
56
- capacity: O.capacity ? Number(O.capacity) : null,
57
- amenities: O.amenities.split(",").map((e) => e.trim()).filter(Boolean),
58
- status: O.status,
50
+ let n = {
51
+ name: M.name,
52
+ description: M.description,
53
+ addressLine1: M.addressLine1,
54
+ city: M.city,
55
+ state: M.state,
56
+ country: M.country,
57
+ postalCode: M.postalCode,
58
+ capacity: M.capacity ? Number(M.capacity) : null,
59
+ amenities: M.amenities.split(",").map((e) => e.trim()).filter(Boolean),
60
+ status: M.status,
59
61
  pricing: {},
60
62
  openingHours: {},
61
63
  metadata: {}
62
64
  };
63
- if (x) {
64
- await E({ variables: {
65
- id: b,
66
- input: t
67
- } }), S(`/venues/${b}`);
68
- return;
65
+ try {
66
+ if (T) {
67
+ let e = await A({ variables: {
68
+ id: w,
69
+ input: n
70
+ } });
71
+ if (!o(e, e.data?.updateVenue?.id, "Could not update venue")) return;
72
+ E(`/venues/${w}`);
73
+ return;
74
+ }
75
+ let e = await O({ variables: { input: n } }), t = e.data?.createVenue?.id;
76
+ if (!o(e, t, "Could not create venue")) return;
77
+ E(`/venues/${t}`);
78
+ } catch (e) {
79
+ t.error("Could not save venue", a(e));
69
80
  }
70
- let n = (await w({ variables: { input: t } })).data?.createVenue?.id;
71
- S(n ? `/venues/${n}` : "/venues");
72
- }, M = T || D;
73
- return /* @__PURE__ */ l("div", {
81
+ }, I = k || j;
82
+ return /* @__PURE__ */ f("div", {
74
83
  className: "space-y-6 p-6",
75
- children: [/* @__PURE__ */ l("div", { children: [
76
- /* @__PURE__ */ l(p, {
77
- type: "button",
78
- variant: "ghost",
79
- size: "sm",
80
- onClick: () => S("/venues"),
81
- children: [/* @__PURE__ */ c(u, { className: "h-4 w-4" }), y("eventfullymanaged.venues.form.backToVenues", "Back to Venues")]
82
- }),
83
- /* @__PURE__ */ c("h1", {
84
- className: "mt-3 text-2xl font-bold text-text-primary",
85
- children: x ? y("eventfullymanaged.venues.form.editTitle", "Edit Venue") : y("eventfullymanaged.venues.form.createTitle", "Create Venue")
86
- }),
87
- /* @__PURE__ */ c("p", {
88
- className: "mt-1 text-sm text-text-secondary",
89
- children: y("eventfullymanaged.venues.form.description", "Manage venue details with live backend persistence.")
90
- })
91
- ] }), /* @__PURE__ */ c(m, {
92
- treatment: "plain",
93
- className: "border-border-seam p-5",
94
- children: /* @__PURE__ */ l("form", {
95
- onSubmit: j,
84
+ children: [
85
+ /* @__PURE__ */ f("div", { children: [
86
+ /* @__PURE__ */ f(g, {
87
+ type: "button",
88
+ variant: "ghost",
89
+ size: "sm",
90
+ onClick: () => E("/venues"),
91
+ children: [/* @__PURE__ */ d(p, { className: "h-4 w-4" }), C("eventfullymanaged.venues.form.backToVenues", "Back to Venues")]
92
+ }),
93
+ /* @__PURE__ */ d("h1", {
94
+ className: "mt-3 text-2xl font-bold text-text-primary",
95
+ children: T ? C("eventfullymanaged.venues.form.editTitle", "Edit Venue") : C("eventfullymanaged.venues.form.createTitle", "Create Venue")
96
+ }),
97
+ /* @__PURE__ */ d("p", {
98
+ className: "mt-1 text-sm text-text-secondary",
99
+ children: C("eventfullymanaged.venues.form.description", "Manage venue details with live backend persistence.")
100
+ })
101
+ ] }),
102
+ /* @__PURE__ */ d(y, { children: C("eventfullymanaged.venues.form.purpose", "Describe a space so you can reuse it across events. Capacity drives how many attendees you can register, the address helps people find it, and amenities tell organizers what is already provided. Fill this in once and every future event can simply point at this venue.") }),
103
+ /* @__PURE__ */ d(_, { children: /* @__PURE__ */ f("form", {
104
+ onSubmit: F,
96
105
  className: "space-y-4",
97
106
  children: [
98
- /* @__PURE__ */ l("div", {
107
+ /* @__PURE__ */ f("div", {
99
108
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
100
- children: [/* @__PURE__ */ l("label", {
109
+ children: [/* @__PURE__ */ f("label", {
101
110
  className: "space-y-1 text-sm",
102
- children: [/* @__PURE__ */ c("span", {
111
+ children: [/* @__PURE__ */ d("span", {
103
112
  className: "font-medium text-text-primary",
104
- children: y("eventfullymanaged.venues.form.fields.name", "Name")
105
- }), /* @__PURE__ */ c(h, {
106
- value: O.name,
107
- onChange: (e) => A("name", e.target.value),
113
+ children: C("eventfullymanaged.venues.form.fields.name", "Name")
114
+ }), /* @__PURE__ */ d(v, {
115
+ value: M.name,
116
+ onChange: (e) => P("name", e.target.value),
108
117
  required: !0
109
118
  })]
110
- }), /* @__PURE__ */ l("label", {
119
+ }), /* @__PURE__ */ f("label", {
111
120
  className: "space-y-1 text-sm",
112
- children: [/* @__PURE__ */ c("span", {
121
+ children: [/* @__PURE__ */ d("span", {
113
122
  className: "font-medium text-text-primary",
114
- children: y("eventfullymanaged.venues.form.fields.capacity", "Capacity")
115
- }), /* @__PURE__ */ c(h, {
116
- value: O.capacity,
117
- onChange: (e) => A("capacity", e.target.value),
123
+ children: C("eventfullymanaged.venues.form.fields.capacity", "Capacity")
124
+ }), /* @__PURE__ */ d(v, {
125
+ value: M.capacity,
126
+ onChange: (e) => P("capacity", e.target.value),
118
127
  type: "number",
119
128
  min: "0"
120
129
  })]
121
130
  })]
122
131
  }),
123
- /* @__PURE__ */ l("label", {
132
+ /* @__PURE__ */ f("label", {
124
133
  className: "block space-y-1 text-sm",
125
- children: [/* @__PURE__ */ c("span", {
134
+ children: [/* @__PURE__ */ d("span", {
126
135
  className: "font-medium text-text-primary",
127
- children: y("eventfullymanaged.venues.form.fields.description", "Description")
128
- }), /* @__PURE__ */ c(g, {
129
- value: O.description,
130
- onChange: (e) => A("description", e.target.value),
136
+ children: C("eventfullymanaged.venues.form.fields.description", "Description")
137
+ }), /* @__PURE__ */ d(b, {
138
+ value: M.description,
139
+ onChange: (e) => P("description", e.target.value),
131
140
  rows: 3
132
141
  })]
133
142
  }),
134
- /* @__PURE__ */ l("div", {
143
+ /* @__PURE__ */ f("div", {
135
144
  className: "grid grid-cols-1 gap-4 md:grid-cols-4",
136
145
  children: [
137
- /* @__PURE__ */ l("label", {
146
+ /* @__PURE__ */ f("label", {
138
147
  className: "space-y-1 text-sm md:col-span-2",
139
- children: [/* @__PURE__ */ c("span", {
148
+ children: [/* @__PURE__ */ d("span", {
140
149
  className: "font-medium text-text-primary",
141
- children: y("eventfullymanaged.venues.form.fields.address", "Address")
142
- }), /* @__PURE__ */ c(h, {
143
- value: O.addressLine1,
144
- onChange: (e) => A("addressLine1", e.target.value)
150
+ children: C("eventfullymanaged.venues.form.fields.address", "Address")
151
+ }), /* @__PURE__ */ d(v, {
152
+ value: M.addressLine1,
153
+ onChange: (e) => P("addressLine1", e.target.value)
145
154
  })]
146
155
  }),
147
- /* @__PURE__ */ l("label", {
156
+ /* @__PURE__ */ f("label", {
148
157
  className: "space-y-1 text-sm",
149
- children: [/* @__PURE__ */ c("span", {
158
+ children: [/* @__PURE__ */ d("span", {
150
159
  className: "font-medium text-text-primary",
151
- children: y("eventfullymanaged.venues.form.fields.city", "City")
152
- }), /* @__PURE__ */ c(h, {
153
- value: O.city,
154
- onChange: (e) => A("city", e.target.value)
160
+ children: C("eventfullymanaged.venues.form.fields.city", "City")
161
+ }), /* @__PURE__ */ d(v, {
162
+ value: M.city,
163
+ onChange: (e) => P("city", e.target.value)
155
164
  })]
156
165
  }),
157
- /* @__PURE__ */ l("label", {
166
+ /* @__PURE__ */ f("label", {
158
167
  className: "space-y-1 text-sm",
159
- children: [/* @__PURE__ */ c("span", {
168
+ children: [/* @__PURE__ */ d("span", {
160
169
  className: "font-medium text-text-primary",
161
- children: y("eventfullymanaged.venues.form.fields.state", "State")
162
- }), /* @__PURE__ */ c(h, {
163
- value: O.state,
164
- onChange: (e) => A("state", e.target.value)
170
+ children: C("eventfullymanaged.venues.form.fields.state", "State")
171
+ }), /* @__PURE__ */ d(v, {
172
+ value: M.state,
173
+ onChange: (e) => P("state", e.target.value)
165
174
  })]
166
175
  })
167
176
  ]
168
177
  }),
169
- /* @__PURE__ */ l("div", {
178
+ /* @__PURE__ */ f("div", {
170
179
  className: "grid grid-cols-1 gap-4 md:grid-cols-3",
171
180
  children: [
172
- /* @__PURE__ */ l("label", {
181
+ /* @__PURE__ */ f("label", {
173
182
  className: "space-y-1 text-sm",
174
- children: [/* @__PURE__ */ c("span", {
183
+ children: [/* @__PURE__ */ d("span", {
175
184
  className: "font-medium text-text-primary",
176
- children: y("eventfullymanaged.venues.form.fields.country", "Country")
177
- }), /* @__PURE__ */ c(h, {
178
- value: O.country,
179
- onChange: (e) => A("country", e.target.value)
185
+ children: C("eventfullymanaged.venues.form.fields.country", "Country")
186
+ }), /* @__PURE__ */ d(v, {
187
+ value: M.country,
188
+ onChange: (e) => P("country", e.target.value)
180
189
  })]
181
190
  }),
182
- /* @__PURE__ */ l("label", {
191
+ /* @__PURE__ */ f("label", {
183
192
  className: "space-y-1 text-sm",
184
- children: [/* @__PURE__ */ c("span", {
193
+ children: [/* @__PURE__ */ d("span", {
185
194
  className: "font-medium text-text-primary",
186
- children: y("eventfullymanaged.venues.form.fields.postalCode", "Postal Code")
187
- }), /* @__PURE__ */ c(h, {
188
- value: O.postalCode,
189
- onChange: (e) => A("postalCode", e.target.value)
195
+ children: C("eventfullymanaged.venues.form.fields.postalCode", "Postal Code")
196
+ }), /* @__PURE__ */ d(v, {
197
+ value: M.postalCode,
198
+ onChange: (e) => P("postalCode", e.target.value)
190
199
  })]
191
200
  }),
192
- /* @__PURE__ */ l("label", {
201
+ /* @__PURE__ */ f("label", {
193
202
  className: "space-y-1 text-sm",
194
- children: [/* @__PURE__ */ c("span", {
203
+ children: [/* @__PURE__ */ d("span", {
195
204
  className: "font-medium text-text-primary",
196
- children: y("eventfullymanaged.venues.form.fields.status", "Status")
197
- }), /* @__PURE__ */ l("select", {
198
- value: O.status,
199
- onChange: (e) => A("status", e.target.value),
205
+ children: C("eventfullymanaged.venues.form.fields.status", "Status")
206
+ }), /* @__PURE__ */ f("select", {
207
+ value: M.status,
208
+ onChange: (e) => P("status", e.target.value),
200
209
  className: "w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors focus-visible:border-border-focus focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)] focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
201
210
  children: [
202
- /* @__PURE__ */ c("option", {
211
+ /* @__PURE__ */ d("option", {
203
212
  value: "ACTIVE",
204
- children: y("eventfullymanaged.venues.form.statusOptions.active", "Active")
213
+ children: C("eventfullymanaged.venues.form.statusOptions.active", "Active")
205
214
  }),
206
- /* @__PURE__ */ c("option", {
215
+ /* @__PURE__ */ d("option", {
207
216
  value: "INACTIVE",
208
- children: y("eventfullymanaged.venues.form.statusOptions.inactive", "Inactive")
217
+ children: C("eventfullymanaged.venues.form.statusOptions.inactive", "Inactive")
209
218
  }),
210
- /* @__PURE__ */ c("option", {
219
+ /* @__PURE__ */ d("option", {
211
220
  value: "MAINTENANCE",
212
- children: y("eventfullymanaged.venues.form.statusOptions.maintenance", "Maintenance")
221
+ children: C("eventfullymanaged.venues.form.statusOptions.maintenance", "Maintenance")
213
222
  })
214
223
  ]
215
224
  })]
216
225
  })
217
226
  ]
218
227
  }),
219
- /* @__PURE__ */ l("label", {
228
+ /* @__PURE__ */ f("label", {
220
229
  className: "block space-y-1 text-sm",
221
- children: [/* @__PURE__ */ c("span", {
230
+ children: [/* @__PURE__ */ d("span", {
222
231
  className: "font-medium text-text-primary",
223
- children: y("eventfullymanaged.venues.form.fields.amenities", "Amenities (comma separated)")
224
- }), /* @__PURE__ */ c(h, {
225
- value: O.amenities,
226
- onChange: (e) => A("amenities", e.target.value),
227
- placeholder: y("eventfullymanaged.venues.form.amenitiesPlaceholder", "wifi, parking, catering")
232
+ children: C("eventfullymanaged.venues.form.fields.amenities", "Amenities (comma separated)")
233
+ }), /* @__PURE__ */ d(v, {
234
+ value: M.amenities,
235
+ onChange: (e) => P("amenities", e.target.value),
236
+ placeholder: C("eventfullymanaged.venues.form.amenitiesPlaceholder", "wifi, parking, catering")
228
237
  })]
229
238
  }),
230
- /* @__PURE__ */ c("div", {
239
+ /* @__PURE__ */ d("div", {
231
240
  className: "flex justify-end",
232
- children: /* @__PURE__ */ l(p, {
241
+ children: /* @__PURE__ */ f(g, {
233
242
  type: "submit",
234
- disabled: M,
235
- children: [/* @__PURE__ */ c(d, { className: "h-4 w-4" }), M ? y("eventfullymanaged.venues.form.actions.saving", "Saving...") : y("eventfullymanaged.venues.form.actions.save", "Save Venue")]
243
+ disabled: I,
244
+ children: [/* @__PURE__ */ d(m, { className: "h-4 w-4" }), I ? C("eventfullymanaged.venues.form.actions.saving", "Saving...") : C("eventfullymanaged.venues.form.actions.save", "Save Venue")]
236
245
  })
237
246
  })
238
247
  ]
239
- })
240
- })]
248
+ }) })
249
+ ]
241
250
  });
242
251
  }
243
252
  //#endregion
244
- export { v as default };
253
+ export { S as default };
245
254
 
246
255
  //# sourceMappingURL=VenueFormPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VenueFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Save } from 'lucide-react';\nimport { Button, GlassCard, Input, Textarea } from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateVenueMutation, useUpdateVenueMutation, useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueFormState = {\n name: string;\n description: string;\n addressLine1: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n capacity: string;\n amenities: string;\n status: string;\n};\n\nconst initialState: VenueFormState = {\n name: '',\n description: '',\n addressLine1: '',\n city: '',\n state: '',\n country: 'India',\n postalCode: '',\n capacity: '',\n amenities: '',\n status: 'ACTIVE',\n};\n\nexport default function VenueFormPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useEventfullyManaged();\n const { data } = useVenueQuery(id);\n const [createVenue, { loading: creating }] = useCreateVenueMutation();\n const [updateVenue, { loading: updating }] = useUpdateVenueMutation();\n const [form, setForm] = useState<VenueFormState>(initialState);\n\n useEffect(() => {\n if (!isEdit || !data?.venue) {\n return;\n }\n setForm({\n name: data.venue.name ?? '',\n description: data.venue.description ?? '',\n addressLine1: data.venue.addressLine1 ?? '',\n city: data.venue.city ?? '',\n state: data.venue.state ?? '',\n country: data.venue.country ?? 'India',\n postalCode: data.venue.postalCode ?? '',\n capacity: data.venue.capacity ? String(data.venue.capacity) : '',\n amenities: (data.venue.amenities ?? []).join(', '),\n status: data.venue.status ?? 'ACTIVE',\n });\n }, [data, isEdit]);\n\n const onChange = (field: keyof VenueFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const payload = {\n name: form.name,\n description: form.description,\n addressLine1: form.addressLine1,\n city: form.city,\n state: form.state,\n country: form.country,\n postalCode: form.postalCode,\n capacity: form.capacity ? Number(form.capacity) : null,\n amenities: form.amenities\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean),\n status: form.status,\n pricing: {},\n openingHours: {},\n metadata: {},\n };\n\n if (isEdit) {\n await updateVenue({ variables: { id, input: payload } });\n navigate(`/venues/${id}`);\n return;\n }\n\n const response = await createVenue({ variables: { input: payload } });\n const createdId = response.data?.createVenue?.id;\n navigate(createdId ? `/venues/${createdId}` : '/venues');\n };\n\n const isSaving = creating || updating;\n const selectClass =\n 'w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors focus-visible:border-border-focus focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)] focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]';\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n {t('eventfullymanaged.venues.form.backToVenues', 'Back to Venues')}\n </Button>\n <h1 className=\"mt-3 text-2xl font-bold text-text-primary\">\n {isEdit\n ? t('eventfullymanaged.venues.form.editTitle', 'Edit Venue')\n : t('eventfullymanaged.venues.form.createTitle', 'Create Venue')}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.venues.form.description', 'Manage venue details with live backend persistence.')}\n </p>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.name', 'Name')}\n </span>\n <Input value={form.name} onChange={(e) => onChange('name', e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.capacity', 'Capacity')}\n </span>\n <Input\n value={form.capacity}\n onChange={(e) => onChange('capacity', e.target.value)}\n type=\"number\"\n min=\"0\"\n />\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.description', 'Description')}\n </span>\n <Textarea value={form.description} onChange={(e) => onChange('description', e.target.value)} rows={3} />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-4\">\n <label className=\"space-y-1 text-sm md:col-span-2\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.address', 'Address')}\n </span>\n <Input value={form.addressLine1} onChange={(e) => onChange('addressLine1', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.city', 'City')}\n </span>\n <Input value={form.city} onChange={(e) => onChange('city', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.state', 'State')}\n </span>\n <Input value={form.state} onChange={(e) => onChange('state', e.target.value)} />\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\">\n {t('eventfullymanaged.venues.form.fields.country', 'Country')}\n </span>\n <Input value={form.country} onChange={(e) => onChange('country', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.postalCode', 'Postal Code')}\n </span>\n <Input value={form.postalCode} onChange={(e) => onChange('postalCode', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.status', 'Status')}\n </span>\n <select value={form.status} onChange={(e) => onChange('status', e.target.value)} className={selectClass}>\n <option value=\"ACTIVE\">{t('eventfullymanaged.venues.form.statusOptions.active', 'Active')}</option>\n <option value=\"INACTIVE\">\n {t('eventfullymanaged.venues.form.statusOptions.inactive', 'Inactive')}\n </option>\n <option value=\"MAINTENANCE\">\n {t('eventfullymanaged.venues.form.statusOptions.maintenance', 'Maintenance')}\n </option>\n </select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.amenities', 'Amenities (comma separated)')}\n </span>\n <Input\n value={form.amenities}\n onChange={(e) => onChange('amenities', e.target.value)}\n placeholder={t('eventfullymanaged.venues.form.amenitiesPlaceholder', 'wifi, parking, catering')}\n />\n </label>\n\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSaving}>\n <Save className=\"h-4 w-4\" />\n {isSaving\n ? t('eventfullymanaged.venues.form.actions.saving', 'Saving...')\n : t('eventfullymanaged.venues.form.actions.save', 'Save Venue')}\n </Button>\n </div>\n </form>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VenueFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Save } from 'lucide-react';\nimport { Button, EmphasisPanel, Input, PagePurpose, Textarea } from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateVenueMutation, useUpdateVenueMutation, useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype VenueFormState = {\n name: string;\n description: string;\n addressLine1: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n capacity: string;\n amenities: string;\n status: string;\n};\n\nconst initialState: VenueFormState = {\n name: '',\n description: '',\n addressLine1: '',\n city: '',\n state: '',\n country: 'India',\n postalCode: '',\n capacity: '',\n amenities: '',\n status: 'ACTIVE',\n};\n\nexport default function VenueFormPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useEventfullyManaged();\n const { data } = useVenueQuery(id);\n const [createVenue, { loading: creating }] = useCreateVenueMutation();\n const [updateVenue, { loading: updating }] = useUpdateVenueMutation();\n const [form, setForm] = useState<VenueFormState>(initialState);\n\n useEffect(() => {\n if (!isEdit || !data?.venue) {\n return;\n }\n setForm({\n name: data.venue.name ?? '',\n description: data.venue.description ?? '',\n addressLine1: data.venue.addressLine1 ?? '',\n city: data.venue.city ?? '',\n state: data.venue.state ?? '',\n country: data.venue.country ?? 'India',\n postalCode: data.venue.postalCode ?? '',\n capacity: data.venue.capacity ? String(data.venue.capacity) : '',\n amenities: (data.venue.amenities ?? []).join(', '),\n status: data.venue.status ?? 'ACTIVE',\n });\n }, [data, isEdit]);\n\n const onChange = (field: keyof VenueFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const payload = {\n name: form.name,\n description: form.description,\n addressLine1: form.addressLine1,\n city: form.city,\n state: form.state,\n country: form.country,\n postalCode: form.postalCode,\n capacity: form.capacity ? Number(form.capacity) : null,\n amenities: form.amenities\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean),\n status: form.status,\n pricing: {},\n openingHours: {},\n metadata: {},\n };\n\n try {\n if (isEdit) {\n const response = await updateVenue({ variables: { id, input: payload } });\n if (!mutationSucceeded(response, response.data?.updateVenue?.id, 'Could not update venue')) {\n return;\n }\n navigate(`/venues/${id}`);\n return;\n }\n\n const response = await createVenue({ variables: { input: payload } });\n const createdId = response.data?.createVenue?.id;\n if (!mutationSucceeded(response, createdId, 'Could not create venue')) {\n return;\n }\n navigate(`/venues/${createdId}`);\n } catch (error) {\n notify.error('Could not save venue', describeError(error));\n }\n };\n\n const isSaving = creating || updating;\n const selectClass =\n 'w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors focus-visible:border-border-focus focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)] focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]';\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n {t('eventfullymanaged.venues.form.backToVenues', 'Back to Venues')}\n </Button>\n <h1 className=\"mt-3 text-2xl font-bold text-text-primary\">\n {isEdit\n ? t('eventfullymanaged.venues.form.editTitle', 'Edit Venue')\n : t('eventfullymanaged.venues.form.createTitle', 'Create Venue')}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.venues.form.description', 'Manage venue details with live backend persistence.')}\n </p>\n </div>\n\n <PagePurpose>\n {t(\n 'eventfullymanaged.venues.form.purpose',\n 'Describe a space so you can reuse it across events. Capacity drives how many attendees you can register, the address helps people find it, and amenities tell organizers what is already provided. Fill this in once and every future event can simply point at this venue.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.name', 'Name')}\n </span>\n <Input value={form.name} onChange={(e) => onChange('name', e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.capacity', 'Capacity')}\n </span>\n <Input\n value={form.capacity}\n onChange={(e) => onChange('capacity', e.target.value)}\n type=\"number\"\n min=\"0\"\n />\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.description', 'Description')}\n </span>\n <Textarea value={form.description} onChange={(e) => onChange('description', e.target.value)} rows={3} />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-4\">\n <label className=\"space-y-1 text-sm md:col-span-2\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.address', 'Address')}\n </span>\n <Input value={form.addressLine1} onChange={(e) => onChange('addressLine1', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.city', 'City')}\n </span>\n <Input value={form.city} onChange={(e) => onChange('city', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.state', 'State')}\n </span>\n <Input value={form.state} onChange={(e) => onChange('state', e.target.value)} />\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\">\n {t('eventfullymanaged.venues.form.fields.country', 'Country')}\n </span>\n <Input value={form.country} onChange={(e) => onChange('country', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.postalCode', 'Postal Code')}\n </span>\n <Input value={form.postalCode} onChange={(e) => onChange('postalCode', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.status', 'Status')}\n </span>\n <select value={form.status} onChange={(e) => onChange('status', e.target.value)} className={selectClass}>\n <option value=\"ACTIVE\">{t('eventfullymanaged.venues.form.statusOptions.active', 'Active')}</option>\n <option value=\"INACTIVE\">\n {t('eventfullymanaged.venues.form.statusOptions.inactive', 'Inactive')}\n </option>\n <option value=\"MAINTENANCE\">\n {t('eventfullymanaged.venues.form.statusOptions.maintenance', 'Maintenance')}\n </option>\n </select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">\n {t('eventfullymanaged.venues.form.fields.amenities', 'Amenities (comma separated)')}\n </span>\n <Input\n value={form.amenities}\n onChange={(e) => onChange('amenities', e.target.value)}\n placeholder={t('eventfullymanaged.venues.form.amenitiesPlaceholder', 'wifi, parking, catering')}\n />\n </label>\n\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSaving}>\n <Save className=\"h-4 w-4\" />\n {isSaving\n ? t('eventfullymanaged.venues.form.actions.saving', 'Saving...')\n : t('eventfullymanaged.venues.form.actions.save', 'Save Venue')}\n </Button>\n </div>\n </form>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -3,18 +3,19 @@ import { useVenuesQuery as t } from "../../api/eventApi.js";
3
3
  import { useMemo as n, useState as r } from "react";
4
4
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { Building2 as o, MapPin as s, Plus as c, Search as l, Users as u } from "lucide-react";
6
- import { Badge as d, Button as f, GlassCard as p, IllustratedEmptyState as m, Input as h } from "@burdenoff/fe-libs/ui";
6
+ import { Badge as d, Button as f, EmphasisPanel as p, GlassCard as m, IllustratedEmptyState as h, Input as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/eventfullymanaged/pages/venues/VenueListPage.tsx
8
- function g() {
9
- let { navigate: g } = e(), [_, v] = r(""), { data: y, loading: b } = t({
10
- search: _,
8
+ function v() {
9
+ let { navigate: v } = e(), [y, b] = r(""), { data: x, loading: S } = t({
10
+ search: y,
11
11
  limit: 100,
12
12
  offset: 0
13
- }), x = n(() => y?.venues?.items ?? [], [y]);
13
+ }), C = n(() => x?.venues?.items ?? [], [x]);
14
14
  return /* @__PURE__ */ a("div", {
15
15
  className: "space-y-6 p-6",
16
16
  children: [
17
- /* @__PURE__ */ a("div", {
17
+ /* @__PURE__ */ i(_, { children: "Venues are the physical (or virtual) spaces where your events happen. Catalog them once — with capacity, location, amenities and floor plans — and reuse them across events. Start here when you are scouting or onboarding a new space to host an event." }),
18
+ /* @__PURE__ */ a(p, {
18
19
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
19
20
  children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
20
21
  className: "text-2xl font-bold text-text-primary",
@@ -24,48 +25,48 @@ function g() {
24
25
  children: "Browse and manage event venues using live backend data."
25
26
  })] }), /* @__PURE__ */ a(f, {
26
27
  type: "button",
27
- onClick: () => g("/venues/create"),
28
+ onClick: () => v("/venues/create"),
28
29
  children: [/* @__PURE__ */ i(c, { className: "h-4 w-4" }), "Add Venue"]
29
30
  })]
30
31
  }),
31
32
  /* @__PURE__ */ a("div", {
32
33
  className: "relative",
33
- children: [/* @__PURE__ */ i(l, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i(h, {
34
+ children: [/* @__PURE__ */ i(l, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i(g, {
34
35
  type: "text",
35
- value: _,
36
- onChange: (e) => v(e.target.value),
36
+ value: y,
37
+ onChange: (e) => b(e.target.value),
37
38
  placeholder: "Search venues by name or location",
38
39
  "aria-label": "Search venues by name or location",
39
40
  className: "pl-10"
40
41
  })]
41
42
  }),
42
- b ? /* @__PURE__ */ i(p, {
43
+ S ? /* @__PURE__ */ i(m, {
43
44
  treatment: "plain",
44
45
  className: "border-border-seam p-8 text-center text-sm text-text-secondary",
45
46
  children: "Loading venues..."
46
- }) : x.length === 0 ? /* @__PURE__ */ i(p, {
47
+ }) : C.length === 0 ? /* @__PURE__ */ i(m, {
47
48
  treatment: "plain",
48
49
  className: "border-border-seam",
49
- children: /* @__PURE__ */ i(m, {
50
- illustration: _ ? "empty-search" : "empty-data",
51
- title: _ ? "No venues match your search." : "No venues yet.",
52
- description: _ ? "Try a different name or location." : "Add your first venue to start mapping events to spaces.",
53
- action: _ ? void 0 : /* @__PURE__ */ a(f, {
50
+ children: /* @__PURE__ */ i(h, {
51
+ illustration: y ? "empty-search" : "empty-data",
52
+ title: y ? "No venues match your search." : "No venues yet.",
53
+ description: y ? "Try a different name or location." : "Add your first venue to start mapping events to spaces.",
54
+ action: y ? void 0 : /* @__PURE__ */ a(f, {
54
55
  type: "button",
55
- onClick: () => g("/venues/create"),
56
+ onClick: () => v("/venues/create"),
56
57
  children: [/* @__PURE__ */ i(c, { className: "h-4 w-4" }), "Add Venue"]
57
58
  })
58
59
  })
59
60
  }) : /* @__PURE__ */ i("div", {
60
61
  className: "grid grid-cols-1 gap-4 lg:grid-cols-2",
61
- children: x.map((e) => /* @__PURE__ */ a(p, {
62
+ children: C.map((e) => /* @__PURE__ */ a(m, {
62
63
  treatment: "plain",
63
64
  role: "button",
64
65
  tabIndex: 0,
65
66
  "aria-label": `Open ${e.name}`,
66
- onClick: () => g(`/venues/${e.id}`),
67
+ onClick: () => v(`/venues/${e.id}`),
67
68
  onKeyDown: (t) => {
68
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), g(`/venues/${e.id}`));
69
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), v(`/venues/${e.id}`));
69
70
  },
70
71
  className: "cursor-pointer border-border-seam p-5 text-left outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
71
72
  children: [/* @__PURE__ */ a("div", {
@@ -117,6 +118,6 @@ function g() {
117
118
  });
118
119
  }
119
120
  //#endregion
120
- export { g as default };
121
+ export { v as default };
121
122
 
122
123
  //# sourceMappingURL=VenueListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VenueListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueListPage.tsx"],"sourcesContent":["import { Building2, MapPin, Plus, Search, Users } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState, Input } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useVenuesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueItem = {\n id: string;\n name: string;\n description?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n};\n\nexport default function VenueListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useVenuesQuery({ search, limit: 100, offset: 0 });\n\n const venues = useMemo(() => (data?.venues?.items ?? []) as VenueItem[], [data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Venues</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Browse and manage event venues using live backend data.</p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/venues/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Venue\n </Button>\n </div>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Search venues by name or location\"\n aria-label=\"Search venues by name or location\"\n className=\"pl-10\"\n />\n </div>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading venues...\n </GlassCard>\n ) : venues.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-data'}\n title={search ? 'No venues match your search.' : 'No venues yet.'}\n description={\n search ? 'Try a different name or location.' : 'Add your first venue to start mapping events to spaces.'\n }\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/venues/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Venue\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n {venues.map((venue) => (\n <GlassCard\n key={venue.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${venue.name}`}\n onClick={() => navigate(`/venues/${venue.id}`)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(`/venues/${venue.id}`);\n }\n }}\n className=\"cursor-pointer border-border-seam p-5 text-left outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{venue.name}</h2>\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">\n {venue.description ?? 'No description available.'}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"shrink-0 uppercase\">\n {venue.status}\n </Badge>\n </div>\n\n <div className=\"mt-4 grid grid-cols-1 gap-2 text-sm text-text-secondary sm:grid-cols-3\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n <span>\n {[venue.city, venue.state, venue.country].filter(Boolean).join(', ') || 'Location not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Users className=\"h-4 w-4\" />\n <span className=\"tabular-nums\">{venue.capacity ?? 0} capacity</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4\" />\n <span className=\"tabular-nums\">{venue.amenities.length} amenities</span>\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VenueListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueListPage.tsx"],"sourcesContent":["import { Building2, MapPin, Plus, Search, Users } from 'lucide-react';\nimport { Badge, Button, EmphasisPanel, GlassCard, IllustratedEmptyState, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useVenuesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueItem = {\n id: string;\n name: string;\n description?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n};\n\nexport default function VenueListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useVenuesQuery({ search, limit: 100, offset: 0 });\n\n const venues = useMemo(() => (data?.venues?.items ?? []) as VenueItem[], [data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Venues are the physical (or virtual) spaces where your events happen. Catalog them once — with capacity,\n location, amenities and floor plans — and reuse them across events. Start here when you are scouting or\n onboarding a new space to host an event.\n </PagePurpose>\n\n <EmphasisPanel className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Venues</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Browse and manage event venues using live backend data.</p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/venues/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Venue\n </Button>\n </EmphasisPanel>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Search venues by name or location\"\n aria-label=\"Search venues by name or location\"\n className=\"pl-10\"\n />\n </div>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading venues...\n </GlassCard>\n ) : venues.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-data'}\n title={search ? 'No venues match your search.' : 'No venues yet.'}\n description={\n search ? 'Try a different name or location.' : 'Add your first venue to start mapping events to spaces.'\n }\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/venues/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Venue\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n {venues.map((venue) => (\n <GlassCard\n key={venue.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${venue.name}`}\n onClick={() => navigate(`/venues/${venue.id}`)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(`/venues/${venue.id}`);\n }\n }}\n className=\"cursor-pointer border-border-seam p-5 text-left outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{venue.name}</h2>\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">\n {venue.description ?? 'No description available.'}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"shrink-0 uppercase\">\n {venue.status}\n </Badge>\n </div>\n\n <div className=\"mt-4 grid grid-cols-1 gap-2 text-sm text-text-secondary sm:grid-cols-3\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n <span>\n {[venue.city, venue.state, venue.country].filter(Boolean).join(', ') || 'Location not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Users className=\"h-4 w-4\" />\n <span className=\"tabular-nums\">{venue.capacity ?? 0} capacity</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4\" />\n <span className=\"tabular-nums\">{venue.amenities.length} amenities</span>\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}