Portal Community

createNode()

// packages/flow-studio-services/src/factories/NodeFactoryService.ts
export class NodeFactoryService {
  createNode(nodeType: NodeType, position: XYPosition): WorkflowNode {
    const nodeId = `${nodeType.typeCode}-${generateShortId()}`;

    return {
      id: nodeId,
      type: nodeType.typeCode,          // maps to WorkflowCanvas.nodeTypes key
      position,
      data: {
        label: nodeType.displayName,    // default label = displayName
        config: { ...nodeType.defaultConfig }, // copy of default form values
        formId: nodeType.formId,
        ports: nodeType.ports,
        nodeType: nodeType.typeCode,
        icon: nodeType.icon,
        color: nodeType.color,
      },
      // React Flow internal properties
      selected: false,
      dragging: false,
    };
  }
}

What createNode() Sets

PropertySource
idGenerated: typeCode + "-" + shortId() (e.g., "http-request-x7k2")
typeThe typeCode — used by React Flow to look up the renderer
positionDrop position on canvas (from drag event)
data.labelNodeType.displayName (user can rename after)
data.configDeep copy of NodeType.defaultConfig (editable per instance)
data.formIdNodeType.formId (which Atlas Form to show in Right Panel)
data.portsNodeType.ports (static port definitions)

After createNode()

The returned WorkflowNode is dispatched to the workflowStore:

// In the canvas drag handler
const node = nodeFactoryService.createNode(draggedNodeType, dropPosition);
workflowStore.getState().addNode(node);
// isDirty is set to true, triggering the save prompt