@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.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 (74) hide show
  1. package/dist/eventfullymanaged/EventfullyManagedRoutes.js +154 -66
  2. package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
  3. package/dist/eventfullymanaged/api/eventApi.js +546 -67
  4. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  5. package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
  6. package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
  7. package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
  8. package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
  9. package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
  10. package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
  11. package/dist/eventfullymanaged/components/Pagination.js +84 -0
  12. package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
  13. package/dist/eventfullymanaged/components/SafeLink.js +32 -0
  14. package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
  15. package/dist/eventfullymanaged/components/index.js +7 -0
  16. package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
  17. package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
  18. package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
  19. package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
  20. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
  21. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
  22. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
  23. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
  24. package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
  25. package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
  26. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
  27. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
  28. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
  29. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
  30. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
  31. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
  32. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
  33. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  34. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
  35. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  36. package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
  37. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  38. package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
  39. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  40. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
  41. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  42. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +289 -77
  43. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  44. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
  45. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
  46. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
  47. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  48. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
  49. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  50. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
  51. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
  52. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
  53. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
  54. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
  55. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
  56. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
  57. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
  58. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +414 -0
  59. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
  60. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
  61. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
  62. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
  63. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
  64. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
  65. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  66. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
  67. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  68. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
  69. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  70. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
  71. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  72. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
  73. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  74. package/package.json +1 -1
