@burdenoff/microfe-eventfullymanaged 2026.625.1 → 2026.703.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eventfullymanaged/api/eventApi.js +83 -38
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
- package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
- package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
- package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
- package/dist/eventfullymanaged/lib/toast.js +36 -0
- package/dist/eventfullymanaged/lib/toast.js.map +1 -0
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
- package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +63 -51
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +137 -78
- package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -45
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +89 -52
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +73 -24
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
- package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +132 -77
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
- package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +81 -48
- package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +161 -133
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +103 -61
- package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +156 -147
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
- package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,97 +1,127 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { useVenueQuery as t } from "../../api/eventApi.js";
|
|
3
|
+
import { EntityListSection as n } from "./EntityListSection.js";
|
|
4
|
+
import { useMemo as r } from "react";
|
|
5
|
+
import { useParams as i } from "react-router-dom";
|
|
6
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
|
+
import { Building2 as s, Map as c, SquareStack as l } from "lucide-react";
|
|
8
|
+
import { EmphasisPanel as u, GlassCard as d, GradientText as f, NextSteps as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
7
9
|
//#region src/eventfullymanaged/pages/modules/VenueResourcesPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { id:
|
|
10
|
-
return /* @__PURE__ */
|
|
10
|
+
function h() {
|
|
11
|
+
let { id: h = "" } = i(), { navigate: g } = e(), _ = t(h), v = _.data?.venue, y = r(() => _.data?.floorPlans.items ?? [], [_.data]);
|
|
12
|
+
return /* @__PURE__ */ o("div", {
|
|
11
13
|
className: "space-y-6 p-6",
|
|
12
14
|
children: [
|
|
13
|
-
/* @__PURE__ */ a(
|
|
14
|
-
|
|
15
|
+
/* @__PURE__ */ a(m, { children: "A capacity-and-layout view of a single venue. It rolls up the practical resources you need to run an event in this space — how many people fit, what amenities are on offer, and which floor plans are mapped. Use it when deciding whether a venue can host your event and what still needs setting up." }),
|
|
16
|
+
/* @__PURE__ */ o(u, { children: [
|
|
17
|
+
/* @__PURE__ */ o("h1", {
|
|
15
18
|
className: "text-2xl font-bold text-text-primary",
|
|
16
|
-
children: [/* @__PURE__ */
|
|
19
|
+
children: [/* @__PURE__ */ a(f, { children: "Venue" }), " Resources"]
|
|
17
20
|
}),
|
|
18
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ a("p", {
|
|
19
22
|
className: "mt-1 text-sm text-text-secondary",
|
|
20
|
-
children:
|
|
23
|
+
children: _.loading ? "Loading venue resources..." : `Resource view for ${v?.name ?? "selected venue"} from live backend data.`
|
|
21
24
|
}),
|
|
22
|
-
/* @__PURE__ */
|
|
25
|
+
/* @__PURE__ */ o("div", {
|
|
23
26
|
className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
|
|
24
27
|
children: [
|
|
25
|
-
/* @__PURE__ */
|
|
28
|
+
/* @__PURE__ */ o(d, {
|
|
26
29
|
treatment: "glass",
|
|
27
30
|
glow: !0,
|
|
28
31
|
className: "p-3",
|
|
29
|
-
children: [/* @__PURE__ */
|
|
32
|
+
children: [/* @__PURE__ */ a("p", {
|
|
30
33
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
31
34
|
children: "Status"
|
|
32
|
-
}), /* @__PURE__ */
|
|
35
|
+
}), /* @__PURE__ */ a("p", {
|
|
33
36
|
className: "mt-1 font-medium text-text-primary",
|
|
34
|
-
children:
|
|
37
|
+
children: v?.status ?? "unknown"
|
|
35
38
|
})]
|
|
36
39
|
}),
|
|
37
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ o(d, {
|
|
38
41
|
treatment: "metric",
|
|
39
42
|
className: "p-3",
|
|
40
|
-
children: [/* @__PURE__ */
|
|
43
|
+
children: [/* @__PURE__ */ a("p", {
|
|
41
44
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
42
45
|
children: "Capacity"
|
|
43
|
-
}), /* @__PURE__ */
|
|
46
|
+
}), /* @__PURE__ */ a("p", {
|
|
44
47
|
className: "mt-1 font-medium tabular-nums text-text-primary",
|
|
45
|
-
children:
|
|
48
|
+
children: v?.capacity?.toLocaleString() ?? 0
|
|
46
49
|
})]
|
|
47
50
|
}),
|
|
48
|
-
/* @__PURE__ */
|
|
51
|
+
/* @__PURE__ */ o(d, {
|
|
49
52
|
treatment: "metric",
|
|
50
53
|
className: "p-3",
|
|
51
|
-
children: [/* @__PURE__ */
|
|
54
|
+
children: [/* @__PURE__ */ a("p", {
|
|
52
55
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
53
56
|
children: "Amenities"
|
|
54
|
-
}), /* @__PURE__ */
|
|
57
|
+
}), /* @__PURE__ */ a("p", {
|
|
55
58
|
className: "mt-1 font-medium tabular-nums text-text-primary",
|
|
56
|
-
children:
|
|
59
|
+
children: v?.amenities.length ?? 0
|
|
57
60
|
})]
|
|
58
61
|
}),
|
|
59
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ o(d, {
|
|
60
63
|
treatment: "metric",
|
|
61
64
|
className: "p-3",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
65
|
+
children: [/* @__PURE__ */ a("p", {
|
|
63
66
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
64
67
|
children: "Floor Plans"
|
|
65
|
-
}), /* @__PURE__ */
|
|
68
|
+
}), /* @__PURE__ */ a("p", {
|
|
66
69
|
className: "mt-1 font-medium tabular-nums text-text-primary",
|
|
67
|
-
children:
|
|
70
|
+
children: y.length
|
|
68
71
|
})]
|
|
69
72
|
})
|
|
70
73
|
]
|
|
71
74
|
})
|
|
72
75
|
] }),
|
|
73
|
-
/* @__PURE__ */
|
|
74
|
-
heading:
|
|
76
|
+
/* @__PURE__ */ a(n, {
|
|
77
|
+
heading: _.loading ? "Loading floor plans..." : `Floor Plans (${y.length})`,
|
|
75
78
|
emptyLabel: "No floor plans configured for this venue.",
|
|
76
79
|
emptyIllustration: "empty-files",
|
|
77
|
-
rows:
|
|
80
|
+
rows: y.map((e) => ({
|
|
78
81
|
id: e.id,
|
|
79
82
|
title: e.name,
|
|
80
83
|
subtitle: e.imageUrl ?? void 0
|
|
81
84
|
}))
|
|
82
85
|
}),
|
|
83
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ a(n, {
|
|
84
87
|
heading: "Amenities",
|
|
85
88
|
emptyLabel: "No amenities listed.",
|
|
86
|
-
rows: (
|
|
89
|
+
rows: (v?.amenities ?? []).map((e) => ({
|
|
87
90
|
id: e,
|
|
88
91
|
title: e
|
|
89
92
|
}))
|
|
93
|
+
}),
|
|
94
|
+
/* @__PURE__ */ a(p, {
|
|
95
|
+
storageKey: "eventfullymanaged-venue-resources",
|
|
96
|
+
title: "Get this venue event-ready",
|
|
97
|
+
steps: [
|
|
98
|
+
{
|
|
99
|
+
id: "venue-detail",
|
|
100
|
+
label: "Open venue details",
|
|
101
|
+
description: "Edit capacity, address, status and amenities.",
|
|
102
|
+
icon: /* @__PURE__ */ a(s, { className: "h-4 w-4" }),
|
|
103
|
+
onClick: () => g(h ? `/venues/${h}` : "/venues")
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "manage-floor-plans",
|
|
107
|
+
label: "Manage floor plans",
|
|
108
|
+
description: "Add or update layouts so attendees can find their way.",
|
|
109
|
+
icon: /* @__PURE__ */ a(l, { className: "h-4 w-4" }),
|
|
110
|
+
onClick: () => g(h ? `/venues/${h}/floor-plans` : "/venues")
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: "all-venues",
|
|
114
|
+
label: "Compare with other venues",
|
|
115
|
+
description: "Browse the full venue list to pick the best fit.",
|
|
116
|
+
icon: /* @__PURE__ */ a(c, { className: "h-4 w-4" }),
|
|
117
|
+
onClick: () => g("/venues")
|
|
118
|
+
}
|
|
119
|
+
]
|
|
90
120
|
})
|
|
91
121
|
]
|
|
92
122
|
});
|
|
93
123
|
}
|
|
94
124
|
//#endregion
|
|
95
|
-
export {
|
|
125
|
+
export { h as default };
|
|
96
126
|
|
|
97
127
|
//# sourceMappingURL=VenueResourcesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VenueResourcesPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/VenueResourcesPage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype FloorPlanRow = {\n id: string;\n name: string;\n imageUrl?: string | null;\n};\n\nexport default function VenueResourcesPage() {\n const { id = '' } = useParams();\n const venueQuery = useVenueQuery(id);\n const venue = venueQuery.data?.venue;\n const floorPlans = useMemo(() => (venueQuery.data?.floorPlans.items ?? []) as FloorPlanRow[], [venueQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Venue</GradientText> Resources\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {venueQuery.loading\n ? 'Loading venue resources...'\n : `Resource view for ${venue?.name ?? 'selected venue'} from live backend data.`}\n </p>\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Status</p>\n <p className=\"mt-1 font-medium text-text-primary\">{venue?.status ?? 'unknown'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Capacity</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{venue?.capacity?.toLocaleString() ?? 0}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Amenities</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{venue?.amenities.length ?? 0}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Floor Plans</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{floorPlans.length}</p>\n </GlassCard>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={venueQuery.loading ? 'Loading floor plans...' : `Floor Plans (${floorPlans.length})`}\n emptyLabel=\"No floor plans configured for this venue.\"\n emptyIllustration=\"empty-files\"\n rows={floorPlans.map((floorPlan) => ({\n id: floorPlan.id,\n title: floorPlan.name,\n subtitle: floorPlan.imageUrl ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading=\"Amenities\"\n emptyLabel=\"No amenities listed.\"\n rows={(venue?.amenities ?? []).map((amenity) => ({\n id: amenity,\n title: amenity,\n }))}\n />\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"VenueResourcesPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/VenueResourcesPage.tsx"],"sourcesContent":["import { Building2, Map, SquareStack } from 'lucide-react';\nimport { EmphasisPanel, GlassCard, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype FloorPlanRow = {\n id: string;\n name: string;\n imageUrl?: string | null;\n};\n\nexport default function VenueResourcesPage() {\n const { id = '' } = useParams();\n const { navigate } = useEventfullyManaged();\n const venueQuery = useVenueQuery(id);\n const venue = venueQuery.data?.venue;\n const floorPlans = useMemo(() => (venueQuery.data?.floorPlans.items ?? []) as FloorPlanRow[], [venueQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n A capacity-and-layout view of a single venue. It rolls up the practical resources you need to run an event in\n this space — how many people fit, what amenities are on offer, and which floor plans are mapped. Use it when\n deciding whether a venue can host your event and what still needs setting up.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Venue</GradientText> Resources\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {venueQuery.loading\n ? 'Loading venue resources...'\n : `Resource view for ${venue?.name ?? 'selected venue'} from live backend data.`}\n </p>\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Status</p>\n <p className=\"mt-1 font-medium text-text-primary\">{venue?.status ?? 'unknown'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Capacity</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{venue?.capacity?.toLocaleString() ?? 0}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Amenities</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{venue?.amenities.length ?? 0}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Floor Plans</p>\n <p className=\"mt-1 font-medium tabular-nums text-text-primary\">{floorPlans.length}</p>\n </GlassCard>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={venueQuery.loading ? 'Loading floor plans...' : `Floor Plans (${floorPlans.length})`}\n emptyLabel=\"No floor plans configured for this venue.\"\n emptyIllustration=\"empty-files\"\n rows={floorPlans.map((floorPlan) => ({\n id: floorPlan.id,\n title: floorPlan.name,\n subtitle: floorPlan.imageUrl ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading=\"Amenities\"\n emptyLabel=\"No amenities listed.\"\n rows={(venue?.amenities ?? []).map((amenity) => ({\n id: amenity,\n title: amenity,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-venue-resources\"\n title=\"Get this venue event-ready\"\n steps={[\n {\n id: 'venue-detail',\n label: 'Open venue details',\n description: 'Edit capacity, address, status and amenities.',\n icon: <Building2 className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/venues/${id}` : '/venues'),\n },\n {\n id: 'manage-floor-plans',\n label: 'Manage floor plans',\n description: 'Add or update layouts so attendees can find their way.',\n icon: <SquareStack className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/venues/${id}/floor-plans` : '/venues'),\n },\n {\n id: 'all-venues',\n label: 'Compare with other venues',\n description: 'Browse the full venue list to pick the best fit.',\n icon: <Map className=\"h-4 w-4\" />,\n onClick: () => navigate('/venues'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAeA,SAAwB,IAAqB;CAC3C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,gBAAa,GAAsB,EACrC,IAAa,EAAc,EAAG,EAC9B,IAAQ,EAAW,MAAM,OACzB,IAAa,QAAe,EAAW,MAAM,WAAW,SAAS,EAAE,EAAqB,CAAC,EAAW,KAAK,CAAC;AAEhH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAa,4SAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAA,UAAc,SAAoB,CAAA,EAAA,aAC/B;;IACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAW,UACR,+BACA,qBAAqB,GAAO,QAAQ,iBAAiB;KACvD,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAU,CAAA,EAC7E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,GAAO,UAAU;QAAc,CAAA,CACxE;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAY,CAAA,EAC/E,kBAAC,KAAD;QAAG,WAAU;kBAAmD,GAAO,UAAU,gBAAgB,IAAI;QAAM,CAAA,CACjG;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAa,CAAA,EAChF,kBAAC,KAAD;QAAG,WAAU;kBAAmD,GAAO,UAAU,UAAU;QAAM,CAAA,CACvF;;MACZ,kBAAC,GAAD;OAAW,WAAU;OAAS,WAAU;iBAAxC,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAe,CAAA,EAClF,kBAAC,KAAD;QAAG,WAAU;kBAAmD,EAAW;QAAW,CAAA,CAC5E;;MACR;;IACQ,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAW,UAAU,2BAA2B,gBAAgB,EAAW,OAAO;IAC3F,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAW,KAAK,OAAe;KACnC,IAAI,EAAU;KACd,OAAO,EAAU;KACjB,UAAU,EAAU,YAAY,KAAA;KACjC,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAQ;IACR,YAAW;IACX,OAAO,GAAO,aAAa,EAAE,EAAE,KAAK,OAAa;KAC/C,IAAI;KACJ,OAAO;KACR,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,YAAW;IACX,OAAM;IACN,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,eAAe,EAAS,IAAK,WAAW,MAAO,UAAU;MAC1D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;MACzC,eAAe,EAAS,IAAK,WAAW,EAAG,gBAAgB,UAAU;MACtE;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;MACjC,eAAe,EAAS,UAAU;MACnC;KACF;IACD,CAAA;GACE"}
|
|
@@ -1,90 +1,123 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useAutomationRulesQuery as n, useUpsertAutomationRuleMutation as r, useUpsertWorkflowTemplateMutation as i, useWorkflowTemplatesQuery as a } from "../../api/eventApi.js";
|
|
4
|
+
import { describeError as o, mutationSucceeded as s } from "../../lib/mutationResult.js";
|
|
5
|
+
import { EntityListSection as c } from "./EntityListSection.js";
|
|
6
|
+
import { useMemo as l, useState as u } from "react";
|
|
7
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
8
|
+
import { Megaphone as p, Play as m, Ticket as h } from "lucide-react";
|
|
9
|
+
import { Button as g, CTAOverflowMenu as _, EmphasisPanel as v, GradientText as y, Input as b, NextSteps as x, PagePurpose as S } from "@burdenoff/fe-libs/ui";
|
|
7
10
|
//#region src/eventfullymanaged/pages/modules/WorkflowsPage.tsx
|
|
8
|
-
function
|
|
9
|
-
let
|
|
11
|
+
function C() {
|
|
12
|
+
let { navigate: C } = e(), w = a({
|
|
10
13
|
limit: 100,
|
|
11
14
|
offset: 0
|
|
12
|
-
}),
|
|
15
|
+
}), T = n({
|
|
13
16
|
limit: 100,
|
|
14
17
|
offset: 0
|
|
15
|
-
}), [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
}), [E, { loading: D }] = i(), [O, { loading: k }] = r(), [A, j] = u("Post-event follow-up"), M = l(() => w.data?.workflowTemplates.items ?? [], [w.data]), N = l(() => T.data?.automationRules.items ?? [], [T.data]), P = async () => {
|
|
19
|
+
if (A.trim()) try {
|
|
20
|
+
let e = await E({ variables: { input: {
|
|
21
|
+
name: A,
|
|
22
|
+
title: A,
|
|
23
|
+
status: "active",
|
|
24
|
+
metadata: {}
|
|
25
|
+
} } });
|
|
26
|
+
if (!s(e, e.data?.upsertWorkflowTemplate?.id, "Could not save workflow template")) return;
|
|
27
|
+
t.success("Workflow template saved");
|
|
28
|
+
} catch (e) {
|
|
29
|
+
t.error("Could not save workflow template", o(e));
|
|
30
|
+
}
|
|
31
|
+
}, F = async () => {
|
|
32
|
+
if (A.trim()) try {
|
|
33
|
+
let e = await O({ variables: { input: {
|
|
34
|
+
name: `${A} Rule`,
|
|
35
|
+
title: `${A} Rule`,
|
|
36
|
+
status: "active",
|
|
37
|
+
metadata: {}
|
|
38
|
+
} } });
|
|
39
|
+
if (!s(e, e.data?.upsertAutomationRule?.id, "Could not save automation rule")) return;
|
|
40
|
+
t.success("Automation rule saved");
|
|
41
|
+
} catch (e) {
|
|
42
|
+
t.error("Could not save automation rule", o(e));
|
|
43
|
+
}
|
|
29
44
|
};
|
|
30
|
-
return /* @__PURE__ */
|
|
45
|
+
return /* @__PURE__ */ f("div", {
|
|
31
46
|
className: "space-y-6 p-6",
|
|
32
47
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
|
|
48
|
+
/* @__PURE__ */ d(S, { children: "Workflows automate the repetitive parts of running an event. A template is a reusable recipe (e.g. a post-event follow-up sequence); an automation rule is a trigger that fires it (e.g. “when an attendee checks in, send a welcome message”). Build them here so the platform handles routine work for you while execution is delegated to the workflow services." }),
|
|
49
|
+
/* @__PURE__ */ f(v, { children: [
|
|
50
|
+
/* @__PURE__ */ d("h1", {
|
|
35
51
|
className: "text-2xl font-bold text-text-primary",
|
|
36
|
-
children: /* @__PURE__ */
|
|
52
|
+
children: /* @__PURE__ */ d(y, { children: "Workflows" })
|
|
37
53
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ d("p", {
|
|
39
55
|
className: "mt-1 text-sm text-text-secondary",
|
|
40
56
|
children: "Manage event workflow templates and automation rules. Execution is delegated to workflow services."
|
|
41
57
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ f("div", {
|
|
43
59
|
className: "mt-4 flex flex-col gap-3 sm:flex-row sm:items-center",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
45
|
-
value:
|
|
46
|
-
onChange: (e) =>
|
|
60
|
+
children: [/* @__PURE__ */ d(b, {
|
|
61
|
+
value: A,
|
|
62
|
+
onChange: (e) => j(e.target.value),
|
|
47
63
|
"aria-label": "Workflow template name",
|
|
48
64
|
className: "flex-1"
|
|
49
|
-
}), /* @__PURE__ */
|
|
65
|
+
}), /* @__PURE__ */ f("div", {
|
|
50
66
|
className: "flex items-center gap-2",
|
|
51
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ f(g, {
|
|
52
68
|
type: "button",
|
|
53
|
-
onClick:
|
|
54
|
-
disabled:
|
|
55
|
-
children: [/* @__PURE__ */
|
|
56
|
-
}), /* @__PURE__ */
|
|
57
|
-
label:
|
|
69
|
+
onClick: P,
|
|
70
|
+
disabled: D,
|
|
71
|
+
children: [/* @__PURE__ */ d(m, { className: "h-4 w-4" }), D ? "Saving..." : "Add Template"]
|
|
72
|
+
}), /* @__PURE__ */ d(_, { actions: [{
|
|
73
|
+
label: k ? "Saving rule..." : "Add Rule",
|
|
58
74
|
onSelect: () => {
|
|
59
|
-
|
|
75
|
+
F();
|
|
60
76
|
},
|
|
61
|
-
disabled:
|
|
77
|
+
disabled: k
|
|
62
78
|
}] })]
|
|
63
79
|
})]
|
|
64
80
|
})
|
|
65
81
|
] }),
|
|
66
|
-
/* @__PURE__ */
|
|
67
|
-
heading:
|
|
82
|
+
/* @__PURE__ */ d(c, {
|
|
83
|
+
heading: w.loading ? "Loading templates..." : `Templates (${M.length})`,
|
|
68
84
|
emptyLabel: "No workflow templates configured.",
|
|
69
|
-
rows:
|
|
85
|
+
rows: M.map((e) => ({
|
|
70
86
|
id: e.id,
|
|
71
87
|
title: e.name ?? e.title ?? `Template ${e.id}`,
|
|
72
88
|
status: e.status ?? void 0
|
|
73
89
|
}))
|
|
74
90
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
heading:
|
|
91
|
+
/* @__PURE__ */ d(c, {
|
|
92
|
+
heading: T.loading ? "Loading automation rules..." : `Automation Rules (${N.length})`,
|
|
77
93
|
emptyLabel: "No automation rules configured.",
|
|
78
|
-
rows:
|
|
94
|
+
rows: N.map((e) => ({
|
|
79
95
|
id: e.id,
|
|
80
96
|
title: e.name ?? e.title ?? `Rule ${e.id}`,
|
|
81
97
|
status: e.status ?? void 0
|
|
82
98
|
}))
|
|
99
|
+
}),
|
|
100
|
+
/* @__PURE__ */ d(x, {
|
|
101
|
+
storageKey: "eventfullymanaged-workflows",
|
|
102
|
+
title: "Put your automations to work",
|
|
103
|
+
steps: [{
|
|
104
|
+
id: "wire-communication",
|
|
105
|
+
label: "Connect a communication campaign",
|
|
106
|
+
description: "Have a rule fire announcements or reminders automatically.",
|
|
107
|
+
icon: /* @__PURE__ */ d(p, { className: "h-4 w-4" }),
|
|
108
|
+
onClick: () => C("/communication")
|
|
109
|
+
}, {
|
|
110
|
+
id: "automate-checkin",
|
|
111
|
+
label: "Automate around check-in",
|
|
112
|
+
description: "Trigger welcome flows when attendees register or arrive.",
|
|
113
|
+
icon: /* @__PURE__ */ d(h, { className: "h-4 w-4" }),
|
|
114
|
+
onClick: () => C("/registration")
|
|
115
|
+
}]
|
|
83
116
|
})
|
|
84
117
|
]
|
|
85
118
|
});
|
|
86
119
|
}
|
|
87
120
|
//#endregion
|
|
88
|
-
export {
|
|
121
|
+
export { C as default };
|
|
89
122
|
|
|
90
123
|
//# sourceMappingURL=WorkflowsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/WorkflowsPage.tsx"],"sourcesContent":["import { Play } from 'lucide-react';\nimport {
|
|
1
|
+
{"version":3,"file":"WorkflowsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/WorkflowsPage.tsx"],"sourcesContent":["import { Megaphone, Play, Ticket } from 'lucide-react';\nimport {\n Button,\n CTAOverflowMenu,\n EmphasisPanel,\n GradientText,\n Input,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport {\n useAutomationRulesQuery,\n useUpsertAutomationRuleMutation,\n useUpsertWorkflowTemplateMutation,\n useWorkflowTemplatesQuery,\n} 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 SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function WorkflowsPage() {\n const { navigate } = useEventfullyManaged();\n const templatesQuery = useWorkflowTemplatesQuery({ limit: 100, offset: 0 });\n const rulesQuery = useAutomationRulesQuery({ limit: 100, offset: 0 });\n const [upsertTemplate, { loading: creatingTemplate }] = useUpsertWorkflowTemplateMutation();\n const [upsertRule, { loading: creatingRule }] = useUpsertAutomationRuleMutation();\n const [templateName, setTemplateName] = useState('Post-event follow-up');\n\n const templates = useMemo(\n () => (templatesQuery.data?.workflowTemplates.items ?? []) as SimpleRow[],\n [templatesQuery.data]\n );\n const rules = useMemo(() => (rulesQuery.data?.automationRules.items ?? []) as SimpleRow[], [rulesQuery.data]);\n\n const onCreateTemplate = async () => {\n if (!templateName.trim()) return;\n try {\n const response = await upsertTemplate({\n variables: {\n input: {\n name: templateName,\n title: templateName,\n status: 'active',\n metadata: {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.upsertWorkflowTemplate?.id, 'Could not save workflow template')) {\n return;\n }\n notify.success('Workflow template saved');\n } catch (error) {\n notify.error('Could not save workflow template', describeError(error));\n }\n };\n\n const onCreateRule = async () => {\n if (!templateName.trim()) return;\n try {\n const response = await upsertRule({\n variables: {\n input: {\n name: `${templateName} Rule`,\n title: `${templateName} Rule`,\n status: 'active',\n metadata: {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.upsertAutomationRule?.id, 'Could not save automation rule')) {\n return;\n }\n notify.success('Automation rule saved');\n } catch (error) {\n notify.error('Could not save automation rule', describeError(error));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Workflows automate the repetitive parts of running an event. A template is a reusable recipe (e.g. a post-event\n follow-up sequence); an automation rule is a trigger that fires it (e.g. “when an attendee checks in, send\n a welcome message”). Build them here so the platform handles routine work for you while execution is\n delegated to the workflow services.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Workflows</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Manage event workflow templates and automation rules. Execution is delegated to workflow services.\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row sm:items-center\">\n <Input\n value={templateName}\n onChange={(e) => setTemplateName(e.target.value)}\n aria-label=\"Workflow template name\"\n className=\"flex-1\"\n />\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" onClick={onCreateTemplate} disabled={creatingTemplate}>\n <Play className=\"h-4 w-4\" />\n {creatingTemplate ? 'Saving...' : 'Add Template'}\n </Button>\n <CTAOverflowMenu\n actions={[\n {\n label: creatingRule ? 'Saving rule...' : 'Add Rule',\n onSelect: () => {\n void onCreateRule();\n },\n disabled: creatingRule,\n },\n ]}\n />\n </div>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={templatesQuery.loading ? 'Loading templates...' : `Templates (${templates.length})`}\n emptyLabel=\"No workflow templates configured.\"\n rows={templates.map((row) => ({\n id: row.id,\n title: row.name ?? row.title ?? `Template ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n\n <EntityListSection\n heading={rulesQuery.loading ? 'Loading automation rules...' : `Automation Rules (${rules.length})`}\n emptyLabel=\"No automation rules configured.\"\n rows={rules.map((row) => ({\n id: row.id,\n title: row.name ?? row.title ?? `Rule ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-workflows\"\n title=\"Put your automations to work\"\n steps={[\n {\n id: 'wire-communication',\n label: 'Connect a communication campaign',\n description: 'Have a rule fire announcements or reminders automatically.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n {\n id: 'automate-checkin',\n label: 'Automate around check-in',\n description: 'Trigger welcome flows when attendees register or arrive.',\n icon: <Ticket className=\"h-4 w-4\" />,\n onClick: () => navigate('/registration'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|