diff --git a/app/src/components/layout/sidebarRight/SideBarRight.tsx b/app/src/components/layout/sidebarRight/SideBarRight.tsx
index 38f0b18..cb9b5dc 100644
--- a/app/src/components/layout/sidebarRight/SideBarRight.tsx
+++ b/app/src/components/layout/sidebarRight/SideBarRight.tsx
@@ -1,148 +1,161 @@
import React, { useEffect } from "react";
import Header from "./Header";
import useModuleStore, {
- useSubModuleStore,
+ useSubModuleStore,
} from "../../../store/useModuleStore";
import {
- AnalysisIcon,
- MechanicsIcon,
- PropertiesIcon,
- SimulationIcon,
+ AnalysisIcon,
+ MechanicsIcon,
+ PropertiesIcon,
+ SimulationIcon,
} from "../../icons/SimulationIcons";
import useToggleStore from "../../../store/useUIToggleStore";
import Visualization from "./visualization/Visualization";
import Analysis from "./analysis/Analysis";
import Simulations from "./simulation/Simulations";
import { useSelectedFloorItem } from "../../../store/store";
-import { useSelectedEventData, useSelectedEventSphere } from "../../../store/simulation/useSimulationStore";
+import {
+ useSelectedEventData,
+ useSelectedEventSphere,
+} from "../../../store/simulation/useSimulationStore";
import GlobalProperties from "./properties/GlobalProperties";
import AsstePropertiies from "./properties/AssetProperties";
import ZoneProperties from "./properties/ZoneProperties";
import EventProperties from "./properties/eventProperties/EventProperties";
const SideBarRight: React.FC = () => {
- const { activeModule } = useModuleStore();
- const { toggleUI } = useToggleStore();
- const { subModule, setSubModule } = useSubModuleStore();
- const { selectedFloorItem } = useSelectedFloorItem();
- const { selectedEventData } = useSelectedEventData();
- const { selectedEventSphere } = useSelectedEventSphere();
+ const { activeModule } = useModuleStore();
+ const { toggleUI } = useToggleStore();
+ const { subModule, setSubModule } = useSubModuleStore();
+ const { selectedFloorItem } = useSelectedFloorItem();
+ const { selectedEventData } = useSelectedEventData();
+ const { selectedEventSphere } = useSelectedEventSphere();
- // Reset activeList whenever activeModule changes
- useEffect(() => {
- if (activeModule !== "simulation") setSubModule("properties");
- if (activeModule === "simulation") setSubModule("simulations");
- }, [activeModule]);
+ // Reset activeList whenever activeModule changes
+ useEffect(() => {
+ if (activeModule !== "simulation") setSubModule("properties");
+ if (activeModule === "simulation") setSubModule("simulations");
+ }, [activeModule, setSubModule]);
- useEffect(() => {
- if (activeModule !== "mechanics" && selectedEventData && selectedEventSphere) {
- setSubModule("mechanics");
- } else if (!selectedEventData && !selectedEventSphere) {
- if (activeModule === 'simulation') {
- setSubModule("simulations");
- }
- };
- }, [activeModule, selectedEventData, selectedEventSphere])
+ useEffect(() => {
+ if (
+ activeModule !== "mechanics" &&
+ selectedEventData &&
+ selectedEventSphere
+ ) {
+ setSubModule("mechanics");
+ } else if (!selectedEventData && !selectedEventSphere) {
+ if (activeModule === "simulation") {
+ setSubModule("simulations");
+ }
+ }
+ }, [activeModule, selectedEventData, selectedEventSphere, setSubModule]);
- return (
-
-
- {toggleUI && (
-
-
setSubModule("properties")}
- >
-
-
- {activeModule === "simulation" && (
- <>
-
setSubModule("mechanics")}
- >
-
-
-
setSubModule("simulations")}
- >
-
-
-
setSubModule("analysis")}
- >
-
-
- >
- )}
-
- )}
- {/* process builder */}
- {toggleUI &&
- subModule === "properties" &&
- activeModule !== "visualization" &&
- !selectedFloorItem && (
-
- )}
- {toggleUI &&
- subModule === "properties" &&
- activeModule !== "visualization" &&
- selectedFloorItem && (
-
- )}
- {toggleUI &&
- subModule === "zoneProperties" &&
- (activeModule === "builder" || activeModule === "simulation") && (
-
- )}
- {/* simulation */}
- {toggleUI && activeModule === "simulation" && (
- <>
- {subModule === "simulations" && (
-
- )}
- {subModule === "mechanics" && (
-
- )}
- {subModule === "analysis" && (
-
- )}
- >
- )}
- {/* realtime visualization */}
- {toggleUI && activeModule === "visualization" &&
}
+ return (
+
+
+ {toggleUI && (
+
+ {activeModule !== "simulation" && (
+
+ )}
+ {activeModule === "simulation" && (
+ <>
+
+
+
+ >
+ )}
- );
+ )}
+ {/* process builder */}
+ {toggleUI &&
+ subModule === "properties" &&
+ activeModule !== "visualization" &&
+ !selectedFloorItem && (
+
+ )}
+ {toggleUI &&
+ subModule === "properties" &&
+ activeModule !== "visualization" &&
+ selectedFloorItem && (
+
+ )}
+ {toggleUI &&
+ subModule === "zoneProperties" &&
+ (activeModule === "builder" || activeModule === "simulation") && (
+
+ )}
+ {/* simulation */}
+ {toggleUI && activeModule === "simulation" && (
+ <>
+ {subModule === "simulations" && (
+
+ )}
+ {subModule === "mechanics" && (
+
+ )}
+ {subModule === "analysis" && (
+
+ )}
+ >
+ )}
+ {/* realtime visualization */}
+ {toggleUI && activeModule === "visualization" &&
}
+
+ );
};
-export default SideBarRight;
\ No newline at end of file
+export default SideBarRight;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/EventProperties.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/EventProperties.tsx
index 621a096..847d035 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/EventProperties.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/EventProperties.tsx
@@ -1,6 +1,7 @@
import React, { useEffect, useState } from "react";
import {
useSelectedEventData,
+ useSelectedEventSphere,
useSelectedProduct,
} from "../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../store/simulation/useProductStore";
@@ -9,6 +10,7 @@ import VehicleMechanics from "./mechanics/vehicleMechanics";
import RoboticArmMechanics from "./mechanics/roboticArmMechanics";
import MachineMechanics from "./mechanics/machineMechanics";
import StorageMechanics from "./mechanics/storageMechanics";
+import { AddIcon } from "../../../../icons/ExportCommonIcons";
const EventProperties: React.FC = () => {
const { selectedEventData } = useSelectedEventData();
@@ -18,13 +20,15 @@ const EventProperties: React.FC = () => {
null
);
const [assetType, setAssetType] = useState
(null);
-
+ const { products } = useProductStore();
+ const { selectedEventSphere } = useSelectedEventSphere();
useEffect(() => {
const event = getCurrentEventData();
setCurrentEventData(event);
const type = determineAssetType(event);
setAssetType(type);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedEventData, selectedProduct]);
const getCurrentEventData = () => {
@@ -72,6 +76,39 @@ const EventProperties: React.FC = () => {
{assetType === "storageUnit" && }
>
)}
+ {!currentEventData && selectedEventSphere && (
+
+
+ Oops! It looks like this object doesn't have an
+ event assigned yet. To continue, please link it to one of the
+ products below.
+
+
+
+
+ Here are some products you can add it to:
+
+
+ {products.map((product) => (
+ -
+
+
+ ))}
+
+
+
+ )}
+ {!selectedEventSphere && (
+
+
+ Oops! It looks like you haven't selected an event
+ point yet. Please select an event to view its properties.
+
+
+ )}
);
};
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx
new file mode 100644
index 0000000..56626c8
--- /dev/null
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/components/ActionsList.tsx
@@ -0,0 +1,197 @@
+import React, { useRef } from "react";
+import {
+ AddIcon,
+ RemoveIcon,
+ ResizeHeightIcon,
+} from "../../../../../icons/ExportCommonIcons";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import { handleResize } from "../../../../../../functions/handleResizePannel";
+import {
+ useSelectedAction,
+ useSelectedEventData,
+ useSelectedProduct,
+} from "../../../../../../store/simulation/useSimulationStore";
+import { MathUtils } from "three";
+import { useProductStore } from "../../../../../../store/simulation/useProductStore";
+
+interface ActionsListProps {
+ setSelectedPointData: (data: any) => void; // You can replace `any` with a more specific type if you have one
+ selectedPointData: any; // You can replace `any` with a more specific type if you have one
+ // ui control props
+ multipleAction?: boolean;
+}
+
+const ActionsList: React.FC = ({
+ setSelectedPointData,
+ selectedPointData,
+ multipleAction = false,
+}) => {
+ const actionsContainerRef = useRef(null);
+
+ // store
+ const { selectedEventData } = useSelectedEventData();
+ const { updateAction, addAction, removeAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
+ const { selectedAction, setSelectedAction, clearSelectedAction } =
+ useSelectedAction();
+
+ const handleAddAction = () => {
+ if (!selectedEventData || !selectedPointData) return;
+
+ const newAction = {
+ actionUuid: MathUtils.generateUUID(),
+ actionName: `Action ${selectedPointData.actions.length + 1}`,
+ actionType: "pickAndPlace" as const,
+ process: {
+ startPoint: null,
+ endPoint: null,
+ },
+ triggers: [] as TriggerSchema[],
+ };
+
+ addAction(
+ selectedProduct.productId,
+ selectedEventData.data.modelUuid,
+ selectedEventData.selectedPoint,
+ newAction
+ );
+
+ const updatedPoint = {
+ ...selectedPointData,
+ actions: [...selectedPointData.actions, newAction],
+ };
+ setSelectedPointData(updatedPoint);
+ setSelectedAction(newAction.actionUuid, newAction.actionName);
+ };
+
+ const handleDeleteAction = (actionUuid: string) => {
+ if (!selectedPointData) return;
+
+ removeAction(actionUuid);
+ const newActions = selectedPointData.actions.filter(
+ (a: any) => a.actionUuid !== actionUuid
+ );
+
+ const updatedPoint = {
+ ...selectedPointData,
+ actions: newActions,
+ };
+ setSelectedPointData(updatedPoint);
+
+ if (selectedAction.actionId === actionUuid) {
+ if (newActions.length > 0) {
+ setSelectedAction(newActions[0].actionUuid, newActions[0].actionName);
+ } else {
+ clearSelectedAction();
+ }
+ }
+ };
+
+ const handleRenameAction = (newName: string) => {
+ if (!selectedAction.actionId) return;
+ updateAction(selectedAction.actionId, { actionName: newName });
+
+ if (selectedPointData?.actions) {
+ const updatedActions = selectedPointData.actions.map((action: any) =>
+ action.actionUuid === selectedAction.actionId
+ ? { ...action, actionName: newName }
+ : action
+ );
+ setSelectedPointData({
+ ...selectedPointData,
+ actions: updatedActions,
+ });
+ } else {
+ // write logic for single action
+ return;
+ }
+ };
+
+ const handleActionSelect = (actionUuid: string, actionName: string) => {
+ setSelectedAction(actionUuid, actionName);
+ };
+
+ return (
+
+
+
+
Actions
+ {multipleAction && (
+
+ )}
+
+
+
+ {multipleAction &&
+ selectedPointData.actions.map((action: any) => (
+
+
+ {selectedPointData.actions.length > 1 && (
+
+ )}
+
+ ))}
+ {!multipleAction && selectedPointData && (
+
+
+
+ )}
+
+
+
+
+
+ );
+};
+
+export default ActionsList;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx
index c13bd75..b370b3e 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/conveyorMechanics.tsx
@@ -1,212 +1,224 @@
-import { useEffect, useState } from 'react'
-import InputWithDropDown from '../../../../../ui/inputs/InputWithDropDown'
-import DelayAction from '../actions/DelayAction'
-import RenameInput from '../../../../../ui/inputs/RenameInput'
-import LabledDropdown from '../../../../../ui/inputs/LabledDropdown'
-import DespawnAction from '../actions/DespawnAction'
-import SwapAction from '../actions/SwapAction'
-import SpawnAction from '../actions/SpawnAction'
-import DefaultAction from '../actions/DefaultAction'
-import Trigger from '../trigger/Trigger'
-import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore";
+import { useEffect, useState } from "react";
+import InputWithDropDown from "../../../../../ui/inputs/InputWithDropDown";
+import DelayAction from "../actions/DelayAction";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import LabledDropdown from "../../../../../ui/inputs/LabledDropdown";
+import DespawnAction from "../actions/DespawnAction";
+import SwapAction from "../actions/SwapAction";
+import SpawnAction from "../actions/SpawnAction";
+import DefaultAction from "../actions/DefaultAction";
+import Trigger from "../trigger/Trigger";
+import {
+ useSelectedEventData,
+ useSelectedProduct,
+} from "../../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../../store/simulation/useProductStore";
+import ActionsList from "../components/ActionsList";
function ConveyorMechanics() {
- const [activeOption, setActiveOption] = useState<"default" | "spawn" | "swap" | "delay" | "despawn">("default");
- const [selectedPointData, setSelectedPointData] = useState();
- const { selectedEventData } = useSelectedEventData();
- const { getPointByUuid, updateEvent, updateAction } = useProductStore();
- const { selectedProduct } = useSelectedProduct();
+ const [activeOption, setActiveOption] = useState<
+ "default" | "spawn" | "swap" | "delay" | "despawn"
+ >("default");
+ const [selectedPointData, setSelectedPointData] = useState<
+ ConveyorPointSchema | undefined
+ >();
+ const { selectedEventData } = useSelectedEventData();
+ const { getPointByUuid, updateEvent, updateAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
- useEffect(() => {
- if (selectedEventData) {
- const point = getPointByUuid(
- selectedProduct.productId,
- selectedEventData?.data.modelUuid,
- selectedEventData?.selectedPoint
- ) as ConveyorPointSchema | undefined;
- if (point && 'action' in point) {
- setSelectedPointData(point);
- setActiveOption(point.action.actionType as "default" | "spawn" | "swap" | "delay" | "despawn");
- }
- }
- }, [selectedProduct, selectedEventData])
-
- const handleSpeedChange = (value: string) => {
- if (!selectedEventData) return;
- updateEvent(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- { speed: parseFloat(value) }
+ useEffect(() => {
+ if (selectedEventData) {
+ const point = getPointByUuid(
+ selectedProduct.productId,
+ selectedEventData?.data.modelUuid,
+ selectedEventData?.selectedPoint
+ ) as ConveyorPointSchema | undefined;
+ if (point && "action" in point) {
+ setSelectedPointData(point);
+ setActiveOption(
+ point.action.actionType as
+ | "default"
+ | "spawn"
+ | "swap"
+ | "delay"
+ | "despawn"
);
- };
+ }
+ }
+ }, [selectedProduct, selectedEventData, getPointByUuid]);
- const handleActionTypeChange = (option: string) => {
- if (!selectedEventData || !selectedPointData) return;
- const validOption = option as "default" | "spawn" | "swap" | "delay" | "despawn";
- setActiveOption(validOption);
+ const handleSpeedChange = (value: string) => {
+ if (!selectedEventData) return;
+ updateEvent(selectedProduct.productId, selectedEventData.data.modelUuid, {
+ speed: parseFloat(value),
+ });
+ };
- updateAction(
- selectedPointData.action.actionUuid,
- { actionType: validOption }
- );
- };
+ const handleActionTypeChange = (option: string) => {
+ if (!selectedEventData || !selectedPointData) return;
+ const validOption = option as
+ | "default"
+ | "spawn"
+ | "swap"
+ | "delay"
+ | "despawn";
+ setActiveOption(validOption);
- const handleRenameAction = (newName: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { actionName: newName }
- );
- };
+ updateAction(selectedPointData.action.actionUuid, {
+ actionType: validOption,
+ });
+ };
- const handleSpawnCountChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { spawnCount: value === "inherit" ? "inherit" : parseFloat(value) }
- );
- };
+ const handleRenameAction = (newName: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, { actionName: newName });
+ };
- const handleSpawnIntervalChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { spawnInterval: value === "inherit" ? "inherit" : parseFloat(value) }
- );
- };
+ const handleSpawnCountChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ spawnCount: value === "inherit" ? "inherit" : parseFloat(value),
+ });
+ };
- const handleMaterialSelect = (material: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { material }
- );
- };
+ const handleSpawnIntervalChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ spawnInterval: value === "inherit" ? "inherit" : parseFloat(value),
+ });
+ };
- const handleDelayChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { delay: value === "inherit" ? "inherit" : parseFloat(value) }
- );
- };
+ const handleMaterialSelect = (material: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, { material });
+ };
- const availableActions = {
- defaultOption: "default",
- options: ["default", "spawn", "swap", "delay", "despawn"],
- };
+ const handleDelayChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ delay: value === "inherit" ? "inherit" : parseFloat(value),
+ });
+ };
- // Get current values from store
- const currentSpeed = selectedEventData?.data.type === "transfer"
- ? selectedEventData.data.speed.toString()
- : "0.5";
+ const availableActions = {
+ defaultOption: "default",
+ options: ["default", "spawn", "swap", "delay", "despawn"],
+ };
- const currentActionName = selectedPointData
- ? selectedPointData.action.actionName
- : "Action Name";
+ // Get current values from store
+ const currentSpeed =
+ selectedEventData?.data.type === "transfer"
+ ? selectedEventData.data.speed.toString()
+ : "0.5";
- const currentMaterial = selectedPointData
- ? selectedPointData.action.material
- : "Default material";
+ const currentActionName = selectedPointData
+ ? selectedPointData.action.actionName
+ : "Action Name";
- const currentSpawnCount = selectedPointData
- ? selectedPointData.action.spawnCount?.toString() || "1"
- : "1";
+ const currentMaterial = selectedPointData
+ ? selectedPointData.action.material
+ : "Default material";
- const currentSpawnInterval = selectedPointData
- ? selectedPointData.action.spawnInterval?.toString() || "1"
- : "1";
+ const currentSpawnCount = selectedPointData
+ ? selectedPointData.action.spawnCount?.toString() || "1"
+ : "1";
- const currentDelay = selectedPointData
- ? selectedPointData.action.delay?.toString() || "0"
- : "0";
+ const currentSpawnInterval = selectedPointData
+ ? selectedPointData.action.spawnInterval?.toString() || "1"
+ : "1";
- return (
+ const currentDelay = selectedPointData
+ ? selectedPointData.action.delay?.toString() || "0"
+ : "0";
+
+ return (
+ <>
+ {selectedEventData && (
<>
- {selectedEventData &&
- <>
-
-
-
- { }}
- onChange={handleSpeedChange}
- />
-
-
-
+
+
+
+ {}}
+ onChange={handleSpeedChange}
+ />
+
+
+
-
-
-
-
-
-
- {activeOption === "default" &&
-
- }
- {activeOption === "spawn" &&
-
- }
- {activeOption === "swap" &&
-
- }
- {activeOption === "despawn" &&
-
- }
- {activeOption === "delay" &&
-
- }
-
-
-
-
-
- >
- }
+
+
+
+
+
+
+
+
+ {activeOption === "default" && }
+ {activeOption === "spawn" && (
+
+ )}
+ {activeOption === "swap" && (
+
+ )}
+ {activeOption === "despawn" && }
+ {activeOption === "delay" && (
+
+ )}
+
+
+
+
+
>
- )
+ )}
+ >
+ );
}
-export default ConveyorMechanics
\ No newline at end of file
+export default ConveyorMechanics;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx
index e131864..fa2cfdf 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/machineMechanics.tsx
@@ -1,123 +1,129 @@
-import { useEffect, useState } from 'react'
-import RenameInput from '../../../../../ui/inputs/RenameInput'
-import LabledDropdown from '../../../../../ui/inputs/LabledDropdown'
-import Trigger from '../trigger/Trigger'
-import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore";
+import { useEffect, useState } from "react";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import LabledDropdown from "../../../../../ui/inputs/LabledDropdown";
+import Trigger from "../trigger/Trigger";
+import {
+ useSelectedEventData,
+ useSelectedProduct,
+} from "../../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../../store/simulation/useProductStore";
-import ProcessAction from '../actions/ProcessAction'
+import ProcessAction from "../actions/ProcessAction";
+import ActionsList from "../components/ActionsList";
function MachineMechanics() {
- const [activeOption, setActiveOption] = useState<"default" | "process">("default");
- const [selectedPointData, setSelectedPointData] = useState();
- const { selectedEventData } = useSelectedEventData();
- const { getPointByUuid, updateAction } = useProductStore();
- const { selectedProduct } = useSelectedProduct();
+ const [activeOption, setActiveOption] = useState<"default" | "process">(
+ "default"
+ );
+ const [selectedPointData, setSelectedPointData] = useState<
+ MachinePointSchema | undefined
+ >();
+ const { selectedEventData } = useSelectedEventData();
+ const { getPointByUuid, updateAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
- useEffect(() => {
- if (selectedEventData) {
- const point = getPointByUuid(
- selectedProduct.productId,
- selectedEventData?.data.modelUuid,
- selectedEventData?.selectedPoint
- ) as MachinePointSchema | undefined;
- if (point && 'action' in point) {
- setSelectedPointData(point);
- setActiveOption(point.action.actionType as "process");
- }
- }
- }, [selectedProduct, selectedEventData])
+ useEffect(() => {
+ if (selectedEventData) {
+ const point = getPointByUuid(
+ selectedProduct.productId,
+ selectedEventData?.data.modelUuid,
+ selectedEventData?.selectedPoint
+ ) as MachinePointSchema | undefined;
+ if (point && "action" in point) {
+ setSelectedPointData(point);
+ setActiveOption(point.action.actionType as "process");
+ }
+ }
+ }, [selectedProduct, selectedEventData, getPointByUuid]);
- const handleActionTypeChange = (option: string) => {
- if (!selectedEventData || !selectedPointData) return;
- const validOption = option as "process";
- setActiveOption(validOption);
+ const handleActionTypeChange = (option: string) => {
+ if (!selectedEventData || !selectedPointData) return;
+ const validOption = option as "process";
+ setActiveOption(validOption);
- updateAction(
- selectedPointData.action.actionUuid,
- { actionType: validOption }
- );
- };
+ updateAction(selectedPointData.action.actionUuid, {
+ actionType: validOption,
+ });
+ };
- const handleRenameAction = (newName: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { actionName: newName }
- );
- };
+ const handleRenameAction = (newName: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, { actionName: newName });
+ };
- const handleProcessTimeChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { processTime: parseFloat(value) }
- );
- };
+ const handleProcessTimeChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ processTime: parseFloat(value),
+ });
+ };
- const handleMaterialSelect = (material: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { swapMaterial: material }
- );
- };
+ const handleMaterialSelect = (material: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ swapMaterial: material,
+ });
+ };
- // Get current values from store
- const currentActionName = selectedPointData
- ? selectedPointData.action.actionName
- : "Action Name";
+ // Get current values from store
+ const currentActionName = selectedPointData
+ ? selectedPointData.action.actionName
+ : "Action Name";
- const currentProcessTime = selectedPointData
- ? selectedPointData.action.processTime.toString()
- : "1";
+ const currentProcessTime = selectedPointData
+ ? selectedPointData.action.processTime.toString()
+ : "1";
- const currentMaterial = selectedPointData
- ? selectedPointData.action.swapMaterial
- : "Default material";
+ const currentMaterial = selectedPointData
+ ? selectedPointData.action.swapMaterial
+ : "Default material";
- const availableActions = {
- defaultOption: "process",
- options: ["process"],
- };
+ const availableActions = {
+ defaultOption: "process",
+ options: ["process"],
+ };
- return (
+ return (
+ <>
+ {selectedEventData && (
<>
- {selectedEventData &&
- <>
-
-
-
-
-
-
- {activeOption === "process" &&
-
- }
-
-
-
-
-
- >
- }
+
+
+
+
+
+
+
+ {activeOption === "process" && (
+
+ )}
+
+
+
+
+
>
- )
+ )}
+ >
+ );
}
-export default MachineMechanics
\ No newline at end of file
+export default MachineMechanics;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx
index 78a32f5..a4ced23 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/roboticArmMechanics.tsx
@@ -1,276 +1,194 @@
-import { useEffect, useRef, useState } from 'react'
-import * as THREE from 'three';
-import InputWithDropDown from '../../../../../ui/inputs/InputWithDropDown'
-import RenameInput from '../../../../../ui/inputs/RenameInput'
-import LabledDropdown from '../../../../../ui/inputs/LabledDropdown'
-import Trigger from '../trigger/Trigger'
-import { useSelectedEventData, useSelectedProduct, useSelectedAction } from "../../../../../../store/simulation/useSimulationStore";
+import { useEffect, useState } from "react";
+import InputWithDropDown from "../../../../../ui/inputs/InputWithDropDown";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import LabledDropdown from "../../../../../ui/inputs/LabledDropdown";
+import Trigger from "../trigger/Trigger";
+import {
+ useSelectedEventData,
+ useSelectedProduct,
+ useSelectedAction,
+} from "../../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../../store/simulation/useProductStore";
-import { AddIcon, RemoveIcon, ResizeHeightIcon } from '../../../../../icons/ExportCommonIcons'
-import { handleResize } from '../../../../../../functions/handleResizePannel'
-import PickAndPlaceAction from '../actions/PickAndPlaceAction'
+import PickAndPlaceAction from "../actions/PickAndPlaceAction";
+import ActionsList from "../components/ActionsList";
function RoboticArmMechanics() {
- const actionsContainerRef = useRef(null);
- const [activeOption, setActiveOption] = useState<"default" | "pickAndPlace">("default");
- const [selectedPointData, setSelectedPointData] = useState();
- const { selectedEventData } = useSelectedEventData();
- const { getPointByUuid, updateEvent, updateAction, addAction, removeAction } = useProductStore();
- const { selectedProduct } = useSelectedProduct();
- const { selectedAction, setSelectedAction, clearSelectedAction } = useSelectedAction();
+ const [activeOption, setActiveOption] = useState<"default" | "pickAndPlace">(
+ "default"
+ );
+ const [selectedPointData, setSelectedPointData] = useState<
+ RoboticArmPointSchema | undefined
+ >();
+ const { selectedEventData } = useSelectedEventData();
+ const { getPointByUuid, updateEvent, updateAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
+ const { selectedAction, setSelectedAction, clearSelectedAction } =
+ useSelectedAction();
- useEffect(() => {
- if (selectedEventData) {
- const point = getPointByUuid(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- selectedEventData.selectedPoint
- ) as RoboticArmPointSchema | undefined;
- if (point) {
- setSelectedPointData(point);
- setActiveOption(point.actions[0].actionType as "default" | "pickAndPlace");
- if (point.actions.length > 0 && !selectedAction.actionId) {
- setSelectedAction(point.actions[0].actionUuid, point.actions[0].actionName);
- }
- }
- } else {
- clearSelectedAction();
+ useEffect(() => {
+ if (selectedEventData) {
+ const point = getPointByUuid(
+ selectedProduct.productId,
+ selectedEventData.data.modelUuid,
+ selectedEventData.selectedPoint
+ ) as RoboticArmPointSchema | undefined;
+ if (point) {
+ setSelectedPointData(point);
+ setActiveOption(
+ point.actions[0].actionType as "default" | "pickAndPlace"
+ );
+ if (point.actions.length > 0 && !selectedAction.actionId) {
+ setSelectedAction(
+ point.actions[0].actionUuid,
+ point.actions[0].actionName
+ );
}
- }, [selectedEventData, selectedProduct]);
+ }
+ } else {
+ clearSelectedAction();
+ }
+ }, [
+ clearSelectedAction,
+ getPointByUuid,
+ selectedAction.actionId,
+ selectedEventData,
+ selectedProduct,
+ setSelectedAction,
+ ]);
- const handleActionSelect = (actionUuid: string, actionName: string) => {
- setSelectedAction(actionUuid, actionName);
- };
+ const handleRenameAction = (newName: string) => {
+ if (!selectedAction.actionId) return;
+ updateAction(selectedAction.actionId, { actionName: newName });
- const handleAddAction = () => {
- if (!selectedEventData || !selectedPointData) return;
+ if (selectedPointData) {
+ const updatedActions = selectedPointData.actions.map((action) =>
+ action.actionUuid === selectedAction.actionId
+ ? { ...action, actionName: newName }
+ : action
+ );
+ setSelectedPointData({
+ ...selectedPointData,
+ actions: updatedActions,
+ });
+ }
+ };
- const newAction = {
- actionUuid: THREE.MathUtils.generateUUID(),
- actionName: `Action ${selectedPointData.actions.length + 1}`,
- actionType: "pickAndPlace" as "pickAndPlace",
- process: {
- startPoint: null,
- endPoint: null
- },
- triggers: [] as TriggerSchema[]
- };
+ const handleSpeedChange = (value: string) => {
+ if (!selectedEventData) return;
+ updateEvent(selectedProduct.productId, selectedEventData.data.modelUuid, {
+ speed: parseFloat(value),
+ });
+ };
- addAction(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- selectedEventData.selectedPoint,
- newAction
- );
+ const handlePickPointChange = (value: string) => {
+ if (!selectedAction.actionId || !selectedPointData) return;
+ const [x, y, z] = value.split(",").map(Number);
- const updatedPoint = {
- ...selectedPointData,
- actions: [...selectedPointData.actions, newAction]
- };
- setSelectedPointData(updatedPoint);
- setSelectedAction(newAction.actionUuid, newAction.actionName);
- };
+ updateAction(selectedAction.actionId, {
+ process: {
+ startPoint: [x, y, z] as [number, number, number],
+ endPoint:
+ selectedPointData.actions.find(
+ (a) => a.actionUuid === selectedAction.actionId
+ )?.process.endPoint || null,
+ },
+ });
+ };
- const handleDeleteAction = (actionUuid: string) => {
- if (!selectedPointData) return;
+ const handlePlacePointChange = (value: string) => {
+ if (!selectedAction.actionId || !selectedPointData) return;
+ const [x, y, z] = value.split(",").map(Number);
- removeAction(actionUuid);
- const newActions = selectedPointData.actions.filter(a => a.actionUuid !== actionUuid);
+ updateAction(selectedAction.actionId, {
+ process: {
+ startPoint:
+ selectedPointData.actions.find(
+ (a) => a.actionUuid === selectedAction.actionId
+ )?.process.startPoint || null,
+ endPoint: [x, y, z] as [number, number, number],
+ },
+ });
+ };
- const updatedPoint = {
- ...selectedPointData,
- actions: newActions
- };
- setSelectedPointData(updatedPoint);
+ const availableActions = {
+ defaultOption: "pickAndPlace",
+ options: ["pickAndPlace"],
+ };
- if (selectedAction.actionId === actionUuid) {
- if (newActions.length > 0) {
- setSelectedAction(newActions[0].actionUuid, newActions[0].actionName);
- } else {
- clearSelectedAction();
- }
- }
- };
+ const currentSpeed =
+ selectedEventData?.data.type === "roboticArm"
+ ? selectedEventData.data.speed.toString()
+ : "0.5";
- const handleRenameAction = (newName: string) => {
- if (!selectedAction.actionId) return;
- updateAction(
- selectedAction.actionId,
- { actionName: newName }
- );
+ const currentAction = selectedPointData?.actions.find(
+ (a) => a.actionUuid === selectedAction.actionId
+ );
+ const currentPickPoint = currentAction?.process.startPoint
+ ? `${currentAction.process.startPoint[0]},${currentAction.process.startPoint[1]},${currentAction.process.startPoint[2]}`
+ : "";
+ const currentPlacePoint = currentAction?.process.endPoint
+ ? `${currentAction.process.endPoint[0]},${currentAction.process.endPoint[1]},${currentAction.process.endPoint[2]}`
+ : "";
- if (selectedPointData) {
- const updatedActions = selectedPointData.actions.map(action =>
- action.actionUuid === selectedAction.actionId
- ? { ...action, actionName: newName }
- : action
- );
- setSelectedPointData({
- ...selectedPointData,
- actions: updatedActions
- });
- }
- };
-
- const handleSpeedChange = (value: string) => {
- if (!selectedEventData) return;
- updateEvent(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- { speed: parseFloat(value) }
- );
- };
-
- const handlePickPointChange = (value: string) => {
- if (!selectedAction.actionId || !selectedPointData) return;
- const [x, y, z] = value.split(',').map(Number);
-
- updateAction(
- selectedAction.actionId,
- {
- process: {
- startPoint: [x, y, z] as [number, number, number],
- endPoint: selectedPointData.actions.find(a => a.actionUuid === selectedAction.actionId)?.process.endPoint || null
- }
- }
- );
- };
-
- const handlePlacePointChange = (value: string) => {
- if (!selectedAction.actionId || !selectedPointData) return;
- const [x, y, z] = value.split(',').map(Number);
-
- updateAction(
- selectedAction.actionId,
- {
- process: {
- startPoint: selectedPointData.actions.find(a => a.actionUuid === selectedAction.actionId)?.process.startPoint || null,
- endPoint: [x, y, z] as [number, number, number]
- }
- }
- );
- };
-
- const availableActions = {
- defaultOption: "pickAndPlace",
- options: ["pickAndPlace"],
- };
-
- const currentSpeed = selectedEventData?.data.type === "roboticArm"
- ? selectedEventData.data.speed.toString()
- : "0.5";
-
- const currentAction = selectedPointData?.actions.find(a => a.actionUuid === selectedAction.actionId);
- const currentPickPoint = currentAction?.process.startPoint
- ? `${currentAction.process.startPoint[0]},${currentAction.process.startPoint[1]},${currentAction.process.startPoint[2]}`
- : "";
- const currentPlacePoint = currentAction?.process.endPoint
- ? `${currentAction.process.endPoint[0]},${currentAction.process.endPoint[1]},${currentAction.process.endPoint[2]}`
- : "";
-
- return (
+ return (
+ <>
+ {selectedEventData && selectedPointData && (
<>
- {selectedEventData && selectedPointData && (
- <>
-
-
-
- { }}
- onChange={handleSpeedChange}
- />
-
-
-
+
+
+
+ {}}
+ onChange={handleSpeedChange}
+ />
+
+
+
-
-
-
-
-
- {selectedPointData.actions.map((action) => (
-
-
handleActionSelect(action.actionUuid, action.actionName)}
- >
-
-
- {selectedPointData.actions.length > 1 && (
-
handleDeleteAction(action.actionUuid)}
- >
-
-
- )}
-
- ))}
-
-
handleResize(e, actionsContainerRef)}
- >
-
-
-
-
-
+
- {selectedAction.actionId && currentAction && (
-
-
-
-
-
-
{ }}
- disabled={true}
- />
-
-
-
-
-
-
- )}
- >
- )}
+ {selectedAction.actionId && currentAction && (
+
+
+
+
+
+
{}}
+ disabled={true}
+ />
+
+
+
+
+
+
+ )}
>
- )
+ )}
+ >
+ );
}
-export default RoboticArmMechanics
\ No newline at end of file
+export default RoboticArmMechanics;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx
index 593dcc3..d92ed80 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/storageMechanics.tsx
@@ -1,113 +1,120 @@
-import { useEffect, useState } from 'react'
-import RenameInput from '../../../../../ui/inputs/RenameInput'
-import LabledDropdown from '../../../../../ui/inputs/LabledDropdown'
-import Trigger from '../trigger/Trigger'
-import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore";
+import { useEffect, useState } from "react";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import LabledDropdown from "../../../../../ui/inputs/LabledDropdown";
+import Trigger from "../trigger/Trigger";
+import {
+ useSelectedEventData,
+ useSelectedProduct,
+} from "../../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../../store/simulation/useProductStore";
-import StorageAction from '../actions/StorageAction';
+import StorageAction from "../actions/StorageAction";
+import ActionsList from "../components/ActionsList";
function StorageMechanics() {
- const [activeOption, setActiveOption] = useState<"default" | "store" | "spawn">("default");
- const [selectedPointData, setSelectedPointData] = useState();
- const { selectedEventData } = useSelectedEventData();
- const { getPointByUuid, updateAction } = useProductStore();
- const { selectedProduct } = useSelectedProduct();
+ const [activeOption, setActiveOption] = useState<
+ "default" | "store" | "spawn"
+ >("default");
+ const [selectedPointData, setSelectedPointData] = useState<
+ StoragePointSchema | undefined
+ >();
+ const { selectedEventData } = useSelectedEventData();
+ const { getPointByUuid, updateAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
- useEffect(() => {
- if (selectedEventData) {
- const point = getPointByUuid(
- selectedProduct.productId,
- selectedEventData?.data.modelUuid,
- selectedEventData?.selectedPoint
- ) as StoragePointSchema | undefined;
- if (point && 'action' in point) {
- setSelectedPointData(point);
- setActiveOption(point.action.actionType as "store" | "spawn");
- }
- }
- }, [selectedProduct, selectedEventData])
+ useEffect(() => {
+ if (selectedEventData) {
+ const point = getPointByUuid(
+ selectedProduct.productId,
+ selectedEventData?.data.modelUuid,
+ selectedEventData?.selectedPoint
+ ) as StoragePointSchema | undefined;
+ if (point && "action" in point) {
+ setSelectedPointData(point);
+ setActiveOption(point.action.actionType as "store" | "spawn");
+ }
+ }
+ }, [selectedProduct, selectedEventData, getPointByUuid]);
- const handleActionTypeChange = (option: string) => {
- if (!selectedEventData || !selectedPointData) return;
- const validOption = option as "store" | "spawn";
- setActiveOption(validOption);
+ const handleActionTypeChange = (option: string) => {
+ if (!selectedEventData || !selectedPointData) return;
+ const validOption = option as "store" | "spawn";
+ setActiveOption(validOption);
- updateAction(
- selectedPointData.action.actionUuid,
- { actionType: validOption }
- );
- };
+ updateAction(selectedPointData.action.actionUuid, {
+ actionType: validOption,
+ });
+ };
- const handleRenameAction = (newName: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { actionName: newName }
- );
- };
+ const handleRenameAction = (newName: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, { actionName: newName });
+ };
- const handleCapacityChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { storageCapacity: parseInt(value) }
- );
- };
+ const handleCapacityChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ storageCapacity: parseInt(value),
+ });
+ };
- // Get current values from store
- const currentActionName = selectedPointData
- ? selectedPointData.action.actionName
- : "Action Name";
+ // Get current values from store
+ const currentActionName = selectedPointData
+ ? selectedPointData.action.actionName
+ : "Action Name";
- const currentCapacity = selectedPointData
- ? selectedPointData.action.storageCapacity.toString()
- : "0";
+ const currentCapacity = selectedPointData
+ ? selectedPointData.action.storageCapacity.toString()
+ : "0";
- const availableActions = {
- defaultOption: "store",
- options: ["store", "spawn"],
- };
+ const availableActions = {
+ defaultOption: "store",
+ options: ["store", "spawn"],
+ };
- return (
+ return (
+ <>
+ {selectedEventData && (
<>
- {selectedEventData &&
- <>
-
-
-
-
-
-
- {activeOption === "store" &&
-
- }
- {activeOption === "spawn" && (
-
-
Spawn configuration options would go here
-
- )}
-
-
-
-
-
- >
- }
+
+
+
+
+
+
+
+ {activeOption === "store" && (
+
+ )}
+ {activeOption === "spawn" && (
+
+
Spawn configuration options would go here
+
+ )}
+
+
+
+
+
>
- )
+ )}
+ >
+ );
}
-export default StorageMechanics
\ No newline at end of file
+export default StorageMechanics;
diff --git a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx
index cc2bfa0..4524ceb 100644
--- a/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx
+++ b/app/src/components/layout/sidebarRight/properties/eventProperties/mechanics/vehicleMechanics.tsx
@@ -1,197 +1,199 @@
-import { useEffect, useState } from 'react'
-import InputWithDropDown from '../../../../../ui/inputs/InputWithDropDown'
-import RenameInput from '../../../../../ui/inputs/RenameInput'
-import LabledDropdown from '../../../../../ui/inputs/LabledDropdown'
-import Trigger from '../trigger/Trigger'
-import { useSelectedEventData, useSelectedProduct } from "../../../../../../store/simulation/useSimulationStore";
+import { useEffect, useState } from "react";
+import InputWithDropDown from "../../../../../ui/inputs/InputWithDropDown";
+import RenameInput from "../../../../../ui/inputs/RenameInput";
+import LabledDropdown from "../../../../../ui/inputs/LabledDropdown";
+import Trigger from "../trigger/Trigger";
+import {
+ useSelectedEventData,
+ useSelectedProduct,
+} from "../../../../../../store/simulation/useSimulationStore";
import { useProductStore } from "../../../../../../store/simulation/useProductStore";
-import TravelAction from '../actions/TravelAction'
+import TravelAction from "../actions/TravelAction";
+import ActionsList from "../components/ActionsList";
function VehicleMechanics() {
- const [activeOption, setActiveOption] = useState<"default" | "travel">("default");
- const [selectedPointData, setSelectedPointData] = useState();
- const { selectedEventData } = useSelectedEventData();
- const { getPointByUuid, updateEvent, updateAction } = useProductStore();
- const { selectedProduct } = useSelectedProduct();
+ const [activeOption, setActiveOption] = useState<"default" | "travel">(
+ "default"
+ );
+ const [selectedPointData, setSelectedPointData] = useState<
+ VehiclePointSchema | undefined
+ >();
+ const { selectedEventData } = useSelectedEventData();
+ const { getPointByUuid, updateEvent, updateAction } = useProductStore();
+ const { selectedProduct } = useSelectedProduct();
- useEffect(() => {
- if (selectedEventData) {
- const point = getPointByUuid(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- selectedEventData.selectedPoint
- ) as VehiclePointSchema | undefined;
+ useEffect(() => {
+ if (selectedEventData) {
+ const point = getPointByUuid(
+ selectedProduct.productId,
+ selectedEventData.data.modelUuid,
+ selectedEventData.selectedPoint
+ ) as VehiclePointSchema | undefined;
- if (point) {
- setSelectedPointData(point);
- setActiveOption(point.action.actionType as "travel");
- }
- }
- }, [selectedProduct, selectedEventData])
+ if (point) {
+ setSelectedPointData(point);
+ setActiveOption(point.action.actionType as "travel");
+ }
+ }
+ }, [selectedProduct, selectedEventData, getPointByUuid]);
- const handleSpeedChange = (value: string) => {
- if (!selectedEventData) return;
- updateEvent(
- selectedProduct.productId,
- selectedEventData.data.modelUuid,
- { speed: parseFloat(value) }
- );
- };
+ const handleSpeedChange = (value: string) => {
+ if (!selectedEventData) return;
+ updateEvent(selectedProduct.productId, selectedEventData.data.modelUuid, {
+ speed: parseFloat(value),
+ });
+ };
- const handleActionTypeChange = (option: string) => {
- if (!selectedEventData || !selectedPointData) return;
- const validOption = option as "travel";
- setActiveOption(validOption);
+ const handleActionTypeChange = (option: string) => {
+ if (!selectedEventData || !selectedPointData) return;
+ const validOption = option as "travel";
+ setActiveOption(validOption);
- updateAction(
- selectedPointData.action.actionUuid,
- { actionType: validOption }
- );
- };
+ updateAction(selectedPointData.action.actionUuid, {
+ actionType: validOption,
+ });
+ };
- const handleRenameAction = (newName: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { actionName: newName }
- );
- };
+ const handleRenameAction = (newName: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, { actionName: newName });
+ };
- const handleLoadCapacityChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { loadCapacity: parseFloat(value) }
- );
- };
+ const handleLoadCapacityChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ loadCapacity: parseFloat(value),
+ });
+ };
- const handleUnloadDurationChange = (value: string) => {
- if (!selectedPointData) return;
- updateAction(
- selectedPointData.action.actionUuid,
- { unLoadDuration: parseFloat(value) }
- );
- };
+ const handleUnloadDurationChange = (value: string) => {
+ if (!selectedPointData) return;
+ updateAction(selectedPointData.action.actionUuid, {
+ unLoadDuration: parseFloat(value),
+ });
+ };
- const handlePickPointChange = (value: string) => {
- if (!selectedPointData) return;
- const [x, y, z] = value.split(',').map(Number);
- updateAction(
- selectedPointData.action.actionUuid,
- { pickUpPoint: { x, y, z } }
- );
- };
+ const handlePickPointChange = (value: string) => {
+ if (!selectedPointData) return;
+ const [x, y, z] = value.split(",").map(Number);
+ updateAction(selectedPointData.action.actionUuid, {
+ pickUpPoint: { x, y, z },
+ });
+ };
- const handleUnloadPointChange = (value: string) => {
- if (!selectedPointData) return;
- const [x, y, z] = value.split(',').map(Number);
- updateAction(
- selectedPointData.action.actionUuid,
- { unLoadPoint: { x, y, z } }
- );
- };
+ const handleUnloadPointChange = (value: string) => {
+ if (!selectedPointData) return;
+ const [x, y, z] = value.split(",").map(Number);
+ updateAction(selectedPointData.action.actionUuid, {
+ unLoadPoint: { x, y, z },
+ });
+ };
- // Get current values from store
- const currentSpeed = selectedEventData?.data.type === "vehicle"
- ? selectedEventData.data.speed.toString()
- : "0.5";
+ // Get current values from store
+ const currentSpeed =
+ selectedEventData?.data.type === "vehicle"
+ ? selectedEventData.data.speed.toString()
+ : "0.5";
- const currentActionName = selectedPointData
- ? selectedPointData.action.actionName
- : "Action Name";
+ const currentActionName = selectedPointData
+ ? selectedPointData.action.actionName
+ : "Action Name";
- const currentLoadCapacity = selectedPointData
- ? selectedPointData.action.loadCapacity.toString()
- : "1";
+ const currentLoadCapacity = selectedPointData
+ ? selectedPointData.action.loadCapacity.toString()
+ : "1";
- const currentUnloadDuration = selectedPointData
- ? selectedPointData.action.unLoadDuration.toString()
- : "1";
+ const currentUnloadDuration = selectedPointData
+ ? selectedPointData.action.unLoadDuration.toString()
+ : "1";
- const currentPickPoint = selectedPointData?.action.pickUpPoint
- ? `${selectedPointData.action.pickUpPoint.x},${selectedPointData.action.pickUpPoint.y},${selectedPointData.action.pickUpPoint.z}`
- : "";
+ const currentPickPoint = selectedPointData?.action.pickUpPoint
+ ? `${selectedPointData.action.pickUpPoint.x},${selectedPointData.action.pickUpPoint.y},${selectedPointData.action.pickUpPoint.z}`
+ : "";
- const currentUnloadPoint = selectedPointData?.action.unLoadPoint
- ? `${selectedPointData.action.unLoadPoint.x},${selectedPointData.action.unLoadPoint.y},${selectedPointData.action.unLoadPoint.z}`
- : "";
+ const currentUnloadPoint = selectedPointData?.action.unLoadPoint
+ ? `${selectedPointData.action.unLoadPoint.x},${selectedPointData.action.unLoadPoint.y},${selectedPointData.action.unLoadPoint.z}`
+ : "";
- const availableActions = {
- defaultOption: "travel",
- options: ["travel"],
- };
+ const availableActions = {
+ defaultOption: "travel",
+ options: ["travel"],
+ };
- return (
+ return (
+ <>
+ {selectedEventData && (
<>
- {selectedEventData &&
- <>
-
-
-
- { }}
- onChange={handleSpeedChange}
- />
-
-
-
+
+
+
+ {}}
+ onChange={handleSpeedChange}
+ />
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
- {activeOption === 'travel' &&
-
- }
-
-
-
-
-
- >
- }
+ {activeOption === "travel" && (
+
+ )}
+
+
+
+
+
>
- )
+ )}
+ >
+ );
}
-export default VehicleMechanics
\ No newline at end of file
+export default VehicleMechanics;
diff --git a/app/src/styles/layout/sidebar.scss b/app/src/styles/layout/sidebar.scss
index 76d2933..c284c42 100644
--- a/app/src/styles/layout/sidebar.scss
+++ b/app/src/styles/layout/sidebar.scss
@@ -366,15 +366,66 @@
min-height: 50vh;
padding-bottom: 12px;
position: relative;
- display: flex;
- flex-direction: column;
+ overflow: auto;
.sidebar-right-content-container {
border-bottom: 1px solid var(--border-color);
- // flex: 1;
height: calc(100% - 36px);
position: relative;
- overflow: auto;
+ width: 320px;
+ .no-event-selected {
+ color: #666;
+ padding: 1.8rem 1rem;
+ grid-column: 1 / -1;
+ .products-list {
+ padding-top: 1rem;
+ .products-list-title{
+ text-align: start;
+ color: var(--accent-color);
+ font-size: var(--font-size-regular);
+ }
+ ul {
+ li {
+ text-align: start;
+ margin: 8px 0;
+ padding: 2px 0;
+ text-decoration: none;
+ &::marker {
+ content: "";
+ }
+ button {
+ width: fit-content;
+ position: relative;
+ transition: all 0.2s ease;
+ @include flex-center;
+ gap: 4px;
+ &:before {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: -4px;
+ background: var(--accent-color);
+ height: 1px;
+ width: 0%;
+ transition: all 0.3s ease;
+ }
+ }
+ &:hover {
+ button {
+ path {
+ stroke: var(--accent-color);
+ stroke-width: 1.5px;
+ }
+ color: var(--accent-color);
+ &:before {
+ width: 100%;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
}
@@ -707,7 +758,7 @@
}
.selected-actions-list {
margin-bottom: 8px;
- .eye-dropper-input-container{
+ .eye-dropper-input-container {
padding: 6px 12px;
.regularDropdown-container {
padding: 5px 8px;
@@ -798,6 +849,7 @@
@include flex-center;
padding: 4px;
cursor: grab;
+ width: 100%;
&:active {
cursor: grabbing;
diff --git a/app/src/styles/pages/realTimeViz.scss b/app/src/styles/pages/realTimeViz.scss
index 0d4f98d..1efa2d4 100644
--- a/app/src/styles/pages/realTimeViz.scss
+++ b/app/src/styles/pages/realTimeViz.scss
@@ -776,13 +776,13 @@
border-radius: 6px;
overflow: hidden;
padding: 4px;
-
min-width: 150px;
.option {
padding: 4px 10px;
border-radius: #{$border-radius-small};
color: var(--text-color);
+ text-wrap: nowrap;
cursor: pointer;
&:hover {
@@ -794,8 +794,8 @@
color: #f65648;
&:hover {
- background-color: #f65648;
- color: white;
+ background-color: #f657484d;
+ color: #f65648;
}
}
}