import React from 'react' import { Head, Link, router, useForm } from '@inertiajs/react' import AdminLayout from '../../../Layouts/AdminLayout' import NovaSelect from '../../../components/ui/NovaSelect' function normalizePayload(fields, data) { const payload = { ...data } fields.forEach((field) => { if (field.type === 'csv') { payload[field.name] = String(payload[field.name] || '').split(',').map((item) => item.trim()).filter(Boolean) } if (field.type === 'json') { try { payload[field.name] = payload[field.name] ? JSON.parse(payload[field.name]) : {} } catch { payload[field.name] = {} } } }) return payload } function Field({ field, form }) { const value = form.data[field.name] if (field.type === 'checkbox') { return ( form.setData(field.name, event.target.checked)} /> {field.label} ) } if (field.type === 'textarea') { return form.setData(field.name, event.target.value)} rows={6} className="mt-2 w-full rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm text-white outline-none" /> } if (field.type === 'select') { return ( form.setData(field.name, nextValue ?? '')} options={field.options || []} searchable={false} className="mt-2 rounded-2xl bg-black/20" /> ) } if (field.type === 'multiselect') { return ( form.setData(field.name, Array.isArray(nextValue) ? nextValue : [])} options={field.options || []} className="mt-2 rounded-2xl bg-black/20" /> ) } return form.setData(field.name, event.target.value)} className="mt-2 w-full rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm text-white outline-none" /> } export default function AcademyCrudForm({ title, subtitle, fields, record, submitUrl, indexUrl, destroyUrl, method }) { const form = useForm(record) const submit = (event) => { event.preventDefault() const payload = normalizePayload(fields, form.data) if (method === 'patch') { form.transform(() => payload).patch(submitUrl) return } form.transform(() => payload).post(submitUrl) } return ( {fields.map((field) => ( {field.type !== 'checkbox' ? {field.label} : null} {form.errors[field.name] ? {form.errors[field.name]} : null} ))} {form.processing ? 'Saving...' : 'Save'} Back {destroyUrl ? { if (!window.confirm('Delete this record?')) return; router.delete(destroyUrl) }} className="rounded-full border border-rose-300/20 bg-rose-300/10 px-5 py-3 text-sm font-semibold text-rose-100">Delete : null} ) }
{form.errors[field.name]}