@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.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 (74) hide show
  1. package/dist/eventfullymanaged/EventfullyManagedRoutes.js +154 -66
  2. package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
  3. package/dist/eventfullymanaged/api/eventApi.js +546 -67
  4. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  5. package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
  6. package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
  7. package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
  8. package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
  9. package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
  10. package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
  11. package/dist/eventfullymanaged/components/Pagination.js +84 -0
  12. package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
  13. package/dist/eventfullymanaged/components/SafeLink.js +32 -0
  14. package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
  15. package/dist/eventfullymanaged/components/index.js +7 -0
  16. package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
  17. package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
  18. package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
  19. package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
  20. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
  21. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
  22. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
  23. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
  24. package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
  25. package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
  26. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
  27. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
  28. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
  29. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
  30. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
  31. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
  32. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
  33. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  34. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
  35. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  36. package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
  37. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  38. package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
  39. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  40. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
  41. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  42. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +289 -77
  43. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  44. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
  45. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
  46. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
  47. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  48. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
  49. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  50. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
  51. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
  52. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
  53. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
  54. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
  55. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
  56. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
  57. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
  58. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +414 -0
  59. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
  60. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
  61. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
  62. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
  63. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
  64. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
  65. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  66. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
  67. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  68. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
  69. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  70. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
  71. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  72. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
  73. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  74. package/package.json +1 -1
@@ -1,111 +1,132 @@
1
1
  import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
