@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/eventfullymanaged/EventfullyManagedRoutes.js +154 -66
- package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
- package/dist/eventfullymanaged/api/eventApi.js +546 -67
- package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
- package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
- package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
- package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
- package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
- package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
- package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
- package/dist/eventfullymanaged/components/Pagination.js +84 -0
- package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
- package/dist/eventfullymanaged/components/SafeLink.js +32 -0
- package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
- package/dist/eventfullymanaged/components/index.js +7 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
- package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
- package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
- package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
- package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
- package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
- package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
- package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
- package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
- package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
- package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
- package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
- package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +289 -77
- package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
- package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
- package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
- package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
- package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
- package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
- package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
- package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +414 -0
- package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
- package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
- package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
- package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
- package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
- package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
- package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/EventDetailPage.tsx"],"sourcesContent":["import {\n ArrowLeft,\n CalendarClock,\n Edit,\n MapPin,\n Plus,\n Ticket as TicketIcon,\n Users,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n IllustratedEmptyState,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport {\n useDeleteTicketTypeMutation,\n useEventQuery,\n useEventSessionsQuery,\n useSpeakersQuery,\n useTicketTypesQuery,\n type TicketTypeGql,\n} from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { Pagination, usePagination } from '../../components/Pagination';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { notify } from '../../lib/toast';\nimport { formatDateTime } from './eventFormUtils';\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\n// ---------------------------------------------------------------------------\n\ntype SessionRow = {\n id: string;\n title: string;\n sessionType: string;\n track?: string | null;\n startsAt: string;\n endsAt: string;\n status: string;\n};\n\nfunction SessionsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading } = useEventSessionsQuery({ eventId, limit: pagination.limit, offset: pagination.offset });\n\n const total = data?.eventSessions?.total ?? 0;\n const rows = (data?.eventSessions?.items ?? []) as unknown as SessionRow[];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Agenda & Sessions</h2>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/sessions/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Session\n </Button>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading sessions…</p>\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No sessions yet.\"\n description=\"Build the agenda by adding your first session.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {rows.map((session) => (\n <li\n key={session.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{session.title}</p>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">\n {[\n session.track,\n session.startsAt ? formatDateTime(session.startsAt) : undefined,\n ]\n .filter(Boolean)\n .join(' • ')}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant={statusVariant(session.status)} className=\"uppercase\">\n {session.status}\n </Badge>\n <ActionMenu\n ariaLabel={`Session actions for ${session.title}`}\n onEdit={() => navigate(`/events/${eventId}/sessions/${session.id}/edit`)}\n />\n </div>\n </div>\n </li>\n ))}\n </ul>\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=\"sessions\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\ntype SpeakerRow = { id: string; fullName: string; title?: string | null; organization?: string | null };\n\nfunction SpeakersTab() {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading } = useSpeakersQuery({ limit: pagination.limit, offset: pagination.offset });\n\n const total = data?.speakers?.total ?? 0;\n const rows = (data?.speakers?.items ?? []) as unknown as SpeakerRow[];\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Speakers</h2>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate('/speakers')}>\n Manage speakers\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate('/speakers/create')}>\n <Plus className=\"h-4 w-4\" />\n New Speaker\n </Button>\n </div>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading speakers…</p>\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No speakers yet.\"\n description=\"Add speakers so you can assign them to sessions.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {rows.map((speaker) => (\n <li\n key={speaker.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{speaker.fullName}</p>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">\n {[speaker.title, speaker.organization].filter(Boolean).join(' • ') || 'Speaker'}\n </p>\n </div>\n <ActionMenu\n ariaLabel={`Speaker actions for ${speaker.fullName}`}\n onEdit={() => navigate(`/speakers/${speaker.id}/edit`)}\n />\n </div>\n </li>\n ))}\n </ul>\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=\"speakers\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nfunction TicketsTab({ eventId }: { eventId: string }) {\n const { navigate } = useEventfullyManaged();\n const pagination = usePagination();\n const { data, loading, refetch } = useTicketTypesQuery({\n eventId,\n limit: pagination.limit,\n offset: pagination.offset,\n });\n const [deleteTicketType] = useDeleteTicketTypeMutation();\n\n const total = data?.ticketTypes?.total ?? 0;\n const rows = (data?.ticketTypes?.items ?? []) as TicketTypeGql[];\n\n const onDelete = async (ticket: TicketTypeGql) => {\n const response = await deleteTicketType({ variables: { id: ticket.id } });\n if (response.error) {\n notify.error('Could not delete ticket type', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteTicketType) {\n notify.error('Could not delete ticket type', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n notify.success('Ticket type deleted');\n await refetch();\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Ticket Types</h2>\n <Button type=\"button\" size=\"sm\" onClick={() => navigate(`/events/${eventId}/tickets/create`)}>\n <Plus className=\"h-4 w-4\" />\n New Ticket Type\n </Button>\n </div>\n\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading ticket types…</p>\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No ticket types yet.\"\n description=\"Add a ticket type so attendees can register.\"\n className=\"py-8\"\n />\n ) : (\n <ul className=\"space-y-2.5\">\n {rows.map((ticket) => (\n <li\n key={ticket.id}\n className=\"rounded-card border border-border-seam bg-bg-surface p-3 transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1\"\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{ticket.name}</p>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">\n {ticket.price} {ticket.currency} • Sold {ticket.soldCount}\n {ticket.capacity != null ? ` / ${ticket.capacity}` : ''}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Badge variant={ticket.isActive ? 'success' : 'warning'} className=\"uppercase\">\n {ticket.isActive ? 'Active' : 'Inactive'}\n </Badge>\n <ActionMenu\n ariaLabel={`Ticket actions for ${ticket.name}`}\n entityName={ticket.name}\n deleteLabel=\"Delete ticket type\"\n onEdit={() => navigate(`/events/${eventId}/tickets/${ticket.id}/edit`)}\n onDelete={() => onDelete(ticket)}\n />\n </div>\n </div>\n </li>\n ))}\n </ul>\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=\"ticket types\"\n loading={loading}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n\nexport default function EventDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useEventQuery(id);\n const [tab, setTab] = useState('overview');\n\n const event = data?.event ?? null;\n const venueId = useMemo(() => {\n const metadata = (event?.metadata ?? {}) as Record<string, unknown>;\n return typeof metadata.venueId === 'string' ? (metadata.venueId as string) : '';\n }, [event]);\n\n if (loading) {\n return <div className=\"p-6 text-sm text-text-secondary\">Loading event…</div>;\n }\n\n if (!event) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Event not found.\"\n description=\"This event may have been removed or is outside your current scope.\"\n />\n </GlassCard>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/events')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Events\n </Button>\n <div>\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-2xl font-bold text-text-primary\">{event.name}</h1>\n <Badge variant={statusVariant(event.status)} className=\"uppercase\">\n {event.status}\n </Badge>\n </div>\n <p className=\"mt-1 flex items-center gap-2 text-sm text-text-secondary\">\n <CalendarClock className=\"h-4 w-4\" />\n {formatDateTime(event.startAt)} — {formatDateTime(event.endAt)}\n </p>\n </div>\n </div>\n <Button type=\"button\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Event\n </Button>\n </div>\n\n <Tabs value={tab} onValueChange={setTab}>\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"sessions\">Sessions</TabsTrigger>\n <TabsTrigger value=\"speakers\">Speakers</TabsTrigger>\n <TabsTrigger value=\"tickets\">Tickets</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"mt-4\">\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <TicketIcon className=\"h-4 w-4 text-action-primary-bg\" />\n Type\n </div>\n <p className=\"text-sm uppercase text-text-secondary\">{event.type}</p>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n Capacity\n </div>\n <p className=\"text-sm tabular-nums text-text-secondary\">{event.capacity ?? 0} attendees</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n Timezone\n </div>\n <p className=\"text-sm text-text-secondary\">{event.timezone}</p>\n </GlassCard>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"mt-4 border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">About</h2>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {event.description?.trim() ? event.description : 'No description provided.'}\n </p>\n <dl className=\"mt-4 grid grid-cols-1 gap-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-text-muted\">Visibility</dt>\n <dd className=\"capitalize text-text-primary\">{event.visibility}</dd>\n </div>\n <div>\n <dt className=\"text-text-muted\">Venue</dt>\n <dd className=\"text-text-primary\">\n {venueId ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"h-auto p-0\"\n onClick={() => navigate(`/venues/${venueId}`)}\n >\n View venue\n </Button>\n ) : (\n 'No venue assigned'\n )}\n </dd>\n </div>\n </dl>\n <div className=\"mt-4\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/events/${id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit event details\n </Button>\n </div>\n </GlassCard>\n </TabsContent>\n\n <TabsContent value=\"sessions\" className=\"mt-4\">\n <SessionsTab eventId={id} />\n </TabsContent>\n\n <TabsContent value=\"speakers\" className=\"mt-4\">\n <SpeakersTab />\n </TabsContent>\n\n <TabsContent value=\"tickets\" className=\"mt-4\">\n <TicketsTab eventId={id} />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
|
|
2
|
+
import { notify as t } from "../../lib/toast.js";
|
|
3
|
+
import { useCreateEventMutation as n, useEventQuery as r, useUpdateEventMutation as i, useVenuesQuery as a } from "../../api/eventApi.js";
|
|
4
|
+
import { EVENT_STATUS_OPTIONS as o, EVENT_TYPE_OPTIONS as s, EVENT_VISIBILITY_OPTIONS as c, inputValueToIso as l, isoToInputValue as u } from "./eventFormUtils.js";
|
|
5
|
+
import { EntityFormShell as d } from "../../components/EntityFormShell.js";
|
|
6
|
+
import { describeError as f, mutationSucceeded as p } from "../../lib/mutationResult.js";
|
|
7
|
+
import { useEffect as m, useMemo as h, useState as g } from "react";
|
|
8
|
+
import { useParams as _ } from "react-router-dom";
|
|
9
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
10
|
+
import { Input as b, Select as x, SelectContent as S, SelectItem as C, SelectTrigger as w, SelectValue as T, Textarea as E } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
//#region src/eventfullymanaged/pages/events/EventFormPage.tsx
|
|
12
|
+
var D = "venueId";
|
|
13
|
+
function O() {
|
|
14
|
+
let e = /* @__PURE__ */ new Date(), t = new Date(e.getTime() + 7200 * 1e3);
|
|
15
|
+
return {
|
|
16
|
+
name: "",
|
|
17
|
+
description: "",
|
|
18
|
+
type: "IN_PERSON",
|
|
19
|
+
status: "DRAFT",
|
|
20
|
+
visibility: "private",
|
|
21
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Kolkata",
|
|
22
|
+
startAt: u(e.toISOString()),
|
|
23
|
+
endAt: u(t.toISOString()),
|
|
24
|
+
venueId: "",
|
|
25
|
+
capacity: "100"
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function k() {
|
|
29
|
+
let { id: k = "" } = _(), A = h(() => !!k, [k]), { navigate: j } = e(), { data: M } = r(k), { data: N } = a({
|
|
30
|
+
limit: 100,
|
|
31
|
+
offset: 0
|
|
32
|
+
}), [P, { loading: F }] = n(), [I, { loading: L }] = i(), [R, z] = g(O);
|
|
33
|
+
m(() => {
|
|
34
|
+
let e = M?.event;
|
|
35
|
+
if (!A || !e) return;
|
|
36
|
+
let t = e.metadata ?? {};
|
|
37
|
+
z({
|
|
38
|
+
name: e.name ?? "",
|
|
39
|
+
description: e.description ?? "",
|
|
40
|
+
type: e.type ?? "IN_PERSON",
|
|
41
|
+
status: e.status ?? "DRAFT",
|
|
42
|
+
visibility: e.visibility ?? "private",
|
|
43
|
+
timezone: e.timezone ?? "Asia/Kolkata",
|
|
44
|
+
startAt: u(e.startAt),
|
|
45
|
+
endAt: u(e.endAt),
|
|
46
|
+
venueId: typeof t[D] == "string" ? t[D] : "",
|
|
47
|
+
capacity: e.capacity == null ? "" : String(e.capacity)
|
|
48
|
+
});
|
|
49
|
+
}, [M, A]);
|
|
50
|
+
let B = N?.venues?.items ?? [], V = (e, t) => {
|
|
51
|
+
z((n) => ({
|
|
52
|
+
...n,
|
|
53
|
+
[e]: t
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
return /* @__PURE__ */ y(d, {
|
|
57
|
+
title: A ? "Edit Event" : "Create Event",
|
|
58
|
+
description: "Define the event people register for and attend.",
|
|
59
|
+
purpose: "An event is the thing you sell tickets to and run on the day. Set its name, when it happens and where, then publish it so ticket types and registrations can open. Capacity caps how many attendees you can admit across all ticket types.",
|
|
60
|
+
backLabel: A ? "Back to Event" : "Back to Events",
|
|
61
|
+
onBack: () => j(A ? `/events/${k}` : "/events"),
|
|
62
|
+
onSubmit: async (e) => {
|
|
63
|
+
if (e.preventDefault(), !R.name.trim()) {
|
|
64
|
+
t.error("Name required", "Give the event a name before saving.");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let n = l(R.startAt), r = l(R.endAt);
|
|
68
|
+
if (!n || !r) {
|
|
69
|
+
t.error("Dates required", "Set both a start and an end time.");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (new Date(r).getTime() < new Date(n).getTime()) {
|
|
73
|
+
t.error("Invalid dates", "The end time cannot be before the start time.");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let i = M?.event?.metadata ?? {}, a = {
|
|
77
|
+
name: R.name.trim(),
|
|
78
|
+
description: R.description,
|
|
79
|
+
type: R.type,
|
|
80
|
+
status: R.status,
|
|
81
|
+
visibility: R.visibility,
|
|
82
|
+
timezone: R.timezone,
|
|
83
|
+
startAt: n,
|
|
84
|
+
endAt: r,
|
|
85
|
+
capacity: R.capacity ? Number(R.capacity) : null,
|
|
86
|
+
metadata: {
|
|
87
|
+
...i,
|
|
88
|
+
[D]: R.venueId || null
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
if (A) {
|
|
93
|
+
let e = await I({ variables: {
|
|
94
|
+
id: k,
|
|
95
|
+
input: a
|
|
96
|
+
} });
|
|
97
|
+
if (!p(e, e.data?.updateEvent?.id, "Could not update event")) return;
|
|
98
|
+
t.success("Event updated"), j(`/events/${k}`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
let e = await P({ variables: { input: a } }), n = e.data?.createEvent?.id;
|
|
102
|
+
if (!p(e, n, "Could not create event")) return;
|
|
103
|
+
t.success("Event created"), j(`/events/${n}`);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
t.error("Could not save event", f(e));
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
submitLabel: "Save Event",
|
|
109
|
+
saving: F || L,
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ y("div", {
|
|
112
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
113
|
+
children: [/* @__PURE__ */ y("label", {
|
|
114
|
+
className: "space-y-1 text-sm",
|
|
115
|
+
children: [/* @__PURE__ */ v("span", {
|
|
116
|
+
className: "font-medium text-text-primary",
|
|
117
|
+
children: "Name"
|
|
118
|
+
}), /* @__PURE__ */ v(b, {
|
|
119
|
+
value: R.name,
|
|
120
|
+
onChange: (e) => V("name", e.target.value),
|
|
121
|
+
required: !0
|
|
122
|
+
})]
|
|
123
|
+
}), /* @__PURE__ */ y("label", {
|
|
124
|
+
className: "space-y-1 text-sm",
|
|
125
|
+
children: [/* @__PURE__ */ v("span", {
|
|
126
|
+
className: "font-medium text-text-primary",
|
|
127
|
+
children: "Capacity"
|
|
128
|
+
}), /* @__PURE__ */ v(b, {
|
|
129
|
+
type: "number",
|
|
130
|
+
min: "0",
|
|
131
|
+
value: R.capacity,
|
|
132
|
+
onChange: (e) => V("capacity", e.target.value)
|
|
133
|
+
})]
|
|
134
|
+
})]
|
|
135
|
+
}),
|
|
136
|
+
/* @__PURE__ */ y("label", {
|
|
137
|
+
className: "block space-y-1 text-sm",
|
|
138
|
+
children: [/* @__PURE__ */ v("span", {
|
|
139
|
+
className: "font-medium text-text-primary",
|
|
140
|
+
children: "Description"
|
|
141
|
+
}), /* @__PURE__ */ v(E, {
|
|
142
|
+
value: R.description,
|
|
143
|
+
onChange: (e) => V("description", e.target.value),
|
|
144
|
+
rows: 3
|
|
145
|
+
})]
|
|
146
|
+
}),
|
|
147
|
+
/* @__PURE__ */ y("div", {
|
|
148
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
149
|
+
children: [/* @__PURE__ */ y("label", {
|
|
150
|
+
className: "space-y-1 text-sm",
|
|
151
|
+
children: [/* @__PURE__ */ v("span", {
|
|
152
|
+
className: "font-medium text-text-primary",
|
|
153
|
+
children: "Start"
|
|
154
|
+
}), /* @__PURE__ */ v(b, {
|
|
155
|
+
type: "datetime-local",
|
|
156
|
+
value: R.startAt,
|
|
157
|
+
onChange: (e) => V("startAt", e.target.value),
|
|
158
|
+
required: !0
|
|
159
|
+
})]
|
|
160
|
+
}), /* @__PURE__ */ y("label", {
|
|
161
|
+
className: "space-y-1 text-sm",
|
|
162
|
+
children: [/* @__PURE__ */ v("span", {
|
|
163
|
+
className: "font-medium text-text-primary",
|
|
164
|
+
children: "End"
|
|
165
|
+
}), /* @__PURE__ */ v(b, {
|
|
166
|
+
type: "datetime-local",
|
|
167
|
+
value: R.endAt,
|
|
168
|
+
onChange: (e) => V("endAt", e.target.value),
|
|
169
|
+
required: !0
|
|
170
|
+
})]
|
|
171
|
+
})]
|
|
172
|
+
}),
|
|
173
|
+
/* @__PURE__ */ y("div", {
|
|
174
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
175
|
+
children: [/* @__PURE__ */ y("label", {
|
|
176
|
+
className: "space-y-1 text-sm",
|
|
177
|
+
children: [/* @__PURE__ */ v("span", {
|
|
178
|
+
className: "font-medium text-text-primary",
|
|
179
|
+
children: "Venue"
|
|
180
|
+
}), /* @__PURE__ */ y(x, {
|
|
181
|
+
value: R.venueId || "none",
|
|
182
|
+
onValueChange: (e) => V("venueId", e === "none" ? "" : e),
|
|
183
|
+
children: [/* @__PURE__ */ v(w, {
|
|
184
|
+
"aria-label": "Venue",
|
|
185
|
+
children: /* @__PURE__ */ v(T, { placeholder: "Select a venue" })
|
|
186
|
+
}), /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(C, {
|
|
187
|
+
value: "none",
|
|
188
|
+
children: "No venue"
|
|
189
|
+
}), B.map((e) => /* @__PURE__ */ v(C, {
|
|
190
|
+
value: e.id,
|
|
191
|
+
children: e.name
|
|
192
|
+
}, e.id))] })]
|
|
193
|
+
})]
|
|
194
|
+
}), /* @__PURE__ */ y("label", {
|
|
195
|
+
className: "space-y-1 text-sm",
|
|
196
|
+
children: [/* @__PURE__ */ v("span", {
|
|
197
|
+
className: "font-medium text-text-primary",
|
|
198
|
+
children: "Timezone"
|
|
199
|
+
}), /* @__PURE__ */ v(b, {
|
|
200
|
+
value: R.timezone,
|
|
201
|
+
onChange: (e) => V("timezone", e.target.value)
|
|
202
|
+
})]
|
|
203
|
+
})]
|
|
204
|
+
}),
|
|
205
|
+
/* @__PURE__ */ y("div", {
|
|
206
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-3",
|
|
207
|
+
children: [
|
|
208
|
+
/* @__PURE__ */ y("label", {
|
|
209
|
+
className: "space-y-1 text-sm",
|
|
210
|
+
children: [/* @__PURE__ */ v("span", {
|
|
211
|
+
className: "font-medium text-text-primary",
|
|
212
|
+
children: "Type"
|
|
213
|
+
}), /* @__PURE__ */ y(x, {
|
|
214
|
+
value: R.type,
|
|
215
|
+
onValueChange: (e) => V("type", e),
|
|
216
|
+
children: [/* @__PURE__ */ v(w, {
|
|
217
|
+
"aria-label": "Type",
|
|
218
|
+
children: /* @__PURE__ */ v(T, {})
|
|
219
|
+
}), /* @__PURE__ */ v(S, { children: s.map((e) => /* @__PURE__ */ v(C, {
|
|
220
|
+
value: e.value,
|
|
221
|
+
children: e.label
|
|
222
|
+
}, e.value)) })]
|
|
223
|
+
})]
|
|
224
|
+
}),
|
|
225
|
+
/* @__PURE__ */ y("label", {
|
|
226
|
+
className: "space-y-1 text-sm",
|
|
227
|
+
children: [/* @__PURE__ */ v("span", {
|
|
228
|
+
className: "font-medium text-text-primary",
|
|
229
|
+
children: "Status"
|
|
230
|
+
}), /* @__PURE__ */ y(x, {
|
|
231
|
+
value: R.status,
|
|
232
|
+
onValueChange: (e) => V("status", e),
|
|
233
|
+
children: [/* @__PURE__ */ v(w, {
|
|
234
|
+
"aria-label": "Status",
|
|
235
|
+
children: /* @__PURE__ */ v(T, {})
|
|
236
|
+
}), /* @__PURE__ */ v(S, { children: o.map((e) => /* @__PURE__ */ v(C, {
|
|
237
|
+
value: e.value,
|
|
238
|
+
children: e.label
|
|
239
|
+
}, e.value)) })]
|
|
240
|
+
})]
|
|
241
|
+
}),
|
|
242
|
+
/* @__PURE__ */ y("label", {
|
|
243
|
+
className: "space-y-1 text-sm",
|
|
244
|
+
children: [/* @__PURE__ */ v("span", {
|
|
245
|
+
className: "font-medium text-text-primary",
|
|
246
|
+
children: "Visibility"
|
|
247
|
+
}), /* @__PURE__ */ y(x, {
|
|
248
|
+
value: R.visibility,
|
|
249
|
+
onValueChange: (e) => V("visibility", e),
|
|
250
|
+
children: [/* @__PURE__ */ v(w, {
|
|
251
|
+
"aria-label": "Visibility",
|
|
252
|
+
children: /* @__PURE__ */ v(T, {})
|
|
253
|
+
}), /* @__PURE__ */ v(S, { children: c.map((e) => /* @__PURE__ */ v(C, {
|
|
254
|
+
value: e.value,
|
|
255
|
+
children: e.label
|
|
256
|
+
}, e.value)) })]
|
|
257
|
+
})]
|
|
258
|
+
})
|
|
259
|
+
]
|
|
260
|
+
})
|
|
261
|
+
]
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//#endregion
|
|
265
|
+
export { k as default };
|
|
266
|
+
|
|
267
|
+
//# sourceMappingURL=EventFormPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/events/EventFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateEventMutation, useEventQuery, useUpdateEventMutation, useVenuesQuery } from '../../api/eventApi';\nimport { EntityFormShell } from '../../components/EntityFormShell';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\nimport {\n EVENT_STATUS_OPTIONS,\n EVENT_TYPE_OPTIONS,\n EVENT_VISIBILITY_OPTIONS,\n inputValueToIso,\n isoToInputValue,\n} from './eventFormUtils';\n\nconst VENUE_METADATA_KEY = 'venueId';\n\ntype EventFormState = {\n name: string;\n description: string;\n type: string;\n status: string;\n visibility: string;\n timezone: string;\n startAt: string;\n endAt: string;\n venueId: string;\n capacity: string;\n};\n\nfunction defaultState(): EventFormState {\n const now = new Date();\n const later = new Date(now.getTime() + 2 * 60 * 60 * 1000);\n return {\n name: '',\n description: '',\n type: 'IN_PERSON',\n status: 'DRAFT',\n visibility: 'private',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'Asia/Kolkata',\n startAt: isoToInputValue(now.toISOString()),\n endAt: isoToInputValue(later.toISOString()),\n venueId: '',\n capacity: '100',\n };\n}\n\nexport default function EventFormPage() {\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useEventfullyManaged();\n\n const { data } = useEventQuery(id);\n const { data: venuesData } = useVenuesQuery({ limit: 100, offset: 0 });\n const [createEvent, { loading: creating }] = useCreateEventMutation();\n const [updateEvent, { loading: updating }] = useUpdateEventMutation();\n const [form, setForm] = useState<EventFormState>(defaultState);\n\n useEffect(() => {\n const event = data?.event;\n if (!isEdit || !event) {\n return;\n }\n const metadata = (event.metadata ?? {}) as Record<string, unknown>;\n setForm({\n name: event.name ?? '',\n description: event.description ?? '',\n type: event.type ?? 'IN_PERSON',\n status: event.status ?? 'DRAFT',\n visibility: event.visibility ?? 'private',\n timezone: event.timezone ?? 'Asia/Kolkata',\n startAt: isoToInputValue(event.startAt),\n endAt: isoToInputValue(event.endAt),\n venueId: typeof metadata[VENUE_METADATA_KEY] === 'string' ? (metadata[VENUE_METADATA_KEY] as string) : '',\n capacity: event.capacity != null ? String(event.capacity) : '',\n });\n }, [data, isEdit]);\n\n const venues = venuesData?.venues?.items ?? [];\n\n const onChange = (field: keyof EventFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.name.trim()) {\n notify.error('Name required', 'Give the event a name before saving.');\n return;\n }\n const startIso = inputValueToIso(form.startAt);\n const endIso = inputValueToIso(form.endAt);\n if (!startIso || !endIso) {\n notify.error('Dates required', 'Set both a start and an end time.');\n return;\n }\n if (new Date(endIso).getTime() < new Date(startIso).getTime()) {\n notify.error('Invalid dates', 'The end time cannot be before the start time.');\n return;\n }\n\n const existingMetadata = (data?.event?.metadata ?? {}) as Record<string, unknown>;\n const input = {\n name: form.name.trim(),\n description: form.description,\n type: form.type,\n status: form.status,\n visibility: form.visibility,\n timezone: form.timezone,\n startAt: startIso,\n endAt: endIso,\n capacity: form.capacity ? Number(form.capacity) : null,\n metadata: { ...existingMetadata, [VENUE_METADATA_KEY]: form.venueId || null },\n };\n\n try {\n if (isEdit) {\n const response = await updateEvent({ variables: { id, input } });\n if (!mutationSucceeded(response, response.data?.updateEvent?.id, 'Could not update event')) {\n return;\n }\n notify.success('Event updated');\n navigate(`/events/${id}`);\n return;\n }\n const response = await createEvent({ variables: { input } });\n const createdId = response.data?.createEvent?.id;\n if (!mutationSucceeded(response, createdId, 'Could not create event')) {\n return;\n }\n notify.success('Event created');\n navigate(`/events/${createdId}`);\n } catch (error) {\n notify.error('Could not save event', describeError(error));\n }\n };\n\n const saving = creating || updating;\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit Event' : 'Create Event'}\n description=\"Define the event people register for and attend.\"\n purpose=\"An event is the thing you sell tickets to and run on the day. Set its name, when it happens and where, then publish it so ticket types and registrations can open. Capacity caps how many attendees you can admit across all ticket types.\"\n backLabel={isEdit ? 'Back to Event' : 'Back to Events'}\n onBack={() => navigate(isEdit ? `/events/${id}` : '/events')}\n onSubmit={onSubmit}\n submitLabel=\"Save Event\"\n saving={saving}\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Name</span>\n <Input value={form.name} onChange={(e) => onChange('name', e.target.value)} required />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Capacity</span>\n <Input\n type=\"number\"\n min=\"0\"\n value={form.capacity}\n onChange={(e) => onChange('capacity', e.target.value)}\n />\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Description</span>\n <Textarea value={form.description} onChange={(e) => onChange('description', e.target.value)} rows={3} />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Start</span>\n <Input\n type=\"datetime-local\"\n value={form.startAt}\n onChange={(e) => onChange('startAt', e.target.value)}\n required\n />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">End</span>\n <Input\n type=\"datetime-local\"\n value={form.endAt}\n onChange={(e) => onChange('endAt', e.target.value)}\n required\n />\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Venue</span>\n <Select value={form.venueId || 'none'} onValueChange={(value) => onChange('venueId', value === 'none' ? '' : value)}>\n <SelectTrigger aria-label=\"Venue\">\n <SelectValue placeholder=\"Select a venue\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">No venue</SelectItem>\n {venues.map((venue: { id: string; name: string }) => (\n <SelectItem key={venue.id} value={venue.id}>\n {venue.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Timezone</span>\n <Input value={form.timezone} onChange={(e) => onChange('timezone', e.target.value)} />\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Type</span>\n <Select value={form.type} onValueChange={(value) => onChange('type', value)}>\n <SelectTrigger aria-label=\"Type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EVENT_TYPE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Status</span>\n <Select value={form.status} onValueChange={(value) => onChange('status', value)}>\n <SelectTrigger aria-label=\"Status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EVENT_STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Visibility</span>\n <Select value={form.visibility} onValueChange={(value) => onChange('visibility', value)}>\n <SelectTrigger aria-label=\"Visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EVENT_VISIBILITY_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}
|