@burdenoff/microfe-eventfullymanaged 2026.625.2 → 2026.703.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/eventfullymanaged/api/eventApi.js +83 -38
  2. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  3. package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
  4. package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
  5. package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
  6. package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
  7. package/dist/eventfullymanaged/lib/toast.js +36 -0
  8. package/dist/eventfullymanaged/lib/toast.js.map +1 -0
  9. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +40 -32
  10. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +71 -45
  12. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -46
  14. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/EventsPage.js +75 -67
  16. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +30 -11
  18. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +35 -13
  20. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +68 -54
  22. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +153 -125
  24. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +107 -62
  26. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +144 -135
  28. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  29. package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
  30. package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
  31. package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
  32. package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
  33. package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
  34. package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
  35. package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
  36. package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
  37. package/dist/node_modules/sonner/dist/index.js +163 -0
  38. package/dist/node_modules/sonner/dist/index.js.map +1 -0
  39. package/package.json +1 -1
@@ -1,111 +1,119 @@
1
1
  import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
- import { useCreateEventMutation as t, useEventsQuery as n, useTicketTypesQuery as r } from "../../api/eventApi.js";
3
- import { EntityListSection as i } from "./EntityListSection.js";
4
- import { useMemo as a, useState as o } from "react";
5
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
- import { CalendarPlus as l, Ticket as u, Users as d } from "lucide-react";
7
- import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Button as p, EmphasisPanel as m, GradientText as h, Input as g, NextSteps as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useCreateEventMutation as n, useEventsQuery as r, useTicketTypesQuery as i } from "../../api/eventApi.js";
4
+ import { describeError as a, mutationSucceeded as o } from "../../lib/mutationResult.js";
5
+ import { EntityListSection as s } from "./EntityListSection.js";
6
+ import { useMemo as c, useState as l } from "react";
7
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ import { CalendarPlus as f, Ticket as p, Users as m } from "lucide-react";
9
+ import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ import { Button as g, EmphasisPanel as _, GradientText as v, Input as y, NextSteps as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
9
11
  //#region src/eventfullymanaged/pages/modules/EventsPage.tsx
10
- function y() {
11
- let { t: y } = f(), b = (e, t) => {
12
- let n = y(e);
12
+ function S() {
13
+ let { t: S } = h(), C = (e, t) => {
14
+ let n = S(e);
13
15
  return n === e ? t : n;
14
- }, { navigate: x } = e(), { data: S, loading: C } = n({
16
+ }, { navigate: w } = e(), { data: T, loading: E } = r({
15
17
  limit: 100,
16
18
  offset: 0
17
- }), w = r({
19
+ }), D = i({
18
20
  limit: 100,
19
21
  offset: 0
20
- }), [T, { loading: E }] = t(), [D, O] = o(""), k = a(() => S?.events.items ?? [], [S]), A = a(() => w.data?.ticketTypes.items ?? [], [w.data]);
21
- return /* @__PURE__ */ c("div", {
22
+ }), [O, { loading: k }] = n(), [A, j] = l(""), M = c(() => T?.events.items ?? [], [T]), N = c(() => D.data?.ticketTypes.items ?? [], [D.data]);
23
+ return /* @__PURE__ */ d("div", {
22
24
  className: "space-y-6 p-6",
23
25
  children: [
24
- /* @__PURE__ */ s(v, { children: b("eventfullymanaged.events.purpose", "Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event here, then attach ticket types so people can buy their way in. Use this when you are spinning up a new conference, meetup or summit.") }),
25
- /* @__PURE__ */ c(m, { children: [
26
- /* @__PURE__ */ s("h1", {
26
+ /* @__PURE__ */ u(x, { children: C("eventfullymanaged.events.purpose", "Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event here, then attach ticket types so people can buy their way in. Use this when you are spinning up a new conference, meetup or summit.") }),
27
+ /* @__PURE__ */ d(_, { children: [
28
+ /* @__PURE__ */ u("h1", {
27
29
  className: "text-2xl font-bold text-text-primary",
28
- children: /* @__PURE__ */ s(h, { children: b("eventfullymanaged.events.title", "Events") })
30
+ children: /* @__PURE__ */ u(v, { children: C("eventfullymanaged.events.title", "Events") })
29
31
  }),
30
- /* @__PURE__ */ s("p", {
32
+ /* @__PURE__ */ u("p", {
31
33
  className: "mt-1 text-sm text-text-secondary",
32
- children: b("eventfullymanaged.events.description", "Create and manage live events from the workspace graph.")
34
+ children: C("eventfullymanaged.events.description", "Create and manage live events from the workspace graph.")
33
35
  }),
34
- /* @__PURE__ */ c("div", {
36
+ /* @__PURE__ */ d("div", {
35
37
  className: "mt-4 flex flex-col gap-3 sm:flex-row",
36
- children: [/* @__PURE__ */ s(g, {
37
- value: D,
38
- onChange: (e) => O(e.target.value),
39
- placeholder: b("eventfullymanaged.events.namePlaceholder", "Annual Innovation Summit"),
40
- "aria-label": b("eventfullymanaged.events.namePlaceholder", "Annual Innovation Summit"),
38
+ children: [/* @__PURE__ */ u(y, {
39
+ value: A,
40
+ onChange: (e) => j(e.target.value),
41
+ placeholder: C("eventfullymanaged.events.namePlaceholder", "Annual Innovation Summit"),
42
+ "aria-label": C("eventfullymanaged.events.namePlaceholder", "Annual Innovation Summit"),
41
43
  className: "flex-1"
42
- }), /* @__PURE__ */ c(p, {
44
+ }), /* @__PURE__ */ d(g, {
43
45
  type: "button",
44
- disabled: E,
46
+ disabled: k,
45
47
  onClick: async () => {
46
- if (!D.trim()) return;
47
- let e = /* @__PURE__ */ new Date(), t = new Date(e.getTime() + 3600 * 1e3);
48
- await T({ variables: { input: {
49
- name: D.trim(),
50
- description: "",
51
- type: "IN_PERSON",
52
- status: "DRAFT",
53
- timezone: "Asia/Kolkata",
54
- startAt: e.toISOString(),
55
- endAt: t.toISOString(),
56
- visibility: "private",
57
- capacity: 100,
58
- metadata: {}
59
- } } }), O("");
48
+ if (!A.trim()) return;
49
+ let e = /* @__PURE__ */ new Date(), n = new Date(e.getTime() + 3600 * 1e3);
50
+ try {
51
+ let r = await O({ variables: { input: {
52
+ name: A.trim(),
53
+ description: "",
54
+ type: "IN_PERSON",
55
+ status: "DRAFT",
56
+ timezone: "Asia/Kolkata",
57
+ startAt: e.toISOString(),
58
+ endAt: n.toISOString(),
59
+ visibility: "private",
60
+ capacity: 100,
61
+ metadata: {}
62
+ } } });
63
+ if (!o(r, r.data?.createEvent?.id, C("eventfullymanaged.events.errors.create", "Could not create event"))) return;
64
+ j(""), t.success(C("eventfullymanaged.events.created", "Event created"));
65
+ } catch (e) {
66
+ t.error(C("eventfullymanaged.events.errors.create", "Could not create event"), a(e));
67
+ }
60
68
  },
61
- children: [/* @__PURE__ */ s(l, { className: "h-4 w-4" }), E ? b("eventfullymanaged.events.actions.creating", "Creating...") : b("eventfullymanaged.events.actions.create", "Create Event")]
69
+ children: [/* @__PURE__ */ u(f, { className: "h-4 w-4" }), k ? C("eventfullymanaged.events.actions.creating", "Creating...") : C("eventfullymanaged.events.actions.create", "Create Event")]
62
70
  })]
63
71
  })
64
72
  ] }),
65
- /* @__PURE__ */ s(i, {
66
- heading: C ? b("eventfullymanaged.events.list.loading", "Loading events...") : `${b("eventfullymanaged.events.list.heading", "Events")} (${k.length})`,
67
- emptyLabel: b("eventfullymanaged.events.list.empty", "No events found."),
68
- rows: k.map((e) => ({
73
+ /* @__PURE__ */ u(s, {
74
+ heading: E ? C("eventfullymanaged.events.list.loading", "Loading events...") : `${C("eventfullymanaged.events.list.heading", "Events")} (${M.length})`,
75
+ emptyLabel: C("eventfullymanaged.events.list.empty", "No events found."),
76
+ rows: M.map((e) => ({
69
77
  id: e.id,
70
78
  title: e.name,
71
79
  subtitle: [e.type, e.startAt ? new Date(e.startAt).toLocaleString() : void 0].filter(Boolean).join(" • "),
72
80
  status: e.status
73
81
  }))
74
82
  }),
75
- /* @__PURE__ */ s(i, {
76
- heading: w.loading ? b("eventfullymanaged.events.ticketTypes.loading", "Loading ticket types...") : `${b("eventfullymanaged.events.ticketTypes.heading", "Ticket Types")} (${A.length})`,
77
- emptyLabel: b("eventfullymanaged.events.ticketTypes.empty", "No ticket types configured."),
78
- rows: A.map((e) => ({
83
+ /* @__PURE__ */ u(s, {
84
+ heading: D.loading ? C("eventfullymanaged.events.ticketTypes.loading", "Loading ticket types...") : `${C("eventfullymanaged.events.ticketTypes.heading", "Ticket Types")} (${N.length})`,
85
+ emptyLabel: C("eventfullymanaged.events.ticketTypes.empty", "No ticket types configured."),
86
+ rows: N.map((e) => ({
79
87
  id: e.id,
80
88
  title: e.name,
81
- subtitle: `${e.price} ${e.currency} • ${b("eventfullymanaged.events.ticketTypes.soldPrefix", "Sold")} ${e.soldCount}`,
89
+ subtitle: `${e.price} ${e.currency} • ${C("eventfullymanaged.events.ticketTypes.soldPrefix", "Sold")} ${e.soldCount}`,
82
90
  status: e.isActive ? "active" : "inactive"
83
91
  }))
84
92
  }),
85
- /* @__PURE__ */ s(_, {
93
+ /* @__PURE__ */ u(b, {
86
94
  storageKey: "eventfullymanaged-events",
87
- title: b("eventfullymanaged.events.nextSteps.title", "Finish setting up your event"),
95
+ title: C("eventfullymanaged.events.nextSteps.title", "Finish setting up your event"),
88
96
  steps: [
89
97
  {
90
98
  id: "configure-registration",
91
- label: b("eventfullymanaged.events.nextSteps.registration", "Configure registration & tickets"),
92
- description: b("eventfullymanaged.events.nextSteps.registrationDesc", "Define ticket types and open sign-ups for attendees."),
93
- icon: /* @__PURE__ */ s(u, { className: "h-4 w-4" }),
94
- onClick: () => x("/registration")
99
+ label: C("eventfullymanaged.events.nextSteps.registration", "Configure registration & tickets"),
100
+ description: C("eventfullymanaged.events.nextSteps.registrationDesc", "Define ticket types and open sign-ups for attendees."),
101
+ icon: /* @__PURE__ */ u(p, { className: "h-4 w-4" }),
102
+ onClick: () => w("/registration")
95
103
  },
96
104
  {
97
105
  id: "plan-networking",
98
- label: b("eventfullymanaged.events.nextSteps.networking", "Plan networking & sessions"),
99
- description: b("eventfullymanaged.events.nextSteps.networkingDesc", "Set up attendee matchmaking and meeting schedules."),
100
- icon: /* @__PURE__ */ s(d, { className: "h-4 w-4" }),
101
- onClick: () => x("/networking")
106
+ label: C("eventfullymanaged.events.nextSteps.networking", "Plan networking & sessions"),
107
+ description: C("eventfullymanaged.events.nextSteps.networkingDesc", "Set up attendee matchmaking and meeting schedules."),
108
+ icon: /* @__PURE__ */ u(m, { className: "h-4 w-4" }),
109
+ onClick: () => w("/networking")
102
110
  },
103
111
  {
104
112
  id: "announce",
105
- label: b("eventfullymanaged.events.nextSteps.announce", "Announce to attendees"),
106
- description: b("eventfullymanaged.events.nextSteps.announceDesc", "Send announcements and run communication campaigns."),
107
- icon: /* @__PURE__ */ s(l, { className: "h-4 w-4" }),
108
- onClick: () => x("/communication")
113
+ label: C("eventfullymanaged.events.nextSteps.announce", "Announce to attendees"),
114
+ description: C("eventfullymanaged.events.nextSteps.announceDesc", "Send announcements and run communication campaigns."),
115
+ icon: /* @__PURE__ */ u(f, { className: "h-4 w-4" }),
116
+ onClick: () => w("/communication")
109
117
  }
110
118
  ]
111
119
  })
@@ -113,6 +121,6 @@ function y() {
113
121
  });
114
122
  }
115
123
  //#endregion
116
- export { y as default };
124
+ export { S as default };
117
125
 
118
126
  //# sourceMappingURL=EventsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { CalendarPlus, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Button, EmphasisPanel, GradientText, Input, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useCreateEventMutation, useEventsQuery, useTicketTypesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n};\n\nexport default function EventsPage() {\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 } = useEventsQuery({ limit: 100, offset: 0 });\n const ticketTypesQuery = useTicketTypesQuery({ limit: 100, offset: 0 });\n const [createEvent, { loading: creating }] = useCreateEventMutation();\n const [name, setName] = useState('');\n\n const rows = useMemo(() => (data?.events.items ?? []) as EventRow[], [data]);\n const ticketTypes = useMemo(() => ticketTypesQuery.data?.ticketTypes.items ?? [], [ticketTypesQuery.data]);\n\n const onCreate = async () => {\n if (!name.trim()) return;\n const now = new Date();\n const nextHour = new Date(now.getTime() + 60 * 60 * 1000);\n await createEvent({\n variables: {\n input: {\n name: name.trim(),\n description: '',\n type: 'IN_PERSON',\n status: 'DRAFT',\n timezone: 'Asia/Kolkata',\n startAt: now.toISOString(),\n endAt: nextHour.toISOString(),\n visibility: 'private',\n capacity: 100,\n metadata: {},\n },\n },\n });\n setName('');\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.events.purpose',\n 'Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event here, then attach ticket types so people can buy their way in. Use this when you are spinning up a new conference, meetup or summit.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.events.title', 'Events')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.events.description', 'Create and manage live events from the workspace graph.')}\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('eventfullymanaged.events.namePlaceholder', 'Annual Innovation Summit')}\n aria-label={t('eventfullymanaged.events.namePlaceholder', 'Annual Innovation Summit')}\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creating} onClick={onCreate}>\n <CalendarPlus className=\"h-4 w-4\" />\n {creating\n ? t('eventfullymanaged.events.actions.creating', 'Creating...')\n : t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n loading\n ? t('eventfullymanaged.events.list.loading', 'Loading events...')\n : `${t('eventfullymanaged.events.list.heading', 'Events')} (${rows.length})`\n }\n emptyLabel={t('eventfullymanaged.events.list.empty', 'No events found.')}\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: [row.type, row.startAt ? new Date(row.startAt).toLocaleString() : undefined]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n ticketTypesQuery.loading\n ? t('eventfullymanaged.events.ticketTypes.loading', 'Loading ticket types...')\n : `${t('eventfullymanaged.events.ticketTypes.heading', 'Ticket Types')} (${ticketTypes.length})`\n }\n emptyLabel={t('eventfullymanaged.events.ticketTypes.empty', 'No ticket types configured.')}\n rows={ticketTypes.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: `${row.price} ${row.currency} • ${t('eventfullymanaged.events.ticketTypes.soldPrefix', 'Sold')} ${row.soldCount}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-events\"\n title={t('eventfullymanaged.events.nextSteps.title', 'Finish setting up your event')}\n steps={[\n {\n id: 'configure-registration',\n label: t('eventfullymanaged.events.nextSteps.registration', 'Configure registration & tickets'),\n description: t(\n 'eventfullymanaged.events.nextSteps.registrationDesc',\n 'Define ticket types and open sign-ups for attendees.'\n ),\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'plan-networking',\n label: t('eventfullymanaged.events.nextSteps.networking', 'Plan networking & sessions'),\n description: t(\n 'eventfullymanaged.events.nextSteps.networkingDesc',\n 'Set up attendee matchmaking and meeting schedules.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'announce',\n label: t('eventfullymanaged.events.nextSteps.announce', 'Announce to attendees'),\n description: t(\n 'eventfullymanaged.events.nextSteps.announceDesc',\n 'Send announcements and run communication campaigns.'\n ),\n icon: <CalendarPlus className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { CalendarPlus, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Button, EmphasisPanel, GradientText, Input, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useCreateEventMutation, useEventsQuery, useTicketTypesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport { EntityListSection } from './EntityListSection';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n};\n\nexport default function EventsPage() {\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 } = useEventsQuery({ limit: 100, offset: 0 });\n const ticketTypesQuery = useTicketTypesQuery({ limit: 100, offset: 0 });\n const [createEvent, { loading: creating }] = useCreateEventMutation();\n const [name, setName] = useState('');\n\n const rows = useMemo(() => (data?.events.items ?? []) as EventRow[], [data]);\n const ticketTypes = useMemo(() => ticketTypesQuery.data?.ticketTypes.items ?? [], [ticketTypesQuery.data]);\n\n const onCreate = async () => {\n if (!name.trim()) return;\n const now = new Date();\n const nextHour = new Date(now.getTime() + 60 * 60 * 1000);\n try {\n const response = await createEvent({\n variables: {\n input: {\n name: name.trim(),\n description: '',\n type: 'IN_PERSON',\n status: 'DRAFT',\n timezone: 'Asia/Kolkata',\n startAt: now.toISOString(),\n endAt: nextHour.toISOString(),\n visibility: 'private',\n capacity: 100,\n metadata: {},\n },\n },\n });\n if (\n !mutationSucceeded(\n response,\n response.data?.createEvent?.id,\n t('eventfullymanaged.events.errors.create', 'Could not create event')\n )\n ) {\n return;\n }\n setName('');\n notify.success(t('eventfullymanaged.events.created', 'Event created'));\n } catch (error) {\n notify.error(t('eventfullymanaged.events.errors.create', 'Could not create event'), describeError(error));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.events.purpose',\n 'Events are the heart of the platform — each one is a happening you sell tickets for, register attendees to, and run on the day. Create an event here, then attach ticket types so people can buy their way in. Use this when you are spinning up a new conference, meetup or summit.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.events.title', 'Events')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t('eventfullymanaged.events.description', 'Create and manage live events from the workspace graph.')}\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('eventfullymanaged.events.namePlaceholder', 'Annual Innovation Summit')}\n aria-label={t('eventfullymanaged.events.namePlaceholder', 'Annual Innovation Summit')}\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creating} onClick={onCreate}>\n <CalendarPlus className=\"h-4 w-4\" />\n {creating\n ? t('eventfullymanaged.events.actions.creating', 'Creating...')\n : t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n loading\n ? t('eventfullymanaged.events.list.loading', 'Loading events...')\n : `${t('eventfullymanaged.events.list.heading', 'Events')} (${rows.length})`\n }\n emptyLabel={t('eventfullymanaged.events.list.empty', 'No events found.')}\n rows={rows.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: [row.type, row.startAt ? new Date(row.startAt).toLocaleString() : undefined]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n ticketTypesQuery.loading\n ? t('eventfullymanaged.events.ticketTypes.loading', 'Loading ticket types...')\n : `${t('eventfullymanaged.events.ticketTypes.heading', 'Ticket Types')} (${ticketTypes.length})`\n }\n emptyLabel={t('eventfullymanaged.events.ticketTypes.empty', 'No ticket types configured.')}\n rows={ticketTypes.map((row) => ({\n id: row.id,\n title: row.name,\n subtitle: `${row.price} ${row.currency} • ${t('eventfullymanaged.events.ticketTypes.soldPrefix', 'Sold')} ${row.soldCount}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-events\"\n title={t('eventfullymanaged.events.nextSteps.title', 'Finish setting up your event')}\n steps={[\n {\n id: 'configure-registration',\n label: t('eventfullymanaged.events.nextSteps.registration', 'Configure registration & tickets'),\n description: t(\n 'eventfullymanaged.events.nextSteps.registrationDesc',\n 'Define ticket types and open sign-ups for attendees.'\n ),\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'plan-networking',\n label: t('eventfullymanaged.events.nextSteps.networking', 'Plan networking & sessions'),\n description: t(\n 'eventfullymanaged.events.nextSteps.networkingDesc',\n 'Set up attendee matchmaking and meeting schedules.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'announce',\n label: t('eventfullymanaged.events.nextSteps.announce', 'Announce to attendees'),\n description: t(\n 'eventfullymanaged.events.nextSteps.announceDesc',\n 'Send announcements and run communication campaigns.'\n ),\n icon: <CalendarPlus className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -5,18 +5,27 @@ import { useMemo as a } from "react";
5
5
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
6
  import { CalendarDays as c, Megaphone as l, Users as u } from "lucide-react";
7
7
  import { EmphasisPanel as d, GradientText as f, NextSteps as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
8
+ import { ContextConversationWidget as h } from "@burdenoff/fe-libs/shared";
9
+ import { useRegisterPageConversationContext as g } from "@burdenoff/fe-libs/shared/providers/shell";
8
10
  //#region src/eventfullymanaged/pages/modules/NetworkingPage.tsx
9
- function h() {
11
+ function _() {
12
+ return g({
13
+ entityType: "EVENTFULLYMANAGED_NETWORKING_LOUNGE",
14
+ entityId: "general",
15
+ contextTitle: "Networking Lounge"
16
+ }), /* @__PURE__ */ o(h, { widgetKey: "networking-lounge" });
17
+ }
18
+ function v() {
10
19
  let { navigate: h } = e(), g = r({
11
20
  limit: 100,
12
21
  offset: 0
13
- }), _ = n({
22
+ }), v = n({
14
23
  limit: 100,
15
24
  offset: 0
16
- }), v = t({
25
+ }), y = t({
17
26
  limit: 100,
18
27
  offset: 0
19
- }), y = a(() => g.data?.networkingProfiles.items ?? [], [g.data]), b = a(() => _.data?.networkingMatches.items ?? [], [_.data]), x = a(() => v.data?.meetings.items ?? [], [v.data]);
28
+ }), b = a(() => g.data?.networkingProfiles.items ?? [], [g.data]), x = a(() => v.data?.networkingMatches.items ?? [], [v.data]), S = a(() => y.data?.meetings.items ?? [], [y.data]);
20
29
  return /* @__PURE__ */ s("div", {
21
30
  className: "space-y-6 p-6",
22
31
  children: [
@@ -29,10 +38,10 @@ function h() {
29
38
  children: "Manage networking matches and meeting schedules from live backend data."
30
39
  })] }),
31
40
  /* @__PURE__ */ o(i, {
32
- heading: g.loading ? "Loading networking profiles..." : `Profiles (${y.length})`,
41
+ heading: g.loading ? "Loading networking profiles..." : `Profiles (${b.length})`,
33
42
  emptyLabel: "No networking profiles available.",
34
43
  emptyIllustration: "empty-people",
35
- rows: y.map((e) => ({
44
+ rows: b.map((e) => ({
36
45
  id: e.id,
37
46
  title: e.attendeeId ? `Attendee ${e.attendeeId}` : `Profile ${e.id}`,
38
47
  subtitle: [e.role, e.industry].filter(Boolean).join(" • "),
@@ -40,10 +49,10 @@ function h() {
40
49
  }))
41
50
  }),
42
51
  /* @__PURE__ */ o(i, {
43
- heading: _.loading ? "Loading networking matches..." : `Matches (${b.length})`,
52
+ heading: v.loading ? "Loading networking matches..." : `Matches (${x.length})`,
44
53
  emptyLabel: "No networking matches available.",
45
54
  emptyIllustration: "empty-people",
46
- rows: b.map((e) => ({
55
+ rows: x.map((e) => ({
47
56
  id: e.id,
48
57
  title: e.name ?? e.title ?? `Match ${e.id}`,
49
58
  subtitle: "Suggested by networking engine",
@@ -51,14 +60,24 @@ function h() {
51
60
  }))
52
61
  }),
53
62
  /* @__PURE__ */ o(i, {
54
- heading: v.loading ? "Loading meetings..." : `Meetings (${x.length})`,
63
+ heading: y.loading ? "Loading meetings..." : `Meetings (${S.length})`,
55
64
  emptyLabel: "No meetings scheduled.",
56
- rows: x.map((e) => ({
65
+ rows: S.map((e) => ({
57
66
  id: e.id,
58
67
  title: e.title ?? e.name ?? `Meeting ${e.id}`,
59
68
  status: e.status ?? void 0
60
69
  }))
61
70
  }),
71
+ /* @__PURE__ */ s("div", {
72
+ className: "space-y-3",
73
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h2", {
74
+ className: "text-lg font-semibold text-text-primary",
75
+ children: "Networking chat"
76
+ }), /* @__PURE__ */ o("p", {
77
+ className: "mt-1 text-sm text-text-secondary",
78
+ children: "A shared space for attendees and organizers to connect, backed by the conversations service."
79
+ })] }), /* @__PURE__ */ o(_, {})]
80
+ }),
62
81
  /* @__PURE__ */ o(p, {
63
82
  storageKey: "eventfullymanaged-networking",
64
83
  title: "Make networking land",
@@ -90,6 +109,6 @@ function h() {
90
109
  });
91
110
  }
92
111
  //#endregion
93
- export { h as default };
112
+ export { v as default };
94
113
 
95
114
  //# sourceMappingURL=NetworkingPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkingPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/NetworkingPage.tsx"],"sourcesContent":["import { CalendarDays, Megaphone, Users } from 'lucide-react';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useNetworkingProfilesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function NetworkingPage() {\n const { navigate } = useEventfullyManaged();\n const profilesQuery = useNetworkingProfilesQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const profiles = useMemo(() => profilesQuery.data?.networkingProfiles.items ?? [], [profilesQuery.data]);\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 Networking turns attendees into connections. Profiles describe who each attendee is and what they are looking\n for, matches are the suggestions the engine makes between them, and meetings are the 1:1s they book. Use this\n page to spot strong matches and make sure scheduled meetings are running smoothly.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Networking</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Manage networking matches and meeting schedules from live backend data.\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={profilesQuery.loading ? 'Loading networking profiles...' : `Profiles (${profiles.length})`}\n emptyLabel=\"No networking profiles available.\"\n emptyIllustration=\"empty-people\"\n rows={profiles.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Profile ${row.id}`,\n subtitle: [row.role, row.industry].filter(Boolean).join(' • '),\n status: row.visibility,\n }))}\n />\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Matches (${matches.length})`}\n emptyLabel=\"No networking matches available.\"\n emptyIllustration=\"empty-people\"\n rows={matches.map((row) => ({\n id: row.id,\n title: row.name ?? row.title ?? `Match ${row.id}`,\n subtitle: 'Suggested by networking engine',\n status: row.status ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Meetings (${meetings.length})`}\n emptyLabel=\"No meetings scheduled.\"\n rows={meetings.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Meeting ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-networking\"\n title=\"Make networking land\"\n steps={[\n {\n id: 'grow-attendees',\n label: 'Bring in more attendees',\n description: 'More registered attendees means richer matches and meetings.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'announce-networking',\n label: 'Announce networking sessions',\n description: 'Let attendees know how and when to connect.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n {\n id: 'review-event',\n label: 'Review the event schedule',\n description: 'Make sure networking slots fit around your sessions.',\n icon: <CalendarDays className=\"h-4 w-4\" />,\n onClick: () => navigate('/events'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAwB,IAAiB;CACvC,IAAM,EAAE,gBAAa,GAAsB,EACrC,IAAgB,EAA2B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACrE,IAAe,EAA0B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACnE,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE3D,IAAW,QAAc,EAAc,MAAM,mBAAmB,SAAS,EAAE,EAAE,CAAC,EAAc,KAAK,CAAC,EAClG,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,kTAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,cAAyB,CAAA;IACpC,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cAAmC;IAE5C,CAAA,CACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAc,UAAU,mCAAmC,aAAa,EAAS,OAAO;IACjG,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAS,KAAK,OAAS;KAC3B,IAAI,EAAI;KACR,OAAO,EAAI,aAAa,YAAY,EAAI,eAAe,WAAW,EAAI;KACtE,UAAU,CAAC,EAAI,MAAM,EAAI,SAAS,CAAC,OAAO,QAAQ,CAAC,KAAK,MAAM;KAC9D,QAAQ,EAAI;KACb,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAS,EAAa,UAAU,kCAAkC,YAAY,EAAQ,OAAO;IAC7F,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAQ,KAAK,OAAS;KAC1B,IAAI,EAAI;KACR,OAAO,EAAI,QAAQ,EAAI,SAAS,SAAS,EAAI;KAC7C,UAAU;KACV,QAAQ,EAAI,UAAU,KAAA;KACvB,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAS,EAAc,UAAU,wBAAwB,aAAa,EAAS,OAAO;IACtF,YAAW;IACX,MAAM,EAAS,KAAK,OAAS;KAC3B,IAAI,EAAI;KACR,OAAO,EAAI,SAAS,EAAI,QAAQ,WAAW,EAAI;KAC/C,QAAQ,EAAI,UAAU,KAAA;KACvB,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,YAAW;IACX,OAAM;IACN,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,eAAe,EAAS,gBAAgB;MACzC;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,eAAe,EAAS,iBAAiB;MAC1C;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,eAAe,EAAS,UAAU;MACnC;KACF;IACD,CAAA;GACE"}
1
+ {"version":3,"file":"NetworkingPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/NetworkingPage.tsx"],"sourcesContent":["import { CalendarDays, Megaphone, Users } from 'lucide-react';\nimport { ContextConversationWidget } from '@burdenoff/fe-libs/shared';\nimport { useRegisterPageConversationContext } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useNetworkingProfilesQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\n/**\n * Shared networking lounge chat, backed by wspace-conversations-svc. Scoped by a\n * stable networking entity so every organizer/attendee on this workspace lands in\n * the same thread.\n */\nfunction NetworkingLounge() {\n useRegisterPageConversationContext({\n entityType: 'EVENTFULLYMANAGED_NETWORKING_LOUNGE',\n entityId: 'general',\n contextTitle: 'Networking Lounge',\n });\n return <ContextConversationWidget widgetKey=\"networking-lounge\" />;\n}\n\nexport default function NetworkingPage() {\n const { navigate } = useEventfullyManaged();\n const profilesQuery = useNetworkingProfilesQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const profiles = useMemo(() => profilesQuery.data?.networkingProfiles.items ?? [], [profilesQuery.data]);\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 Networking turns attendees into connections. Profiles describe who each attendee is and what they are looking\n for, matches are the suggestions the engine makes between them, and meetings are the 1:1s they book. Use this\n page to spot strong matches and make sure scheduled meetings are running smoothly.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Networking</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Manage networking matches and meeting schedules from live backend data.\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={profilesQuery.loading ? 'Loading networking profiles...' : `Profiles (${profiles.length})`}\n emptyLabel=\"No networking profiles available.\"\n emptyIllustration=\"empty-people\"\n rows={profiles.map((row) => ({\n id: row.id,\n title: row.attendeeId ? `Attendee ${row.attendeeId}` : `Profile ${row.id}`,\n subtitle: [row.role, row.industry].filter(Boolean).join(' • '),\n status: row.visibility,\n }))}\n />\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Matches (${matches.length})`}\n emptyLabel=\"No networking matches available.\"\n emptyIllustration=\"empty-people\"\n rows={matches.map((row) => ({\n id: row.id,\n title: row.name ?? row.title ?? `Match ${row.id}`,\n subtitle: 'Suggested by networking engine',\n status: row.status ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Meetings (${meetings.length})`}\n emptyLabel=\"No meetings scheduled.\"\n rows={meetings.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Meeting ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n\n <div className=\"space-y-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Networking chat</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n A shared space for attendees and organizers to connect, backed by the conversations service.\n </p>\n </div>\n <NetworkingLounge />\n </div>\n\n <NextSteps\n storageKey=\"eventfullymanaged-networking\"\n title=\"Make networking land\"\n steps={[\n {\n id: 'grow-attendees',\n label: 'Bring in more attendees',\n description: 'More registered attendees means richer matches and meetings.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n {\n id: 'announce-networking',\n label: 'Announce networking sessions',\n description: 'Let attendees know how and when to connect.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n {\n id: 'review-event',\n label: 'Review the event schedule',\n description: 'Make sure networking slots fit around your sessions.',\n icon: <CalendarDays className=\"h-4 w-4\" />,\n onClick: () => navigate('/events'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -6,15 +6,24 @@ import { useParams as a } from "react-router-dom";
6
6
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
7
  import { Megaphone as c, Pencil as l, TrendingUp as u } from "lucide-react";
8
8
  import { EmphasisPanel as d, GlassCard as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
9
+ import { ContextConversationWidget as g } from "@burdenoff/fe-libs/shared";
10
+ import { useRegisterPageConversationContext as _ } from "@burdenoff/fe-libs/shared/providers/shell";
9
11
  //#region src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx
10
- function g() {
11
- let { id: g = "" } = a(), { navigate: _ } = e(), v = n({
12
+ function v({ sponsorId: e, sponsorName: t }) {
13
+ return _({
14
+ entityType: "EVENTFULLYMANAGED_SPONSOR",
15
+ entityId: e,
16
+ contextTitle: `Sponsor · ${t}`
17
+ }), /* @__PURE__ */ o(g, { widgetKey: "sponsor-message" });
18
+ }
19
+ function y() {
20
+ let { id: g = "" } = a(), { navigate: _ } = e(), y = n({
12
21
  limit: 100,
13
22
  offset: 0
14
- }), y = t({
23
+ }), b = t({
15
24
  limit: 100,
16
25
  offset: 0
17
- }), b = i(() => (v.data?.sponsors.items ?? []).find((e) => e.id === g), [g, v.data]), x = i(() => y.data?.communicationCampaigns.items ?? [], [y.data]);
26
+ }), x = i(() => (y.data?.sponsors.items ?? []).find((e) => e.id === g), [g, y.data]), S = i(() => b.data?.communicationCampaigns.items ?? [], [b.data]);
18
27
  return /* @__PURE__ */ s("div", {
19
28
  className: "space-y-6 p-6",
20
29
  children: [
@@ -26,9 +35,9 @@ function g() {
26
35
  }),
27
36
  /* @__PURE__ */ o("p", {
28
37
  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."
38
+ children: y.loading ? "Loading sponsor details..." : x ? `Live sponsor profile for ${x.name}.` : "Sponsor not found in current query scope."
30
39
  }),
31
- b ? /* @__PURE__ */ s("div", {
40
+ x ? /* @__PURE__ */ s("div", {
32
41
  className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
33
42
  children: [
34
43
  /* @__PURE__ */ s(f, {
@@ -39,7 +48,7 @@ function g() {
39
48
  children: "Level"
40
49
  }), /* @__PURE__ */ o("p", {
41
50
  className: "mt-1 font-medium text-text-primary",
42
- children: b.level
51
+ children: x.level
43
52
  })]
44
53
  }),
45
54
  /* @__PURE__ */ s(f, {
@@ -50,7 +59,7 @@ function g() {
50
59
  children: "Contact"
51
60
  }), /* @__PURE__ */ o("p", {
52
61
  className: "mt-1 font-medium text-text-primary",
53
- children: b.contactName ?? "Unassigned"
62
+ children: x.contactName ?? "Unassigned"
54
63
  })]
55
64
  }),
56
65
  /* @__PURE__ */ s(f, {
@@ -61,7 +70,7 @@ function g() {
61
70
  children: "Email"
62
71
  }), /* @__PURE__ */ o("p", {
63
72
  className: "mt-1 font-medium text-text-primary",
64
- children: b.contactEmail ?? "Unavailable"
73
+ children: x.contactEmail ?? "Unavailable"
65
74
  })]
66
75
  }),
67
76
  /* @__PURE__ */ s(f, {
@@ -72,21 +81,34 @@ function g() {
72
81
  children: "Website"
73
82
  }), /* @__PURE__ */ o("p", {
74
83
  className: "mt-1 truncate font-medium text-text-primary",
75
- children: b.website ?? "Unavailable"
84
+ children: x.website ?? "Unavailable"
76
85
  })]
77
86
  })
78
87
  ]
79
88
  }) : null
80
89
  ] }),
81
90
  /* @__PURE__ */ o(r, {
82
- heading: y.loading ? "Loading campaigns..." : `Campaign Activity (${x.length})`,
91
+ heading: b.loading ? "Loading campaigns..." : `Campaign Activity (${S.length})`,
83
92
  emptyLabel: "No communication campaigns available for sponsor tracking.",
84
- rows: x.map((e) => ({
93
+ rows: S.map((e) => ({
85
94
  id: e.id,
86
95
  title: e.title ?? e.name ?? `Campaign ${e.id}`,
87
96
  status: e.status
88
97
  }))
89
98
  }),
99
+ x ? /* @__PURE__ */ s("div", {
100
+ className: "space-y-3",
101
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h2", {
102
+ className: "text-lg font-semibold text-text-primary",
103
+ children: "Sponsor messages"
104
+ }), /* @__PURE__ */ o("p", {
105
+ className: "mt-1 text-sm text-text-secondary",
106
+ children: "Coordinate with this sponsor in a dedicated thread, backed by the conversations service."
107
+ })] }), /* @__PURE__ */ o(v, {
108
+ sponsorId: x.id,
109
+ sponsorName: x.name
110
+ })]
111
+ }) : null,
90
112
  /* @__PURE__ */ o(m, {
91
113
  storageKey: "eventfullymanaged-sponsor-details",
92
114
  title: "Grow this partnership",
@@ -118,6 +140,6 @@ function g() {
118
140
  });
119
141
  }
120
142
  //#endregion
121
- export { g as default };
143
+ export { y as default };
122
144
 
123
145
  //# sourceMappingURL=SponsorDetailsPage.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"SponsorDetailsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx"],"sourcesContent":["import { Megaphone, Pencil, TrendingUp } from 'lucide-react';\nimport { ContextConversationWidget } from '@burdenoff/fe-libs/shared';\nimport { useRegisterPageConversationContext } from '@burdenoff/fe-libs/shared/providers/shell';\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\n/**\n * Sponsor ↔ organizer message thread, backed by wspace-conversations-svc and\n * scoped to this sponsor so the conversation follows the partnership.\n */\nfunction SponsorConversation({ sponsorId, sponsorName }: { sponsorId: string; sponsorName: string }) {\n useRegisterPageConversationContext({\n entityType: 'EVENTFULLYMANAGED_SPONSOR',\n entityId: sponsorId,\n contextTitle: `Sponsor · ${sponsorName}`,\n });\n return <ContextConversationWidget widgetKey=\"sponsor-message\" />;\n}\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 to\n 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 {sponsor ? (\n <div className=\"space-y-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Sponsor messages</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Coordinate with this sponsor in a dedicated thread, backed by the conversations service.\n </p>\n </div>\n <SponsorConversation sponsorId={sponsor.id} sponsorName={sponsor.name} />\n </div>\n ) : null}\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":"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"}