preview.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {
  2. DEFAULT_INITIAL_DATA,
  3. defaultInitialDataTs,
  4. fieldWrapperCss,
  5. fieldWrapperTs,
  6. } from '@flowgram.ai/demo-node-form';
  7. import { Editor } from '../editor.tsx';
  8. import { PreviewEditor } from '../../preview-editor.tsx';
  9. import { nodeRegistry } from './node-registry.tsx';
  10. const nodeRegistryFile = {
  11. code: `import {
  12. Field,
  13. FieldRenderProps,
  14. FormMeta,
  15. WorkflowNodeRegistry,
  16. FormRenderProps,
  17. } from '@flowgram.ai/free-layout-editor';
  18. import { FieldWrapper } from '@flowgram.ai/demo-node-form';
  19. import { Input } from '@douyinfe/semi-ui';
  20. import '../index.css';
  21. interface FormData {
  22. country: string;
  23. city: string;
  24. }
  25. const render = ({ form }: FormRenderProps<FormData>) => (
  26. <div className="demo-node-content">
  27. <div className="demo-node-title">Visibility Examples</div>
  28. <Field name="country">
  29. {({ field }: FieldRenderProps<string>) => (
  30. <FieldWrapper title="Country">
  31. <Input size={'small'} {...field} />
  32. </FieldWrapper>
  33. )}
  34. </Field>
  35. <Field name="city" deps={['country']}>
  36. {({ field }: FieldRenderProps<string>) =>
  37. form.getValueIn('country') ? (
  38. <FieldWrapper title="City">
  39. <Input size={'small'} {...field} />
  40. </FieldWrapper>
  41. ) : (
  42. <></>
  43. )
  44. }
  45. </Field>
  46. </div>
  47. );
  48. const formMeta: FormMeta<FormData> = {
  49. render,
  50. };
  51. export const nodeRegistry: WorkflowNodeRegistry = {
  52. type: 'custom',
  53. meta: {},
  54. defaultPorts: [{ type: 'output' }, { type: 'input' }],
  55. formMeta,
  56. };
  57. `,
  58. active: true,
  59. };
  60. export const NodeFormDynamicPreview = () => {
  61. const files = {
  62. 'node-registry.tsx': nodeRegistryFile,
  63. 'initial-data.ts': { code: defaultInitialDataTs, active: true },
  64. 'field-wrapper.tsx': { code: fieldWrapperTs, active: true },
  65. 'field-wrapper.css': { code: fieldWrapperCss, active: true },
  66. };
  67. return (
  68. <PreviewEditor files={files} previewStyle={{ height: 500 }} editorStyle={{ height: 500 }}>
  69. <Editor registry={nodeRegistry} initialData={DEFAULT_INITIAL_DATA} />
  70. </PreviewEditor>
  71. );
  72. };