import React from 'react'; import { FormularioCreacion, TipoPregunta, TiposValidacion, } from '@/types/create-formulario'; import SimpleInput from '@/components/input'; import Select from '@/components/select'; import Button from '@/components/button'; interface Props { formulario: FormularioCreacion; onChange: (formularioActualizado: FormularioCreacion) => void; } const tipoPreguntaOpciones: TipoPregunta[] = [ 'Abierta (Respuesta corta)', 'Abierta (Parrafo)', 'Cerrada', 'Multiple', ]; const tiposValidacion: TiposValidacion[] = [ 'correo', 'correo_institucional', 'telefono', 'nombre', 'apellidos', 'genero', 'entero', 'decimal', 'comunidad_alumno', 'cuenta_alumno', 'comunidad_trabajador', 'cuenta_trabajador', 'rfc' ]; type CampoPreguntaSimple = | 'titulo' | 'tipo' | 'validacion' | 'obligatoria' | 'limite'; type CampoPreguntaOpciones = 'opciones'; const tiposCuestionario = [ { label: 'Registro', value: 1 }, { label: 'Evaluación', value: 2 }, ]; export default function FormularioEditor({ formulario, onChange }: Props) { function actualizarCampo( campo: K, valor: FormularioCreacion[K] ): void { const actualizado = { ...formulario, [campo]: valor }; onChange(actualizado); } function handleUpdatePregunta( seccionIdx: number, preguntaIdx: number, campo: CampoPreguntaSimple | CampoPreguntaOpciones, valor: | string | boolean | TipoPregunta | TiposValidacion | number | { valor: string }[] | undefined ) { const actualizado = { ...formulario }; const pregunta = actualizado.secciones[seccionIdx].preguntas[preguntaIdx]; if (campo === 'opciones') { pregunta.opciones = valor as { valor: string }[]; } else if (campo === 'titulo' && typeof valor === 'string') { pregunta.titulo = valor; } else if (campo === 'tipo' && typeof valor === 'string') { pregunta.tipo = valor as TipoPregunta; } else if (campo === 'validacion' || valor === undefined) { pregunta.validacion = valor as TiposValidacion | undefined; } else if (campo === 'obligatoria' && typeof valor === 'boolean') { pregunta.obligatoria = valor; } else if (campo === 'limite' && typeof valor === 'number') { pregunta.limite = valor; } onChange(actualizado); } const handleUpdateSeccion = ( index: number, campo: 'titulo' | 'descripcion', valor: string ) => { const actualizado = { ...formulario }; actualizado.secciones = actualizado.secciones.map((seccion, idx) => idx === index ? { ...seccion, [campo]: valor } : seccion ); onChange(actualizado); }; const agregarSeccion = () => { const nuevaSeccion = { titulo: '', descripcion: '', preguntas: [], }; onChange({ ...formulario, secciones: [...formulario.secciones, nuevaSeccion], }); }; const eliminarSeccion = (index: number) => { const nuevas = [...formulario.secciones]; nuevas.splice(index, 1); onChange({ ...formulario, secciones: nuevas }); }; const agregarPregunta = (seccionIdx: number) => { const nuevaPregunta = { titulo: '', tipo: 'Abierta (Respuesta corta)' as TipoPregunta, obligatoria: false, opciones: [], }; const actualizado = { ...formulario }; actualizado.secciones[seccionIdx].preguntas.push(nuevaPregunta); onChange(actualizado); }; const eliminarPregunta = (seccionIdx: number, preguntaIdx: number) => { const actualizado = { ...formulario }; actualizado.secciones[seccionIdx].preguntas.splice(preguntaIdx, 1); onChange(actualizado); }; return (

Editar Formulario

actualizarCampo('nombre_form', e.target.value)} /> actualizarCampo('descripcion', e.target.value)} />
actualizarCampo('fecha_inicio', e.target.value)} />
actualizarCampo('fecha_fin', e.target.value)} />
handleUpdatePregunta( seccionIdx, preguntaIdx, 'tipo', e.target.value ) } options={tipoPreguntaOpciones.map((tipo) => ({ label: tipo, value: tipo, }))} />
handleUpdatePregunta( seccionIdx, preguntaIdx, 'obligatoria', e.target.checked ) } />
{(pregunta.tipo === 'Cerrada' || pregunta.tipo === 'Multiple') && (
{(pregunta.opciones || []).map((op, opIdx) => ( { const nuevasOpciones = [...(pregunta.opciones || [])]; nuevasOpciones[opIdx].valor = e.target.value; handleUpdatePregunta( seccionIdx, preguntaIdx, 'opciones', nuevasOpciones ); }} placeholder={`Opción ${opIdx + 1}`} /> ))}
)} ))} ))}
); }