@burdenoff/microfe-eventfullymanaged 2026.625.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.
Files changed (39) hide show
  1. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
  2. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
  3. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +49 -45
  4. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  5. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +111 -78
  6. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  7. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +29 -28
  8. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  9. package/dist/eventfullymanaged/pages/modules/EventsPage.js +71 -42
  10. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
  12. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +54 -24
  14. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
  16. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
  18. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +110 -77
  20. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
  22. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
  24. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +61 -42
  26. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +85 -85
  28. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  29. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
  30. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  31. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +37 -40
  32. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  33. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
  34. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  35. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +99 -99
  36. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  37. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
  38. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  39. package/package.json +2 -2
@@ -4,88 +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 } from "@burdenoff/fe-libs/ui";
7
+ import { GlassCard as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
8
8
  //#region src/eventfullymanaged/pages/dashboard/DashboardPage.tsx
9
- function m() {
10
- let { t: m } = d(), h = (e, t) => {
11
- let n = m(e);
9
+ function g() {
10
+ let { t: g } = d(), _ = (e, t) => {
11
+ let n = g(e);
12
12
  return n === e ? t : n;
13
- }, { navigate: g } = e(), { data: _, loading: v } = t(), y = _?.dashboardSummary, b = [
13
+ }, { navigate: v } = e(), { data: y, loading: b } = t(), x = y?.dashboardSummary, S = [
14
14
  {
15
- label: h("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
16
- value: y?.activeEvents ?? 0,
15
+ label: _("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
16
+ value: x?.activeEvents ?? 0,
17
17
  icon: s,
18
18
  path: "/events"
19
19
  },
20
20
  {
21
- label: h("eventfullymanaged.dashboard.cards.venues", "Venues"),
22
- value: y?.totalVenues ?? 0,
21
+ label: _("eventfullymanaged.dashboard.cards.venues", "Venues"),
22
+ value: x?.totalVenues ?? 0,
23
23
  icon: o,
24
24
  path: "/venues"
25
25
  },
26
26
  {
27
- label: h("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
28
- value: y?.totalRegistrations ?? 0,
27
+ label: _("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
28
+ value: x?.totalRegistrations ?? 0,
29
29
  icon: l,
30
30
  path: "/registration"
31
31
  },
32
32
  {
33
- label: h("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
34
- value: y?.totalSponsors ?? 0,
33
+ label: _("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
34
+ value: x?.totalSponsors ?? 0,
35
35
  icon: c,
36
36
  path: "/communication"
37
37
  },
38
38
  {
39
- label: h("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
40
- value: y?.totalEvents ?? 0,
39
+ label: _("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
40
+ value: x?.totalEvents ?? 0,
41
41
  icon: a,
42
42
  path: "/analytics"
43
43
  },
44
44
  {
45
- label: h("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
46
- value: y?.upcomingSessions ?? 0,
45
+ label: _("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
46
+ value: x?.upcomingSessions ?? 0,
47
47
  icon: u,
48
48
  path: "/networking"
49
49
  }
50
50
  ];
51
- return /* @__PURE__ */ r(n, {
51
+ return /* @__PURE__ */ i(n, {
52
52
  hero: !0,
53
53
  title: /* @__PURE__ */ r(p, {
54
54
  as: "span",
55
- children: h("eventfullymanaged.dashboard.title", "EventfullyManaged")
55
+ children: _("eventfullymanaged.dashboard.title", "EventfullyManaged")
56
56
  }),
57
- description: v ? h("eventfullymanaged.dashboard.description.loading", "Loading real-time event operations summary...") : h("eventfullymanaged.dashboard.description.ready", "Unified event operations dashboard."),
58
- children: /* @__PURE__ */ r("div", {
59
- className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
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));
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")
71
102
  },
72
- className: "cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
73
- children: [/* @__PURE__ */ i("div", {
74
- className: "flex items-center justify-between",
75
- children: [/* @__PURE__ */ r("span", {
76
- className: "text-sm text-text-secondary",
77
- children: e.label
78
- }), /* @__PURE__ */ r(n, { className: "h-5 w-5 text-action-primary-bg" })]
79
- }), /* @__PURE__ */ r("div", {
80
- className: "mt-3 text-3xl font-semibold tabular-nums text-text-primary",
81
- children: e.value.toLocaleString()
82
- })]
83
- }, e.label);
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
+ ]
84
125
  })
85
- })
126
+ ]
86
127
  });
87
128
  }
88
129
  //#endregion
89
- export { m as default };
130
+ export { g as default };
90
131
 
91
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';\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"}
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,59 +3,63 @@ 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
+ import { Button as c, EmphasisPanel as l, GradientText as u, Input as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/eventfullymanaged/pages/modules/AnalyticsPage.tsx
8
- function f() {
9
- let f = e({
8
+ function p() {
9
+ let p = e({
10
10
  limit: 100,
11
11
  offset: 0
12
- }), [p, { loading: m }] = t(), [h, g] = i("overview"), _ = r(() => f.data?.analyticsSnapshots.items ?? [], [f.data]);
12
+ }), [m, { loading: h }] = t(), [g, _] = i("overview"), v = r(() => p.data?.analyticsSnapshots.items ?? [], [p.data]);
13
13
  return /* @__PURE__ */ o("div", {
14
14
  className: "space-y-6 p-6",
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
- })]
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: [
18
+ /* @__PURE__ */ a("h1", {
19
+ className: "text-2xl font-bold text-text-primary",
20
+ children: /* @__PURE__ */ a(u, { children: "Analytics" })
21
+ }),
22
+ /* @__PURE__ */ a("p", {
23
+ className: "mt-1 text-sm text-text-secondary",
24
+ children: "Generate and track analytics snapshots from event operations data."
25
+ }),
26
+ /* @__PURE__ */ o("div", {
27
+ className: "mt-4 flex flex-col gap-3 sm:flex-row",
28
+ children: [/* @__PURE__ */ a(d, {
29
+ value: g,
30
+ onChange: (e) => _(e.target.value),
31
+ placeholder: "daily-summary",
32
+ "aria-label": "Snapshot name",
33
+ className: "flex-1"
34
+ }), /* @__PURE__ */ o(c, {
35
+ type: "button",
36
+ disabled: h,
37
+ onClick: async () => {
38
+ g.trim() && await m({ variables: { input: {
39
+ name: g,
40
+ title: g,
41
+ status: "created",
42
+ metadata: {}
43
+ } } });
44
+ },
45
+ children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), h ? "Generating..." : "Generate Snapshot"]
46
+ })]
47
+ })
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
+ }))
45
58
  })
46
- ] }), /* @__PURE__ */ a(n, {
47
- heading: f.loading ? "Loading snapshots..." : `Snapshots (${_.length})`,
48
- emptyLabel: "No analytics snapshots available yet.",
49
- emptyIllustration: "empty-data",
50
- rows: _.map((e) => ({
51
- id: e.id,
52
- title: e.title ?? e.name ?? `Snapshot ${e.id}`,
53
- status: e.status ?? void 0
54
- }))
55
- })]
59
+ ]
56
60
  });
