@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
|
@@ -1,53 +1,59 @@
|
|
|
1
1
|
import { useEventfullyManaged as e } from "../context/EventfullyManagedContext.js";
|
|
2
2
|
import { cn as t } from "../utils/cn.js";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { AuroraBackground as i } from "@burdenoff/fe-libs/ui";
|
|
4
5
|
//#region src/eventfullymanaged/components/PageLayout.tsx
|
|
5
|
-
function
|
|
6
|
-
let { navigate:
|
|
6
|
+
function a({ title: a, description: o, actions: s, children: c, backPath: l, hero: u = !1 }) {
|
|
7
|
+
let { navigate: d } = e();
|
|
7
8
|
return /* @__PURE__ */ r("div", {
|
|
8
9
|
className: t("flex flex-col h-full bg-bg-surface"),
|
|
9
10
|
children: [/* @__PURE__ */ r("div", {
|
|
10
|
-
className: t("flex items-start justify-between
|
|
11
|
-
children: [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
11
|
+
className: t("relative flex items-start justify-between gap-4 overflow-hidden border-b border-border-seam px-6 py-5", u ? "bg-accent-wash" : "bg-bg-surface"),
|
|
12
|
+
children: [
|
|
13
|
+
u ? /* @__PURE__ */ n(i, { intensity: "subtle" }) : null,
|
|
14
|
+
/* @__PURE__ */ r("div", {
|
|
15
|
+
className: "flex min-w-0 flex-col gap-1",
|
|
16
|
+
children: [
|
|
17
|
+
l && /* @__PURE__ */ r("button", {
|
|
18
|
+
type: "button",
|
|
19
|
+
onClick: () => d(l),
|
|
20
|
+
className: t("flex w-fit items-center gap-1 rounded-button text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]"),
|
|
21
|
+
children: [/* @__PURE__ */ n("svg", {
|
|
22
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
23
|
+
width: "16",
|
|
24
|
+
height: "16",
|
|
25
|
+
viewBox: "0 0 24 24",
|
|
26
|
+
fill: "none",
|
|
27
|
+
stroke: "currentColor",
|
|
28
|
+
strokeWidth: "2",
|
|
29
|
+
strokeLinecap: "round",
|
|
30
|
+
strokeLinejoin: "round",
|
|
31
|
+
"aria-hidden": "true",
|
|
32
|
+
children: /* @__PURE__ */ n("path", { d: "m15 18-6-6 6-6" })
|
|
33
|
+
}), "Back"]
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ n("h1", {
|
|
36
|
+
className: t("text-2xl font-semibold text-text-primary"),
|
|
37
|
+
children: a
|
|
38
|
+
}),
|
|
39
|
+
o && /* @__PURE__ */ n("p", {
|
|
40
|
+
className: t("mt-0.5 text-sm text-text-secondary"),
|
|
41
|
+
children: o
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
}),
|
|
45
|
+
s && /* @__PURE__ */ n("div", {
|
|
46
|
+
className: "relative flex shrink-0 items-center gap-2",
|
|
47
|
+
children: s
|
|
48
|
+
})
|
|
49
|
+
]
|
|
44
50
|
}), /* @__PURE__ */ n("div", {
|
|
45
51
|
className: t("flex-1 overflow-auto p-6"),
|
|
46
|
-
children:
|
|
52
|
+
children: c
|
|
47
53
|
})]
|
|
48
54
|
});
|
|
49
55
|
}
|
|
50
56
|
//#endregion
|
|
51
|
-
export {
|
|
57
|
+
export { a as PageLayout };
|
|
52
58
|
|
|
53
59
|
//# sourceMappingURL=PageLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/eventfullymanaged/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useEventfullyManaged } from '../context/EventfullyManagedContext';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title:
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/eventfullymanaged/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { useEventfullyManaged } from '../context/EventfullyManagedContext';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n backPath?: string;\n /** Render the page header with the living-glass aurora backdrop (MFE hero). */\n hero?: boolean;\n}\n\nexport function PageLayout({ title, description, actions, children, backPath, hero = false }: PageLayoutProps) {\n const { navigate } = useEventfullyManaged();\n\n return (\n <div className={cn('flex flex-col h-full bg-bg-surface')}>\n {/* Header */}\n <div\n className={cn(\n 'relative flex items-start justify-between gap-4 overflow-hidden border-b border-border-seam px-6 py-5',\n hero ? 'bg-accent-wash' : 'bg-bg-surface'\n )}\n >\n {hero ? <AuroraBackground intensity=\"subtle\" /> : null}\n <div className=\"flex min-w-0 flex-col gap-1\">\n {backPath && (\n <button\n type=\"button\"\n onClick={() => navigate(backPath)}\n className={cn(\n 'flex w-fit items-center gap-1 rounded-button text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n Back\n </button>\n )}\n <h1 className={cn('text-2xl font-semibold text-text-primary')}>{title}</h1>\n {description && <p className={cn('mt-0.5 text-sm text-text-secondary')}>{description}</p>}\n </div>\n {actions && <div className=\"relative flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn('flex-1 overflow-auto p-6')}>{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,SAAgB,EAAW,EAAE,UAAO,gBAAa,YAAS,aAAU,aAAU,UAAO,MAA0B;CAC7G,IAAM,EAAE,gBAAa,GAAsB;AAE3C,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,qCAAqC;YAAxD,CAEE,kBAAC,OAAD;GACE,WAAW,EACT,yGACA,IAAO,mBAAmB,gBAC3B;aAJH;IAMG,IAAO,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,GAAG;IAClD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAS,EAAS;OACjC,WAAW,EACT,kNACD;iBALH,CAOE,kBAAC,OAAD;QACE,OAAM;QACN,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,QAAO;QACP,aAAY;QACZ,eAAc;QACd,gBAAe;QACf,eAAY;kBAEZ,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;QACvB,CAAA,EAAA,OAEC;;MAEX,kBAAC,MAAD;OAAI,WAAW,EAAG,2CAA2C;iBAAG;OAAW,CAAA;MAC1E,KAAe,kBAAC,KAAD;OAAG,WAAW,EAAG,qCAAqC;iBAAG;OAAgB,CAAA;MACrF;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAA6C;KAAc,CAAA;IAClF;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,2BAA2B;GAAG;GAAe,CAAA,CAC5D"}
|
|
@@ -4,76 +4,129 @@ import { PageLayout as n } from "../../components/PageLayout.js";
|
|
|
4
4
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
5
|
import { BarChart3 as a, Building2 as o, CalendarDays as s, Megaphone as c, Ticket as l, Users as u } from "lucide-react";
|
|
6
6
|
import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { GlassCard as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/eventfullymanaged/pages/dashboard/DashboardPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
10
|
-
let n =
|
|
9
|
+
function g() {
|
|
10
|
+
let { t: g } = d(), _ = (e, t) => {
|
|
11
|
+
let n = g(e);
|
|
11
12
|
return n === e ? t : n;
|
|
12
|
-
}, { navigate:
|
|
13
|
+
}, { navigate: v } = e(), { data: y, loading: b } = t(), x = y?.dashboardSummary, S = [
|
|
13
14
|
{
|
|
14
|
-
label:
|
|
15
|
-
value:
|
|
15
|
+
label: _("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
|
|
16
|
+
value: x?.activeEvents ?? 0,
|
|
16
17
|
icon: s,
|
|
17
18
|
path: "/events"
|
|
18
19
|
},
|
|
19
20
|
{
|
|
20
|
-
label:
|
|
21
|
-
value:
|
|
21
|
+
label: _("eventfullymanaged.dashboard.cards.venues", "Venues"),
|
|
22
|
+
value: x?.totalVenues ?? 0,
|
|
22
23
|
icon: o,
|
|
23
24
|
path: "/venues"
|
|
24
25
|
},
|
|
25
26
|
{
|
|
26
|
-
label:
|
|
27
|
-
value:
|
|
27
|
+
label: _("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
|
|
28
|
+
value: x?.totalRegistrations ?? 0,
|
|
28
29
|
icon: l,
|
|
29
30
|
path: "/registration"
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
|
-
label:
|
|
33
|
-
value:
|
|
33
|
+
label: _("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
|
|
34
|
+
value: x?.totalSponsors ?? 0,
|
|
34
35
|
icon: c,
|
|
35
36
|
path: "/communication"
|
|
36
37
|
},
|
|
37
38
|
{
|
|
38
|
-
label:
|
|
39
|
-
value:
|
|
39
|
+
label: _("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
|
|
40
|
+
value: x?.totalEvents ?? 0,
|
|
40
41
|
icon: a,
|
|
41
42
|
path: "/analytics"
|
|
42
43
|
},
|
|
43
44
|
{
|
|
44
|
-
label:
|
|
45
|
-
value:
|
|
45
|
+
label: _("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
|
|
46
|
+
value: x?.upcomingSessions ?? 0,
|
|
46
47
|
icon: u,
|
|
47
48
|
path: "/networking"
|
|
48
49
|
}
|
|
49
50
|
];
|
|
50
|
-
return /* @__PURE__ */
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
51
|
+
return /* @__PURE__ */ i(n, {
|
|
52
|
+
hero: !0,
|
|
53
|
+
title: /* @__PURE__ */ r(p, {
|
|
54
|
+
as: "span",
|
|
55
|
+
children: _("eventfullymanaged.dashboard.title", "EventfullyManaged")
|
|
56
|
+
}),
|
|
57
|
+
description: b ? _("eventfullymanaged.dashboard.description.loading", "Loading real-time event operations summary...") : _("eventfullymanaged.dashboard.description.ready", "Unified event operations dashboard."),
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ r(h, {
|
|
60
|
+
className: "mb-6",
|
|
61
|
+
children: _("eventfullymanaged.dashboard.purpose", "Your event control center. Each tile below is a live count from a different part of your event operations — events, venues, registrations, campaigns, analytics and networking. Open any tile to manage that area, or follow the suggested next steps to set up a new event end to end.")
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ r("div", {
|
|
64
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
|
|
65
|
+
children: S.map((e, t) => {
|
|
66
|
+
let n = e.icon, a = t === 0;
|
|
67
|
+
return /* @__PURE__ */ i(f, {
|
|
68
|
+
treatment: a ? "glass" : "metric",
|
|
69
|
+
glow: a,
|
|
70
|
+
role: "button",
|
|
71
|
+
tabIndex: 0,
|
|
72
|
+
"aria-label": `${e.label}: ${e.value.toLocaleString()}`,
|
|
73
|
+
onClick: () => v(e.path),
|
|
74
|
+
onKeyDown: (t) => {
|
|
75
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), v(e.path));
|
|
76
|
+
},
|
|
77
|
+
className: "cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
|
|
78
|
+
children: [/* @__PURE__ */ i("div", {
|
|
79
|
+
className: "flex items-center justify-between",
|
|
80
|
+
children: [/* @__PURE__ */ r("span", {
|
|
81
|
+
className: "text-sm text-text-secondary",
|
|
82
|
+
children: e.label
|
|
83
|
+
}), /* @__PURE__ */ r(n, { className: "h-5 w-5 text-action-primary-bg" })]
|
|
84
|
+
}), /* @__PURE__ */ r("div", {
|
|
85
|
+
className: "mt-3 text-3xl font-semibold tabular-nums text-text-primary",
|
|
86
|
+
children: e.value.toLocaleString()
|
|
87
|
+
})]
|
|
88
|
+
}, e.label);
|
|
89
|
+
})
|
|
90
|
+
}),
|
|
91
|
+
/* @__PURE__ */ r(m, {
|
|
92
|
+
className: "mt-6",
|
|
93
|
+
storageKey: "eventfullymanaged-dashboard",
|
|
94
|
+
title: _("eventfullymanaged.dashboard.nextSteps.title", "Get your first event running"),
|
|
95
|
+
steps: [
|
|
96
|
+
{
|
|
97
|
+
id: "create-event",
|
|
98
|
+
label: _("eventfullymanaged.dashboard.nextSteps.createEvent", "Create an event"),
|
|
99
|
+
description: _("eventfullymanaged.dashboard.nextSteps.createEventDesc", "Start with the basics — name, dates and capacity."),
|
|
100
|
+
icon: /* @__PURE__ */ r(s, { className: "h-4 w-4" }),
|
|
101
|
+
onClick: () => v("/events")
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "add-venue",
|
|
105
|
+
label: _("eventfullymanaged.dashboard.nextSteps.addVenue", "Add a venue"),
|
|
106
|
+
description: _("eventfullymanaged.dashboard.nextSteps.addVenueDesc", "Map your event to a space with capacity and floor plans."),
|
|
107
|
+
icon: /* @__PURE__ */ r(o, { className: "h-4 w-4" }),
|
|
108
|
+
onClick: () => v("/venues/create")
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "open-registration",
|
|
112
|
+
label: _("eventfullymanaged.dashboard.nextSteps.openRegistration", "Open registration"),
|
|
113
|
+
description: _("eventfullymanaged.dashboard.nextSteps.openRegistrationDesc", "Set up ticket types and track attendee sign-ups."),
|
|
114
|
+
icon: /* @__PURE__ */ r(l, { className: "h-4 w-4" }),
|
|
115
|
+
onClick: () => v("/registration")
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "invite-sponsors",
|
|
119
|
+
label: _("eventfullymanaged.dashboard.nextSteps.inviteSponsors", "Onboard sponsors"),
|
|
120
|
+
description: _("eventfullymanaged.dashboard.nextSteps.inviteSponsorsDesc", "Add sponsors and start tracking value and leads."),
|
|
121
|
+
icon: /* @__PURE__ */ r(c, { className: "h-4 w-4" }),
|
|
122
|
+
onClick: () => v("/communication")
|
|
123
|
+
}
|
|
124
|
+
]
|
|
72
125
|
})
|
|
73
|
-
|
|
126
|
+
]
|
|
74
127
|
});
|
|
75
128
|
}
|
|
76
129
|
//#endregion
|
|
77
|
-
export {
|
|
130
|
+
export { g as default };
|
|
78
131
|
|
|
79
132
|
//# sourceMappingURL=DashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import { BarChart3, Building2, CalendarDays, Megaphone, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { useDashboardSummaryQuery } from '../../api/eventApi';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype StatCard = {\n label: string;\n value: number;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n};\n\nexport default function DashboardPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useDashboardSummaryQuery();\n\n const summary = data?.dashboardSummary;\n const cards: StatCard[] = [\n {\n label: t('eventfullymanaged.dashboard.cards.activeEvents', 'Active Events'),\n value: summary?.activeEvents ?? 0,\n icon: CalendarDays,\n path: '/events',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.venues', 'Venues'),\n value: summary?.totalVenues ?? 0,\n icon: Building2,\n path: '/venues',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.registrations', 'Registrations'),\n value: summary?.totalRegistrations ?? 0,\n icon: Ticket,\n path: '/registration',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.campaigns', 'Campaigns'),\n value: summary?.totalSponsors ?? 0,\n icon: Megaphone,\n path: '/communication',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.analyticsReports', 'Analytics Reports'),\n value: summary?.totalEvents ?? 0,\n icon: BarChart3,\n path: '/analytics',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.networkMatches', 'Network Matches'),\n value: summary?.upcomingSessions ?? 0,\n icon: Users,\n path: '/networking',\n },\n ];\n\n return (\n <PageLayout\n title={t('eventfullymanaged.dashboard.title', 'EventfullyManaged')}\n description={\n loading\n ? t('eventfullymanaged.dashboard.description.loading', 'Loading real-time event operations summary...')\n : t('eventfullymanaged.dashboard.description.ready', 'Unified event operations dashboard.')\n }\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {cards.map((card) => {\n const Icon = card.icon;\n return (\n <
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import { BarChart3, Building2, CalendarDays, Megaphone, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { GlassCard, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { useDashboardSummaryQuery } from '../../api/eventApi';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype StatCard = {\n label: string;\n value: number;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n};\n\nexport default function DashboardPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useDashboardSummaryQuery();\n\n const summary = data?.dashboardSummary;\n const cards: StatCard[] = [\n {\n label: t('eventfullymanaged.dashboard.cards.activeEvents', 'Active Events'),\n value: summary?.activeEvents ?? 0,\n icon: CalendarDays,\n path: '/events',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.venues', 'Venues'),\n value: summary?.totalVenues ?? 0,\n icon: Building2,\n path: '/venues',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.registrations', 'Registrations'),\n value: summary?.totalRegistrations ?? 0,\n icon: Ticket,\n path: '/registration',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.campaigns', 'Campaigns'),\n value: summary?.totalSponsors ?? 0,\n icon: Megaphone,\n path: '/communication',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.analyticsReports', 'Analytics Reports'),\n value: summary?.totalEvents ?? 0,\n icon: BarChart3,\n path: '/analytics',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.networkMatches', 'Network Matches'),\n value: summary?.upcomingSessions ?? 0,\n icon: Users,\n path: '/networking',\n },\n ];\n\n return (\n <PageLayout\n hero\n title={<GradientText as=\"span\">{t('eventfullymanaged.dashboard.title', 'EventfullyManaged')}</GradientText>}\n description={\n loading\n ? t('eventfullymanaged.dashboard.description.loading', 'Loading real-time event operations summary...')\n : t('eventfullymanaged.dashboard.description.ready', 'Unified event operations dashboard.')\n }\n >\n <PagePurpose className=\"mb-6\">\n {t(\n 'eventfullymanaged.dashboard.purpose',\n 'Your event control center. Each tile below is a live count from a different part of your event operations — events, venues, registrations, campaigns, analytics and networking. Open any tile to manage that area, or follow the suggested next steps to set up a new event end to end.'\n )}\n </PagePurpose>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {cards.map((card, index) => {\n const Icon = card.icon;\n const featured = index === 0;\n return (\n <GlassCard\n key={card.label}\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n role=\"button\"\n tabIndex={0}\n aria-label={`${card.label}: ${card.value.toLocaleString()}`}\n onClick={() => navigate(card.path)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(card.path);\n }\n }}\n className=\"cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">{card.label}</span>\n <Icon className=\"h-5 w-5 text-action-primary-bg\" />\n </div>\n <div className=\"mt-3 text-3xl font-semibold tabular-nums text-text-primary\">\n {card.value.toLocaleString()}\n </div>\n </GlassCard>\n );\n })}\n </div>\n\n <NextSteps\n className=\"mt-6\"\n storageKey=\"eventfullymanaged-dashboard\"\n title={t('eventfullymanaged.dashboard.nextSteps.title', 'Get your first event running')}\n steps={[\n {\n id: 'create-event',\n label: t('eventfullymanaged.dashboard.nextSteps.createEvent', 'Create an event'),\n description: t(\n 'eventfullymanaged.dashboard.nextSteps.createEventDesc',\n 'Start with the basics — name, dates and capacity.'\n ),\n icon: <CalendarDays className=\"h-4 w-4\" />,\n onClick: () => navigate('/events'),\n },\n {\n id: 'add-venue',\n label: t('eventfullymanaged.dashboard.nextSteps.addVenue', 'Add a venue'),\n description: t(\n 'eventfullymanaged.dashboard.nextSteps.addVenueDesc',\n 'Map your event to a space with capacity and floor plans.'\n ),\n icon: <Building2 className=\"h-4 w-4\" />,\n onClick: () => navigate('/venues/create'),\n },\n {\n id: 'open-registration',\n label: t('eventfullymanaged.dashboard.nextSteps.openRegistration', 'Open registration'),\n description: t(\n 'eventfullymanaged.dashboard.nextSteps.openRegistrationDesc',\n 'Set up ticket types and track attendee sign-ups.'\n ),\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'invite-sponsors',\n label: t('eventfullymanaged.dashboard.nextSteps.inviteSponsors', 'Onboard sponsors'),\n description: t(\n 'eventfullymanaged.dashboard.nextSteps.inviteSponsorsDesc',\n 'Add sponsors and start tracking value and leads.'\n ),\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -3,20 +3,21 @@ import { EntityListSection as n } from "./EntityListSection.js";
|
|
|
3
3
|
import { useMemo as r, useState as i } from "react";
|
|
4
4
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
5
|
import { BarChart3 as s } from "lucide-react";
|
|
6
|
+
import { Button as c, EmphasisPanel as l, GradientText as u, Input as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/eventfullymanaged/pages/modules/AnalyticsPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let
|
|
8
|
+
function p() {
|
|
9
|
+
let p = e({
|
|
9
10
|
limit: 100,
|
|
10
11
|
offset: 0
|
|
11
|
-
}), [
|
|
12
|
+
}), [m, { loading: h }] = t(), [g, _] = i("overview"), v = r(() => p.data?.analyticsSnapshots.items ?? [], [p.data]);
|
|
12
13
|
return /* @__PURE__ */ o("div", {
|
|
13
14
|
className: "space-y-6 p-6",
|
|
14
|
-
children: [
|
|
15
|
-
|
|
16
|
-
children: [
|
|
15
|
+
children: [
|
|
16
|
+
/* @__PURE__ */ a(f, { children: "Snapshots capture a point-in-time picture of how your events are performing — registrations, attendance, revenue and engagement frozen at the moment you generate them. Use this page to take a daily or post-event snapshot so you can compare trends over time and report on outcomes." }),
|
|
17
|
+
/* @__PURE__ */ o(l, { children: [
|
|
17
18
|
/* @__PURE__ */ a("h1", {
|
|
18
19
|
className: "text-2xl font-bold text-text-primary",
|
|
19
|
-
children: "Analytics"
|
|
20
|
+
children: /* @__PURE__ */ a(u, { children: "Analytics" })
|
|
20
21
|
}),
|
|
21
22
|
/* @__PURE__ */ a("p", {
|
|
22
23
|
className: "mt-1 text-sm text-text-secondary",
|
|
@@ -24,39 +25,41 @@ function c() {
|
|
|
24
25
|
}),
|
|
25
26
|
/* @__PURE__ */ o("div", {
|
|
26
27
|
className: "mt-4 flex flex-col gap-3 sm:flex-row",
|
|
27
|
-
children: [/* @__PURE__ */ a(
|
|
28
|
-
value:
|
|
29
|
-
onChange: (e) =>
|
|
28
|
+
children: [/* @__PURE__ */ a(d, {
|
|
29
|
+
value: g,
|
|
30
|
+
onChange: (e) => _(e.target.value),
|
|
30
31
|
placeholder: "daily-summary",
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
"aria-label": "Snapshot name",
|
|
33
|
+
className: "flex-1"
|
|
34
|
+
}), /* @__PURE__ */ o(c, {
|
|
33
35
|
type: "button",
|
|
34
|
-
disabled:
|
|
36
|
+
disabled: h,
|
|
35
37
|
onClick: async () => {
|
|
36
|
-
|
|
37
|
-
name:
|
|
38
|
-
title:
|
|
38
|
+
g.trim() && await m({ variables: { input: {
|
|
39
|
+
name: g,
|
|
40
|
+
title: g,
|
|
39
41
|
status: "created",
|
|
40
42
|
metadata: {}
|
|
41
43
|
} } });
|
|
42
44
|
},
|
|
43
|
-
|
|
44
|
-
children: [/* @__PURE__ */ a(s, { className: "mr-2 h-4 w-4" }), u ? "Generating..." : "Generate Snapshot"]
|
|
45
|
+
children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), h ? "Generating..." : "Generate Snapshot"]
|
|
45
46
|
})]
|
|
46
47
|
})
|
|
47
|
-
]
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ a(n, {
|
|
50
|
+
heading: p.loading ? "Loading snapshots..." : `Snapshots (${v.length})`,
|
|
51
|
+
emptyLabel: "No analytics snapshots available yet.",
|
|
52
|
+
emptyIllustration: "empty-data",
|
|
53
|
+
rows: v.map((e) => ({
|
|
54
|
+
id: e.id,
|
|
55
|
+
title: e.title ?? e.name ?? `Snapshot ${e.id}`,
|
|
56
|
+
status: e.status ?? void 0
|
|
57
|
+
}))
|
|
58
|
+
})
|
|
59
|
+
]
|
|
57
60
|
});
|
|
58
61
|
}
|
|
59
62
|
//#endregion
|
|
60
|
-
export {
|
|
63
|
+
export { p as default };
|
|
61
64
|
|
|
62
65
|
//# sourceMappingURL=AnalyticsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport { useAnalyticsSnapshotsQuery, useUpsertAnalyticsSnapshotMutation } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SnapshotRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function AnalyticsPage() {\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const [upsertSnapshot, { loading: creating }] = useUpsertAnalyticsSnapshotMutation();\n const [snapshotName, setSnapshotName] = useState('overview');\n\n const snapshots = useMemo(\n () => (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as SnapshotRow[],\n [snapshotsQuery.data]\n );\n\n const onCreate = async () => {\n if (!snapshotName.trim()) return;\n await upsertSnapshot({\n variables: {\n input: {\n name: snapshotName,\n title: snapshotName,\n status: 'created',\n metadata: {},\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <
|
|
1
|
+
{"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from 'lucide-react';\nimport { Button, EmphasisPanel, GradientText, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useAnalyticsSnapshotsQuery, useUpsertAnalyticsSnapshotMutation } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SnapshotRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function AnalyticsPage() {\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const [upsertSnapshot, { loading: creating }] = useUpsertAnalyticsSnapshotMutation();\n const [snapshotName, setSnapshotName] = useState('overview');\n\n const snapshots = useMemo(\n () => (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as SnapshotRow[],\n [snapshotsQuery.data]\n );\n\n const onCreate = async () => {\n if (!snapshotName.trim()) return;\n await upsertSnapshot({\n variables: {\n input: {\n name: snapshotName,\n title: snapshotName,\n status: 'created',\n metadata: {},\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Snapshots capture a point-in-time picture of how your events are performing — registrations, attendance,\n revenue and engagement frozen at the moment you generate them. Use this page to take a daily or post-event\n snapshot so you can compare trends over time and report on outcomes.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Analytics</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Generate and track analytics snapshots from event operations data.\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <Input\n value={snapshotName}\n onChange={(e) => setSnapshotName(e.target.value)}\n placeholder=\"daily-summary\"\n aria-label=\"Snapshot name\"\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creating} onClick={onCreate}>\n <BarChart3 className=\"h-4 w-4\" />\n {creating ? 'Generating...' : 'Generate Snapshot'}\n </Button>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={snapshotsQuery.loading ? 'Loading snapshots...' : `Snapshots (${snapshots.length})`}\n emptyLabel=\"No analytics snapshots available yet.\"\n emptyIllustration=\"empty-data\"\n rows={snapshots.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Snapshot ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAcA,SAAwB,IAAgB;CACtC,IAAM,IAAiB,EAA2B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACtE,CAAC,GAAgB,EAAE,SAAS,OAAc,GAAoC,EAC9E,CAAC,GAAc,KAAmB,EAAS,WAAW,EAEtD,IAAY,QACT,EAAe,MAAM,mBAAmB,SAAS,EAAE,EAC1D,CAAC,EAAe,KAAK,CACtB;AAgBD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAa,4RAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,aAAwB,CAAA;KACnC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAAmC;KAE5C,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,OAAO;MACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;MAChD,aAAY;MACZ,cAAW;MACX,WAAU;MACV,CAAA,EACF,kBAAC,GAAD;MAAQ,MAAK;MAAS,UAAU;MAAU,SArCjC,YAAY;AACtB,SAAa,MAAM,IACxB,MAAM,EAAe,EACnB,WAAW,EACT,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU,EAAE;QACb,EACF,EACF,CAAC;;gBA0BI,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAChC,IAAW,kBAAkB,oBACvB;QACL;;IACQ,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAe,UAAU,yBAAyB,cAAc,EAAU,OAAO;IAC1F,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAU,KAAK,OAAS;KAC5B,IAAI,EAAI;KACR,OAAO,EAAI,SAAS,EAAI,QAAQ,YAAY,EAAI;KAChD,QAAQ,EAAI,UAAU,KAAA;KACvB,EAAE;IACH,CAAA;GACE"}
|