Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
132 lines
3.0 KiB
TypeScript
132 lines
3.0 KiB
TypeScript
import {
|
|
AssetToolbarItem,
|
|
CheckBoxToolbarItem,
|
|
CloudToolbarItem,
|
|
createShapeId,
|
|
DefaultToolbar,
|
|
DiamondToolbarItem,
|
|
DrawToolbarItem,
|
|
Editor,
|
|
EllipseToolbarItem,
|
|
HandToolbarItem,
|
|
HeartToolbarItem,
|
|
HexagonToolbarItem,
|
|
HighlightToolbarItem,
|
|
LaserToolbarItem,
|
|
NoteToolbarItem,
|
|
onDragFromToolbarToCreateShape,
|
|
OvalToolbarItem,
|
|
RectangleToolbarItem,
|
|
RhombusToolbarItem,
|
|
SelectToolbarItem,
|
|
StarToolbarItem,
|
|
TextToolbarItem,
|
|
TldrawUiMenuGroup,
|
|
TLShapeId,
|
|
TLUiOverrides,
|
|
ToolbarItem,
|
|
TriangleToolbarItem,
|
|
Vec,
|
|
XBoxToolbarItem,
|
|
} from 'tldraw'
|
|
import { NodeShape } from '../nodes/NodeShapeUtil'
|
|
import { getNodeDefinitions, NodeType } from '../nodes/nodeTypes'
|
|
|
|
function createNodeShape(editor: Editor, shapeId: TLShapeId, center: Vec, node: NodeType) {
|
|
// Mark a history stopping point for undo/redo
|
|
editor.markHistoryStoppingPoint('create node')
|
|
|
|
editor.run(() => {
|
|
// Create the shape with the node definition
|
|
editor.createShape({
|
|
id: shapeId,
|
|
type: 'node',
|
|
props: { node },
|
|
})
|
|
|
|
// Get the created shape and its bounds
|
|
const shape = editor.getShape<NodeShape>(shapeId)!
|
|
const shapeBounds = editor.getShapePageBounds(shapeId)!
|
|
|
|
// Position the shape so its center aligns with the drop point
|
|
editor.updateShape({
|
|
...shape,
|
|
x: center.x - shapeBounds.width / 2,
|
|
y: center.y - shapeBounds.height / 2,
|
|
})
|
|
|
|
// Select the newly created shape
|
|
editor.select(shapeId)
|
|
})
|
|
}
|
|
|
|
export const overrides: TLUiOverrides = {
|
|
tools: (editor, tools, _) => {
|
|
for (const nodeDef of Object.values(getNodeDefinitions(editor))) {
|
|
tools[`node-${nodeDef.type}`] = {
|
|
id: `node-${nodeDef.type}`,
|
|
label: nodeDef.title,
|
|
icon: nodeDef.icon,
|
|
onSelect: () => {
|
|
createNodeShape(
|
|
editor,
|
|
createShapeId(),
|
|
editor.getViewportPageBounds().center,
|
|
nodeDef.getDefault()
|
|
)
|
|
},
|
|
onDragStart: (_, info) => {
|
|
onDragFromToolbarToCreateShape(editor, info, {
|
|
createShape: (id) => {
|
|
editor.createShape({
|
|
id,
|
|
type: 'node',
|
|
props: { node: nodeDef.getDefault() },
|
|
})
|
|
},
|
|
onDragEnd: () => {},
|
|
})
|
|
},
|
|
}
|
|
}
|
|
return tools
|
|
},
|
|
}
|
|
|
|
export function WorkflowToolbar() {
|
|
return (
|
|
<DefaultToolbar orientation="vertical" maxItems={7}>
|
|
<TldrawUiMenuGroup id="selection">
|
|
<SelectToolbarItem />
|
|
<HandToolbarItem />
|
|
<DrawToolbarItem />
|
|
</TldrawUiMenuGroup>
|
|
<TldrawUiMenuGroup id="nodes">
|
|
<ToolbarItem tool="node-message" />
|
|
</TldrawUiMenuGroup>
|
|
<TldrawUiMenuGroup id="shapes">
|
|
<RectangleToolbarItem />
|
|
<EllipseToolbarItem />
|
|
<TriangleToolbarItem />
|
|
<NoteToolbarItem />
|
|
|
|
<DiamondToolbarItem />
|
|
<HexagonToolbarItem />
|
|
<OvalToolbarItem />
|
|
<RhombusToolbarItem />
|
|
|
|
<StarToolbarItem />
|
|
<CloudToolbarItem />
|
|
<HeartToolbarItem />
|
|
<XBoxToolbarItem />
|
|
|
|
<CheckBoxToolbarItem />
|
|
<TextToolbarItem />
|
|
<AssetToolbarItem />
|
|
<HighlightToolbarItem />
|
|
<LaserToolbarItem />
|
|
</TldrawUiMenuGroup>
|
|
</DefaultToolbar>
|
|
)
|
|
}
|