@collabdt/core 0.0.57 → 0.2.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/README.md +29 -43
- package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
- package/dist/core/components/AppSidebarContent.js +21 -27
- package/dist/core/components/AppSidebarContent.js.map +1 -1
- package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
- package/dist/core/components/authentication/AuthPage.js +32 -7
- package/dist/core/components/authentication/AuthPage.js.map +1 -1
- package/dist/core/components/authentication/SignInAuthHeader.d.ts +7 -0
- package/dist/core/components/authentication/SignInAuthHeader.d.ts.map +1 -0
- package/dist/core/components/authentication/SignInAuthHeader.js +32 -0
- package/dist/core/components/authentication/SignInAuthHeader.js.map +1 -0
- package/dist/core/components/authentication/Signin.d.ts.map +1 -1
- package/dist/core/components/authentication/Signin.js +308 -10
- package/dist/core/components/authentication/Signin.js.map +1 -1
- package/dist/core/components/settings/index.js +3 -3
- package/dist/core/components/settings/index.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
- package/dist/core/components/settings/src/OrganizationSettingsPanel.js +5 -4
- package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
- package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
- package/dist/core/components/settings/src/SettingsSidebar.js +12 -2
- package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
- package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
- package/dist/core/components/support/BugReportDialog.js +122 -9
- package/dist/core/components/support/BugReportDialog.js.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.js +61 -2
- package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
- package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
- package/dist/core/components/ui/AppSidebar.js +52 -9
- package/dist/core/components/ui/AppSidebar.js.map +1 -1
- package/dist/core/components/ui/DataTable.js +3 -3
- package/dist/core/components/ui/DataTable.js.map +1 -1
- package/dist/core/components/ui/Dialog.js +1 -1
- package/dist/core/components/ui/Dialog.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.js +1 -1
- package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +2 -2
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js +2 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
- package/dist/core/components/ui/Sensors/sensorUtils.d.ts +9 -0
- package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/sensorUtils.js +6 -0
- package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
- package/dist/core/components/ui/Sidebar.d.ts +4 -0
- package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
- package/dist/core/components/ui/Sidebar.js +11 -5
- package/dist/core/components/ui/Sidebar.js.map +1 -1
- package/dist/core/components/ui/Table.js +2 -2
- package/dist/core/components/ui/Table.js.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.js +17 -9
- package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.js +5 -12
- package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.js +14 -27
- package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js +26 -0
- package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +13 -18
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/details/DetailHeader.js +14 -14
- package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.js +13 -3
- package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
- package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/TabSidebar.js +22 -0
- package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js +19 -0
- package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts +2 -0
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +84 -3
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +42 -2
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/Columns.js +2 -2
- package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
- package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/utils/positionParser.js +6 -5
- package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +8 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +7 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.js +6 -6
- package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/data.js +1 -1
- package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.js +28 -9
- package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -0
- package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts +19 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +163 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts +3 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +310 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts +30 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js +122 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts +13 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js +58 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts +18 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +102 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +243 -176
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts +24 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +46 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +54 -31
- package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +5 -4
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.js +0 -1
- package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
- package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -1
- package/dist/core/hooks/useCaptureScreenshot.js +111 -33
- package/dist/core/hooks/useCaptureScreenshot.js.map +1 -1
- package/dist/core/hooks/useCurrentViewerPosition.d.ts +18 -0
- package/dist/core/hooks/useCurrentViewerPosition.d.ts.map +1 -0
- package/dist/core/hooks/useCurrentViewerPosition.js +66 -0
- package/dist/core/hooks/useCurrentViewerPosition.js.map +1 -0
- package/dist/core/hooks/useShareUrl.d.ts +2 -0
- package/dist/core/hooks/useShareUrl.d.ts.map +1 -0
- package/dist/core/hooks/useShareUrl.js +74 -0
- package/dist/core/hooks/useShareUrl.js.map +1 -0
- package/dist/core/store/CombineProviders.d.ts.map +1 -1
- package/dist/core/store/CombineProviders.js +2 -0
- package/dist/core/store/CombineProviders.js.map +1 -1
- package/dist/core/store/MapSites/context.d.ts +16 -0
- package/dist/core/store/MapSites/context.d.ts.map +1 -0
- package/dist/core/store/MapSites/context.js +29 -0
- package/dist/core/store/MapSites/context.js.map +1 -0
- package/dist/core/store/MapSites/reducer.d.ts +52 -0
- package/dist/core/store/MapSites/reducer.d.ts.map +1 -0
- package/dist/core/store/MapSites/reducer.js +70 -0
- package/dist/core/store/MapSites/reducer.js.map +1 -0
- package/dist/core/store/index.d.ts +1 -0
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js +1 -0
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/styles/globals.css +46 -33
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/BuildingDetails.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport * as React from \"react\";\r\nimport type { Building } from '../../../../types/dbTypes'\r\nimport { mutate } from 'swr'\r\nimport { useSession } from 'next-auth/react'\r\nimport { handleApiError } from '../../../../utils/errorHandler'\r\nimport { usePermissions } from '../../../../store'\r\n\r\n// Custom hooks\r\nimport { useBuilding, useCreateBuilding } from '../../../../hooks/buildings/buildings'\r\nimport { useFilesByBuildingId } from '../../../../hooks/files/files'\r\n\r\n// Utilities\r\nimport { useBuildingHeaders } from '../utils/Headers'\r\n\r\n// Shadcn Components\r\nimport { DescriptionListItem } from '../../../ui/DescriptionList'\r\nimport { Separator } from '../../../ui/Separator'\r\nimport { toast } from 'sonner'\r\n\r\n// Custom Components\r\nimport AttachedFiles from '../details/AttachedFiles'\r\nimport TabSidebar from '../details/TabSidebar'\r\nimport FieldValue from '../details/FieldValue'\r\nimport FieldRenderer from './FieldRenderer'\r\nimport CheckboxGroup from '../details/CheckboxGroup'\r\nimport UnitsGrid from '../details/UnitsGrid'\r\nimport EnergySourcesGrid from '../details/EnergySourcesGrid'\r\nimport { useUser } from '../../../../hooks/users/users';\r\n\r\ninterface BuildingDetailsProps {\r\n selectedItem?: Building\r\n setSelectedItem?: (building: Building) => void\r\n editing?: boolean\r\n setEditing?: (editing: boolean) => void\r\n setActiveChanges?: (editing: boolean) => void\r\n buildings?: Building[]\r\n activeTab?: string\r\n setActiveTab?: (tab: string) => void\r\n}\r\n\r\n// Create a ref type for the component\r\nexport type BuildingDetailsRef = {\r\n saveChanges: () => Promise<void>\r\n}\r\n\r\nconst BuildingDetails = React.forwardRef<BuildingDetailsRef, BuildingDetailsProps>(({\r\n selectedItem,\r\n setSelectedItem,\r\n editing = false,\r\n setEditing,\r\n setActiveChanges,\r\n buildings,\r\n activeTab,\r\n setActiveTab = () => {},\r\n}, ref) => {\r\n // Session and user data\r\n const { data: session, status } = useSession()\r\n const { user, isLoading, isError, updateUser } = useUser(session?.user?.id || '')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const buildingHeaders = useBuildingHeaders()\r\n\r\n // Generate tab keys from buildingHeaders\r\n const tabOptions = buildingHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n\r\n // const [activeTab, setActiveTab] = React.useState(tabOptions[0].key);\r\n const [editingValues, setEditingValues] = React.useState<Partial<Building>>({})\r\n const [isUpdating, setIsUpdating] = React.useState(false)\r\n\r\n // Find current tab section\r\n const currentTabSection = buildingHeaders.find(\r\n section => section.title.toLowerCase().replaceAll(/\\s/g, '-') === activeTab,\r\n )\r\n\r\n // Use the updated hook only if we have a building ID\r\n const { updateBuilding, building: latestBuilding, isMutating, updateError } = useBuilding(selectedItem?.id || 0)\r\n const { createBuilding } = useCreateBuilding()\r\n\r\n // Fetch attached files for the building\r\n const { files: attachedFiles, isLoading: filesLoading } = useFilesByBuildingId(selectedItem?.id || 0)\r\n\r\n // Calculate total file count\r\n const attachedFilesCount = Array.isArray(attachedFiles) ? attachedFiles.length : 0\r\n\r\n // Create a map of tag to relation property name\r\n const tagToRelationMap: Record<string, string> = {\r\n buildingCodeCompliance: 'buildingBuildingCodeCompliance',\r\n environmentalCompliance: 'buildingEnvironmentalCompliance',\r\n occupancyCertificate: 'buildingOccupancyCertificate',\r\n permitsIssued: 'buildingPermitsIssued',\r\n systemAssessments: 'buildingSystemAssessments',\r\n zoningCompliance: 'buildingZoningCompliance',\r\n certificationsFile: 'buildingCertificationsFile',\r\n energyCodeCompliance: 'buildingEnergyCodeCompliance',\r\n fireSafety: 'buildingFireSafety',\r\n maintenanceRecords: 'buildingMaintenanceRecords',\r\n proximityToServices: 'buildingProximityToServices',\r\n regionalEnergyTrends: 'buildingRegionalEnergyTrends',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n\r\n React.useEffect(() => {\r\n handleApiError(isError)\r\n handleApiError(updateError)\r\n }, [isError, updateError])\r\n\r\n React.useEffect(() => {\r\n if (latestBuilding && selectedItem?.id === latestBuilding.id && setSelectedItem) {\r\n // Only update if we're not currently editing to avoid overwriting user input\r\n if (!editing || Object.keys(editingValues).length === 0) {\r\n const mergedBuilding = { ...latestBuilding }\r\n \r\n // Preserve file relationships from selectedItem if they exist\r\n for (const relationProp of Object.values(tagToRelationMap)) {\r\n const existingFiles = selectedItem[relationProp as keyof Building]\r\n if (existingFiles && Array.isArray(existingFiles) && existingFiles.length > 0) {\r\n (mergedBuilding as any)[relationProp] = existingFiles\r\n }\r\n }\r\n\r\n setSelectedItem(mergedBuilding)\r\n }\r\n }\r\n }, [latestBuilding, editing, editingValues])\r\n\r\n // Update selectedItem with files organized by their relationships\r\n React.useEffect(() => {\r\n if (selectedItem && attachedFiles && Array.isArray(attachedFiles) && setSelectedItem) {\r\n const updatedBuilding = { ...selectedItem }\r\n let hasChanges = false\r\n\r\n // Initialize all file arrays as empty if they don't exist\r\n for (const relationProp of Object.values(tagToRelationMap)) {\r\n if (!updatedBuilding[relationProp as keyof Building]) {\r\n (updatedBuilding as any)[relationProp] = []\r\n }\r\n }\r\n\r\n // Group files by their tags and assign to correct relational properties\r\n for (const file of attachedFiles) {\r\n if (file.tag && tagToRelationMap[file.tag]) {\r\n const relationProp = tagToRelationMap[file.tag]\r\n const currentFiles = (updatedBuilding as any)[relationProp] || []\r\n\r\n // Only add if not already present (avoid duplicates)\r\n const fileExists = currentFiles.some((existingFile: any) =>\r\n existingFile.id === file.id,\r\n )\r\n\r\n if (!fileExists) {\r\n (updatedBuilding as any)[relationProp] = [...currentFiles, file]\r\n hasChanges = true\r\n }\r\n }\r\n }\r\n\r\n // Update the selected item only if there are actual changes\r\n if (hasChanges) {\r\n setSelectedItem(updatedBuilding)\r\n }\r\n }\r\n }, [attachedFiles, selectedItem?.id, setSelectedItem])\r\n\r\n // Handle input changes during editing\r\n const handleInputChange = (key: string, value: any) => {\r\n setEditingValues(prev => ({\r\n ...prev,\r\n [key]: value,\r\n }))\r\n setActiveChanges?.(true)\r\n\r\n if (setSelectedItem && selectedItem) {\r\n setSelectedItem({\r\n ...selectedItem,\r\n [key]: value\r\n })\r\n }\r\n\r\n // If this is a file field change, refresh the files data\r\n if (isFileField(key)) {\r\n // Refresh the files data to show newly uploaded files\r\n mutate(`/api/files/building/${selectedItem?.id}`)\r\n }\r\n }\r\n\r\n // Handle save changes\r\n const handleSaveChanges = async () => {\r\n if (!selectedItem) return\r\n\r\n setIsUpdating(true)\r\n try {\r\n // Check if this is a new building creation (ID < 0)\r\n if (selectedItem.id < 0) {\r\n const buildingData = {\r\n ...selectedItem,\r\n ...editingValues,\r\n }\r\n\r\n delete buildingData.id\r\n\r\n const result = await createBuilding({\r\n buildingData,\r\n organizationId: user?.organizationId ? String(user.organizationId) : null,\r\n })\r\n\r\n // Update the selected building with the newly created one\r\n if (result && setSelectedItem) {\r\n setSelectedItem(result)\r\n }\r\n\r\n setEditingValues({})\r\n setEditing?.(false)\r\n setActiveChanges?.(false)\r\n toast.success('Building created successfully')\r\n }\r\n else {\r\n // This is an update to an existing building\r\n // Filter out file fields from building updates\r\n const buildingUpdates = Object.keys(editingValues).reduce((acc, key) => {\r\n if (!isFileField(key)) {\r\n acc[key] = editingValues[key]\r\n }\r\n return acc\r\n }, {} as Partial<Building>)\r\n\r\n // Check if we have file field changes\r\n const hasFileChanges = Object.keys(editingValues).some(key => isFileField(key))\r\n\r\n // Update building if there are non-file changes\r\n if (Object.keys(buildingUpdates).length > 0) {\r\n const result = await updateBuilding(buildingUpdates)\r\n \r\n // Immediately update local state with the result\r\n if (result && setSelectedItem && selectedItem) {\r\n setSelectedItem({ ...selectedItem, ...result })\r\n }\r\n }\r\n\r\n // Always refresh files data if there were file changes\r\n if (hasFileChanges) {\r\n await mutate(`/api/files/building/${selectedItem.id}`)\r\n }\r\n\r\n // Clear editing state\r\n setEditingValues({})\r\n setEditing?.(false)\r\n setActiveChanges?.(false)\r\n\r\n if (Object.keys(buildingUpdates).length > 0 && hasFileChanges) {\r\n toast.success('Building and files updated successfully')\r\n }\r\n else if (Object.keys(buildingUpdates).length > 0) {\r\n toast.success('Building updated successfully')\r\n }\r\n else if (hasFileChanges) {\r\n toast.success('Files updated successfully')\r\n }\r\n }\r\n }\r\n catch (error) {\r\n console.error('Save error:', error)\r\n if (error?.status !== 401) {\r\n toast.error(selectedItem.id < 0 ? 'Failed to create building' : 'Failed to update building')\r\n }\r\n \r\n }\r\n finally {\r\n setIsUpdating(false)\r\n }\r\n }\r\n\r\n\r\n // Auto-enable editing for new buildings\r\n React.useEffect(() => {\r\n // If this is a new building (negative ID), automatically start in edit mode\r\n if (selectedItem && selectedItem.id < 0 && setEditing) {\r\n setEditing(true)\r\n setActiveChanges?.(true)\r\n }\r\n }, [selectedItem?.id, setEditing, setActiveChanges])\r\n\r\n // Expose methods to parent component\r\n React.useImperativeHandle(ref, () => ({\r\n saveChanges: handleSaveChanges,\r\n }), [selectedItem, editingValues, updateBuilding, createBuilding, setEditing, setActiveChanges])\r\n\r\n // Get current value (edited value or original value)\r\n const getFieldValue = (property: string) => {\r\n return editingValues.hasOwnProperty(property)\r\n ? editingValues[property as keyof Building]\r\n : selectedItem?.[property as keyof Building]\r\n }\r\n\r\n // Check if field is a date field\r\n const isDateField = (property: string): boolean => {\r\n const dateFields = [\r\n 'buildingAirQualityAssessmentDate',\r\n 'buildingEstimatedStartDate', 'buildingEstimatedEndDate',\r\n 'buildingStartDate', 'buildingCompletedDate', 'buildingPermitIssuedDate',\r\n 'buildingAirQualityAssessmentDate', 'conditionRatingsDate',\r\n ]\r\n\r\n return dateFields.includes(property) || property?.toLowerCase().includes('date')\r\n }\r\n // Check if field is an enum field\r\n const isEnumField = (property: string): boolean => {\r\n const enumFields = [\r\n 'buildingCountrySubdivision',\r\n 'buildingAssessmentCondition',\r\n 'buildingGeometryStyle',\r\n 'buildingProjectPhase',\r\n 'buildingProjectType',\r\n 'buildingHeatingEnergySources',\r\n 'buildingCoolingEnergySources',\r\n 'buildingHotWaterSystemsEnergySources',\r\n 'buildingOccupantType',\r\n 'buildingType',\r\n 'buildingAssessmentRatingCondition',\r\n 'buildingManagementType',\r\n 'buildingElectricityServiceSize',\r\n 'buildingElectricityServiceLocation'\r\n ]\r\n\r\n return enumFields.includes(property)\r\n }\r\n\r\n // Get enum type for a property\r\n const getEnumType = (property: string): string | null => {\r\n const enumMappings: Record<string, string> = {\r\n buildingCountrySubdivision: 'CountrySubdivisionData',\r\n buildingAssessmentCondition: 'BuildingAssessmentConditions',\r\n buildingGeometryStyle: 'BuildingGeometryStyle',\r\n buildingProjectPhase: 'BuildingProjectPhase',\r\n buildingProjectType: 'BuildingProjectType',\r\n buildingHeatingCoolingEnergySources: 'BuildingEnergySource',\r\n buildingHotWaterSystemsEnergySources: 'BuildingEnergySource',\r\n buildingOccupantType: 'BuildingOccupantType',\r\n buildingType: 'BuildingTypeEnum',\r\n buildingAssessmentRatingCondition: 'BuildingAssessmentConditions',\r\n buildingManagementType: 'BuildingManagementType',\r\n buildingElectricityServiceSize: 'BuildingElectricityServiceSize',\r\n buildingElectricityServiceLocation: 'BuildingElectricityServiceLocation',\r\n }\r\n\r\n return enumMappings[property] || null\r\n }\r\n\r\n // Check if field should be full width\r\n const isFullWidthField = (property: string): boolean => {\r\n const fullWidthFields = [\r\n 'buildingName', 'buildingAddress', 'buildingParentSiteId',\r\n 'buildingNotes', 'buildingAdditionalInformation',\r\n 'buildingUnitAdditionalInformation', 'buildingEnergyAdditionalInformation',\r\n 'buildingEnvironmentalAdditionalInformation', 'buildingAssessmentDescription',\r\n 'buildingMaintenanceRecords', 'buildingMaintenanceAdditionalInformation',\r\n 'buildingPriorityRetrofits', 'buildingProjectDescription', 'previousUpdates',\r\n 'buildingFundingAdditionalInformation', 'buildingStructuralVulnerabilities',\r\n 'buildingClimateVulnerabilities', 'buildingSafetyConcerns', 'buildingFireSafety',\r\n 'buildingSiteFireCertificate', 'buildingOccupancyCertificate',\r\n 'buildingZoningCompliance', 'buildingEnvironmentalCompliance', 'buildingPermitsIssued',\r\n 'buildingElectricityServiceUpgradeHistory'\r\n ]\r\n return fullWidthFields.includes(property)\r\n }\r\n\r\n // Check if field should use textarea input\r\n const isTextAreaField = (property: string): boolean => {\r\n const textAreaFields = [\r\n 'buildingNotes', 'buildingAdditionalInformation', 'buildingUnitAdditionalInformation',\r\n 'buildingEnergyAdditionalInformation', 'buildingEnvironmentalAdditionalInformation',\r\n 'buildingAssessmentDescription', 'buildingMaintenanceAdditionalInformation',\r\n 'buildingPriorityRetrofits', 'buildingProjectDescription', 'previousUpdates',\r\n 'buildingFundingAdditionalInformation', 'buildingStructuralVulnerabilities',\r\n 'buildingClimateVulnerabilities', 'buildingSafetyConcerns', 'buildingElectricityServiceUpgradeHistory',\r\n ]\r\n return textAreaFields.includes(property)\r\n }\r\n\r\n // Check if field is a file upload field\r\n const isFileField = (property: string): boolean => {\r\n const fileFields = [\r\n 'buildingMaintenanceRecords', 'buildingSystemAssessment', 'buildingFireSafety',\r\n 'buildingSiteFireCertificate', 'buildingOccupancyCertificate', 'buildingEnvironmentalCompliance',\r\n 'buildingZoningCompliance', 'buildingPermitsIssued', 'buildingCertificationsFile',\r\n 'buildingRegionalEnergyTrends', 'buildingEnergyCodeCompliance',\r\n 'buildingOccupancyCertificate', 'occupancyData', 'buildingUnitsMarketRentNum',\r\n 'buildingUnitsMarketRentSqft', 'buildingEnergyAssessmentReports', 'buildingAirQualityReports',\r\n 'buildingWaterQualityReports', 'buildingDSRs', 'buildingBCAs', 'buildingContractorReports',\r\n 'buildingEngineeringAssessments',\r\n ]\r\n return fileFields.includes(property)\r\n }\r\n\r\n // Check if field is a part of the 4-column layout for checkboxes\r\n const isCheckboxGroupField = (property: string): boolean => {\r\n const checkboxGroupFields = [\r\n 'buildingParkingAvailable', 'buildingElevatorAvailable',\r\n 'buildingDryerAvailable', 'buildingWasherAvailable', 'buildingCommonSpace', 'buildingHeatingIncluded',\r\n 'buildingHydroIncluded', 'buildingWaterIncluded', 'buildingUtilitiesIncluded',\r\n 'buildingUnitsModified', 'buildingUnitsMarketRent', 'buildingUnitsSubsidized',\r\n 'buildingUnitsRoom', 'buildingUnitsB', 'buildingUnits1B', 'buildingUnits2B',\r\n 'buildingUnits3B', 'buildingUnits4B', 'buildingUnits5B', 'buildingUnits6B', 'buildingUnitsBelowMarketRent',\r\n 'buildingUnitsRentGearedToIncome'\r\n ]\r\n return checkboxGroupFields.includes(property)\r\n }\r\n\r\n const isNumberField = (property: string): boolean => {\r\n const numberFields = [\r\n 'buildingNorthing', 'buildingTotalSqft', 'buildingFloors', 'buildingUnits',\r\n 'buildingGrossFloorArea', 'buildingNetFloorArea', 'buildingLotSize',\r\n 'buildingUnitsModifiedNum', 'buildingUnitsMarketRentNum', 'buildingUnitsSubsidizedNum',\r\n 'buildingUnitsRoomNum', 'buildingUnitsBNum', 'buildingUnits1BNum',\r\n 'buildingUnits2BNum', 'buildingUnits3BNum', 'buildingUnits4BNum',\r\n 'buildingUnits5BNum', 'buildingUnits6BNum', 'buildingUnitsMarketRentSqft',\r\n 'buildingUnitsBSqft', 'buildingUnits1BSqft', 'buildingUnits2BSqft',\r\n 'buildingUnits3BSqft', 'buildingUnits4BSqft', 'buildingUnits5BSqft', 'buildingUnits6BSqft',\r\n 'buildingUnitsTotal', 'buildingAirQuality', 'buildingAnnualConsumption', 'buildingAssessedValue',\r\n 'buildingOrthogonalHeight', 'buildingOsmId', 'buildingSourceEui', 'buildingWardNumber', 'buildingCensusTract', \r\n 'buildingIntensityGhgEmissions', 'buildingPermitNumber', 'buildingProgramLoan','buildingProjectNumber',\r\n 'buildingRentalMarketSurveyZone', 'buildingSiteEui', 'buildingSolarPotential', 'buildingSubsidies', \r\n 'buildingTotalContribution', 'buildingTotalGhgEmissions', 'buildingTotalRentableArea', 'buildingValueOfFundingFlowed', \r\n 'buildingWaterUseIntensity', 'buildingParentSiteId', 'buildingAssessmentRatingCondition', 'buildingStoreyNum',\r\n 'buildingElectricityServicePanelSize', 'buildingElectricityServiceSize', 'buildingElectricityServiceSize',\r\n 'buildingElectricityServicePanelSize', 'buildingUnitsBelowMarketRentNum', 'buildingUnitsBelowMarketRentSqft',\r\n 'buildingUnitsRentGearedToIncomeNum', 'buildingUnitsRentGearedToIncomeSqft',\r\n // Energy sources grid metrics/years\r\n 'buildingHeatingMetric', 'buildingHeatingInstallationYear',\r\n 'buildingCoolingMetric', 'buildingCoolingInstallationYear',\r\n 'buildingHotWaterSystemsMetric', 'buildingHotWaterSystemsInstallationYear'\r\n ]\r\n\r\n return numberFields.includes(property)\r\n }\r\n\r\n // Render the content for the current tab\r\n const renderTabContent = () => {\r\n if (!selectedItem || !currentTabSection) return null\r\n\r\n return (\r\n <div className=\"flex flex-col gap-6 pt-3\">\r\n {currentTabSection.subsections.map((subsection, subIdx) => {\r\n // Handle special layout for Units Available\r\n if (subsection.specialLayout === 'unitsGrid') {\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {subIdx > 0 && <Separator className=\"mb-6\" />}\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n <UnitsGrid\r\n subsection={subsection}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </div>\r\n )\r\n }\r\n // Handle special layout for Energy Sources Grid\r\n if (subsection.specialLayout === 'energySourcesGrid') {\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {subIdx > 0 && <Separator className=\"mb-6\" />}\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n <EnergySourcesGrid\r\n subsection={subsection}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </div>\r\n )\r\n }\r\n\r\n // Skip checkbox fields that are handled in groups\r\n const processedFields = new Set<number>()\r\n const fieldsToRender = subsection.fields.filter((field, idx) => {\r\n if (processedFields.has(idx)) return false\r\n\r\n if (isCheckboxGroupField(field.property)) {\r\n // Only include the first field of each checkbox group\r\n const groupStartIndex = subsection.fields.findIndex(f => f.property === field.property)\r\n if (groupStartIndex % 5 === 3 && groupStartIndex === idx) {\r\n // Mark the next 4 fields as processed\r\n for (let i = 1; i < 5 && idx + i < subsection.fields.length; i++) {\r\n processedFields.add(idx + i)\r\n }\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {/* Render separator for subsection titles (except for first) */}\r\n {subIdx > 0 && subsection.title && subsection.title !== '' && subsection.title !== 'null'\r\n && <Separator className=\"mb-6\" />}\r\n\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n\r\n <div className=\"grid grid-cols-1 [&>*:last-child]:border-b-0\">\r\n {fieldsToRender.map((field, renderIdx) => {\r\n const originalIdx = subsection.fields.findIndex(f => f.property === field.property)\r\n const value = getFieldValue(field.property)\r\n\r\n // Check if this is the start of a checkbox group\r\n if (isCheckboxGroupField(field.property)) {\r\n const checkboxFields = subsection.fields.slice(originalIdx, originalIdx + 5)\r\n return (\r\n <CheckboxGroup\r\n key={renderIdx}\r\n fields={checkboxFields}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n )\r\n }\r\n\r\n // Handle full width fields\r\n if (isFullWidthField(field.property)) {\r\n return (\r\n <div key={renderIdx} className={`py-3 w-full ${!editing && 'border-b border-border'}`}>\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{field.label}</div>\r\n <FieldRenderer\r\n property={field.property}\r\n value={value}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem className=\"break-words\" label={field.label}>\r\n <FieldValue\r\n value={value}\r\n label={field.label}\r\n isFile={isFileField(field.property)}\r\n property={field.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Skip full-width fields for pairing logic\r\n if (isFullWidthField(field.property)) {\r\n return null\r\n }\r\n\r\n // Handle regular fields (in pairs)\r\n if (renderIdx % 2 === 0) {\r\n // Start a new row for every pair of fields\r\n const nextField = fieldsToRender[renderIdx + 1]\r\n const nextValue = nextField && !isFullWidthField(nextField.property) ? getFieldValue(nextField.property) : null\r\n\r\n return (\r\n <div key={renderIdx} className={`grid grid-cols-1 md:grid-cols-2 gap-3 py-3 w-full ${!editing && 'border-b border-border'} `}>\r\n {/* First field */}\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{field.label}</div>\r\n <FieldRenderer\r\n property={field.property}\r\n value={value}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem className=\"break-words\" label={field.label}>\r\n <FieldValue\r\n value={value}\r\n label={field.label}\r\n isFile={isFileField(field.property)}\r\n property={field.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n\r\n <Separator className=\"md:hidden\" />\r\n\r\n {/* Second field (if exists and not full width) */}\r\n {nextField && !isFullWidthField(nextField.property) && (\r\n <>\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-semibold text-foreground\">\r\n {nextField.label}\r\n </div>\r\n <FieldRenderer\r\n property={nextField.property}\r\n value={nextValue}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem\r\n className=\"break-words\"\r\n label={nextField.label}\r\n >\r\n <FieldValue\r\n value={nextValue}\r\n label={nextField.label}\r\n isFile={isFileField(nextField.property)}\r\n property={nextField.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n // Skip odd indices for non-full-width fields as they're handled with the previous even index\r\n return null\r\n })}\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-row gap-2 p-6 h-full overflow-hidden\">\r\n {/* Sidebar */}\r\n <TabSidebar\r\n activeTab={activeTab}\r\n setActiveTab={setActiveTab}\r\n tabOptions={tabOptions}\r\n attachedFilesCount={attachedFilesCount}\r\n />\r\n\r\n <Separator orientation=\"vertical\" />\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex-shrink-0 pb-2 px-6\">\r\n <p className=\"text-xl text-foreground font-semibold\">{currentTabSection?.title}</p>\r\n </div>\r\n <div className=\"flex-1 px-6 overflow-auto\">\r\n {activeTab === 'attached-files'\r\n ? (\r\n <AttachedFiles\r\n buildingId={selectedItem?.id}\r\n files={attachedFiles}\r\n isLoading={filesLoading}\r\n />\r\n )\r\n : (\r\n selectedItem && renderTabContent()\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nBuildingDetails.displayName = 'BuildingDetails'\r\n\r\nexport default BuildingDetails"],"mappings":";;;;;;;;;;;;;;;;;;;;AA8cc,SAuKY,UAtKK,KADjB;AAxcd,YAAY,WAAW;AAEvB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAG/B,SAAS,aAAa,yBAAyB;AAC/C,SAAS,4BAA4B;AAGrC,SAAS,0BAA0B;AAGnC,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAGtB,OAAO,mBAAmB;AAC1B,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AACvB,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAC1B,OAAO,eAAe;AACtB,OAAO,uBAAuB;AAC9B,SAAS,eAAe;AAkBxB,MAAM,kBAAkB,MAAM,WAAqD,CAAC;AAAA,EAClF;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,MAAM;AAAA,EAAC;AACxB,GAAG,QAAQ;AA5DX;AA8DE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAI,WAAW;AAC7C,QAAM,EAAE,MAAM,WAAW,SAAS,WAAW,IAAI,UAAQ,wCAAS,SAAT,mBAAe,OAAM,EAAE;AAGhF,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,kBAAkB,mBAAmB;AAG3C,QAAM,aAAa,gBAAgB,IAAI,cAAY;AAAA,IACjD,KAAK,QAAQ,MAAM,YAAY,EAAE,WAAW,OAAO,GAAG;AAAA,IACtD,OAAO,QAAQ;AAAA,EACjB,EAAE;AAGF,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAA4B,CAAC,CAAC;AAC9E,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,KAAK;AAGxD,QAAM,oBAAoB,gBAAgB;AAAA,IACxC,aAAW,QAAQ,MAAM,YAAY,EAAE,WAAW,OAAO,GAAG,MAAM;AAAA,EACpE;AAGA,QAAM,EAAE,gBAAgB,UAAU,gBAAgB,YAAY,YAAY,IAAI,aAAY,6CAAc,OAAM,CAAC;AAC/G,QAAM,EAAE,eAAe,IAAI,kBAAkB;AAG7C,QAAM,EAAE,OAAO,eAAe,WAAW,aAAa,IAAI,sBAAqB,6CAAc,OAAM,CAAC;AAGpG,QAAM,qBAAqB,MAAM,QAAQ,aAAa,IAAI,cAAc,SAAS;AAGjF,QAAM,mBAA2C;AAAA,IAC/C,wBAAwB;AAAA,IACxB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,wBAAwB;AAAA,EAC1B;AAEA,QAAM,UAAU,MAAM;AACpB,mBAAe,OAAO;AACtB,mBAAe,WAAW;AAAA,EAC5B,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,QAAM,UAAU,MAAM;AACpB,QAAI,mBAAkB,6CAAc,QAAO,eAAe,MAAM,iBAAiB;AAE/E,UAAI,CAAC,WAAW,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AACvD,cAAM,iBAAiB,mBAAK;AAG5B,mBAAW,gBAAgB,OAAO,OAAO,gBAAgB,GAAG;AAC1D,gBAAM,gBAAgB,aAAa,YAA8B;AACjE,cAAI,iBAAiB,MAAM,QAAQ,aAAa,KAAK,cAAc,SAAS,GAAG;AAC7E,YAAC,eAAuB,YAAY,IAAI;AAAA,UAC1C;AAAA,QACF;AAEA,wBAAgB,cAAc;AAAA,MAChC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,gBAAgB,SAAS,aAAa,CAAC;AAG3C,QAAM,UAAU,MAAM;AACpB,QAAI,gBAAgB,iBAAiB,MAAM,QAAQ,aAAa,KAAK,iBAAiB;AACpF,YAAM,kBAAkB,mBAAK;AAC7B,UAAI,aAAa;AAGjB,iBAAW,gBAAgB,OAAO,OAAO,gBAAgB,GAAG;AAC1D,YAAI,CAAC,gBAAgB,YAA8B,GAAG;AACpD,UAAC,gBAAwB,YAAY,IAAI,CAAC;AAAA,QAC5C;AAAA,MACF;AAGA,iBAAW,QAAQ,eAAe;AAChC,YAAI,KAAK,OAAO,iBAAiB,KAAK,GAAG,GAAG;AAC1C,gBAAM,eAAe,iBAAiB,KAAK,GAAG;AAC9C,gBAAM,eAAgB,gBAAwB,YAAY,KAAK,CAAC;AAGhE,gBAAM,aAAa,aAAa;AAAA,YAAK,CAAC,iBACpC,aAAa,OAAO,KAAK;AAAA,UAC3B;AAEA,cAAI,CAAC,YAAY;AACf,YAAC,gBAAwB,YAAY,IAAI,CAAC,GAAG,cAAc,IAAI;AAC/D,yBAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY;AACd,wBAAgB,eAAe;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,6CAAc,IAAI,eAAe,CAAC;AAGrD,QAAM,oBAAoB,CAAC,KAAa,UAAe;AACrD,qBAAiB,UAAS,iCACrB,OADqB;AAAA,MAExB,CAAC,GAAG,GAAG;AAAA,IACT,EAAE;AACF,yDAAmB;AAEnB,QAAI,mBAAmB,cAAc;AACnC,sBAAgB,iCACX,eADW;AAAA,QAEd,CAAC,GAAG,GAAG;AAAA,MACT,EAAC;AAAA,IACH;AAGA,QAAI,YAAY,GAAG,GAAG;AAEpB,aAAO,uBAAuB,6CAAc,EAAE,EAAE;AAAA,IAClD;AAAA,EACF;AAGA,QAAM,oBAAoB,YAAY;AACpC,QAAI,CAAC,aAAc;AAEnB,kBAAc,IAAI;AAClB,QAAI;AAEF,UAAI,aAAa,KAAK,GAAG;AACvB,cAAM,eAAe,kCAChB,eACA;AAGL,eAAO,aAAa;AAEpB,cAAM,SAAS,MAAM,eAAe;AAAA,UAClC;AAAA,UACA,iBAAgB,6BAAM,kBAAiB,OAAO,KAAK,cAAc,IAAI;AAAA,QACvE,CAAC;AAGD,YAAI,UAAU,iBAAiB;AAC7B,0BAAgB,MAAM;AAAA,QACxB;AAEA,yBAAiB,CAAC,CAAC;AACnB,iDAAa;AACb,6DAAmB;AACnB,cAAM,QAAQ,+BAA+B;AAAA,MAC/C,OACK;AAGH,cAAM,kBAAkB,OAAO,KAAK,aAAa,EAAE,OAAO,CAAC,KAAK,QAAQ;AACtE,cAAI,CAAC,YAAY,GAAG,GAAG;AACrB,gBAAI,GAAG,IAAI,cAAc,GAAG;AAAA,UAC9B;AACA,iBAAO;AAAA,QACT,GAAG,CAAC,CAAsB;AAG1B,cAAM,iBAAiB,OAAO,KAAK,aAAa,EAAE,KAAK,SAAO,YAAY,GAAG,CAAC;AAG9E,YAAI,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAC3C,gBAAM,SAAS,MAAM,eAAe,eAAe;AAGnD,cAAI,UAAU,mBAAmB,cAAc;AAC7C,4BAAgB,kCAAK,eAAiB,OAAQ;AAAA,UAChD;AAAA,QACF;AAGA,YAAI,gBAAgB;AAClB,gBAAM,OAAO,uBAAuB,aAAa,EAAE,EAAE;AAAA,QACvD;AAGA,yBAAiB,CAAC,CAAC;AACnB,iDAAa;AACb,6DAAmB;AAEnB,YAAI,OAAO,KAAK,eAAe,EAAE,SAAS,KAAK,gBAAgB;AAC7D,gBAAM,QAAQ,yCAAyC;AAAA,QACzD,WACS,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAChD,gBAAM,QAAQ,+BAA+B;AAAA,QAC/C,WACS,gBAAgB;AACvB,gBAAM,QAAQ,4BAA4B;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,SACO,OAAO;AACZ,cAAQ,MAAM,eAAe,KAAK;AAClC,WAAI,+BAAO,YAAW,KAAK;AACzB,cAAM,MAAM,aAAa,KAAK,IAAI,8BAA8B,2BAA2B;AAAA,MAC7F;AAAA,IAEF,UACA;AACE,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAIA,QAAM,UAAU,MAAM;AAEpB,QAAI,gBAAgB,aAAa,KAAK,KAAK,YAAY;AACrD,iBAAW,IAAI;AACf,2DAAmB;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,6CAAc,IAAI,YAAY,gBAAgB,CAAC;AAGnD,QAAM,oBAAoB,KAAK,OAAO;AAAA,IACpC,aAAa;AAAA,EACf,IAAI,CAAC,cAAc,eAAe,gBAAgB,gBAAgB,YAAY,gBAAgB,CAAC;AAG/F,QAAM,gBAAgB,CAAC,aAAqB;AAC1C,WAAO,cAAc,eAAe,QAAQ,IACxC,cAAc,QAA0B,IACxC,6CAAe;AAAA,EACrB;AAGA,QAAM,cAAc,CAAC,aAA8B;AACjD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MAA8B;AAAA,MAC9B;AAAA,MAAqB;AAAA,MAAyB;AAAA,MAC9C;AAAA,MAAoC;AAAA,IACtC;AAEA,WAAO,WAAW,SAAS,QAAQ,MAAK,qCAAU,cAAc,SAAS;AAAA,EAC3E;AAEA,QAAM,cAAc,CAAC,aAA8B;AACjD,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,WAAW,SAAS,QAAQ;AAAA,EACrC;AAGA,QAAM,cAAc,CAAC,aAAoC;AACvD,UAAM,eAAuC;AAAA,MAC3C,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,qCAAqC;AAAA,MACrC,sCAAsC;AAAA,MACtC,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,mCAAmC;AAAA,MACnC,wBAAwB;AAAA,MACxB,gCAAgC;AAAA,MAChC,oCAAoC;AAAA,IACtC;AAEA,WAAO,aAAa,QAAQ,KAAK;AAAA,EACnC;AAGA,QAAM,mBAAmB,CAAC,aAA8B;AACtD,UAAM,kBAAkB;AAAA,MACtB;AAAA,MAAgB;AAAA,MAAmB;AAAA,MACnC;AAAA,MAAiB;AAAA,MACjB;AAAA,MAAqC;AAAA,MACrC;AAAA,MAA8C;AAAA,MAC9C;AAAA,MAA8B;AAAA,MAC9B;AAAA,MAA6B;AAAA,MAA8B;AAAA,MAC3D;AAAA,MAAwC;AAAA,MACxC;AAAA,MAAkC;AAAA,MAA0B;AAAA,MAC5D;AAAA,MAA+B;AAAA,MAC/B;AAAA,MAA4B;AAAA,MAAmC;AAAA,MAC/D;AAAA,IACF;AACA,WAAO,gBAAgB,SAAS,QAAQ;AAAA,EAC1C;AAGA,QAAM,kBAAkB,CAAC,aAA8B;AACrD,UAAM,iBAAiB;AAAA,MACrB;AAAA,MAAiB;AAAA,MAAiC;AAAA,MAClD;AAAA,MAAuC;AAAA,MACvC;AAAA,MAAiC;AAAA,MACjC;AAAA,MAA6B;AAAA,MAA8B;AAAA,MAC3D;AAAA,MAAwC;AAAA,MACxC;AAAA,MAAkC;AAAA,MAA0B;AAAA,IAC9D;AACA,WAAO,eAAe,SAAS,QAAQ;AAAA,EACzC;AAGA,QAAM,cAAc,CAAC,aAA8B;AACjD,UAAM,aAAa;AAAA,MACjB;AAAA,MAA8B;AAAA,MAA4B;AAAA,MAC1D;AAAA,MAA+B;AAAA,MAAgC;AAAA,MAC/D;AAAA,MAA4B;AAAA,MAAyB;AAAA,MACrD;AAAA,MAAgC;AAAA,MAChC;AAAA,MAAgC;AAAA,MAAiB;AAAA,MACjD;AAAA,MAA+B;AAAA,MAAmC;AAAA,MAClE;AAAA,MAA+B;AAAA,MAAgB;AAAA,MAAgB;AAAA,MAC/D;AAAA,IACF;AACA,WAAO,WAAW,SAAS,QAAQ;AAAA,EACrC;AAGA,QAAM,uBAAuB,CAAC,aAA8B;AAC1D,UAAM,sBAAsB;AAAA,MAC1B;AAAA,MAA4B;AAAA,MAC5B;AAAA,MAA0B;AAAA,MAA2B;AAAA,MAAuB;AAAA,MAC5E;AAAA,MAAyB;AAAA,MAAyB;AAAA,MAClD;AAAA,MAAyB;AAAA,MAA2B;AAAA,MACpD;AAAA,MAAqB;AAAA,MAAkB;AAAA,MAAmB;AAAA,MAC1D;AAAA,MAAmB;AAAA,MAAmB;AAAA,MAAmB;AAAA,MAAmB;AAAA,MAC5E;AAAA,IACF;AACA,WAAO,oBAAoB,SAAS,QAAQ;AAAA,EAC9C;AAEA,QAAM,gBAAgB,CAAC,aAA8B;AACnD,UAAM,eAAe;AAAA,MACnB;AAAA,MAAoB;AAAA,MAAqB;AAAA,MAAkB;AAAA,MAC3D;AAAA,MAA0B;AAAA,MAAwB;AAAA,MAClD;AAAA,MAA4B;AAAA,MAA8B;AAAA,MAC1D;AAAA,MAAwB;AAAA,MAAqB;AAAA,MAC7C;AAAA,MAAsB;AAAA,MAAsB;AAAA,MAC5C;AAAA,MAAsB;AAAA,MAAsB;AAAA,MAC5C;AAAA,MAAsB;AAAA,MAAuB;AAAA,MAC7C;AAAA,MAAuB;AAAA,MAAuB;AAAA,MAAuB;AAAA,MACrE;AAAA,MAAsB;AAAA,MAAsB;AAAA,MAA6B;AAAA,MACzE;AAAA,MAA4B;AAAA,MAAiB;AAAA,MAAqB;AAAA,MAAsB;AAAA,MACxF;AAAA,MAAiC;AAAA,MAAwB;AAAA,MAAsB;AAAA,MAC/E;AAAA,MAAkC;AAAA,MAAmB;AAAA,MAA0B;AAAA,MAC/E;AAAA,MAA6B;AAAA,MAA6B;AAAA,MAA6B;AAAA,MACvF;AAAA,MAA6B;AAAA,MAAwB;AAAA,MAAqC;AAAA,MAC1F;AAAA,MAAuC;AAAA,MAAkC;AAAA,MACzE;AAAA,MAAuC;AAAA,MAAmC;AAAA,MAC1E;AAAA,MAAsC;AAAA;AAAA,MAEtC;AAAA,MAAyB;AAAA,MACzB;AAAA,MAAyB;AAAA,MACzB;AAAA,MAAiC;AAAA,IACnC;AAEA,WAAO,aAAa,SAAS,QAAQ;AAAA,EACvC;AAGA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,gBAAgB,CAAC,kBAAmB,QAAO;AAEhD,WACE,oBAAC,SAAI,WAAU,4BACZ,4BAAkB,YAAY,IAAI,CAAC,YAAY,WAAW;AAEzD,UAAI,WAAW,kBAAkB,aAAa;AAC5C,eACE,qBAAC,SAAiB,WAAU,IACzB;AAAA,mBAAS,KAAK,oBAAC,aAAU,WAAU,QAAO;AAAA,UAC3C,oBAAC,QAAG,WAAU,gDAAgD,qBAAW,OAAM;AAAA,UAC/E;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,aARQ,MASV;AAAA,MAEJ;AAEA,UAAI,WAAW,kBAAkB,qBAAqB;AACpD,eACE,qBAAC,SAAiB,WAAU,IACzB;AAAA,mBAAS,KAAK,oBAAC,aAAU,WAAU,QAAO;AAAA,UAC3C,oBAAC,QAAG,WAAU,gDAAgD,qBAAW,OAAM;AAAA,UAC/E;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,aARQ,MASV;AAAA,MAEJ;AAGA,YAAM,kBAAkB,oBAAI,IAAY;AACxC,YAAM,iBAAiB,WAAW,OAAO,OAAO,CAAC,OAAO,QAAQ;AAC9D,YAAI,gBAAgB,IAAI,GAAG,EAAG,QAAO;AAErC,YAAI,qBAAqB,MAAM,QAAQ,GAAG;AAExC,gBAAM,kBAAkB,WAAW,OAAO,UAAU,OAAK,EAAE,aAAa,MAAM,QAAQ;AACtF,cAAI,kBAAkB,MAAM,KAAK,oBAAoB,KAAK;AAExD,qBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,WAAW,OAAO,QAAQ,KAAK;AAChE,8BAAgB,IAAI,MAAM,CAAC;AAAA,YAC7B;AACA,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT,CAAC;AAED,aACE,qBAAC,SAAiB,WAAU,IAEzB;AAAA,iBAAS,KAAK,WAAW,SAAS,WAAW,UAAU,MAAM,WAAW,UAAU,UAC9E,oBAAC,aAAU,WAAU,QAAO;AAAA,QAEjC,oBAAC,QAAG,WAAU,gDAAgD,qBAAW,OAAM;AAAA,QAE/E,oBAAC,SAAI,WAAU,gDACZ,yBAAe,IAAI,CAAC,OAAO,cAAc;AACxC,gBAAM,cAAc,WAAW,OAAO,UAAU,OAAK,EAAE,aAAa,MAAM,QAAQ;AAClF,gBAAM,QAAQ,cAAc,MAAM,QAAQ;AAG1C,cAAI,qBAAqB,MAAM,QAAQ,GAAG;AACxC,kBAAM,iBAAiB,WAAW,OAAO,MAAM,aAAa,cAAc,CAAC;AAC3E,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,cAJK;AAAA,YAKP;AAAA,UAEJ;AAGA,cAAI,iBAAiB,MAAM,QAAQ,GAAG;AACpC,mBACE,oBAAC,SAAoB,WAAW,eAAe,CAAC,WAAW,wBAAwB,IAChF,oBAEK,qBAAC,SAAI,WAAU,uBACb;AAAA,kCAAC,SAAI,WAAU,uCAAuC,gBAAM,OAAM;AAAA,cAClE;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU,MAAM;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,YAAY,6CAAc;AAAA,kBAC1B;AAAA;AAAA,cACF;AAAA,eACF,IAGA,oBAAC,uBAAoB,WAAU,eAAc,OAAO,MAAM,OACxD;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,OAAO,MAAM;AAAA,gBACb,QAAQ,YAAY,MAAM,QAAQ;AAAA,gBAClC,UAAU,MAAM;AAAA,gBAChB,UAAU;AAAA,gBACV;AAAA;AAAA,YACF,GACF,KA/BE,SAiCV;AAAA,UAEJ;AAGA,cAAI,iBAAiB,MAAM,QAAQ,GAAG;AACpC,mBAAO;AAAA,UACT;AAGA,cAAI,YAAY,MAAM,GAAG;AAEvB,kBAAM,YAAY,eAAe,YAAY,CAAC;AAC9C,kBAAM,YAAY,aAAa,CAAC,iBAAiB,UAAU,QAAQ,IAAI,cAAc,UAAU,QAAQ,IAAI;AAE3G,mBACE,qBAAC,SAAoB,WAAW,qDAAqD,CAAC,WAAW,wBAAwB,KAEtH;AAAA,wBAEK,qBAAC,SAAI,WAAU,uBACb;AAAA,oCAAC,SAAI,WAAU,uCAAuC,gBAAM,OAAM;AAAA,gBAClE;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,MAAM;AAAA,oBAChB;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,YAAY,6CAAc;AAAA,oBAC1B;AAAA;AAAA,gBACF;AAAA,iBACF,IAGA,oBAAC,uBAAoB,WAAU,eAAc,OAAO,MAAM,OACxD;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,OAAO,MAAM;AAAA,kBACb,QAAQ,YAAY,MAAM,QAAQ;AAAA,kBAClC,UAAU,MAAM;AAAA,kBAChB,UAAU;AAAA,kBACV;AAAA;AAAA,cACF,GACF;AAAA,cAGN,oBAAC,aAAU,WAAU,aAAY;AAAA,cAGhC,aAAa,CAAC,iBAAiB,UAAU,QAAQ,KAChD,gCACG,oBAEK,qBAAC,SAAI,WAAU,uBACb;AAAA,oCAAC,SAAI,WAAU,yCACZ,oBAAU,OACb;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,UAAU;AAAA,oBACpB,OAAO;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,YAAY,6CAAc;AAAA,oBAC1B;AAAA;AAAA,gBACF;AAAA,iBACF,IAGA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,UAAU;AAAA,kBAEjB;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,sBACP,OAAO,UAAU;AAAA,sBACjB,QAAQ,YAAY,UAAU,QAAQ;AAAA,sBACtC,UAAU,UAAU;AAAA,sBACpB,UAAU;AAAA,sBACV;AAAA;AAAA,kBACF;AAAA;AAAA,cACF,GAER;AAAA,iBA7EM,SA+EV;AAAA,UAEJ;AAEA,iBAAO;AAAA,QACT,CAAC,GACH;AAAA,WAnKQ,MAoKV;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,kDAEb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAEA,oBAAC,aAAU,aAAY,YAAW;AAAA,IAGlC,qBAAC,SAAI,WAAU,wCAEb;AAAA,0BAAC,SAAI,WAAU,2BACb,8BAAC,OAAE,WAAU,yCAAyC,iEAAmB,OAAM,GACjF;AAAA,MACA,oBAAC,SAAI,WAAU,6BACZ,wBAAc,mBAET;AAAA,QAAC;AAAA;AAAA,UACC,YAAY,6CAAc;AAAA,UAC1B,OAAO;AAAA,UACP,WAAW;AAAA;AAAA,MACb,IAGA,gBAAgB,iBAAiB,GAEzC;AAAA,OACF;AAAA,KACF;AAEJ,CAAC;AAED,gBAAgB,cAAc;AAE9B,IAAO,0BAAQ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/BuildingDetails.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport * as React from \"react\";\r\nimport type { Building } from '../../../../types/dbTypes'\r\nimport { mutate } from 'swr'\r\nimport { useSession } from 'next-auth/react'\r\nimport { handleApiError } from '../../../../utils/errorHandler'\r\nimport { usePermissions } from '../../../../store'\r\n\r\n// Custom hooks\r\nimport { useBuilding, useCreateBuilding } from '../../../../hooks/buildings/buildings'\r\nimport { useFilesByBuildingId } from '../../../../hooks/files/files'\r\n\r\n// Utilities\r\nimport { useBuildingHeaders } from '../utils/Headers'\r\nimport { useIsMobile } from '../../../../hooks/ui/use-mobile'\r\n\r\n// Shadcn Components\r\nimport { DescriptionListItem } from '../../../ui/DescriptionList'\r\nimport { Separator } from '../../../ui/Separator'\r\nimport { toast } from 'sonner'\r\n\r\n// Custom Components\r\nimport AttachedFiles from '../details/AttachedFiles'\r\nimport TabSidebar from '../details/TabSidebar'\r\nimport FieldValue from '../details/FieldValue'\r\nimport FieldRenderer from './FieldRenderer'\r\nimport CheckboxGroup from '../details/CheckboxGroup'\r\nimport UnitsGrid from '../details/UnitsGrid'\r\nimport EnergySourcesGrid from '../details/EnergySourcesGrid'\r\nimport { useUser } from '../../../../hooks/users/users';\r\n\r\ninterface BuildingDetailsProps {\r\n selectedItem?: Building\r\n setSelectedItem?: (building: Building) => void\r\n editing?: boolean\r\n setEditing?: (editing: boolean) => void\r\n setActiveChanges?: (editing: boolean) => void\r\n buildings?: Building[]\r\n activeTab?: string\r\n setActiveTab?: (tab: string) => void\r\n}\r\n\r\n// Create a ref type for the component\r\nexport type BuildingDetailsRef = {\r\n saveChanges: () => Promise<void>\r\n}\r\n\r\nconst BuildingDetails = React.forwardRef<BuildingDetailsRef, BuildingDetailsProps>(({\r\n selectedItem,\r\n setSelectedItem,\r\n editing = false,\r\n setEditing,\r\n setActiveChanges,\r\n buildings,\r\n activeTab,\r\n setActiveTab = () => {},\r\n}, ref) => {\r\n // Session and user data\r\n const { data: session, status } = useSession()\r\n const { user, isLoading, isError, updateUser } = useUser(session?.user?.id || '')\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const isMobile = useIsMobile()\r\n\r\n const buildingHeaders = useBuildingHeaders()\r\n\r\n // Generate tab keys from buildingHeaders\r\n const tabOptions = buildingHeaders.map(section => ({\r\n key: section.title.toLowerCase().replaceAll(/\\s/g, '-'),\r\n label: section.title,\r\n }))\r\n\r\n // const [activeTab, setActiveTab] = React.useState(tabOptions[0].key);\r\n const [editingValues, setEditingValues] = React.useState<Partial<Building>>({})\r\n const [isUpdating, setIsUpdating] = React.useState(false)\r\n\r\n // Find current tab section\r\n const currentTabSection = buildingHeaders.find(\r\n section => section.title.toLowerCase().replaceAll(/\\s/g, '-') === activeTab,\r\n )\r\n\r\n // Use the updated hook only if we have a building ID\r\n const { updateBuilding, building: latestBuilding, isMutating, updateError } = useBuilding(selectedItem?.id || 0)\r\n const { createBuilding } = useCreateBuilding()\r\n\r\n // Fetch attached files for the building\r\n const { files: attachedFiles, isLoading: filesLoading } = useFilesByBuildingId(selectedItem?.id || 0)\r\n\r\n // Calculate total file count\r\n const attachedFilesCount = Array.isArray(attachedFiles) ? attachedFiles.length : 0\r\n\r\n // Create a map of tag to relation property name\r\n const tagToRelationMap: Record<string, string> = {\r\n buildingCodeCompliance: 'buildingBuildingCodeCompliance',\r\n environmentalCompliance: 'buildingEnvironmentalCompliance',\r\n occupancyCertificate: 'buildingOccupancyCertificate',\r\n permitsIssued: 'buildingPermitsIssued',\r\n systemAssessments: 'buildingSystemAssessments',\r\n zoningCompliance: 'buildingZoningCompliance',\r\n certificationsFile: 'buildingCertificationsFile',\r\n energyCodeCompliance: 'buildingEnergyCodeCompliance',\r\n fireSafety: 'buildingFireSafety',\r\n maintenanceRecords: 'buildingMaintenanceRecords',\r\n proximityToServices: 'buildingProximityToServices',\r\n regionalEnergyTrends: 'buildingRegionalEnergyTrends',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n\r\n React.useEffect(() => {\r\n handleApiError(isError)\r\n handleApiError(updateError)\r\n }, [isError, updateError])\r\n\r\n React.useEffect(() => {\r\n if (latestBuilding && selectedItem?.id === latestBuilding.id && setSelectedItem) {\r\n // Only update if we're not currently editing to avoid overwriting user input\r\n if (!editing || Object.keys(editingValues).length === 0) {\r\n const mergedBuilding = { ...latestBuilding }\r\n \r\n // Preserve file relationships from selectedItem if they exist\r\n for (const relationProp of Object.values(tagToRelationMap)) {\r\n const existingFiles = selectedItem[relationProp as keyof Building]\r\n if (existingFiles && Array.isArray(existingFiles) && existingFiles.length > 0) {\r\n (mergedBuilding as any)[relationProp] = existingFiles\r\n }\r\n }\r\n\r\n setSelectedItem(mergedBuilding)\r\n }\r\n }\r\n }, [latestBuilding, editing, editingValues])\r\n\r\n // Update selectedItem with files organized by their relationships\r\n React.useEffect(() => {\r\n if (selectedItem && attachedFiles && Array.isArray(attachedFiles) && setSelectedItem) {\r\n const updatedBuilding = { ...selectedItem }\r\n let hasChanges = false\r\n\r\n // Initialize all file arrays as empty if they don't exist\r\n for (const relationProp of Object.values(tagToRelationMap)) {\r\n if (!updatedBuilding[relationProp as keyof Building]) {\r\n (updatedBuilding as any)[relationProp] = []\r\n }\r\n }\r\n\r\n // Group files by their tags and assign to correct relational properties\r\n for (const file of attachedFiles) {\r\n if (file.tag && tagToRelationMap[file.tag]) {\r\n const relationProp = tagToRelationMap[file.tag]\r\n const currentFiles = (updatedBuilding as any)[relationProp] || []\r\n\r\n // Only add if not already present (avoid duplicates)\r\n const fileExists = currentFiles.some((existingFile: any) =>\r\n existingFile.id === file.id,\r\n )\r\n\r\n if (!fileExists) {\r\n (updatedBuilding as any)[relationProp] = [...currentFiles, file]\r\n hasChanges = true\r\n }\r\n }\r\n }\r\n\r\n // Update the selected item only if there are actual changes\r\n if (hasChanges) {\r\n setSelectedItem(updatedBuilding)\r\n }\r\n }\r\n }, [attachedFiles, selectedItem?.id, setSelectedItem])\r\n\r\n // Handle input changes during editing\r\n const handleInputChange = (key: string, value: any) => {\r\n setEditingValues(prev => ({\r\n ...prev,\r\n [key]: value,\r\n }))\r\n setActiveChanges?.(true)\r\n\r\n if (setSelectedItem && selectedItem) {\r\n setSelectedItem({\r\n ...selectedItem,\r\n [key]: value\r\n })\r\n }\r\n\r\n // If this is a file field change, refresh the files data\r\n if (isFileField(key)) {\r\n // Refresh the files data to show newly uploaded files\r\n mutate(`/api/files/building/${selectedItem?.id}`)\r\n }\r\n }\r\n\r\n // Handle save changes\r\n const handleSaveChanges = async () => {\r\n if (!selectedItem) return\r\n\r\n setIsUpdating(true)\r\n try {\r\n // Check if this is a new building creation (ID < 0)\r\n if (selectedItem.id < 0) {\r\n const buildingData = {\r\n ...selectedItem,\r\n ...editingValues,\r\n }\r\n\r\n delete buildingData.id\r\n\r\n const result = await createBuilding({\r\n buildingData,\r\n organizationId: user?.organizationId ? String(user.organizationId) : null,\r\n })\r\n\r\n // Update the selected building with the newly created one\r\n if (result && setSelectedItem) {\r\n setSelectedItem(result)\r\n }\r\n\r\n setEditingValues({})\r\n setEditing?.(false)\r\n setActiveChanges?.(false)\r\n toast.success('Building created successfully')\r\n }\r\n else {\r\n // This is an update to an existing building\r\n // Filter out file fields from building updates\r\n const buildingUpdates = Object.keys(editingValues).reduce((acc, key) => {\r\n if (!isFileField(key)) {\r\n acc[key] = editingValues[key]\r\n }\r\n return acc\r\n }, {} as Partial<Building>)\r\n\r\n // Check if we have file field changes\r\n const hasFileChanges = Object.keys(editingValues).some(key => isFileField(key))\r\n\r\n // Update building if there are non-file changes\r\n if (Object.keys(buildingUpdates).length > 0) {\r\n const result = await updateBuilding(buildingUpdates)\r\n \r\n // Immediately update local state with the result\r\n if (result && setSelectedItem && selectedItem) {\r\n setSelectedItem({ ...selectedItem, ...result })\r\n }\r\n }\r\n\r\n // Always refresh files data if there were file changes\r\n if (hasFileChanges) {\r\n await mutate(`/api/files/building/${selectedItem.id}`)\r\n }\r\n\r\n // Clear editing state\r\n setEditingValues({})\r\n setEditing?.(false)\r\n setActiveChanges?.(false)\r\n\r\n if (Object.keys(buildingUpdates).length > 0 && hasFileChanges) {\r\n toast.success('Building and files updated successfully')\r\n }\r\n else if (Object.keys(buildingUpdates).length > 0) {\r\n toast.success('Building updated successfully')\r\n }\r\n else if (hasFileChanges) {\r\n toast.success('Files updated successfully')\r\n }\r\n }\r\n }\r\n catch (error) {\r\n console.error('Save error:', error)\r\n if (error?.status !== 401) {\r\n toast.error(selectedItem.id < 0 ? 'Failed to create building' : 'Failed to update building')\r\n }\r\n \r\n }\r\n finally {\r\n setIsUpdating(false)\r\n }\r\n }\r\n\r\n\r\n // Auto-enable editing for new buildings\r\n React.useEffect(() => {\r\n // If this is a new building (negative ID), automatically start in edit mode\r\n if (selectedItem && selectedItem.id < 0 && setEditing) {\r\n setEditing(true)\r\n setActiveChanges?.(true)\r\n }\r\n }, [selectedItem?.id, setEditing, setActiveChanges])\r\n\r\n // Expose methods to parent component\r\n React.useImperativeHandle(ref, () => ({\r\n saveChanges: handleSaveChanges,\r\n }), [selectedItem, editingValues, updateBuilding, createBuilding, setEditing, setActiveChanges])\r\n\r\n // Get current value (edited value or original value)\r\n const getFieldValue = (property: string) => {\r\n return editingValues.hasOwnProperty(property)\r\n ? editingValues[property as keyof Building]\r\n : selectedItem?.[property as keyof Building]\r\n }\r\n\r\n // Check if field is a date field\r\n const isDateField = (property: string): boolean => {\r\n const dateFields = [\r\n 'buildingAirQualityAssessmentDate',\r\n 'buildingEstimatedStartDate', 'buildingEstimatedEndDate',\r\n 'buildingStartDate', 'buildingCompletedDate', 'buildingPermitIssuedDate',\r\n 'buildingAirQualityAssessmentDate', 'conditionRatingsDate',\r\n ]\r\n\r\n return dateFields.includes(property) || property?.toLowerCase().includes('date')\r\n }\r\n // Check if field is an enum field\r\n const isEnumField = (property: string): boolean => {\r\n const enumFields = [\r\n 'buildingCountrySubdivision',\r\n 'buildingAssessmentCondition',\r\n 'buildingGeometryStyle',\r\n 'buildingProjectPhase',\r\n 'buildingProjectType',\r\n 'buildingHeatingEnergySources',\r\n 'buildingCoolingEnergySources',\r\n 'buildingHotWaterSystemsEnergySources',\r\n 'buildingOccupantType',\r\n 'buildingType',\r\n 'buildingAssessmentRatingCondition',\r\n 'buildingManagementType',\r\n 'buildingElectricityServiceSize',\r\n 'buildingElectricityServiceLocation'\r\n ]\r\n\r\n return enumFields.includes(property)\r\n }\r\n\r\n // Get enum type for a property\r\n const getEnumType = (property: string): string | null => {\r\n const enumMappings: Record<string, string> = {\r\n buildingCountrySubdivision: 'CountrySubdivisionData',\r\n buildingAssessmentCondition: 'BuildingAssessmentConditions',\r\n buildingGeometryStyle: 'BuildingGeometryStyle',\r\n buildingProjectPhase: 'BuildingProjectPhase',\r\n buildingProjectType: 'BuildingProjectType',\r\n buildingHeatingCoolingEnergySources: 'BuildingEnergySource',\r\n buildingHotWaterSystemsEnergySources: 'BuildingEnergySource',\r\n buildingOccupantType: 'BuildingOccupantType',\r\n buildingType: 'BuildingTypeEnum',\r\n buildingAssessmentRatingCondition: 'BuildingAssessmentConditions',\r\n buildingManagementType: 'BuildingManagementType',\r\n buildingElectricityServiceSize: 'BuildingElectricityServiceSize',\r\n buildingElectricityServiceLocation: 'BuildingElectricityServiceLocation',\r\n }\r\n\r\n return enumMappings[property] || null\r\n }\r\n\r\n // Check if field should be full width\r\n const isFullWidthField = (property: string): boolean => {\r\n const fullWidthFields = [\r\n 'buildingName', 'buildingAddress', 'buildingParentSiteId',\r\n 'buildingNotes', 'buildingAdditionalInformation',\r\n 'buildingUnitAdditionalInformation', 'buildingEnergyAdditionalInformation',\r\n 'buildingEnvironmentalAdditionalInformation', 'buildingAssessmentDescription',\r\n 'buildingMaintenanceRecords', 'buildingMaintenanceAdditionalInformation',\r\n 'buildingPriorityRetrofits', 'buildingProjectDescription', 'previousUpdates',\r\n 'buildingFundingAdditionalInformation', 'buildingStructuralVulnerabilities',\r\n 'buildingClimateVulnerabilities', 'buildingSafetyConcerns', 'buildingFireSafety',\r\n 'buildingSiteFireCertificate', 'buildingOccupancyCertificate',\r\n 'buildingZoningCompliance', 'buildingEnvironmentalCompliance', 'buildingPermitsIssued',\r\n 'buildingElectricityServiceUpgradeHistory'\r\n ]\r\n return fullWidthFields.includes(property)\r\n }\r\n\r\n // Check if field should use textarea input\r\n const isTextAreaField = (property: string): boolean => {\r\n const textAreaFields = [\r\n 'buildingNotes', 'buildingAdditionalInformation', 'buildingUnitAdditionalInformation',\r\n 'buildingEnergyAdditionalInformation', 'buildingEnvironmentalAdditionalInformation',\r\n 'buildingAssessmentDescription', 'buildingMaintenanceAdditionalInformation',\r\n 'buildingPriorityRetrofits', 'buildingProjectDescription', 'previousUpdates',\r\n 'buildingFundingAdditionalInformation', 'buildingStructuralVulnerabilities',\r\n 'buildingClimateVulnerabilities', 'buildingSafetyConcerns', 'buildingElectricityServiceUpgradeHistory',\r\n ]\r\n return textAreaFields.includes(property)\r\n }\r\n\r\n // Check if field is a file upload field\r\n const isFileField = (property: string): boolean => {\r\n const fileFields = [\r\n 'buildingMaintenanceRecords', 'buildingSystemAssessment', 'buildingFireSafety',\r\n 'buildingSiteFireCertificate', 'buildingOccupancyCertificate', 'buildingEnvironmentalCompliance',\r\n 'buildingZoningCompliance', 'buildingPermitsIssued', 'buildingCertificationsFile',\r\n 'buildingRegionalEnergyTrends', 'buildingEnergyCodeCompliance',\r\n 'buildingOccupancyCertificate', 'occupancyData', 'buildingUnitsMarketRentNum',\r\n 'buildingUnitsMarketRentSqft', 'buildingEnergyAssessmentReports', 'buildingAirQualityReports',\r\n 'buildingWaterQualityReports', 'buildingDSRs', 'buildingBCAs', 'buildingContractorReports',\r\n 'buildingEngineeringAssessments',\r\n ]\r\n return fileFields.includes(property)\r\n }\r\n\r\n // Check if field is a part of the 4-column layout for checkboxes\r\n const isCheckboxGroupField = (property: string): boolean => {\r\n const checkboxGroupFields = [\r\n 'buildingParkingAvailable', 'buildingElevatorAvailable',\r\n 'buildingDryerAvailable', 'buildingWasherAvailable', 'buildingCommonSpace', 'buildingHeatingIncluded',\r\n 'buildingHydroIncluded', 'buildingWaterIncluded', 'buildingUtilitiesIncluded',\r\n 'buildingUnitsModified', 'buildingUnitsMarketRent', 'buildingUnitsSubsidized',\r\n 'buildingUnitsRoom', 'buildingUnitsB', 'buildingUnits1B', 'buildingUnits2B',\r\n 'buildingUnits3B', 'buildingUnits4B', 'buildingUnits5B', 'buildingUnits6B', 'buildingUnitsBelowMarketRent',\r\n 'buildingUnitsRentGearedToIncome'\r\n ]\r\n return checkboxGroupFields.includes(property)\r\n }\r\n\r\n const isNumberField = (property: string): boolean => {\r\n const numberFields = [\r\n 'buildingNorthing', 'buildingTotalSqft', 'buildingFloors', 'buildingUnits',\r\n 'buildingGrossFloorArea', 'buildingNetFloorArea', 'buildingLotSize',\r\n 'buildingUnitsModifiedNum', 'buildingUnitsMarketRentNum', 'buildingUnitsSubsidizedNum',\r\n 'buildingUnitsRoomNum', 'buildingUnitsBNum', 'buildingUnits1BNum',\r\n 'buildingUnits2BNum', 'buildingUnits3BNum', 'buildingUnits4BNum',\r\n 'buildingUnits5BNum', 'buildingUnits6BNum', 'buildingUnitsMarketRentSqft',\r\n 'buildingUnitsBSqft', 'buildingUnits1BSqft', 'buildingUnits2BSqft',\r\n 'buildingUnits3BSqft', 'buildingUnits4BSqft', 'buildingUnits5BSqft', 'buildingUnits6BSqft',\r\n 'buildingUnitsTotal', 'buildingAirQuality', 'buildingAnnualConsumption', 'buildingAssessedValue',\r\n 'buildingOrthogonalHeight', 'buildingOsmId', 'buildingSourceEui', 'buildingWardNumber', 'buildingCensusTract', \r\n 'buildingIntensityGhgEmissions', 'buildingPermitNumber', 'buildingProgramLoan','buildingProjectNumber',\r\n 'buildingRentalMarketSurveyZone', 'buildingSiteEui', 'buildingSolarPotential', 'buildingSubsidies', \r\n 'buildingTotalContribution', 'buildingTotalGhgEmissions', 'buildingTotalRentableArea', 'buildingValueOfFundingFlowed', \r\n 'buildingWaterUseIntensity', 'buildingParentSiteId', 'buildingAssessmentRatingCondition', 'buildingStoreyNum',\r\n 'buildingElectricityServicePanelSize', 'buildingElectricityServiceSize', 'buildingElectricityServiceSize',\r\n 'buildingElectricityServicePanelSize', 'buildingUnitsBelowMarketRentNum', 'buildingUnitsBelowMarketRentSqft',\r\n 'buildingUnitsRentGearedToIncomeNum', 'buildingUnitsRentGearedToIncomeSqft',\r\n // Energy sources grid metrics/years\r\n 'buildingHeatingMetric', 'buildingHeatingInstallationYear',\r\n 'buildingCoolingMetric', 'buildingCoolingInstallationYear',\r\n 'buildingHotWaterSystemsMetric', 'buildingHotWaterSystemsInstallationYear'\r\n ]\r\n\r\n return numberFields.includes(property)\r\n }\r\n\r\n // Render the content for the current tab\r\n const renderTabContent = () => {\r\n if (!selectedItem || !currentTabSection) return null\r\n\r\n return (\r\n <div className=\"flex flex-col gap-6 pt-3\">\r\n {currentTabSection.subsections.map((subsection, subIdx) => {\r\n // Handle special layout for Units Available\r\n if (subsection.specialLayout === 'unitsGrid') {\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {subIdx > 0 && <Separator className=\"mb-6\" />}\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n <UnitsGrid\r\n subsection={subsection}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </div>\r\n )\r\n }\r\n // Handle special layout for Energy Sources Grid\r\n if (subsection.specialLayout === 'energySourcesGrid') {\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {subIdx > 0 && <Separator className=\"mb-6\" />}\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n <EnergySourcesGrid\r\n subsection={subsection}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </div>\r\n )\r\n }\r\n\r\n // Skip checkbox fields that are handled in groups\r\n const processedFields = new Set<number>()\r\n const fieldsToRender = subsection.fields.filter((field, idx) => {\r\n if (processedFields.has(idx)) return false\r\n\r\n if (isCheckboxGroupField(field.property)) {\r\n // Only include the first field of each checkbox group\r\n const groupStartIndex = subsection.fields.findIndex(f => f.property === field.property)\r\n if (groupStartIndex % 5 === 3 && groupStartIndex === idx) {\r\n // Mark the next 4 fields as processed\r\n for (let i = 1; i < 5 && idx + i < subsection.fields.length; i++) {\r\n processedFields.add(idx + i)\r\n }\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n\r\n return (\r\n <div key={subIdx} className=\"\">\r\n {/* Render separator for subsection titles (except for first) */}\r\n {subIdx > 0 && subsection.title && subsection.title !== '' && subsection.title !== 'null'\r\n && <Separator className=\"mb-6\" />}\r\n\r\n <h3 className=\"font-semibold text-base mb-3 text-foreground\">{subsection.title}</h3>\r\n\r\n <div className=\"grid grid-cols-1 [&>*:last-child]:border-b-0\">\r\n {fieldsToRender.map((field, renderIdx) => {\r\n const originalIdx = subsection.fields.findIndex(f => f.property === field.property)\r\n const value = getFieldValue(field.property)\r\n\r\n // Check if this is the start of a checkbox group\r\n if (isCheckboxGroupField(field.property)) {\r\n const checkboxFields = subsection.fields.slice(originalIdx, originalIdx + 5)\r\n return (\r\n <CheckboxGroup\r\n key={renderIdx}\r\n fields={checkboxFields}\r\n getFieldValue={getFieldValue}\r\n handleInputChange={handleInputChange}\r\n editing={editing}\r\n />\r\n )\r\n }\r\n\r\n // Handle full width fields\r\n if (isFullWidthField(field.property)) {\r\n return (\r\n <div key={renderIdx} className={`py-3 w-full ${!editing && 'border-b border-border'}`}>\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{field.label}</div>\r\n <FieldRenderer\r\n property={field.property}\r\n value={value}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem className=\"break-words\" label={field.label}>\r\n <FieldValue\r\n value={value}\r\n label={field.label}\r\n isFile={isFileField(field.property)}\r\n property={field.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Skip full-width fields for pairing logic\r\n if (isFullWidthField(field.property)) {\r\n return null\r\n }\r\n\r\n // Handle regular fields (in pairs)\r\n if (renderIdx % 2 === 0) {\r\n // Start a new row for every pair of fields\r\n const nextField = fieldsToRender[renderIdx + 1]\r\n const nextValue = nextField && !isFullWidthField(nextField.property) ? getFieldValue(nextField.property) : null\r\n\r\n return (\r\n <div key={renderIdx} className={`grid grid-cols-1 md:grid-cols-2 gap-3 py-3 w-full ${!editing && 'border-b border-border'} `}>\r\n {/* First field */}\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-medium text-foreground\">{field.label}</div>\r\n <FieldRenderer\r\n property={field.property}\r\n value={value}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem className=\"break-words\" label={field.label}>\r\n <FieldValue\r\n value={value}\r\n label={field.label}\r\n isFile={isFileField(field.property)}\r\n property={field.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n\r\n <Separator className=\"md:hidden\" />\r\n\r\n {/* Second field (if exists and not full width) */}\r\n {nextField && !isFullWidthField(nextField.property) && (\r\n <>\r\n {editing\r\n ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"text-sm font-semibold text-foreground\">\r\n {nextField.label}\r\n </div>\r\n <FieldRenderer\r\n property={nextField.property}\r\n value={nextValue}\r\n handleInputChange={handleInputChange}\r\n isTextAreaField={isTextAreaField}\r\n isFileField={isFileField}\r\n isDateField={isDateField}\r\n isEnumField={isEnumField}\r\n getEnumType={getEnumType}\r\n isNumberField={isNumberField}\r\n isFullWidthField={isFullWidthField}\r\n buildingId={selectedItem?.id}\r\n setActiveChanges={setActiveChanges}\r\n />\r\n </div>\r\n )\r\n : (\r\n <DescriptionListItem\r\n className=\"break-words\"\r\n label={nextField.label}\r\n >\r\n <FieldValue\r\n value={nextValue}\r\n label={nextField.label}\r\n isFile={isFileField(nextField.property)}\r\n property={nextField.property}\r\n onChange={handleInputChange}\r\n editing={editing}\r\n />\r\n </DescriptionListItem>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n // Skip odd indices for non-full-width fields as they're handled with the previous even index\r\n return null\r\n })}\r\n </div>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n }\r\n\r\n // Mobile: stack the tab picker above the content instead of squeezing them\r\n // into the same row (the desktop layout below is otherwise untouched).\r\n if (isMobile) {\r\n return (\r\n <div className=\"flex flex-col gap-2 p-6 h-full overflow-hidden min-h-0\">\r\n <TabSidebar\r\n activeTab={activeTab}\r\n setActiveTab={setActiveTab}\r\n tabOptions={tabOptions}\r\n attachedFilesCount={attachedFilesCount}\r\n />\r\n\r\n <div className=\"flex-1 flex flex-col overflow-hidden min-h-0\">\r\n <div className=\"flex-shrink-0 pb-2 px-6\">\r\n <p className=\"text-xl text-foreground font-semibold\">{currentTabSection?.title}</p>\r\n </div>\r\n <div className=\"flex-1 min-h-0 px-6 overflow-auto\">\r\n {activeTab === 'attached-files'\r\n ? (\r\n <AttachedFiles\r\n buildingId={selectedItem?.id}\r\n files={attachedFiles}\r\n isLoading={filesLoading}\r\n />\r\n )\r\n : (\r\n selectedItem && renderTabContent()\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-row gap-2 p-6 h-full overflow-hidden\">\r\n {/* Sidebar */}\r\n <TabSidebar\r\n activeTab={activeTab}\r\n setActiveTab={setActiveTab}\r\n tabOptions={tabOptions}\r\n attachedFilesCount={attachedFilesCount}\r\n />\r\n\r\n <Separator orientation=\"vertical\" />\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 flex flex-col overflow-hidden\">\r\n {/* Header */}\r\n <div className=\"flex-shrink-0 pb-2 px-6\">\r\n <p className=\"text-xl text-foreground font-semibold\">{currentTabSection?.title}</p>\r\n </div>\r\n <div className=\"flex-1 px-6 overflow-auto\">\r\n {activeTab === 'attached-files'\r\n ? (\r\n <AttachedFiles\r\n buildingId={selectedItem?.id}\r\n files={attachedFiles}\r\n isLoading={filesLoading}\r\n />\r\n )\r\n : (\r\n selectedItem && renderTabContent()\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n})\r\n\r\nBuildingDetails.displayName = 'BuildingDetails'\r\n\r\nexport default BuildingDetails"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwCzB,eAAO,MAAM,gBAAgB,gHAOnB,CAAA;AAEV,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,GAAG,CAAA;IACV,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACzD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED,QAAA,MAAM,aAAa,GAAI,6KAapB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwCzB,eAAO,MAAM,gBAAgB,gHAOnB,CAAA;AAEV,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,GAAG,CAAA;IACV,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACzD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED,QAAA,MAAM,aAAa,GAAI,6KAapB,kBAAkB,sBAknBpB,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -56,7 +56,7 @@ const FieldRenderer = ({
|
|
|
56
56
|
buildingId,
|
|
57
57
|
setActiveChanges
|
|
58
58
|
}) => {
|
|
59
|
-
var _a;
|
|
59
|
+
var _a, _b;
|
|
60
60
|
const t = useTranslations("BuildingFieldRenderer");
|
|
61
61
|
const { state: mapState } = useMapContext();
|
|
62
62
|
const countrySubdivisionsData = (_a = mapState.map.countrySubdivisionsData) != null ? _a : {};
|
|
@@ -265,12 +265,12 @@ const FieldRenderer = ({
|
|
|
265
265
|
}
|
|
266
266
|
if (enumType === "CountrySubdivisionData") {
|
|
267
267
|
const resolveSubdivisionName = (code) => {
|
|
268
|
-
var _a2,
|
|
268
|
+
var _a2, _b2, _c;
|
|
269
269
|
if (!code || !countrySubdivisionsData) return code;
|
|
270
270
|
const exact = countrySubdivisionsData[code];
|
|
271
271
|
if (exact) return ((_a2 = exact == null ? void 0 : exact.name) != null ? _a2 : exact) || code;
|
|
272
272
|
const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`));
|
|
273
|
-
if (entry) return ((_c = (
|
|
273
|
+
if (entry) return ((_c = (_b2 = entry[1]) == null ? void 0 : _b2.name) != null ? _c : entry[1]) || code;
|
|
274
274
|
return code;
|
|
275
275
|
};
|
|
276
276
|
return /* @__PURE__ */ jsxs(
|
|
@@ -433,18 +433,17 @@ const FieldRenderer = ({
|
|
|
433
433
|
if (property === "buildingParentSiteId" && setActiveChanges) {
|
|
434
434
|
const { sites, isLoading } = useSites();
|
|
435
435
|
const [search, setSearch] = React.useState("");
|
|
436
|
-
const
|
|
436
|
+
const selectedId = Array.isArray(value) ? (_b = value[0]) != null ? _b : null : value != null ? value : null;
|
|
437
437
|
const filteredSites = React.useMemo(() => {
|
|
438
438
|
if (!sites) return [];
|
|
439
|
-
if (!search) return sites;
|
|
440
439
|
const lower = search.toLowerCase();
|
|
441
440
|
return sites.filter(
|
|
442
441
|
(site) => site.siteName && site.siteName.toLowerCase().includes(lower) || site.siteAddress && site.siteAddress.toLowerCase().includes(lower)
|
|
443
442
|
);
|
|
444
443
|
}, [sites, search]);
|
|
445
|
-
const
|
|
444
|
+
const selectedSite = (sites == null ? void 0 : sites.find((site) => site.id === selectedId)) || null;
|
|
446
445
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
447
|
-
/* @__PURE__ */ jsxs(Command, { children: [
|
|
446
|
+
/* @__PURE__ */ jsxs(Command, { shouldFilter: false, children: [
|
|
448
447
|
/* @__PURE__ */ jsx(
|
|
449
448
|
CommandInput,
|
|
450
449
|
{
|
|
@@ -454,7 +453,7 @@ const FieldRenderer = ({
|
|
|
454
453
|
disabled: isLoading
|
|
455
454
|
}
|
|
456
455
|
),
|
|
457
|
-
/* @__PURE__ */ jsxs(CommandList, { children: [
|
|
456
|
+
search.trim() !== "" && /* @__PURE__ */ jsxs(CommandList, { children: [
|
|
458
457
|
isLoading && /* @__PURE__ */ jsx(CommandEmpty, { children: /* @__PURE__ */ jsx(LoadingSpinner, {}) }),
|
|
459
458
|
!isLoading && filteredSites.length === 0 && /* @__PURE__ */ jsx(CommandEmpty, { children: t("empty") }),
|
|
460
459
|
/* @__PURE__ */ jsx(CommandGroup, { children: filteredSites.map((site) => /* @__PURE__ */ jsx(
|
|
@@ -462,11 +461,9 @@ const FieldRenderer = ({
|
|
|
462
461
|
{
|
|
463
462
|
value: site.id.toString(),
|
|
464
463
|
onSelect: () => {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
464
|
+
handleInputChange(property, site.id);
|
|
465
|
+
setSearch("");
|
|
468
466
|
},
|
|
469
|
-
disabled: selectedIds.includes(site.id),
|
|
470
467
|
children: /* @__PURE__ */ jsxs("div", { children: [
|
|
471
468
|
/* @__PURE__ */ jsx("div", { className: "font-medium", children: site.siteName }),
|
|
472
469
|
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: site.siteAddress })
|
|
@@ -476,22 +473,20 @@ const FieldRenderer = ({
|
|
|
476
473
|
)) })
|
|
477
474
|
] })
|
|
478
475
|
] }),
|
|
479
|
-
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children:
|
|
480
|
-
|
|
476
|
+
selectedSite && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: /* @__PURE__ */ jsxs(Badge, { className: "gap-1", variant: "secondary", children: [
|
|
477
|
+
selectedSite.siteName,
|
|
481
478
|
/* @__PURE__ */ jsx(
|
|
482
479
|
Button,
|
|
483
480
|
{
|
|
484
481
|
variant: "ghost",
|
|
485
482
|
size: "icon",
|
|
486
483
|
className: "p-0 hover:bg-transparent w-auto h-auto",
|
|
487
|
-
onClick: () =>
|
|
488
|
-
handleInputChange(property, selectedIds.filter((id) => id !== site.id));
|
|
489
|
-
},
|
|
484
|
+
onClick: () => handleInputChange(property, null),
|
|
490
485
|
disabled: !ability.can("update", "Building"),
|
|
491
486
|
children: /* @__PURE__ */ jsx(X, { className: "!w-3 !h-3", size: 8 })
|
|
492
487
|
}
|
|
493
488
|
)
|
|
494
|
-
] }
|
|
489
|
+
] }) })
|
|
495
490
|
] });
|
|
496
491
|
}
|
|
497
492
|
if (isTextAreaField(property)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport {\r\n BuildingAssessmentConditions,\r\n BuildingGeometryStyle,\r\n BuildingProjectPhase,\r\n BuildingProjectType,\r\n BuildingEnergySource,\r\n BuildingOccupantType,\r\n BuildingManagementType,\r\n BuildingHeatingEnergySource,\r\n BuildingCoolingEnergySource,\r\n BuildingHotWaterEnergySource,\r\n BuildingElectricityServiceSize,\r\n BuildingElectricityServiceLocation,\r\n} from '../../../../types/dbTypes'\r\n\r\nimport { useSites } from '../../../../hooks/sites/sites'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions, useMapContext } from '../../../../store'\r\n\r\nimport { Checkbox } from '../../../ui/Checkbox'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Textarea } from '../../../ui/Textarea'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Badge } from '../../../ui/Badge'\r\nimport { DatePicker } from '../../../ui/DatePicker'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../../ui/Select'\r\nimport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../../../ui/Command'\r\n\r\nimport FileUpload from '../details/FileUpload'\r\n\r\nimport { Plus, X } from 'lucide-react'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\nexport const BuildingTypeEnum = [\r\n 'Townhouses',\r\n '<4 Storey MURB',\r\n '4+ Storey MURB',\r\n 'Stacked Townhouses',\r\n 'Detached',\r\n 'Semi Detached',\r\n] as const\r\n\r\ninterface FieldRendererProps {\r\n property: string\r\n value: any\r\n handleInputChange: (property: string, value: any) => void\r\n isTextAreaField: (property: string) => boolean\r\n isFileField: (property: string) => boolean\r\n isDateField?: (property: string) => boolean\r\n isEnumField?: (property: string) => boolean\r\n isNumberField?: (property: string) => boolean\r\n isFullWidthField?: (property: string) => boolean\r\n getEnumType?: (property: string) => string | null\r\n buildingId?: number\r\n setActiveChanges?: (editing: boolean) => void\r\n}\r\n\r\nconst FieldRenderer = ({\r\n property,\r\n value,\r\n handleInputChange,\r\n isTextAreaField,\r\n isFileField,\r\n isDateField = () => false,\r\n isEnumField = () => false,\r\n isNumberField = () => false,\r\n isFullWidthField = () => false,\r\n getEnumType = () => null,\r\n buildingId,\r\n setActiveChanges,\r\n}: FieldRendererProps) => {\r\n const t = useTranslations('BuildingFieldRenderer')\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData ?? {}\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const getFileTagFromProperty = (property: string): string => {\r\n const propertyToTagMap: Record<string, string> = {\r\n buildingMaintenanceRecords: 'maintenanceRecords',\r\n buildingSystemAssessment: 'systemAssessments',\r\n buildingFireSafety: 'fireSafety',\r\n buildingOccupancyCertificate: 'occupancyCertificate',\r\n buildingEnvironmentalCompliance: 'environmentalCompliance',\r\n buildingZoningCompliance: 'zoningCompliance',\r\n buildingPermitsIssued: 'permitsIssued',\r\n buildingCertificationsFile: 'certificationsFile',\r\n buildingRegionalEnergyTrends: 'regionalEnergyTrends',\r\n buildingEnergyCodeCompliance: 'energyCodeCompliance',\r\n buildingBuildingCodeCompliance: 'buildingCodeCompliance',\r\n buildingProximityToServices: 'proximityToServices',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n return propertyToTagMap[property] || property\r\n }\r\n\r\n // Special handling for energy source arrays\r\n if (property === 'buildingHeatingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select heating source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHeatingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingCoolingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select cooling source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingCoolingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingHotWaterSystemsEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select hot water source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHotWaterEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isFileField(property)) {\r\n return (\r\n <FileUpload\r\n value={Array.isArray(value) ? value : []}\r\n property={property}\r\n tag={getFileTagFromProperty(property)}\r\n onChange={handleInputChange}\r\n editing={true}\r\n buildingId={buildingId}\r\n onFileUpload={() => setActiveChanges?.(true)}\r\n isFullWidthField={isFullWidthField(property)}\r\n />\r\n )\r\n }\r\n\r\n if (isDateField(property)) {\r\n return (\r\n <DatePicker\r\n date={value instanceof Date ? value : (value ? new Date(value) : undefined)}\r\n onSelect={date => handleInputChange(property, date)}\r\n />\r\n )\r\n }\r\n\r\n if (isEnumField(property)) {\r\n const enumType = getEnumType(property)\r\n\r\n // Multiselect for building type\r\n if (property === 'buildingType') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={(newType) => {\r\n if (!selectedValues.includes(newType)) {\r\n handleInputChange(property, [...selectedValues, newType])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select building type(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum\r\n .filter(type => !selectedValues.includes(type))\r\n .map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (enumType === 'CountrySubdivisionData') {\r\n // Resolve display name — handles both full (\"CA-ON\") and short (\"ON\") stored codes\r\n const resolveSubdivisionName = (code: string): string => {\r\n if (!code || !countrySubdivisionsData) return code\r\n const exact = countrySubdivisionsData[code] as any\r\n if (exact) return (exact?.name ?? exact) || code\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`))\r\n if (entry) return ((entry[1] as any)?.name ?? entry[1]) || code\r\n return code\r\n }\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select subdivision\">\r\n {value ? resolveSubdivisionName(value) : undefined}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.entries(countrySubdivisionsData).map(([code, sub]) => (\r\n <SelectItem key={code} value={code}>\r\n {(sub as any)?.name ?? code}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingAssessmentConditions') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select assessment condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(condition => (\r\n <SelectItem key={condition} value={condition}>\r\n {condition.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingGeometryStyle') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select geometry style\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingGeometryStyle).map(style => (\r\n <SelectItem key={style} value={style}>\r\n {style}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectPhase') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project phase\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectPhase).map(phase => (\r\n <SelectItem key={phase} value={phase}>\r\n {phase.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingOccupantType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select occupant type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingOccupantType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'buildingAssessmentRatingCondition') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select rating condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingManagementType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingManagementType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum.map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingElectricityServiceSize') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceSize).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+').replace('Size', '')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n if (enumType === 'BuildingElectricityServiceLocation') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceLocation).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n }\r\n \r\n \r\n\r\n if (property === 'buildingParentSiteId' && setActiveChanges) {\r\n const { sites, isLoading } = useSites()\r\n const [search, setSearch] = React.useState('')\r\n const selectedIds = Array.isArray(value) ? value : (value ? [value] : [])\r\n const filteredSites = React.useMemo(() => {\r\n if (!sites) return []\r\n if (!search) return sites\r\n const lower = search.toLowerCase()\r\n return sites.filter(site =>\r\n (site.siteName && site.siteName.toLowerCase().includes(lower))\r\n || (site.siteAddress && site.siteAddress.toLowerCase().includes(lower)),\r\n )\r\n }, [sites, search])\r\n const selectedSites = sites?.filter(site => selectedIds.includes(site.id)) || []\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Command>\r\n <CommandInput\r\n placeholder=\"Search for a site...\"\r\n value={search}\r\n onValueChange={setSearch}\r\n disabled={isLoading}\r\n />\r\n <CommandList>\r\n {isLoading && <CommandEmpty><LoadingSpinner /></CommandEmpty>}\r\n {!isLoading && filteredSites.length === 0 && (\r\n <CommandEmpty>{t('empty')}</CommandEmpty>\r\n )}\r\n <CommandGroup>\r\n {filteredSites.map(site => (\r\n <CommandItem\r\n key={site.id}\r\n value={site.id.toString()}\r\n onSelect={() => {\r\n if (!selectedIds.includes(site.id)) {\r\n handleInputChange(property, [...selectedIds, site.id])\r\n }\r\n }}\r\n disabled={selectedIds.includes(site.id)}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{site.siteName}</div>\r\n <div className=\"text-xs text-muted-foreground\">{site.siteAddress}</div>\r\n </div>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedSites.map(site => (\r\n <Badge key={site.id} className=\"gap-1\" variant=\"secondary\">\r\n {site.siteName}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n handleInputChange(property, selectedIds.filter(id => id !== site.id))\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isTextAreaField(property)) {\r\n return (\r\n <Textarea\r\n value={value || ''}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n rows={4}\r\n />\r\n )\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return (\r\n <>\r\n <div className=\"flex flex-row gap-2\">\r\n <Input\r\n type=\"text\"\r\n value=\"\"\r\n onChange={() => {}}\r\n placeholder=\"Add new item\"\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" disabled={!ability.can('update', 'Building')}><Plus /></Button>\r\n </div>\r\n {/* Render Existing values */}\r\n <div className=\"flex flex-row gap-2\">\r\n {(value || []).map((item: string, index: number) => (\r\n <Badge key={index} className=\"cursor-pointer inline-flex\" variant=\"secondary\">\r\n {item}\r\n </Badge>\r\n ))}\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n if (value === 'yes' || value === 'no') {\r\n const bool = value === 'yes'\r\n return (\r\n <Checkbox\r\n checked={bool}\r\n onCheckedChange={checked => handleInputChange(property, checked ? 'yes' : 'no')}\r\n />\r\n )\r\n }\r\n\r\n if (typeof value === 'number' || (value === null && isNumberField(property))) {\r\n return (\r\n <Input\r\n type=\"number\"\r\n value={value === null || value === undefined ? '' : value}\r\n onChange={(e) => {\r\n const stringValue = e.target.value\r\n const numValue = stringValue === '' ? null : Number(stringValue)\r\n handleInputChange(property, numValue)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <Input\r\n value={String(value || '')}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n}\r\n\r\nexport default FieldRenderer"],"mappings":"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","names":["property","t","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport {\r\n BuildingAssessmentConditions,\r\n BuildingGeometryStyle,\r\n BuildingProjectPhase,\r\n BuildingProjectType,\r\n BuildingEnergySource,\r\n BuildingOccupantType,\r\n BuildingManagementType,\r\n BuildingHeatingEnergySource,\r\n BuildingCoolingEnergySource,\r\n BuildingHotWaterEnergySource,\r\n BuildingElectricityServiceSize,\r\n BuildingElectricityServiceLocation,\r\n} from '../../../../types/dbTypes'\r\n\r\nimport { useSites } from '../../../../hooks/sites/sites'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions, useMapContext } from '../../../../store'\r\n\r\nimport { Checkbox } from '../../../ui/Checkbox'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Textarea } from '../../../ui/Textarea'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Badge } from '../../../ui/Badge'\r\nimport { DatePicker } from '../../../ui/DatePicker'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../../ui/Select'\r\nimport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../../../ui/Command'\r\n\r\nimport FileUpload from '../details/FileUpload'\r\n\r\nimport { Plus, X } from 'lucide-react'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\nexport const BuildingTypeEnum = [\r\n 'Townhouses',\r\n '<4 Storey MURB',\r\n '4+ Storey MURB',\r\n 'Stacked Townhouses',\r\n 'Detached',\r\n 'Semi Detached',\r\n] as const\r\n\r\ninterface FieldRendererProps {\r\n property: string\r\n value: any\r\n handleInputChange: (property: string, value: any) => void\r\n isTextAreaField: (property: string) => boolean\r\n isFileField: (property: string) => boolean\r\n isDateField?: (property: string) => boolean\r\n isEnumField?: (property: string) => boolean\r\n isNumberField?: (property: string) => boolean\r\n isFullWidthField?: (property: string) => boolean\r\n getEnumType?: (property: string) => string | null\r\n buildingId?: number\r\n setActiveChanges?: (editing: boolean) => void\r\n}\r\n\r\nconst FieldRenderer = ({\r\n property,\r\n value,\r\n handleInputChange,\r\n isTextAreaField,\r\n isFileField,\r\n isDateField = () => false,\r\n isEnumField = () => false,\r\n isNumberField = () => false,\r\n isFullWidthField = () => false,\r\n getEnumType = () => null,\r\n buildingId,\r\n setActiveChanges,\r\n}: FieldRendererProps) => {\r\n const t = useTranslations('BuildingFieldRenderer')\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData ?? {}\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const getFileTagFromProperty = (property: string): string => {\r\n const propertyToTagMap: Record<string, string> = {\r\n buildingMaintenanceRecords: 'maintenanceRecords',\r\n buildingSystemAssessment: 'systemAssessments',\r\n buildingFireSafety: 'fireSafety',\r\n buildingOccupancyCertificate: 'occupancyCertificate',\r\n buildingEnvironmentalCompliance: 'environmentalCompliance',\r\n buildingZoningCompliance: 'zoningCompliance',\r\n buildingPermitsIssued: 'permitsIssued',\r\n buildingCertificationsFile: 'certificationsFile',\r\n buildingRegionalEnergyTrends: 'regionalEnergyTrends',\r\n buildingEnergyCodeCompliance: 'energyCodeCompliance',\r\n buildingBuildingCodeCompliance: 'buildingCodeCompliance',\r\n buildingProximityToServices: 'proximityToServices',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n return propertyToTagMap[property] || property\r\n }\r\n\r\n // Special handling for energy source arrays\r\n if (property === 'buildingHeatingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select heating source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHeatingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingCoolingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select cooling source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingCoolingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingHotWaterSystemsEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select hot water source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHotWaterEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isFileField(property)) {\r\n return (\r\n <FileUpload\r\n value={Array.isArray(value) ? value : []}\r\n property={property}\r\n tag={getFileTagFromProperty(property)}\r\n onChange={handleInputChange}\r\n editing={true}\r\n buildingId={buildingId}\r\n onFileUpload={() => setActiveChanges?.(true)}\r\n isFullWidthField={isFullWidthField(property)}\r\n />\r\n )\r\n }\r\n\r\n if (isDateField(property)) {\r\n return (\r\n <DatePicker\r\n date={value instanceof Date ? value : (value ? new Date(value) : undefined)}\r\n onSelect={date => handleInputChange(property, date)}\r\n />\r\n )\r\n }\r\n\r\n if (isEnumField(property)) {\r\n const enumType = getEnumType(property)\r\n\r\n // Multiselect for building type\r\n if (property === 'buildingType') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={(newType) => {\r\n if (!selectedValues.includes(newType)) {\r\n handleInputChange(property, [...selectedValues, newType])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select building type(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum\r\n .filter(type => !selectedValues.includes(type))\r\n .map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (enumType === 'CountrySubdivisionData') {\r\n // Resolve display name — handles both full (\"CA-ON\") and short (\"ON\") stored codes\r\n const resolveSubdivisionName = (code: string): string => {\r\n if (!code || !countrySubdivisionsData) return code\r\n const exact = countrySubdivisionsData[code] as any\r\n if (exact) return (exact?.name ?? exact) || code\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`))\r\n if (entry) return ((entry[1] as any)?.name ?? entry[1]) || code\r\n return code\r\n }\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select subdivision\">\r\n {value ? resolveSubdivisionName(value) : undefined}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.entries(countrySubdivisionsData).map(([code, sub]) => (\r\n <SelectItem key={code} value={code}>\r\n {(sub as any)?.name ?? code}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingAssessmentConditions') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select assessment condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(condition => (\r\n <SelectItem key={condition} value={condition}>\r\n {condition.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingGeometryStyle') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select geometry style\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingGeometryStyle).map(style => (\r\n <SelectItem key={style} value={style}>\r\n {style}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectPhase') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project phase\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectPhase).map(phase => (\r\n <SelectItem key={phase} value={phase}>\r\n {phase.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingOccupantType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select occupant type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingOccupantType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'buildingAssessmentRatingCondition') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select rating condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingManagementType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingManagementType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum.map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingElectricityServiceSize') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceSize).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+').replace('Size', '')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n if (enumType === 'BuildingElectricityServiceLocation') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceLocation).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n }\r\n \r\n \r\n\r\n if (property === 'buildingParentSiteId' && setActiveChanges) {\r\n const { sites, isLoading } = useSites()\r\n const [search, setSearch] = React.useState('')\r\n // A building has a single parent site (buildingParentSiteId is a scalar FK),\r\n // so this is single-select: pick one, show it once, X clears it.\r\n const selectedId = Array.isArray(value) ? (value[0] ?? null) : (value ?? null)\r\n const filteredSites = React.useMemo(() => {\r\n if (!sites) return []\r\n const lower = search.toLowerCase()\r\n return sites.filter(site =>\r\n (site.siteName && site.siteName.toLowerCase().includes(lower))\r\n || (site.siteAddress && site.siteAddress.toLowerCase().includes(lower)),\r\n )\r\n }, [sites, search])\r\n const selectedSite = sites?.find(site => site.id === selectedId) || null\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Command shouldFilter={false}>\r\n <CommandInput\r\n placeholder=\"Search for a site...\"\r\n value={search}\r\n onValueChange={setSearch}\r\n disabled={isLoading}\r\n />\r\n {search.trim() !== '' && (\r\n <CommandList>\r\n {isLoading && <CommandEmpty><LoadingSpinner /></CommandEmpty>}\r\n {!isLoading && filteredSites.length === 0 && (\r\n <CommandEmpty>{t('empty')}</CommandEmpty>\r\n )}\r\n <CommandGroup>\r\n {filteredSites.map(site => (\r\n <CommandItem\r\n key={site.id}\r\n value={site.id.toString()}\r\n onSelect={() => {\r\n handleInputChange(property, site.id)\r\n setSearch('')\r\n }}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{site.siteName}</div>\r\n <div className=\"text-xs text-muted-foreground\">{site.siteAddress}</div>\r\n </div>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n )}\r\n </Command>\r\n {selectedSite && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n <Badge className=\"gap-1\" variant=\"secondary\">\r\n {selectedSite.siteName}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => handleInputChange(property, null)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (isTextAreaField(property)) {\r\n return (\r\n <Textarea\r\n value={value || ''}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n rows={4}\r\n />\r\n )\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return (\r\n <>\r\n <div className=\"flex flex-row gap-2\">\r\n <Input\r\n type=\"text\"\r\n value=\"\"\r\n onChange={() => {}}\r\n placeholder=\"Add new item\"\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" disabled={!ability.can('update', 'Building')}><Plus /></Button>\r\n </div>\r\n {/* Render Existing values */}\r\n <div className=\"flex flex-row gap-2\">\r\n {(value || []).map((item: string, index: number) => (\r\n <Badge key={index} className=\"cursor-pointer inline-flex\" variant=\"secondary\">\r\n {item}\r\n </Badge>\r\n ))}\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n if (value === 'yes' || value === 'no') {\r\n const bool = value === 'yes'\r\n return (\r\n <Checkbox\r\n checked={bool}\r\n onCheckedChange={checked => handleInputChange(property, checked ? 'yes' : 'no')}\r\n />\r\n )\r\n }\r\n\r\n if (typeof value === 'number' || (value === null && isNumberField(property))) {\r\n return (\r\n <Input\r\n type=\"number\"\r\n value={value === null || value === undefined ? '' : value}\r\n onChange={(e) => {\r\n const stringValue = e.target.value\r\n const numValue = stringValue === '' ? null : Number(stringValue)\r\n handleInputChange(property, numValue)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <Input\r\n value={String(value || '')}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n}\r\n\r\nexport default FieldRenderer"],"mappings":";AAwHQ,SAqhBF,UA3gBM,KAVJ;AAnHR,OAAO,WAAW;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,qBAAqB;AAE9C,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,cAAc,aAAa,cAAc,cAAc,mBAAmB;AAE5F,OAAO,gBAAgB;AAEvB,SAAS,MAAM,SAAS;AACxB,SAAS,sBAAsB;AAExB,MAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiBA,MAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,MAAM;AAAA,EACpB,cAAc,MAAM;AAAA,EACpB,gBAAgB,MAAM;AAAA,EACtB,mBAAmB,MAAM;AAAA,EACzB,cAAc,MAAM;AAAA,EACpB;AAAA,EACA;AACF,MAA0B;AAlF1B;AAmFE,QAAM,IAAI,gBAAgB,uBAAuB;AACjD,QAAM,EAAE,OAAO,SAAS,IAAI,cAAc;AAC1C,QAAM,2BAA0B,cAAS,IAAI,4BAAb,YAAwC,CAAC;AAGzE,QAAM,EAAE,QAAQ,IAAI,eAAe;AAEnC,QAAM,yBAAyB,CAACA,cAA6B;AAC3D,UAAM,mBAA2C;AAAA,MAC/C,4BAA4B;AAAA,MAC5B,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,MACpB,8BAA8B;AAAA,MAC9B,iCAAiC;AAAA,MACjC,0BAA0B;AAAA,MAC1B,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,8BAA8B;AAAA,MAC9B,8BAA8B;AAAA,MAC9B,gCAAgC;AAAA,MAChC,6BAA6B;AAAA,MAC7B,yBAAyB;AAAA,MACzB,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,IAC1B;AACA,WAAO,iBAAiBA,SAAQ,KAAKA;AAAA,EACvC;AAGA,MAAI,aAAa,gCAAgC;AAC/C,UAAM,iBAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACvD,WACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,eAAe,SAAO;AACpB,gBAAI,CAAC,eAAe,SAAS,GAAG,GAAG;AACjC,gCAAkB,UAAU,CAAC,GAAG,gBAAgB,GAAG,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,UACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,4BAA2B,GACtD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,2BAA2B,EAAE,OAAO,UAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,EAAE,IAAI,UAC7F,oBAAC,cAAsB,OAAO,MAAO,eAAK,WAAW,KAAK,GAAG,KAA5C,IAA8C,CAChE,GACH;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,SAAI,WAAU,wBACZ,yBAAe,IAAI,UAClB,qBAAC,SAAiB,WAAU,SAAQ,SAAQ,aACzC;AAAA,aAAK,WAAW,KAAK,GAAG;AAAA,QACzB;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,oBAAM,UAAU,eAAe,OAAO,CAAAC,OAAKA,OAAM,IAAI;AACrD,gCAAkB,UAAU,OAAO;AAAA,YACrC;AAAA,YACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,YAE3C,8BAAC,KAAE,WAAU,aAAY,MAAM,GAAG;AAAA;AAAA,QACpC;AAAA,WAbU,IAcZ,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,aAAa,gCAAgC;AAC/C,UAAM,iBAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACvD,WACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,eAAe,SAAO;AACpB,gBAAI,CAAC,eAAe,SAAS,GAAG,GAAG;AACjC,gCAAkB,UAAU,CAAC,GAAG,gBAAgB,GAAG,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,UACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,4BAA2B,GACtD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,2BAA2B,EAAE,OAAO,UAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,EAAE,IAAI,UAC7F,oBAAC,cAAsB,OAAO,MAAO,eAAK,WAAW,KAAK,GAAG,KAA5C,IAA8C,CAChE,GACH;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,SAAI,WAAU,wBACZ,yBAAe,IAAI,UAClB,qBAAC,SAAiB,WAAU,SAAQ,SAAQ,aACzC;AAAA,aAAK,WAAW,KAAK,GAAG;AAAA,QACzB;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,oBAAM,UAAU,eAAe,OAAO,CAAAA,OAAKA,OAAM,IAAI;AACrD,gCAAkB,UAAU,OAAO;AAAA,YACrC;AAAA,YACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,YAE3C,8BAAC,KAAE,WAAU,aAAY,MAAM,GAAG;AAAA;AAAA,QACpC;AAAA,WAbU,IAcZ,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AACA,MAAI,aAAa,wCAAwC;AACvD,UAAM,iBAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACvD,WACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,eAAe,SAAO;AACpB,gBAAI,CAAC,eAAe,SAAS,GAAG,GAAG;AACjC,gCAAkB,UAAU,CAAC,GAAG,gBAAgB,GAAG,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,UACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,8BAA6B,GACxD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,4BAA4B,EAAE,OAAO,UAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,EAAE,IAAI,UAC9F,oBAAC,cAAsB,OAAO,MAAO,eAAK,WAAW,KAAK,GAAG,KAA5C,IAA8C,CAChE,GACH;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,SAAI,WAAU,wBACZ,yBAAe,IAAI,UAClB,qBAAC,SAAiB,WAAU,SAAQ,SAAQ,aACzC;AAAA,aAAK,WAAW,KAAK,GAAG;AAAA,QACzB;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,oBAAM,UAAU,eAAe,OAAO,CAAAA,OAAKA,OAAM,IAAI;AACrD,gCAAkB,UAAU,OAAO;AAAA,YACrC;AAAA,YACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,YAE3C,8BAAC,KAAE,WAAU,aAAY,MAAM,GAAG;AAAA;AAAA,QACpC;AAAA,WAbU,IAcZ,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,YAAY,QAAQ,GAAG;AACzB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAAA,QACvC;AAAA,QACA,KAAK,uBAAuB,QAAQ;AAAA,QACpC,UAAU;AAAA,QACV,SAAS;AAAA,QACT;AAAA,QACA,cAAc,MAAM,qDAAmB;AAAA,QACvC,kBAAkB,iBAAiB,QAAQ;AAAA;AAAA,IAC7C;AAAA,EAEJ;AAEA,MAAI,YAAY,QAAQ,GAAG;AACzB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,iBAAiB,OAAO,QAAS,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,QACjE,UAAU,UAAQ,kBAAkB,UAAU,IAAI;AAAA;AAAA,IACpD;AAAA,EAEJ;AAEA,MAAI,YAAY,QAAQ,GAAG;AACzB,UAAM,WAAW,YAAY,QAAQ;AAGrC,QAAI,aAAa,gBAAgB;AAC/B,YAAM,iBAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACvD,aACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,eAAe,CAAC,YAAY;AAC1B,kBAAI,CAAC,eAAe,SAAS,OAAO,GAAG;AACrC,kCAAkB,UAAU,CAAC,GAAG,gBAAgB,OAAO,CAAC;AAAA,cAC1D;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,YAE3C;AAAA,kCAAC,iBACC,8BAAC,eAAY,aAAY,2BAA0B,GACrD;AAAA,cACA,oBAAC,iBACE,2BACE,OAAO,UAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,EAC7C,IAAI,UACH,oBAAC,cAAsB,OAAO,MAC3B,kBADc,IAEjB,CACD,GACL;AAAA;AAAA;AAAA,QACF;AAAA,QACA,oBAAC,SAAI,WAAU,wBACZ,yBAAe,IAAI,UAClB,qBAAC,SAAiB,WAAU,SAAQ,SAAQ,aACzC;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM;AACb,sBAAM,UAAU,eAAe,OAAO,CAAAA,OAAKA,OAAM,IAAI;AACrD,kCAAkB,UAAU,OAAO;AAAA,cACrC;AAAA,cACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,cAE3C,8BAAC,KAAE,WAAU,aAAY,MAAM,GAAG;AAAA;AAAA,UACpC;AAAA,aAbU,IAcZ,CACD,GACH;AAAA,SACF;AAAA,IAEJ;AAEA,QAAI,aAAa,0BAA0B;AAEzC,YAAM,yBAAyB,CAAC,SAAyB;AAxU/D,YAAAC,KAAAC,KAAA;AAyUQ,YAAI,CAAC,QAAQ,CAAC,wBAAyB,QAAO;AAC9C,cAAM,QAAQ,wBAAwB,IAAI;AAC1C,YAAI,MAAO,UAAQD,MAAA,+BAAO,SAAP,OAAAA,MAAe,UAAU;AAC5C,cAAM,QAAQ,OAAO,QAAQ,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;AAC1F,YAAI,MAAO,UAAS,MAAAC,MAAA,MAAM,CAAC,MAAP,gBAAAA,IAAkB,SAAlB,YAA0B,MAAM,CAAC,MAAM;AAC3D,eAAO;AAAA,MACT;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,sBACtB,kBAAQ,uBAAuB,KAAK,IAAI,QAC3C,GACF;AAAA,YACA,oBAAC,iBACE,iBAAO,QAAQ,uBAAuB,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAG;AA5VvE,kBAAAD;AA6Vc,yCAAC,cAAsB,OAAO,MAC1B,WAAAA,MAAA,2BAAa,SAAb,OAAAA,MAAqB,QADR,IAEjB;AAAA,aACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,gCAAgC;AAC/C,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,+BAA8B,GACzD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,4BAA4B,EAAE,IAAI,eAC/C,oBAAC,cAA2B,OAAO,WAChC,oBAAU,WAAW,KAAK,GAAG,KADf,SAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,yBAAyB;AACxC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,yBAAwB,GACnD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,qBAAqB,EAAE,IAAI,WACxC,oBAAC,cAAuB,OAAO,OAC5B,mBADc,KAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,wBAAwB;AACvC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,wBAAuB,GAClD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,oBAAoB,EAAE,IAAI,WACvC,oBAAC,cAAuB,OAAO,OAC5B,gBAAM,WAAW,KAAK,GAAG,KADX,KAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,uBAAuB;AACtC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,uBAAsB,GACjD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,mBAAmB,EAAE,IAAI,UACtC,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,KADV,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,wBAAwB;AACvC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,wBAAuB,GAClD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,oBAAoB,EAAE,IAAI,UACvC,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,KAD/B,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,qCAAqC;AACpD,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,2BAA0B,GACrD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,4BAA4B,EAAE,IAAI,UAC/C,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,KAD/B,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,0BAA0B;AACzC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,0BAAyB,GACpD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,sBAAsB,EAAE,IAAI,UACzC,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,KAD/B,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,gBAAgB;AAC/B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,0BAAyB,GACpD;AAAA,YACA,oBAAC,iBACE,2BAAiB,IAAI,UACpB,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,KAD/B,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,aAAa,kCAAkC;AACjD,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,0BAAyB,GACpD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,8BAA8B,EAAE,IAAI,UACjD,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE,KADnD,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AACA,QAAI,aAAa,sCAAsC;AACrD,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,eAAe,SAAO,kBAAkB,UAAU,GAAG;AAAA,UACrD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,UAE3C;AAAA,gCAAC,iBACC,8BAAC,eAAY,aAAY,0BAAyB,GACpD;AAAA,YACA,oBAAC,iBACE,iBAAO,OAAO,kCAAkC,EAAE,IAAI,UACrD,oBAAC,cAAsB,OAAO,MAC3B,eAAK,WAAW,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG,KAD/B,IAEjB,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAIA,MAAI,aAAa,0BAA0B,kBAAkB;AAC3D,UAAM,EAAE,OAAO,UAAU,IAAI,SAAS;AACtC,UAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAG7C,UAAM,aAAa,MAAM,QAAQ,KAAK,KAAK,WAAM,CAAC,MAAP,YAAY,OAAS,wBAAS;AACzE,UAAM,gBAAgB,MAAM,QAAQ,MAAM;AACxC,UAAI,CAAC,MAAO,QAAO,CAAC;AACpB,YAAM,QAAQ,OAAO,YAAY;AACjC,aAAO,MAAM;AAAA,QAAO,UACjB,KAAK,YAAY,KAAK,SAAS,YAAY,EAAE,SAAS,KAAK,KACxD,KAAK,eAAe,KAAK,YAAY,YAAY,EAAE,SAAS,KAAK;AAAA,MACvE;AAAA,IACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAClB,UAAM,gBAAe,+BAAO,KAAK,UAAQ,KAAK,OAAO,gBAAe;AAEpE,WACE,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,WAAQ,cAAc,OACrB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,eAAe;AAAA,YACf,UAAU;AAAA;AAAA,QACZ;AAAA,QACC,OAAO,KAAK,MAAM,MACjB,qBAAC,eACE;AAAA,uBAAa,oBAAC,gBAAa,8BAAC,kBAAe,GAAE;AAAA,UAC7C,CAAC,aAAa,cAAc,WAAW,KACtC,oBAAC,gBAAc,YAAE,OAAO,GAAE;AAAA,UAE5B,oBAAC,gBACE,wBAAc,IAAI,UACjB;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,KAAK,GAAG,SAAS;AAAA,cACxB,UAAU,MAAM;AACd,kCAAkB,UAAU,KAAK,EAAE;AACnC,0BAAU,EAAE;AAAA,cACd;AAAA,cAEA,+BAAC,SACC;AAAA,oCAAC,SAAI,WAAU,eAAe,eAAK,UAAS;AAAA,gBAC5C,oBAAC,SAAI,WAAU,iCAAiC,eAAK,aAAY;AAAA,iBACnE;AAAA;AAAA,YAVK,KAAK;AAAA,UAWZ,CACD,GACH;AAAA,WACF;AAAA,SAEJ;AAAA,MACC,gBACC,oBAAC,SAAI,WAAU,wBACb,+BAAC,SAAM,WAAU,SAAQ,SAAQ,aAC9B;AAAA,qBAAa;AAAA,QACd;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,kBAAkB,UAAU,IAAI;AAAA,YAC/C,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA,YAE3C,8BAAC,KAAE,WAAU,aAAY,MAAM,GAAG;AAAA;AAAA,QACpC;AAAA,SACF,GACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,UAAU,OAAK,kBAAkB,UAAU,EAAE,OAAO,KAAK;AAAA,QACzD,MAAM;AAAA;AAAA,IACR;AAAA,EAEJ;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WACE,iCACE;AAAA,2BAAC,SAAI,WAAU,uBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAM;AAAA,YACN,UAAU,MAAM;AAAA,YAAC;AAAA,YACjB,aAAY;AAAA,YACZ,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA;AAAA,QAC7C;AAAA,QACA,oBAAC,UAAO,SAAQ,WAAU,MAAK,QAAO,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU,GAAG,8BAAC,QAAK,GAAE;AAAA,SAC9F;AAAA,MAEA,oBAAC,SAAI,WAAU,uBACX,oBAAS,CAAC,GAAG,IAAI,CAAC,MAAc,UAChC,oBAAC,SAAkB,WAAU,8BAA6B,SAAQ,aAC/D,kBADS,KAEZ,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,UAAU,SAAS,UAAU,MAAM;AACrC,UAAM,OAAO,UAAU;AACvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,iBAAiB,aAAW,kBAAkB,UAAU,UAAU,QAAQ,IAAI;AAAA;AAAA,IAChF;AAAA,EAEJ;AAEA,MAAI,OAAO,UAAU,YAAa,UAAU,QAAQ,cAAc,QAAQ,GAAI;AAC5E,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO,UAAU,QAAQ,UAAU,SAAY,KAAK;AAAA,QACpD,UAAU,CAAC,MAAM;AACf,gBAAM,cAAc,EAAE,OAAO;AAC7B,gBAAM,WAAW,gBAAgB,KAAK,OAAO,OAAO,WAAW;AAC/D,4BAAkB,UAAU,QAAQ;AAAA,QACtC;AAAA,QACA,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA;AAAA,IAC7C;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,SAAS,EAAE;AAAA,MACzB,UAAU,OAAK,kBAAkB,UAAU,EAAE,OAAO,KAAK;AAAA,MACzD,UAAU,CAAC,QAAQ,IAAI,UAAU,UAAU;AAAA;AAAA,EAC7C;AAEJ;AAEA,IAAO,wBAAQ;","names":["property","t","_a","_b"]}
|