@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 +1 @@
1
- {"version":3,"file":"SponsorsListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx"],"sourcesContent":["import { Building2, Mail, Phone, Plus, Search } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState, Input } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype SponsorItem = {\n id: string;\n eventId: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n metrics?: { value?: number; leads?: number } | null;\n};\n\nexport default function SponsorsListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useSponsorsQuery({ search, limit: 100, offset: 0 });\n\n const sponsors = useMemo(() => (data?.sponsors?.items ?? []) as SponsorItem[], [data]);\n\n const totalValue = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.value ?? 0), 0);\n const totalLeads = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.leads ?? 0), 0);\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\">Sponsors</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Manage event sponsors with live API data.</p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Sponsors</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{sponsors.length}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Contract Value</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">${totalValue.toLocaleString()}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Leads</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{totalLeads.toLocaleString()}</p>\n </GlassCard>\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 sponsors\"\n aria-label=\"Search sponsors\"\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 sponsors...\n </GlassCard>\n ) : sponsors.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-people'}\n title={search ? 'No sponsors match your search.' : 'No sponsors yet.'}\n description={search ? 'Try a different name.' : 'Add your first sponsor to start tracking value and leads.'}\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"space-y-4\">\n {sponsors.map((sponsor) => (\n <GlassCard key={sponsor.id} treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <button\n type=\"button\"\n onClick={() => navigate(`/sponsors/${sponsor.id}/edit`)}\n className=\"rounded-button text-left text-lg font-semibold text-text-primary transition-colors hover:text-text-link focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {sponsor.name}\n </button>\n <div className=\"mt-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building2 className=\"h-4 w-4\" />\n <Badge variant=\"secondary\" className=\"uppercase\">\n {sponsor.level}\n </Badge>\n </div>\n </div>\n <div className=\"text-sm tabular-nums text-text-secondary\">\n <p>Value: ${Number(sponsor.metrics?.value ?? 0).toLocaleString()}</p>\n <p>Leads: {Number(sponsor.metrics?.leads ?? 0).toLocaleString()}</p>\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 <Mail className=\"h-4 w-4\" />\n <span>{sponsor.contactEmail ?? 'No email'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4\" />\n <span>{sponsor.contactPhone ?? 'No phone'}</span>\n </div>\n <div>\n {sponsor.website ? (\n <a\n href={sponsor.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-text-link hover:underline\"\n >\n {sponsor.website}\n </a>\n ) : (\n 'No website'\n )}\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SponsorsListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx"],"sourcesContent":["import { Building2, Mail, Phone, Plus, Search } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype SponsorItem = {\n id: string;\n eventId: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n metrics?: { value?: number; leads?: number } | null;\n};\n\nexport default function SponsorsListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useSponsorsQuery({ search, limit: 100, offset: 0 });\n\n const sponsors = useMemo(() => (data?.sponsors?.items ?? []) as SponsorItem[], [data]);\n\n const totalValue = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.value ?? 0), 0);\n const totalLeads = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.leads ?? 0), 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Sponsors fund your event in exchange for visibility and leads. Track each one here — their tier, the contract\n value they bring, and the leads they generate — so you can prove ROI and keep the relationship warm for next\n time. The highlighted cards summarize your sponsor portfolio at a glance.\n </PagePurpose>\n\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\">Sponsors</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Manage event sponsors with live API data.</p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Sponsors</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{sponsors.length}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Contract Value</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">${totalValue.toLocaleString()}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Leads</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{totalLeads.toLocaleString()}</p>\n </GlassCard>\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 sponsors\"\n aria-label=\"Search sponsors\"\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 sponsors...\n </GlassCard>\n ) : sponsors.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-people'}\n title={search ? 'No sponsors match your search.' : 'No sponsors yet.'}\n description={search ? 'Try a different name.' : 'Add your first sponsor to start tracking value and leads.'}\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"space-y-4\">\n {sponsors.map((sponsor) => (\n <GlassCard key={sponsor.id} treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <button\n type=\"button\"\n onClick={() => navigate(`/sponsors/${sponsor.id}/edit`)}\n className=\"rounded-button text-left text-lg font-semibold text-text-primary transition-colors hover:text-text-link focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {sponsor.name}\n </button>\n <div className=\"mt-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building2 className=\"h-4 w-4\" />\n <Badge variant=\"secondary\" className=\"uppercase\">\n {sponsor.level}\n </Badge>\n </div>\n </div>\n <div className=\"text-sm tabular-nums text-text-secondary\">\n <p>Value: ${Number(sponsor.metrics?.value ?? 0).toLocaleString()}</p>\n <p>Leads: {Number(sponsor.metrics?.leads ?? 0).toLocaleString()}</p>\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 <Mail className=\"h-4 w-4\" />\n <span>{sponsor.contactEmail ?? 'No email'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4\" />\n <span>{sponsor.contactPhone ?? 'No phone'}</span>\n </div>\n <div>\n {sponsor.website ? (\n <a\n href={sponsor.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-text-link hover:underline\"\n >\n {sponsor.website}\n </a>\n ) : (\n 'No website'\n )}\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,101 +1,143 @@
1
1
  import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
- import { useCreateFloorPlanMutation as t, useVenueQuery as n } from "../../api/eventApi.js";
3
- import { useState as r } from "react";
4
- import { useParams as i } from "react-router-dom";
5
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
- import { ArrowLeft as s, Plus as c, SquareStack as l } from "lucide-react";
7
- import { Button as u, GlassCard as d, IllustratedEmptyState as f, Input as p } from "@burdenoff/fe-libs/ui";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useCreateFloorPlanMutation as n, useUpdateFloorPlanMutation as r, useVenueQuery as i } from "../../api/eventApi.js";
4
+ import { describeError as a, mutationSucceeded as o } from "../../lib/mutationResult.js";
5
+ import { ImageUploadField as s } from "../../components/ImageUploadField.js";
6
+ import { useState as c } from "react";
7
+ import { useParams as l } from "react-router-dom";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
+ import { ArrowLeft as f, Plus as p, SquareStack as m } from "lucide-react";
10
+ import { Button as h, EmphasisPanel as g, GlassCard as _, IllustratedEmptyState as v, Input as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
8
11
  //#region src/eventfullymanaged/pages/venues/FloorPlansPage.tsx
9
- function m() {
10
- let { id: m = "" } = i(), { navigate: h } = e(), { data: g, loading: _, refetch: v } = n(m), [y, { loading: b }] = t(), [x, S] = r(""), C = g?.venue, w = g?.floorPlans?.items ?? [];
11
- return /* @__PURE__ */ o("div", {
12
+ var x = "/EventfullyManaged/FloorPlans";
13
+ function S() {
14
+ let { id: S = "" } = l(), { navigate: C } = e(), { data: w, loading: T, refetch: E } = i(S), [D, { loading: O }] = n(), [k] = r(), [A, j] = c(""), [M, N] = c(""), P = w?.venue, F = w?.floorPlans?.items ?? [], I = async () => {
15
+ if (!(!A.trim() || !S)) try {
16
+ let e = await D({ variables: { input: {
17
+ venueId: S,
18
+ name: A.trim(),
19
+ imageUrl: M,
20
+ dimensions: {},
21
+ interactiveAreas: {}
22
+ } } });
23
+ if (!o(e, e.data?.createFloorPlan?.id, "Could not create floor plan")) return;
24
+ j(""), N(""), t.success("Floor plan created"), await E();
25
+ } catch (e) {
26
+ t.error("Could not create floor plan", a(e));
27
+ }
28
+ }, L = async (e, n) => {
29
+ try {
30
+ let t = await k({ variables: {
31
+ id: e.id,
32
+ input: {
33
+ venueId: e.venueId,
34
+ name: e.name,
35
+ imageUrl: n,
36
+ dimensions: e.dimensions ?? {},
37
+ interactiveAreas: e.interactiveAreas ?? {}
38
+ }
39
+ } });
40
+ if (!o(t, t.data?.updateFloorPlan?.id, "Could not attach image")) return;
41
+ await E();
42
+ } catch (e) {
43
+ t.error("Could not attach image", a(e));
44
+ }
45
+ };
46
+ return /* @__PURE__ */ d("div", {
12
47
  className: "space-y-6 p-6",
13
48
  children: [
14
- /* @__PURE__ */ o("div", {
49
+ /* @__PURE__ */ d("div", {
15
50
  className: "space-y-3",
16
- children: [/* @__PURE__ */ o(u, {
51
+ children: [/* @__PURE__ */ d(h, {
17
52
  type: "button",
18
53
  variant: "ghost",
19
54
  size: "sm",
20
- onClick: () => h(`/venues/${m}`),
21
- children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), "Back to Venue"]
22
- }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
55
+ onClick: () => C(`/venues/${S}`),
56
+ children: [/* @__PURE__ */ u(f, { className: "h-4 w-4" }), "Back to Venue"]
57
+ }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
23
58
  className: "text-2xl font-bold text-text-primary",
24
59
  children: "Floor Plans"
25
- }), /* @__PURE__ */ a("p", {
60
+ }), /* @__PURE__ */ u("p", {
26
61
  className: "mt-1 text-sm text-text-secondary",
27
- children: C?.name ?? "Venue"
62
+ children: P?.name ?? "Venue"
28
63
  })] })]
29
64
  }),
30
- /* @__PURE__ */ o(d, {
31
- treatment: "plain",
32
- className: "border-border-seam p-4",
33
- children: [/* @__PURE__ */ a("h2", {
34
- className: "mb-3 text-sm font-semibold text-text-primary",
35
- children: "Create floor plan"
36
- }), /* @__PURE__ */ o("div", {
65
+ /* @__PURE__ */ u(b, { children: "Floor plans are the maps of your venue — the hall layout, booth positions, stage and entrances. Add one per space so you can lay out exhibitors, plan attendee flow, and give everyone a clear picture of the room on the day." }),
66
+ /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u("h2", {
67
+ className: "mb-3 text-sm font-semibold text-text-primary",
68
+ children: "Create floor plan"
69
+ }), /* @__PURE__ */ d("div", {
70
+ className: "space-y-4",
71
+ children: [/* @__PURE__ */ d("div", {
37
72
  className: "flex flex-col gap-3 sm:flex-row",
38
- children: [/* @__PURE__ */ a(p, {
73
+ children: [/* @__PURE__ */ u(y, {
39
74
  type: "text",
40
- value: x,
41
- onChange: (e) => S(e.target.value),
75
+ value: A,
76
+ onChange: (e) => j(e.target.value),
42
77
  placeholder: "Main Hall Layout",
43
78
  "aria-label": "Floor plan name",
44
79
  className: "flex-1"
45
- }), /* @__PURE__ */ o(u, {
80
+ }), /* @__PURE__ */ d(h, {
46
81
  type: "button",
47
- onClick: async () => {
48
- !x.trim() || !m || (await y({ variables: { input: {
49
- venueId: m,
50
- name: x.trim(),
51
- imageUrl: "",
52
- dimensions: {},
53
- interactiveAreas: {}
54
- } } }), S(""), await v());
55
- },
56
- disabled: b,
57
- children: [/* @__PURE__ */ a(c, { className: "h-4 w-4" }), b ? "Creating..." : "Create"]
82
+ onClick: I,
83
+ disabled: O,
84
+ children: [/* @__PURE__ */ u(p, { className: "h-4 w-4" }), O ? "Creating..." : "Create"]
58
85
  })]
86
+ }), /* @__PURE__ */ u(s, {
87
+ label: "Upload floor plan image",
88
+ folderPath: x,
89
+ value: M || null,
90
+ onUploaded: N,
91
+ hint: "Optional. Attach the hall map now, or add it later from the list below."
59
92
  })]
60
- }),
61
- _ ? /* @__PURE__ */ a(d, {
93
+ })] }),
94
+ T ? /* @__PURE__ */ u(_, {
62
95
  treatment: "plain",
63
96
  className: "border-border-seam p-8 text-center text-sm text-text-secondary",
64
97
  children: "Loading floor plans..."
65
- }) : w.length === 0 ? /* @__PURE__ */ a(d, {
98
+ }) : F.length === 0 ? /* @__PURE__ */ u(_, {
66
99
  treatment: "plain",
67
100
  className: "border-border-seam",
68
- children: /* @__PURE__ */ a(f, {
101
+ children: /* @__PURE__ */ u(v, {
69
102
  illustration: "empty-files",
70
103
  title: "No floor plans found.",
71
104
  description: "Create one to start mapping your venue."
72
105
  })
73
- }) : /* @__PURE__ */ a("div", {
106
+ }) : /* @__PURE__ */ u("div", {
74
107
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
75
- children: w.map((e) => /* @__PURE__ */ o(d, {
108
+ children: F.map((e) => /* @__PURE__ */ d(_, {
76
109
  treatment: "metric",
77
- className: "p-4",
78
- children: [/* @__PURE__ */ o("div", {
79
- className: "flex items-center gap-2 text-text-primary",
80
- children: [/* @__PURE__ */ a(l, { className: "h-4 w-4 text-action-primary-bg" }), /* @__PURE__ */ a("h3", {
81
- className: "font-semibold",
82
- children: e.name
83
- })]
84
- }), /* @__PURE__ */ o("p", {
85
- className: "mt-2 text-sm text-text-secondary",
86
- children: [
87
- e.imageUrl ? "Image available" : "No image uploaded",
88
- " |",
89
- " ",
90
- e.dimensions ? "Dimensions configured" : "No dimensions configured"
91
- ]
92
- })]
110
+ className: "space-y-3 p-4",
111
+ children: [
112
+ /* @__PURE__ */ d("div", {
113
+ className: "flex items-center gap-2 text-text-primary",
114
+ children: [/* @__PURE__ */ u(m, { className: "h-4 w-4 text-action-primary-bg" }), /* @__PURE__ */ u("h3", {
115
+ className: "font-semibold",
116
+ children: e.name
117
+ })]
118
+ }),
119
+ e.imageUrl ? /* @__PURE__ */ u("img", {
120
+ src: e.imageUrl,
121
+ alt: `${e.name} floor plan`,
122
+ className: "w-full rounded-card border border-border-seam object-cover"
123
+ }) : /* @__PURE__ */ u(s, {
124
+ label: "Upload image",
125
+ folderPath: x,
126
+ value: null,
127
+ onUploaded: (t) => L(e, t),
128
+ hint: "Add the hall map for this floor plan."
129
+ }),
130
+ /* @__PURE__ */ u("p", {
131
+ className: "text-sm text-text-secondary",
132
+ children: e.dimensions ? "Dimensions configured" : "No dimensions configured"
133
+ })
134
+ ]
93
135
  }, e.id))
94
136
  })
95
137
  ]
96
138
  });
97
139
  }
98
140
  //#endregion
99
- export { m as default };
141
+ export { S as default };
100
142
 
101
143
  //# sourceMappingURL=FloorPlansPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, Plus, SquareStack } from 'lucide-react';\nimport { Button, GlassCard, IllustratedEmptyState, Input } from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateFloorPlanMutation, useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n interactiveAreas?: Record<string, unknown> | null;\n};\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [name, setName] = useState('');\n\n const venue = data?.venue;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlan[];\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n await createFloorPlan({\n variables: {\n input: {\n venueId: id,\n name: name.trim(),\n imageUrl: '',\n dimensions: {},\n interactiveAreas: {},\n },\n },\n });\n setName('');\n await refetch();\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/venues/${id}`)}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Floor Plans</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue?.name ?? 'Venue'}</p>\n </div>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-4\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Create floor plan</h2>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <Input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n aria-label=\"Floor plan name\"\n className=\"flex-1\"\n />\n <Button type=\"button\" onClick={handleCreate} disabled={creating}>\n <Plus className=\"h-4 w-4\" />\n {creating ? 'Creating...' : 'Create'}\n </Button>\n </div>\n </GlassCard>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading floor plans...\n </GlassCard>\n ) : floorPlans.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans found.\"\n description=\"Create one to start mapping your venue.\"\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {floorPlans.map((plan) => (\n <GlassCard key={plan.id} treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <SquareStack className=\"h-4 w-4 text-action-primary-bg\" />\n <h3 className=\"font-semibold\">{plan.name}</h3>\n </div>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {plan.imageUrl ? 'Image available' : 'No image uploaded'} |{' '}\n {plan.dimensions ? 'Dimensions configured' : 'No dimensions configured'}\n </p>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAiBA,SAAwB,IAAiB;CACvC,IAAM,EAAE,QAAK,OAAO,GAA2B,EACzC,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,YAAS,eAAY,EAAc,EAAG,EAC9C,CAAC,GAAiB,EAAE,SAAS,OAAc,GAA4B,EACvE,CAAC,GAAM,KAAW,EAAS,GAAG,EAE9B,IAAQ,GAAM,OACd,IAAc,GAAM,YAAY,SAAS,EAAE;AAqBjD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,eAAe,EAAS,WAAW,IAAK;eAAxF,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,gBAE1B;QACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAuC;KAAgB,CAAA,EACrE,kBAAC,KAAD;KAAG,WAAU;eAAoC,GAAO,QAAQ;KAAY,CAAA,CACxE,EAAA,CAAA,CACF;;GAEN,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cAAvC,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAsB,CAAA,EACnF,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,MAAK;MACL,OAAO;MACP,WAAW,MAAU,EAAQ,EAAM,OAAO,MAAM;MAChD,aAAY;MACZ,cAAW;MACX,WAAU;MACV,CAAA,EACF,kBAAC,GAAD;MAAQ,MAAK;MAAS,SA3CT,YAAY;AAC3B,QAAC,EAAK,MAAM,IAAI,CAAC,MAGrB,MAAM,EAAgB,EACpB,WAAW,EACT,OAAO;QACL,SAAS;QACT,MAAM,EAAK,MAAM;QACjB,UAAU;QACV,YAAY,EAAE;QACd,kBAAkB,EAAE;QACrB,EACF,EACF,CAAC,EACF,EAAQ,GAAG,EACX,MAAM,GAAS;;MA2BoC,UAAU;gBAAvD,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,IAAW,gBAAgB,SACrB;QACL;OACI;;GAEX,IACC,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cAAiE;IAE5F,CAAA,GACV,EAAW,WAAW,IACxB,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACQ,CAAA,GAEZ,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAW,KAAK,MACf,kBAAC,GAAD;KAAyB,WAAU;KAAS,WAAU;eAAtD,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,kCAAmC,CAAA,EAC1D,kBAAC,MAAD;OAAI,WAAU;iBAAiB,EAAK;OAAU,CAAA,CAC1C;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,EAAK,WAAW,oBAAoB;OAAoB;OAAG;OAC3D,EAAK,aAAa,0BAA0B;OAC3C;QACM;OATI,EAAK,GAST,CACZ;IACE,CAAA;GAEJ"}
1
+ {"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, Plus, SquareStack } from 'lucide-react';\nimport { Button, EmphasisPanel, GlassCard, IllustratedEmptyState, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateFloorPlanMutation, useUpdateFloorPlanMutation, useVenueQuery } from '../../api/eventApi';\nimport { ImageUploadField } from '../../components/ImageUploadField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n interactiveAreas?: Record<string, unknown> | null;\n};\n\nconst FLOOR_PLAN_FOLDER = '/EventfullyManaged/FloorPlans';\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [updateFloorPlan] = useUpdateFloorPlanMutation();\n const [name, setName] = useState('');\n const [imageUrl, setImageUrl] = useState('');\n\n const venue = data?.venue;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlan[];\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n try {\n const response = await createFloorPlan({\n variables: {\n input: {\n venueId: id,\n name: name.trim(),\n imageUrl,\n dimensions: {},\n interactiveAreas: {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.createFloorPlan?.id, 'Could not create floor plan')) {\n return;\n }\n setName('');\n setImageUrl('');\n notify.success('Floor plan created');\n await refetch();\n } catch (error) {\n notify.error('Could not create floor plan', describeError(error));\n }\n };\n\n const handleAttachImage = async (plan: FloorPlan, url: string) => {\n try {\n const response = await updateFloorPlan({\n variables: {\n id: plan.id,\n input: {\n venueId: plan.venueId,\n name: plan.name,\n imageUrl: url,\n dimensions: plan.dimensions ?? {},\n interactiveAreas: plan.interactiveAreas ?? {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.updateFloorPlan?.id, 'Could not attach image')) {\n return;\n }\n await refetch();\n } catch (error) {\n notify.error('Could not attach image', describeError(error));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/venues/${id}`)}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Floor Plans</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue?.name ?? 'Venue'}</p>\n </div>\n </div>\n\n <PagePurpose>\n Floor plans are the maps of your venue — the hall layout, booth positions, stage and entrances. Add one per\n space so you can lay out exhibitors, plan attendee flow, and give everyone a clear picture of the room on the\n day.\n </PagePurpose>\n\n <EmphasisPanel>\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Create floor plan</h2>\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <Input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n aria-label=\"Floor plan name\"\n className=\"flex-1\"\n />\n <Button type=\"button\" onClick={handleCreate} disabled={creating}>\n <Plus className=\"h-4 w-4\" />\n {creating ? 'Creating...' : 'Create'}\n </Button>\n </div>\n <ImageUploadField\n label=\"Upload floor plan image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={imageUrl || null}\n onUploaded={setImageUrl}\n hint=\"Optional. Attach the hall map now, or add it later from the list below.\"\n />\n </div>\n </EmphasisPanel>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading floor plans...\n </GlassCard>\n ) : floorPlans.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans found.\"\n description=\"Create one to start mapping your venue.\"\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {floorPlans.map((plan) => (\n <GlassCard key={plan.id} treatment=\"metric\" className=\"space-y-3 p-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <SquareStack className=\"h-4 w-4 text-action-primary-bg\" />\n <h3 className=\"font-semibold\">{plan.name}</h3>\n </div>\n {plan.imageUrl ? (\n <img\n src={plan.imageUrl}\n alt={`${plan.name} floor plan`}\n className=\"w-full rounded-card border border-border-seam object-cover\"\n />\n ) : (\n <ImageUploadField\n label=\"Upload image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={null}\n onUploaded={(url) => handleAttachImage(plan, url)}\n hint=\"Add the hall map for this floor plan.\"\n />\n )}\n <p className=\"text-sm text-text-secondary\">\n {plan.dimensions ? 'Dimensions configured' : 'No dimensions configured'}\n </p>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,44 +2,45 @@ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContex
2
2
  import { useVenueQuery as t } from "../../api/eventApi.js";
3
3
  import { useParams as n } from "react-router-dom";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { ArrowLeft as a, Building2 as o, Edit as s, MapPin as c, SquareStack as l, Users as u } from "lucide-react";
6
- import { Badge as d, Button as f, GlassCard as p, IllustratedEmptyState as m } from "@burdenoff/fe-libs/ui";
5
+ import { ArrowLeft as a, Building2 as o, Edit as s, MapPin as c, Megaphone as l, SquareStack as u, Users as d } from "lucide-react";
6
+ import { Badge as f, Button as p, GlassCard as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/eventfullymanaged/pages/venues/VenueDetailPage.tsx
8
- function h() {
9
- let { id: h = "" } = n(), { navigate: g } = e(), { data: _, loading: v } = t(h), y = _?.venue ?? null, b = _?.floorPlans?.items ?? [];
10
- return v ? /* @__PURE__ */ r("div", {
8
+ function v() {
9
+ let { id: v = "" } = n(), { navigate: y } = e(), { data: b, loading: x } = t(v), S = b?.venue ?? null, C = b?.floorPlans?.items ?? [];
10
+ return x ? /* @__PURE__ */ r("div", {
11
11
  className: "p-6 text-sm text-text-secondary",
12
12
  children: "Loading venue..."
13
- }) : y ? /* @__PURE__ */ i("div", {
13
+ }) : S ? /* @__PURE__ */ i("div", {
14
14
  className: "space-y-6 p-6",
15
15
  children: [
16
+ /* @__PURE__ */ r(_, { children: "The full record for one venue. Review its location, capacity and status, see what amenities it offers, and manage the floor plans attendees will navigate. Come here to confirm a space is ready before you assign an event to it." }),
16
17
  /* @__PURE__ */ i("div", {
17
18
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
18
19
  children: [/* @__PURE__ */ i("div", {
19
20
  className: "space-y-3",
20
- children: [/* @__PURE__ */ i(f, {
21
+ children: [/* @__PURE__ */ i(p, {
21
22
  type: "button",
22
23
  variant: "ghost",
23
24
  size: "sm",
24
- onClick: () => g("/venues"),
25
+ onClick: () => y("/venues"),
25
26
  children: [/* @__PURE__ */ r(a, { className: "h-4 w-4" }), "Back to Venues"]
26
27
  }), /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("h1", {
27
28
  className: "text-2xl font-bold text-text-primary",
28
- children: y.name
29
+ children: S.name
29
30
  }), /* @__PURE__ */ r("p", {
30
31
  className: "mt-1 text-sm text-text-secondary",
31
- children: y.description ?? "No description provided."
32
+ children: S.description ?? "No description provided."
32
33
  })] })]
33
- }), /* @__PURE__ */ i(f, {
34
+ }), /* @__PURE__ */ i(p, {
34
35
  type: "button",
35
- onClick: () => g(`/venues/${y.id}/edit`),
36
+ onClick: () => y(`/venues/${S.id}/edit`),
36
37
  children: [/* @__PURE__ */ r(s, { className: "h-4 w-4" }), "Edit Venue"]
37
38
  })]
38
39
  }),
39
40
  /* @__PURE__ */ i("div", {
40
41
  className: "grid grid-cols-1 gap-4 lg:grid-cols-3",
41
42
  children: [
42
- /* @__PURE__ */ i(p, {
43
+ /* @__PURE__ */ i(m, {
43
44
  treatment: "metric",
44
45
  className: "p-4",
45
46
  children: [/* @__PURE__ */ i("div", {
@@ -48,26 +49,27 @@ function h() {
48
49
  }), /* @__PURE__ */ r("p", {
49
50
  className: "text-sm text-text-secondary",
50
51
  children: [
51
- y.addressLine1,
52
- y.city,
53
- y.state,
54
- y.country,
55
- y.postalCode
52
+ S.addressLine1,
53
+ S.city,
54
+ S.state,
55
+ S.country,
56
+ S.postalCode
56
57
  ].filter(Boolean).join(", ") || "Location not configured"
57
58
  })]
58
59
  }),
59
- /* @__PURE__ */ i(p, {
60
- treatment: "metric",
60
+ /* @__PURE__ */ i(m, {
61
+ treatment: "glass",
62
+ glow: !0,
61
63
  className: "p-4",
62
64
  children: [/* @__PURE__ */ i("div", {
63
65
  className: "mb-2 flex items-center gap-2 text-sm font-medium text-text-primary",
64
- children: [/* @__PURE__ */ r(u, { className: "h-4 w-4 text-action-primary-bg" }), "Capacity"]
66
+ children: [/* @__PURE__ */ r(d, { className: "h-4 w-4 text-action-primary-bg" }), "Capacity"]
65
67
  }), /* @__PURE__ */ i("p", {
66
68
  className: "text-sm tabular-nums text-text-secondary",
67
- children: [y.capacity ?? 0, " attendees"]
69
+ children: [S.capacity ?? 0, " attendees"]
68
70
  })]
69
71
  }),
70
- /* @__PURE__ */ i(p, {
72
+ /* @__PURE__ */ i(m, {
71
73
  treatment: "metric",
72
74
  className: "p-4",
73
75
  children: [/* @__PURE__ */ i("div", {
@@ -75,12 +77,12 @@ function h() {
75
77
  children: [/* @__PURE__ */ r(o, { className: "h-4 w-4 text-action-primary-bg" }), "Status"]
76
78
  }), /* @__PURE__ */ r("p", {
77
79
  className: "text-sm uppercase text-text-secondary",
78
- children: y.status
80
+ children: S.status
79
81
  })]
80
82
  })
81
83
  ]
82
84
  }),
83
- /* @__PURE__ */ i(p, {
85
+ /* @__PURE__ */ i(m, {
84
86
  treatment: "plain",
85
87
  className: "border-border-seam p-5",
86
88
  children: [/* @__PURE__ */ r("h2", {
@@ -88,7 +90,7 @@ function h() {
88
90
  children: "Amenities"
89
91
  }), /* @__PURE__ */ r("div", {
90
92
  className: "mt-3 flex flex-wrap gap-2",
91
- children: y.amenities.length > 0 ? y.amenities.map((e) => /* @__PURE__ */ r(d, {
93
+ children: S.amenities.length > 0 ? S.amenities.map((e) => /* @__PURE__ */ r(f, {
92
94
  variant: "secondary",
93
95
  children: e
94
96
  }, e)) : /* @__PURE__ */ r("p", {
@@ -97,7 +99,7 @@ function h() {
97
99
  })
98
100
  })]
99
101
  }),
100
- /* @__PURE__ */ i(p, {
102
+ /* @__PURE__ */ i(m, {
101
103
  treatment: "plain",
102
104
  className: "border-border-seam p-5",
103
105
  children: [/* @__PURE__ */ i("div", {
@@ -105,18 +107,18 @@ function h() {
105
107
  children: [/* @__PURE__ */ r("h2", {
106
108
  className: "text-lg font-semibold text-text-primary",
107
109
  children: "Floor Plans"
108
- }), /* @__PURE__ */ i(f, {
110
+ }), /* @__PURE__ */ i(p, {
109
111
  type: "button",
110
112
  variant: "outline",
111
113
  size: "sm",
112
- onClick: () => g(`/venues/${y.id}/floor-plans`),
113
- children: [/* @__PURE__ */ r(l, { className: "h-4 w-4" }), "Manage Floor Plans"]
114
+ onClick: () => y(`/venues/${S.id}/floor-plans`),
115
+ children: [/* @__PURE__ */ r(u, { className: "h-4 w-4" }), "Manage Floor Plans"]
114
116
  })]
115
117
  }), /* @__PURE__ */ r("div", {
116
118
  className: "mt-4",
117
- children: b.length > 0 ? /* @__PURE__ */ r("ul", {
119
+ children: C.length > 0 ? /* @__PURE__ */ r("ul", {
118
120
  className: "space-y-2.5",
119
- children: b.map((e) => /* @__PURE__ */ i("li", {
121
+ children: C.map((e) => /* @__PURE__ */ i("li", {
120
122
  className: "rounded-card border border-border-seam p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1",
121
123
  children: [/* @__PURE__ */ r("p", {
122
124
  className: "font-medium text-text-primary",
@@ -126,26 +128,53 @@ function h() {
126
128
  children: e.imageUrl ? "Image configured" : "No image configured"
127
129
  })]
128
130
  }, e.id))
129
- }) : /* @__PURE__ */ r(m, {
131
+ }) : /* @__PURE__ */ r(h, {
130
132
  illustration: "empty-files",
131
133
  title: "No floor plans have been added yet.",
132
134
  className: "py-8"
133
135
  })
134
136
  })]
137
+ }),
138
+ /* @__PURE__ */ r(g, {
139
+ storageKey: "eventfullymanaged-venue-detail",
140
+ title: "Get this venue ready to host",
141
+ steps: [
142
+ {
143
+ id: "edit-venue",
144
+ label: "Edit venue details",
145
+ description: "Update capacity, address, status and amenities.",
146
+ icon: /* @__PURE__ */ r(s, { className: "h-4 w-4" }),
147
+ onClick: () => y(`/venues/${S.id}/edit`)
148
+ },
149
+ {
150
+ id: "floor-plans",
151
+ label: "Add floor plans",
152
+ description: "Map the layout so attendees and staff can navigate.",
153
+ icon: /* @__PURE__ */ r(u, { className: "h-4 w-4" }),
154
+ onClick: () => y(`/venues/${S.id}/floor-plans`)
155
+ },
156
+ {
157
+ id: "resources",
158
+ label: "Review resource readiness",
159
+ description: "Check capacity, amenities and plans at a glance.",
160
+ icon: /* @__PURE__ */ r(l, { className: "h-4 w-4" }),
161
+ onClick: () => y(`/venues/${S.id}/resources`)
162
+ }
163
+ ]
135
164
  })
136
165
  ]
137
166
  }) : /* @__PURE__ */ i("div", {
138
167
  className: "space-y-4 p-6",
139
- children: [/* @__PURE__ */ i(f, {
168
+ children: [/* @__PURE__ */ i(p, {
140
169
  type: "button",
141
170
  variant: "ghost",
142
171
  size: "sm",
143
- onClick: () => g("/venues"),
172
+ onClick: () => y("/venues"),
144
173
  children: [/* @__PURE__ */ r(a, { className: "h-4 w-4" }), "Back to Venues"]
145
- }), /* @__PURE__ */ r(p, {
174
+ }), /* @__PURE__ */ r(m, {
146
175
  treatment: "plain",
147
176
  className: "border-border-seam",
148
- children: /* @__PURE__ */ r(m, {
177
+ children: /* @__PURE__ */ r(h, {
149
178
  illustration: "empty-search",
150
179
  title: "Venue not found.",
151
180
  description: "This venue may have been removed or is outside your current scope."
@@ -154,6 +183,6 @@ function h() {
154
183
  });
155
184
  }
156
185
  //#endregion
157
- export { h as default };
186
+ export { v as default };
158
187
 
159
188
  //# sourceMappingURL=VenueDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VenueDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueDetailPage.tsx"],"sourcesContent":["import { ArrowLeft, Building2, Edit, MapPin, SquareStack, Users } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueRecord = {\n id: string;\n name: string;\n description?: string | null;\n addressLine1?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n postalCode?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n pricing?: Record<string, unknown> | null;\n openingHours?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype FloorPlanRecord = {\n id: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n};\n\nexport default function VenueDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useVenueQuery(id);\n\n const venue = (data?.venue ?? null) as VenueRecord | null;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlanRecord[];\n\n if (loading) {\n return <div className=\"p-6 text-sm text-text-secondary\">Loading venue...</div>;\n }\n\n if (!venue) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Venue not found.\"\n description=\"This venue may have been removed or is outside your current scope.\"\n />\n </GlassCard>\n </div>\n );\n }\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 className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">{venue.name}</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue.description ?? 'No description provided.'}</p>\n </div>\n </div>\n <Button type=\"button\" onClick={() => navigate(`/venues/${venue.id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Venue\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n Location\n </div>\n <p className=\"text-sm text-text-secondary\">\n {[venue.addressLine1, venue.city, venue.state, venue.country, venue.postalCode]\n .filter(Boolean)\n .join(', ') || 'Location not configured'}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n Capacity\n </div>\n <p className=\"text-sm tabular-nums text-text-secondary\">{venue.capacity ?? 0} attendees</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Building2 className=\"h-4 w-4 text-action-primary-bg\" />\n Status\n </div>\n <p className=\"text-sm uppercase text-text-secondary\">{venue.status}</p>\n </GlassCard>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Amenities</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {venue.amenities.length > 0 ? (\n venue.amenities.map((amenity) => (\n <Badge key={amenity} variant=\"secondary\">\n {amenity}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">No amenities configured.</p>\n )}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Floor Plans</h2>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}>\n <SquareStack className=\"h-4 w-4\" />\n Manage Floor Plans\n </Button>\n </div>\n <div className=\"mt-4\">\n {floorPlans.length > 0 ? (\n <ul className=\"space-y-2.5\">\n {floorPlans.map((plan) => (\n <li\n key={plan.id}\n className=\"rounded-card border border-border-seam p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <p className=\"font-medium text-text-primary\">{plan.name}</p>\n <p className=\"text-sm text-text-secondary\">\n {plan.imageUrl ? 'Image configured' : 'No image configured'}\n </p>\n </li>\n ))}\n </ul>\n ) : (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans have been added yet.\"\n className=\"py-8\"\n />\n )}\n </div>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VenueDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueDetailPage.tsx"],"sourcesContent":["import { ArrowLeft, Building2, Edit, MapPin, Megaphone, SquareStack, Users } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueRecord = {\n id: string;\n name: string;\n description?: string | null;\n addressLine1?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n postalCode?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n pricing?: Record<string, unknown> | null;\n openingHours?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype FloorPlanRecord = {\n id: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n};\n\nexport default function VenueDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useVenueQuery(id);\n\n const venue = (data?.venue ?? null) as VenueRecord | null;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlanRecord[];\n\n if (loading) {\n return <div className=\"p-6 text-sm text-text-secondary\">Loading venue...</div>;\n }\n\n if (!venue) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Venue not found.\"\n description=\"This venue may have been removed or is outside your current scope.\"\n />\n </GlassCard>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n The full record for one venue. Review its location, capacity and status, see what amenities it offers, and\n manage the floor plans attendees will navigate. Come here to confirm a space is ready before you assign an\n event to it.\n </PagePurpose>\n\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">{venue.name}</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue.description ?? 'No description provided.'}</p>\n </div>\n </div>\n <Button type=\"button\" onClick={() => navigate(`/venues/${venue.id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Venue\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n Location\n </div>\n <p className=\"text-sm text-text-secondary\">\n {[venue.addressLine1, venue.city, venue.state, venue.country, venue.postalCode]\n .filter(Boolean)\n .join(', ') || 'Location not configured'}\n </p>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n Capacity\n </div>\n <p className=\"text-sm tabular-nums text-text-secondary\">{venue.capacity ?? 0} attendees</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Building2 className=\"h-4 w-4 text-action-primary-bg\" />\n Status\n </div>\n <p className=\"text-sm uppercase text-text-secondary\">{venue.status}</p>\n </GlassCard>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Amenities</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {venue.amenities.length > 0 ? (\n venue.amenities.map((amenity) => (\n <Badge key={amenity} variant=\"secondary\">\n {amenity}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">No amenities configured.</p>\n )}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Floor Plans</h2>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}>\n <SquareStack className=\"h-4 w-4\" />\n Manage Floor Plans\n </Button>\n </div>\n <div className=\"mt-4\">\n {floorPlans.length > 0 ? (\n <ul className=\"space-y-2.5\">\n {floorPlans.map((plan) => (\n <li\n key={plan.id}\n className=\"rounded-card border border-border-seam p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <p className=\"font-medium text-text-primary\">{plan.name}</p>\n <p className=\"text-sm text-text-secondary\">\n {plan.imageUrl ? 'Image configured' : 'No image configured'}\n </p>\n </li>\n ))}\n </ul>\n ) : (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans have been added yet.\"\n className=\"py-8\"\n />\n )}\n </div>\n </GlassCard>\n\n <NextSteps\n storageKey=\"eventfullymanaged-venue-detail\"\n title=\"Get this venue ready to host\"\n steps={[\n {\n id: 'edit-venue',\n label: 'Edit venue details',\n description: 'Update capacity, address, status and amenities.',\n icon: <Edit className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/edit`),\n },\n {\n id: 'floor-plans',\n label: 'Add floor plans',\n description: 'Map the layout so attendees and staff can navigate.',\n icon: <SquareStack className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/floor-plans`),\n },\n {\n id: 'resources',\n label: 'Review resource readiness',\n description: 'Check capacity, amenities and plans at a glance.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/resources`),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}