basic-preview.tsx 2.2 KB

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