import React from 'react'; import { ArrayInput, BooleanInput, DateInput, DateTimeInput, NumberInput, ReferenceArrayInput, ReferenceInput, SelectArrayInput, SelectInput, SimpleFormIterator, TextInput, required, useResourceContext, } from 'react-admin'; import type { ArrayInputProps, BooleanInputProps, DateInputProps, DateTimeInputProps, NumberInputProps, ReferenceArrayInputProps, ReferenceInputProps, SelectArrayInputProps, SelectInputProps, TextInputProps, } from 'react-admin'; import isPlainObject from 'lodash.isplainobject'; import Introspecter from '../introspection/Introspecter.js'; import getIdentifierValue, { isIdentifier } from '../getIdentifierValue.js'; import type { InputGuesserProps, IntrospectedInputGuesserProps, } from '../types.js'; export const IntrospectedInputGuesser = ({ fields, readableFields, writableFields, schema, schemaAnalyzer, validate, transformEnum, ...props }: IntrospectedInputGuesserProps) => { const field = fields.find(({ name }) => name === props.source); if (!field) { // eslint-disable-next-line no-console console.error( `Field ${props.source} not present inside API description for the resource ${props.resource}`, ); return null; } const guessedValidate = !validate && field.required ? [required()] : validate; if (field.reference !== null && typeof field.reference === 'object') { if (field.maxCardinality === 1) { const { filter, page, perPage, sort, enableGetChoices, ...rest } = props as ReferenceInputProps; return ( ); } const { filter, page, perPage, sort, enableGetChoices, ...rest } = props as ReferenceArrayInputProps; return ( ); } let format; let parse; const fieldType = schemaAnalyzer.getFieldType(field); if (field.enum) { const choices = Object.entries(field.enum).map(([k, v]) => ({ id: v, name: transformEnum ? transformEnum(v) : k, })); return fieldType === 'array' ? ( ) : ( ); } if (isIdentifier(field, fieldType)) { format = (value: string | number) => getIdentifierValue( schemaAnalyzer, props.resource, fields, field.name, value, ); } const formatEmbedded = (value: string | object | null) => { if (value === null) { return ''; } if (typeof value === 'string') { return value; } return JSON.stringify(value); }; const parseEmbedded = (value: string) => { try { const parsed = JSON.parse(value); if (!isPlainObject(parsed)) { return value; } return parsed; } catch (e) { return value; } }; if (field.embedded !== null) { format = formatEmbedded; parse = parseEmbedded; } const { format: formatProp, parse: parseProp } = props; switch (fieldType) { case 'array': return ( ); case 'integer': case 'integer_id': return ( ); case 'float': return ( ); case 'boolean': return ( ); case 'date': return ( ); case 'dateTime': return ( ); default: return ( ); } }; const InputGuesser = (props: InputGuesserProps) => { const resource = useResourceContext(props); if (!resource) { throw new Error('guesser must be used with a resource'); } return ( ); }; export default InputGuesser;