step-3.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import '@flowgram.ai/free-layout-editor/index.css';
  2. import {
  3. FreeLayoutEditorProvider,
  4. EditorRenderer,
  5. useNodeRender,
  6. WorkflowNodeProps,
  7. WorkflowNodeRenderer,
  8. } from '@flowgram.ai/free-layout-editor';
  9. const NodeRender = (props: WorkflowNodeProps) => {
  10. const { form, selected } = useNodeRender();
  11. return (
  12. <WorkflowNodeRenderer
  13. style={{
  14. width: 280,
  15. minHeight: 88,
  16. height: 'auto',
  17. background: '#fff',
  18. border: '1px solid rgba(6, 7, 9, 0.15)',
  19. borderColor: selected ? '#4e40e5' : 'rgba(6, 7, 9, 0.15)',
  20. borderRadius: 8,
  21. boxShadow: '0 2px 6px 0 rgba(0, 0, 0, 0.04), 0 4px 12px 0 rgba(0, 0, 0, 0.02)',
  22. display: 'flex',
  23. flexDirection: 'column',
  24. justifyContent: 'center',
  25. position: 'relative',
  26. padding: 12,
  27. cursor: 'move',
  28. }}
  29. node={props.node}
  30. >
  31. {form?.render()}
  32. </WorkflowNodeRenderer>
  33. );
  34. };
  35. const FlowGramApp = () => (
  36. <FreeLayoutEditorProvider
  37. onAllLayersRendered={(ctx) => {
  38. ctx.tools.fitView(false);
  39. }}
  40. materials={{
  41. renderDefaultNode: NodeRender,
  42. }}
  43. nodeRegistries={[
  44. {
  45. type: 'custom',
  46. },
  47. ]}
  48. canDeleteNode={() => true}
  49. canDeleteLine={() => true}
  50. initialData={{
  51. nodes: [
  52. {
  53. id: '1',
  54. type: 'custom',
  55. meta: {
  56. position: { x: 0, y: 0 },
  57. },
  58. },
  59. {
  60. id: '2',
  61. type: 'custom',
  62. meta: {
  63. position: { x: 400, y: 0 },
  64. },
  65. },
  66. ],
  67. edges: [
  68. {
  69. sourceNodeID: '1',
  70. targetNodeID: '2',
  71. },
  72. ],
  73. }}
  74. >
  75. <EditorRenderer />
  76. </FreeLayoutEditorProvider>
  77. );
  78. export default FlowGramApp;