@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.
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +49 -45
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +111 -78
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +29 -28
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +71 -42
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +54 -24
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +110 -77
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +61 -42
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +85 -85
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +37 -40
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +99 -99
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,49 +1,52 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { useAttendeesQuery as t, usePromoCodesQuery as n, useRegistrationsQuery as r } from "../../api/eventApi.js";
|
|
3
|
+
import { EntityListSection as i } from "./EntityListSection.js";
|
|
4
|
+
import { useMemo as a } from "react";
|
|
5
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
+
import { Megaphone as c, Tag as l, Users as u } from "lucide-react";
|
|
7
|
+
import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { EmphasisPanel as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
7
9
|
//#region src/eventfullymanaged/pages/modules/RegistrationPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { t:
|
|
10
|
-
let n =
|
|
10
|
+
function g() {
|
|
11
|
+
let { t: g } = d(), _ = (e, t) => {
|
|
12
|
+
let n = g(e);
|
|
11
13
|
return n === e ? t : n;
|
|
12
|
-
},
|
|
14
|
+
}, { navigate: v } = e(), y = r({
|
|
13
15
|
limit: 100,
|
|
14
16
|
offset: 0
|
|
15
|
-
}),
|
|
17
|
+
}), b = t({
|
|
16
18
|
limit: 100,
|
|
17
19
|
offset: 0
|
|
18
|
-
}),
|
|
20
|
+
}), x = n({
|
|
19
21
|
limit: 100,
|
|
20
22
|
offset: 0
|
|
21
|
-
}),
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
+
}), S = a(() => y.data?.registrations.items ?? [], [y.data]), C = a(() => b.data?.attendees.items ?? [], [b.data]), w = a(() => x.data?.promoCodes.items ?? [], [x.data]);
|
|
24
|
+
return /* @__PURE__ */ s("div", {
|
|
23
25
|
className: "space-y-6 p-6",
|
|
24
26
|
children: [
|
|
25
|
-
/* @__PURE__ */ o(
|
|
27
|
+
/* @__PURE__ */ o(h, { children: _("eventfullymanaged.registration.purpose", "This is where you see who is coming. Registrations are the paid or confirmed sign-ups, attendees are the people behind them, and promo codes let you offer discounts. Use this page to monitor sign-up volume, look up an attendee, and check that your discount codes are working.") }),
|
|
28
|
+
/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o("h1", {
|
|
26
29
|
className: "text-2xl font-bold text-text-primary",
|
|
27
|
-
children: /* @__PURE__ */
|
|
28
|
-
}), /* @__PURE__ */
|
|
30
|
+
children: /* @__PURE__ */ o(p, { children: _("eventfullymanaged.registration.title", "Registration") })
|
|
31
|
+
}), /* @__PURE__ */ o("p", {
|
|
29
32
|
className: "mt-1 text-sm text-text-secondary",
|
|
30
|
-
children:
|
|
33
|
+
children: _("eventfullymanaged.registration.description", "Track registrations and attendee profiles via backend GraphQL APIs.")
|
|
31
34
|
})] }),
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
-
heading:
|
|
34
|
-
emptyLabel:
|
|
35
|
-
rows:
|
|
35
|
+
/* @__PURE__ */ o(i, {
|
|
36
|
+
heading: y.loading ? _("eventfullymanaged.registration.registrations.loading", "Loading registrations...") : `${_("eventfullymanaged.registration.registrations.heading", "Registrations")} (${S.length})`,
|
|
37
|
+
emptyLabel: _("eventfullymanaged.registration.registrations.empty", "No registrations found."),
|
|
38
|
+
rows: S.map((e) => ({
|
|
36
39
|
id: e.id,
|
|
37
|
-
title: e.attendeeId ? `${
|
|
38
|
-
subtitle: [e.quantity ? `${
|
|
40
|
+
title: e.attendeeId ? `${_("eventfullymanaged.registration.registrations.attendeePrefix", "Attendee")} ${e.attendeeId}` : `${_("eventfullymanaged.registration.registrations.itemPrefix", "Registration")} ${e.id}`,
|
|
41
|
+
subtitle: [e.quantity ? `${_("eventfullymanaged.registration.registrations.quantityPrefix", "Qty")} ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
|
|
39
42
|
status: e.status
|
|
40
43
|
}))
|
|
41
44
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
heading:
|
|
44
|
-
emptyLabel:
|
|
45
|
+
/* @__PURE__ */ o(i, {
|
|
46
|
+
heading: b.loading ? _("eventfullymanaged.registration.attendees.loading", "Loading attendees...") : `${_("eventfullymanaged.registration.attendees.heading", "Attendees")} (${C.length})`,
|
|
47
|
+
emptyLabel: _("eventfullymanaged.registration.attendees.empty", "No attendees found."),
|
|
45
48
|
emptyIllustration: "empty-people",
|
|
46
|
-
rows:
|
|
49
|
+
rows: C.map((e) => ({
|
|
47
50
|
id: e.id,
|
|
48
51
|
title: e.fullName ?? e.id,
|
|
49
52
|
subtitle: [
|
|
@@ -53,20 +56,47 @@ function u() {
|
|
|
53
56
|
].filter(Boolean).join(" • ")
|
|
54
57
|
}))
|
|
55
58
|
}),
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
heading:
|
|
58
|
-
emptyLabel:
|
|
59
|
-
rows:
|
|
59
|
+
/* @__PURE__ */ o(i, {
|
|
60
|
+
heading: x.loading ? _("eventfullymanaged.registration.promoCodes.loading", "Loading promo codes...") : `${_("eventfullymanaged.registration.promoCodes.heading", "Promo Codes")} (${w.length})`,
|
|
61
|
+
emptyLabel: _("eventfullymanaged.registration.promoCodes.empty", "No promo codes configured."),
|
|
62
|
+
rows: w.map((e) => ({
|
|
60
63
|
id: e.id,
|
|
61
64
|
title: e.code,
|
|
62
65
|
subtitle: `${e.discountType} ${e.discountValue}`,
|
|
63
66
|
status: e.isActive ? "active" : "inactive"
|
|
64
67
|
}))
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ o(m, {
|
|
70
|
+
storageKey: "eventfullymanaged-registration",
|
|
71
|
+
title: _("eventfullymanaged.registration.nextSteps.title", "Grow your registrations"),
|
|
72
|
+
steps: [
|
|
73
|
+
{
|
|
74
|
+
id: "view-networking",
|
|
75
|
+
label: _("eventfullymanaged.registration.nextSteps.networking", "Set up attendee networking"),
|
|
76
|
+
description: _("eventfullymanaged.registration.nextSteps.networkingDesc", "Turn registered attendees into connections with matchmaking."),
|
|
77
|
+
icon: /* @__PURE__ */ o(u, { className: "h-4 w-4" }),
|
|
78
|
+
onClick: () => v("/networking")
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: "promote",
|
|
82
|
+
label: _("eventfullymanaged.registration.nextSteps.promote", "Promote with a campaign"),
|
|
83
|
+
description: _("eventfullymanaged.registration.nextSteps.promoteDesc", "Send reminders and offers to drive more sign-ups."),
|
|
84
|
+
icon: /* @__PURE__ */ o(c, { className: "h-4 w-4" }),
|
|
85
|
+
onClick: () => v("/communication")
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "analyze",
|
|
89
|
+
label: _("eventfullymanaged.registration.nextSteps.analyze", "Snapshot your numbers"),
|
|
90
|
+
description: _("eventfullymanaged.registration.nextSteps.analyzeDesc", "Capture an analytics snapshot to track registration trends."),
|
|
91
|
+
icon: /* @__PURE__ */ o(l, { className: "h-4 w-4" }),
|
|
92
|
+
onClick: () => v("/analytics")
|
|
93
|
+
}
|
|
94
|
+
]
|
|
65
95
|
})
|
|
66
96
|
]
|
|
67
97
|
});
|
|
68
98
|
}
|
|
69
99
|
//#endregion
|
|
70
|
-
export {
|
|
100
|
+
export { g as default };
|
|
71
101
|
|
|
72
102
|
//# sourceMappingURL=RegistrationPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegistrationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/RegistrationPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useAttendeesQuery, usePromoCodesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\nexport default function RegistrationPage() {\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 registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[],\n [registrationsQuery.data]\n );\n const attendees = useMemo(() => (attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[], [attendeesQuery.data]);\n const promoCodes = useMemo(() => promoCodesQuery.data?.promoCodes.items ?? [], [promoCodesQuery.data]);\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>{t('eventfullymanaged.registration.title', 'Registration')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.registration.description',\n 'Track registrations and attendee profiles via backend GraphQL APIs.'\n )}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading\n ? t('eventfullymanaged.registration.registrations.loading', 'Loading registrations...')\n : `${t('eventfullymanaged.registration.registrations.heading', 'Registrations')} (${registrations.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.registrations.empty', 'No registrations found.')}\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId\n ? `${t('eventfullymanaged.registration.registrations.attendeePrefix', 'Attendee')} ${row.attendeeId}`\n : `${t('eventfullymanaged.registration.registrations.itemPrefix', 'Registration')} ${row.id}`,\n subtitle: [\n row.quantity\n ? `${t('eventfullymanaged.registration.registrations.quantityPrefix', 'Qty')} ${row.quantity}`\n : undefined,\n row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n attendeesQuery.loading\n ? t('eventfullymanaged.registration.attendees.loading', 'Loading attendees...')\n : `${t('eventfullymanaged.registration.attendees.heading', 'Attendees')} (${attendees.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.attendees.empty', 'No attendees found.')}\n emptyIllustration=\"empty-people\"\n rows={attendees.map((row) => ({\n id: row.id,\n title: row.fullName ?? row.id,\n subtitle: [row.email, row.company, row.role].filter(Boolean).join(' • '),\n }))}\n />\n\n <EntityListSection\n heading={\n promoCodesQuery.loading\n ? t('eventfullymanaged.registration.promoCodes.loading', 'Loading promo codes...')\n : `${t('eventfullymanaged.registration.promoCodes.heading', 'Promo Codes')} (${promoCodes.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.promoCodes.empty', 'No promo codes configured.')}\n rows={promoCodes.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RegistrationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/RegistrationPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Megaphone, Tag, Users } from 'lucide-react';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useAttendeesQuery, usePromoCodesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\nexport default function RegistrationPage() {\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 registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[],\n [registrationsQuery.data]\n );\n const attendees = useMemo(() => (attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[], [attendeesQuery.data]);\n const promoCodes = useMemo(() => promoCodesQuery.data?.promoCodes.items ?? [], [promoCodesQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.registration.purpose',\n 'This is where you see who is coming. Registrations are the paid or confirmed sign-ups, attendees are the people behind them, and promo codes let you offer discounts. Use this page to monitor sign-up volume, look up an attendee, and check that your discount codes are working.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.registration.title', 'Registration')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.registration.description',\n 'Track registrations and attendee profiles via backend GraphQL APIs.'\n )}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading\n ? t('eventfullymanaged.registration.registrations.loading', 'Loading registrations...')\n : `${t('eventfullymanaged.registration.registrations.heading', 'Registrations')} (${registrations.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.registrations.empty', 'No registrations found.')}\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId\n ? `${t('eventfullymanaged.registration.registrations.attendeePrefix', 'Attendee')} ${row.attendeeId}`\n : `${t('eventfullymanaged.registration.registrations.itemPrefix', 'Registration')} ${row.id}`,\n subtitle: [\n row.quantity\n ? `${t('eventfullymanaged.registration.registrations.quantityPrefix', 'Qty')} ${row.quantity}`\n : undefined,\n row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n attendeesQuery.loading\n ? t('eventfullymanaged.registration.attendees.loading', 'Loading attendees...')\n : `${t('eventfullymanaged.registration.attendees.heading', 'Attendees')} (${attendees.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.attendees.empty', 'No attendees found.')}\n emptyIllustration=\"empty-people\"\n rows={attendees.map((row) => ({\n id: row.id,\n title: row.fullName ?? row.id,\n subtitle: [row.email, row.company, row.role].filter(Boolean).join(' • '),\n }))}\n />\n\n <EntityListSection\n heading={\n promoCodesQuery.loading\n ? t('eventfullymanaged.registration.promoCodes.loading', 'Loading promo codes...')\n : `${t('eventfullymanaged.registration.promoCodes.heading', 'Promo Codes')} (${promoCodes.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.promoCodes.empty', 'No promo codes configured.')}\n rows={promoCodes.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-registration\"\n title={t('eventfullymanaged.registration.nextSteps.title', 'Grow your registrations')}\n steps={[\n {\n id: 'view-networking',\n label: t('eventfullymanaged.registration.nextSteps.networking', 'Set up attendee networking'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.networkingDesc',\n 'Turn registered attendees into connections with matchmaking.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'promote',\n label: t('eventfullymanaged.registration.nextSteps.promote', 'Promote with a campaign'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.promoteDesc',\n 'Send reminders and offers to drive more sign-ups.'\n ),\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n {\n id: 'analyze',\n label: t('eventfullymanaged.registration.nextSteps.analyze', 'Snapshot your numbers'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.analyzeDesc',\n 'Capture an analytics snapshot to track registration trends.'\n ),\n icon: <Tag className=\"h-4 w-4\" />,\n onClick: () => navigate('/analytics'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,90 +1,123 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { useCommunicationCampaignsQuery as t, useSponsorsQuery 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, Pencil as l, TrendingUp 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/SponsorDetailsPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { id:
|
|
10
|
+
function g() {
|
|
11
|
+
let { id: g = "" } = a(), { navigate: _ } = e(), v = n({
|
|
10
12
|
limit: 100,
|
|
11
13
|
offset: 0
|
|
12
|
-
}),
|
|
14
|
+
}), y = t({
|
|
13
15
|
limit: 100,
|
|
14
16
|
offset: 0
|
|
15
|
-
}),
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
+
}), b = i(() => (v.data?.sponsors.items ?? []).find((e) => e.id === g), [g, v.data]), x = i(() => y.data?.communicationCampaigns.items ?? [], [y.data]);
|
|
18
|
+
return /* @__PURE__ */ s("div", {
|
|
17
19
|
className: "space-y-6 p-6",
|
|
18
|
-
children: [
|
|
19
|
-
/* @__PURE__ */ o("
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ o(h, { children: "Everything about one sponsor in one place — their tier, contacts, and the campaigns they appear in. Use this to prep for a sponsor conversation, confirm their contact details, or check how their branded campaigns are performing." }),
|
|
22
|
+
/* @__PURE__ */ s(d, { children: [
|
|
23
|
+
/* @__PURE__ */ s("h1", {
|
|
24
|
+
className: "text-2xl font-bold text-text-primary",
|
|
25
|
+
children: [/* @__PURE__ */ o(p, { children: "Sponsor" }), " Details"]
|
|
26
|
+
}),
|
|
27
|
+
/* @__PURE__ */ o("p", {
|
|
28
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
29
|
+
children: v.loading ? "Loading sponsor details..." : b ? `Live sponsor profile for ${b.name}.` : "Sponsor 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: "Level"
|
|
40
|
+
}), /* @__PURE__ */ o("p", {
|
|
41
|
+
className: "mt-1 font-medium text-text-primary",
|
|
42
|
+
children: b.level
|
|
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: "Contact"
|
|
51
|
+
}), /* @__PURE__ */ o("p", {
|
|
52
|
+
className: "mt-1 font-medium text-text-primary",
|
|
53
|
+
children: b.contactName ?? "Unassigned"
|
|
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: "Email"
|
|
62
|
+
}), /* @__PURE__ */ o("p", {
|
|
63
|
+
className: "mt-1 font-medium text-text-primary",
|
|
64
|
+
children: b.contactEmail ?? "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: "Website"
|
|
73
|
+
}), /* @__PURE__ */ o("p", {
|
|
74
|
+
className: "mt-1 truncate font-medium text-text-primary",
|
|
75
|
+
children: b.website ?? "Unavailable"
|
|
76
|
+
})]
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
}) : null
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ o(r, {
|
|
82
|
+
heading: y.loading ? "Loading campaigns..." : `Campaign Activity (${x.length})`,
|
|
83
|
+
emptyLabel: "No communication campaigns available for sponsor tracking.",
|
|
84
|
+
rows: x.map((e) => ({
|
|
85
|
+
id: e.id,
|
|
86
|
+
title: e.title ?? e.name ?? `Campaign ${e.id}`,
|
|
87
|
+
status: e.status
|
|
88
|
+
}))
|
|
22
89
|
}),
|
|
23
|
-
/* @__PURE__ */
|
|
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
|
-
className: "mt-1 font-medium text-text-primary",
|
|
49
|
-
children: p.contactName ?? "Unassigned"
|
|
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: "Email"
|
|
58
|
-
}), /* @__PURE__ */ a("p", {
|
|
59
|
-
className: "mt-1 font-medium text-text-primary",
|
|
60
|
-
children: p.contactEmail ?? "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: "Website"
|
|
69
|
-
}), /* @__PURE__ */ a("p", {
|
|
70
|
-
className: "mt-1 truncate font-medium text-text-primary",
|
|
71
|
-
children: p.website ?? "Unavailable"
|
|
72
|
-
})]
|
|
73
|
-
})
|
|
90
|
+
/* @__PURE__ */ o(m, {
|
|
91
|
+
storageKey: "eventfullymanaged-sponsor-details",
|
|
92
|
+
title: "Grow this partnership",
|
|
93
|
+
steps: [
|
|
94
|
+
{
|
|
95
|
+
id: "edit-sponsor",
|
|
96
|
+
label: "Update sponsor details",
|
|
97
|
+
description: "Keep tier, contacts and contract value current.",
|
|
98
|
+
icon: /* @__PURE__ */ o(l, { className: "h-4 w-4" }),
|
|
99
|
+
onClick: () => _(g ? `/sponsors/${g}/edit` : "/sponsors")
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "track-leads",
|
|
103
|
+
label: "Track sponsor leads",
|
|
104
|
+
description: "See the leads this sponsor is generating at the event.",
|
|
105
|
+
icon: /* @__PURE__ */ o(u, { className: "h-4 w-4" }),
|
|
106
|
+
onClick: () => _(g ? `/sponsors/${g}/leads` : "/sponsors")
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: "run-campaign",
|
|
110
|
+
label: "Run a co-branded campaign",
|
|
111
|
+
description: "Promote this sponsor through a communication campaign.",
|
|
112
|
+
icon: /* @__PURE__ */ o(c, { className: "h-4 w-4" }),
|
|
113
|
+
onClick: () => _("/communication")
|
|
114
|
+
}
|
|
74
115
|
]
|
|
75
|
-
})
|
|
76
|
-
]
|
|
77
|
-
heading: f.loading ? "Loading campaigns..." : `Campaign Activity (${m.length})`,
|
|
78
|
-
emptyLabel: "No communication campaigns available for sponsor tracking.",
|
|
79
|
-
rows: m.map((e) => ({
|
|
80
|
-
id: e.id,
|
|
81
|
-
title: e.title ?? e.name ?? `Campaign ${e.id}`,
|
|
82
|
-
status: e.status
|
|
83
|
-
}))
|
|
84
|
-
})]
|
|
116
|
+
})
|
|
117
|
+
]
|
|
85
118
|
});
|
|
86
119
|
}
|
|
87
120
|
//#endregion
|
|
88
|
-
export {
|
|
121
|
+
export { g as default };
|
|
89
122
|
|
|
90
123
|
//# sourceMappingURL=SponsorDetailsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SponsorDetailsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCommunicationCampaignsQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n};\n\ntype CampaignRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorDetailsPage() {\n const { id = '' } = useParams();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as CampaignRow[],\n [campaignsQuery.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>Sponsor</GradientText> Details\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsorsQuery.loading\n ? 'Loading sponsor details...'\n : sponsor\n ? `Live sponsor profile for ${sponsor.name}.`\n : 'Sponsor not found in current query scope.'}\n </p>\n {sponsor ? (\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\">Level</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.level}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Contact</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.contactName ?? 'Unassigned'}</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\">{sponsor.contactEmail ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Website</p>\n <p className=\"mt-1 truncate font-medium text-text-primary\">{sponsor.website ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaign Activity (${campaigns.length})`}\n emptyLabel=\"No communication campaigns available for sponsor tracking.\"\n rows={campaigns.map((campaign) => ({\n id: campaign.id,\n title: campaign.title ?? campaign.name ?? `Campaign ${campaign.id}`,\n status: campaign.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SponsorDetailsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx"],"sourcesContent":["import { Megaphone, Pencil, TrendingUp } 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 { useCommunicationCampaignsQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n};\n\ntype CampaignRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorDetailsPage() {\n const { id = '' } = useParams();\n const { navigate } = useEventfullyManaged();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as CampaignRow[],\n [campaignsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Everything about one sponsor in one place — their tier, contacts, and the campaigns they appear in. Use this\n to prep for a sponsor conversation, confirm their contact details, or check how their branded campaigns are\n performing.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Sponsor</GradientText> Details\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsorsQuery.loading\n ? 'Loading sponsor details...'\n : sponsor\n ? `Live sponsor profile for ${sponsor.name}.`\n : 'Sponsor not found in current query scope.'}\n </p>\n {sponsor ? (\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\">Level</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.level}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Contact</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.contactName ?? 'Unassigned'}</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\">{sponsor.contactEmail ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Website</p>\n <p className=\"mt-1 truncate font-medium text-text-primary\">{sponsor.website ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaign Activity (${campaigns.length})`}\n emptyLabel=\"No communication campaigns available for sponsor tracking.\"\n rows={campaigns.map((campaign) => ({\n id: campaign.id,\n title: campaign.title ?? campaign.name ?? `Campaign ${campaign.id}`,\n status: campaign.status,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-sponsor-details\"\n title=\"Grow this partnership\"\n steps={[\n {\n id: 'edit-sponsor',\n label: 'Update sponsor details',\n description: 'Keep tier, contacts and contract value current.',\n icon: <Pencil className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}/edit` : '/sponsors'),\n },\n {\n id: 'track-leads',\n label: 'Track sponsor leads',\n description: 'See the leads this sponsor is generating at the event.',\n icon: <TrendingUp className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}/leads` : '/sponsors'),\n },\n {\n id: 'run-campaign',\n label: 'Run a co-branded campaign',\n description: 'Promote this sponsor through a communication campaign.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAwB,IAAqB;CAC3C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,gBAAa,GAAsB,EACrC,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC3D,IAAiB,EAA+B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE1E,IAAU,SACN,EAAc,MAAM,SAAS,SAAS,EAAE,EAAmB,MAAM,MAAS,EAAK,OAAO,EAAG,EACjG,CAAC,GAAI,EAAc,KAAK,CACzB,EACK,IAAY,QACT,EAAe,MAAM,uBAAuB,SAAS,EAAE,EAC9D,CAAC,EAAe,KAAK,CACtB;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAa,wOAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAA,UAAc,WAAsB,CAAA,EAAA,WACjC;;IACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAc,UACX,+BACA,IACE,4BAA4B,EAAQ,KAAK,KACzC;KACJ,CAAA;IACH,IACC,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAS,CAAA,EAC5E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAQ;QAAU,CAAA,CAC3D;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAW,CAAA,EAC9E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAQ,eAAe;QAAiB,CAAA,CACjF;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAS,CAAA,EAC5E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAQ,gBAAgB;QAAkB,CAAA,CACnF;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAW,CAAA,EAC9E,kBAAC,KAAD;QAAG,WAAU;kBAA+C,EAAQ,WAAW;QAAkB,CAAA,CACvF;;MACR;SACJ;IACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAe,UAAU,yBAAyB,sBAAsB,EAAU,OAAO;IAClG,YAAW;IACX,MAAM,EAAU,KAAK,OAAc;KACjC,IAAI,EAAS;KACb,OAAO,EAAS,SAAS,EAAS,QAAQ,YAAY,EAAS;KAC/D,QAAQ,EAAS;KAClB,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,YAAW;IACX,OAAM;IACN,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;MACpC,eAAe,EAAS,IAAK,aAAa,EAAG,SAAS,YAAY;MACnE;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;MACxC,eAAe,EAAS,IAAK,aAAa,EAAG,UAAU,YAAY;MACpE;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,eAAe,EAAS,iBAAiB;MAC1C;KACF;IACD,CAAA;GACE"}
|
|
@@ -1,53 +1,84 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { useMeetingsQuery as t, useNetworkingMatchesQuery as n, useSponsorsQuery as r } from "../../api/eventApi.js";
|
|
3
|
+
import { EntityListSection as i } from "./EntityListSection.js";
|
|
4
|
+
import { useMemo as a } from "react";
|
|
5
|
+
import { useParams as o } from "react-router-dom";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { Megaphone as l, User as u, Users as d } from "lucide-react";
|
|
8
|
+
import { EmphasisPanel as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
7
9
|
//#region src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { id:
|
|
10
|
+
function g() {
|
|
11
|
+
let { id: g = "" } = o(), { navigate: _ } = e(), v = r({
|
|
10
12
|
limit: 100,
|
|
11
13
|
offset: 0
|
|
12
|
-
}),
|
|
14
|
+
}), y = n({
|
|
13
15
|
limit: 100,
|
|
14
16
|
offset: 0
|
|
15
|
-
}),
|
|
17
|
+
}), b = t({
|
|
16
18
|
limit: 100,
|
|
17
19
|
offset: 0
|
|
18
|
-
}),
|
|
19
|
-
return /* @__PURE__ */
|
|
20
|
+
}), x = a(() => (v.data?.sponsors.items ?? []).find((e) => e.id === g), [g, v.data]), S = a(() => y.data?.networkingMatches.items ?? [], [y.data]), C = a(() => b.data?.meetings.items ?? [], [b.data]);
|
|
21
|
+
return /* @__PURE__ */ c("div", {
|
|
20
22
|
className: "space-y-6 p-6",
|
|
21
23
|
children: [
|
|
22
|
-
/* @__PURE__ */ s(
|
|
24
|
+
/* @__PURE__ */ s(h, { children: "The return on a sponsorship is the people it puts in front of the sponsor. This page pulls together the potential leads (from networking matches) and the booked sponsor meetings for one sponsor, so you can show them exactly who they met and why their investment paid off." }),
|
|
25
|
+
/* @__PURE__ */ c(f, { children: [/* @__PURE__ */ c("h1", {
|
|
23
26
|
className: "text-2xl font-bold text-text-primary",
|
|
24
|
-
children: [/* @__PURE__ */
|
|
25
|
-
}), /* @__PURE__ */
|
|
27
|
+
children: [/* @__PURE__ */ s(p, { children: "Sponsor" }), " Leads"]
|
|
28
|
+
}), /* @__PURE__ */ s("p", {
|
|
26
29
|
className: "mt-1 text-sm text-text-secondary",
|
|
27
|
-
children:
|
|
30
|
+
children: x ? `${x.name} lead funnel sourced from networking and meeting streams.` : "Lead funnel sourced from networking and meeting streams."
|
|
28
31
|
})] }),
|
|
29
|
-
/* @__PURE__ */
|
|
30
|
-
heading:
|
|
32
|
+
/* @__PURE__ */ s(i, {
|
|
33
|
+
heading: y.loading ? "Loading networking matches..." : `Potential Leads (${S.length})`,
|
|
31
34
|
emptyLabel: "No networking leads found.",
|
|
32
|
-
|
|
35
|
+
emptyIllustration: "empty-people",
|
|
36
|
+
rows: S.map((e) => ({
|
|
33
37
|
id: e.id,
|
|
34
38
|
title: e.title ?? e.name ?? `Lead ${e.id}`,
|
|
35
39
|
status: e.status
|
|
36
40
|
}))
|
|
37
41
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
-
heading:
|
|
42
|
+
/* @__PURE__ */ s(i, {
|
|
43
|
+
heading: b.loading ? "Loading meetings..." : `Sponsor Meetings (${C.length})`,
|
|
40
44
|
emptyLabel: "No sponsor meetings recorded.",
|
|
41
|
-
rows:
|
|
45
|
+
rows: C.map((e) => ({
|
|
42
46
|
id: e.id,
|
|
43
47
|
title: e.title ?? e.name ?? `Meeting ${e.id}`,
|
|
44
48
|
status: e.status
|
|
45
49
|
}))
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ s(m, {
|
|
52
|
+
storageKey: "eventfullymanaged-sponsor-leads",
|
|
53
|
+
title: "Turn leads into wins",
|
|
54
|
+
steps: [
|
|
55
|
+
{
|
|
56
|
+
id: "sponsor-profile",
|
|
57
|
+
label: "Back to sponsor profile",
|
|
58
|
+
description: "Review this sponsor’s tier, contacts and contract value.",
|
|
59
|
+
icon: /* @__PURE__ */ s(u, { className: "h-4 w-4" }),
|
|
60
|
+
onClick: () => _(g ? `/sponsors/${g}` : "/sponsors")
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "boost-networking",
|
|
64
|
+
label: "Boost networking",
|
|
65
|
+
description: "Improve matchmaking so sponsors meet more of the right people.",
|
|
66
|
+
icon: /* @__PURE__ */ s(d, { className: "h-4 w-4" }),
|
|
67
|
+
onClick: () => _("/networking")
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "follow-up",
|
|
71
|
+
label: "Follow up with attendees",
|
|
72
|
+
description: "Send a campaign to nurture the leads after the event.",
|
|
73
|
+
icon: /* @__PURE__ */ s(l, { className: "h-4 w-4" }),
|
|
74
|
+
onClick: () => _("/communication")
|
|
75
|
+
}
|
|
76
|
+
]
|
|
46
77
|
})
|
|
47
78
|
]
|
|
48
79
|
});
|
|
49
80
|
}
|
|
50
81
|
//#endregion
|
|
51
|
-
export {
|
|
82
|
+
export { g as default };
|
|
52
83
|
|
|
53
84
|
//# sourceMappingURL=SponsorLeadsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SponsorLeadsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx"],"sourcesContent":["import { EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n};\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorLeadsPage() {\n const { id = '' } = useParams();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const matches = useMemo(() => (matchesQuery.data?.networkingMatches.items ?? []) as SimpleRow[], [matchesQuery.data]);\n const meetings = useMemo(() => (meetingsQuery.data?.meetings.items ?? []) as SimpleRow[], [meetingsQuery.data]);\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>Sponsor</GradientText> Leads\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsor\n ? `${sponsor.name} lead funnel sourced from networking and meeting streams.`\n : 'Lead funnel sourced from networking and meeting streams.'}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Potential Leads (${matches.length})`}\n emptyLabel=\"No networking leads found.\"\n rows={matches.map((match) => ({\n id: match.id,\n title: match.title ?? match.name ?? `Lead ${match.id}`,\n status: match.status,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Sponsor Meetings (${meetings.length})`}\n emptyLabel=\"No sponsor meetings recorded.\"\n rows={meetings.map((meeting) => ({\n id: meeting.id,\n title: meeting.title ?? meeting.name ?? `Meeting ${meeting.id}`,\n status: meeting.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SponsorLeadsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx"],"sourcesContent":["import { Megaphone, User, Users } from 'lucide-react';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n};\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorLeadsPage() {\n const { id = '' } = useParams();\n const { navigate } = useEventfullyManaged();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const matches = useMemo(() => (matchesQuery.data?.networkingMatches.items ?? []) as SimpleRow[], [matchesQuery.data]);\n const meetings = useMemo(() => (meetingsQuery.data?.meetings.items ?? []) as SimpleRow[], [meetingsQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n The return on a sponsorship is the people it puts in front of the sponsor. This page pulls together the\n potential leads (from networking matches) and the booked sponsor meetings for one sponsor, so you can show them\n exactly who they met and why their investment paid off.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Sponsor</GradientText> Leads\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsor\n ? `${sponsor.name} lead funnel sourced from networking and meeting streams.`\n : 'Lead funnel sourced from networking and meeting streams.'}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Potential Leads (${matches.length})`}\n emptyLabel=\"No networking leads found.\"\n emptyIllustration=\"empty-people\"\n rows={matches.map((match) => ({\n id: match.id,\n title: match.title ?? match.name ?? `Lead ${match.id}`,\n status: match.status,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Sponsor Meetings (${meetings.length})`}\n emptyLabel=\"No sponsor meetings recorded.\"\n rows={meetings.map((meeting) => ({\n id: meeting.id,\n title: meeting.title ?? meeting.name ?? `Meeting ${meeting.id}`,\n status: meeting.status,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-sponsor-leads\"\n title=\"Turn leads into wins\"\n steps={[\n {\n id: 'sponsor-profile',\n label: 'Back to sponsor profile',\n description: 'Review this sponsor’s tier, contacts and contract value.',\n icon: <User className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}` : '/sponsors'),\n },\n {\n id: 'boost-networking',\n label: 'Boost networking',\n description: 'Improve matchmaking so sponsors meet more of the right people.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'follow-up',\n label: 'Follow up with attendees',\n description: 'Send a campaign to nurture the leads after the event.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAwB,IAAmB;CACzC,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,gBAAa,GAAsB,EACrC,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC3D,IAAe,EAA0B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACnE,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE3D,IAAU,SACN,EAAc,MAAM,SAAS,SAAS,EAAE,EAAmB,MAAM,MAAS,EAAK,OAAO,EAAG,EACjG,CAAC,GAAI,EAAc,KAAK,CACzB,EACK,IAAU,QAAe,EAAa,MAAM,kBAAkB,SAAS,EAAE,EAAkB,CAAC,EAAa,KAAK,CAAC,EAC/G,IAAW,QAAe,EAAc,MAAM,SAAS,SAAS,EAAE,EAAkB,CAAC,EAAc,KAAK,CAAC;AAE/G,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAa,mRAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,WAAsB,CAAA,EAAA,SACjC;OACL,kBAAC,KAAD;IAAG,WAAU;cACV,IACG,GAAG,EAAQ,KAAK,6DAChB;IACF,CAAA,CACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAa,UAAU,kCAAkC,oBAAoB,EAAQ,OAAO;IACrG,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAQ,KAAK,OAAW;KAC5B,IAAI,EAAM;KACV,OAAO,EAAM,SAAS,EAAM,QAAQ,QAAQ,EAAM;KAClD,QAAQ,EAAM;KACf,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAS,EAAc,UAAU,wBAAwB,qBAAqB,EAAS,OAAO;IAC9F,YAAW;IACX,MAAM,EAAS,KAAK,OAAa;KAC/B,IAAI,EAAQ;KACZ,OAAO,EAAQ,SAAS,EAAQ,QAAQ,WAAW,EAAQ;KAC3D,QAAQ,EAAQ;KACjB,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,YAAW;IACX,OAAM;IACN,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;MAClC,eAAe,EAAS,IAAK,aAAa,MAAO,YAAY;MAC9D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,eAAe,EAAS,cAAc;MACvC;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,eAAe,EAAS,iBAAiB;MAC1C;KACF;IACD,CAAA;GACE"}
|