step-4.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import '@flowgram.ai/free-layout-editor/index.css';
  2. import { createMinimapPlugin } from '@flowgram.ai/minimap-plugin';
  3. import { createFreeSnapPlugin } from '@flowgram.ai/free-snap-plugin';
  4. import {
  5. FreeLayoutEditorProvider,
  6. EditorRenderer,
  7. useNodeRender,
  8. WorkflowNodeProps,
  9. WorkflowNodeRenderer,
  10. } from '@flowgram.ai/free-layout-editor';
  11. const NodeRender = (props: WorkflowNodeProps) => {
  12. const { form, selected } = useNodeRender();
  13. return (
  14. <WorkflowNodeRenderer
  15. style={{
  16. width: 280,
  17. minHeight: 88,
  18. height: 'auto',
  19. background: '#fff',
  20. border: '1px solid rgba(6, 7, 9, 0.15)',
  21. borderColor: selected ? '#4e40e5' : 'rgba(6, 7, 9, 0.15)',
  22. borderRadius: 8,
  23. boxShadow: '0 2px 6px 0 rgba(0, 0, 0, 0.04), 0 4px 12px 0 rgba(0, 0, 0, 0.02)',
  24. display: 'flex',
  25. flexDirection: 'column',
  26. justifyContent: 'center',
  27. position: 'relative',
  28. padding: 12,
  29. cursor: 'move',
  30. }}
  31. node={props.node}
  32. >
  33. {form?.render()}
  34. </WorkflowNodeRenderer>
  35. );
  36. };
  37. const FlowGramApp = () => (
  38. <FreeLayoutEditorProvider
  39. plugins={() => [createMinimapPlugin({}), createFreeSnapPlugin({})]}
  40. onAllLayersRendered={(ctx) => {
  41. ctx.tools.fitView(false);
  42. }}
  43. materials={{
  44. renderDefaultNode: NodeRender,
  45. }}
  46. nodeRegistries={[
  47. {
  48. type: 'custom',
  49. },
  50. ]}
  51. canDeleteNode={() => true}
  52. canDeleteLine={() => true}
  53. initialData={{
  54. nodes: [
  55. {
  56. id: '1',
  57. type: 'custom',
  58. meta: {
  59. position: { x: 0, y: 0 },
  60. },
  61. },
  62. {
  63. id: '2',
  64. type: 'custom',
  65. meta: {
  66. position: { x: 400, y: -200 },
  67. },
  68. },
  69. {
  70. id: '3',
  71. type: 'custom',
  72. meta: {
  73. position: { x: 400, y: 0 },
  74. },
  75. },
  76. {
  77. id: '4',
  78. type: 'custom',
  79. meta: {
  80. position: { x: 400, y: 200 },
  81. },
  82. },
  83. {
  84. id: '5',
  85. type: 'custom',
  86. meta: {
  87. position: { x: 800, y: 0 },
  88. },
  89. },
  90. ],
  91. edges: [
  92. {
  93. sourceNodeID: '1',
  94. targetNodeID: '2',
  95. },
  96. {
  97. sourceNodeID: '1',
  98. targetNodeID: '3',
  99. },
  100. {
  101. sourceNodeID: '1',
  102. targetNodeID: '4',
  103. },
  104. {
  105. sourceNodeID: '2',
  106. targetNodeID: '5',
  107. },
  108. {
  109. sourceNodeID: '3',
  110. targetNodeID: '5',
  111. },
  112. {
  113. sourceNodeID: '4',
  114. targetNodeID: '5',
  115. },
  116. ],
  117. }}
  118. >
  119. <EditorRenderer />
  120. </FreeLayoutEditorProvider>
  121. );
  122. export default FlowGramApp;