@burdenoff/microfe-eventfullymanaged 2026.608.1 → 2026.625.2
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/components/PageLayout.js +44 -38
- package/dist/eventfullymanaged/components/PageLayout.js.map +1 -1
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +93 -40
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +32 -29
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +85 -50
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +49 -50
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EntityListSection.js +57 -25
- package/dist/eventfullymanaged/pages/modules/EntityListSection.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +93 -66
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +18 -19
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +60 -30
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +146 -108
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +67 -38
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +84 -49
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +57 -28
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +106 -72
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +84 -68
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +202 -204
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +58 -39
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +53 -46
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +109 -63
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +193 -197
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +65 -36
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -3,16 +3,18 @@ import { useSponsorsQuery 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, Mail as s, Phone as c, Plus as l, Search as u } from "lucide-react";
|
|
6
|
+
import { Badge as d, Button as f, GlassCard as p, IllustratedEmptyState as m, Input as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { navigate:
|
|
9
|
-
search:
|
|
8
|
+
function _() {
|
|
9
|
+
let { navigate: _ } = e(), [v, y] = r(""), { data: b, loading: x } = t({
|
|
10
|
+
search: v,
|
|
10
11
|
limit: 100,
|
|
11
12
|
offset: 0
|
|
12
|
-
}),
|
|
13
|
+
}), S = n(() => b?.sponsors?.items ?? [], [b]), C = S.reduce((e, t) => e + Number(t.metrics?.value ?? 0), 0), w = S.reduce((e, t) => e + Number(t.metrics?.leads ?? 0), 0);
|
|
13
14
|
return /* @__PURE__ */ a("div", {
|
|
14
15
|
className: "space-y-6 p-6",
|
|
15
16
|
children: [
|
|
17
|
+
/* @__PURE__ */ i(g, { children: "Sponsors fund your event in exchange for visibility and leads. Track each one here — their tier, the contract value they bring, and the leads they generate — so you can prove ROI and keep the relationship warm for next time. The highlighted cards summarize your sponsor portfolio at a glance." }),
|
|
16
18
|
/* @__PURE__ */ a("div", {
|
|
17
19
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
18
20
|
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
|
|
@@ -21,80 +23,100 @@ function d() {
|
|
|
21
23
|
}), /* @__PURE__ */ i("p", {
|
|
22
24
|
className: "mt-1 text-sm text-text-secondary",
|
|
23
25
|
children: "Manage event sponsors with live API data."
|
|
24
|
-
})] }), /* @__PURE__ */ a(
|
|
26
|
+
})] }), /* @__PURE__ */ a(f, {
|
|
25
27
|
type: "button",
|
|
26
|
-
onClick: () =>
|
|
27
|
-
|
|
28
|
-
children: [/* @__PURE__ */ i(l, { className: "mr-2 h-4 w-4" }), "Add Sponsor"]
|
|
28
|
+
onClick: () => _("/sponsors/create"),
|
|
29
|
+
children: [/* @__PURE__ */ i(l, { className: "h-4 w-4" }), "Add Sponsor"]
|
|
29
30
|
})]
|
|
30
31
|
}),
|
|
31
32
|
/* @__PURE__ */ a("div", {
|
|
32
33
|
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
33
34
|
children: [
|
|
34
|
-
/* @__PURE__ */ a(
|
|
35
|
-
|
|
35
|
+
/* @__PURE__ */ a(p, {
|
|
36
|
+
treatment: "glass",
|
|
37
|
+
glow: !0,
|
|
38
|
+
className: "p-4",
|
|
36
39
|
children: [/* @__PURE__ */ i("p", {
|
|
37
40
|
className: "text-sm text-text-secondary",
|
|
38
41
|
children: "Total Sponsors"
|
|
39
42
|
}), /* @__PURE__ */ i("p", {
|
|
40
|
-
className: "mt-1 text-2xl font-bold text-text-primary",
|
|
41
|
-
children:
|
|
43
|
+
className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
|
|
44
|
+
children: S.length
|
|
42
45
|
})]
|
|
43
46
|
}),
|
|
44
|
-
/* @__PURE__ */ a(
|
|
45
|
-
|
|
47
|
+
/* @__PURE__ */ a(p, {
|
|
48
|
+
treatment: "metric",
|
|
49
|
+
className: "p-4",
|
|
46
50
|
children: [/* @__PURE__ */ i("p", {
|
|
47
51
|
className: "text-sm text-text-secondary",
|
|
48
52
|
children: "Total Contract Value"
|
|
49
53
|
}), /* @__PURE__ */ a("p", {
|
|
50
|
-
className: "mt-1 text-2xl font-bold text-text-primary",
|
|
51
|
-
children: ["$",
|
|
54
|
+
className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
|
|
55
|
+
children: ["$", C.toLocaleString()]
|
|
52
56
|
})]
|
|
53
57
|
}),
|
|
54
|
-
/* @__PURE__ */ a(
|
|
55
|
-
|
|
58
|
+
/* @__PURE__ */ a(p, {
|
|
59
|
+
treatment: "metric",
|
|
60
|
+
className: "p-4",
|
|
56
61
|
children: [/* @__PURE__ */ i("p", {
|
|
57
62
|
className: "text-sm text-text-secondary",
|
|
58
63
|
children: "Total Leads"
|
|
59
64
|
}), /* @__PURE__ */ i("p", {
|
|
60
|
-
className: "mt-1 text-2xl font-bold text-text-primary",
|
|
61
|
-
children:
|
|
65
|
+
className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
|
|
66
|
+
children: w.toLocaleString()
|
|
62
67
|
})]
|
|
63
68
|
})
|
|
64
69
|
]
|
|
65
70
|
}),
|
|
66
71
|
/* @__PURE__ */ a("div", {
|
|
67
72
|
className: "relative",
|
|
68
|
-
children: [/* @__PURE__ */ i(u, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i(
|
|
73
|
+
children: [/* @__PURE__ */ i(u, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i(h, {
|
|
69
74
|
type: "text",
|
|
70
|
-
value:
|
|
71
|
-
onChange: (e) =>
|
|
75
|
+
value: v,
|
|
76
|
+
onChange: (e) => y(e.target.value),
|
|
72
77
|
placeholder: "Search sponsors",
|
|
73
|
-
|
|
78
|
+
"aria-label": "Search sponsors",
|
|
79
|
+
className: "pl-10"
|
|
74
80
|
})]
|
|
75
81
|
}),
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
x ? /* @__PURE__ */ i(p, {
|
|
83
|
+
treatment: "plain",
|
|
84
|
+
className: "border-border-seam p-8 text-center text-sm text-text-secondary",
|
|
78
85
|
children: "Loading sponsors..."
|
|
79
|
-
}) : /* @__PURE__ */
|
|
86
|
+
}) : S.length === 0 ? /* @__PURE__ */ i(p, {
|
|
87
|
+
treatment: "plain",
|
|
88
|
+
className: "border-border-seam",
|
|
89
|
+
children: /* @__PURE__ */ i(m, {
|
|
90
|
+
illustration: v ? "empty-search" : "empty-people",
|
|
91
|
+
title: v ? "No sponsors match your search." : "No sponsors yet.",
|
|
92
|
+
description: v ? "Try a different name." : "Add your first sponsor to start tracking value and leads.",
|
|
93
|
+
action: v ? void 0 : /* @__PURE__ */ a(f, {
|
|
94
|
+
type: "button",
|
|
95
|
+
onClick: () => _("/sponsors/create"),
|
|
96
|
+
children: [/* @__PURE__ */ i(l, { className: "h-4 w-4" }), "Add Sponsor"]
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
}) : /* @__PURE__ */ i("div", {
|
|
80
100
|
className: "space-y-4",
|
|
81
|
-
children:
|
|
82
|
-
|
|
101
|
+
children: S.map((e) => /* @__PURE__ */ a(p, {
|
|
102
|
+
treatment: "plain",
|
|
103
|
+
className: "border-border-seam p-5",
|
|
83
104
|
children: [/* @__PURE__ */ a("div", {
|
|
84
105
|
className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
85
106
|
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("button", {
|
|
86
107
|
type: "button",
|
|
87
|
-
onClick: () =>
|
|
88
|
-
className: "text-left text-lg font-semibold text-text-primary hover:text-
|
|
108
|
+
onClick: () => _(`/sponsors/${e.id}/edit`),
|
|
109
|
+
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)]",
|
|
89
110
|
children: e.name
|
|
90
111
|
}), /* @__PURE__ */ a("div", {
|
|
91
112
|
className: "mt-1 flex items-center gap-2 text-sm text-text-secondary",
|
|
92
|
-
children: [/* @__PURE__ */ i(o, { className: "h-4 w-4" }), /* @__PURE__ */ i(
|
|
113
|
+
children: [/* @__PURE__ */ i(o, { className: "h-4 w-4" }), /* @__PURE__ */ i(d, {
|
|
114
|
+
variant: "secondary",
|
|
93
115
|
className: "uppercase",
|
|
94
116
|
children: e.level
|
|
95
117
|
})]
|
|
96
118
|
})] }), /* @__PURE__ */ a("div", {
|
|
97
|
-
className: "text-sm text-text-secondary",
|
|
119
|
+
className: "text-sm tabular-nums text-text-secondary",
|
|
98
120
|
children: [/* @__PURE__ */ a("p", { children: ["Value: $", Number(e.metrics?.value ?? 0).toLocaleString()] }), /* @__PURE__ */ a("p", { children: ["Leads: ", Number(e.metrics?.leads ?? 0).toLocaleString()] })]
|
|
99
121
|
})]
|
|
100
122
|
}), /* @__PURE__ */ a("div", {
|
|
@@ -112,20 +134,17 @@ function d() {
|
|
|
112
134
|
href: e.website,
|
|
113
135
|
target: "_blank",
|
|
114
136
|
rel: "noreferrer",
|
|
115
|
-
className: "text-
|
|
137
|
+
className: "text-text-link hover:underline",
|
|
116
138
|
children: e.website
|
|
117
139
|
}) : "No website" })
|
|
118
140
|
]
|
|
119
141
|
})]
|
|
120
|
-
}, e.id))
|
|
121
|
-
className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
|
|
122
|
-
children: "No sponsors found."
|
|
123
|
-
})]
|
|
142
|
+
}, e.id))
|
|
124
143
|
})
|
|
125
144
|
]
|
|
126
145
|
});
|
|
127
146
|
}
|
|
128
147
|
//#endregion
|
|
129
|
-
export {
|
|
148
|
+
export { _ as default };
|
|
130
149
|
|
|
131
150
|
//# sourceMappingURL=SponsorsListPage.js.map
|
|
@@ -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 { 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 <
|
|
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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"}
|
|
@@ -4,67 +4,77 @@ import { useState as r } from "react";
|
|
|
4
4
|
import { useParams as i } from "react-router-dom";
|
|
5
5
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
6
|
import { ArrowLeft as s, Plus as c, SquareStack as l } from "lucide-react";
|
|
7
|
+
import { Button as u, EmphasisPanel as d, GlassCard as f, IllustratedEmptyState as p, Input as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/eventfullymanaged/pages/venues/FloorPlansPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { id:
|
|
9
|
+
function g() {
|
|
10
|
+
let { id: g = "" } = i(), { navigate: _ } = e(), { data: v, loading: y, refetch: b } = n(g), [x, { loading: S }] = t(), [C, w] = r(""), T = v?.venue, E = v?.floorPlans?.items ?? [];
|
|
10
11
|
return /* @__PURE__ */ o("div", {
|
|
11
12
|
className: "space-y-6 p-6",
|
|
12
13
|
children: [
|
|
13
14
|
/* @__PURE__ */ o("div", {
|
|
14
15
|
className: "space-y-3",
|
|
15
|
-
children: [/* @__PURE__ */ o(
|
|
16
|
+
children: [/* @__PURE__ */ o(u, {
|
|
16
17
|
type: "button",
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
variant: "ghost",
|
|
19
|
+
size: "sm",
|
|
20
|
+
onClick: () => _(`/venues/${g}`),
|
|
19
21
|
children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), "Back to Venue"]
|
|
20
22
|
}), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
|
|
21
23
|
className: "text-2xl font-bold text-text-primary",
|
|
22
24
|
children: "Floor Plans"
|
|
23
25
|
}), /* @__PURE__ */ a("p", {
|
|
24
26
|
className: "mt-1 text-sm text-text-secondary",
|
|
25
|
-
children:
|
|
27
|
+
children: T?.name ?? "Venue"
|
|
26
28
|
})] })]
|
|
27
29
|
}),
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
children: [/* @__PURE__ */ a(c, { className: "mr-2 h-4 w-4" }), g ? "Creating..." : "Create"]
|
|
55
|
-
})]
|
|
30
|
+
/* @__PURE__ */ a(h, { 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." }),
|
|
31
|
+
/* @__PURE__ */ o(d, { children: [/* @__PURE__ */ a("h2", {
|
|
32
|
+
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
33
|
+
children: "Create floor plan"
|
|
34
|
+
}), /* @__PURE__ */ o("div", {
|
|
35
|
+
className: "flex flex-col gap-3 sm:flex-row",
|
|
36
|
+
children: [/* @__PURE__ */ a(m, {
|
|
37
|
+
type: "text",
|
|
38
|
+
value: C,
|
|
39
|
+
onChange: (e) => w(e.target.value),
|
|
40
|
+
placeholder: "Main Hall Layout",
|
|
41
|
+
"aria-label": "Floor plan name",
|
|
42
|
+
className: "flex-1"
|
|
43
|
+
}), /* @__PURE__ */ o(u, {
|
|
44
|
+
type: "button",
|
|
45
|
+
onClick: async () => {
|
|
46
|
+
!C.trim() || !g || (await x({ variables: { input: {
|
|
47
|
+
venueId: g,
|
|
48
|
+
name: C.trim(),
|
|
49
|
+
imageUrl: "",
|
|
50
|
+
dimensions: {},
|
|
51
|
+
interactiveAreas: {}
|
|
52
|
+
} } }), w(""), await b());
|
|
53
|
+
},
|
|
54
|
+
disabled: S,
|
|
55
|
+
children: [/* @__PURE__ */ a(c, { className: "h-4 w-4" }), S ? "Creating..." : "Create"]
|
|
56
56
|
})]
|
|
57
|
-
}),
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
})] }),
|
|
58
|
+
y ? /* @__PURE__ */ a(f, {
|
|
59
|
+
treatment: "plain",
|
|
60
|
+
className: "border-border-seam p-8 text-center text-sm text-text-secondary",
|
|
60
61
|
children: "Loading floor plans..."
|
|
61
|
-
}) : /* @__PURE__ */
|
|
62
|
+
}) : E.length === 0 ? /* @__PURE__ */ a(f, {
|
|
63
|
+
treatment: "plain",
|
|
64
|
+
className: "border-border-seam",
|
|
65
|
+
children: /* @__PURE__ */ a(p, {
|
|
66
|
+
illustration: "empty-files",
|
|
67
|
+
title: "No floor plans found.",
|
|
68
|
+
description: "Create one to start mapping your venue."
|
|
69
|
+
})
|
|
70
|
+
}) : /* @__PURE__ */ a("div", {
|
|
62
71
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
63
|
-
children:
|
|
64
|
-
|
|
72
|
+
children: E.map((e) => /* @__PURE__ */ o(f, {
|
|
73
|
+
treatment: "metric",
|
|
74
|
+
className: "p-4",
|
|
65
75
|
children: [/* @__PURE__ */ o("div", {
|
|
66
76
|
className: "flex items-center gap-2 text-text-primary",
|
|
67
|
-
children: [/* @__PURE__ */ a(l, { className: "h-4 w-4" }), /* @__PURE__ */ a("h3", {
|
|
77
|
+
children: [/* @__PURE__ */ a(l, { className: "h-4 w-4 text-action-primary-bg" }), /* @__PURE__ */ a("h3", {
|
|
68
78
|
className: "font-semibold",
|
|
69
79
|
children: e.name
|
|
70
80
|
})]
|
|
@@ -77,15 +87,12 @@ function u() {
|
|
|
77
87
|
e.dimensions ? "Dimensions configured" : "No dimensions configured"
|
|
78
88
|
]
|
|
79
89
|
})]
|
|
80
|
-
}, e.id))
|
|
81
|
-
className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
|
|
82
|
-
children: "No floor plans found. Create one to start mapping your venue."
|
|
83
|
-
})]
|
|
90
|
+
}, e.id))
|
|
84
91
|
})
|
|
85
92
|
]
|
|
86
93
|
});
|
|
87
94
|
}
|
|
88
95
|
//#endregion
|
|
89
|
-
export {
|
|
96
|
+
export { g as default };
|
|
90
97
|
|
|
91
98
|
//# 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 { 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 <
|
|
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, 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 <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=\"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 </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=\"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,EAAA,UAAa,kOAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAAsB,CAAA,EACnF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,MAAK;KACL,OAAO;KACP,WAAW,MAAU,EAAQ,EAAM,OAAO,MAAM;KAChD,aAAY;KACZ,cAAW;KACX,WAAU;KACV,CAAA,EACF,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAjDT,YAAY;AAC3B,OAAC,EAAK,MAAM,IAAI,CAAC,MAGrB,MAAM,EAAgB,EACpB,WAAW,EACT,OAAO;OACL,SAAS;OACT,MAAM,EAAK,MAAM;OACjB,UAAU;OACV,YAAY,EAAE;OACd,kBAAkB,EAAE;OACrB,EACF,EACF,CAAC,EACF,EAAQ,GAAG,EACX,MAAM,GAAS;;KAiCoC,UAAU;eAAvD,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,IAAW,gBAAgB,SACrB;OACL;MACQ,EAAA,CAAA;GAEf,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"}
|