import React from 'react'; import { Create, FormTab, SimpleForm, TabbedForm, useResourceContext, } from 'react-admin'; import type { Field, Resource } from '@api-platform/api-doc-parser'; import InputGuesser from '../input/InputGuesser.js'; import Introspecter from '../introspection/Introspecter.js'; import useDisplayOverrideCode from '../useDisplayOverrideCode.js'; import useOnSubmit from '../useOnSubmit.js'; import type { CreateGuesserProps, IntrospectedCreateGuesserProps, } from '../types.js'; const getOverrideCode = (schema: Resource, fields: Field[]) => { let code = `If you want to override at least one input, create a ${schema.title}Create component with this content:\n`; code += `\n`; code += `import { CreateGuesser, InputGuesser } from "@api-platform/admin";\n`; code += `\n`; code += `export const ${schema.title}Create = () => (\n`; code += ` \n`; fields.forEach((field) => { code += ` \n`; }); code += ` \n`; code += `);\n`; code += `\n`; code += `Then, update your main admin component:\n`; code += `\n`; code += `import { HydraAdmin, ResourceGuesser } from "@api-platform/admin";\n`; code += `import { ${schema.title}Create } from './${schema.title}Create';\n`; code += `\n`; code += `const App = () => (\n`; code += ` \n`; code += ` \n`; code += ` {/* ... */}\n`; code += ` \n`; code += `);\n`; return code; }; export const IntrospectedCreateGuesser = ({ fields, readableFields, writableFields, schema, schemaAnalyzer, resource, mutationOptions, redirect: redirectTo = 'list', mode, defaultValues, transform, validate, toolbar, warnWhenUnsavedChanges, sanitizeEmptyValues = true, formComponent, viewComponent, children, ...props }: IntrospectedCreateGuesserProps) => { const save = useOnSubmit({ resource, schemaAnalyzer, fields, mutationOptions, transform, redirectTo, children: [], }); const displayOverrideCode = useDisplayOverrideCode(); let inputChildren = React.Children.toArray(children); if (inputChildren.length === 0) { inputChildren = writableFields.map((field) => ( )); displayOverrideCode(getOverrideCode(schema, writableFields)); } const hasFormTab = inputChildren.some( (child) => typeof child === 'object' && 'type' in child && child.type === FormTab, ); const FormType = hasFormTab ? TabbedForm : SimpleForm; return ( {inputChildren} ); }; const CreateGuesser = (props: CreateGuesserProps) => { const resource = useResourceContext(props); if (!resource) { throw new Error('CreateGuesser must be used with a resource'); } return ( ); }; export default CreateGuesser;