diff --git a/web/src/components/CaseBuilder/CaseBuilder.tsx b/web/src/components/CaseBuilder/CaseBuilder.tsx
index ac41a09..bc8fe34 100644
--- a/web/src/components/CaseBuilder/CaseBuilder.tsx
+++ b/web/src/components/CaseBuilder/CaseBuilder.tsx
@@ -189,12 +189,10 @@ const onAddPlantOutput = (plantName: string, productName: string) => {
const plant = prevData.plants[plantName];
if (!plant) return prevData;
- // Build a new array of outputs, avoiding duplicates
const newOutputs = plant.outputs.includes(productName)
? plant.outputs
: [...plant.outputs, productName];
- // Return updated state with outputs as an array
return {
...prevData,
plants: {
@@ -289,6 +287,56 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
});
};
+ const onRenamePlant = (prevName: string, newName: string) => {
+ setCircularData(prev => {
+ const oldPlant = prev.plants[prevName];
+ if (!oldPlant) return prev;
+
+ const updatedData: CircularData = {
+ ...prev,
+ plants: {
+ ...prev.plants,
+ [prevName]: {...oldPlant, name: newName}
+ }
+ };
+
+ });
+};
+
+const onRenameProduct = (prevName: string, newName: string) => {
+ setCircularData(prev => {
+ const oldProduct = prev.products[prevName];
+ if (!oldProduct) return prev;
+
+ const updatedData: CircularData = {
+ ...prev,
+ products: {
+ ...prev.products,
+ [newName]: oldProduct,
+ }
+ };
+ delete updatedData.products[prevName];
+ return updatedData;
+ });
+};
+
+const onRenameCenter = (prevName: string, newName: string) => {
+ setCircularData(prev => {
+ const oldCenter = prev.centers[prevName];
+ if (!oldCenter) return prev;
+
+ const updatedData: CircularData = {
+ ...prev,
+ centers: {
+ ...prev.centers,
+ [newName]: oldCenter,
+ }
+ };
+ delete updatedData.centers[prevName];
+ return updatedData;
+ });
+};
+
return (
@@ -312,6 +360,9 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
onRemovePlant={onRemovePlant}
onRemoveProduct={onRemoveProduct}
onRemoveCenter={onRemoveCenter}
+ onRenamePlant = {onRenamePlant}
+ onRenameProduct = {onRenameProduct}
+ onRenameCenter = {onRenameCenter}
/>
diff --git a/web/src/components/CaseBuilder/PipelineBlock.tsx b/web/src/components/CaseBuilder/PipelineBlock.tsx
index 348d85c..b156742 100644
--- a/web/src/components/CaseBuilder/PipelineBlock.tsx
+++ b/web/src/components/CaseBuilder/PipelineBlock.tsx
@@ -30,6 +30,9 @@ interface PipelineBlockProps {
onRemovePlant: (id: string) => void;
onRemoveProduct: (id: string) => void;
onRemoveCenter: (id: string) => void;
+ onRenameProduct: (prevName: string, newName: string) => void;
+ onRenamePlant: (prevName: string, newName: string) => void;
+ onRenameCenter: (prevName: string, newName: string) => void;
products: Record;
plants: Record;
centers: Record;
@@ -169,6 +172,21 @@ const PipelineBlock: React.FC = props => {
[props]
);
+ const onNodeDoubleClick = (ev: React.MouseEvent, node: Node) => {
+ const oldName = node.data.label;
+ const newName = window.prompt("Enter new name", oldName);
+ if (!newName|| newName.trim().length === 0) return;
+ if (newName in mapNameToType) return;
+ if (node.data.type === "plant") {
+ props.onRenamePlant(oldName, newName);
+ } else if (node.data.type === "product") {
+ props.onRenameProduct(oldName, newName);
+ }
+ else if (node.data.type === "center") {
+ props.onRenameCenter(oldName, newName);
+ }
+ };
+
const onLayout = () => {
const { nodes: ln, edges: le } = getLayoutedNodesAndEdges(nodes, edges);
ln.forEach(n => {
@@ -182,7 +200,7 @@ const PipelineBlock: React.FC = props => {
useEffect(() => {
if (hasNullPositions) onLayout();
}, [hasNullPositions]);
-
+
return (
<>
@@ -192,6 +210,7 @@ const PipelineBlock: React.FC = props => {
nodes={nodes}
edges={edges}
onConnect={onConnect}
+ onNodeDoubleClick={onNodeDoubleClick}
onNodeDragStop={onNodeDragStop}
onNodesDelete={handleNodesDelete}
deleteKeyCode="delete"