diff --git a/public/banner.png b/public/banner.png new file mode 100644 index 0000000..fea378a Binary files /dev/null and b/public/banner.png differ diff --git a/src/app/administrador/crear-formulario/page.tsx b/src/app/administrador/crear-formulario/page.tsx new file mode 100644 index 0000000..907632b --- /dev/null +++ b/src/app/administrador/crear-formulario/page.tsx @@ -0,0 +1,489 @@ +'use client'; +import React, { useState } from 'react'; +import Pagination from '@/components/pagination'; +import Image from 'next/image'; + +interface Opcion { + valor: string; +} + +interface Pregunta { + titulo: string; + tipo: 'Abierta' | 'Cerrada' | 'Multiple'; + opciones: Opcion[]; + obligatoria: boolean; +} + +interface Seccion { + titulo: string; + descripcion: string; + preguntas: Pregunta[]; +} + +export default function AdminFormPage() { + const [nombreFormulario, setNombreFormulario] = useState(''); + const [descripcion, setDescripcion] = useState(''); + const [secciones, setSecciones] = useState([]); + const [paginaActual, setPaginaActual] = useState(1); + const [bannerPreview, setBannerPreview] = useState(null); + const [audiencia, setAudiencia] = useState<'interna' | 'externa' | 'ambas'>( + 'interna' + ); + + const swapItems = (arr: T[], index1: number, index2: number): T[] => { + const result = [...arr]; + [result[index1], result[index2]] = [result[index2], result[index1]]; + return result; + }; + + const moverSeccion = (from: number, to: number) => { + if (to >= 0 && to < secciones.length) { + setSecciones((prev) => swapItems(prev, from, to)); + setPaginaActual(to + 1); + } + }; + + const moverPregunta = (seccionIndex: number, from: number, to: number) => { + const nuevas = [...secciones]; + const preguntas = nuevas[seccionIndex].preguntas; + if (to >= 0 && to < preguntas.length) { + nuevas[seccionIndex].preguntas = swapItems(preguntas, from, to); + setSecciones(nuevas); + } + }; + + const agregarSeccion = () => { + setSecciones((prev) => [ + ...prev, + { titulo: '', descripcion: '', preguntas: [] }, + ]); + setPaginaActual(secciones.length + 1); + }; + + const eliminarSeccion = (index: number) => { + const nuevas = secciones.filter((_, i) => i !== index); + setSecciones(nuevas); + setPaginaActual((prev) => + Math.max(1, prev > nuevas.length ? nuevas.length : prev) + ); + }; + + const actualizarSeccion = ( + index: number, + campo: K, + valor: Seccion[K] + ) => { + setSecciones((prev) => { + const nuevas = [...prev]; + nuevas[index][campo] = valor; + return nuevas; + }); + }; + + const agregarPregunta = (seccionIndex: number) => { + const nuevas = [...secciones]; + nuevas[seccionIndex].preguntas.push({ + titulo: '', + tipo: 'Abierta', + opciones: [], + obligatoria: false, + }); + setSecciones(nuevas); + }; + + const eliminarPregunta = (seccionIndex: number, preguntaIndex: number) => { + const nuevas = [...secciones]; + nuevas[seccionIndex].preguntas.splice(preguntaIndex, 1); + setSecciones(nuevas); + }; + + const actualizarPregunta = ( + seccionIndex: number, + preguntaIndex: number, + campo: keyof Pregunta, + valor: Pregunta[keyof Pregunta] + ) => { + setSecciones((prev) => { + const nuevas = [...prev]; + const pregunta = nuevas[seccionIndex].preguntas[preguntaIndex]; + nuevas[seccionIndex].preguntas[preguntaIndex] = { + ...pregunta, + [campo]: valor, + }; + return nuevas; + }); + }; + const agregarOpcion = (seccionIndex: number, preguntaIndex: number) => { + const nuevas = [...secciones]; + nuevas[seccionIndex].preguntas[preguntaIndex].opciones.push({ valor: '' }); + setSecciones(nuevas); + }; + + const eliminarOpcion = ( + seccionIndex: number, + preguntaIndex: number, + opcionIndex: number + ) => { + const nuevas = [...secciones]; + nuevas[seccionIndex].preguntas[preguntaIndex].opciones.splice( + opcionIndex, + 1 + ); + setSecciones(nuevas); + }; + + const actualizarOpcion = ( + seccionIndex: number, + preguntaIndex: number, + opcionIndex: number, + valor: string + ) => { + const nuevas = [...secciones]; + nuevas[seccionIndex].preguntas[preguntaIndex].opciones[opcionIndex].valor = + valor; + setSecciones(nuevas); + }; + + const guardarFormulario = () => { + const formData = { + nombre: nombreFormulario, + descripcion, + secciones, + }; + console.log('Formulario guardado:', JSON.stringify(formData)); + alert('Formulario guardado en consola'); + }; + + const seccionActual = secciones[paginaActual - 1]; + + const handleBannerChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0] || null; + if (file) { + const reader = new FileReader(); + reader.onload = () => setBannerPreview(reader.result as string); + reader.readAsDataURL(file); + } else { + setBannerPreview(null); + } + }; + + const imprimirFormulario = () => { + const data = { + banner: bannerPreview, + nombreFormulario, + descripcion, + secciones, + }; + console.log('Formulario a imprimir:', JSON.stringify(data)); + }; + + return ( + <> +

Crear nuevo formulario

+ +
+ + + {bannerPreview && ( +
+ Ejemplo de banner +
+ )} +
+ +
+ + setNombreFormulario(e.target.value)} + /> +
+ +
+ +