packages/form-render/src/render-core/index.tsx (62 lines of code) (raw):

import React from 'react'; import FieldItem from './FieldItem'; import FieldList from './FieldList'; import sortProperties from '../models/sortProperties'; import './index.less'; interface RenderCoreProps { schema: any; rootPath?: any[] | undefined; parentPath?: any[] | undefined; [key: string]: any }; interface RenderItemProps { schema: any; rootPath?: any[] | undefined; path?: any[] | undefined; key?: string | undefined; }; const renderItem = (props: RenderItemProps) => { let { schema, key, path, rootPath } = props; // render List if (schema.type === 'array' && schema.items?.type === 'object') { return ( <FieldList key={key} schema={schema} path={path} rootPath={rootPath} renderCore={RenderCore} /> ); } // render Objiect | field let child: React.ReactNode = null; // has child schema if (schema?.properties && schema?.widgetType !== 'field') { child = RenderCore({ schema, parentPath: path, rootPath }) // path = undefined; } return ( <FieldItem key={key} schema={schema} path={path} rootPath={rootPath} children={child} renderCore={RenderCore} /> ); } const RenderCore = (props: RenderCoreProps): any => { const { schema, parentPath = [], rootPath = [] } = props; if (!schema || Object.keys(schema).length === 0) { return null; } // render List.item if (schema?.items) { return renderItem({ schema: schema.items, path: parentPath, rootPath }); } // render Objiect | field return sortProperties(Object.entries(schema.properties || {})).map(([key, item]) => { const path = [...parentPath, key]; return renderItem({ schema: item, path, key, rootPath }); }); } export default RenderCore;