@@ -1,119 +1,155 @@
1
1
  import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
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";
2
+ import { useEventsQuery as t } from "../../api/eventApi.js";
3
+ import { ActionMenu as n } from "../../components/ActionMenu.js";
4
+ import { Pagination as r, usePagination as i } from "../../components/Pagination.js";
5
+ import { useMemo as a, useState as o } from "react";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ import { CalendarClock as l, CalendarPlus as u, Search as d, Ticket as f, Users as p } from "lucide-react";
8
+ import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
+ import { Badge as h, Button as g, EmphasisPanel as _, GlassCard as v, GradientText as y, IllustratedEmptyState as b, Input as x, NextSteps as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
11
10
  //#region src/eventfullymanaged/pages/modules/EventsPage.tsx
12
- function S() {
13
- let { t: S } = h(), C = (e, t) => {
14
- let n = S(e);
11
+ function w(e) {
12
+ let t = e.toLowerCase();
13
+ return [
14
+ "active",
15
+ "published",
16
+ "live",
17
+ "confirmed",
18
+ "completed",
19
+ "approved"
20
+ ].includes(t) ? "success" : [
21
+ "inactive",
22
+ "cancelled",
23
+ "archived",
24
+ "closed",
25
+ "expired"
26
+ ].includes(t) ? "warning" : [
27
+ "draft",
28
+ "created",
29
+ "pending",
30
+ "scheduled"
31
+ ].includes(t) ? "info" : "secondary";
32
+ }
33
+ function T() {
34
+ let { t: T } = m(), E = (e, t) => {
35
+ let n = T(e);
15
36
  return n === e ? t : n;
16
- }, { navigate: w } = e(), { data: T, loading: E } = r({
17
- limit: 100,
18
- offset: 0
19
- }), D = i({
20
- limit: 100,
21
- offset: 0
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", {
37
+ }, { navigate: D } = e(), [O, k] = o(""), A = i({ resetKey: O }), { data: j, loading: M } = t({
38
+ search: O,
39
+ limit: A.limit,
40
+ offset: A.offset
41
+ }), N = j?.events?.total ?? 0, P = a(() => j?.events?.items ?? [], [j]);
42
+ return /* @__PURE__ */ c("div", {
24
43
  className: "space-y-6 p-6",
25
44
  children: [
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", {
45
+ /* @__PURE__ */ s(C, { children: E("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, open it to reveal its agenda, speakers and ticket types, then publish it when it is ready.") }),
46
+ /* @__PURE__ */ s(_, { children: /* @__PURE__ */ c("div", {
47
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
48
+ children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
29
49
  className: "text-2xl font-bold text-text-primary",
30
- children: /* @__PURE__ */ u(v, { children: C("eventfullymanaged.events.title", "Events") })
31
- }),
32
- /* @__PURE__ */ u("p", {
50
+ children: /* @__PURE__ */ s(y, { children: E("eventfullymanaged.events.title", "Events") })
51
+ }), /* @__PURE__ */ s("p", {
33
52
  className: "mt-1 text-sm text-text-secondary",
34
- children: C("eventfullymanaged.events.description", "Create and manage live events from the workspace graph.")
35
- }),
36
- /* @__PURE__ */ d("div", {
37
- className: "mt-4 flex flex-col gap-3 sm:flex-row",
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"),
43
- className: "flex-1"
44
- }), /* @__PURE__ */ d(g, {
53
+ children: E("eventfullymanaged.events.description", "Create and manage live events from the workspace graph.")
54
+ })] }), /* @__PURE__ */ c(g, {
55
+ type: "button",
56
+ onClick: () => D("/events/create"),
57
+ children: [/* @__PURE__ */ s(u, { className: "h-4 w-4" }), E("eventfullymanaged.events.actions.create", "Create Event")]
58
+ })]
59
+ }) }),
60
+ /* @__PURE__ */ c("div", {
61
+ className: "relative",
62
+ children: [/* @__PURE__ */ s(d, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ s(x, {
63
+ type: "text",
64
+ value: O,
65
+ onChange: (e) => k(e.target.value),
66
+ placeholder: E("eventfullymanaged.events.searchPlaceholder", "Search events"),
67
+ "aria-label": E("eventfullymanaged.events.searchPlaceholder", "Search events"),
68
+ className: "pl-10"
69
+ })]
70
+ }),
71
+ M ? /* @__PURE__ */ s(v, {
72
+ treatment: "plain",
73
+ className: "border-border-seam p-8 text-center text-sm text-text-secondary",
74
+ children: E("eventfullymanaged.events.list.loading", "Loading events...")
75
+ }) : P.length === 0 ? /* @__PURE__ */ s(v, {
76
+ treatment: "plain",
77
+ className: "border-border-seam",
78
+ children: /* @__PURE__ */ s(b, {
79
+ illustration: O ? "empty-search" : "empty-data",
80
+ title: O ? E("eventfullymanaged.events.list.emptySearch", "No events match your search.") : E("eventfullymanaged.events.list.empty", "No events yet."),
81
+ description: O ? E("eventfullymanaged.events.list.emptySearchHint", "Try a different name.") : E("eventfullymanaged.events.list.emptyHint", "Create your first event to get started."),
82
+ action: O ? void 0 : /* @__PURE__ */ c(g, {
45
83
  type: "button",
46
- disabled: k,
47
- onClick: async () => {
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
- }
68
- },
69
- children: [/* @__PURE__ */ u(f, { className: "h-4 w-4" }), k ? C("eventfullymanaged.events.actions.creating", "Creating...") : C("eventfullymanaged.events.actions.create", "Create Event")]
70
- })]
84
+ onClick: () => D("/events/create"),
85
+ children: [/* @__PURE__ */ s(u, { className: "h-4 w-4" }), E("eventfullymanaged.events.actions.create", "Create Event")]
86
+ })
71
87
  })
72
- ] }),
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) => ({
77
- id: e.id,
78
- title: e.name,
79
- subtitle: [e.type, e.startAt ? new Date(e.startAt).toLocaleString() : void 0].filter(Boolean).join(" • "),
80
- status: e.status
81
- }))
82
- }),
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) => ({
87
- id: e.id,
88
- title: e.name,
89
- subtitle: `${e.price} ${e.currency} • ${C("eventfullymanaged.events.ticketTypes.soldPrefix", "Sold")} ${e.soldCount}`,
90
- status: e.isActive ? "active" : "inactive"
91
- }))
88
+ }) : /* @__PURE__ */ c("div", {
89
+ className: "space-y-3",
90
+ children: [P.map((e) => /* @__PURE__ */ s(v, {
91
+ treatment: "plain",
92
+ className: "cursor-pointer border-border-seam p-4 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1",
93
+ onClick: () => D(`/events/${e.id}`),
94
+ children: /* @__PURE__ */ c("div", {
95
+ className: "flex items-center justify-between gap-3",
96
+ children: [/* @__PURE__ */ c("div", {
97
+ className: "min-w-0",
98
+ children: [/* @__PURE__ */ s("p", {
99
+ className: "truncate text-lg font-semibold text-text-primary",
100
+ children: e.name
101
+ }), /* @__PURE__ */ c("p", {
102
+ className: "mt-0.5 flex items-center gap-2 truncate text-sm text-text-secondary",
103
+ children: [/* @__PURE__ */ s(l, { className: "h-4 w-4 shrink-0" }), [e.type, e.startAt ? new Date(e.startAt).toLocaleString() : void 0].filter(Boolean).join(" • ") || "No schedule set"]
104
+ })]
105
+ }), /* @__PURE__ */ c("div", {
106
+ className: "flex shrink-0 items-center gap-2",
107
+ children: [e.status ? /* @__PURE__ */ s(h, {
108
+ variant: w(e.status),
109
+ className: "uppercase",
110
+ children: e.status
111
+ }) : null, /* @__PURE__ */ s(n, {
112
+ ariaLabel: `Event actions for ${e.name}`,
113
+ onView: () => D(`/events/${e.id}`),
114
+ onEdit: () => D(`/events/${e.id}/edit`)
115
+ })]
116
+ })]
117
+ })
118
+ }, e.id)), /* @__PURE__ */ s(r, {
119
+ offset: A.offset,
120
+ limit: A.limit,
121
+ loadedCount: P.length,
122
+ total: N,
123
+ onPrev: A.prevPage,
124
+ onNext: A.nextPage,
125
+ itemLabel: "events",
126
+ loading: M
127
+ })]
92
128
  }),
