@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.
- package/dist/eventfullymanaged/api/eventApi.js +83 -38
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
- package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
- package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
- package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
- package/dist/eventfullymanaged/lib/toast.js +36 -0
- package/dist/eventfullymanaged/lib/toast.js.map +1 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +63 -51
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +137 -78
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -45
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +89 -52
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +73 -24
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +132 -77
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +81 -48
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +161 -133
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +103 -61
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +156 -147
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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
|
|
23
|
-
let { t:
|
|
24
|
-
let n =
|
|
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:
|
|
27
|
-
|
|
28
|
-
!
|
|
29
|
-
name:
|
|
30
|
-
description:
|
|
31
|
-
addressLine1:
|
|
32
|
-
city:
|
|
33
|
-
state:
|
|
34
|
-
country:
|
|
35
|
-
postalCode:
|
|
36
|
-
capacity:
|
|
37
|
-
amenities: (
|
|
38
|
-
status:
|
|
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
|
-
}, [
|
|
41
|
-
let
|
|
42
|
-
|
|
42
|
+
}, [D, T]);
|
|
43
|
+
let P = (e, t) => {
|
|
44
|
+
N((n) => ({
|
|
43
45
|
...n,
|
|
44
46
|
[e]: t
|
|
45
47
|
}));
|
|
46
|
-
},
|
|
48
|
+
}, F = async (e) => {
|
|
47
49
|
e.preventDefault();
|
|
48
|
-
let
|
|
49
|
-
name:
|
|
50
|
-
description:
|
|
51
|
-
addressLine1:
|
|
52
|
-
city:
|
|
53
|
-
state:
|
|
54
|
-
country:
|
|
55
|
-
postalCode:
|
|
56
|
-
capacity:
|
|
57
|
-
amenities:
|
|
58
|
-
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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: [
|
|
76
|
-
/* @__PURE__ */
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
children: /* @__PURE__ */
|
|
95
|
-
onSubmit:
|
|
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__ */
|
|
107
|
+
/* @__PURE__ */ f("div", {
|
|
99
108
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
109
|
+
children: [/* @__PURE__ */ f("label", {
|
|
101
110
|
className: "space-y-1 text-sm",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ d("span", {
|
|
103
112
|
className: "font-medium text-text-primary",
|
|
104
|
-
children:
|
|
105
|
-
}), /* @__PURE__ */
|
|
106
|
-
value:
|
|
107
|
-
onChange: (e) =>
|
|
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__ */
|
|
119
|
+
}), /* @__PURE__ */ f("label", {
|
|
111
120
|
className: "space-y-1 text-sm",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
121
|
+
children: [/* @__PURE__ */ d("span", {
|
|
113
122
|
className: "font-medium text-text-primary",
|
|
114
|
-
children:
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
-
value:
|
|
117
|
-
onChange: (e) =>
|
|
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__ */
|
|
132
|
+
/* @__PURE__ */ f("label", {
|
|
124
133
|
className: "block space-y-1 text-sm",
|
|
125
|
-
children: [/* @__PURE__ */
|
|
134
|
+
children: [/* @__PURE__ */ d("span", {
|
|
126
135
|
className: "font-medium text-text-primary",
|
|
127
|
-
children:
|
|
128
|
-
}), /* @__PURE__ */
|
|
129
|
-
value:
|
|
130
|
-
onChange: (e) =>
|
|
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__ */
|
|
143
|
+
/* @__PURE__ */ f("div", {
|
|
135
144
|
className: "grid grid-cols-1 gap-4 md:grid-cols-4",
|
|
136
145
|
children: [
|
|
137
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ f("label", {
|
|
138
147
|
className: "space-y-1 text-sm md:col-span-2",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
148
|
+
children: [/* @__PURE__ */ d("span", {
|
|
140
149
|
className: "font-medium text-text-primary",
|
|
141
|
-
children:
|
|
142
|
-
}), /* @__PURE__ */
|
|
143
|
-
value:
|
|
144
|
-
onChange: (e) =>
|
|
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__ */
|
|
156
|
+
/* @__PURE__ */ f("label", {
|
|
148
157
|
className: "space-y-1 text-sm",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
158
|
+
children: [/* @__PURE__ */ d("span", {
|
|
150
159
|
className: "font-medium text-text-primary",
|
|
151
|
-
children:
|
|
152
|
-
}), /* @__PURE__ */
|
|
153
|
-
value:
|
|
154
|
-
onChange: (e) =>
|
|
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__ */
|
|
166
|
+
/* @__PURE__ */ f("label", {
|
|
158
167
|
className: "space-y-1 text-sm",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
168
|
+
children: [/* @__PURE__ */ d("span", {
|
|
160
169
|
className: "font-medium text-text-primary",
|
|
161
|
-
children:
|
|
162
|
-
}), /* @__PURE__ */
|
|
163
|
-
value:
|
|
164
|
-
onChange: (e) =>
|
|
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__ */
|
|
178
|
+
/* @__PURE__ */ f("div", {
|
|
170
179
|
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
171
180
|
children: [
|
|
172
|
-
/* @__PURE__ */
|
|
181
|
+
/* @__PURE__ */ f("label", {
|
|
173
182
|
className: "space-y-1 text-sm",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
183
|
+
children: [/* @__PURE__ */ d("span", {
|
|
175
184
|
className: "font-medium text-text-primary",
|
|
176
|
-
children:
|
|
177
|
-
}), /* @__PURE__ */
|
|
178
|
-
value:
|
|
179
|
-
onChange: (e) =>
|
|
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__ */
|
|
191
|
+
/* @__PURE__ */ f("label", {
|
|
183
192
|
className: "space-y-1 text-sm",
|
|
184
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ d("span", {
|
|
185
194
|
className: "font-medium text-text-primary",
|
|
186
|
-
children:
|
|
187
|
-
}), /* @__PURE__ */
|
|
188
|
-
value:
|
|
189
|
-
onChange: (e) =>
|
|
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__ */
|
|
201
|
+
/* @__PURE__ */ f("label", {
|
|
193
202
|
className: "space-y-1 text-sm",
|
|
194
|
-
children: [/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ d("span", {
|
|
195
204
|
className: "font-medium text-text-primary",
|
|
196
|
-
children:
|
|
197
|
-
}), /* @__PURE__ */
|
|
198
|
-
value:
|
|
199
|
-
onChange: (e) =>
|
|
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__ */
|
|
211
|
+
/* @__PURE__ */ d("option", {
|
|
203
212
|
value: "ACTIVE",
|
|
204
|
-
children:
|
|
213
|
+
children: C("eventfullymanaged.venues.form.statusOptions.active", "Active")
|
|
205
214
|
}),
|
|
206
|
-
/* @__PURE__ */
|
|
215
|
+
/* @__PURE__ */ d("option", {
|
|
207
216
|
value: "INACTIVE",
|
|
208
|
-
children:
|
|
217
|
+
children: C("eventfullymanaged.venues.form.statusOptions.inactive", "Inactive")
|
|
209
218
|
}),
|
|
210
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ d("option", {
|
|
211
220
|
value: "MAINTENANCE",
|
|
212
|
-
children:
|
|
221
|
+
children: C("eventfullymanaged.venues.form.statusOptions.maintenance", "Maintenance")
|
|
213
222
|
})
|
|
214
223
|
]
|
|
215
224
|
})]
|
|
216
225
|
})
|
|
217
226
|
]
|
|
218
227
|
}),
|
|
219
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ f("label", {
|
|
220
229
|
className: "block space-y-1 text-sm",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ d("span", {
|
|
222
231
|
className: "font-medium text-text-primary",
|
|
223
|
-
children:
|
|
224
|
-
}), /* @__PURE__ */
|
|
225
|
-
value:
|
|
226
|
-
onChange: (e) =>
|
|
227
|
-
placeholder:
|
|
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__ */
|
|
239
|
+
/* @__PURE__ */ d("div", {
|
|
231
240
|
className: "flex justify-end",
|
|
232
|
-
children: /* @__PURE__ */
|
|
241
|
+
children: /* @__PURE__ */ f(g, {
|
|
233
242
|
type: "submit",
|
|
234
|
-
disabled:
|
|
235
|
-
children: [/* @__PURE__ */
|
|
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 {
|
|
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,
|
|
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
|
|
9
|
-
let { navigate:
|
|
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
|
-
}),
|
|
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__ */
|
|
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: () =>
|
|
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(
|
|
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) =>
|
|
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
|
-
|
|
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
|
-
}) :
|
|
47
|
+
}) : C.length === 0 ? /* @__PURE__ */ i(m, {
|
|
47
48
|
treatment: "plain",
|
|
48
49
|
className: "border-border-seam",
|
|
49
|
-
children: /* @__PURE__ */ i(
|
|
50
|
-
illustration:
|
|
51
|
-
title:
|
|
52
|
-
description:
|
|
53
|
-
action:
|
|
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: () =>
|
|
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:
|
|
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: () =>
|
|
67
|
+
onClick: () => v(`/venues/${e.id}`),
|
|
67
68
|
onKeyDown: (t) => {
|
|
68
|
-
(t.key === "Enter" || t.key === " ") && (t.preventDefault(),
|
|
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 {
|
|
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 <
|
|
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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"}
|