import { usePage } from "@inertiajs/react"; import { Fragment } from "react/jsx-runtime"; import { DynamicInputRegistry } from "@/back/Components/DynamicPages/DynamicInputRegistry"; import DynamicList from "@/back/Components/DynamicPages/DynamicList"; import DynamicWrapperModelSelect from "@/back/Components/DynamicPages/DynamicWrapperModelSelect"; import CompleteInputFile from "@/back/Components/Inputs/CompleteInputFile"; import SimpleColorPicker from "@/back/Components/Inputs/SimpleColorPicker"; import SimpleDatePicker from "@/back/Components/Inputs/SimpleDatePicker"; import SimpleNumber from "@/back/Components/Inputs/SimpleNumber"; import SimpleString from "@/back/Components/Inputs/SimpleString"; import SimpleSwitch from "@/back/Components/Inputs/SimpleSwitch"; import SimpleTextarea from "@/back/Components/Inputs/SimpleTextarea"; import SimpleVimeoId from "@/back/Components/Inputs/SimpleVimeoId"; import SimpleYoutubeId from "@/back/Components/Inputs/SimpleYoutubeId"; import StaticRouteSelect from "@/back/Components/Inputs/StaticRouteSelect"; import SimpleWysiwyg from "@/back/Components/Inputs/Wysiwyg/SimpleWysiwyg"; import type { ConfigField, DynamicFieldType, DynamicInternalField, } from "@/back/types/dynamic-pages"; import { extractLaravelValidationValue, extractMinMaxFromValidation, extractRequiredValidation, } from "@/hooks/use-laravel-validation"; import str from "@/hooks/use-string"; import useTrans from "@/hooks/use-translations"; interface DynamicInputsProps { name: string; config: ConfigField[]; content: DynamicInternalField | null; isChildren?: boolean; setData: ( name: string, value: string | number | boolean | File | object | null, ) => void; reset: (name?: string) => void; parentErrors?: Record | null; } // Allows to get specific input from enum value. export default function DynamicInputs({ name, config, content, isChildren = false, setData, reset, parentErrors, }: DynamicInputsProps) { // Enums. const enumDynamicFieldTypes = usePage().props .enumDynamicFieldTypes as DynamicFieldType; // Translations. const transAssociateTo = useTrans("uwil-backend::back.form_associate_to"); const transUnsupportedType = useTrans( "uwil-dynamic-pages::trans.unsupported_type", ); /** * Get a translation for a specific field label. * Need to recreate useTrans hook to avoid hook error. * @param fieldLabel string * @returns string */ const getTrans = (fieldLabel: string): string => { return str(transAssociateTo.split("|")[0].replace(":attribute", fieldLabel)) .ucFirst() .value(); }; const toStr = (val: unknown): string => { if (val === null || val === undefined) return ""; if ( typeof val === "string" || typeof val === "number" || typeof val === "boolean" ) { return String(val); } return ""; }; return (
{/* Loop on all config elements. */} {Object.entries(config).map(([id, field]) => { // Get the enum value from the element type value. const typeEnum = Object.values(enumDynamicFieldTypes).find( (def) => def.value === field.type, ); // Set the name of the current field. const fieldName = `${name}.${field.key}`; // Set the content value from the config key. const fieldValue = content?.[field.key as keyof typeof content] ?? ""; switch (field.type) { // String input. case enumDynamicFieldTypes.string.value: return ( ); // Textarea input. case enumDynamicFieldTypes.textarea.value: return ( ); // Wysiwyg input. case enumDynamicFieldTypes.wysiwyg.value: return (
); // Numbers input. case enumDynamicFieldTypes.number.value: return ( ); // Switch input. case enumDynamicFieldTypes.boolean.value: return (
); // Url input. case enumDynamicFieldTypes.url.value: return ( ); // Image input. case enumDynamicFieldTypes.image.value: return ( ); // Email input. case enumDynamicFieldTypes.email.value: return ( ); // List input. case enumDynamicFieldTypes.list.value: return ( ); // File input. case enumDynamicFieldTypes.file.value: return ( ); // VimeoId input case enumDynamicFieldTypes.vimeoid.value: return ( ); // YoutubeId input case enumDynamicFieldTypes.youtubeid.value: return ( ); // Date picker. case enumDynamicFieldTypes.date.value: return ( ); // Color picker. case enumDynamicFieldTypes.color.value: return ( ); // Model select. case enumDynamicFieldTypes.model.value: return ( ); // Static route select. case enumDynamicFieldTypes.staticroute.value: return ( ); default: { // Check in custom types. const customInput = DynamicInputRegistry.get( typeEnum?.name ?? "type", fieldName, fieldValue, field, setData, parentErrors, ); if (customInput) { return {customInput}; } // Show message if no type is matching. return (

{transUnsupportedType} {typeEnum?.label ?? field.type}

); } } })}
); }