93
- /* @__PURE__ */ u(b, {
129
+ /* @__PURE__ */ s(S, {
94
130
  storageKey: "eventfullymanaged-events",
95
- title: C("eventfullymanaged.events.nextSteps.title", "Finish setting up your event"),
131
+ title: E("eventfullymanaged.events.nextSteps.title", "Finish setting up your event"),
96
132
  steps: [
97
133
  {
98
134
  id: "configure-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")
135
+ label: E("eventfullymanaged.events.nextSteps.registration", "Configure registration & tickets"),
136
+ description: E("eventfullymanaged.events.nextSteps.registrationDesc", "Open an event and define ticket types so people can register."),
137
+ icon: /* @__PURE__ */ s(f, { className: "h-4 w-4" }),
138
+ onClick: () => D("/registration")
103
139
  },
104
140
  {
105
141
  id: "plan-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")
142
+ label: E("eventfullymanaged.events.nextSteps.networking", "Plan networking & sessions"),
143
+ description: E("eventfullymanaged.events.nextSteps.networkingDesc", "Set up attendee matchmaking and meeting schedules."),
144
+ icon: /* @__PURE__ */ s(p, { className: "h-4 w-4" }),
145
+ onClick: () => D("/networking")
110
146
  },
111
147
  {
112
148
  id: "announce",
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")
149
+ label: E("eventfullymanaged.events.nextSteps.announce", "Announce to attendees"),
150
+ description: E("eventfullymanaged.events.nextSteps.announceDesc", "Send announcements and run communication campaigns."),
151
+ icon: /* @__PURE__ */ s(u, { className: "h-4 w-4" }),
152
+ onClick: () => D("/communication")
117
153
  }
118
154
  ]
119
155
  })
@@ -121,6 +157,6 @@ function S() {
121
157
  });
122
158
  }
123
159
  //#endregion
124
- export { S as default };
160
+ export { T as default };
125
161
 
126
162
  //# 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 { 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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"}
1
+ {"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { CalendarClock, CalendarPlus, Search, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Badge,\n Button,\n EmphasisPanel,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useEventsQuery } from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n};\n\nfunction statusVariant(status: string): 'success' | 'warning' | 'secondary' | 'info' {\n const value = status.toLowerCase();\n if (['active', 'published', 'live', 'confirmed', 'completed', 'approved'].includes(value)) {\n return 'success';\n }\n if (['inactive', 'cancelled', 'archived', 'closed', 'expired'].includes(value)) {\n return 'warning';\n }\n if (['draft', 'created', 'pending', 'scheduled'].includes(value)) {\n return 'info';\n }\n return 'secondary';\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 [search, setSearch] = useState('');\n const pagination = usePagination({ resetKey: search });\n const { data, loading } = useEventsQuery({ search, limit: pagination.limit, offset: pagination.offset });\n\n const total = data?.events?.total ?? 0;\n const rows = useMemo(() => (data?.events?.items ?? []) as EventRow[], [data]);\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, open it to reveal its agenda, speakers and ticket types, then publish it when it is ready.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\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>\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n </div>\n </EmphasisPanel>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n aria-label={t('eventfullymanaged.events.searchPlaceholder', 'Search events')}\n className=\"pl-10\"\n />\n </div>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n {t('eventfullymanaged.events.list.loading', 'Loading events...')}\n </GlassCard>\n ) : rows.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-data'}\n title={\n search\n ? t('eventfullymanaged.events.list.emptySearch', 'No events match your search.')\n : t('eventfullymanaged.events.list.empty', 'No events yet.')\n }\n description={\n search\n ? t('eventfullymanaged.events.list.emptySearchHint', 'Try a different name.')\n : t('eventfullymanaged.events.list.emptyHint', 'Create your first event to get started.')\n }\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/events/create')}>\n <CalendarPlus className=\"h-4 w-4\" />\n {t('eventfullymanaged.events.actions.create', 'Create Event')}\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"space-y-3\">\n {rows.map((event) => (\n <GlassCard\n key={event.id}\n treatment=\"plain\"\n className=\"cursor-pointer border-border-seam p-4 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n onClick={() => navigate(`/events/${event.id}`)}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-lg font-semibold text-text-primary\">{event.name}</p>\n <p className=\"mt-0.5 flex items-center gap-2 truncate text-sm text-text-secondary\">\n <CalendarClock className=\"h-4 w-4 shrink-0\" />\n {[event.type, event.startAt ? new Date(event.startAt).toLocaleString() : undefined]\n .filter(Boolean)\n .join(' • ') || 'No schedule set'}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : null}\n <ActionMenu\n ariaLabel={`Event actions for ${event.name}`}\n onView={() => navigate(`/events/${event.id}`)}\n onEdit={() => navigate(`/events/${event.id}/edit`)}\n />\n </div>\n </div>\n </GlassCard>\n ))}\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={rows.length}\n total={total}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"events\"\n loading={loading}\n />\n </div>\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 'Open an event and define ticket types so people can register.'\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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"}