57
61
  }
58
62
  //#endregion
59
- export { f as default };
63
+ export { p as default };
60
64
 
61
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 { 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"}
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"}
@@ -1,91 +1,124 @@
1
- import { useAttendeesQuery as e, useRegistrationsQuery as t } from "../../api/eventApi.js";
2
- import { EntityListSection as n } from "./EntityListSection.js";
3
- import { useMemo as r } from "react";
4
- import { useParams as i } from "react-router-dom";
5
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
- import { EmphasisPanel as s, GlassCard as c, GradientText as l } from "@burdenoff/fe-libs/ui";
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { useAttendeesQuery as t, useRegistrationsQuery as n } from "../../api/eventApi.js";
3
+ import { EntityListSection as r } from "./EntityListSection.js";
4
+ import { useMemo as i } from "react";
5
+ import { useParams as a } from "react-router-dom";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ import { Megaphone as c, Ticket as l, Users as u } from "lucide-react";
8
+ import { EmphasisPanel as d, GlassCard as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
7
9
  //#region src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx
8
- function u() {
9
- let { id: u = "" } = i(), d = e({
10
+ function g() {
11
+ let { id: g = "" } = a(), { navigate: _ } = e(), v = t({
10
12
  limit: 100,
11
13
  offset: 0
12
- }), f = t({
14
+ }), y = n({
13
15
  limit: 100,
14
16
  offset: 0
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]);
16
- return /* @__PURE__ */ o("div", {
17
+ }), b = i(() => (v.data?.attendees.items ?? []).find((e) => e.id === g), [g, v.data]), x = i(() => (y.data?.registrations.items ?? []).filter((e) => e.attendeeId === g), [g, y.data]);
18
+ return /* @__PURE__ */ s("div", {
17
19
  className: "space-y-6 p-6",
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"]
20
+ children: [
21
+ /* @__PURE__ */ o(h, { children: "A single view of one attendee — who they are and everything they have registered for. Use this when you need to look someone up: verify their ticket, answer a support question, or understand their history with your events before reaching out." }),
22
+ /* @__PURE__ */ s(d, { children: [
23
+ /* @__PURE__ */ s("h1", {
24
+ className: "text-2xl font-bold text-text-primary",
25
+ children: [/* @__PURE__ */ o(p, { children: "Attendee" }), " Profile"]
26
+ }),
27
+ /* @__PURE__ */ o("p", {
28
+ className: "mt-1 text-sm text-text-secondary",
29
+ children: v.loading ? "Loading attendee profile..." : b ? `${b.fullName ?? b.id} profile from registration and attendee APIs.` : "Attendee not found in current query scope."
30
+ }),
31
+ b ? /* @__PURE__ */ s("div", {
32
+ className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
33
+ children: [
34
+ /* @__PURE__ */ s(f, {
35
+ treatment: "metric",
36
+ className: "p-3",
37
+ children: [/* @__PURE__ */ o("p", {
38
+ className: "text-xs uppercase tracking-wide text-text-secondary",
39
+ children: "Name"
40
+ }), /* @__PURE__ */ o("p", {
41
+ className: "mt-1 font-medium text-text-primary",
42
+ children: b.fullName ?? b.id
43
+ })]
44
+ }),
45
+ /* @__PURE__ */ s(f, {
46
+ treatment: "metric",
47
+ className: "p-3",
48
+ children: [/* @__PURE__ */ o("p", {
49
+ className: "text-xs uppercase tracking-wide text-text-secondary",
50
+ children: "Email"
51
+ }), /* @__PURE__ */ o("p", {
52
+ className: "mt-1 font-medium text-text-primary",
53
+ children: b.email ?? "Unavailable"
54
+ })]
55
+ }),
56
+ /* @__PURE__ */ s(f, {
57
+ treatment: "metric",
58
+ className: "p-3",
59
+ children: [/* @__PURE__ */ o("p", {
60
+ className: "text-xs uppercase tracking-wide text-text-secondary",
61
+ children: "Company"
62
+ }), /* @__PURE__ */ o("p", {
63
+ className: "mt-1 font-medium text-text-primary",
64
+ children: b.company ?? "Unavailable"
65
+ })]
66
+ }),
67
+ /* @__PURE__ */ s(f, {
68
+ treatment: "metric",
69
+ className: "p-3",
70
+ children: [/* @__PURE__ */ o("p", {
71
+ className: "text-xs uppercase tracking-wide text-text-secondary",
72
+ children: "Role"
73
+ }), /* @__PURE__ */ o("p", {
74
+ className: "mt-1 font-medium text-text-primary",
75
+ children: b.role ?? "Unavailable"
76
+ })]
77
+ })
78
+ ]
79
+ }) : null
80
+ ] }),
81
+ /* @__PURE__ */ o(r, {
82
+ heading: y.loading ? "Loading attendee registrations..." : `Registrations (${x.length})`,
83
+ emptyLabel: "No registrations linked to this attendee.",
84
+ rows: x.map((e) => ({
85
+ id: e.id,
86
+ title: `Registration ${e.id}`,
87
+ subtitle: [e.quantity ? `Qty ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
88
+ status: e.status
89
+ }))
22
90
  }),
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
- })
91
+ /* @__PURE__ */ o(m, {
92
+ storageKey: "eventfullymanaged-attendee-profile",
93
+ title: "Act on this attendee",
94
+ steps: [
95
+ {
96
+ id: "view-registrations",
97
+ label: "Review all registrations",
98
+ description: "See the full registration list to manage tickets and payments.",
99
+ icon: /* @__PURE__ */ o(l, { className: "h-4 w-4" }),
100
+ onClick: () => _("/registration")
101
+ },
102
+ {
103
+ id: "networking",
104
+ label: "Find networking matches",
105
+ description: "Connect this attendee with relevant people and meetings.",
106
+ icon: /* @__PURE__ */ o(u, { className: "h-4 w-4" }),
107
+ onClick: () => _("/networking")
108
+ },
109
+ {
110
+ id: "reach-out",
111
+ label: "Send a message",
112
+ description: "Reach this attendee through an announcement or campaign.",
113
+ icon: /* @__PURE__ */ o(c, { className: "h-4 w-4" }),
114
+ onClick: () => _("/communication")
115
+ }
74
116
  ]
75
- }) : null
76
- ] }), /* @__PURE__ */ a(n, {
77
- heading: f.loading ? "Loading attendee registrations..." : `Registrations (${m.length})`,
78
- emptyLabel: "No registrations linked to this attendee.",
79
- rows: m.map((e) => ({
80
- id: e.id,
81
- title: `Registration ${e.id}`,
82
- subtitle: [e.quantity ? `Qty ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
83
- status: e.status
84
- }))
85
- })]
117
+ })
118
+ ]
86
119
  });
87
120
  }
88
121
  //#endregion
89
- export { u as default };
122
+ export { g as default };
90
123
 
91
124
  //# sourceMappingURL=AttendeeProfilePage.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"AttendeeProfilePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx"],"sourcesContent":["import { Megaphone, Ticket, Users } from 'lucide-react';\nimport { EmphasisPanel, GlassCard, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useAttendeesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\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 { navigate } = useEventfullyManaged();\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 <PagePurpose>\n A single view of one attendee — who they are and everything they have registered for. Use this when you need\n to look someone up: verify their ticket, answer a support question, or understand their history with your\n events before reaching out.\n </PagePurpose>\n\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\n <NextSteps\n storageKey=\"eventfullymanaged-attendee-profile\"\n title=\"Act on this attendee\"\n steps={[\n {\n id: 'view-registrations',\n label: 'Review all registrations',\n description: 'See the full registration list to manage tickets and payments.',\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'networking',\n label: 'Find networking matches',\n description: 'Connect this attendee with relevant people and meetings.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'reach-out',\n label: 'Send a message',\n description: 'Reach this attendee through an announcement or campaign.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}