/** * @file Example demonstrating custom node definitions with external data integration */ import * as React from "react"; import { NodeEditor } from "../../../../../NodeEditor"; import type { NodeDefinition, NodeRendererProps, InspectorRenderProps, ExternalDataReference, } from "../../../../../types/NodeDefinition"; import { asNodeDefinition } from "../../../../../types/NodeDefinition"; import type { NodeEditorData } from "../../../../../types/core"; import { StandardNodeDefinition } from "../../../../../node-definitions/standard"; import { NodeResizer } from "../../../../../components/node/resize/NodeResizer"; import classes from "./CustomNodeExample.module.css"; // Example external data type type TaskData = { id: string; title: string; description: string; status: "todo" | "in-progress" | "done"; assignee?: string; dueDate?: string; }; // Mock external data storage const mockTaskDatabase = new Map([ [ "task-1", { id: "task-1", title: "Design System Review", description: "Review and approve the new design system components", status: "in-progress", assignee: "Alice", dueDate: "2024-02-15", }, ], [ "task-2", { id: "task-2", title: "API Integration", description: "Integrate the backend API with the frontend", status: "todo", assignee: "Bob", dueDate: "2024-02-20", }, ], ]); // Custom Task Node Renderer const TaskNodeRenderer = ({ isSelected, isDragging, externalData, isLoadingExternalData, onStartEdit, node, }: NodeRendererProps) => { const task = externalData as TaskData | undefined; const initialLoading = externalData === undefined && isLoadingExternalData; return ( {() => (
{initialLoading ? (
Loading...
) : task ? ( <>

{task.title}

{task.description}

{task.status} {task.assignee && 👤 {task.assignee}}
) : (
No task data
)}
)}
); }; // Custom Task Inspector const TaskInspectorRenderer = ({ externalData, isLoadingExternalData, onUpdateExternalData, onDeleteNode, }: InspectorRenderProps) => { const task = externalData as TaskData | undefined; const [editedTask, setEditedTask] = React.useState(null); React.useEffect(() => { if (task) { setEditedTask({ ...task }); } }, [task]); const handleSave = async () => { if (editedTask && onUpdateExternalData) { await onUpdateExternalData(editedTask); } }; if (isLoadingExternalData) { return
Loading task data...
; } if (!editedTask) { return
No task data available
; } return (

Task Properties

setEditedTask({ ...editedTask, title: e.target.value })} className={classes.inspectorInput} />