{
useDroppedObjectsStore.getState().setZone(zoneName, zonesData[zoneName]?.zoneId);
- setSelectedZone({
- zoneName,
- activeSides: zonesData[zoneName].activeSides || [],
- panelOrder: zonesData[zoneName].panelOrder || [],
- lockedPanels: zonesData[zoneName].lockedPanels || [],
- widgets: zonesData[zoneName].widgets || [],
- zoneId: zonesData[zoneName]?.zoneId || "",
- zoneViewPortTarget:
- zonesData[zoneName].zoneViewPortTarget || [],
- zoneViewPortPosition:
- zonesData[zoneName].zoneViewPortPosition || [],
- });
+ handleSelect2dZoneData(zonesData[zoneName]?.zoneId, zoneName)
}}
>
{zoneName}
diff --git a/app/src/components/ui/componets/DraggableWidget.tsx b/app/src/components/ui/componets/DraggableWidget.tsx
index 86afe73..979e685 100644
--- a/app/src/components/ui/componets/DraggableWidget.tsx
+++ b/app/src/components/ui/componets/DraggableWidget.tsx
@@ -36,6 +36,7 @@ export const DraggableWidget = ({
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
widgets: Widget[];
};
@@ -44,6 +45,7 @@ export const DraggableWidget = ({
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
zoneId: string;
zoneViewPortTarget: number[];
@@ -78,9 +80,11 @@ export const DraggableWidget = ({
const isPanelHidden = hiddenPanels.includes(widget.panel);
const deleteSelectedChart = () => {
+ console.log('widget.id: ', widget.id);
const updatedWidgets = selectedZone.widgets.filter(
(w: Widget) => w.id !== widget.id
);
+ console.log('updatedWidgets: ', updatedWidgets);
setSelectedZone((prevZone: any) => ({
...prevZone,
@@ -122,7 +126,6 @@ export const DraggableWidget = ({
...widget,
id: `${widget.id}-copy-${Date.now()}`,
};
-
setSelectedZone((prevZone: any) => ({
...prevZone,
widgets: [...prevZone.widgets, duplicatedWidget],
@@ -130,7 +133,7 @@ export const DraggableWidget = ({
setOpenKebabId(null);
- console.log("Duplicated widget with ID:", duplicatedWidget.id);
+
};
const handleKebabClick = (event: React.MouseEvent
) => {
@@ -173,6 +176,7 @@ export const DraggableWidget = ({
};
const handleDrop = (event: React.DragEvent) => {
+
event.preventDefault();
const fromIndex = parseInt(event.dataTransfer.getData("text/plain"), 10); // Get the dragged widget's index
const toIndex = index; // The index of the widget where the drop occurred
@@ -186,9 +190,8 @@ export const DraggableWidget = ({
diff --git a/app/src/components/ui/componets/Dropped3dWidget.tsx b/app/src/components/ui/componets/Dropped3dWidget.tsx
new file mode 100644
index 0000000..e0e2a7d
--- /dev/null
+++ b/app/src/components/ui/componets/Dropped3dWidget.tsx
@@ -0,0 +1,79 @@
+
+import { useThree } from "@react-three/fiber";
+import React, { useState, useEffect } from "react";
+import { useAsset3dWidget } from "../../../store/store";
+import useModuleStore from "../../../store/useModuleStore";
+import { ThreeState } from "../../../types/world/worldTypes";
+import * as THREE from "three";
+import Throughput from "../../layout/3D-cards/cards/Throughput";
+import ProductionCapacity from "../../layout/3D-cards/cards/ProductionCapacity";
+import ReturnOfInvestment from "../../layout/3D-cards/cards/ReturnOfInvestment";
+import StateWorking from "../../layout/3D-cards/cards/StateWorking";
+
+export default function Dropped3dWidgets() {
+ const { widgetSelect } = useAsset3dWidget();
+ const { activeModule } = useModuleStore();
+ const { raycaster, gl, scene }: ThreeState = useThree();
+
+ // 🔥 Store multiple instances per widget type
+ const [widgetPositions, setWidgetPositions] = useState
>({});
+
+ useEffect(() => {
+ if (activeModule !== "visualization") return;
+ const canvasElement = gl.domElement;
+
+ const onDrop = (event: DragEvent) => {
+ event.preventDefault(); // Prevent default browser behavior
+
+ if (!widgetSelect.startsWith("ui")) return;
+
+
+ const group1 = scene.getObjectByName("itemsGroup");
+ if (!group1) return;
+
+
+
+ const Assets = group1.children
+ .map((val) => scene.getObjectByProperty("uuid", val.uuid))
+ .filter(Boolean) as THREE.Object3D[];
+
+
+ const intersects = raycaster.intersectObjects(Assets);
+
+ if (intersects.length > 0) {
+ const { x, y, z } = intersects[0].point;
+
+
+ // ✅ Allow multiple instances by storing positions in an array
+ setWidgetPositions((prev) => ({
+ ...prev,
+ [widgetSelect]: [...(prev[widgetSelect] || []), [x, y, z]],
+ }));
+ }
+ };
+
+ canvasElement.addEventListener("drop", onDrop);
+
+ return () => {
+ canvasElement.removeEventListener("drop", onDrop);
+ };
+ }, [widgetSelect, activeModule]);
+
+ return (
+ <>
+ {widgetPositions["ui-Widget 1"]?.map((pos, index) => (
+
+ ))}
+ {widgetPositions["ui-Widget 2"]?.map((pos, index) => (
+
+ ))}
+ {widgetPositions["ui-Widget 3"]?.map((pos, index) => (
+
+ ))}
+ {widgetPositions["ui-Widget 4"]?.map((pos, index) => (
+
+ ))}
+ >
+ );
+}
+
diff --git a/app/src/components/ui/componets/DroppedFloatingWidgets.tsx b/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
index 95668f9..ffddc23 100644
--- a/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
+++ b/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
@@ -8,7 +8,6 @@ import { useDroppedObjectsStore, Zones } from "../../../store/useDroppedObjectsS
const DroppedObjects: React.FC = () => {
const zones = useDroppedObjectsStore((state) => state.zones);
-
const updateObjectPosition = useDroppedObjectsStore((state) => state.updateObjectPosition);
const [draggingIndex, setDraggingIndex] = useState<{ zone: string; index: number } | null>(null);
const [offset, setOffset] = useState<[number, number] | null>(null);
diff --git a/app/src/components/ui/componets/Panel.tsx b/app/src/components/ui/componets/Panel.tsx
index 3fee476..1d4cc44 100644
--- a/app/src/components/ui/componets/Panel.tsx
+++ b/app/src/components/ui/componets/Panel.tsx
@@ -3,6 +3,7 @@ import { useWidgetStore } from "../../../store/useWidgetStore";
import { usePlayButtonStore } from "../../../store/usePlayButtonStore";
import { DraggableWidget } from "./DraggableWidget";
import { arrayMove } from "@dnd-kit/sortable";
+import { addingWidgets } from "../../../services/realTimeVisulization/zoneData/addWidgets";
type Side = "top" | "bottom" | "left" | "right";
@@ -19,6 +20,7 @@ interface PanelProps {
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
zoneId: string;
zoneViewPortTarget: number[];
@@ -30,6 +32,7 @@ interface PanelProps {
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
zoneId: string;
zoneViewPortTarget: number[];
@@ -72,9 +75,8 @@ const Panel: React.FC = ({
case "top":
case "bottom":
return {
- width: `calc(100% - ${
- (leftActive ? panelSize : 0) + (rightActive ? panelSize : 0)
- }px)`,
+ width: `calc(100% - ${(leftActive ? panelSize : 0) + (rightActive ? panelSize : 0)
+ }px)`,
height: `${panelSize - 2}px`,
left: leftActive ? `${panelSize}px` : "0",
right: rightActive ? `${panelSize}px` : "0",
@@ -84,9 +86,8 @@ const Panel: React.FC = ({
case "right":
return {
width: `${panelSize - 2}px`,
- height: `calc(100% - ${
- (topActive ? panelSize : 0) + (bottomActive ? panelSize : 0)
- }px)`,
+ height: `calc(100% - ${(topActive ? panelSize : 0) + (bottomActive ? panelSize : 0)
+ }px)`,
top: topActive ? `${panelSize}px` : "0",
bottom: bottomActive ? `${panelSize}px` : "0",
[side]: "0",
@@ -99,6 +100,7 @@ const Panel: React.FC = ({
);
const handleDrop = (e: React.DragEvent, panel: Side) => {
+
e.preventDefault();
const { draggedAsset } = useWidgetStore.getState();
if (!draggedAsset) return;
@@ -109,8 +111,6 @@ const Panel: React.FC = ({
if (currentWidgetsCount >= maxCapacity) return;
- console.log("draggedAsset: ", draggedAsset);
- console.log("panel: ", panel);
addWidgetToPanel(draggedAsset, panel);
};
@@ -139,17 +139,27 @@ const Panel: React.FC = ({
};
// while dublicate check this and add
- const addWidgetToPanel = (asset: any, panel: Side) => {
+ const addWidgetToPanel = async (asset: any, panel: Side) => {
+ const email = localStorage.getItem("email") || "";
+ const organization = email?.split("@")[1]?.split(".")[0]
const newWidget = {
...asset,
id: generateUniqueId(),
panel,
};
+ try {
+ let response = await addingWidgets(selectedZone.zoneId, organization, newWidget);
+ console.log("response: ", response);
+ if (response.message === "Widget created successfully") {
+ setSelectedZone((prev) => ({
+ ...prev,
+ widgets: [...prev.widgets, newWidget],
+ }));
+ }
+ } catch (error) {
+ console.error("Error adding widget:", error);
+ }
- setSelectedZone((prev) => ({
- ...prev,
- widgets: [...prev.widgets, newWidget],
- }));
};
useEffect(() => {
@@ -180,7 +190,7 @@ const Panel: React.FC = ({
const handleReorder = (fromIndex: number, toIndex: number, panel: Side) => {
if (!selectedZone) return; // Ensure selectedZone is not null
- console.log("selectedZone: ", selectedZone);
+
setSelectedZone((prev) => {
if (!prev) return prev; // Ensure prev is not null
diff --git a/app/src/components/ui/componets/RealTimeVisulization.tsx b/app/src/components/ui/componets/RealTimeVisulization.tsx
index be0f574..27044b1 100644
--- a/app/src/components/ui/componets/RealTimeVisulization.tsx
+++ b/app/src/components/ui/componets/RealTimeVisulization.tsx
@@ -9,7 +9,9 @@ import useModuleStore from "../../../store/useModuleStore";
import DroppedObjects from "./DroppedFloatingWidgets";
import { useDroppedObjectsStore } from "../../../store/useDroppedObjectsStore";
-import { useZones } from "../../../store/store";
+import { useAsset3dWidget, useZones } from "../../../store/store";
+import { getZoneData } from "../../../services/realTimeVisulization/zoneData/getZones";
+import { getZone2dData } from "../../../services/realTimeVisulization/zoneData/getZoneData";
type Side = "top" | "bottom" | "left" | "right";
@@ -19,6 +21,7 @@ type FormattedZoneData = Record<
{
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
zoneId: string;
zoneViewPortTarget: number[];
@@ -43,25 +46,38 @@ const RealTimeVisulization: React.FC = () => {
const [zonesData, setZonesData] = useState({});
const { selectedZone, setSelectedZone } = useSelectedZoneStore();
const { zones } = useZones()
-
+ const [floatingWidgets, setFloatingWidgets] = useState>({});
+ const { widgetSelect, setWidgetSelect } = useAsset3dWidget();
useEffect(() => {
- const data = Array.isArray(zones) ? zones : [];
+ async function GetZoneData() {
+ const email = localStorage.getItem("email") || "";
+ const organization = email?.split("@")[1]?.split(".")[0];
+ try {
+ const response = await getZone2dData(organization);
+ if (!Array.isArray(response)) {
+ return;
+ }
+ const formattedData = response.reduce((acc, zone) => {
+ acc[zone.zoneName] = {
+ activeSides: [],
+ panelOrder: [],
+ lockedPanels: [],
+ zoneId: zone.zoneId,
+ zoneViewPortTarget: zone.viewPortCenter,
+ zoneViewPortPosition: zone.viewPortposition,
+ widgets: [],
+ };
+ return acc;
+ }, {});
+ setZonesData(formattedData);
+ } catch (error) {
+ console.log('error: ', error);
+ }
+ }
- const formattedData = data.reduce((acc, zone) => {
- acc[zone.zoneName] = {
- activeSides: [],
- panelOrder: [],
- lockedPanels: [],
- zoneId: zone.zoneId,
- zoneViewPortTarget: zone.viewPortCenter,
- zoneViewPortPosition: zone.viewPortposition,
- widgets: [],
- };
- return acc;
- }, {});
+ GetZoneData();
+ }, []); // Removed `zones` from dependencies
- setZonesData(formattedData);
- }, [zones]);
useEffect(() => {
setZonesData((prev) => {
@@ -81,37 +97,47 @@ const RealTimeVisulization: React.FC = () => {
};
});
}, [selectedZone]);
+
+ useEffect(() => {
+
+ }, [floatingWidgets])
const handleDrop = (event: React.DragEvent) => {
event.preventDefault();
const data = event.dataTransfer.getData("text/plain");
- if (!data || !selectedZone.zoneName) return;
-
+ if (widgetSelect !== "") return;
+ if (!data || selectedZone.zoneName === "") return;
+
const droppedData = JSON.parse(data);
const canvasElement = document.getElementById("real-time-vis-canvas");
if (!canvasElement) return;
-
+
const canvasRect = canvasElement.getBoundingClientRect();
const relativeX = event.clientX - canvasRect.left;
const relativeY = event.clientY - canvasRect.top;
-
+
const newObject = {
...droppedData,
position: [relativeY, relativeX], // Y first because of top/left style
};
-
- console.log("newObject: ", newObject);
-
// Only set zone if it’s not already in the store (prevents overwriting objects)
const existingZone = useDroppedObjectsStore.getState().zones[selectedZone.zoneName];
if (!existingZone) {
useDroppedObjectsStore.getState().setZone(selectedZone.zoneName, selectedZone.zoneId);
}
-
// Add the dropped object to the zone
useDroppedObjectsStore.getState().addObject(selectedZone.zoneName, newObject);
+ setFloatingWidgets((prevWidgets) => ({
+ ...prevWidgets,
+ [selectedZone.zoneName]: {
+ ...prevWidgets[selectedZone.zoneName],
+ zoneName: selectedZone.zoneName,
+ zoneId: selectedZone.zoneId,
+ objects: [...(prevWidgets[selectedZone.zoneName]?.objects || []), newObject],
+ },
+ }));
};
-
+
return (
{
width: isPlaying || activeModule !== "visualization" ? "100vw" : "",
left: isPlaying || activeModule !== "visualization" ? "0%" : "",
}}
+
>
(
{title}
- {data?.stocks.map((stock, index) => (
+ {data?.stocks?.map((stock, index) => (
diff --git a/app/src/modules/builder/groups/floorItemsGroup.tsx b/app/src/modules/builder/groups/floorItemsGroup.tsx
index 134e10d..8ddcdc9 100644
--- a/app/src/modules/builder/groups/floorItemsGroup.tsx
+++ b/app/src/modules/builder/groups/floorItemsGroup.tsx
@@ -1,5 +1,5 @@
import { useFrame, useThree } from "@react-three/fiber";
-import { useActiveTool, useCamMode, useDeletableFloorItem, useDeleteModels, useFloorItems, useLoadingProgress, useRenderDistance, useselectedFloorItem, useSelectedItem, useSocketStore, useToggleView, useTransformMode } from "../../../store/store";
+import { useActiveTool, useAsset3dWidget, useCamMode, useDeletableFloorItem, useDeleteModels, useFloorItems, useLoadingProgress, useRenderDistance, useselectedFloorItem, useSelectedItem, useSocketStore, useToggleView, useTransformMode } from "../../../store/store";
import assetVisibility from "../geomentries/assets/assetVisibility";
import { useEffect } from "react";
import * as THREE from "three";
@@ -33,7 +33,6 @@ const FloorItemsGroup = ({ itemsGroup, hoveredDeletableFloorItem, AttachedObject
const { setLoadingProgress } = useLoadingProgress();
const { activeModule } = useModuleStore();
const { socket } = useSocketStore();
-
const loader = new GLTFLoader();
const dracoLoader = new DRACOLoader();
@@ -306,6 +305,8 @@ const FloorItemsGroup = ({ itemsGroup, hoveredDeletableFloorItem, AttachedObject
};
}, [deleteModels, transformMode, controls, selectedItem, state.camera, state.pointer, activeTool, activeModule]);
+
+
useFrame(() => {
if (controls)
assetVisibility(itemsGroup, state.camera.position, renderDistance);
diff --git a/app/src/modules/builder/groups/wallItemsGroup.tsx b/app/src/modules/builder/groups/wallItemsGroup.tsx
index 00d7834..c79adde 100644
--- a/app/src/modules/builder/groups/wallItemsGroup.tsx
+++ b/app/src/modules/builder/groups/wallItemsGroup.tsx
@@ -224,6 +224,7 @@ const WallItemsGroup = ({ currentWallItem, AssetConfigurations, hoveredDeletable
const onDrop = (event: any) => {
if (!event.dataTransfer?.files[0]) return
+
pointer.x = (event.clientX / window.innerWidth) * 2 - 1;
pointer.y = -(event.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(pointer, camera);
diff --git a/app/src/modules/market/AssetPreview.tsx b/app/src/modules/market/AssetPreview.tsx
index 864c5e5..9a65990 100644
--- a/app/src/modules/market/AssetPreview.tsx
+++ b/app/src/modules/market/AssetPreview.tsx
@@ -9,7 +9,7 @@ import * as THREE from "three";
// Define the shape of the selected card
interface SelectedCard {
assetName: string;
- uploadedOn: number;
+ uploadedOn: string;
price: number;
rating: number;
views: number;
diff --git a/app/src/modules/scene/scene.tsx b/app/src/modules/scene/scene.tsx
index 9b13a54..ac74240 100644
--- a/app/src/modules/scene/scene.tsx
+++ b/app/src/modules/scene/scene.tsx
@@ -19,6 +19,8 @@ import DroppedObjects from "../../components/ui/componets/DroppedFloatingWidgets
// import Simulation from "./simulationtemp/simulation";
import ZoneCentreTarget from "../../components/ui/componets/zoneCameraTarget";
+import ProductionCapacity from "../../components/layout/3D-cards/cards/ProductionCapacity";
+import Dropped3dWidgets from "../../components/ui/componets/Dropped3dWidget";
export default function Scene() {
@@ -43,6 +45,7 @@ export default function Scene() {
}}
>
+
diff --git a/app/src/modules/simulation/simulation.tsx b/app/src/modules/simulation/simulation.tsx
index 10934fb..73ef27f 100644
--- a/app/src/modules/simulation/simulation.tsx
+++ b/app/src/modules/simulation/simulation.tsx
@@ -14,7 +14,7 @@ function Simulation() {
const [processes, setProcesses] = useState([]);
useEffect(() => {
- console.log('simulationPaths: ', simulationPaths);
+
}, [simulationPaths]);
// useEffect(() => {
diff --git a/app/src/services/realTimeVisulization/zoneData/addWidgets.ts b/app/src/services/realTimeVisulization/zoneData/addWidgets.ts
new file mode 100644
index 0000000..683943e
--- /dev/null
+++ b/app/src/services/realTimeVisulization/zoneData/addWidgets.ts
@@ -0,0 +1,30 @@
+let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
+
+export const addingWidgets = async (
+ zoneId: string,
+ organization: string,
+ widget: {}
+) => {
+ try {
+ const response = await fetch(`${url_Backend_dwinzo}/api/v2/widget/save`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ organization, zoneId, widget }),
+ });
+
+ if (!response.ok) {
+ throw new Error("Failed to add widget in the zone");
+ }
+
+ const result = await response.json();
+ return result;
+ } catch (error) {
+ if (error instanceof Error) {
+ throw new Error(error.message);
+ } else {
+ throw new Error("An unknown error occurred");
+ }
+ }
+};
diff --git a/app/src/services/realTimeVisulization/zoneData/getSelect2dZoneData.ts b/app/src/services/realTimeVisulization/zoneData/getSelect2dZoneData.ts
new file mode 100644
index 0000000..71d9c2f
--- /dev/null
+++ b/app/src/services/realTimeVisulization/zoneData/getSelect2dZoneData.ts
@@ -0,0 +1,27 @@
+let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
+console.log("url_Backend_dwinzo: ", url_Backend_dwinzo);
+
+export const getSelect2dZoneData = async (
+ ZoneId?: string,
+ organization?: string
+) => {
+ try {
+ const response = await fetch(
+ `${url_Backend_dwinzo}/api/v2/ZoneVisualization/${ZoneId}?organization=${organization}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }
+ );
+
+ if (!response.ok) {
+ throw new Error("Failed to fetch zoneDatas");
+ }
+
+ return await response.json();
+ } catch (error: any) {
+ throw new Error(error.message);
+ }
+};
diff --git a/app/src/services/realTimeVisulization/zoneData/getZoneData.ts b/app/src/services/realTimeVisulization/zoneData/getZoneData.ts
new file mode 100644
index 0000000..d2df867
--- /dev/null
+++ b/app/src/services/realTimeVisulization/zoneData/getZoneData.ts
@@ -0,0 +1,23 @@
+let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
+
+export const getZone2dData = async (organization?: string) => {
+ try {
+ const response = await fetch(
+ `${url_Backend_dwinzo}/api/v2/pageZodeData?organization=${organization}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }
+ );
+
+ if (!response.ok) {
+ throw new Error("Failed to fetch zoneDatas");
+ }
+
+ return await response.json();
+ } catch (error: any) {
+ throw new Error(error.message);
+ }
+};
diff --git a/app/src/services/realTimeVisulization/zoneData/panel.ts b/app/src/services/realTimeVisulization/zoneData/panel.ts
index b70889a..7f89eed 100644
--- a/app/src/services/realTimeVisulization/zoneData/panel.ts
+++ b/app/src/services/realTimeVisulization/zoneData/panel.ts
@@ -1,22 +1,19 @@
-let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_BACKEND_URL}`;
+let url_Backend_dwinzo = `http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}`;
type Side = "top" | "bottom" | "left" | "right";
export const panelData = async (
organization: string,
- zoneID: string,
+ zoneId: string,
panelOrder: Side[]
) => {
- console.log("panelOrder: ", panelOrder);
- console.log("zoneID: ", zoneID);
- console.log("organization: ", organization);
try {
- const response = await fetch(`${url_Backend_dwinzo}/api/v1/panel/save`, {
+ const response = await fetch(`${url_Backend_dwinzo}/api/v2/panel/save`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
- body: JSON.stringify({ organization, zoneID, panelOrder }),
+ body: JSON.stringify({ organization, zoneId, panelOrder }),
});
if (!response.ok) {
@@ -33,16 +30,3 @@ export const panelData = async (
}
}
};
-// {objects.map((obj, index) => (
-//
-//
-//
-//
{obj.header}
-//
-//
{obj.value}
-//
{obj.per}
-//
-//
-//
-//
-// ))}
diff --git a/app/src/store/store.ts b/app/src/store/store.ts
index eb2fac4..8bbcba1 100644
--- a/app/src/store/store.ts
+++ b/app/src/store/store.ts
@@ -348,4 +348,7 @@ export const useEditPosition = create((set) => ({
setEdit: (value) => set({ Edit: value }), // Properly updating the state
}));
-
+export const useAsset3dWidget = create((set: any) => ({
+ widgetSelect: "",
+ setWidgetSelect: (x: any) => set({ widgetSelect: x }),
+}));
diff --git a/app/src/store/useZoneStore.ts b/app/src/store/useZoneStore.ts
index 007a1c6..77dd0d1 100644
--- a/app/src/store/useZoneStore.ts
+++ b/app/src/store/useZoneStore.ts
@@ -14,6 +14,7 @@ interface SelectedZoneState {
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
+
lockedPanels: Side[];
zoneId: string;
zoneViewPortTarget: number[];
diff --git a/app/src/styles/components/visualization/floating/common.scss b/app/src/styles/components/visualization/floating/common.scss
index 2994187..00c88a5 100644
--- a/app/src/styles/components/visualization/floating/common.scss
+++ b/app/src/styles/components/visualization/floating/common.scss
@@ -109,7 +109,7 @@
.productionCapacity-wrapper {
- background: var(--background-color);
+ background-color: var(--background-color);
display: flex;
flex-direction: column;
gap: 6px;
@@ -170,6 +170,9 @@
}
}
}
+ .bar-chart{
+ padding:14px 0;
+ }
}