@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.
Files changed (178) hide show
  1. package/README.md +29 -43
  2. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  3. package/dist/core/components/AppSidebarContent.js +21 -27
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  6. package/dist/core/components/authentication/AuthPage.js +32 -7
  7. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  8. package/dist/core/components/authentication/SignInAuthHeader.d.ts +7 -0
  9. package/dist/core/components/authentication/SignInAuthHeader.d.ts.map +1 -0
  10. package/dist/core/components/authentication/SignInAuthHeader.js +32 -0
  11. package/dist/core/components/authentication/SignInAuthHeader.js.map +1 -0
  12. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  13. package/dist/core/components/authentication/Signin.js +308 -10
  14. package/dist/core/components/authentication/Signin.js.map +1 -1
  15. package/dist/core/components/settings/index.js +3 -3
  16. package/dist/core/components/settings/index.js.map +1 -1
  17. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  18. package/dist/core/components/settings/src/OrganizationSettingsPanel.js +5 -4
  19. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  20. package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
  21. package/dist/core/components/settings/src/SettingsSidebar.js +12 -2
  22. package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
  23. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
  24. package/dist/core/components/support/BugReportDialog.js +122 -9
  25. package/dist/core/components/support/BugReportDialog.js.map +1 -1
  26. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
  27. package/dist/core/components/support/FeatureRequestDialog.js +61 -2
  28. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
  29. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  30. package/dist/core/components/ui/AppSidebar.js +52 -9
  31. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  32. package/dist/core/components/ui/DataTable.js +3 -3
  33. package/dist/core/components/ui/DataTable.js.map +1 -1
  34. package/dist/core/components/ui/Dialog.js +1 -1
  35. package/dist/core/components/ui/Dialog.js.map +1 -1
  36. package/dist/core/components/ui/InfoSidebar/Container.js +1 -1
  37. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  38. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  39. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js +2 -2
  40. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  41. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  42. package/dist/core/components/ui/Sensors/SensorsSection.js +2 -1
  43. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  44. package/dist/core/components/ui/Sensors/sensorUtils.d.ts +9 -0
  45. package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
  46. package/dist/core/components/ui/Sensors/sensorUtils.js +6 -0
  47. package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
  48. package/dist/core/components/ui/Sidebar.d.ts +4 -0
  49. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  50. package/dist/core/components/ui/Sidebar.js +11 -5
  51. package/dist/core/components/ui/Sidebar.js.map +1 -1
  52. package/dist/core/components/ui/Table.js +2 -2
  53. package/dist/core/components/ui/Table.js.map +1 -1
  54. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  55. package/dist/core/components/viewers/Data/DataMenu.js +17 -9
  56. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  57. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  58. package/dist/core/components/viewers/Data/HeaderButtons.js +5 -12
  59. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  60. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  61. package/dist/core/components/viewers/Data/MoreOptions.js +14 -27
  62. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  63. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
  64. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js +26 -0
  65. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
  66. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  67. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +13 -18
  68. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  69. package/dist/core/components/viewers/Data/details/DetailHeader.js +14 -14
  70. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  71. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  72. package/dist/core/components/viewers/Data/details/FieldValue.js +13 -3
  73. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  74. package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
  75. package/dist/core/components/viewers/Data/details/TabSidebar.js +22 -0
  76. package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
  77. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
  78. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js +19 -0
  79. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
  80. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts +2 -0
  81. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  82. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +84 -3
  83. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  84. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  85. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +42 -2
  86. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  87. package/dist/core/components/viewers/Data/utils/Columns.js +2 -2
  88. package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
  89. package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
  90. package/dist/core/components/viewers/Data/utils/positionParser.js +6 -5
  91. package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
  92. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  93. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js +8 -1
  94. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  95. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  96. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +7 -1
  97. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  98. package/dist/core/components/viewers/map/datasets/RowActions.js +6 -6
  99. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  100. package/dist/core/components/viewers/map/datasets/data.js +1 -1
  101. package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
  102. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  103. package/dist/core/components/viewers/map/datasets/index.js +28 -9
  104. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  105. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  106. package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -0
  107. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  108. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts +19 -0
  109. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -0
  110. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +163 -0
  111. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -0
  112. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts +3 -0
  113. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -0
  114. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +310 -0
  115. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -0
  116. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts +30 -0
  117. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -0
  118. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js +122 -0
  119. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -0
  120. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts +13 -0
  121. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -0
  122. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js +58 -0
  123. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -0
  124. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts +18 -0
  125. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -0
  126. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +102 -0
  127. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -0
  128. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  129. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +243 -176
  130. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  131. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts +24 -0
  132. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -0
  133. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +46 -0
  134. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -0
  135. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts +1 -0
  136. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  137. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +1 -0
  138. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  139. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  140. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js +54 -31
  141. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  142. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +1 -1
  143. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  144. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts +2 -1
  145. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  146. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js +5 -4
  147. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  148. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  149. package/dist/core/hooks/sites/createSiteHooks.js +0 -1
  150. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  151. package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -1
  152. package/dist/core/hooks/useCaptureScreenshot.js +111 -33
  153. package/dist/core/hooks/useCaptureScreenshot.js.map +1 -1
  154. package/dist/core/hooks/useCurrentViewerPosition.d.ts +18 -0
  155. package/dist/core/hooks/useCurrentViewerPosition.d.ts.map +1 -0
  156. package/dist/core/hooks/useCurrentViewerPosition.js +66 -0
  157. package/dist/core/hooks/useCurrentViewerPosition.js.map +1 -0
  158. package/dist/core/hooks/useShareUrl.d.ts +2 -0
  159. package/dist/core/hooks/useShareUrl.d.ts.map +1 -0
  160. package/dist/core/hooks/useShareUrl.js +74 -0
  161. package/dist/core/hooks/useShareUrl.js.map +1 -0
  162. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  163. package/dist/core/store/CombineProviders.js +2 -0
  164. package/dist/core/store/CombineProviders.js.map +1 -1
  165. package/dist/core/store/MapSites/context.d.ts +16 -0
  166. package/dist/core/store/MapSites/context.d.ts.map +1 -0
  167. package/dist/core/store/MapSites/context.js +29 -0
  168. package/dist/core/store/MapSites/context.js.map +1 -0
  169. package/dist/core/store/MapSites/reducer.d.ts +52 -0
  170. package/dist/core/store/MapSites/reducer.d.ts.map +1 -0
  171. package/dist/core/store/MapSites/reducer.js +70 -0
  172. package/dist/core/store/MapSites/reducer.js.map +1 -0
  173. package/dist/core/store/index.d.ts +1 -0
  174. package/dist/core/store/index.d.ts.map +1 -1
  175. package/dist/core/store/index.js +1 -0
  176. package/dist/core/store/index.js.map +1 -1
  177. package/dist/core/styles/globals.css +46 -33
  178. 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":"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","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,sBAmnBpB,CAAA;AAED,eAAe,aAAa,CAAA"}
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, _b, _c;
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 = (_b = entry[1]) == null ? void 0 : _b.name) != null ? _c : entry[1]) || code;
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 selectedIds = Array.isArray(value) ? value : value ? [value] : [];
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 selectedSites = (sites == null ? void 0 : sites.filter((site) => selectedIds.includes(site.id))) || [];
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
- if (!selectedIds.includes(site.id)) {
466
- handleInputChange(property, [...selectedIds, site.id]);
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: selectedSites.map((site) => /* @__PURE__ */ jsxs(Badge, { className: "gap-1", variant: "secondary", children: [
480
- site.siteName,
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
- ] }, site.id)) })
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":"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","names":["property","t","_a","_b"]}