@collabdt/core 0.0.57 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -26
- package/dist/core/components/support/BugReportDialog.d.ts.map +1 -1
- package/dist/core/components/support/BugReportDialog.js +32 -0
- package/dist/core/components/support/BugReportDialog.js.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -1
- package/dist/core/components/support/FeatureRequestDialog.js +32 -0
- package/dist/core/components/support/FeatureRequestDialog.js.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/DataMenu.js +9 -1
- package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/HeaderButtons.js +5 -12
- package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/MoreOptions.js +14 -27
- package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js +13 -18
- package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/details/FieldValue.js +13 -3
- package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts +2 -0
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +84 -3
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js +23 -2
- package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.js +2 -0
- package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts +19 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js +163 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteContextMenu.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts +3 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js +310 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/SiteLayer.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts +30 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js +122 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/siteGeometry.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts +13 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js +58 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/useShowSitesOnMap.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts +18 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js +102 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/AssociateBuildingsDialog.js.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js +243 -176
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts +24 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js +46 -0
- package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/persistSite.js.map +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js +1 -0
- package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
- package/dist/core/hooks/sites/createSiteHooks.js +0 -1
- package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
- package/dist/core/hooks/useCaptureScreenshot.d.ts.map +1 -1
- package/dist/core/hooks/useCaptureScreenshot.js +77 -30
- package/dist/core/hooks/useCaptureScreenshot.js.map +1 -1
- package/dist/core/store/CombineProviders.d.ts.map +1 -1
- package/dist/core/store/CombineProviders.js +2 -0
- package/dist/core/store/CombineProviders.js.map +1 -1
- package/dist/core/store/MapSites/context.d.ts +16 -0
- package/dist/core/store/MapSites/context.d.ts.map +1 -0
- package/dist/core/store/MapSites/context.js +29 -0
- package/dist/core/store/MapSites/context.js.map +1 -0
- package/dist/core/store/MapSites/reducer.d.ts +52 -0
- package/dist/core/store/MapSites/reducer.d.ts.map +1 -0
- package/dist/core/store/MapSites/reducer.js +70 -0
- package/dist/core/store/MapSites/reducer.js.map +1 -0
- package/dist/core/store/index.d.ts +1 -0
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js +1 -0
- package/dist/core/store/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import * as React from "react";
|
|
4
|
-
import { BuildingsContext, DatasetsContext, MapContext, MenusContext } from "../../../store";
|
|
4
|
+
import { BuildingsContext, DatasetsContext, MapContext, MenusContext, useMapSitesContext } from "../../../store";
|
|
5
|
+
import { useShowSitesOnMap } from "../map/src/MapLayers/src/SiteLayer/useShowSitesOnMap";
|
|
5
6
|
import { usePermissions } from "../../../store";
|
|
6
7
|
import {
|
|
7
8
|
DropdownMenu,
|
|
@@ -20,7 +21,6 @@ import {
|
|
|
20
21
|
} from "lucide-react";
|
|
21
22
|
import ExportData from "../../../components/ui/ExportData";
|
|
22
23
|
import FileMoreOptions from "./files/FileMoreOptions";
|
|
23
|
-
import { MarkerManager } from "../map/utils/MarkerManager";
|
|
24
24
|
import { createBuildingsDataset } from "../map/src/MapLayers/src/BuildingLayers/src/databaseBuildings";
|
|
25
25
|
import ConfirmDialog from "../../../components/ConfirmDialog";
|
|
26
26
|
import { ViewerNames } from "../../../types/";
|
|
@@ -33,6 +33,8 @@ function MoreOptions({ row, dataType, variant, setView, hideViewOnMap = false, o
|
|
|
33
33
|
const { dispatch: menusDispatch } = React.useContext(MenusContext);
|
|
34
34
|
const { dispatch: datasetDispatch } = React.useContext(DatasetsContext);
|
|
35
35
|
const { dispatch: buildingsDispatch } = React.useContext(BuildingsContext);
|
|
36
|
+
const { dispatch: mapSitesDispatch } = useMapSitesContext();
|
|
37
|
+
const showSitesOnMap = useShowSitesOnMap();
|
|
36
38
|
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);
|
|
37
39
|
const { map } = mapState.map;
|
|
38
40
|
const siteId = dataType === "site" && row && "id" in row ? row.id : void 0;
|
|
@@ -44,6 +46,7 @@ function MoreOptions({ row, dataType, variant, setView, hideViewOnMap = false, o
|
|
|
44
46
|
if (!siteId) return;
|
|
45
47
|
try {
|
|
46
48
|
await deleteSite(siteId);
|
|
49
|
+
mapSitesDispatch({ type: "HIDE_SITE", payload: { id: Number(siteId) } });
|
|
47
50
|
toast.success("Site deleted successfully");
|
|
48
51
|
setIsConfirmDialogOpen(false);
|
|
49
52
|
setView("table");
|
|
@@ -65,35 +68,19 @@ function MoreOptions({ row, dataType, variant, setView, hideViewOnMap = false, o
|
|
|
65
68
|
toast.error(t("userDeleteFailed"));
|
|
66
69
|
}
|
|
67
70
|
};
|
|
68
|
-
const handleViewOnMap = (row2) => {
|
|
69
|
-
|
|
71
|
+
const handleViewOnMap = async (row2) => {
|
|
72
|
+
if (dataType === "site" && "id" in row2 && row2.id) {
|
|
73
|
+
await showSitesOnMap([row2]);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
70
76
|
if (dataType === "building" && "buildingLatitude" in row2 && "buildingLongitude" in row2 && typeof row2.buildingLatitude === "number" && typeof row2.buildingLongitude === "number") {
|
|
71
77
|
const building = row2;
|
|
72
|
-
coordinates = [building.buildingLongitude, building.buildingLatitude];
|
|
78
|
+
const coordinates = [building.buildingLongitude, building.buildingLatitude];
|
|
73
79
|
const name = building.buildingName || building.buildingAddress || "Unnamed Building";
|
|
74
80
|
const dataset = createBuildingsDataset([building], name);
|
|
75
|
-
datasetDispatch({
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
});
|
|
79
|
-
} else if (dataType === "site" && "siteLatitude" in row2 && "siteLongitude" in row2 && typeof row2.siteLatitude === "number" && typeof row2.siteLongitude === "number") {
|
|
80
|
-
coordinates = [row2.siteLongitude, row2.siteLatitude];
|
|
81
|
-
} else {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
menusDispatch({
|
|
85
|
-
type: "SET_VIEWER",
|
|
86
|
-
payload: { currentViewer: ViewerNames.map }
|
|
87
|
-
});
|
|
88
|
-
const markerManager = new MarkerManager();
|
|
89
|
-
if (coordinates) {
|
|
90
|
-
map.flyTo({
|
|
91
|
-
center: coordinates,
|
|
92
|
-
zoom: 18,
|
|
93
|
-
duration: 1e3
|
|
94
|
-
});
|
|
95
|
-
} else {
|
|
96
|
-
console.warn("No coordinates available for the selected row.");
|
|
81
|
+
datasetDispatch({ type: "ADD_DATASET_TO_MAP", payload: { dataset } });
|
|
82
|
+
menusDispatch({ type: "SET_VIEWER", payload: { currentViewer: ViewerNames.map } });
|
|
83
|
+
if (map) map.flyTo({ center: coordinates, zoom: 18, duration: 1e3 });
|
|
97
84
|
}
|
|
98
85
|
};
|
|
99
86
|
const handleViewBIM = (row2) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/MoreOptions.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 { BuildingsContext, DatasetsContext, MapContext, MenusContext } from '../../../store'\r\n\r\nimport type { Building, Site, User } from '../../../types/dbTypes'\r\nimport { usePermissions } from '../../../store'\r\n\r\n// Shadcn Components\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '../../../components/ui/DropdownMenu'\r\nimport { Button, LoadingSpinner } from '../../../components/ui/'\r\nimport { useTranslations } from 'next-intl'\r\nimport { toast } from 'sonner'\r\n\r\n// Icons\r\nimport {\r\n MoreHorizontal,\r\n Map,\r\n Box,\r\n Trash2,\r\n} from 'lucide-react'\r\n\r\n// Custom Components\r\nimport ExportData from '../../../components/ui/ExportData'\r\nimport FileMoreOptions from './files/FileMoreOptions'\r\nimport type { FileRow } from '../../../types/files'\r\nimport { MarkerManager } from '../map/utils/MarkerManager'\r\nimport { createBuildingsDataset } from '../map/src/MapLayers/src/BuildingLayers/src/databaseBuildings'\r\nimport type { Dataset } from '../../../types/datasetTypes'\r\nimport ConfirmDialog from '../../../components/ConfirmDialog'\r\nimport { DataTypes, ViewerNames } from '../../../types/'\r\nimport { useDeleteSite } from '../../../hooks/sites/sites'\r\nimport { useUser } from '../../../hooks/users/users'\r\n \r\n\r\ninterface MoreOptionsProps {\r\n row: Building | Site | FileRow | Partial<User>\r\n dataType: DataTypes\r\n variant?: 'ghost' | 'outline' | 'default'\r\n setView?: React.Dispatch<React.SetStateAction<'table' | 'detail'>>\r\n hideViewOnMap?: boolean\r\n onDeleteUser?: () => void\r\n}\r\n\r\nexport default function MoreOptions({ row, dataType, variant, setView, hideViewOnMap = false, onDeleteUser }: MoreOptionsProps) {\r\n // Translations\r\n const t = useTranslations('MoreOptions')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { dispatch: buildingsDispatch } = React.useContext(BuildingsContext)\r\n\r\n // States\r\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false)\r\n\r\n const { map } = mapState.map\r\n\r\n const siteId = dataType === 'site' && row && 'id' in row ? row.id : undefined\r\n const { deleteSite, isMutating: isDeleting } = useDeleteSite(siteId)\r\n\r\n const userId = dataType === 'user' && row && 'id' in row && Number(row.id) > 0 ? String(row.id) : undefined\r\n const { deleteUser, isDeleting: isDeletingUser } = useUser(userId || '')\r\n\r\n const handleDeleteSite = async (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (!siteId) return\r\n try {\r\n await deleteSite(siteId)\r\n toast.success(\"Site deleted successfully\")\r\n setIsConfirmDialogOpen(false)\r\n setView('table')\r\n } catch (err) {\r\n toast.error(\"Error deleting site\")\r\n }\r\n }\r\n\r\n const handleDeleteUser = async (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (!userId) return\r\n try {\r\n await deleteUser()\r\n toast.success(t('userDeleted'))\r\n setIsConfirmDialogOpen(false)\r\n setView('table')\r\n onDeleteUser?.()\r\n } catch (err) {\r\n console.error('Error deleting user:', err)\r\n toast.error(t('userDeleteFailed'))\r\n }\r\n }\r\n\r\n const handleViewOnMap = (row: Building | Site | FileRow | Partial<User>) => {\r\n let coordinates: [number, number]\r\n if (\r\n dataType === 'building'\r\n && 'buildingLatitude' in row\r\n && 'buildingLongitude' in row\r\n && typeof row.buildingLatitude === 'number'\r\n && typeof row.buildingLongitude === 'number'\r\n ) {\r\n const building = row as Building\r\n coordinates = [building.buildingLongitude, building.buildingLatitude]\r\n const name = building.buildingName || building.buildingAddress || 'Unnamed Building'\r\n\r\n // Create a dataset for the building\r\n const dataset: Dataset = createBuildingsDataset([building], name)\r\n\r\n // Add buildings as a dataset to the map state\r\n datasetDispatch({\r\n type: 'ADD_DATASET_TO_MAP',\r\n payload: { dataset },\r\n })\r\n }\r\n else if (\r\n dataType === 'site'\r\n && 'siteLatitude' in row\r\n && 'siteLongitude' in row\r\n && typeof row.siteLatitude === 'number'\r\n && typeof row.siteLongitude === 'number'\r\n ) {\r\n coordinates = [row.siteLongitude, row.siteLatitude]\r\n }\r\n else {\r\n // console.log('No coordinates available for the selected row.')\r\n return\r\n }\r\n\r\n // set the current viewer to map\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.map },\r\n })\r\n // Fly to location on the map WIP\r\n const markerManager = new MarkerManager()\r\n\r\n if (coordinates) {\r\n // markerManager.create(coordinates, map)\r\n map.flyTo({\r\n center: coordinates,\r\n zoom: 18,\r\n duration: 1000,\r\n })\r\n }\r\n else {\r\n console.warn('No coordinates available for the selected row.')\r\n }\r\n }\r\n const handleViewBIM = (row: Building | Site | FileRow | Partial<User>) => {\r\n const building = row as Building\r\n buildingsDispatch({\r\n \"type\": \"SET-CURRENT-BUILDING\",\r\n \"payload\": { building },\r\n });\r\n // set the current viewer to map\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.bim },\r\n })\r\n\r\n }\r\n\r\n if (dataType == 'file') {\r\n const fileRow = row as FileRow\r\n return (<FileMoreOptions file={fileRow} />)\r\n }\r\n\r\n return (\r\n <>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant={variant ? variant : 'ghost'}\r\n className=\"dropdown-menu-trigger\"\r\n onClick={e => e.stopPropagation()}\r\n size=\"icon\"\r\n >\r\n <MoreHorizontal />\r\n <span className=\"sr-only\">Open menu</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {!hideViewOnMap && (\r\n <DropdownMenuItem\r\n onClick={() => handleViewOnMap(row)}\r\n disabled={dataType == 'building' && !ability.can('read', 'Building') || dataType == 'site' && !ability.can('read', 'Site')}\r\n >\r\n <Map />\r\n {t('viewMap')}\r\n </DropdownMenuItem>\r\n )}\r\n {dataType === 'building' && (\r\n <DropdownMenuItem\r\n onClick={() => handleViewBIM(row)}\r\n disabled={dataType == 'building' && !ability.can('read', 'Building')}\r\n >\r\n <Box />\r\n {t('viewBIM')}\r\n </DropdownMenuItem>\r\n )}\r\n <ExportData\r\n data={\r\n dataType === 'building'\r\n ? [row as Building]\r\n : (dataType === 'site'\r\n ? [row as Site]\r\n : [row as FileRow])\r\n }\r\n variant=\"ghost\"\r\n type={dataType}\r\n className=\"px-2 py-1.5 font-normal\"\r\n />\r\n {dataType === 'site' && (\r\n <DropdownMenuItem\r\n onClick={() => setIsConfirmDialogOpen(true)}\r\n disabled={dataType == 'site' && !ability.can('update', 'Site') ||isDeleting}\r\n >\r\n <Trash2 />\r\n {t('deleteSite')}\r\n {isDeleting && <LoadingSpinner />}\r\n </DropdownMenuItem>\r\n )}\r\n {dataType === 'user' && ability.can('delete', 'User') &&(\r\n <DropdownMenuItem\r\n onClick={() => setIsConfirmDialogOpen(true)}\r\n >\r\n <Trash2 />\r\n {t('deleteUser')}\r\n {isDeletingUser && <LoadingSpinner />}\r\n </DropdownMenuItem>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n {/* Confirm Dialog */}\r\n <ConfirmDialog\r\n isOpen={isConfirmDialogOpen}\r\n isDeleting={dataType === 'site' ? isDeleting : isDeletingUser}\r\n onOpenChange={setIsConfirmDialogOpen}\r\n handleConfirm={dataType === 'site' ? handleDeleteSite : handleDeleteUser}\r\n itemName={dataType === 'site' ? (row as Site).siteName : dataType === 'user' ? (row as User).name : undefined}\r\n dataType={dataType === 'site' ? 'site' : dataType === 'user' ? 'user' : undefined}\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["row"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/components/viewers/Data/MoreOptions.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 { BuildingsContext, DatasetsContext, MapContext, MenusContext, useMapSitesContext } from '../../../store'\r\nimport { useShowSitesOnMap } from '../map/src/MapLayers/src/SiteLayer/useShowSitesOnMap'\r\n\r\nimport type { Building, Site, User } from '../../../types/dbTypes'\r\nimport { usePermissions } from '../../../store'\r\n\r\n// Shadcn Components\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n} from '../../../components/ui/DropdownMenu'\r\nimport { Button, LoadingSpinner } from '../../../components/ui/'\r\nimport { useTranslations } from 'next-intl'\r\nimport { toast } from 'sonner'\r\n\r\n// Icons\r\nimport {\r\n MoreHorizontal,\r\n Map,\r\n Box,\r\n Trash2,\r\n} from 'lucide-react'\r\n\r\n// Custom Components\r\nimport ExportData from '../../../components/ui/ExportData'\r\nimport FileMoreOptions from './files/FileMoreOptions'\r\nimport type { FileRow } from '../../../types/files'\r\nimport { createBuildingsDataset } from '../map/src/MapLayers/src/BuildingLayers/src/databaseBuildings'\r\nimport type { Dataset } from '../../../types/datasetTypes'\r\nimport ConfirmDialog from '../../../components/ConfirmDialog'\r\nimport { DataTypes, ViewerNames } from '../../../types/'\r\nimport { useDeleteSite } from '../../../hooks/sites/sites'\r\nimport { useUser } from '../../../hooks/users/users'\r\n \r\n\r\ninterface MoreOptionsProps {\r\n row: Building | Site | FileRow | Partial<User>\r\n dataType: DataTypes\r\n variant?: 'ghost' | 'outline' | 'default'\r\n setView?: React.Dispatch<React.SetStateAction<'table' | 'detail'>>\r\n hideViewOnMap?: boolean\r\n onDeleteUser?: () => void\r\n}\r\n\r\nexport default function MoreOptions({ row, dataType, variant, setView, hideViewOnMap = false, onDeleteUser }: MoreOptionsProps) {\r\n // Translations\r\n const t = useTranslations('MoreOptions')\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const { state: mapState } = React.useContext(MapContext)\r\n const { dispatch: menusDispatch } = React.useContext(MenusContext)\r\n const { dispatch: datasetDispatch } = React.useContext(DatasetsContext)\r\n const { dispatch: buildingsDispatch } = React.useContext(BuildingsContext)\r\n const { dispatch: mapSitesDispatch } = useMapSitesContext()\r\n const showSitesOnMap = useShowSitesOnMap()\r\n\r\n // States\r\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false)\r\n\r\n const { map } = mapState.map\r\n\r\n const siteId = dataType === 'site' && row && 'id' in row ? row.id : undefined\r\n const { deleteSite, isMutating: isDeleting } = useDeleteSite(siteId)\r\n\r\n const userId = dataType === 'user' && row && 'id' in row && Number(row.id) > 0 ? String(row.id) : undefined\r\n const { deleteUser, isDeleting: isDeletingUser } = useUser(userId || '')\r\n\r\n const handleDeleteSite = async (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (!siteId) return\r\n try {\r\n await deleteSite(siteId)\r\n // Remove the polygon from the map if it is currently shown, so it doesn't\r\n // linger as an un-backed \"ghost\" that still opens the context menu.\r\n mapSitesDispatch({ type: 'HIDE_SITE', payload: { id: Number(siteId) } })\r\n toast.success(\"Site deleted successfully\")\r\n setIsConfirmDialogOpen(false)\r\n setView('table')\r\n } catch (err) {\r\n toast.error(\"Error deleting site\")\r\n }\r\n }\r\n\r\n const handleDeleteUser = async (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (!userId) return\r\n try {\r\n await deleteUser()\r\n toast.success(t('userDeleted'))\r\n setIsConfirmDialogOpen(false)\r\n setView('table')\r\n onDeleteUser?.()\r\n } catch (err) {\r\n console.error('Error deleting user:', err)\r\n toast.error(t('userDeleteFailed'))\r\n }\r\n }\r\n\r\n const handleViewOnMap = async (row: Building | Site | FileRow | Partial<User>) => {\r\n // Sites: switch to the map and render the saved polygon boundary (falls\r\n // back to the site's point if it has no drawn boundary yet).\r\n if (dataType === 'site' && 'id' in row && row.id) {\r\n await showSitesOnMap([row as Site])\r\n return\r\n }\r\n\r\n // Buildings: add as a dataset and fly to it.\r\n if (\r\n dataType === 'building'\r\n && 'buildingLatitude' in row\r\n && 'buildingLongitude' in row\r\n && typeof row.buildingLatitude === 'number'\r\n && typeof row.buildingLongitude === 'number'\r\n ) {\r\n const building = row as Building\r\n const coordinates: [number, number] = [building.buildingLongitude, building.buildingLatitude]\r\n const name = building.buildingName || building.buildingAddress || 'Unnamed Building'\r\n const dataset: Dataset = createBuildingsDataset([building], name)\r\n datasetDispatch({ type: 'ADD_DATASET_TO_MAP', payload: { dataset } })\r\n menusDispatch({ type: 'SET_VIEWER', payload: { currentViewer: ViewerNames.map } })\r\n if (map) map.flyTo({ center: coordinates, zoom: 18, duration: 1000 })\r\n }\r\n }\r\n\r\n const handleViewBIM = (row: Building | Site | FileRow | Partial<User>) => {\r\n const building = row as Building\r\n buildingsDispatch({\r\n \"type\": \"SET-CURRENT-BUILDING\",\r\n \"payload\": { building },\r\n });\r\n // set the current viewer to map\r\n menusDispatch({\r\n type: 'SET_VIEWER',\r\n payload: { currentViewer: ViewerNames.bim },\r\n })\r\n\r\n }\r\n\r\n if (dataType == 'file') {\r\n const fileRow = row as FileRow\r\n return (<FileMoreOptions file={fileRow} />)\r\n }\r\n\r\n return (\r\n <>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant={variant ? variant : 'ghost'}\r\n className=\"dropdown-menu-trigger\"\r\n onClick={e => e.stopPropagation()}\r\n size=\"icon\"\r\n >\r\n <MoreHorizontal />\r\n <span className=\"sr-only\">Open menu</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {!hideViewOnMap && (\r\n <DropdownMenuItem\r\n onClick={() => handleViewOnMap(row)}\r\n disabled={dataType == 'building' && !ability.can('read', 'Building') || dataType == 'site' && !ability.can('read', 'Site')}\r\n >\r\n <Map />\r\n {t('viewMap')}\r\n </DropdownMenuItem>\r\n )}\r\n {dataType === 'building' && (\r\n <DropdownMenuItem\r\n onClick={() => handleViewBIM(row)}\r\n disabled={dataType == 'building' && !ability.can('read', 'Building')}\r\n >\r\n <Box />\r\n {t('viewBIM')}\r\n </DropdownMenuItem>\r\n )}\r\n <ExportData\r\n data={\r\n dataType === 'building'\r\n ? [row as Building]\r\n : (dataType === 'site'\r\n ? [row as Site]\r\n : [row as FileRow])\r\n }\r\n variant=\"ghost\"\r\n type={dataType}\r\n className=\"px-2 py-1.5 font-normal\"\r\n />\r\n {dataType === 'site' && (\r\n <DropdownMenuItem\r\n onClick={() => setIsConfirmDialogOpen(true)}\r\n disabled={dataType == 'site' && !ability.can('update', 'Site') ||isDeleting}\r\n >\r\n <Trash2 />\r\n {t('deleteSite')}\r\n {isDeleting && <LoadingSpinner />}\r\n </DropdownMenuItem>\r\n )}\r\n {dataType === 'user' && ability.can('delete', 'User') &&(\r\n <DropdownMenuItem\r\n onClick={() => setIsConfirmDialogOpen(true)}\r\n >\r\n <Trash2 />\r\n {t('deleteUser')}\r\n {isDeletingUser && <LoadingSpinner />}\r\n </DropdownMenuItem>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n {/* Confirm Dialog */}\r\n <ConfirmDialog\r\n isOpen={isConfirmDialogOpen}\r\n isDeleting={dataType === 'site' ? isDeleting : isDeletingUser}\r\n onOpenChange={setIsConfirmDialogOpen}\r\n handleConfirm={dataType === 'site' ? handleDeleteSite : handleDeleteUser}\r\n itemName={dataType === 'site' ? (row as Site).siteName : dataType === 'user' ? (row as User).name : undefined}\r\n dataType={dataType === 'site' ? 'site' : dataType === 'user' ? 'user' : undefined}\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["row"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwCzB,eAAO,MAAM,gBAAgB,gHAOnB,CAAA;AAEV,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,GAAG,CAAA;IACV,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACzD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED,QAAA,MAAM,aAAa,GAAI,6KAapB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAwCzB,eAAO,MAAM,gBAAgB,gHAOnB,CAAA;AAEV,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,GAAG,CAAA;IACV,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACzD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAC7C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED,QAAA,MAAM,aAAa,GAAI,6KAapB,kBAAkB,sBAknBpB,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -56,7 +56,7 @@ const FieldRenderer = ({
|
|
|
56
56
|
buildingId,
|
|
57
57
|
setActiveChanges
|
|
58
58
|
}) => {
|
|
59
|
-
var _a;
|
|
59
|
+
var _a, _b;
|
|
60
60
|
const t = useTranslations("BuildingFieldRenderer");
|
|
61
61
|
const { state: mapState } = useMapContext();
|
|
62
62
|
const countrySubdivisionsData = (_a = mapState.map.countrySubdivisionsData) != null ? _a : {};
|
|
@@ -265,12 +265,12 @@ const FieldRenderer = ({
|
|
|
265
265
|
}
|
|
266
266
|
if (enumType === "CountrySubdivisionData") {
|
|
267
267
|
const resolveSubdivisionName = (code) => {
|
|
268
|
-
var _a2,
|
|
268
|
+
var _a2, _b2, _c;
|
|
269
269
|
if (!code || !countrySubdivisionsData) return code;
|
|
270
270
|
const exact = countrySubdivisionsData[code];
|
|
271
271
|
if (exact) return ((_a2 = exact == null ? void 0 : exact.name) != null ? _a2 : exact) || code;
|
|
272
272
|
const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`));
|
|
273
|
-
if (entry) return ((_c = (
|
|
273
|
+
if (entry) return ((_c = (_b2 = entry[1]) == null ? void 0 : _b2.name) != null ? _c : entry[1]) || code;
|
|
274
274
|
return code;
|
|
275
275
|
};
|
|
276
276
|
return /* @__PURE__ */ jsxs(
|
|
@@ -433,18 +433,17 @@ const FieldRenderer = ({
|
|
|
433
433
|
if (property === "buildingParentSiteId" && setActiveChanges) {
|
|
434
434
|
const { sites, isLoading } = useSites();
|
|
435
435
|
const [search, setSearch] = React.useState("");
|
|
436
|
-
const
|
|
436
|
+
const selectedId = Array.isArray(value) ? (_b = value[0]) != null ? _b : null : value != null ? value : null;
|
|
437
437
|
const filteredSites = React.useMemo(() => {
|
|
438
438
|
if (!sites) return [];
|
|
439
|
-
if (!search) return sites;
|
|
440
439
|
const lower = search.toLowerCase();
|
|
441
440
|
return sites.filter(
|
|
442
441
|
(site) => site.siteName && site.siteName.toLowerCase().includes(lower) || site.siteAddress && site.siteAddress.toLowerCase().includes(lower)
|
|
443
442
|
);
|
|
444
443
|
}, [sites, search]);
|
|
445
|
-
const
|
|
444
|
+
const selectedSite = (sites == null ? void 0 : sites.find((site) => site.id === selectedId)) || null;
|
|
446
445
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
447
|
-
/* @__PURE__ */ jsxs(Command, { children: [
|
|
446
|
+
/* @__PURE__ */ jsxs(Command, { shouldFilter: false, children: [
|
|
448
447
|
/* @__PURE__ */ jsx(
|
|
449
448
|
CommandInput,
|
|
450
449
|
{
|
|
@@ -454,7 +453,7 @@ const FieldRenderer = ({
|
|
|
454
453
|
disabled: isLoading
|
|
455
454
|
}
|
|
456
455
|
),
|
|
457
|
-
/* @__PURE__ */ jsxs(CommandList, { children: [
|
|
456
|
+
search.trim() !== "" && /* @__PURE__ */ jsxs(CommandList, { children: [
|
|
458
457
|
isLoading && /* @__PURE__ */ jsx(CommandEmpty, { children: /* @__PURE__ */ jsx(LoadingSpinner, {}) }),
|
|
459
458
|
!isLoading && filteredSites.length === 0 && /* @__PURE__ */ jsx(CommandEmpty, { children: t("empty") }),
|
|
460
459
|
/* @__PURE__ */ jsx(CommandGroup, { children: filteredSites.map((site) => /* @__PURE__ */ jsx(
|
|
@@ -462,11 +461,9 @@ const FieldRenderer = ({
|
|
|
462
461
|
{
|
|
463
462
|
value: site.id.toString(),
|
|
464
463
|
onSelect: () => {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
464
|
+
handleInputChange(property, site.id);
|
|
465
|
+
setSearch("");
|
|
468
466
|
},
|
|
469
|
-
disabled: selectedIds.includes(site.id),
|
|
470
467
|
children: /* @__PURE__ */ jsxs("div", { children: [
|
|
471
468
|
/* @__PURE__ */ jsx("div", { className: "font-medium", children: site.siteName }),
|
|
472
469
|
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: site.siteAddress })
|
|
@@ -476,22 +473,20 @@ const FieldRenderer = ({
|
|
|
476
473
|
)) })
|
|
477
474
|
] })
|
|
478
475
|
] }),
|
|
479
|
-
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children:
|
|
480
|
-
|
|
476
|
+
selectedSite && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: /* @__PURE__ */ jsxs(Badge, { className: "gap-1", variant: "secondary", children: [
|
|
477
|
+
selectedSite.siteName,
|
|
481
478
|
/* @__PURE__ */ jsx(
|
|
482
479
|
Button,
|
|
483
480
|
{
|
|
484
481
|
variant: "ghost",
|
|
485
482
|
size: "icon",
|
|
486
483
|
className: "p-0 hover:bg-transparent w-auto h-auto",
|
|
487
|
-
onClick: () =>
|
|
488
|
-
handleInputChange(property, selectedIds.filter((id) => id !== site.id));
|
|
489
|
-
},
|
|
484
|
+
onClick: () => handleInputChange(property, null),
|
|
490
485
|
disabled: !ability.can("update", "Building"),
|
|
491
486
|
children: /* @__PURE__ */ jsx(X, { className: "!w-3 !h-3", size: 8 })
|
|
492
487
|
}
|
|
493
488
|
)
|
|
494
|
-
] }
|
|
489
|
+
] }) })
|
|
495
490
|
] });
|
|
496
491
|
}
|
|
497
492
|
if (isTextAreaField(property)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport {\r\n BuildingAssessmentConditions,\r\n BuildingGeometryStyle,\r\n BuildingProjectPhase,\r\n BuildingProjectType,\r\n BuildingEnergySource,\r\n BuildingOccupantType,\r\n BuildingManagementType,\r\n BuildingHeatingEnergySource,\r\n BuildingCoolingEnergySource,\r\n BuildingHotWaterEnergySource,\r\n BuildingElectricityServiceSize,\r\n BuildingElectricityServiceLocation,\r\n} from '../../../../types/dbTypes'\r\n\r\nimport { useSites } from '../../../../hooks/sites/sites'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions, useMapContext } from '../../../../store'\r\n\r\nimport { Checkbox } from '../../../ui/Checkbox'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Textarea } from '../../../ui/Textarea'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Badge } from '../../../ui/Badge'\r\nimport { DatePicker } from '../../../ui/DatePicker'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../../ui/Select'\r\nimport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../../../ui/Command'\r\n\r\nimport FileUpload from '../details/FileUpload'\r\n\r\nimport { Plus, X } from 'lucide-react'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\nexport const BuildingTypeEnum = [\r\n 'Townhouses',\r\n '<4 Storey MURB',\r\n '4+ Storey MURB',\r\n 'Stacked Townhouses',\r\n 'Detached',\r\n 'Semi Detached',\r\n] as const\r\n\r\ninterface FieldRendererProps {\r\n property: string\r\n value: any\r\n handleInputChange: (property: string, value: any) => void\r\n isTextAreaField: (property: string) => boolean\r\n isFileField: (property: string) => boolean\r\n isDateField?: (property: string) => boolean\r\n isEnumField?: (property: string) => boolean\r\n isNumberField?: (property: string) => boolean\r\n isFullWidthField?: (property: string) => boolean\r\n getEnumType?: (property: string) => string | null\r\n buildingId?: number\r\n setActiveChanges?: (editing: boolean) => void\r\n}\r\n\r\nconst FieldRenderer = ({\r\n property,\r\n value,\r\n handleInputChange,\r\n isTextAreaField,\r\n isFileField,\r\n isDateField = () => false,\r\n isEnumField = () => false,\r\n isNumberField = () => false,\r\n isFullWidthField = () => false,\r\n getEnumType = () => null,\r\n buildingId,\r\n setActiveChanges,\r\n}: FieldRendererProps) => {\r\n const t = useTranslations('BuildingFieldRenderer')\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData ?? {}\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const getFileTagFromProperty = (property: string): string => {\r\n const propertyToTagMap: Record<string, string> = {\r\n buildingMaintenanceRecords: 'maintenanceRecords',\r\n buildingSystemAssessment: 'systemAssessments',\r\n buildingFireSafety: 'fireSafety',\r\n buildingOccupancyCertificate: 'occupancyCertificate',\r\n buildingEnvironmentalCompliance: 'environmentalCompliance',\r\n buildingZoningCompliance: 'zoningCompliance',\r\n buildingPermitsIssued: 'permitsIssued',\r\n buildingCertificationsFile: 'certificationsFile',\r\n buildingRegionalEnergyTrends: 'regionalEnergyTrends',\r\n buildingEnergyCodeCompliance: 'energyCodeCompliance',\r\n buildingBuildingCodeCompliance: 'buildingCodeCompliance',\r\n buildingProximityToServices: 'proximityToServices',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n return propertyToTagMap[property] || property\r\n }\r\n\r\n // Special handling for energy source arrays\r\n if (property === 'buildingHeatingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select heating source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHeatingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingCoolingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select cooling source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingCoolingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingHotWaterSystemsEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select hot water source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHotWaterEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isFileField(property)) {\r\n return (\r\n <FileUpload\r\n value={Array.isArray(value) ? value : []}\r\n property={property}\r\n tag={getFileTagFromProperty(property)}\r\n onChange={handleInputChange}\r\n editing={true}\r\n buildingId={buildingId}\r\n onFileUpload={() => setActiveChanges?.(true)}\r\n isFullWidthField={isFullWidthField(property)}\r\n />\r\n )\r\n }\r\n\r\n if (isDateField(property)) {\r\n return (\r\n <DatePicker\r\n date={value instanceof Date ? value : (value ? new Date(value) : undefined)}\r\n onSelect={date => handleInputChange(property, date)}\r\n />\r\n )\r\n }\r\n\r\n if (isEnumField(property)) {\r\n const enumType = getEnumType(property)\r\n\r\n // Multiselect for building type\r\n if (property === 'buildingType') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={(newType) => {\r\n if (!selectedValues.includes(newType)) {\r\n handleInputChange(property, [...selectedValues, newType])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select building type(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum\r\n .filter(type => !selectedValues.includes(type))\r\n .map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (enumType === 'CountrySubdivisionData') {\r\n // Resolve display name — handles both full (\"CA-ON\") and short (\"ON\") stored codes\r\n const resolveSubdivisionName = (code: string): string => {\r\n if (!code || !countrySubdivisionsData) return code\r\n const exact = countrySubdivisionsData[code] as any\r\n if (exact) return (exact?.name ?? exact) || code\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`))\r\n if (entry) return ((entry[1] as any)?.name ?? entry[1]) || code\r\n return code\r\n }\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select subdivision\">\r\n {value ? resolveSubdivisionName(value) : undefined}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.entries(countrySubdivisionsData).map(([code, sub]) => (\r\n <SelectItem key={code} value={code}>\r\n {(sub as any)?.name ?? code}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingAssessmentConditions') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select assessment condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(condition => (\r\n <SelectItem key={condition} value={condition}>\r\n {condition.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingGeometryStyle') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select geometry style\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingGeometryStyle).map(style => (\r\n <SelectItem key={style} value={style}>\r\n {style}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectPhase') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project phase\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectPhase).map(phase => (\r\n <SelectItem key={phase} value={phase}>\r\n {phase.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingOccupantType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select occupant type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingOccupantType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'buildingAssessmentRatingCondition') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select rating condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingManagementType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingManagementType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum.map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingElectricityServiceSize') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceSize).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+').replace('Size', '')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n if (enumType === 'BuildingElectricityServiceLocation') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceLocation).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n }\r\n \r\n \r\n\r\n if (property === 'buildingParentSiteId' && setActiveChanges) {\r\n const { sites, isLoading } = useSites()\r\n const [search, setSearch] = React.useState('')\r\n const selectedIds = Array.isArray(value) ? value : (value ? [value] : [])\r\n const filteredSites = React.useMemo(() => {\r\n if (!sites) return []\r\n if (!search) return sites\r\n const lower = search.toLowerCase()\r\n return sites.filter(site =>\r\n (site.siteName && site.siteName.toLowerCase().includes(lower))\r\n || (site.siteAddress && site.siteAddress.toLowerCase().includes(lower)),\r\n )\r\n }, [sites, search])\r\n const selectedSites = sites?.filter(site => selectedIds.includes(site.id)) || []\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Command>\r\n <CommandInput\r\n placeholder=\"Search for a site...\"\r\n value={search}\r\n onValueChange={setSearch}\r\n disabled={isLoading}\r\n />\r\n <CommandList>\r\n {isLoading && <CommandEmpty><LoadingSpinner /></CommandEmpty>}\r\n {!isLoading && filteredSites.length === 0 && (\r\n <CommandEmpty>{t('empty')}</CommandEmpty>\r\n )}\r\n <CommandGroup>\r\n {filteredSites.map(site => (\r\n <CommandItem\r\n key={site.id}\r\n value={site.id.toString()}\r\n onSelect={() => {\r\n if (!selectedIds.includes(site.id)) {\r\n handleInputChange(property, [...selectedIds, site.id])\r\n }\r\n }}\r\n disabled={selectedIds.includes(site.id)}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{site.siteName}</div>\r\n <div className=\"text-xs text-muted-foreground\">{site.siteAddress}</div>\r\n </div>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n </Command>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedSites.map(site => (\r\n <Badge key={site.id} className=\"gap-1\" variant=\"secondary\">\r\n {site.siteName}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n handleInputChange(property, selectedIds.filter(id => id !== site.id))\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isTextAreaField(property)) {\r\n return (\r\n <Textarea\r\n value={value || ''}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n rows={4}\r\n />\r\n )\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return (\r\n <>\r\n <div className=\"flex flex-row gap-2\">\r\n <Input\r\n type=\"text\"\r\n value=\"\"\r\n onChange={() => {}}\r\n placeholder=\"Add new item\"\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" disabled={!ability.can('update', 'Building')}><Plus /></Button>\r\n </div>\r\n {/* Render Existing values */}\r\n <div className=\"flex flex-row gap-2\">\r\n {(value || []).map((item: string, index: number) => (\r\n <Badge key={index} className=\"cursor-pointer inline-flex\" variant=\"secondary\">\r\n {item}\r\n </Badge>\r\n ))}\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n if (value === 'yes' || value === 'no') {\r\n const bool = value === 'yes'\r\n return (\r\n <Checkbox\r\n checked={bool}\r\n onCheckedChange={checked => handleInputChange(property, checked ? 'yes' : 'no')}\r\n />\r\n )\r\n }\r\n\r\n if (typeof value === 'number' || (value === null && isNumberField(property))) {\r\n return (\r\n <Input\r\n type=\"number\"\r\n value={value === null || value === undefined ? '' : value}\r\n onChange={(e) => {\r\n const stringValue = e.target.value\r\n const numValue = stringValue === '' ? null : Number(stringValue)\r\n handleInputChange(property, numValue)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <Input\r\n value={String(value || '')}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n}\r\n\r\nexport default FieldRenderer"],"mappings":"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","names":["property","t","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/buildingDetails/FieldRenderer.tsx"],"sourcesContent":["\"use client\"\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport React from 'react'\r\nimport {\r\n BuildingAssessmentConditions,\r\n BuildingGeometryStyle,\r\n BuildingProjectPhase,\r\n BuildingProjectType,\r\n BuildingEnergySource,\r\n BuildingOccupantType,\r\n BuildingManagementType,\r\n BuildingHeatingEnergySource,\r\n BuildingCoolingEnergySource,\r\n BuildingHotWaterEnergySource,\r\n BuildingElectricityServiceSize,\r\n BuildingElectricityServiceLocation,\r\n} from '../../../../types/dbTypes'\r\n\r\nimport { useSites } from '../../../../hooks/sites/sites'\r\nimport { useTranslations } from 'next-intl'\r\nimport { usePermissions, useMapContext } from '../../../../store'\r\n\r\nimport { Checkbox } from '../../../ui/Checkbox'\r\nimport { Input } from '../../../ui/Input'\r\nimport { Textarea } from '../../../ui/Textarea'\r\nimport { Button } from '../../../ui/Button'\r\nimport { Badge } from '../../../ui/Badge'\r\nimport { DatePicker } from '../../../ui/DatePicker'\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../../ui/Select'\r\nimport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../../../ui/Command'\r\n\r\nimport FileUpload from '../details/FileUpload'\r\n\r\nimport { Plus, X } from 'lucide-react'\r\nimport { LoadingSpinner } from '../../../ui/LoadingSpinner'\r\n\r\nexport const BuildingTypeEnum = [\r\n 'Townhouses',\r\n '<4 Storey MURB',\r\n '4+ Storey MURB',\r\n 'Stacked Townhouses',\r\n 'Detached',\r\n 'Semi Detached',\r\n] as const\r\n\r\ninterface FieldRendererProps {\r\n property: string\r\n value: any\r\n handleInputChange: (property: string, value: any) => void\r\n isTextAreaField: (property: string) => boolean\r\n isFileField: (property: string) => boolean\r\n isDateField?: (property: string) => boolean\r\n isEnumField?: (property: string) => boolean\r\n isNumberField?: (property: string) => boolean\r\n isFullWidthField?: (property: string) => boolean\r\n getEnumType?: (property: string) => string | null\r\n buildingId?: number\r\n setActiveChanges?: (editing: boolean) => void\r\n}\r\n\r\nconst FieldRenderer = ({\r\n property,\r\n value,\r\n handleInputChange,\r\n isTextAreaField,\r\n isFileField,\r\n isDateField = () => false,\r\n isEnumField = () => false,\r\n isNumberField = () => false,\r\n isFullWidthField = () => false,\r\n getEnumType = () => null,\r\n buildingId,\r\n setActiveChanges,\r\n}: FieldRendererProps) => {\r\n const t = useTranslations('BuildingFieldRenderer')\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData ?? {}\r\n\r\n // Permissions\r\n const { ability } = usePermissions()\r\n\r\n const getFileTagFromProperty = (property: string): string => {\r\n const propertyToTagMap: Record<string, string> = {\r\n buildingMaintenanceRecords: 'maintenanceRecords',\r\n buildingSystemAssessment: 'systemAssessments',\r\n buildingFireSafety: 'fireSafety',\r\n buildingOccupancyCertificate: 'occupancyCertificate',\r\n buildingEnvironmentalCompliance: 'environmentalCompliance',\r\n buildingZoningCompliance: 'zoningCompliance',\r\n buildingPermitsIssued: 'permitsIssued',\r\n buildingCertificationsFile: 'certificationsFile',\r\n buildingRegionalEnergyTrends: 'regionalEnergyTrends',\r\n buildingEnergyCodeCompliance: 'energyCodeCompliance',\r\n buildingBuildingCodeCompliance: 'buildingCodeCompliance',\r\n buildingProximityToServices: 'proximityToServices',\r\n EnergyAssessmentReports: 'buildingEnergyAssessmentReports',\r\n AirQualityReports: 'buildingAirQualityReports',\r\n WaterQualityReports: 'buildingWaterQualityReports',\r\n DSRs: 'DSRs',\r\n BCAs: 'buildingBCAs',\r\n ContractorReports: 'buildingContractorReports',\r\n EngineeringAssessments: 'buildingEngineeringAssessments',\r\n }\r\n return propertyToTagMap[property] || property\r\n }\r\n\r\n // Special handling for energy source arrays\r\n if (property === 'buildingHeatingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select heating source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHeatingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingCoolingEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select cooling source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingCoolingEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (property === 'buildingHotWaterSystemsEnergySources') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={val => {\r\n if (!selectedValues.includes(val)) {\r\n handleInputChange(property, [...selectedValues, val])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select hot water source(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingHotWaterEnergySource).filter(type => !selectedValues.includes(type)).map(type => (\r\n <SelectItem key={type} value={type}>{type.replaceAll('_', ' ')}</SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type.replaceAll('_', ' ')}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (isFileField(property)) {\r\n return (\r\n <FileUpload\r\n value={Array.isArray(value) ? value : []}\r\n property={property}\r\n tag={getFileTagFromProperty(property)}\r\n onChange={handleInputChange}\r\n editing={true}\r\n buildingId={buildingId}\r\n onFileUpload={() => setActiveChanges?.(true)}\r\n isFullWidthField={isFullWidthField(property)}\r\n />\r\n )\r\n }\r\n\r\n if (isDateField(property)) {\r\n return (\r\n <DatePicker\r\n date={value instanceof Date ? value : (value ? new Date(value) : undefined)}\r\n onSelect={date => handleInputChange(property, date)}\r\n />\r\n )\r\n }\r\n\r\n if (isEnumField(property)) {\r\n const enumType = getEnumType(property)\r\n\r\n // Multiselect for building type\r\n if (property === 'buildingType') {\r\n const selectedValues = Array.isArray(value) ? value : []\r\n return (\r\n <div className=\"space-y-2\">\r\n <Select\r\n value=\"\"\r\n onValueChange={(newType) => {\r\n if (!selectedValues.includes(newType)) {\r\n handleInputChange(property, [...selectedValues, newType])\r\n }\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select building type(s)\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum\r\n .filter(type => !selectedValues.includes(type))\r\n .map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {selectedValues.map(type => (\r\n <Badge key={type} className=\"gap-1\" variant=\"secondary\">\r\n {type}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => {\r\n const updated = selectedValues.filter(t => t !== type)\r\n handleInputChange(property, updated)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (enumType === 'CountrySubdivisionData') {\r\n // Resolve display name — handles both full (\"CA-ON\") and short (\"ON\") stored codes\r\n const resolveSubdivisionName = (code: string): string => {\r\n if (!code || !countrySubdivisionsData) return code\r\n const exact = countrySubdivisionsData[code] as any\r\n if (exact) return (exact?.name ?? exact) || code\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${code}`))\r\n if (entry) return ((entry[1] as any)?.name ?? entry[1]) || code\r\n return code\r\n }\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select subdivision\">\r\n {value ? resolveSubdivisionName(value) : undefined}\r\n </SelectValue>\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.entries(countrySubdivisionsData).map(([code, sub]) => (\r\n <SelectItem key={code} value={code}>\r\n {(sub as any)?.name ?? code}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingAssessmentConditions') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select assessment condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(condition => (\r\n <SelectItem key={condition} value={condition}>\r\n {condition.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingGeometryStyle') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select geometry style\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingGeometryStyle).map(style => (\r\n <SelectItem key={style} value={style}>\r\n {style}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectPhase') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project phase\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectPhase).map(phase => (\r\n <SelectItem key={phase} value={phase}>\r\n {phase.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingProjectType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select project type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingProjectType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingOccupantType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select occupant type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingOccupantType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'buildingAssessmentRatingCondition') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select rating condition\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingAssessmentConditions).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingManagementType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingManagementType).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingType') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {BuildingTypeEnum.map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n\r\n if (enumType === 'BuildingElectricityServiceSize') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceSize).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+').replace('Size', '')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n if (enumType === 'BuildingElectricityServiceLocation') {\r\n return (\r\n <Select\r\n value={value || ''}\r\n onValueChange={val => handleInputChange(property, val)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <SelectTrigger>\r\n <SelectValue placeholder=\"Select management type\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Object.values(BuildingElectricityServiceLocation).map(type => (\r\n <SelectItem key={type} value={type}>\r\n {type.replaceAll('_', ' ').replace('Plus', '+')}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n )\r\n }\r\n }\r\n \r\n \r\n\r\n if (property === 'buildingParentSiteId' && setActiveChanges) {\r\n const { sites, isLoading } = useSites()\r\n const [search, setSearch] = React.useState('')\r\n // A building has a single parent site (buildingParentSiteId is a scalar FK),\r\n // so this is single-select: pick one, show it once, X clears it.\r\n const selectedId = Array.isArray(value) ? (value[0] ?? null) : (value ?? null)\r\n const filteredSites = React.useMemo(() => {\r\n if (!sites) return []\r\n const lower = search.toLowerCase()\r\n return sites.filter(site =>\r\n (site.siteName && site.siteName.toLowerCase().includes(lower))\r\n || (site.siteAddress && site.siteAddress.toLowerCase().includes(lower)),\r\n )\r\n }, [sites, search])\r\n const selectedSite = sites?.find(site => site.id === selectedId) || null\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Command shouldFilter={false}>\r\n <CommandInput\r\n placeholder=\"Search for a site...\"\r\n value={search}\r\n onValueChange={setSearch}\r\n disabled={isLoading}\r\n />\r\n {search.trim() !== '' && (\r\n <CommandList>\r\n {isLoading && <CommandEmpty><LoadingSpinner /></CommandEmpty>}\r\n {!isLoading && filteredSites.length === 0 && (\r\n <CommandEmpty>{t('empty')}</CommandEmpty>\r\n )}\r\n <CommandGroup>\r\n {filteredSites.map(site => (\r\n <CommandItem\r\n key={site.id}\r\n value={site.id.toString()}\r\n onSelect={() => {\r\n handleInputChange(property, site.id)\r\n setSearch('')\r\n }}\r\n >\r\n <div>\r\n <div className=\"font-medium\">{site.siteName}</div>\r\n <div className=\"text-xs text-muted-foreground\">{site.siteAddress}</div>\r\n </div>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n </CommandList>\r\n )}\r\n </Command>\r\n {selectedSite && (\r\n <div className=\"flex flex-wrap gap-1\">\r\n <Badge className=\"gap-1\" variant=\"secondary\">\r\n {selectedSite.siteName}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"p-0 hover:bg-transparent w-auto h-auto\"\r\n onClick={() => handleInputChange(property, null)}\r\n disabled={!ability.can('update', 'Building')}\r\n >\r\n <X className=\"!w-3 !h-3\" size={8} />\r\n </Button>\r\n </Badge>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n if (isTextAreaField(property)) {\r\n return (\r\n <Textarea\r\n value={value || ''}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n rows={4}\r\n />\r\n )\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return (\r\n <>\r\n <div className=\"flex flex-row gap-2\">\r\n <Input\r\n type=\"text\"\r\n value=\"\"\r\n onChange={() => {}}\r\n placeholder=\"Add new item\"\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n <Button variant=\"outline\" size=\"icon\" disabled={!ability.can('update', 'Building')}><Plus /></Button>\r\n </div>\r\n {/* Render Existing values */}\r\n <div className=\"flex flex-row gap-2\">\r\n {(value || []).map((item: string, index: number) => (\r\n <Badge key={index} className=\"cursor-pointer inline-flex\" variant=\"secondary\">\r\n {item}\r\n </Badge>\r\n ))}\r\n </div>\r\n </>\r\n )\r\n }\r\n\r\n if (value === 'yes' || value === 'no') {\r\n const bool = value === 'yes'\r\n return (\r\n <Checkbox\r\n checked={bool}\r\n onCheckedChange={checked => handleInputChange(property, checked ? 'yes' : 'no')}\r\n />\r\n )\r\n }\r\n\r\n if (typeof value === 'number' || (value === null && isNumberField(property))) {\r\n return (\r\n <Input\r\n type=\"number\"\r\n value={value === null || value === undefined ? '' : value}\r\n onChange={(e) => {\r\n const stringValue = e.target.value\r\n const numValue = stringValue === '' ? null : Number(stringValue)\r\n handleInputChange(property, numValue)\r\n }}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <Input\r\n value={String(value || '')}\r\n onChange={e => handleInputChange(property, e.target.value)}\r\n disabled={!ability.can('update', 'Building')}\r\n />\r\n )\r\n}\r\n\r\nexport default FieldRenderer"],"mappings":"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","names":["property","t","_a","_b"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldValue.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/details/FieldValue.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"FieldValue.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/details/FieldValue.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,UAAU,eAAe;IACvB,KAAK,EAAE,GAAG,CAAA;IACV,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAA;IACjC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAQD,QAAA,MAAM,UAAU,GAAI,uDAAuF,eAAe,sBAiLzH,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { Badge } from "../../../../components/ui/Badge";
|
|
3
3
|
import FileUpload from "./FileUpload";
|
|
4
4
|
import { useMapContext } from "../../../../store";
|
|
5
|
+
import { useSites } from "../../../../hooks/sites/sites";
|
|
5
6
|
const SUBDIVISION_PROPERTIES = [
|
|
6
7
|
"buildingCountrySubdivision",
|
|
7
8
|
"siteCountrySubdivision",
|
|
@@ -9,16 +10,25 @@ const SUBDIVISION_PROPERTIES = [
|
|
|
9
10
|
];
|
|
10
11
|
const FieldValue = ({ value, label, isFile = false, property = "", onChange = () => {
|
|
11
12
|
}, editing = false }) => {
|
|
12
|
-
var _a, _b, _c;
|
|
13
|
+
var _a, _b, _c, _d;
|
|
13
14
|
const { state: mapState } = useMapContext();
|
|
14
15
|
const countrySubdivisionsData = mapState.map.countrySubdivisionsData;
|
|
16
|
+
const { sites } = useSites();
|
|
17
|
+
if (property === "buildingParentSiteId" && value != null && value !== "") {
|
|
18
|
+
const ids = Array.isArray(value) ? value : [value];
|
|
19
|
+
const names = ids.map((id) => {
|
|
20
|
+
var _a2;
|
|
21
|
+
return ((_a2 = sites.find((s) => String(s.id) === String(id))) == null ? void 0 : _a2.siteName) || String(id);
|
|
22
|
+
});
|
|
23
|
+
value = names.length <= 1 ? (_a = names[0]) != null ? _a : value : names;
|
|
24
|
+
}
|
|
15
25
|
if (SUBDIVISION_PROPERTIES.includes(property) && typeof value === "string" && value) {
|
|
16
26
|
const exact = countrySubdivisionsData == null ? void 0 : countrySubdivisionsData[value];
|
|
17
27
|
if (exact) {
|
|
18
|
-
value = ((
|
|
28
|
+
value = ((_b = exact == null ? void 0 : exact.name) != null ? _b : exact) || value;
|
|
19
29
|
} else if (countrySubdivisionsData) {
|
|
20
30
|
const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${value}`));
|
|
21
|
-
if (entry) value = ((
|
|
31
|
+
if (entry) value = ((_d = (_c = entry[1]) == null ? void 0 : _c.name) != null ? _d : entry[1]) || value;
|
|
22
32
|
}
|
|
23
33
|
}
|
|
24
34
|
const isDateValue = (val) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/details/FieldValue.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport React from 'react'\r\n\r\n// Shadcn Components\r\nimport { Badge } from '../../../../components/ui/Badge'\r\n\r\n// Custom components\r\nimport FileUpload from './FileUpload'\r\nimport { useMapContext } from '../../../../store'\r\n\r\ninterface FieldValueProps {\r\n value: any\r\n label: string | React.JSX.Element\r\n isFile?: boolean\r\n property?: string\r\n onChange?: (property: string, value: any) => void\r\n editing?: boolean\r\n}\r\n\r\nconst SUBDIVISION_PROPERTIES = [\r\n 'buildingCountrySubdivision',\r\n 'siteCountrySubdivision',\r\n 'infrastructureCountrySubdivision',\r\n]\r\n\r\nconst FieldValue = ({ value, label, isFile = false, property = '', onChange = () => {}, editing = false }: FieldValueProps) => {\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData\r\n\r\n // Resolve subdivision code → display name (handles \"CA-ON\" and short \"ON\" formats)\r\n if (SUBDIVISION_PROPERTIES.includes(property) && typeof value === 'string' && value) {\r\n const exact = countrySubdivisionsData?.[value] as any\r\n if (exact) {\r\n value = (exact?.name ?? exact) || value\r\n } else if (countrySubdivisionsData) {\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${value}`))\r\n if (entry) value = ((entry[1] as any)?.name ?? entry[1]) || value\r\n }\r\n }\r\n\r\n // Helper function to check if value is a date\r\n const isDateValue = (val: any): boolean => {\r\n // First check if property name indicates it's a date field\r\n if (property.toLowerCase().includes('date') || property.toLowerCase().includes('time')) {\r\n return true\r\n }\r\n\r\n // Check if value is actually a Date instance\r\n if (val instanceof Date) return true\r\n\r\n // For strings, only treat as date if it matches common date formats\r\n if (typeof val === 'string') {\r\n // Only check if it looks like an ISO date or timestamp format\r\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}/\r\n if (!isoDateRegex.test(val)) {\r\n return false\r\n }\r\n \r\n const date = new Date(val)\r\n return !isNaN(date.getTime())\r\n }\r\n\r\n return false\r\n }\r\n // Helper function to check if value is a URL\r\n const isUrl = (value: string): boolean => {\r\n // Check if it's a website property\r\n if (\r\n property.toLowerCase().includes('website')\r\n || property.toLowerCase().includes('url')\r\n ) {\r\n return true\r\n }\r\n\r\n // Additional check for URL pattern\r\n try {\r\n new URL(value)\r\n return true\r\n }\r\n catch {\r\n return false\r\n }\r\n }\r\n\r\n // Helper function to check if value is an email\r\n const isEmail = (value: string): boolean => {\r\n // Check if it's an email property\r\n if (property.toLowerCase().includes('email')) {\r\n return true\r\n }\r\n\r\n // Additional check for email pattern\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n return emailRegex.test(value)\r\n }\r\n\r\n // Format URL with protocol if missing\r\n const formatUrl = (url: string): string => {\r\n if (!url) return ''\r\n if (url.startsWith('http://') || url.startsWith('https://')) {\r\n return url\r\n }\r\n return `https://${url}`\r\n }\r\n\r\n const formatEnumValue = (value: string, property: string): string => {\r\n if (property === 'buildingElectricityServiceSize') {\r\n return value.replace('Size_', '')\r\n }\r\n return value.replaceAll('_', ' ')\r\n }\r\n\r\n if (value === null || value === undefined || value === '' || value === 'null'\r\n || (Array.isArray(value) && value.length === 0)) {\r\n return <span className=\"italic\">---</span>\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (isFile) {\r\n return (\r\n <FileUpload\r\n value={value}\r\n property={property}\r\n onChange={onChange}\r\n editing={editing}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-wrap gap-2\">\r\n {value.map((item, index) => (\r\n <Badge key={index} variant=\"default\">\r\n {formatEnumValue(\r\n typeof item === 'object' && item !== null\r\n ? JSON.stringify(item)\r\n : String(item),\r\n property\r\n )}\r\n </Badge>\r\n ))}\r\n </div>\r\n )\r\n }\r\n\r\n // For yes/no values\r\n if (value === 'yes' || value === 'no') {\r\n return <span>{value === 'yes' ? 'Yes' : 'No'}</span>\r\n }\r\n\r\n // Add handling for URLs and emails\r\n if (typeof value === 'string') {\r\n // Render website links\r\n if (isUrl(value)) {\r\n const formattedUrl = formatUrl(value)\r\n return (\r\n <a\r\n href={formattedUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary underline\"\r\n >\r\n {value}\r\n </a>\r\n )\r\n }\r\n\r\n // Render email links\r\n if (isEmail(value)) {\r\n return (\r\n <a\r\n href={`mailto:${value}`}\r\n className=\"text-primary underline\"\r\n >\r\n {value}\r\n </a>\r\n )\r\n }\r\n\r\n if (isDateValue(value)) {\r\n try {\r\n const date = new Date(value)\r\n if (!isNaN(date.getTime())) {\r\n return <span>{date.toLocaleDateString()}</span>\r\n }\r\n }\r\n catch {\r\n // Fall through to default handling if date parsing fails\r\n }\r\n }\r\n }\r\n\r\n return <span>{formatEnumValue(String(value), property)}</span>\r\n}\r\n\r\nexport default FieldValue"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/Data/details/FieldValue.tsx"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n// Dependencies\r\nimport React from 'react'\r\n\r\n// Shadcn Components\r\nimport { Badge } from '../../../../components/ui/Badge'\r\n\r\n// Custom components\r\nimport FileUpload from './FileUpload'\r\nimport { useMapContext } from '../../../../store'\r\nimport { useSites } from '../../../../hooks/sites/sites'\r\n\r\ninterface FieldValueProps {\r\n value: any\r\n label: string | React.JSX.Element\r\n isFile?: boolean\r\n property?: string\r\n onChange?: (property: string, value: any) => void\r\n editing?: boolean\r\n}\r\n\r\nconst SUBDIVISION_PROPERTIES = [\r\n 'buildingCountrySubdivision',\r\n 'siteCountrySubdivision',\r\n 'infrastructureCountrySubdivision',\r\n]\r\n\r\nconst FieldValue = ({ value, label, isFile = false, property = '', onChange = () => {}, editing = false }: FieldValueProps) => {\r\n const { state: mapState } = useMapContext()\r\n const countrySubdivisionsData = mapState.map.countrySubdivisionsData\r\n const { sites } = useSites()\r\n\r\n // Resolve the associated-site id(s) → site name(s); showing the raw id is\r\n // meaningless to the user.\r\n if (property === 'buildingParentSiteId' && value != null && value !== '') {\r\n const ids = Array.isArray(value) ? value : [value]\r\n const names = ids.map(id => sites.find(s => String(s.id) === String(id))?.siteName || String(id))\r\n value = names.length <= 1 ? (names[0] ?? value) : names\r\n }\r\n\r\n // Resolve subdivision code → display name (handles \"CA-ON\" and short \"ON\" formats)\r\n if (SUBDIVISION_PROPERTIES.includes(property) && typeof value === 'string' && value) {\r\n const exact = countrySubdivisionsData?.[value] as any\r\n if (exact) {\r\n value = (exact?.name ?? exact) || value\r\n } else if (countrySubdivisionsData) {\r\n const entry = Object.entries(countrySubdivisionsData).find(([k]) => k.endsWith(`-${value}`))\r\n if (entry) value = ((entry[1] as any)?.name ?? entry[1]) || value\r\n }\r\n }\r\n\r\n // Helper function to check if value is a date\r\n const isDateValue = (val: any): boolean => {\r\n // First check if property name indicates it's a date field\r\n if (property.toLowerCase().includes('date') || property.toLowerCase().includes('time')) {\r\n return true\r\n }\r\n\r\n // Check if value is actually a Date instance\r\n if (val instanceof Date) return true\r\n\r\n // For strings, only treat as date if it matches common date formats\r\n if (typeof val === 'string') {\r\n // Only check if it looks like an ISO date or timestamp format\r\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}/\r\n if (!isoDateRegex.test(val)) {\r\n return false\r\n }\r\n \r\n const date = new Date(val)\r\n return !isNaN(date.getTime())\r\n }\r\n\r\n return false\r\n }\r\n // Helper function to check if value is a URL\r\n const isUrl = (value: string): boolean => {\r\n // Check if it's a website property\r\n if (\r\n property.toLowerCase().includes('website')\r\n || property.toLowerCase().includes('url')\r\n ) {\r\n return true\r\n }\r\n\r\n // Additional check for URL pattern\r\n try {\r\n new URL(value)\r\n return true\r\n }\r\n catch {\r\n return false\r\n }\r\n }\r\n\r\n // Helper function to check if value is an email\r\n const isEmail = (value: string): boolean => {\r\n // Check if it's an email property\r\n if (property.toLowerCase().includes('email')) {\r\n return true\r\n }\r\n\r\n // Additional check for email pattern\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n return emailRegex.test(value)\r\n }\r\n\r\n // Format URL with protocol if missing\r\n const formatUrl = (url: string): string => {\r\n if (!url) return ''\r\n if (url.startsWith('http://') || url.startsWith('https://')) {\r\n return url\r\n }\r\n return `https://${url}`\r\n }\r\n\r\n const formatEnumValue = (value: string, property: string): string => {\r\n if (property === 'buildingElectricityServiceSize') {\r\n return value.replace('Size_', '')\r\n }\r\n return value.replaceAll('_', ' ')\r\n }\r\n\r\n if (value === null || value === undefined || value === '' || value === 'null'\r\n || (Array.isArray(value) && value.length === 0)) {\r\n return <span className=\"italic\">---</span>\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (isFile) {\r\n return (\r\n <FileUpload\r\n value={value}\r\n property={property}\r\n onChange={onChange}\r\n editing={editing}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-wrap gap-2\">\r\n {value.map((item, index) => (\r\n <Badge key={index} variant=\"default\">\r\n {formatEnumValue(\r\n typeof item === 'object' && item !== null\r\n ? JSON.stringify(item)\r\n : String(item),\r\n property\r\n )}\r\n </Badge>\r\n ))}\r\n </div>\r\n )\r\n }\r\n\r\n // For yes/no values\r\n if (value === 'yes' || value === 'no') {\r\n return <span>{value === 'yes' ? 'Yes' : 'No'}</span>\r\n }\r\n\r\n // Add handling for URLs and emails\r\n if (typeof value === 'string') {\r\n // Render website links\r\n if (isUrl(value)) {\r\n const formattedUrl = formatUrl(value)\r\n return (\r\n <a\r\n href={formattedUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-primary underline\"\r\n >\r\n {value}\r\n </a>\r\n )\r\n }\r\n\r\n // Render email links\r\n if (isEmail(value)) {\r\n return (\r\n <a\r\n href={`mailto:${value}`}\r\n className=\"text-primary underline\"\r\n >\r\n {value}\r\n </a>\r\n )\r\n }\r\n\r\n if (isDateValue(value)) {\r\n try {\r\n const date = new Date(value)\r\n if (!isNaN(date.getTime())) {\r\n return <span>{date.toLocaleDateString()}</span>\r\n }\r\n }\r\n catch {\r\n // Fall through to default handling if date parsing fails\r\n }\r\n }\r\n }\r\n\r\n return <span>{formatEnumValue(String(value), property)}</span>\r\n}\r\n\r\nexport default FieldValue"],"mappings":"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","names":["_a","value","property"]}
|
|
@@ -4,7 +4,9 @@ interface AssociatedBuildingsTableProps {
|
|
|
4
4
|
buildings: Building[];
|
|
5
5
|
onRowClick?: (building: Building) => void;
|
|
6
6
|
siteId?: number;
|
|
7
|
+
siteName?: string;
|
|
7
8
|
onAttachBuilding?: (building: Building) => void;
|
|
9
|
+
onDetachBuilding?: (building: Building) => void;
|
|
8
10
|
editing?: boolean;
|
|
9
11
|
setEditing?: (editing: boolean) => void;
|
|
10
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssociatedBuildings.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/siteDetails/AssociatedBuildings.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"AssociatedBuildings.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/Data/siteDetails/AssociatedBuildings.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAiCzD,UAAU,6BAA6B;IACrC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;IAC/C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CACxC;AAED,QAAA,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAodrE,CAAA;AAED,eAAe,wBAAwB,CAAA"}
|