chore: merge the rest of the nodes back into this structure, and make sure that start and end nodes are not deletable.

This commit is contained in:
Björn Otgaar
2025-11-18 13:25:13 +01:00
parent 941658a817
commit 3e73e78ee9
9 changed files with 223 additions and 68 deletions

View File

@@ -9,7 +9,7 @@ import {
type XYPosition,
} from '@xyflow/react';
import type { FlowState } from './VisProgTypes';
import { NodeDefaults, NodeConnects } from './NodeRegistry';
import { NodeDefaults, NodeConnects, NodeDeletes } from './NodeRegistry';
/**
@@ -20,21 +20,22 @@ import { NodeDefaults, NodeConnects } from './NodeRegistry';
* @param data the data in the node to create
* @constructor
*/
function createNode(id: string, type: string, position: XYPosition, data: Record<string, unknown>) {
function createNode(id: string, type: string, position: XYPosition, data: Record<string, unknown>, deletable? : boolean) {
const defaultData = NodeDefaults[type as keyof typeof NodeDefaults]
const newData = {
id: id,
type: type,
position: position,
data: data,
deletable: deletable,
}
return {...defaultData, ...newData}
}
//* Initial nodes, created by using createNode. */
const initialNodes : Node[] = [
createNode('start', 'start', {x: 100, y: 100}, {label: "Start"}),
createNode('end', 'end', {x: 370, y: 100}, {label: "End"}),
createNode('start', 'start', {x: 100, y: 100}, {label: "Start"}, false),
createNode('end', 'end', {x: 370, y: 100}, {label: "End"}, false),
createNode('phase-1', 'phase', {x:200, y:100}, {label: "Phase 1", children: ['end', 'start']}),
createNode('norms-1', 'norm', {x:-200, y:100}, {label: "Initial Norms", normList: ["Be a robot", "get good"]}),
];
@@ -92,12 +93,20 @@ const useFlowStore = create<FlowState>((set, get) => ({
set({ edgeReconnectSuccessful: true });
},
deleteNode: (nodeId) =>
set({
deleteNode: (nodeId) => {
// Let's find our node to check if they have a special deletion function
const ourNode = get().nodes.find((n)=>n.id==nodeId);
const ourFunction = Object.entries(NodeDeletes).find(([t])=>t==ourNode?.type)?.[1]
// If there's no function, OR, our function tells us we can delete it, let's do so...
if (ourFunction == undefined || ourFunction()) {
set({
nodes: get().nodes.filter((n) => n.id !== nodeId),
edges: get().edges.filter((e) => e.source !== nodeId && e.target !== nodeId),
}),
})}
},
setNodes: (nodes) => set({ nodes }),
setEdges: (edges) => set({ edges }),