- import { useVenuesQuery as t } from "../../api/eventApi.js";
3
- import { useMemo as n, useState as r } from "react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
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, EmphasisPanel as p, GlassCard as m, IllustratedEmptyState as h, Input as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useDeleteVenueMutation as n, useVenuesQuery as r } from "../../api/eventApi.js";
4
+ import { ActionMenu as i } from "../../components/ActionMenu.js";
5
+ import { Pagination as a, usePagination as o } from "../../components/Pagination.js";
6
+ import { useMemo as s, useState as c } from "react";
7
+ import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ import { Building2 as f, MapPin as p, Plus as m, Search as h, Users as g } from "lucide-react";
9
+ import { Badge as _, Button as v, EmphasisPanel as y, GlassCard as b, IllustratedEmptyState as x, Input as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
7
10
  //#region src/eventfullymanaged/pages/venues/VenueListPage.tsx
8
- function v() {
9
- let { navigate: v } = e(), [y, b] = r(""), { data: x, loading: S } = t({
10
- search: y,
11
- limit: 100,
12
- offset: 0
13
- }), C = n(() => x?.venues?.items ?? [], [x]);
14
- return /* @__PURE__ */ a("div", {
11
+ function w() {
12
+ let { navigate: w } = e(), [T, E] = c(""), D = o({
13
+ pageSize: 12,
14
+ resetKey: T
15
+ }), { data: O, loading: k, refetch: A } = r({
16
+ search: T,
17
+ limit: D.limit,
18
+ offset: D.offset
19
+ }), [j] = n(), M = s(() => O?.venues?.items ?? [], [O]), N = O?.venues?.total ?? 0, P = async (e) => {
20
+ let n = await j({ variables: { id: e.id } });
21
+ if (n.error) throw Error(n.error.message);
22
+ if (!n.data?.deleteVenue) throw t.error("Could not delete venue", "The server did not confirm the deletion. Please try again."), Error("Deletion not confirmed");
23
+ await A(), t.success("Venue deleted");
24
+ };
25
+ return /* @__PURE__ */ d("div", {
15
26
  className: "space-y-6 p-6",
16
27
  children: [
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, {
28
+ /* @__PURE__ */ u(C, { 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." }),
29
+ /* @__PURE__ */ d(y, {
19
30
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
20
- children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
31
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
21
32
  className: "text-2xl font-bold text-text-primary",
22
33
  children: "Venues"
23
- }), /* @__PURE__ */ i("p", {
34
+ }), /* @__PURE__ */ u("p", {
24
35
  className: "mt-1 text-sm text-text-secondary",
25
36
  children: "Browse and manage event venues using live backend data."
26
- })] }), /* @__PURE__ */ a(f, {
37
+ })] }), /* @__PURE__ */ d(v, {
27
38
  type: "button",
28
- onClick: () => v("/venues/create"),
29
- children: [/* @__PURE__ */ i(c, { className: "h-4 w-4" }), "Add Venue"]
39
+ onClick: () => w("/venues/create"),
40
+ children: [/* @__PURE__ */ u(m, { className: "h-4 w-4" }), "Add Venue"]
30
41
  })]
31
42
  }),
32
- /* @__PURE__ */ a("div", {
43
+ /* @__PURE__ */ d("div", {
33
44
  className: "relative",
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, {
45
+ children: [/* @__PURE__ */ u(h, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ u(S, {
35
46
  type: "text",
36
- value: y,
37
- onChange: (e) => b(e.target.value),
47
+ value: T,
48
+ onChange: (e) => E(e.target.value),
38
49
  placeholder: "Search venues by name or location",
39
50
  "aria-label": "Search venues by name or location",
40
51
  className: "pl-10"
41
52
  })]
42
53
  }),
43
- S ? /* @__PURE__ */ i(m, {
54
+ k ? /* @__PURE__ */ u(b, {
44
55
  treatment: "plain",
45
56
  className: "border-border-seam p-8 text-center text-sm text-text-secondary",
46
57
  children: "Loading venues..."
47
- }) : C.length === 0 ? /* @__PURE__ */ i(m, {
58
+ }) : M.length === 0 ? /* @__PURE__ */ u(b, {
48
59
  treatment: "plain",
49
60
  className: "border-border-seam",
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, {
61
+ children: /* @__PURE__ */ u(x, {
62
+ illustration: T ? "empty-search" : "empty-data",
63
+ title: T ? "No venues match your search." : "No venues yet.",
64
+ description: T ? "Try a different name or location." : "Add your first venue to start mapping events to spaces.",
65
+ action: T ? void 0 : /* @__PURE__ */ d(v, {
55
66
  type: "button",
56
- onClick: () => v("/venues/create"),
57
- children: [/* @__PURE__ */ i(c, { className: "h-4 w-4" }), "Add Venue"]
67
+ onClick: () => w("/venues/create"),
68
+ children: [/* @__PURE__ */ u(m, { className: "h-4 w-4" }), "Add Venue"]
58
69
  })
59
70
  })
60
- }) : /* @__PURE__ */ i("div", {
71
+ }) : /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("div", {
61
72
  className: "grid grid-cols-1 gap-4 lg:grid-cols-2",
62
- children: C.map((e) => /* @__PURE__ */ a(m, {
73
+ children: M.map((e) => /* @__PURE__ */ d(b, {
63
74
  treatment: "plain",
64
75
  role: "button",
65
76
  tabIndex: 0,
66
77
  "aria-label": `Open ${e.name}`,
67
- onClick: () => v(`/venues/${e.id}`),
78
+ onClick: () => w(`/venues/${e.id}`),
68
79
  onKeyDown: (t) => {
69
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), v(`/venues/${e.id}`));
80
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), w(`/venues/${e.id}`));
70
81
  },
71
82
  className: "cursor-pointer border-border-seam p-5 text-left outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
72
- children: [/* @__PURE__ */ a("div", {
83
+ children: [/* @__PURE__ */ d("div", {
73
84
  className: "flex items-start justify-between gap-4",
74
- children: [/* @__PURE__ */ a("div", {
85
+ children: [/* @__PURE__ */ d("div", {
75
86
  className: "min-w-0",
76
- children: [/* @__PURE__ */ i("h2", {
87
+ children: [/* @__PURE__ */ u("h2", {
77
88
  className: "text-lg font-semibold text-text-primary",
78
89
  children: e.name
79
- }), /* @__PURE__ */ i("p", {
90
+ }), /* @__PURE__ */ u("p", {
80
91
  className: "mt-1 line-clamp-2 text-sm text-text-secondary",
81
92
  children: e.description ?? "No description available."
82
93
  })]
83
- }), /* @__PURE__ */ i(d, {
84
- variant: "secondary",
85
- className: "shrink-0 uppercase",
86
- children: e.status
94
+ }), /* @__PURE__ */ d("div", {
95
+ className: "flex shrink-0 items-center gap-2",
96
+ children: [/* @__PURE__ */ u(_, {
97
+ variant: "secondary",
98
+ className: "uppercase",
99
+ children: e.status
100
+ }), /* @__PURE__ */ u(i, {
101
+ ariaLabel: `Actions for ${e.name}`,
102
+ entityName: e.name,
103
+ onView: () => w(`/venues/${e.id}`),
104
+ onEdit: () => w(`/venues/${e.id}/edit`),
105
+ onDelete: () => P(e),
106
+ deleteLabel: "Delete venue"
107
+ })]
87
108
  })]
88
- }), /* @__PURE__ */ a("div", {
109
+ }), /* @__PURE__ */ d("div", {
89
110
  className: "mt-4 grid grid-cols-1 gap-2 text-sm text-text-secondary sm:grid-cols-3",
90
111
  children: [
91
- /* @__PURE__ */ a("div", {
112
+ /* @__PURE__ */ d("div", {
92
113
  className: "flex items-center gap-2",
93
- children: [/* @__PURE__ */ i(s, { className: "h-4 w-4" }), /* @__PURE__ */ i("span", { children: [
114
+ children: [/* @__PURE__ */ u(p, { className: "h-4 w-4" }), /* @__PURE__ */ u("span", { children: [
94
115
  e.city,
95
116
  e.state,
96
117
  e.country
97
118
  ].filter(Boolean).join(", ") || "Location not set" })]
98
119
  }),
99
- /* @__PURE__ */ a("div", {
120
+ /* @__PURE__ */ d("div", {
100
121
  className: "flex items-center gap-2",
101
- children: [/* @__PURE__ */ i(u, { className: "h-4 w-4" }), /* @__PURE__ */ a("span", {
122
+ children: [/* @__PURE__ */ u(g, { className: "h-4 w-4" }), /* @__PURE__ */ d("span", {
102
123
  className: "tabular-nums",
103
124
  children: [e.capacity ?? 0, " capacity"]
104
125
  })]
105
126
  }),
106
- /* @__PURE__ */ a("div", {
127
+ /* @__PURE__ */ d("div", {
107
128
  className: "flex items-center gap-2",
108
- children: [/* @__PURE__ */ i(o, { className: "h-4 w-4" }), /* @__PURE__ */ a("span", {
129
+ children: [/* @__PURE__ */ u(f, { className: "h-4 w-4" }), /* @__PURE__ */ d("span", {
109
130
  className: "tabular-nums",
110
131
  children: [e.amenities.length, " amenities"]
111
132
  })]
@@ -113,11 +134,20 @@ function v() {
113
134
  ]
114
135
  })]
115
136
  }, e.id))
116
- })
137
+ }), /* @__PURE__ */ u(a, {
138
+ offset: D.offset,
139
+ limit: D.limit,
140
+ loadedCount: M.length,
141
+ total: N,
142
+ onPrev: D.prevPage,
143
+ onNext: D.nextPage,
144
+ itemLabel: "venues",
145
+ loading: k
146
+ })] })
117
147
  ]
118
148
  });
119
149
  }
120
150
  //#endregion
121
- export { v as default };
151
+ export { w as default };
122
152
 
123
153
  //# 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 {\n Badge,\n Button,\n EmphasisPanel,\n GlassCard,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} 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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"}
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 {\n Badge,\n Button,\n EmphasisPanel,\n GlassCard,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useDeleteVenueMutation, useVenuesQuery } from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { notify } from '../../lib/toast';\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 pagination = usePagination({ pageSize: 12, resetKey: search });\n const { data, loading, refetch } = useVenuesQuery({\n search,\n limit: pagination.limit,\n offset: pagination.offset,\n });\n const [deleteVenue] = useDeleteVenueMutation();\n\n const venues = useMemo(() => (data?.venues?.items ?? []) as VenueItem[], [data]);\n const total = data?.venues?.total ?? 0;\n\n const handleDelete = async (venue: VenueItem) => {\n const response = await deleteVenue({ variables: { id: venue.id } });\n if (response.error) {\n // useDeleteVenueMutation.onError already surfaces the toast; keep the\n // confirm dialog open so the user can retry.\n throw new Error(response.error.message);\n }\n if (!response.data?.deleteVenue) {\n notify.error('Could not delete venue', 'The server did not confirm the deletion. Please try again.');\n throw new Error('Deletion not confirmed');\n }\n await refetch();\n notify.success('Venue deleted');\n };\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 <>\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 <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant=\"secondary\" className=\"uppercase\">\n {venue.status}\n </Badge>\n <ActionMenu\n ariaLabel={`Actions for ${venue.name}`}\n entityName={venue.name}\n onView={() => navigate(`/venues/${venue.id}`)}\n onEdit={() => navigate(`/venues/${venue.id}/edit`)}\n onDelete={() => handleDelete(venue)}\n deleteLabel=\"Delete venue\"\n />\n </div>\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 <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={venues.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"venues\"\n loading={loading}\n />\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-eventfullymanaged",
3
- "version": "2026.703.2",
3
+ "version": "2026.704.1",
4
4
  "description": "EventfullyManaged - End-to-end event management platform",
5
5
  "type": "module",
6
6
  "files": [