basic-preview.tsx 2.3 KB

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