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;