preview.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import {
  2. DEFAULT_DEMO_REGISTRY,
  3. DEFAULT_INITIAL_DATA,
  4. fieldWrapperCss,
  5. fieldWrapperTs,
  6. } from '@flowgram.ai/demo-node-form';
  7. import { PreviewEditor } from '../preview-editor';
  8. import { Editor } from '.';
  9. const registryCode = {
  10. code: `import {
  11. Field,
  12. FieldRenderProps,
  13. FormMeta,
  14. ValidateTrigger,
  15. } from '@flowgram.ai/free-layout-editor';
  16. import { Input } from '@douyinfe/semi-ui';
  17. // FieldWrapper is not provided by sdk, it can be customized
  18. import { FieldWrapper } from './components';
  19. const render = () => (
  20. <div className="demo-node-content">
  21. <div className="demo-node-title">Basic Node</div>
  22. <Field name="name">
  23. {({ field, fieldState }: FieldRenderProps<string>) => (
  24. <FieldWrapper required title="Name" error={fieldState.errors?.[0]?.message}>
  25. <Input size={'small'} {...field} />
  26. </FieldWrapper>
  27. )}
  28. </Field>
  29. <Field name="city">
  30. {({ field, fieldState }: FieldRenderProps<string>) => (
  31. <FieldWrapper required title="City" error={fieldState.errors?.[0]?.message}>
  32. <Input size={'small'} {...field} />
  33. </FieldWrapper>
  34. )}
  35. </Field>
  36. </div>
  37. );
  38. const formMeta: FormMeta = {
  39. render,
  40. defaultValues: { name: 'Tina', city: 'Hangzhou' },
  41. validateTrigger: ValidateTrigger.onChange,
  42. validate: {
  43. name: ({ value }) => {
  44. if (!value) {
  45. return 'Name is required';
  46. }
  47. },
  48. city: ({ value }) => {
  49. if (!value) {
  50. return 'City is required';
  51. }
  52. }
  53. }
  54. };
  55. export const nodeRegistry: WorkflowNodeRegistry = {
  56. type: 'custom',
  57. meta: {},
  58. defaultPorts: [{ type: 'output' }, { type: 'input' }],
  59. formMeta
  60. };
  61. `,
  62. active: true,
  63. };
  64. const initialDataCode = {
  65. code: `import { WorkflowJSON } from '@flowgram.ai/free-layout-editor';
  66. export const DEFAULT_INITIAL_DATA: WorkflowJSON = {
  67. nodes: [
  68. {
  69. id: 'node_0',
  70. type: 'custom',
  71. meta: {
  72. position: { x: 400, y: 0 },
  73. },
  74. },
  75. ],
  76. edges: [],
  77. };`,
  78. active: true,
  79. };
  80. export const NodeFormBasicPreview = () => {
  81. const files = {
  82. 'node-registry.tsx': registryCode,
  83. 'initial-data.ts': initialDataCode,
  84. 'field-wrapper.tsx': { code: fieldWrapperTs, active: true },
  85. 'field-wrapper.css': { code: fieldWrapperCss, active: true },
  86. };
  87. return (
  88. <PreviewEditor files={files} previewStyle={{ height: 500 }} editorStyle={{ height: 500 }}>
  89. <Editor registry={DEFAULT_DEMO_REGISTRY} initialData={DEFAULT_INITIAL_DATA} />
  90. </PreviewEditor>
  91. );
  92. };