RulesetEditor
AppA visual flow editor for the blocks of any catalog: typed blocks with params (each block gets a form from its schema), connections, groups, flows that run each other, undo, search, a shortcuts sheet, comments and a help tab per block. It is not tied to a domain: this entry uses a business catalog (a schedule, a webhook in, a comparison, a notification, a webhook out); the IoT demos use device blocks.
08:00
msg.payload.overdue > 0
Email finance
POST https://crm.example.com/api/overdue
<RulesetEditor
catalog={catalog} // schedule, webhook in, compare, notification, webhook out
choices={{ teams: [...] }} // lists for source fields
initialNodes={nodes}
initialEdges={edges}
/>08:00
msg.payload.overdue > 0
Email finance
POST https://crm.example.com/api/overdue
<RulesetEditor readOnly catalog={catalog} initialNodes={nodes} initialEdges={edges} />08:00
msg.payload.overdue > 0
Email finance
POST https://crm.example.com/api/overdue
<RulesetEditor
catalog={catalog}
messages={{ paletteTitle: 'Blocktypen', toolUndo: 'Rückgängig', menuPaste: 'Einfügen' /* … */ }}
/>
// Any part of the bundle can be given; the rest stays English. See EditorMessages.08:00
msg.payload.overdue > 5
Email finance
POST https://accounting.example.com/api/overdue
POST https://crm.example.com/api/overdue
import { diffView } from '@/modules/app/RulesetEditor';
// both versions in one graph: what was removed comes back at its old place
const view = diffView(deployedGraph, draftGraph);
<RulesetEditor readOnly catalog={catalog} initialNodes={view.nodes} initialEdges={view.edges} diffTint={view.tint} />
// view.diff is the change list per block and field (diffFlows, the router's flowlib diff)