import React, { useEffect, useState } from 'react'; import { TextField, Checkbox, FormControlLabel, MenuItem, Typography, Box } from '@mui/material'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import { CustomFieldDefinition, CustomFieldType, CustomFieldValues } from '../../types/customFields'; import { useTranslation } from 'react-i18next'; import { customFieldService } from '../../services/customFieldService'; import dayjs from 'dayjs'; interface Props { entityName: string; values: CustomFieldValues; onChange: (fieldName: string, value: any) => void; readOnly?: boolean; } export const CustomFieldsRenderer: React.FC = ({ entityName, values, onChange, readOnly = false }) => { const { t } = useTranslation(); const [definitions, setDefinitions] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const loadDefinitions = async () => { try { const defs = await customFieldService.getByEntity(entityName); setDefinitions(defs); } catch (error) { console.error("Failed to load custom fields", error); } finally { setLoading(false); } }; loadDefinitions(); }, [entityName]); if (loading) return null; if (definitions.length === 0) return null; return ( {t("customFields.sectionTitle")} {definitions.map(def => ( onChange(def.fieldName, val)} readOnly={readOnly} /> ))} ); }; const FieldRenderer: React.FC<{ definition: CustomFieldDefinition; value: any; onChange: (value: any) => void; readOnly: boolean; }> = ({ definition, value, onChange, readOnly }) => { const handleChange = (e: React.ChangeEvent) => { onChange(e.target.value); }; switch (definition.type) { case CustomFieldType.Text: case CustomFieldType.Email: case CustomFieldType.Url: return ( ); case CustomFieldType.Number: return ( ); case CustomFieldType.TextArea: return ( ); case CustomFieldType.Boolean: return ( onChange(e.target.checked)} disabled={readOnly} /> } label={definition.label} /> ); case CustomFieldType.Date: return ( onChange(newValue ? newValue.toISOString() : null)} disabled={readOnly} slotProps={{ textField: { fullWidth: true, required: definition.isRequired, helperText: definition.description, size: 'small' } }} /> ); case CustomFieldType.Select: let options: string[] = []; try { options = definition.optionsJson ? JSON.parse(definition.optionsJson) : []; } catch (e) { console.error("Invalid options JSON", e); } return ( {options.map((opt) => ( {opt} ))} ); case CustomFieldType.Color: return ( ); default: return null; } };