@burdenoff/microfe-eventfullymanaged 2026.529.1 → 2026.625.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eventfullymanaged/components/PageLayout.js +44 -38
- package/dist/eventfullymanaged/components/PageLayout.js.map +1 -1
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +39 -27
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +40 -41
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +67 -65
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +48 -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 +55 -57
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +17 -19
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +22 -22
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +90 -82
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +28 -29
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +67 -65
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +18 -20
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +68 -64
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +57 -60
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +197 -199
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +57 -39
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +41 -31
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +79 -62
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +185 -189
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +63 -35
- 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,68 +4,80 @@ 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 } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/eventfullymanaged/pages/dashboard/DashboardPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
10
|
-
let n =
|
|
9
|
+
function m() {
|
|
10
|
+
let { t: m } = d(), h = (e, t) => {
|
|
11
|
+
let n = m(e);
|
|
11
12
|
return n === e ? t : n;
|
|
12
|
-
}, { navigate:
|
|
13
|
+
}, { navigate: g } = e(), { data: _, loading: v } = t(), y = _?.dashboardSummary, b = [
|
|
13
14
|
{
|
|
14
|
-
label:
|
|
15
|
-
value:
|
|
15
|
+
label: h("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
|
|
16
|
+
value: y?.activeEvents ?? 0,
|
|
16
17
|
icon: s,
|
|
17
18
|
path: "/events"
|
|
18
19
|
},
|
|
19
20
|
{
|
|
20
|
-
label:
|
|
21
|
-
value:
|
|
21
|
+
label: h("eventfullymanaged.dashboard.cards.venues", "Venues"),
|
|
22
|
+
value: y?.totalVenues ?? 0,
|
|
22
23
|
icon: o,
|
|
23
24
|
path: "/venues"
|
|
24
25
|
},
|
|
25
26
|
{
|
|
26
|
-
label:
|
|
27
|
-
value:
|
|
27
|
+
label: h("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
|
|
28
|
+
value: y?.totalRegistrations ?? 0,
|
|
28
29
|
icon: l,
|
|
29
30
|
path: "/registration"
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
|
-
label:
|
|
33
|
-
value:
|
|
33
|
+
label: h("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
|
|
34
|
+
value: y?.totalSponsors ?? 0,
|
|
34
35
|
icon: c,
|
|
35
36
|
path: "/communication"
|
|
36
37
|
},
|
|
37
38
|
{
|
|
38
|
-
label:
|
|
39
|
-
value:
|
|
39
|
+
label: h("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
|
|
40
|
+
value: y?.totalEvents ?? 0,
|
|
40
41
|
icon: a,
|
|
41
42
|
path: "/analytics"
|
|
42
43
|
},
|
|
43
44
|
{
|
|
44
|
-
label:
|
|
45
|
-
value:
|
|
45
|
+
label: h("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
|
|
46
|
+
value: y?.upcomingSessions ?? 0,
|
|
46
47
|
icon: u,
|
|
47
48
|
path: "/networking"
|
|
48
49
|
}
|
|
49
50
|
];
|
|
50
51
|
return /* @__PURE__ */ r(n, {
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
hero: !0,
|
|
53
|
+
title: /* @__PURE__ */ r(p, {
|
|
54
|
+
as: "span",
|
|
55
|
+
children: h("eventfullymanaged.dashboard.title", "EventfullyManaged")
|
|
56
|
+
}),
|
|
57
|
+
description: v ? h("eventfullymanaged.dashboard.description.loading", "Loading real-time event operations summary...") : h("eventfullymanaged.dashboard.description.ready", "Unified event operations dashboard."),
|
|
53
58
|
children: /* @__PURE__ */ r("div", {
|
|
54
59
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
|
|
55
|
-
children:
|
|
56
|
-
let
|
|
57
|
-
return /* @__PURE__ */ i(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
children: b.map((e, t) => {
|
|
61
|
+
let n = e.icon, a = t === 0;
|
|
62
|
+
return /* @__PURE__ */ i(f, {
|
|
63
|
+
treatment: a ? "glass" : "metric",
|
|
64
|
+
glow: a,
|
|
65
|
+
role: "button",
|
|
66
|
+
tabIndex: 0,
|
|
67
|
+
"aria-label": `${e.label}: ${e.value.toLocaleString()}`,
|
|
68
|
+
onClick: () => g(e.path),
|
|
69
|
+
onKeyDown: (t) => {
|
|
70
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), g(e.path));
|
|
71
|
+
},
|
|
72
|
+
className: "cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
|
|
61
73
|
children: [/* @__PURE__ */ i("div", {
|
|
62
74
|
className: "flex items-center justify-between",
|
|
63
75
|
children: [/* @__PURE__ */ r("span", {
|
|
64
76
|
className: "text-sm text-text-secondary",
|
|
65
77
|
children: e.label
|
|
66
|
-
}), /* @__PURE__ */ r(
|
|
78
|
+
}), /* @__PURE__ */ r(n, { className: "h-5 w-5 text-action-primary-bg" })]
|
|
67
79
|
}), /* @__PURE__ */ r("div", {
|
|
68
|
-
className: "mt-3 text-3xl font-semibold text-text-primary",
|
|
80
|
+
className: "mt-3 text-3xl font-semibold tabular-nums text-text-primary",
|
|
69
81
|
children: e.value.toLocaleString()
|
|
70
82
|
})]
|
|
71
83
|
}, e.label);
|
|
@@ -74,6 +86,6 @@ function f() {
|
|
|
74
86
|
});
|
|
75
87
|
}
|
|
76
88
|
//#endregion
|
|
77
|
-
export {
|
|
89
|
+
export { m as default };
|
|
78
90
|
|
|
79
91
|
//# 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 } 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 <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 </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAwB,IAAgB;CACtC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,eAAY,GAA0B,EAE9C,IAAU,GAAM,kBAChB,IAAoB;EACxB;GACE,OAAO,EAAE,kDAAkD,gBAAgB;GAC3E,OAAO,GAAS,gBAAgB;GAChC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,4CAA4C,SAAS;GAC9D,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,mDAAmD,gBAAgB;GAC5E,OAAO,GAAS,sBAAsB;GACtC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,+CAA+C,YAAY;GACpE,OAAO,GAAS,iBAAiB;GACjC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,sDAAsD,oBAAoB;GACnF,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,oDAAoD,kBAAkB;GAC/E,OAAO,GAAS,oBAAoB;GACpC,MAAM;GACN,MAAM;GACP;EACF;AAED,QACE,kBAAC,GAAD;EACE,MAAA;EACA,OAAO,kBAAC,GAAD;GAAc,IAAG;aAAQ,EAAE,qCAAqC,oBAAoB;GAAgB,CAAA;EAC3G,aACE,IACI,EAAE,mDAAmD,gDAAgD,GACrG,EAAE,iDAAiD,sCAAsC;YAG/F,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,GAAM,MAAU;IAC1B,IAAM,IAAO,EAAK,MACZ,IAAW,MAAU;AAC3B,WACE,kBAAC,GAAD;KAEE,WAAW,IAAW,UAAU;KAChC,MAAM;KACN,MAAK;KACL,UAAU;KACV,cAAY,GAAG,EAAK,MAAM,IAAI,EAAK,MAAM,gBAAgB;KACzD,eAAe,EAAS,EAAK,KAAK;KAClC,YAAY,MAAU;AACpB,OAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,gBAAgB,EACtB,EAAS,EAAK,KAAK;;KAGvB,WAAU;eAdZ,CAgBE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAK;OAAa,CAAA,EACjE,kBAAC,GAAD,EAAM,WAAU,kCAAmC,CAAA,CAC/C;SACN,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAK,MAAM,gBAAgB;MACxB,CAAA,CACI;OAtBL,EAAK,MAsBA;KAEd;GACE,CAAA;EACK,CAAA"}
|
|
@@ -3,52 +3,51 @@ 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 } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/eventfullymanaged/pages/modules/AnalyticsPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let
|
|
8
|
+
function f() {
|
|
9
|
+
let f = e({
|
|
9
10
|
limit: 100,
|
|
10
11
|
offset: 0
|
|
11
|
-
}), [
|
|
12
|
+
}), [p, { loading: m }] = t(), [h, g] = i("overview"), _ = r(() => f.data?.analyticsSnapshots.items ?? [], [f.data]);
|
|
12
13
|
return /* @__PURE__ */ o("div", {
|
|
13
14
|
className: "space-y-6 p-6",
|
|
14
|
-
children: [/* @__PURE__ */ o(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/* @__PURE__ */ a("
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/* @__PURE__ */
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
]
|
|
48
|
-
}), /* @__PURE__ */ a(n, {
|
|
49
|
-
heading: c.loading ? "Loading snapshots..." : `Snapshots (${p.length})`,
|
|
15
|
+
children: [/* @__PURE__ */ o(l, { children: [
|
|
16
|
+
/* @__PURE__ */ a("h1", {
|
|
17
|
+
className: "text-2xl font-bold text-text-primary",
|
|
18
|
+
children: /* @__PURE__ */ a(u, { children: "Analytics" })
|
|
19
|
+
}),
|
|
20
|
+
/* @__PURE__ */ a("p", {
|
|
21
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
22
|
+
children: "Generate and track analytics snapshots from event operations data."
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ o("div", {
|
|
25
|
+
className: "mt-4 flex flex-col gap-3 sm:flex-row",
|
|
26
|
+
children: [/* @__PURE__ */ a(d, {
|
|
27
|
+
value: h,
|
|
28
|
+
onChange: (e) => g(e.target.value),
|
|
29
|
+
placeholder: "daily-summary",
|
|
30
|
+
"aria-label": "Snapshot name",
|
|
31
|
+
className: "flex-1"
|
|
32
|
+
}), /* @__PURE__ */ o(c, {
|
|
33
|
+
type: "button",
|
|
34
|
+
disabled: m,
|
|
35
|
+
onClick: async () => {
|
|
36
|
+
h.trim() && await p({ variables: { input: {
|
|
37
|
+
name: h,
|
|
38
|
+
title: h,
|
|
39
|
+
status: "created",
|
|
40
|
+
metadata: {}
|
|
41
|
+
} } });
|
|
42
|
+
},
|
|
43
|
+
children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), m ? "Generating..." : "Generate Snapshot"]
|
|
44
|
+
})]
|
|
45
|
+
})
|
|
46
|
+
] }), /* @__PURE__ */ a(n, {
|
|
47
|
+
heading: f.loading ? "Loading snapshots..." : `Snapshots (${_.length})`,
|
|
50
48
|
emptyLabel: "No analytics snapshots available yet.",
|
|
51
|
-
|
|
49
|
+
emptyIllustration: "empty-data",
|
|
50
|
+
rows: _.map((e) => ({
|
|
52
51
|
id: e.id,
|
|
53
52
|
title: e.title ?? e.name ?? `Snapshot ${e.id}`,
|
|
54
53
|
status: e.status ?? void 0
|
|
@@ -57,6 +56,6 @@ function c() {
|
|
|
57
56
|
});
|
|
58
57
|
}
|
|
59
58
|
//#endregion
|
|
60
|
-
export {
|
|
59
|
+
export { f as default };
|
|
61
60
|
|
|
62
61
|
//# 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 } 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 <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,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,aAAwB,CAAA;IACnC,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cAAmC;IAE5C,CAAA;GACJ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,OAAO;KACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;KAChD,aAAY;KACZ,cAAW;KACX,WAAU;KACV,CAAA,EACF,kBAAC,GAAD;KAAQ,MAAK;KAAS,UAAU;KAAU,SA/BjC,YAAY;AACtB,QAAa,MAAM,IACxB,MAAM,EAAe,EACnB,WAAW,EACT,OAAO;OACL,MAAM;OACN,OAAO;OACP,QAAQ;OACR,UAAU,EAAE;OACb,EACF,EACF,CAAC;;eAoBI,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAChC,IAAW,kBAAkB,oBACvB;OACL;;GACQ,EAAA,CAAA,EAEhB,kBAAC,GAAD;GACE,SAAS,EAAe,UAAU,yBAAyB,cAAc,EAAU,OAAO;GAC1F,YAAW;GACX,mBAAkB;GAClB,MAAM,EAAU,KAAK,OAAS;IAC5B,IAAI,EAAI;IACR,OAAO,EAAI,SAAS,EAAI,QAAQ,YAAY,EAAI;IAChD,QAAQ,EAAI,UAAU,KAAA;IACvB,EAAE;GACH,CAAA,CACE"}
|
|
@@ -3,78 +3,80 @@ import { EntityListSection as n } from "./EntityListSection.js";
|
|
|
3
3
|
import { useMemo 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
|
+
import { EmphasisPanel as s, GlassCard as c, GradientText as l } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { id:
|
|
8
|
+
function u() {
|
|
9
|
+
let { id: u = "" } = i(), d = e({
|
|
9
10
|
limit: 100,
|
|
10
11
|
offset: 0
|
|
11
|
-
}),
|
|
12
|
+
}), f = t({
|
|
12
13
|
limit: 100,
|
|
13
14
|
offset: 0
|
|
14
|
-
}),
|
|
15
|
+
}), p = r(() => (d.data?.attendees.items ?? []).find((e) => e.id === u), [u, d.data]), m = r(() => (f.data?.registrations.items ?? []).filter((e) => e.attendeeId === u), [u, f.data]);
|
|
15
16
|
return /* @__PURE__ */ o("div", {
|
|
16
17
|
className: "space-y-6 p-6",
|
|
17
|
-
children: [/* @__PURE__ */ o(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/* @__PURE__ */ a("
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
18
|
+
children: [/* @__PURE__ */ o(s, { children: [
|
|
19
|
+
/* @__PURE__ */ o("h1", {
|
|
20
|
+
className: "text-2xl font-bold text-text-primary",
|
|
21
|
+
children: [/* @__PURE__ */ a(l, { children: "Attendee" }), " Profile"]
|
|
22
|
+
}),
|
|
23
|
+
/* @__PURE__ */ a("p", {
|
|
24
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
25
|
+
children: d.loading ? "Loading attendee profile..." : p ? `${p.fullName ?? p.id} profile from registration and attendee APIs.` : "Attendee not found in current query scope."
|
|
26
|
+
}),
|
|
27
|
+
p ? /* @__PURE__ */ o("div", {
|
|
28
|
+
className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ o(c, {
|
|
31
|
+
treatment: "metric",
|
|
32
|
+
className: "p-3",
|
|
33
|
+
children: [/* @__PURE__ */ a("p", {
|
|
34
|
+
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
35
|
+
children: "Name"
|
|
36
|
+
}), /* @__PURE__ */ a("p", {
|
|
37
|
+
className: "mt-1 font-medium text-text-primary",
|
|
38
|
+
children: p.fullName ?? p.id
|
|
39
|
+
})]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ o(c, {
|
|
42
|
+
treatment: "metric",
|
|
43
|
+
className: "p-3",
|
|
44
|
+
children: [/* @__PURE__ */ a("p", {
|
|
45
|
+
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
46
|
+
children: "Email"
|
|
47
|
+
}), /* @__PURE__ */ a("p", {
|
|
48
|
+
className: "mt-1 font-medium text-text-primary",
|
|
49
|
+
children: p.email ?? "Unavailable"
|
|
50
|
+
})]
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ o(c, {
|
|
53
|
+
treatment: "metric",
|
|
54
|
+
className: "p-3",
|
|
55
|
+
children: [/* @__PURE__ */ a("p", {
|
|
56
|
+
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
57
|
+
children: "Company"
|
|
58
|
+
}), /* @__PURE__ */ a("p", {
|
|
59
|
+
className: "mt-1 font-medium text-text-primary",
|
|
60
|
+
children: p.company ?? "Unavailable"
|
|
61
|
+
})]
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ o(c, {
|
|
64
|
+
treatment: "metric",
|
|
65
|
+
className: "p-3",
|
|
66
|
+
children: [/* @__PURE__ */ a("p", {
|
|
67
|
+
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
68
|
+
children: "Role"
|
|
69
|
+
}), /* @__PURE__ */ a("p", {
|
|
70
|
+
className: "mt-1 font-medium text-text-primary",
|
|
71
|
+
children: p.role ?? "Unavailable"
|
|
72
|
+
})]
|
|
73
|
+
})
|
|
74
|
+
]
|
|
75
|
+
}) : null
|
|
76
|
+
] }), /* @__PURE__ */ a(n, {
|
|
77
|
+
heading: f.loading ? "Loading attendee registrations..." : `Registrations (${m.length})`,
|
|
76
78
|
emptyLabel: "No registrations linked to this attendee.",
|
|
77
|
-
rows:
|
|
79
|
+
rows: m.map((e) => ({
|
|
78
80
|
id: e.id,
|
|
79
81
|
title: `Registration ${e.id}`,
|
|
80
82
|
subtitle: [e.quantity ? `Qty ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
|
|
@@ -84,6 +86,6 @@ function s() {
|
|
|
84
86
|
});
|
|
85
87
|
}
|
|
86
88
|
//#endregion
|
|
87
|
-
export {
|
|
89
|
+
export { u as default };
|
|
88
90
|
|
|
89
91
|
//# sourceMappingURL=AttendeeProfilePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttendeeProfilePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useAttendeesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\nexport default function AttendeeProfilePage() {\n const { id = '' } = useParams();\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n\n const attendee = useMemo(\n () => ((attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[]).find((item) => item.id === id),\n [id, attendeesQuery.data]\n );\n const registrations = useMemo(\n () =>\n ((registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[]).filter(\n (registration) => registration.attendeeId === id\n ),\n [id, registrationsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <
|
|
1
|
+
{"version":3,"file":"AttendeeProfilePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useAttendeesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\nexport default function AttendeeProfilePage() {\n const { id = '' } = useParams();\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n\n const attendee = useMemo(\n () => ((attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[]).find((item) => item.id === id),\n [id, attendeesQuery.data]\n );\n const registrations = useMemo(\n () =>\n ((registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[]).filter(\n (registration) => registration.attendeeId === id\n ),\n [id, registrationsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Attendee</GradientText> Profile\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {attendeesQuery.loading\n ? 'Loading attendee profile...'\n : attendee\n ? `${attendee.fullName ?? attendee.id} profile from registration and attendee APIs.`\n : 'Attendee not found in current query scope.'}\n </p>\n {attendee ? (\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Name</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.fullName ?? attendee.id}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Email</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.email ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Company</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.company ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Role</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.role ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading ? 'Loading attendee registrations...' : `Registrations (${registrations.length})`\n }\n emptyLabel=\"No registrations linked to this attendee.\"\n rows={registrations.map((registration) => ({\n id: registration.id,\n title: `Registration ${registration.id}`,\n subtitle: [\n registration.quantity ? `Qty ${registration.quantity}` : undefined,\n registration.totalAmount ? `${registration.totalAmount} ${registration.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: registration.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAwBA,SAAwB,IAAsB;CAC5C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,IAAiB,EAAkB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC7D,IAAqB,EAAsB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAErE,IAAW,SACP,EAAe,MAAM,UAAU,SAAS,EAAE,EAAoB,MAAM,MAAS,EAAK,OAAO,EAAG,EACpG,CAAC,GAAI,EAAe,KAAK,CAC1B,EACK,IAAgB,SAEhB,EAAmB,MAAM,cAAc,SAAS,EAAE,EAAwB,QACzE,MAAiB,EAAa,eAAe,EAC/C,EACH,CAAC,GAAI,EAAmB,KAAK,CAC9B;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,YAAuB,CAAA,EAAA,WAClC;;GACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAe,UACZ,gCACA,IACE,GAAG,EAAS,YAAY,EAAS,GAAG,iDACpC;IACJ,CAAA;GACH,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAQ,CAAA,EAC3E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,YAAY,EAAS;OAAO,CAAA,CAC9E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAS,CAAA,EAC5E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,SAAS;OAAkB,CAAA,CAC7E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAW,CAAA,EAC9E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,WAAW;OAAkB,CAAA,CAC/E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAQ,CAAA,EAC3E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,QAAQ;OAAkB,CAAA,CAC5E;;KACR;QACJ;GACU,EAAA,CAAA,EAEhB,kBAAC,GAAD;GACE,SACE,EAAmB,UAAU,sCAAsC,kBAAkB,EAAc,OAAO;GAE5G,YAAW;GACX,MAAM,EAAc,KAAK,OAAkB;IACzC,IAAI,EAAa;IACjB,OAAO,gBAAgB,EAAa;IACpC,UAAU,CACR,EAAa,WAAW,OAAO,EAAa,aAAa,KAAA,GACzD,EAAa,cAAc,GAAG,EAAa,YAAY,GAAG,EAAa,YAAY,OAAO,KAAA,EAC3F,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;IACd,QAAQ,EAAa;IACtB,EAAE;GACH,CAAA,CACE"}
|