@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, LayoutGrid, Map as MapIcon, Plus, SquareStack } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport {\n useCreateFloorPlanMutation,\n useDeleteFloorPlanMutation,\n useUpdateFloorPlanMutation,\n useVenueQuery,\n} from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { ImageUploadField } from '../../components/ImageUploadField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype Json = Record<string, unknown> | null | undefined;\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Json;\n interactiveAreas?: Json;\n};\n\ntype Zone = {\n key: string;\n label: string;\n type?: string;\n capacity?: number;\n rect?: { x: number; y: number; w: number; h: number };\n};\n\nconst FLOOR_PLAN_FOLDER = '/EventfullyManaged/FloorPlans';\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '' && Number.isFinite(Number(value))) {\n return Number(value);\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\n// interactiveAreas is free-form JSON persisted verbatim by the backend. Parse it\n// defensively so the viewer renders whatever real shape a plan happens to hold —\n// an array of areas, a `{ zones: [...] }` / `{ areas: [...] }` wrapper, or a\n// keyed object — without ever fabricating booth data that isn't there.\nfunction extractZones(interactiveAreas: Json): Zone[] {\n if (!interactiveAreas) {\n return [];\n }\n let raw: unknown = interactiveAreas;\n if (!Array.isArray(raw) && typeof raw === 'object') {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.zones)) {\n raw = obj.zones;\n } else if (Array.isArray(obj.areas)) {\n raw = obj.areas;\n } else if (Array.isArray(obj.booths)) {\n raw = obj.booths;\n }\n }\n\n const entries: Array<[string, unknown]> = Array.isArray(raw)\n ? raw.map((item, index) => [String(index), item])\n : typeof raw === 'object' && raw !== null\n ? Object.entries(raw as Record<string, unknown>)\n : [];\n\n const zones: Zone[] = [];\n for (const [key, value] of entries) {\n if (value === null || typeof value !== 'object') {\n continue;\n }\n const item = value as Record<string, unknown>;\n const label = asString(item.label) ?? asString(item.name) ?? asString(item.title) ?? asString(item.id) ?? key;\n const x = asNumber(item.x);\n const y = asNumber(item.y);\n const w = asNumber(item.w) ?? asNumber(item.width);\n const h = asNumber(item.h) ?? asNumber(item.height);\n let rect: Zone['rect'];\n if (x !== undefined && y !== undefined && w !== undefined && h !== undefined) {\n // Normalise fractional (0–1) or percentage (0–100) coordinates to percent.\n const scale = x <= 1 && y <= 1 && w <= 1 && h <= 1 ? 100 : 1;\n if (scale === 100 || (x <= 100 && y <= 100 && w <= 100 && h <= 100)) {\n rect = { x: x * scale, y: y * scale, w: w * scale, h: h * scale };\n }\n }\n zones.push({\n key: `${key}-${label}`,\n label,\n type: asString(item.type) ?? asString(item.kind),\n capacity: asNumber(item.capacity) ?? asNumber(item.seats),\n rect,\n });\n }\n return zones;\n}\n\ntype PlanMetric = { label: string; value: string };\n\nfunction buildMetrics(plan: FloorPlan, zones: Zone[]): PlanMetric[] {\n const metrics: PlanMetric[] = [];\n if (zones.length > 0) {\n metrics.push({ label: 'Zones', value: zones.length.toLocaleString() });\n }\n\n const boothCount = zones.filter((zone) => (zone.type ?? '').toLowerCase().includes('booth')).length;\n if (boothCount > 0) {\n metrics.push({ label: 'Booths', value: boothCount.toLocaleString() });\n }\n\n const zoneCapacity = zones.reduce((sum, zone) => sum + (zone.capacity ?? 0), 0);\n const dims = (plan.dimensions ?? {}) as Record<string, unknown>;\n const declaredCapacity = asNumber(dims.capacity) ?? asNumber(dims.totalCapacity);\n const capacity = zoneCapacity > 0 ? zoneCapacity : declaredCapacity;\n if (capacity !== undefined && capacity > 0) {\n metrics.push({ label: 'Total capacity', value: capacity.toLocaleString() });\n }\n\n const width = asNumber(dims.width);\n const height = asNumber(dims.height);\n if (width !== undefined && height !== undefined) {\n const unit = asString(dims.unit) ?? 'm';\n metrics.push({ label: 'Dimensions', value: `${width} × ${height} ${unit}` });\n }\n\n return metrics;\n}\n\nfunction FloorPlanViewer({\n plan,\n zones,\n onAttachImage,\n}: {\n plan: FloorPlan;\n zones: Zone[];\n onAttachImage: (plan: FloorPlan, url: string) => void;\n}) {\n const overlayZones = zones.filter((zone) => zone.rect);\n return (\n <GlassCard treatment=\"plain\" className=\"overflow-hidden border-border-seam p-0\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam px-5 py-3\">\n <div className=\"flex min-w-0 items-center gap-2 text-text-primary\">\n <MapIcon className=\"h-4 w-4 shrink-0 text-action-primary-bg\" />\n <h2 className=\"truncate text-base font-semibold\">{plan.name}</h2>\n </div>\n {zones.length > 0 ? (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {zones.length} {zones.length === 1 ? 'zone' : 'zones'}\n </Badge>\n ) : null}\n </div>\n\n {plan.imageUrl ? (\n <div className=\"relative bg-bg-sunken\">\n <img\n src={plan.imageUrl}\n alt={`${plan.name} floor plan`}\n className=\"mx-auto max-h-[32rem] w-full object-contain\"\n />\n {overlayZones.map((zone) => (\n <div\n key={zone.key}\n className=\"absolute flex items-center justify-center rounded-md border border-accent-primary/70 bg-action-primary-bg/15 text-[10px] font-medium text-accent-primary\"\n style={{\n left: `${zone.rect?.x}%`,\n top: `${zone.rect?.y}%`,\n width: `${zone.rect?.w}%`,\n height: `${zone.rect?.h}%`,\n }}\n title={zone.label}\n >\n <span className=\"truncate px-1\">{zone.label}</span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"p-6\">\n <div className=\"rounded-card border border-dashed border-border-default bg-bg-sunken p-6\">\n <p className=\"mb-3 text-center text-sm text-text-secondary\">\n No image attached yet. Upload the hall map for this plan.\n </p>\n <ImageUploadField\n label=\"Upload floor plan image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={null}\n onUploaded={(url) => onAttachImage(plan, url)}\n hint=\"Stored securely in Files and shown here once attached.\"\n />\n </div>\n </div>\n )}\n\n {zones.length > 0 ? (\n <div className=\"border-t border-border-seam px-5 py-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <LayoutGrid className=\"h-4 w-4 text-text-muted\" />\n Labeled zones\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {zones.map((zone) => (\n <Badge key={zone.key} variant=\"outline\" className=\"gap-1.5\">\n {zone.label}\n {zone.capacity ? <span className=\"text-text-muted\">· {zone.capacity}</span> : null}\n </Badge>\n ))}\n </div>\n </div>\n ) : null}\n </GlassCard>\n );\n}\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [updateFloorPlan] = useUpdateFloorPlanMutation();\n const [deleteFloorPlan] = useDeleteFloorPlanMutation();\n const [name, setName] = useState('');\n const [imageUrl, setImageUrl] = useState('');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [showCreate, setShowCreate] = useState(false);\n\n const venue = data?.venue;\n const floorPlans = useMemo(() => (data?.floorPlans?.items ?? []) as FloorPlan[], [data]);\n\n const selectedPlan = useMemo(\n () => floorPlans.find((plan) => plan.id === selectedId) ?? floorPlans[0] ?? null,\n [floorPlans, selectedId]\n );\n const selectedZones = useMemo(() => extractZones(selectedPlan?.interactiveAreas), [selectedPlan]);\n const metrics = useMemo(() => (selectedPlan ? buildMetrics(selectedPlan, selectedZones) : []), [selectedPlan, selectedZones]);\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n try {\n const response = await createFloorPlan({\n variables: {\n input: { venueId: id, name: name.trim(), imageUrl, dimensions: {}, interactiveAreas: {} },\n },\n });\n if (!mutationSucceeded(response, response.data?.createFloorPlan?.id, 'Could not create floor plan')) {\n return;\n }\n setName('');\n setImageUrl('');\n setShowCreate(false);\n const createdId = response.data?.createFloorPlan?.id;\n if (createdId) {\n setSelectedId(createdId);\n }\n notify.success('Floor plan created');\n await refetch();\n } catch (error) {\n notify.error('Could not create floor plan', describeError(error));\n }\n };\n\n const handleAttachImage = async (plan: FloorPlan, url: string) => {\n try {\n const response = await updateFloorPlan({\n variables: {\n id: plan.id,\n input: {\n venueId: plan.venueId,\n name: plan.name,\n imageUrl: url,\n dimensions: plan.dimensions ?? {},\n interactiveAreas: plan.interactiveAreas ?? {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.updateFloorPlan?.id, 'Could not attach image')) {\n return;\n }\n await refetch();\n } catch (error) {\n notify.error('Could not attach image', describeError(error));\n }\n };\n\n const handleDelete = async (plan: FloorPlan) => {\n const response = await deleteFloorPlan({ variables: { id: plan.id } });\n if (response.error) {\n notify.error('Could not delete floor plan', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteFloorPlan) {\n notify.error('Could not delete floor plan', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n if (selectedId === plan.id) {\n setSelectedId(null);\n }\n notify.success('Floor plan deleted', plan.name);\n await refetch();\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-end sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/venues/${id}`)}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </Button>\n <GradientText as=\"h1\" className=\"text-2xl font-bold\">\n {venue?.name ? `${venue.name} — Floor Plans` : 'Floor Plans'}\n </GradientText>\n <p className=\"text-sm text-text-secondary\">\n Map the hall layout, booth positions, stage and entrances so exhibitors and attendees can navigate on the\n day.\n </p>\n </div>\n <Button type=\"button\" onClick={() => setShowCreate((value) => !value)}>\n <Plus className=\"h-4 w-4\" />\n Add floor plan\n </Button>\n </div>\n\n {loading ? (\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <Skeleton className=\"h-96 rounded-card lg:col-span-2\" />\n <Skeleton className=\"h-96 rounded-card\" />\n </div>\n ) : floorPlans.length === 0 && !showCreate ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans yet.\"\n description=\"Add one to start mapping this venue — upload the hall map and label its zones.\"\n action={\n <Button type=\"button\" onClick={() => setShowCreate(true)}>\n <Plus className=\"h-4 w-4\" />\n Add floor plan\n </Button>\n }\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n {selectedPlan ? (\n <FloorPlanViewer plan={selectedPlan} zones={selectedZones} onAttachImage={handleAttachImage} />\n ) : (\n <GlassCard treatment=\"plain\" className=\"flex h-full items-center justify-center border-border-seam p-10\">\n <p className=\"text-sm text-text-secondary\">Add a floor plan to preview it here.</p>\n </GlassCard>\n )}\n </div>\n\n <div className=\"space-y-6\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Available Floor Plans</h2>\n <ul className=\"mt-3 space-y-2\" role=\"list\">\n {floorPlans.length === 0 ? (\n <li className=\"text-sm text-text-secondary\">None yet — create one below.</li>\n ) : (\n floorPlans.map((plan) => {\n const active = selectedPlan?.id === plan.id;\n return (\n <li key={plan.id}>\n <div\n className={`flex items-center gap-3 rounded-card border p-3 transition-colors ${\n active\n ? 'border-accent-primary bg-action-primary-bg/10'\n : 'border-border-seam hover:border-border-strong'\n }`}\n >\n <button\n type=\"button\"\n onClick={() => setSelectedId(plan.id)}\n className=\"flex min-w-0 flex-1 items-center gap-3 text-left focus-visible:outline-none\"\n aria-pressed={active}\n >\n <span\n className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-md ${\n active ? 'bg-action-primary-bg text-action-primary-text' : 'bg-bg-sunken text-text-secondary'\n }`}\n >\n <SquareStack className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">{plan.name}</span>\n <span className=\"block text-xs text-text-muted\">\n {plan.imageUrl ? 'Map attached' : 'No image yet'}\n </span>\n </span>\n </button>\n <ActionMenu\n ariaLabel={`Floor plan actions for ${plan.name}`}\n entityName={plan.name}\n deleteLabel=\"Delete floor plan\"\n onDelete={() => handleDelete(plan)}\n />\n </div>\n </li>\n );\n })\n )}\n </ul>\n </GlassCard>\n\n {selectedPlan ? (\n <GlassCard treatment=\"metric\" className=\"p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Plan Details</h2>\n {metrics.length > 0 ? (\n <dl className=\"mt-3 space-y-2\">\n {metrics.map((metric) => (\n <div key={metric.label} className=\"flex items-center justify-between text-sm\">\n <dt className=\"text-text-secondary\">{metric.label}</dt>\n <dd className=\"font-semibold tabular-nums text-text-primary\">{metric.value}</dd>\n </div>\n ))}\n </dl>\n ) : (\n <p className=\"mt-3 text-sm text-text-secondary\">\n No zones or dimensions captured for this plan yet.\n </p>\n )}\n </GlassCard>\n ) : null}\n\n {showCreate || floorPlans.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Add a floor plan</h2>\n <div className=\"space-y-4\">\n <Input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n aria-label=\"Floor plan name\"\n />\n <ImageUploadField\n label=\"Upload floor plan image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={imageUrl || null}\n onUploaded={setImageUrl}\n hint=\"Optional now — you can attach it later from the viewer.\"\n />\n <div className=\"flex justify-end gap-2\">\n {floorPlans.length > 0 ? (\n <Button type=\"button\" variant=\"ghost\" onClick={() => setShowCreate(false)}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"button\" onClick={handleCreate} disabled={creating || !name.trim()}>\n <Plus className=\"h-4 w-4\" />\n {creating ? 'Creating…' : 'Create'}\n </Button>\n </div>\n </div>\n </GlassCard>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, LayoutGrid, Map as MapIcon, Plus, SquareStack } from 'lucide-react';\nimport { Badge, Button, GlassCard, GradientText, IllustratedEmptyState, Input, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport {\n useCreateFloorPlanMutation,\n useDeleteFloorPlanMutation,\n useUpdateFloorPlanMutation,\n useVenueQuery,\n} from '../../api/eventApi';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { ImageUploadField } from '../../components/ImageUploadField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype Json = Record<string, unknown> | null | undefined;\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Json;\n interactiveAreas?: Json;\n};\n\ntype Zone = {\n key: string;\n label: string;\n type?: string;\n capacity?: number;\n rect?: { x: number; y: number; w: number; h: number };\n};\n\nconst FLOOR_PLAN_FOLDER = '/EventfullyManaged/FloorPlans';\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '' && Number.isFinite(Number(value))) {\n return Number(value);\n }\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\n// interactiveAreas is free-form JSON persisted verbatim by the backend. Parse it\n// defensively so the viewer renders whatever real shape a plan happens to hold —\n// an array of areas, a `{ zones: [...] }` / `{ areas: [...] }` wrapper, or a\n// keyed object — without ever fabricating booth data that isn't there.\nfunction extractZones(interactiveAreas: Json): Zone[] {\n if (!interactiveAreas) {\n return [];\n }\n let raw: unknown = interactiveAreas;\n if (!Array.isArray(raw) && typeof raw === 'object') {\n const obj = raw as Record<string, unknown>;\n if (Array.isArray(obj.zones)) {\n raw = obj.zones;\n } else if (Array.isArray(obj.areas)) {\n raw = obj.areas;\n } else if (Array.isArray(obj.booths)) {\n raw = obj.booths;\n }\n }\n\n const entries: Array<[string, unknown]> = Array.isArray(raw)\n ? raw.map((item, index) => [String(index), item])\n : typeof raw === 'object' && raw !== null\n ? Object.entries(raw as Record<string, unknown>)\n : [];\n\n const zones: Zone[] = [];\n for (const [key, value] of entries) {\n if (value === null || typeof value !== 'object') {\n continue;\n }\n const item = value as Record<string, unknown>;\n const label = asString(item.label) ?? asString(item.name) ?? asString(item.title) ?? asString(item.id) ?? key;\n const x = asNumber(item.x);\n const y = asNumber(item.y);\n const w = asNumber(item.w) ?? asNumber(item.width);\n const h = asNumber(item.h) ?? asNumber(item.height);\n let rect: Zone['rect'];\n if (x !== undefined && y !== undefined && w !== undefined && h !== undefined) {\n // Normalise fractional (0–1) or percentage (0–100) coordinates to percent.\n const scale = x <= 1 && y <= 1 && w <= 1 && h <= 1 ? 100 : 1;\n if (scale === 100 || (x <= 100 && y <= 100 && w <= 100 && h <= 100)) {\n rect = { x: x * scale, y: y * scale, w: w * scale, h: h * scale };\n }\n }\n zones.push({\n key: `${key}-${label}`,\n label,\n type: asString(item.type) ?? asString(item.kind),\n capacity: asNumber(item.capacity) ?? asNumber(item.seats),\n rect,\n });\n }\n return zones;\n}\n\ntype PlanMetric = { label: string; value: string };\n\nfunction buildMetrics(plan: FloorPlan, zones: Zone[]): PlanMetric[] {\n const metrics: PlanMetric[] = [];\n if (zones.length > 0) {\n metrics.push({ label: 'Zones', value: zones.length.toLocaleString() });\n }\n\n const boothCount = zones.filter((zone) => (zone.type ?? '').toLowerCase().includes('booth')).length;\n if (boothCount > 0) {\n metrics.push({ label: 'Booths', value: boothCount.toLocaleString() });\n }\n\n const zoneCapacity = zones.reduce((sum, zone) => sum + (zone.capacity ?? 0), 0);\n const dims = (plan.dimensions ?? {}) as Record<string, unknown>;\n const declaredCapacity = asNumber(dims.capacity) ?? asNumber(dims.totalCapacity);\n const capacity = zoneCapacity > 0 ? zoneCapacity : declaredCapacity;\n if (capacity !== undefined && capacity > 0) {\n metrics.push({ label: 'Total capacity', value: capacity.toLocaleString() });\n }\n\n const width = asNumber(dims.width);\n const height = asNumber(dims.height);\n if (width !== undefined && height !== undefined) {\n const unit = asString(dims.unit) ?? 'm';\n metrics.push({ label: 'Dimensions', value: `${width} × ${height} ${unit}` });\n }\n\n return metrics;\n}\n\nfunction FloorPlanViewer({\n plan,\n zones,\n onAttachImage,\n}: {\n plan: FloorPlan;\n zones: Zone[];\n onAttachImage: (plan: FloorPlan, url: string) => void;\n}) {\n const overlayZones = zones.filter((zone) => zone.rect);\n return (\n <GlassCard treatment=\"plain\" className=\"overflow-hidden border-border-seam p-0\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam px-5 py-3\">\n <div className=\"flex min-w-0 items-center gap-2 text-text-primary\">\n <MapIcon className=\"h-4 w-4 shrink-0 text-action-primary-bg\" />\n <h2 className=\"truncate text-base font-semibold\">{plan.name}</h2>\n </div>\n {zones.length > 0 ? (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {zones.length} {zones.length === 1 ? 'zone' : 'zones'}\n </Badge>\n ) : null}\n </div>\n\n {plan.imageUrl ? (\n <div className=\"relative bg-bg-sunken\">\n <img\n src={plan.imageUrl}\n alt={`${plan.name} floor plan`}\n className=\"mx-auto max-h-[32rem] w-full object-contain\"\n />\n {overlayZones.map((zone) => (\n <div\n key={zone.key}\n className=\"absolute flex items-center justify-center rounded-md border border-accent-primary/70 bg-action-primary-bg/15 text-[10px] font-medium text-accent-primary\"\n style={{\n left: `${zone.rect?.x}%`,\n top: `${zone.rect?.y}%`,\n width: `${zone.rect?.w}%`,\n height: `${zone.rect?.h}%`,\n }}\n title={zone.label}\n >\n <span className=\"truncate px-1\">{zone.label}</span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"p-6\">\n <div className=\"rounded-card border border-dashed border-border-default bg-bg-sunken p-6\">\n <p className=\"mb-3 text-center text-sm text-text-secondary\">\n No image attached yet. Upload the hall map for this plan.\n </p>\n <ImageUploadField\n label=\"Upload floor plan image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={null}\n onUploaded={(url) => onAttachImage(plan, url)}\n hint=\"Stored securely in Files and shown here once attached.\"\n />\n </div>\n </div>\n )}\n\n {zones.length > 0 ? (\n <div className=\"border-t border-border-seam px-5 py-4\">\n <div className=\"mb-2 flex items-center gap-2 text-sm font-medium text-text-primary\">\n <LayoutGrid className=\"h-4 w-4 text-text-muted\" />\n Labeled zones\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {zones.map((zone) => (\n <Badge key={zone.key} variant=\"outline\" className=\"gap-1.5\">\n {zone.label}\n {zone.capacity ? <span className=\"text-text-muted\">· {zone.capacity}</span> : null}\n </Badge>\n ))}\n </div>\n </div>\n ) : null}\n </GlassCard>\n );\n}\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [updateFloorPlan] = useUpdateFloorPlanMutation();\n const [deleteFloorPlan] = useDeleteFloorPlanMutation();\n const [name, setName] = useState('');\n const [imageUrl, setImageUrl] = useState('');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [showCreate, setShowCreate] = useState(false);\n\n const venue = data?.venue;\n const floorPlans = useMemo(() => (data?.floorPlans?.items ?? []) as FloorPlan[], [data]);\n\n const selectedPlan = useMemo(\n () => floorPlans.find((plan) => plan.id === selectedId) ?? floorPlans[0] ?? null,\n [floorPlans, selectedId]\n );\n const selectedZones = useMemo(() => extractZones(selectedPlan?.interactiveAreas), [selectedPlan]);\n const metrics = useMemo(\n () => (selectedPlan ? buildMetrics(selectedPlan, selectedZones) : []),\n [selectedPlan, selectedZones]\n );\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n try {\n const response = await createFloorPlan({\n variables: {\n input: { venueId: id, name: name.trim(), imageUrl, dimensions: {}, interactiveAreas: {} },\n },\n });\n if (!mutationSucceeded(response, response.data?.createFloorPlan?.id, 'Could not create floor plan')) {\n return;\n }\n setName('');\n setImageUrl('');\n setShowCreate(false);\n const createdId = response.data?.createFloorPlan?.id;\n if (createdId) {\n setSelectedId(createdId);\n }\n notify.success('Floor plan created');\n await refetch();\n } catch (error) {\n notify.error('Could not create floor plan', describeError(error));\n }\n };\n\n const handleAttachImage = async (plan: FloorPlan, url: string) => {\n try {\n const response = await updateFloorPlan({\n variables: {\n id: plan.id,\n input: {\n venueId: plan.venueId,\n name: plan.name,\n imageUrl: url,\n dimensions: plan.dimensions ?? {},\n interactiveAreas: plan.interactiveAreas ?? {},\n },\n },\n });\n if (!mutationSucceeded(response, response.data?.updateFloorPlan?.id, 'Could not attach image')) {\n return;\n }\n await refetch();\n } catch (error) {\n notify.error('Could not attach image', describeError(error));\n }\n };\n\n const handleDelete = async (plan: FloorPlan) => {\n const response = await deleteFloorPlan({ variables: { id: plan.id } });\n if (response.error) {\n notify.error('Could not delete floor plan', response.error.message);\n throw response.error;\n }\n if (!response.data?.deleteFloorPlan) {\n notify.error('Could not delete floor plan', 'The server did not confirm the change.');\n throw new Error('delete-unconfirmed');\n }\n if (selectedId === plan.id) {\n setSelectedId(null);\n }\n notify.success('Floor plan deleted', plan.name);\n await refetch();\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-end sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/venues/${id}`)}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </Button>\n <GradientText as=\"h1\" className=\"text-2xl font-bold\">\n {venue?.name ? `${venue.name} — Floor Plans` : 'Floor Plans'}\n </GradientText>\n <p className=\"text-sm text-text-secondary\">\n Map the hall layout, booth positions, stage and entrances so exhibitors and attendees can navigate on the\n day.\n </p>\n </div>\n <Button type=\"button\" onClick={() => setShowCreate((value) => !value)}>\n <Plus className=\"h-4 w-4\" />\n Add floor plan\n </Button>\n </div>\n\n {loading ? (\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <Skeleton className=\"h-96 rounded-card lg:col-span-2\" />\n <Skeleton className=\"h-96 rounded-card\" />\n </div>\n ) : floorPlans.length === 0 && !showCreate ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans yet.\"\n description=\"Add one to start mapping this venue — upload the hall map and label its zones.\"\n action={\n <Button type=\"button\" onClick={() => setShowCreate(true)}>\n <Plus className=\"h-4 w-4\" />\n Add floor plan\n </Button>\n }\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">\n {selectedPlan ? (\n <FloorPlanViewer plan={selectedPlan} zones={selectedZones} onAttachImage={handleAttachImage} />\n ) : (\n <GlassCard treatment=\"plain\" className=\"flex h-full items-center justify-center border-border-seam p-10\">\n <p className=\"text-sm text-text-secondary\">Add a floor plan to preview it here.</p>\n </GlassCard>\n )}\n </div>\n\n <div className=\"space-y-6\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Available Floor Plans</h2>\n <ul className=\"mt-3 space-y-2\" role=\"list\">\n {floorPlans.length === 0 ? (\n <li className=\"text-sm text-text-secondary\">None yet — create one below.</li>\n ) : (\n floorPlans.map((plan) => {\n const active = selectedPlan?.id === plan.id;\n return (\n <li key={plan.id}>\n <div\n className={`flex items-center gap-3 rounded-card border p-3 transition-colors ${\n active\n ? 'border-accent-primary bg-action-primary-bg/10'\n : 'border-border-seam hover:border-border-strong'\n }`}\n >\n <button\n type=\"button\"\n onClick={() => setSelectedId(plan.id)}\n className=\"flex min-w-0 flex-1 items-center gap-3 text-left focus-visible:outline-none\"\n aria-pressed={active}\n >\n <span\n className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-md ${\n active\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-secondary'\n }`}\n >\n <SquareStack className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">{plan.name}</span>\n <span className=\"block text-xs text-text-muted\">\n {plan.imageUrl ? 'Map attached' : 'No image yet'}\n </span>\n </span>\n </button>\n <ActionMenu\n ariaLabel={`Floor plan actions for ${plan.name}`}\n entityName={plan.name}\n deleteLabel=\"Delete floor plan\"\n onDelete={() => handleDelete(plan)}\n />\n </div>\n </li>\n );\n })\n )}\n </ul>\n </GlassCard>\n\n {selectedPlan ? (\n <GlassCard treatment=\"metric\" className=\"p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Plan Details</h2>\n {metrics.length > 0 ? (\n <dl className=\"mt-3 space-y-2\">\n {metrics.map((metric) => (\n <div key={metric.label} className=\"flex items-center justify-between text-sm\">\n <dt className=\"text-text-secondary\">{metric.label}</dt>\n <dd className=\"font-semibold tabular-nums text-text-primary\">{metric.value}</dd>\n </div>\n ))}\n </dl>\n ) : (\n <p className=\"mt-3 text-sm text-text-secondary\">No zones or dimensions captured for this plan yet.</p>\n )}\n </GlassCard>\n ) : null}\n\n {showCreate || floorPlans.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Add a floor plan</h2>\n <div className=\"space-y-4\">\n <Input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n aria-label=\"Floor plan name\"\n />\n <ImageUploadField\n label=\"Upload floor plan image\"\n folderPath={FLOOR_PLAN_FOLDER}\n value={imageUrl || null}\n onUploaded={setImageUrl}\n hint=\"Optional now — you can attach it later from the viewer.\"\n />\n <div className=\"flex justify-end gap-2\">\n {floorPlans.length > 0 ? (\n <Button type=\"button\" variant=\"ghost\" onClick={() => setShowCreate(false)}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"button\" onClick={handleCreate} disabled={creating || !name.trim()}>\n <Plus className=\"h-4 w-4\" />\n {creating ? 'Creating…' : 'Create'}\n </Button>\n </div>\n </div>\n </GlassCard>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VenueDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/venues/VenueDetailPage.tsx"],"names":[],"mappings":"AAyCA,MAAM,CAAC,OAAO,UAAU,eAAe,4CA0MtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VenueDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueDetailPage.tsx"],"sourcesContent":["import { ArrowLeft, Building2, Edit, MapPin, Megaphone, SquareStack, Users } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { EntityTagsField } from '../../components/EntityTagsField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueRecord = {\n id: string;\n name: string;\n description?: string | null;\n addressLine1?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n postalCode?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n pricing?: Record<string, unknown> | null;\n openingHours?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype FloorPlanRecord = {\n id: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n};\n\nexport default function VenueDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useVenueQuery(id);\n\n const venue = (data?.venue ?? null) as VenueRecord | null;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlanRecord[];\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-8 w-64\" />\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <Skeleton className=\"h-24 rounded-card\" />\n <Skeleton className=\"h-24 rounded-card\" />\n <Skeleton className=\"h-24 rounded-card\" />\n </div>\n <Skeleton className=\"h-40 rounded-card\" />\n </div>\n );\n }\n\n const statusVariant: 'success' | 'secondary' | 'warning' =\n venue?.status === 'ACTIVE' ? 'success' : venue?.status === 'MAINTENANCE' ? 'warning' : 'secondary';\n\n if (!venue) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Venue not found.\"\n description=\"This venue 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 <PagePurpose>\n The full record for one venue. Review its location, capacity and status, see what amenities it offers, and\n manage the floor plans attendees will navigate. Come here to confirm a space is ready before you assign an event\n to it.\n </PagePurpose>\n\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <div>\n <GradientText as=\"h1\" className=\"text-2xl font-bold\">\n {venue.name}\n </GradientText>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue.description ?? 'No description provided.'}</p>\n </div>\n </div>\n <Button type=\"button\" onClick={() => navigate(`/venues/${venue.id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Venue\n </Button>\n </div>\n\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 <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n Location\n </div>\n <p className=\"text-sm text-text-secondary\">\n {[venue.addressLine1, venue.city, venue.state, venue.country, venue.postalCode]\n .filter(Boolean)\n .join(', ') || 'Location not configured'}\n </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\">\n {(venue.capacity ?? 0).toLocaleString()} attendees\n </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 <Building2 className=\"h-4 w-4 text-action-primary-bg\" />\n Status\n </div>\n <Badge variant={statusVariant} className=\"uppercase\">\n {venue.status}\n </Badge>\n </GlassCard>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Amenities</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {venue.amenities.length > 0 ? (\n venue.amenities.map((amenity) => (\n <Badge key={amenity} variant=\"secondary\">\n {amenity}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">No amenities configured.</p>\n )}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Tags</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Label this venue so you can group and filter it — for example by region, tier or amenity profile.\n </p>\n <EntityTagsField entityType=\"EVENTFULLYMANAGED_VENUE\" entityId={venue.id} label=\"Venue tags\" className=\"mt-3\" />\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Floor Plans</h2>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}>\n <SquareStack className=\"h-4 w-4\" />\n Manage Floor Plans\n </Button>\n </div>\n <div className=\"mt-4\">\n {floorPlans.length > 0 ? (\n <ul className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {floorPlans.map((plan) => (\n <li key={plan.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}\n className=\"flex w-full items-center gap-3 rounded-card border border-border-seam p-3 text-left transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus\"\n >\n <span className=\"flex h-14 w-14 shrink-0 items-center justify-center overflow-hidden rounded-md bg-bg-sunken\">\n {plan.imageUrl ? (\n <img src={plan.imageUrl} alt={`${plan.name} floor plan`} className=\"h-full w-full object-cover\" />\n ) : (\n <SquareStack className=\"h-5 w-5 text-text-muted\" />\n )}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium text-text-primary\">{plan.name}</span>\n <span className=\"block text-sm text-text-secondary\">\n {plan.imageUrl ? 'Map attached' : 'No image configured'}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans have been added yet.\"\n className=\"py-8\"\n />\n )}\n </div>\n </GlassCard>\n\n <NextSteps\n storageKey=\"eventfullymanaged-venue-detail\"\n title=\"Get this venue ready to host\"\n steps={[\n {\n id: 'edit-venue',\n label: 'Edit venue details',\n description: 'Update capacity, address, status and amenities.',\n icon: <Edit className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/edit`),\n },\n {\n id: 'floor-plans',\n label: 'Add floor plans',\n description: 'Map the layout so attendees and staff can navigate.',\n icon: <SquareStack className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/floor-plans`),\n },\n {\n id: 'resources',\n label: 'Review resource readiness',\n description: 'Check capacity, amenities and plans at a glance.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/resources`),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VenueDetailPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/VenueDetailPage.tsx"],"sourcesContent":["import { ArrowLeft, Building2, Edit, MapPin, Megaphone, SquareStack, Users } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useParams } from 'react-router-dom';\n\nimport { useVenueQuery } from '../../api/eventApi';\nimport { EntityTagsField } from '../../components/EntityTagsField';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype VenueRecord = {\n id: string;\n name: string;\n description?: string | null;\n addressLine1?: string | null;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n postalCode?: string | null;\n capacity?: number | null;\n status: string;\n amenities: string[];\n pricing?: Record<string, unknown> | null;\n openingHours?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype FloorPlanRecord = {\n id: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n};\n\nexport default function VenueDetailPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useVenueQuery(id);\n\n const venue = (data?.venue ?? null) as VenueRecord | null;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlanRecord[];\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-8 w-64\" />\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <Skeleton className=\"h-24 rounded-card\" />\n <Skeleton className=\"h-24 rounded-card\" />\n <Skeleton className=\"h-24 rounded-card\" />\n </div>\n <Skeleton className=\"h-40 rounded-card\" />\n </div>\n );\n }\n\n const statusVariant: 'success' | 'secondary' | 'warning' =\n venue?.status === 'ACTIVE' ? 'success' : venue?.status === 'MAINTENANCE' ? 'warning' : 'secondary';\n\n if (!venue) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Venue not found.\"\n description=\"This venue 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 <PagePurpose>\n The full record for one venue. Review its location, capacity and status, see what amenities it offers, and\n manage the floor plans attendees will navigate. Come here to confirm a space is ready before you assign an event\n to it.\n </PagePurpose>\n\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate('/venues')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venues\n </Button>\n <div>\n <GradientText as=\"h1\" className=\"text-2xl font-bold\">\n {venue.name}\n </GradientText>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue.description ?? 'No description provided.'}</p>\n </div>\n </div>\n <Button type=\"button\" onClick={() => navigate(`/venues/${venue.id}/edit`)}>\n <Edit className=\"h-4 w-4\" />\n Edit Venue\n </Button>\n </div>\n\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 <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n Location\n </div>\n <p className=\"text-sm text-text-secondary\">\n {[venue.addressLine1, venue.city, venue.state, venue.country, venue.postalCode]\n .filter(Boolean)\n .join(', ') || 'Location not configured'}\n </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\">{(venue.capacity ?? 0).toLocaleString()} 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 <Building2 className=\"h-4 w-4 text-action-primary-bg\" />\n Status\n </div>\n <Badge variant={statusVariant} className=\"uppercase\">\n {venue.status}\n </Badge>\n </GlassCard>\n </div>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Amenities</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {venue.amenities.length > 0 ? (\n venue.amenities.map((amenity) => (\n <Badge key={amenity} variant=\"secondary\">\n {amenity}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">No amenities configured.</p>\n )}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Tags</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Label this venue so you can group and filter it — for example by region, tier or amenity profile.\n </p>\n <EntityTagsField entityType=\"EVENTFULLYMANAGED_VENUE\" entityId={venue.id} label=\"Venue tags\" className=\"mt-3\" />\n </GlassCard>\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Floor Plans</h2>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}>\n <SquareStack className=\"h-4 w-4\" />\n Manage Floor Plans\n </Button>\n </div>\n <div className=\"mt-4\">\n {floorPlans.length > 0 ? (\n <ul className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {floorPlans.map((plan) => (\n <li key={plan.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/venues/${venue.id}/floor-plans`)}\n className=\"flex w-full items-center gap-3 rounded-card border border-border-seam p-3 text-left transition-[box-shadow,border-color] duration-200 hover:border-border-strong hover:shadow-elevation-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus\"\n >\n <span className=\"flex h-14 w-14 shrink-0 items-center justify-center overflow-hidden rounded-md bg-bg-sunken\">\n {plan.imageUrl ? (\n <img\n src={plan.imageUrl}\n alt={`${plan.name} floor plan`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <SquareStack className=\"h-5 w-5 text-text-muted\" />\n )}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium text-text-primary\">{plan.name}</span>\n <span className=\"block text-sm text-text-secondary\">\n {plan.imageUrl ? 'Map attached' : 'No image configured'}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans have been added yet.\"\n className=\"py-8\"\n />\n )}\n </div>\n </GlassCard>\n\n <NextSteps\n storageKey=\"eventfullymanaged-venue-detail\"\n title=\"Get this venue ready to host\"\n steps={[\n {\n id: 'edit-venue',\n label: 'Edit venue details',\n description: 'Update capacity, address, status and amenities.',\n icon: <Edit className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/edit`),\n },\n {\n id: 'floor-plans',\n label: 'Add floor plans',\n description: 'Map the layout so attendees and staff can navigate.',\n icon: <SquareStack className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/floor-plans`),\n },\n {\n id: 'resources',\n label: 'Review resource readiness',\n description: 'Check capacity, amenities and plans at a glance.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate(`/venues/${venue.id}/resources`),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VenueFormPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/venues/VenueFormPage.tsx"],"names":[],"mappings":"AAkDA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAqNpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VenueListPage.d.ts","sourceRoot":"","sources":["../../../../src/eventfullymanaged/pages/venues/VenueListPage.tsx"],"names":[],"mappings":"AAwCA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAuMpC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
interface EventfullyManagedState {
|
|
2
|
+
sidebarCollapsed: boolean;
|
|
3
|
+
toggleSidebar: () => void;
|
|
4
|
+
activeModule: string;
|
|
5
|
+
setActiveModule: (module: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const useEventfullyManagedStore: import('zustand').UseBoundStore<Omit<Omit<import('zustand').StoreApi<EventfullyManagedState>, "setState" | "devtools"> & {
|
|
8
|
+
setState(partial: EventfullyManagedState | Partial<EventfullyManagedState> | ((state: EventfullyManagedState) => EventfullyManagedState | Partial<EventfullyManagedState>), replace?: false | undefined, action?: (string | {
|
|
9
|
+
[x: string]: unknown;
|
|
10
|
+
[x: number]: unknown;
|
|
11
|
+
[x: symbol]: unknown;
|
|
12
|
+
type: string;
|
|
13
|
+
}) | undefined): void;
|
|
14
|
+
setState(state: EventfullyManagedState | ((state: EventfullyManagedState) => EventfullyManagedState), replace: true, action?: (string | {
|
|
15
|
+
[x: string]: unknown;
|
|
16
|
+
[x: number]: unknown;
|
|
17
|
+
[x: symbol]: unknown;
|
|
18
|
+
type: string;
|
|
19
|
+
}) | undefined): void;
|
|
20
|
+
devtools: {
|
|
21
|
+
cleanup: () => void;
|
|
22
|
+
};
|
|
23
|
+
}, "setState" | "persist"> & {
|
|
24
|
+
setState(partial: EventfullyManagedState | Partial<EventfullyManagedState> | ((state: EventfullyManagedState) => EventfullyManagedState | Partial<EventfullyManagedState>), replace?: false | undefined, action?: (string | {
|
|
25
|
+
[x: string]: unknown;
|
|
26
|
+
[x: number]: unknown;
|
|
27
|
+
[x: symbol]: unknown;
|
|
28
|
+
type: string;
|
|
29
|
+
}) | undefined): unknown;
|
|
30
|
+
setState(state: EventfullyManagedState | ((state: EventfullyManagedState) => EventfullyManagedState), replace: true, action?: (string | {
|
|
31
|
+
[x: string]: unknown;
|
|
32
|
+
[x: number]: unknown;
|
|
33
|
+
[x: symbol]: unknown;
|
|
34
|
+
type: string;
|
|
35
|
+
}) | undefined): unknown;
|
|
36
|
+
persist: {
|
|
37
|
+
setOptions: (options: Partial<import('zustand/middleware').PersistOptions<EventfullyManagedState, unknown, unknown>>) => void;
|
|
38
|
+
clearStorage: () => void;
|
|
39
|
+
rehydrate: () => Promise<void> | void;
|
|
40
|
+
hasHydrated: () => boolean;
|
|
41
|
+
onHydrate: (fn: (state: EventfullyManagedState) => void) => () => void;
|
|
42
|
+
onFinishHydration: (fn: (state: EventfullyManagedState) => void) => () => void;
|
|
43
|
+
getOptions: () => Partial<import('zustand/middleware').PersistOptions<EventfullyManagedState, unknown, unknown>>;
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=eventfullyManagedStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventfullyManagedStore.d.ts","sourceRoot":"","sources":["../../../src/eventfullymanaged/store/eventfullyManagedStore.ts"],"names":[],"mappings":"AAIA,UAAU,sBAAsB;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarC,CAAC"}
|