"use client"; import { useState, useEffect } from "react"; import { useSearchParams } from "next/navigation"; import axios from "axios"; import Cookies from "js-cookie"; import toast from "react-hot-toast"; import { SO_POR_EQUIPO } from "@/data/so_por_equipo"; import { PROCESADORES_POR_EQUIPO } from "@/data/procesadores"; import { useRouter } from "next/navigation"; import "../app/styles/layout/agregarEquipo.scss"; interface FormData { inventario: string; serie: string; lugar: string; fechaFactura: Date; antiguedad: string; modelo: string; id_estado: number; id_adscripcion: number; id_tipo_equipo: number; id_sistema_operativo: number; id_procesador: number; id_uso: number; id_marca: number; id_periferico: number; id_laboratorio: number | null; id_proyecto: number | null; isImpresora: boolean; } export default function Page() { const searchParams = useSearchParams(); const inventario = searchParams.get("equipoId"); const router = useRouter(); const [formData, setFormData] = useState({ inventario: "", serie: "", lugar: "", fechaFactura: new Date(), antiguedad: "MENORES DE 2", modelo: "", id_estado: 0, id_adscripcion: 0, id_tipo_equipo: 0, id_sistema_operativo: 0, id_procesador: 0, id_uso: 0, id_marca: 0, id_periferico: 0, id_laboratorio: null, id_proyecto: null, isImpresora: false, }); const [adscripcionLabel, setAdscripcionLabel] = useState(""); const [laboratorioLabel, setLaboratorioLabel] = useState(""); const [proyectoLabel, setProyectoLabel] = useState(""); const [suggestions, setSuggestions] = useState({ adscripcion: [] as string[], laboratorio: [] as string[], proyecto: [] as string[], }); useEffect(() => { if (inventario) { setFormData((prev) => ({ ...prev, inventario })); } }, [inventario]); // Interfaces interface TipoUso { id_uso: number; tipo_uso: string; } interface Estado { id_estado: number; estado: string; } interface TipoEquipo { id_tipo_de_equipo: number; tipo_equipo: string; } interface SistemaOperativo { id_sistema_operativo: number; sistema_operativo: string; } interface Procesador { id_procesador: number; procesador: string; } interface Marca { id_marca: number; marca: string; } interface Adscripcion { id_adscripcion: number; adscripcion: string; } interface Laboratorio { id_laboratorio: number; laboratorio: string; } interface Proyecto { id_proyecto: number; proyecto: string; } interface Perifericos { id_periferico: number; periferico: string; } // Estados const [tiposUso, setTiposUso] = useState([]); const [marcas, setMarcas] = useState([]); const [estados, setEstados] = useState([]); const [adscripciones, setAdscripciones] = useState([]); const [tiposEquipo, setTiposEquipo] = useState([]); const [sistemasOperativos, setSistemasOperativos] = useState< SistemaOperativo[] >([]); const [procesadores, setProcesadores] = useState([]); const [perifericos, setPerifericos] = useState([]); const [laboratorios, setLaboratorios] = useState([]); const [proyectos, setProyectos] = useState([]); const mostrarCamposComputadora = Number(formData.id_tipo_equipo) !== 9; const esTablet = [7, 8].includes(Number(formData.id_tipo_equipo)); const api_url = process.env.NEXT_PUBLIC_API_URL; useEffect(() => { const fetchData = async () => { const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const [ usosRes, marcasRes, estadosRes, adscripcionesRes, tiposEquipoRes, sistemasOperativosRes, laboratoriosRes, proyectosRes, ] = await Promise.all([ axios.get(`${api_url}/equipos/usos`, { headers }), axios.get(`${api_url}/equipos/marcas`, { headers }), axios.get(`${api_url}/equipos/estados`, { headers }), axios.get(`${api_url}/equipos/adscripciones`, { headers }), axios.get(`${api_url}/equipos/tipos-equipo`, { headers }), axios.get(`${api_url}/equipos/sistemas-operativos`, { headers }), axios.get(`${api_url}/equipos/laboratorios`, { headers }), axios.get(`${api_url}/equipos/proyectos`, { headers }), ]); setTiposUso(usosRes.data); setMarcas(marcasRes.data); setEstados(estadosRes.data); setAdscripciones(adscripcionesRes.data); setTiposEquipo(tiposEquipoRes.data); setSistemasOperativos(sistemasOperativosRes.data); setLaboratorios(laboratoriosRes.data); setProyectos(proyectosRes.data); } catch (err) { console.error(err); toast.error("Error al cargar los datos"); } }; fetchData(); }, [api_url]); useEffect(() => { const fetchProcesador = async () => { const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const response = await axios.get( `${api_url}/equipos/procesador-tipo-equipos`, { headers } ); setProcesadores(response.data); } catch (err) { console.error(err); toast.error("No se pudieron cargar los procesadores"); } }; fetchProcesador(); }, []); useEffect(() => { const fetchPerifericos = async () => { if (Number(formData.id_tipo_equipo) !== 9) return; const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { const response = await axios.get(`${api_url}/equipos/perifericos`, { headers, }); const ordenados = response.data.sort((a: any, b: any) => a.periferico.localeCompare(b.periferico) ); setPerifericos(ordenados); } catch (err) { console.error(err); toast.error("No se pudieron cargar los periféricos"); } }; fetchPerifericos(); }, [formData.id_tipo_equipo]); const normalize = (str: string) => str .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase(); const handleInputChange = ( field: string, value: string | number | boolean ) => { if (field === "adscripcionLabel") { const textValue = value as string; setAdscripcionLabel(textValue); const matches = adscripciones .filter((a) => normalize(a.adscripcion).includes(normalize(textValue))) .map((a) => a.adscripcion); setSuggestions((prev) => ({ ...prev, adscripcion: matches.slice(0, 5), })); return; } if (field === "laboratorioLabel") { const textValue = value as string; setLaboratorioLabel(textValue); const matches = laboratorios .filter((l) => normalize(l.laboratorio).includes(normalize(textValue))) .map((l) => l.laboratorio); setSuggestions((prev) => ({ ...prev, laboratorio: matches.slice(0, 5), })); return; } if (field === "proyectoLabel") { const textValue = value as string; setProyectoLabel(textValue); const matches = proyectos .filter((p) => normalize(p.proyecto).includes(normalize(textValue))) .map((p) => p.proyecto); setSuggestions((prev) => ({ ...prev, proyecto: matches.slice(0, 5), })); return; } setFormData((prev) => { let newValue: string | number | null | boolean = value; if (field.startsWith("id_")) { if (value === "" || value === 0) { // Para campos opcionales, usamos null en lugar de 0 if (field === "id_laboratorio" || field === "id_proyecto") { newValue = null; } else { newValue = 0; } } else { newValue = Number(value); } } if (field === "id_tipo_equipo") { const idTipoEquipo = Number(value); const tipoSeleccionado = tiposEquipo.find( (t) => t.id_tipo_de_equipo === idTipoEquipo ); const esPeriferico = tipoSeleccionado?.tipo_equipo === "PERIFÉRICO"; return { ...prev, id_tipo_equipo: idTipoEquipo, isImpresora: esPeriferico, id_procesador: 0, id_sistema_operativo: 0, }; } return { ...prev, [field]: newValue }; }); }; const handleSuggestionSelect = ( type: "adscripcion" | "laboratorio" | "proyecto", label: string ) => { if (type === "adscripcion") { const selected = adscripciones.find((a) => a.adscripcion === label); if (selected) { setFormData((prev) => ({ ...prev, id_adscripcion: selected.id_adscripcion, })); setAdscripcionLabel(selected.adscripcion); } } else if (type === "laboratorio") { const selected = laboratorios.find((l) => l.laboratorio === label); if (selected) { setFormData((prev) => ({ ...prev, id_laboratorio: selected.id_laboratorio, })); setLaboratorioLabel(selected.laboratorio); } } else if (type === "proyecto") { const selected = proyectos.find((p) => p.proyecto === label); if (selected) { setFormData((prev) => ({ ...prev, id_proyecto: selected.id_proyecto })); setProyectoLabel(selected.proyecto); } } setSuggestions((prev) => ({ ...prev, [type]: [] })); }; const handleGuardar = async () => { const requiredFields = [ { field: formData.inventario, name: "Inventario" }, { field: formData.id_marca, name: "Marca" }, { field: formData.id_tipo_equipo, name: "Tipo de equipo" }, { field: formData.id_estado, name: "Estado" }, { field: formData.id_uso, name: "Tipo de uso" }, { field: formData.id_adscripcion, name: "Adscripción" }, ]; for (const { field, name } of requiredFields) { if (!field) { toast.error(`${name} es obligatorio`); return; } } if (formData.id_tipo_equipo === 9 && !formData.id_periferico) { toast.error("Periférico es obligatorio"); return; } if ( ![7, 8, 9].includes(formData.id_tipo_equipo) && !formData.id_sistema_operativo ) { toast.error("Sistema operativo es obligatorio"); return; } if (formData.id_tipo_equipo !== 9 && !formData.id_procesador) { toast.error("Procesador es obligatorio"); return; } try { const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; const dataToSend = { ...formData, fechaFactura: new Date(formData.fechaFactura) .toISOString() .split("T")[0], antiguedad: formData.antiguedad || "0 años", }; await axios.post(`${api_url}/equipos/crear`, dataToSend, { headers }); toast.success("Equipo guardado correctamente"); router.push("/escaner"); } catch (err: any) { console.error(err); if (err.response && err.response.status === 400) { const mensaje = err.response.data?.message || "El equipo ya 1existe"; toast.error(mensaje); return; } toast.error("Error al guardar el equipo"); } }; const handleCancelar = () => { router.push("/escaner"); }; return (

Agregar Nuevo Equipo

{/* Columna Izquierda */}
handleInputChange("inventario", e.target.value) } />
handleInputChange("serie", e.target.value)} />
handleInputChange("modelo", e.target.value)} />
{/* Columna Central */}
{mostrarCamposComputadora && ( <>
{!esTablet && (
)} )} {!mostrarCamposComputadora && (
)} {/* Adscripción */}
handleInputChange("adscripcionLabel", e.target.value) } /> {suggestions.adscripcion.length > 0 && (
    {suggestions.adscripcion.map((s) => (
  • handleSuggestionSelect("adscripcion", s)} > {s}
  • ))}
)}
{/* Columna Derecha */}
{/* Laboratorio */}
{/* Proyecto */}
{/* Lugar */}