@@ -348,3 +392,5 @@ export const DraggableWidget = ({
>
);
};
+
+// while resize calculate --realTimeViz-container-height pprperly
\ No newline at end of file
diff --git a/app/src/components/ui/componets/Dropped3dWidget.tsx b/app/src/components/ui/componets/Dropped3dWidget.tsx
index d870195..f03dea8 100644
--- a/app/src/components/ui/componets/Dropped3dWidget.tsx
+++ b/app/src/components/ui/componets/Dropped3dWidget.tsx
@@ -44,9 +44,7 @@ export default function Dropped3dWidgets() {
const plane = useRef(new THREE.Plane(new THREE.Vector3(0, 1, 0), 0)); // Floor plane for horizontal move
const verticalPlane = useRef(new THREE.Plane(new THREE.Vector3(0, 0, 1), 0)); // Vertical plane for vertical move
const planeIntersect = useRef(new THREE.Vector3());
- // const plane = useRef(new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);
- // const verticalPlane = useRef(new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);
- // const planeIntersect = useRef(new THREE.Vector3());
+
const rotationStartRef = useRef<[number, number, number]>([0, 0, 0]);
const mouseStartRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });
@@ -60,7 +58,7 @@ export default function Dropped3dWidgets() {
async function get3dWidgetData() {
const result = await get3dWidgetZoneData(selectedZone.zoneId, organization);
- console.log('result: ', result);
+
setWidgets3D(result);
const formattedWidgets = result.map((widget: WidgetData) => ({
@@ -84,8 +82,31 @@ export default function Dropped3dWidgets() {
const canvasElement = gl.domElement;
+ const handleDragEnter = (event: DragEvent) => {
+ event.preventDefault();
+ event.stopPropagation();
+ console.log("Drag enter");
+
+ };
+
+ const handleDragOver = (event: DragEvent) => {
+ event.preventDefault();
+ event.stopPropagation();
+
+ };
+
+ const handleDragLeave = (event: DragEvent) => {
+ event.preventDefault();
+ event.stopPropagation();
+ console.log("Drag leave");
+ // Remove visual feedback
+ canvasElement.style.cursor = "";
+ };
+
const onDrop = async (event: DragEvent) => {
event.preventDefault();
+ event.stopPropagation();
+ canvasElement.style.cursor = ""; // Reset cursor
const email = localStorage.getItem("email") || "";
const organization = email?.split("@")[1]?.split(".")[0];
@@ -93,6 +114,12 @@ export default function Dropped3dWidgets() {
const group1 = scene.getObjectByName("itemsGroup");
if (!group1) return;
+ // Update raycaster with current mouse position
+ const rect = canvasElement.getBoundingClientRect();
+ mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
+ mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
+ raycaster.setFromCamera(mouse, camera);
+
const intersects = raycaster.intersectObjects(scene.children, true).filter(
(intersect) =>
!intersect.object.name.includes("Roof") &&
@@ -125,12 +152,21 @@ export default function Dropped3dWidgets() {
}
};
+ // Add all event listeners
+ // canvasElement.addEventListener("dragenter", handleDragEnter);
+ // canvasElement.addEventListener("dragover", handleDragOver);
+ // canvasElement.addEventListener("dragleave", handleDragLeave);
canvasElement.addEventListener("drop", onDrop);
- return () => {
- canvasElement.removeEventListener("drop", onDrop);
- };
- }, [widgetSelect, activeModule, selectedZone.zoneId, widgetSubOption]);
+ return () => {
+ // // Clean up all event listeners
+ // canvasElement.removeEventListener("dragenter", handleDragEnter);
+ // canvasElement.removeEventListener("dragover", handleDragOver);
+ // canvasElement.removeEventListener("dragleave", handleDragLeave);
+ canvasElement.removeEventListener("drop", onDrop);
+ canvasElement.style.cursor = ""; // Ensure cursor is reset
+ };
+ }, [widgetSelect, activeModule, selectedZone.zoneId, widgetSubOption, gl.domElement, scene, raycaster, camera]);
const activeZoneWidgets = zoneWidgetData[selectedZone.zoneId] || [];
useEffect(() => {
@@ -161,7 +197,7 @@ export default function Dropped3dWidgets() {
visualizationSocket.emit("v2:viz-3D-widget:add", adding3dWidget);
}
// let response = await adding3dWidgets(selectedZone.zoneId, organization, newWidget)
- // console.log('response: ', response);
+ //
addWidget(selectedZone.zoneId, newWidget);
setRightSelect(null);
@@ -179,7 +215,7 @@ export default function Dropped3dWidgets() {
zoneId: selectedZone.zoneId,
};
- console.log('deleteWidget: ', deleteWidget);
+
if (visualizationSocket) {
visualizationSocket.emit("v2:viz-3D-widget:delete", deleteWidget);
}
@@ -190,7 +226,7 @@ export default function Dropped3dWidgets() {
activeZoneWidgets.filter((w: WidgetData) => w.id !== rightClickSelected)
);
} catch (error) {
- console.error("Error deleting widget:", error);
+
} finally {
setRightClickSelected(null);
setRightSelect(null);
@@ -304,20 +340,15 @@ export default function Dropped3dWidgets() {
const selectedWidget = zoneWidgetData[selectedZone].find(widget => widget.id === rightClickSelected);
if (!selectedWidget) return;
-
-
-
// Format values to 2 decimal places
const formatValues = (vals: number[]) => vals.map(val => parseFloat(val.toFixed(2)));
-
if (rightSelect === "Horizontal Move" || rightSelect === "Vertical Move") {
- console.log(`${rightSelect} Completed - Full Position:`, formatValues(selectedWidget.position));
let lastPosition = formatValues(selectedWidget.position) as [number, number, number];
// (async () => {
// let response = await update3dWidget(selectedZone, organization, rightClickSelected, lastPosition);
- // console.log('response: ', response);
+ //
// if (response) {
- // console.log("Widget position updated in API:", response);
+ //
// }
// })();
let updatingPosition = {
@@ -333,13 +364,13 @@ export default function Dropped3dWidgets() {
}
else if (rightSelect.includes("Rotate")) {
const rotation = selectedWidget.rotation || [0, 0, 0];
- console.log(`${rightSelect} Completed - Full Rotation:`, formatValues(rotation));
+
let lastRotation = formatValues(rotation) as [number, number, number];
// (async () => {
// let response = await update3dWidgetRotation(selectedZone, organization, rightClickSelected, lastRotation);
- // console.log('response: ', response);
+ //
// if (response) {
- // console.log("Widget position updated in API:", response);
+ //
// }
// })();
let updatingRotation = {
@@ -388,49 +419,13 @@ export default function Dropped3dWidgets() {
switch (type) {
case "ui-Widget 1":
- return (
-
handleRightClick(e, id)}
- />
- );
+ return ( handleRightClick(e, id)} />);
case "ui-Widget 2":
- return (
- handleRightClick(e, id)}
- />
- );
+ return ( handleRightClick(e, id)} />);
case "ui-Widget 3":
- return (
- handleRightClick(e, id)}
- />
- );
+ return ( handleRightClick(e, id)} />);
case "ui-Widget 4":
- return (
- handleRightClick(e, id)}
- />
- );
+ return ( handleRightClick(e, id)} />);
default:
return null;
}
diff --git a/app/src/components/ui/componets/DroppedFloatingWidgets.tsx b/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
index 465e8e4..4652ec1 100644
--- a/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
+++ b/app/src/components/ui/componets/DroppedFloatingWidgets.tsx
@@ -65,6 +65,7 @@ const DroppedObjects: React.FC = () => {
);
const [offset, setOffset] = useState<[number, number] | null>(null);
const { selectedChartId, setSelectedChartId } = useWidgetStore();
+
const [activeEdges, setActiveEdges] = useState<{
vertical: "top" | "bottom";
horizontal: "left" | "right";
@@ -84,7 +85,6 @@ const DroppedObjects: React.FC = () => {
// });
const kebabRef = useRef(null);
-
// Clean up animation frame on unmount
useEffect(() => {
return () => {
@@ -95,7 +95,10 @@ const DroppedObjects: React.FC = () => {
}, []);
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
- if (kebabRef.current && !kebabRef.current.contains(event.target as Node)) {
+ if (
+ kebabRef.current &&
+ !kebabRef.current.contains(event.target as Node)
+ ) {
setOpenKebabId(null);
}
};
@@ -113,7 +116,6 @@ const DroppedObjects: React.FC = () => {
if (zoneEntries.length === 0) return null;
const [zoneName, zone] = zoneEntries[0];
-
function handleDuplicate(zoneName: string, index: number) {
setOpenKebabId(null);
duplicateObject(zoneName, index); // Call the duplicateObject method from the store
@@ -132,7 +134,7 @@ const DroppedObjects: React.FC = () => {
}
if (visualizationSocket) {
- visualizationSocket.emit("v2:viz-float:delete", deleteFloatingWidget)
+ visualizationSocket.emit("v2:viz-float:delete", deleteFloatingWidget);
}
deleteObject(zoneName, id);
@@ -148,7 +150,10 @@ const DroppedObjects: React.FC = () => {
}
const handlePointerDown = (event: React.PointerEvent, index: number) => {
- if ((event.target as HTMLElement).closest(".kebab-options") || (event.target as HTMLElement).closest(".kebab")) {
+ if (
+ (event.target as HTMLElement).closest(".kebab-options") ||
+ (event.target as HTMLElement).closest(".kebab")
+ ) {
return; // Prevent dragging when clicking on the kebab menu or its options
}
const obj = zone.objects[index];
@@ -449,7 +454,6 @@ const DroppedObjects: React.FC = () => {
// position: boundedPosition,
// });
-
let updateFloatingWidget = {
organization: organization,
widget: {
@@ -460,7 +464,7 @@ const DroppedObjects: React.FC = () => {
zoneId: zone.zoneId
}
if (visualizationSocket) {
- visualizationSocket.emit("v2:viz-float:add", updateFloatingWidget)
+ visualizationSocket.emit("v2:viz-float:add", updateFloatingWidget);
}
// if (response.message === "Widget updated successfully") {
@@ -479,7 +483,6 @@ const DroppedObjects: React.FC = () => {
// animationRef.current = null;
// }
} catch (error) {
-
} finally {
// Clean up regardless of success or failure
setDraggingIndex(null);
@@ -565,26 +568,32 @@ const DroppedObjects: React.FC = () => {
ref={kebabRef}
onClick={(event) => {
event.stopPropagation();
- handleKebabClick(obj.id, event)
+ handleKebabClick(obj.id, event);
}}
>