@burdenoff/microfe-eventfullymanaged 2026.704.7 → 2026.710.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/eventfullymanaged/EventfullyManagedRoot.d.ts +4 -0
- package/dist/eventfullymanaged/EventfullyManagedRoot.d.ts.map +1 -0
- package/dist/eventfullymanaged/EventfullyManagedRoutes.d.ts +2 -0
- package/dist/eventfullymanaged/EventfullyManagedRoutes.d.ts.map +1 -0
- package/dist/eventfullymanaged/api/eventApi.d.ts +1185 -0
- package/dist/eventfullymanaged/api/eventApi.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/ActionMenu.d.ts +45 -0
- package/dist/eventfullymanaged/components/ActionMenu.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/EntityFormShell.d.ts +27 -0
- package/dist/eventfullymanaged/components/EntityFormShell.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/EntityTagsField.d.ts +19 -0
- package/dist/eventfullymanaged/components/EntityTagsField.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/EventCharts.d.ts +44 -0
- package/dist/eventfullymanaged/components/EventCharts.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/EventCharts.js.map +1 -1
- package/dist/eventfullymanaged/components/ImageUploadField.d.ts +24 -0
- package/dist/eventfullymanaged/components/ImageUploadField.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/PageLayout.d.ts +14 -0
- package/dist/eventfullymanaged/components/PageLayout.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/Pagination.d.ts +41 -0
- package/dist/eventfullymanaged/components/Pagination.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/SafeLink.d.ts +30 -0
- package/dist/eventfullymanaged/components/SafeLink.d.ts.map +1 -0
- package/dist/eventfullymanaged/components/index.d.ts +13 -0
- package/dist/eventfullymanaged/components/index.d.ts.map +1 -0
- package/dist/eventfullymanaged/context/EventfullyManagedContext.d.ts +25 -0
- package/dist/eventfullymanaged/context/EventfullyManagedContext.d.ts.map +1 -0
- package/dist/eventfullymanaged/hooks/index.d.ts +3 -0
- package/dist/eventfullymanaged/hooks/index.d.ts.map +1 -0
- package/dist/eventfullymanaged/index.d.ts +27 -0
- package/dist/eventfullymanaged/index.d.ts.map +1 -0
- package/dist/eventfullymanaged/lib/format.d.ts +18 -0
- package/dist/eventfullymanaged/lib/format.d.ts.map +1 -0
- package/dist/eventfullymanaged/lib/mutationResult.d.ts +23 -0
- package/dist/eventfullymanaged/lib/mutationResult.d.ts.map +1 -0
- package/dist/eventfullymanaged/lib/toast.d.ts +22 -0
- package/dist/eventfullymanaged/lib/toast.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/events/EventDetailPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js +1 -2
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/events/EventFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/events/EventFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.d.ts +40 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.d.ts +23 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EntityListSection.d.ts +16 -0
- package/dist/eventfullymanaged/pages/modules/EntityListSection.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/EventsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +223 -118
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.d.ts +19 -0
- package/dist/eventfullymanaged/pages/modules/KioskPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.d.ts +9 -0
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.d.ts +24 -0
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/pages/venues/VenueListPage.d.ts +2 -0
- package/dist/eventfullymanaged/pages/venues/VenueListPage.d.ts.map +1 -0
- package/dist/eventfullymanaged/store/eventfullyManagedStore.d.ts +47 -0
- package/dist/eventfullymanaged/store/eventfullyManagedStore.d.ts.map +1 -0
- package/dist/eventfullymanaged/types/index.d.ts +3649 -0
- package/dist/eventfullymanaged/types/index.d.ts.map +1 -0
- package/dist/eventfullymanaged/utils/cn.d.ts +2 -0
- package/dist/eventfullymanaged/utils/cn.d.ts.map +1 -0
- package/dist/eventfullymanaged/utils/constants.d.ts +3 -0
- package/dist/eventfullymanaged/utils/constants.d.ts.map +1 -0
- package/dist/eventfullymanaged/utils/navigation.d.ts +2 -0
- package/dist/eventfullymanaged/utils/navigation.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +23527 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +57851 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -1
- package/dist/services/createSandboxAssistantTransport.d.ts +33 -0
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/services/createSandboxAssistantTransport.js +19 -0
- package/dist/services/createSandboxAssistantTransport.js.map +1 -0
- package/package.json +7 -3
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
2
|
import { gql as t } from "../../../node_modules/graphql-tag/lib/index.js";
|
|
3
3
|
import { useQuery as n } from "../../../node_modules/@apollo/client/react/hooks/useQuery.js";
|
|
4
|
-
import { useEventsQuery as r,
|
|
5
|
-
import { formatDateTime as
|
|
6
|
-
import { ActionMenu as
|
|
7
|
-
import { Pagination as
|
|
8
|
-
import { useMemo as
|
|
9
|
-
import { jsx as
|
|
10
|
-
import { CalendarClock as
|
|
11
|
-
import { useI18n as
|
|
12
|
-
import { Badge as
|
|
4
|
+
import { useEventsQuery as r, useSponsorsQuery as i, useVenuesQuery as a } from "../../api/eventApi.js";
|
|
5
|
+
import { formatDateTime as o } from "../events/eventFormUtils.js";
|
|
6
|
+
import { ActionMenu as s } from "../../components/ActionMenu.js";
|
|
7
|
+
import { Pagination as c, usePagination as l } from "../../components/Pagination.js";
|
|
8
|
+
import { useMemo as u, useState as d } from "react";
|
|
9
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
10
|
+
import { Award as m, CalendarClock as h, CalendarDays as g, CalendarPlus as _, MapPin as v, Search as ee, Ticket as y, UserCheck as b, Users as x } from "lucide-react";
|
|
11
|
+
import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
|
+
import { Badge as C, Button as w, EmphasisPanel as T, GlassCard as E, GradientText as D, IllustratedEmptyState as O, Input as k, NextSteps as te, PagePurpose as ne, Skeleton as A, Tabs as re, TabsList as ie, TabsTrigger as j } from "@burdenoff/fe-libs/ui";
|
|
13
13
|
//#region src/eventfullymanaged/pages/modules/EventsPage.tsx
|
|
14
|
-
var
|
|
14
|
+
var M = t`
|
|
15
15
|
query EventfullymanagedEventsRegistrations($limit: Int) {
|
|
16
16
|
registrations: eventfullyManagedRegistrations(limit: $limit, offset: 0) {
|
|
17
17
|
total
|
|
@@ -23,7 +23,7 @@ var j = t`
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
`;
|
|
26
|
-
function
|
|
26
|
+
function N(e) {
|
|
27
27
|
let t = e.toLowerCase();
|
|
28
28
|
return [
|
|
29
29
|
"active",
|
|
@@ -45,44 +45,73 @@ function M(e) {
|
|
|
45
45
|
"scheduled"
|
|
46
46
|
].includes(t) ? "info" : "secondary";
|
|
47
47
|
}
|
|
48
|
-
function
|
|
49
|
-
let n = e ?
|
|
48
|
+
function P(e, t) {
|
|
49
|
+
let n = e ? o(e) : "", r = t ? o(t) : "";
|
|
50
50
|
return n && r ? `${n} — ${r}` : n || r || "No schedule set";
|
|
51
51
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
52
|
+
function F(e, t) {
|
|
53
|
+
let n = Date.now(), r = e ? new Date(e).getTime() : NaN, i = t ? new Date(t).getTime() : NaN, a = !Number.isNaN(r), o = !Number.isNaN(i);
|
|
54
|
+
return !a && !o ? null : a && n < r ? "upcoming" : o && n > i ? "past" : a ? "live" : "upcoming";
|
|
55
|
+
}
|
|
56
|
+
function I({ icon: e, label: t, value: n, loading: r }) {
|
|
57
|
+
return /* @__PURE__ */ f(E, {
|
|
58
|
+
treatment: "plain",
|
|
59
|
+
className: "border-border-seam p-4",
|
|
60
|
+
children: /* @__PURE__ */ p("div", {
|
|
61
|
+
className: "flex items-center gap-3",
|
|
62
|
+
children: [/* @__PURE__ */ f("span", {
|
|
63
|
+
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary",
|
|
64
|
+
children: /* @__PURE__ */ f(e, { className: "h-4 w-4" })
|
|
65
|
+
}), /* @__PURE__ */ p("div", {
|
|
66
|
+
className: "min-w-0",
|
|
67
|
+
children: [r ? /* @__PURE__ */ f(A, { className: "h-6 w-12" }) : /* @__PURE__ */ f("p", {
|
|
68
|
+
className: "truncate text-xl font-bold tabular-nums text-text-primary",
|
|
69
|
+
children: n
|
|
70
|
+
}), /* @__PURE__ */ f("p", {
|
|
71
|
+
className: "truncate text-xs text-text-muted",
|
|
72
|
+
children: t
|
|
73
|
+
})]
|
|
74
|
+
})]
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function L({ icon: e, label: t, value: n }) {
|
|
79
|
+
return /* @__PURE__ */ p("div", {
|
|
54
80
|
className: "flex items-center gap-1.5",
|
|
55
81
|
children: [
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ f(e, { className: "h-3.5 w-3.5 text-text-muted" }),
|
|
83
|
+
/* @__PURE__ */ f("span", {
|
|
58
84
|
className: "tabular-nums font-medium text-text-primary",
|
|
59
85
|
children: n
|
|
60
86
|
}),
|
|
61
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ f("span", {
|
|
62
88
|
className: "text-text-muted",
|
|
63
89
|
children: t
|
|
64
90
|
})
|
|
65
91
|
]
|
|
66
92
|
});
|
|
67
93
|
}
|
|
68
|
-
function
|
|
69
|
-
let { t } =
|
|
94
|
+
function R() {
|
|
95
|
+
let { t } = S(), o = (e, n) => {
|
|
70
96
|
let r = t(e);
|
|
71
97
|
return r === e ? n : r;
|
|
72
|
-
}, { navigate:
|
|
73
|
-
search:
|
|
74
|
-
limit:
|
|
75
|
-
offset:
|
|
76
|
-
}), { data:
|
|
98
|
+
}, { navigate: R } = e(), [z, B] = d(""), [V, H] = d("all"), U = l({ resetKey: z }), { data: W, loading: G } = r({
|
|
99
|
+
search: z,
|
|
100
|
+
limit: U.limit,
|
|
101
|
+
offset: U.offset
|
|
102
|
+
}), { data: K, loading: q } = a({
|
|
77
103
|
limit: 100,
|
|
78
104
|
offset: 0
|
|
79
|
-
}), { data:
|
|
105
|
+
}), { data: J, loading: ae } = i({
|
|
106
|
+
limit: 1,
|
|
107
|
+
offset: 0
|
|
108
|
+
}), { data: Y, loading: oe } = n(M, { variables: { limit: 500 } }), X = W?.events?.total ?? 0, Z = u(() => W?.events?.items ?? [], [W]), se = Y?.registrations?.total ?? 0, Q = K?.venues?.total ?? 0, ce = J?.sponsors?.total ?? 0, $ = u(() => V === "all" ? Z : Z.filter((e) => F(e.startAt, e.endAt) === V), [Z, V]), le = u(() => {
|
|
80
109
|
let e = /* @__PURE__ */ new Map();
|
|
81
|
-
for (let t of
|
|
110
|
+
for (let t of K?.venues?.items ?? []) e.set(t.id, t.name);
|
|
82
111
|
return e;
|
|
83
|
-
}, [
|
|
112
|
+
}, [K]), ue = u(() => {
|
|
84
113
|
let e = /* @__PURE__ */ new Map();
|
|
85
|
-
for (let t of
|
|
114
|
+
for (let t of Y?.registrations?.items ?? []) {
|
|
86
115
|
let n = e.get(t.eventId) ?? {
|
|
87
116
|
registrations: 0,
|
|
88
117
|
checkedIn: 0
|
|
@@ -90,176 +119,252 @@ function F() {
|
|
|
90
119
|
n.registrations += 1, t.checkedInAt && (n.checkedIn += 1), e.set(t.eventId, n);
|
|
91
120
|
}
|
|
92
121
|
return e;
|
|
93
|
-
}, [
|
|
94
|
-
return /* @__PURE__ */
|
|
122
|
+
}, [Y]);
|
|
123
|
+
return /* @__PURE__ */ p("div", {
|
|
95
124
|
className: "space-y-6 p-6",
|
|
96
125
|
children: [
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ f(ne, { children: o("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.") }),
|
|
127
|
+
/* @__PURE__ */ f(T, { children: /* @__PURE__ */ p("div", {
|
|
99
128
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
129
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
|
|
101
130
|
className: "text-2xl font-bold text-text-primary",
|
|
102
|
-
children: /* @__PURE__ */
|
|
103
|
-
}), /* @__PURE__ */
|
|
131
|
+
children: /* @__PURE__ */ f(D, { children: o("eventfullymanaged.events.title", "Events") })
|
|
132
|
+
}), /* @__PURE__ */ f("p", {
|
|
104
133
|
className: "mt-1 text-sm text-text-secondary",
|
|
105
|
-
children:
|
|
106
|
-
})] }), /* @__PURE__ */
|
|
134
|
+
children: o("eventfullymanaged.events.description", "Create and manage live events from the workspace graph.")
|
|
135
|
+
})] }), /* @__PURE__ */ p(w, {
|
|
107
136
|
type: "button",
|
|
108
|
-
onClick: () =>
|
|
109
|
-
children: [/* @__PURE__ */
|
|
137
|
+
onClick: () => R("/events/create"),
|
|
138
|
+
children: [/* @__PURE__ */ f(_, { className: "h-4 w-4" }), o("eventfullymanaged.events.actions.create", "Create Event")]
|
|
110
139
|
})]
|
|
111
140
|
}) }),
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
className: "
|
|
114
|
-
children: [
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
141
|
+
/* @__PURE__ */ p("div", {
|
|
142
|
+
className: "grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ f(I, {
|
|
145
|
+
icon: g,
|
|
146
|
+
label: o("eventfullymanaged.events.portfolio.events", "Events"),
|
|
147
|
+
value: X.toLocaleString(),
|
|
148
|
+
loading: G && X === 0
|
|
149
|
+
}),
|
|
150
|
+
/* @__PURE__ */ f(I, {
|
|
151
|
+
icon: x,
|
|
152
|
+
label: o("eventfullymanaged.events.portfolio.registrations", "Registrations"),
|
|
153
|
+
value: se.toLocaleString(),
|
|
154
|
+
loading: oe && !Y
|
|
155
|
+
}),
|
|
156
|
+
/* @__PURE__ */ f(I, {
|
|
157
|
+
icon: v,
|
|
158
|
+
label: o("eventfullymanaged.events.portfolio.venues", "Venues"),
|
|
159
|
+
value: Q.toLocaleString(),
|
|
160
|
+
loading: q && !K
|
|
161
|
+
}),
|
|
162
|
+
/* @__PURE__ */ f(I, {
|
|
163
|
+
icon: m,
|
|
164
|
+
label: o("eventfullymanaged.events.portfolio.sponsors", "Sponsors"),
|
|
165
|
+
value: ce.toLocaleString(),
|
|
166
|
+
loading: ae && !J
|
|
167
|
+
})
|
|
168
|
+
]
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ p("div", {
|
|
171
|
+
className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
172
|
+
children: [/* @__PURE__ */ p("div", {
|
|
173
|
+
className: "relative flex-1",
|
|
174
|
+
children: [/* @__PURE__ */ f(ee, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ f(k, {
|
|
175
|
+
type: "text",
|
|
176
|
+
value: z,
|
|
177
|
+
onChange: (e) => B(e.target.value),
|
|
178
|
+
placeholder: o("eventfullymanaged.events.searchPlaceholder", "Search events"),
|
|
179
|
+
"aria-label": o("eventfullymanaged.events.searchPlaceholder", "Search events"),
|
|
180
|
+
className: "pl-10"
|
|
181
|
+
})]
|
|
182
|
+
}), /* @__PURE__ */ f(re, {
|
|
183
|
+
value: V,
|
|
184
|
+
onValueChange: (e) => H(e),
|
|
185
|
+
className: "w-full sm:w-auto",
|
|
186
|
+
children: /* @__PURE__ */ p(ie, {
|
|
187
|
+
className: "w-full overflow-x-auto sm:w-auto",
|
|
188
|
+
children: [
|
|
189
|
+
/* @__PURE__ */ f(j, {
|
|
190
|
+
value: "all",
|
|
191
|
+
children: o("eventfullymanaged.events.filters.all", "All")
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ f(j, {
|
|
194
|
+
value: "upcoming",
|
|
195
|
+
children: o("eventfullymanaged.events.filters.upcoming", "Upcoming")
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ f(j, {
|
|
198
|
+
value: "live",
|
|
199
|
+
children: o("eventfullymanaged.events.filters.live", "Live")
|
|
200
|
+
}),
|
|
201
|
+
/* @__PURE__ */ f(j, {
|
|
202
|
+
value: "past",
|
|
203
|
+
children: o("eventfullymanaged.events.filters.past", "Past")
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
})
|
|
121
207
|
})]
|
|
122
208
|
}),
|
|
123
|
-
|
|
209
|
+
G ? /* @__PURE__ */ p("div", {
|
|
124
210
|
className: "space-y-3",
|
|
125
211
|
children: [
|
|
126
|
-
/* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ f(A, { className: "h-28 w-full rounded-card" }),
|
|
213
|
+
/* @__PURE__ */ f(A, { className: "h-28 w-full rounded-card" }),
|
|
214
|
+
/* @__PURE__ */ f(A, { className: "h-28 w-full rounded-card" })
|
|
129
215
|
]
|
|
130
|
-
}) :
|
|
216
|
+
}) : Z.length === 0 ? /* @__PURE__ */ f(E, {
|
|
131
217
|
treatment: "plain",
|
|
132
218
|
className: "border-border-seam",
|
|
133
|
-
children: /* @__PURE__ */
|
|
134
|
-
illustration:
|
|
135
|
-
title:
|
|
136
|
-
description:
|
|
137
|
-
action:
|
|
219
|
+
children: /* @__PURE__ */ f(O, {
|
|
220
|
+
illustration: z ? "empty-search" : "empty-data",
|
|
221
|
+
title: z ? o("eventfullymanaged.events.list.emptySearch", "No events match your search.") : o("eventfullymanaged.events.list.empty", "No events yet."),
|
|
222
|
+
description: z ? o("eventfullymanaged.events.list.emptySearchHint", "Try a different name.") : o("eventfullymanaged.events.list.emptyHint", "Create your first event to get started."),
|
|
223
|
+
action: z ? void 0 : /* @__PURE__ */ p(w, {
|
|
138
224
|
type: "button",
|
|
139
|
-
onClick: () =>
|
|
140
|
-
children: [/* @__PURE__ */
|
|
225
|
+
onClick: () => R("/events/create"),
|
|
226
|
+
children: [/* @__PURE__ */ f(_, { className: "h-4 w-4" }), o("eventfullymanaged.events.actions.create", "Create Event")]
|
|
141
227
|
})
|
|
142
228
|
})
|
|
143
|
-
}) : /* @__PURE__ */
|
|
229
|
+
}) : $.length === 0 ? /* @__PURE__ */ p("div", {
|
|
230
|
+
className: "space-y-3",
|
|
231
|
+
children: [/* @__PURE__ */ f(E, {
|
|
232
|
+
treatment: "plain",
|
|
233
|
+
className: "border-border-seam",
|
|
234
|
+
children: /* @__PURE__ */ f("p", {
|
|
235
|
+
className: "px-2 py-8 text-center text-sm text-text-secondary",
|
|
236
|
+
children: o("eventfullymanaged.events.filters.empty", `No ${V} events on this page. Switch tabs or move to another page.`)
|
|
237
|
+
})
|
|
238
|
+
}), /* @__PURE__ */ f(c, {
|
|
239
|
+
offset: U.offset,
|
|
240
|
+
limit: U.limit,
|
|
241
|
+
loadedCount: Z.length,
|
|
242
|
+
total: X,
|
|
243
|
+
onPrev: U.prevPage,
|
|
244
|
+
onNext: U.nextPage,
|
|
245
|
+
itemLabel: "events",
|
|
246
|
+
loading: G
|
|
247
|
+
})]
|
|
248
|
+
}) : /* @__PURE__ */ p("div", {
|
|
144
249
|
className: "space-y-3",
|
|
145
|
-
children: [
|
|
146
|
-
let t = e.metadata ?? {}, n = typeof t.venueId == "string" ? t.venueId : "", r = n ?
|
|
147
|
-
return /* @__PURE__ */
|
|
250
|
+
children: [$.map((e) => {
|
|
251
|
+
let t = e.metadata ?? {}, n = typeof t.venueId == "string" ? t.venueId : "", r = n ? le.get(n) : void 0, i = ue.get(e.id), a = i?.registrations ?? 0, c = a > 0 ? Math.round((i?.checkedIn ?? 0) / a * 100) : 0;
|
|
252
|
+
return /* @__PURE__ */ p(E, {
|
|
148
253
|
treatment: "plain",
|
|
149
254
|
role: "button",
|
|
150
255
|
tabIndex: 0,
|
|
151
256
|
"aria-label": e.name,
|
|
152
257
|
className: "group relative cursor-pointer overflow-hidden border-border-seam p-0 outline-none transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
|
|
153
|
-
onClick: () =>
|
|
258
|
+
onClick: () => R(`/events/${e.id}`),
|
|
154
259
|
onKeyDown: (t) => {
|
|
155
|
-
(t.key === "Enter" || t.key === " ") && (t.preventDefault(),
|
|
260
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), R(`/events/${e.id}`));
|
|
156
261
|
},
|
|
157
|
-
children: [/* @__PURE__ */
|
|
262
|
+
children: [/* @__PURE__ */ f("span", {
|
|
158
263
|
"aria-hidden": "true",
|
|
159
264
|
className: "absolute inset-y-0 left-0 w-1.5 bg-gradient-to-b from-[var(--color-chart-1)] to-[var(--color-chart-2)]"
|
|
160
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ p("div", {
|
|
161
266
|
className: "flex flex-col gap-3 py-4 pl-5 pr-4 sm:flex-row sm:items-center sm:justify-between",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
267
|
+
children: [/* @__PURE__ */ p("div", {
|
|
163
268
|
className: "min-w-0 space-y-2",
|
|
164
269
|
children: [
|
|
165
|
-
/* @__PURE__ */
|
|
270
|
+
/* @__PURE__ */ p("div", {
|
|
166
271
|
className: "flex flex-wrap items-center gap-2",
|
|
167
272
|
children: [
|
|
168
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ f("p", {
|
|
169
274
|
className: "truncate text-lg font-semibold text-text-primary",
|
|
170
275
|
children: e.name
|
|
171
276
|
}),
|
|
172
|
-
e.status ? /* @__PURE__ */
|
|
173
|
-
variant:
|
|
277
|
+
e.status ? /* @__PURE__ */ f(C, {
|
|
278
|
+
variant: N(e.status),
|
|
174
279
|
className: "uppercase",
|
|
175
280
|
children: e.status
|
|
176
281
|
}) : null,
|
|
177
|
-
e.type ? /* @__PURE__ */
|
|
282
|
+
e.type ? /* @__PURE__ */ f(C, {
|
|
178
283
|
variant: "secondary",
|
|
179
284
|
className: "capitalize",
|
|
180
285
|
children: e.type.toLowerCase().replace(/_/g, " ")
|
|
181
286
|
}) : null
|
|
182
287
|
]
|
|
183
288
|
}),
|
|
184
|
-
/* @__PURE__ */
|
|
289
|
+
/* @__PURE__ */ p("div", {
|
|
185
290
|
className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary",
|
|
186
|
-
children: [/* @__PURE__ */
|
|
291
|
+
children: [/* @__PURE__ */ p("span", {
|
|
187
292
|
className: "flex items-center gap-1.5",
|
|
188
|
-
children: [/* @__PURE__ */
|
|
189
|
-
}), /* @__PURE__ */
|
|
293
|
+
children: [/* @__PURE__ */ f(h, { className: "h-4 w-4 shrink-0 text-text-muted" }), P(e.startAt, e.endAt)]
|
|
294
|
+
}), /* @__PURE__ */ p("span", {
|
|
190
295
|
className: "flex items-center gap-1.5",
|
|
191
|
-
children: [/* @__PURE__ */
|
|
296
|
+
children: [/* @__PURE__ */ f(v, { className: "h-4 w-4 shrink-0 text-text-muted" }), r ?? o("eventfullymanaged.events.card.noVenue", "No venue")]
|
|
192
297
|
})]
|
|
193
298
|
}),
|
|
194
|
-
/* @__PURE__ */
|
|
299
|
+
/* @__PURE__ */ p("div", {
|
|
195
300
|
className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-xs",
|
|
196
301
|
children: [
|
|
197
|
-
/* @__PURE__ */
|
|
198
|
-
icon:
|
|
199
|
-
label:
|
|
200
|
-
value:
|
|
302
|
+
/* @__PURE__ */ f(L, {
|
|
303
|
+
icon: b,
|
|
304
|
+
label: o("eventfullymanaged.events.card.registered", "registered"),
|
|
305
|
+
value: a.toLocaleString()
|
|
201
306
|
}),
|
|
202
|
-
/* @__PURE__ */
|
|
203
|
-
icon:
|
|
204
|
-
label:
|
|
307
|
+
/* @__PURE__ */ f(L, {
|
|
308
|
+
icon: b,
|
|
309
|
+
label: o("eventfullymanaged.events.card.checkedIn", "checked in"),
|
|
205
310
|
value: `${c}%`
|
|
206
311
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
icon:
|
|
209
|
-
label:
|
|
312
|
+
/* @__PURE__ */ f(L, {
|
|
313
|
+
icon: x,
|
|
314
|
+
label: o("eventfullymanaged.events.card.capacity", "capacity"),
|
|
210
315
|
value: e.capacity == null ? "—" : e.capacity.toLocaleString()
|
|
211
316
|
})
|
|
212
317
|
]
|
|
213
318
|
})
|
|
214
319
|
]
|
|
215
|
-
}), /* @__PURE__ */
|
|
320
|
+
}), /* @__PURE__ */ f("div", {
|
|
216
321
|
className: "flex shrink-0 items-center gap-2 self-start sm:self-center",
|
|
217
322
|
onClick: (e) => e.stopPropagation(),
|
|
218
323
|
onKeyDown: (e) => e.stopPropagation(),
|
|
219
324
|
role: "presentation",
|
|
220
|
-
children: /* @__PURE__ */
|
|
325
|
+
children: /* @__PURE__ */ f(s, {
|
|
221
326
|
ariaLabel: `Event actions for ${e.name}`,
|
|
222
|
-
onView: () =>
|
|
223
|
-
onEdit: () =>
|
|
327
|
+
onView: () => R(`/events/${e.id}`),
|
|
328
|
+
onEdit: () => R(`/events/${e.id}/edit`)
|
|
224
329
|
})
|
|
225
330
|
})]
|
|
226
331
|
})]
|
|
227
332
|
}, e.id);
|
|
228
|
-
}), /* @__PURE__ */
|
|
229
|
-
offset:
|
|
230
|
-
limit:
|
|
231
|
-
loadedCount:
|
|
232
|
-
total:
|
|
233
|
-
onPrev:
|
|
234
|
-
onNext:
|
|
333
|
+
}), /* @__PURE__ */ f(c, {
|
|
334
|
+
offset: U.offset,
|
|
335
|
+
limit: U.limit,
|
|
336
|
+
loadedCount: Z.length,
|
|
337
|
+
total: X,
|
|
338
|
+
onPrev: U.prevPage,
|
|
339
|
+
onNext: U.nextPage,
|
|
235
340
|
itemLabel: "events",
|
|
236
|
-
loading:
|
|
341
|
+
loading: G
|
|
237
342
|
})]
|
|
238
343
|
}),
|
|
239
|
-
/* @__PURE__ */
|
|
344
|
+
/* @__PURE__ */ f(te, {
|
|
240
345
|
storageKey: "eventfullymanaged-events",
|
|
241
|
-
title:
|
|
346
|
+
title: o("eventfullymanaged.events.nextSteps.title", "Finish setting up your event"),
|
|
242
347
|
steps: [
|
|
243
348
|
{
|
|
244
349
|
id: "configure-registration",
|
|
245
|
-
label:
|
|
246
|
-
description:
|
|
247
|
-
icon: /* @__PURE__ */
|
|
248
|
-
onClick: () =>
|
|
350
|
+
label: o("eventfullymanaged.events.nextSteps.registration", "Configure registration & tickets"),
|
|
351
|
+
description: o("eventfullymanaged.events.nextSteps.registrationDesc", "Open an event and define ticket types so people can register."),
|
|
352
|
+
icon: /* @__PURE__ */ f(y, { className: "h-4 w-4" }),
|
|
353
|
+
onClick: () => R("/registration")
|
|
249
354
|
},
|
|
250
355
|
{
|
|
251
356
|
id: "plan-networking",
|
|
252
|
-
label:
|
|
253
|
-
description:
|
|
254
|
-
icon: /* @__PURE__ */
|
|
255
|
-
onClick: () =>
|
|
357
|
+
label: o("eventfullymanaged.events.nextSteps.networking", "Plan networking & sessions"),
|
|
358
|
+
description: o("eventfullymanaged.events.nextSteps.networkingDesc", "Set up attendee matchmaking and meeting schedules."),
|
|
359
|
+
icon: /* @__PURE__ */ f(x, { className: "h-4 w-4" }),
|
|
360
|
+
onClick: () => R("/networking")
|
|
256
361
|
},
|
|
257
362
|
{
|
|
258
363
|
id: "announce",
|
|
259
|
-
label:
|
|
260
|
-
description:
|
|
261
|
-
icon: /* @__PURE__ */
|
|
262
|
-
onClick: () =>
|
|
364
|
+
label: o("eventfullymanaged.events.nextSteps.announce", "Announce to attendees"),
|
|
365
|
+
description: o("eventfullymanaged.events.nextSteps.announceDesc", "Send announcements and run communication campaigns."),
|
|
366
|
+
icon: /* @__PURE__ */ f(_, { className: "h-4 w-4" }),
|
|
367
|
+
onClick: () => R("/communication")
|
|
263
368
|
}
|
|
264
369
|
]
|
|
265
370
|
})
|
|
@@ -267,6 +372,6 @@ function F() {
|
|
|
267
372
|
});
|
|
268
373
|
}
|
|
269
374
|
//#endregion
|
|
270
|
-
export {
|
|
375
|
+
export { R as default };
|
|
271
376
|
|
|
272
377
|
//# sourceMappingURL=EventsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { CalendarClock, CalendarPlus, MapPin, Search, Ticket, UserCheck, 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 Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useEventsQuery, useVenuesQuery } from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { formatDateTime } from '../events/eventFormUtils';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n capacity?: number | null;\n visibility?: string;\n metadata?: Record<string, unknown> | null;\n};\n\n// Per-event registration + check-in counts, computed once from a real registrations\n// read (no per-row queries) so each card can show live mini-stats.\nconst EVENTS_REGISTRATIONS_QUERY = gql`\n query EventfullymanagedEventsRegistrations($limit: Int) {\n registrations: eventfullyManagedRegistrations(limit: $limit, offset: 0) {\n total\n items {\n id\n eventId\n checkedInAt\n }\n }\n }\n`;\n\ntype RegistrationStat = { id: string; eventId: string; checkedInAt?: string | null };\ntype EventsRegistrationsResponse = { registrations: { total: number; items: RegistrationStat[] } };\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\nfunction formatDateRange(startAt?: string, endAt?: string): string {\n const start = startAt ? formatDateTime(startAt) : '';\n const end = endAt ? formatDateTime(endAt) : '';\n if (start && end) {\n return `${start} — ${end}`;\n }\n return start || end || 'No schedule set';\n}\n\nfunction MiniStat({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3.5 w-3.5 text-text-muted\" />\n <span className=\"tabular-nums font-medium text-text-primary\">{value}</span>\n <span className=\"text-text-muted\">{label}</span>\n </div>\n );\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 const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: registrationsData } = useQuery<EventsRegistrationsResponse, { limit: number }>(\n EVENTS_REGISTRATIONS_QUERY,\n { variables: { limit: 500 } }\n );\n\n const total = data?.events?.total ?? 0;\n const rows = useMemo(() => (data?.events?.items ?? []) as EventRow[], [data]);\n\n const venueNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const venue of venuesData?.venues?.items ?? []) {\n map.set(venue.id, venue.name);\n }\n return map;\n }, [venuesData]);\n\n const statsByEvent = useMemo(() => {\n const map = new Map<string, { registrations: number; checkedIn: number }>();\n for (const registration of registrationsData?.registrations?.items ?? []) {\n const entry = map.get(registration.eventId) ?? { registrations: 0, checkedIn: 0 };\n entry.registrations += 1;\n if (registration.checkedInAt) {\n entry.checkedIn += 1;\n }\n map.set(registration.eventId, entry);\n }\n return map;\n }, [registrationsData]);\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 <div className=\"space-y-3\">\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n </div>\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 const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <GlassCard\n key={event.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={event.name}\n className=\"group relative cursor-pointer overflow-hidden border-border-seam p-0 outline-none transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n {/* Cover accent strip */}\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 left-0 w-1.5 bg-gradient-to-b from-[var(--color-chart-1)] to-[var(--color-chart-2)]\"\n />\n <div className=\"flex flex-col gap-3 py-4 pl-5 pr-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-lg font-semibold text-text-primary\">{event.name}</p>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : null}\n {event.type ? (\n <Badge variant=\"secondary\" className=\"capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <CalendarClock className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {formatDateRange(event.startAt, event.endAt)}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.registered', 'registered')}\n value={registrations.toLocaleString()}\n />\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.checkedIn', 'checked in')}\n value={`${checkInPct}%`}\n />\n <MiniStat\n icon={Users}\n label={t('eventfullymanaged.events.card.capacity', 'capacity')}\n value={event.capacity != null ? event.capacity.toLocaleString() : '—'}\n />\n </div>\n </div>\n <div\n className=\"flex shrink-0 items-center gap-2 self-start sm:self-center\"\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n role=\"presentation\"\n >\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\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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"}
|
|
1
|
+
{"version":3,"file":"EventsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/EventsPage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Award,\n CalendarClock,\n CalendarDays,\n CalendarPlus,\n MapPin,\n Search,\n Ticket,\n UserCheck,\n Users,\n} 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 Skeleton,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useEventsQuery, useSponsorsQuery, useVenuesQuery } from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { formatDateTime } from '../events/eventFormUtils';\n\ntype EventRow = {\n id: string;\n name: string;\n type?: string;\n status?: string;\n startAt?: string;\n endAt?: string;\n capacity?: number | null;\n visibility?: string;\n metadata?: Record<string, unknown> | null;\n};\n\n// Per-event registration + check-in counts, computed once from a real registrations\n// read (no per-row queries) so each card can show live mini-stats.\nconst EVENTS_REGISTRATIONS_QUERY = gql`\n query EventfullymanagedEventsRegistrations($limit: Int) {\n registrations: eventfullyManagedRegistrations(limit: $limit, offset: 0) {\n total\n items {\n id\n eventId\n checkedInAt\n }\n }\n }\n`;\n\ntype RegistrationStat = { id: string; eventId: string; checkedInAt?: string | null };\ntype EventsRegistrationsResponse = { registrations: { total: number; items: RegistrationStat[] } };\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\nfunction formatDateRange(startAt?: string, endAt?: string): string {\n const start = startAt ? formatDateTime(startAt) : '';\n const end = endAt ? formatDateTime(endAt) : '';\n if (start && end) {\n return `${start} — ${end}`;\n }\n return start || end || 'No schedule set';\n}\n\ntype Lifecycle = 'upcoming' | 'live' | 'past';\ntype LifecycleFilter = 'all' | Lifecycle;\n\n// Derive an event's lifecycle from its schedule (DateTime scalars arrive as ISO\n// strings, so parse via `new Date(...)`). Upcoming = starts in the future, Live =\n// now falls within start–end (open-ended if no end), Past = already ended.\nfunction eventLifecycle(startAt?: string, endAt?: string): Lifecycle | null {\n const now = Date.now();\n const start = startAt ? new Date(startAt).getTime() : Number.NaN;\n const end = endAt ? new Date(endAt).getTime() : Number.NaN;\n const hasStart = !Number.isNaN(start);\n const hasEnd = !Number.isNaN(end);\n if (!hasStart && !hasEnd) {\n return null;\n }\n if (hasStart && now < start) {\n return 'upcoming';\n }\n if (hasEnd && now > end) {\n return 'past';\n }\n if (hasStart) {\n return 'live';\n }\n return 'upcoming';\n}\n\nfunction PortfolioStat({\n icon: Icon,\n label,\n value,\n loading,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n loading: boolean;\n}) {\n return (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-button bg-bg-sunken text-text-secondary\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n {loading ? (\n <Skeleton className=\"h-6 w-12\" />\n ) : (\n <p className=\"truncate text-xl font-bold tabular-nums text-text-primary\">{value}</p>\n )}\n <p className=\"truncate text-xs text-text-muted\">{label}</p>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nfunction MiniStat({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3.5 w-3.5 text-text-muted\" />\n <span className=\"tabular-nums font-medium text-text-primary\">{value}</span>\n <span className=\"text-text-muted\">{label}</span>\n </div>\n );\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 [statusFilter, setStatusFilter] = useState<LifecycleFilter>('all');\n const pagination = usePagination({ resetKey: search });\n const { data, loading } = useEventsQuery({ search, limit: pagination.limit, offset: pagination.offset });\n const { data: venuesData, loading: venuesLoading } = useVenuesQuery({ limit: 100, offset: 0 });\n const { data: sponsorsData, loading: sponsorsLoading } = useSponsorsQuery({ limit: 1, offset: 0 });\n const { data: registrationsData, loading: registrationsLoading } = useQuery<\n EventsRegistrationsResponse,\n { limit: number }\n >(EVENTS_REGISTRATIONS_QUERY, { variables: { limit: 500 } });\n\n const total = data?.events?.total ?? 0;\n const rows = useMemo(() => (data?.events?.items ?? []) as EventRow[], [data]);\n\n const registrationsTotal = registrationsData?.registrations?.total ?? 0;\n const venuesTotal = venuesData?.venues?.total ?? 0;\n const sponsorsTotal = sponsorsData?.sponsors?.total ?? 0;\n\n const visibleRows = useMemo(() => {\n if (statusFilter === 'all') {\n return rows;\n }\n return rows.filter((event) => eventLifecycle(event.startAt, event.endAt) === statusFilter);\n }, [rows, statusFilter]);\n\n const venueNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const venue of venuesData?.venues?.items ?? []) {\n map.set(venue.id, venue.name);\n }\n return map;\n }, [venuesData]);\n\n const statsByEvent = useMemo(() => {\n const map = new Map<string, { registrations: number; checkedIn: number }>();\n for (const registration of registrationsData?.registrations?.items ?? []) {\n const entry = map.get(registration.eventId) ?? { registrations: 0, checkedIn: 0 };\n entry.registrations += 1;\n if (registration.checkedInAt) {\n entry.checkedIn += 1;\n }\n map.set(registration.eventId, entry);\n }\n return map;\n }, [registrationsData]);\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 {/* Portfolio summary — real aggregate totals across the whole workspace graph. */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <PortfolioStat\n icon={CalendarDays}\n label={t('eventfullymanaged.events.portfolio.events', 'Events')}\n value={total.toLocaleString()}\n loading={loading && total === 0}\n />\n <PortfolioStat\n icon={Users}\n label={t('eventfullymanaged.events.portfolio.registrations', 'Registrations')}\n value={registrationsTotal.toLocaleString()}\n loading={registrationsLoading && !registrationsData}\n />\n <PortfolioStat\n icon={MapPin}\n label={t('eventfullymanaged.events.portfolio.venues', 'Venues')}\n value={venuesTotal.toLocaleString()}\n loading={venuesLoading && !venuesData}\n />\n <PortfolioStat\n icon={Award}\n label={t('eventfullymanaged.events.portfolio.sponsors', 'Sponsors')}\n value={sponsorsTotal.toLocaleString()}\n loading={sponsorsLoading && !sponsorsData}\n />\n </div>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative flex-1\">\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 <Tabs\n value={statusFilter}\n onValueChange={(value) => setStatusFilter(value as LifecycleFilter)}\n className=\"w-full sm:w-auto\"\n >\n <TabsList className=\"w-full overflow-x-auto sm:w-auto\">\n <TabsTrigger value=\"all\">{t('eventfullymanaged.events.filters.all', 'All')}</TabsTrigger>\n <TabsTrigger value=\"upcoming\">{t('eventfullymanaged.events.filters.upcoming', 'Upcoming')}</TabsTrigger>\n <TabsTrigger value=\"live\">{t('eventfullymanaged.events.filters.live', 'Live')}</TabsTrigger>\n <TabsTrigger value=\"past\">{t('eventfullymanaged.events.filters.past', 'Past')}</TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n\n {loading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n <Skeleton className=\"h-28 w-full rounded-card\" />\n </div>\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 ) : visibleRows.length === 0 ? (\n <div className=\"space-y-3\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <p className=\"px-2 py-8 text-center text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.events.filters.empty',\n `No ${statusFilter} events on this page. Switch tabs or move to another page.`\n )}\n </p>\n </GlassCard>\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 <div className=\"space-y-3\">\n {visibleRows.map((event) => {\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n const venueId = typeof metadata.venueId === 'string' ? metadata.venueId : '';\n const venueName = venueId ? venueNameById.get(venueId) : undefined;\n const stat = statsByEvent.get(event.id);\n const registrations = stat?.registrations ?? 0;\n const checkInPct = registrations > 0 ? Math.round(((stat?.checkedIn ?? 0) / registrations) * 100) : 0;\n return (\n <GlassCard\n key={event.id}\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n aria-label={event.name}\n className=\"group relative cursor-pointer overflow-hidden border-border-seam p-0 outline-none transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n onClick={() => navigate(`/events/${event.id}`)}\n onKeyDown={(keyEvent) => {\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n keyEvent.preventDefault();\n navigate(`/events/${event.id}`);\n }\n }}\n >\n {/* Cover accent strip */}\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 left-0 w-1.5 bg-gradient-to-b from-[var(--color-chart-1)] to-[var(--color-chart-2)]\"\n />\n <div className=\"flex flex-col gap-3 py-4 pl-5 pr-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-lg font-semibold text-text-primary\">{event.name}</p>\n {event.status ? (\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n ) : null}\n {event.type ? (\n <Badge variant=\"secondary\" className=\"capitalize\">\n {event.type.toLowerCase().replace(/_/g, ' ')}\n </Badge>\n ) : null}\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <CalendarClock className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {formatDateRange(event.startAt, event.endAt)}\n </span>\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 shrink-0 text-text-muted\" />\n {venueName ?? t('eventfullymanaged.events.card.noVenue', 'No venue')}\n </span>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs\">\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.registered', 'registered')}\n value={registrations.toLocaleString()}\n />\n <MiniStat\n icon={UserCheck}\n label={t('eventfullymanaged.events.card.checkedIn', 'checked in')}\n value={`${checkInPct}%`}\n />\n <MiniStat\n icon={Users}\n label={t('eventfullymanaged.events.card.capacity', 'capacity')}\n value={event.capacity != null ? event.capacity.toLocaleString() : '—'}\n />\n </div>\n </div>\n <div\n className=\"flex shrink-0 items-center gap-2 self-start sm:self-center\"\n onClick={(clickEvent) => clickEvent.stopPropagation()}\n onKeyDown={(keyEvent) => keyEvent.stopPropagation()}\n role=\"presentation\"\n >\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\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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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface DetectedBarcode {
|
|
2
|
+
rawValue: string;
|
|
3
|
+
}
|
|
4
|
+
interface BarcodeDetectorLike {
|
|
5
|
+
detect(source: CanvasImageSource): Promise<DetectedBarcode[]>;
|
|
6
|
+
}
|
|
7
|
+
interface BarcodeDetectorCtor {
|
|
8
|
+
new (options?: {
|
|
9
|
+
formats: string[];
|
|
10
|
+
}): BarcodeDetectorLike;
|
|
11
|
+
}
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
BarcodeDetector?: BarcodeDetectorCtor;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export default function KioskPage(): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=KioskPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KioskPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/modules/KioskPage.tsx"],"names":[],"mappings":"AA4DA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,mBAAmB;IAC3B,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CAC/D;AACD,UAAU,mBAAmB;IAC3B,KAAK,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,mBAAmB,CAAC;CAC5D;AACD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,eAAe,CAAC,EAAE,mBAAmB,CAAC;KACvC;CACF;AA6xBD,MAAM,CAAC,OAAO,UAAU,SAAS,4CA0XhC"}
|