From dc79c55f1e20dde121ac76e53f26a27dba3ee328 Mon Sep 17 00:00:00 2001 From: IO420 <320154041@pcpuma.acatlan.unam.mx> Date: Fri, 31 Oct 2025 14:10:00 -0600 Subject: [PATCH] modified editar and agregarequipo --- src/app/(Operador)/AgregarEquipo/page.tsx | 120 +++++++++++++++++----- src/app/(Operador)/Escaner/page.tsx | 6 +- src/components/BarcodeScanner.tsx | 1 - src/components/Editar.tsx | 68 ++++++++---- src/middleware.ts | 2 +- 5 files changed, 145 insertions(+), 52 deletions(-) diff --git a/src/app/(Operador)/AgregarEquipo/page.tsx b/src/app/(Operador)/AgregarEquipo/page.tsx index 9ba95fb..2b75611 100644 --- a/src/app/(Operador)/AgregarEquipo/page.tsx +++ b/src/app/(Operador)/AgregarEquipo/page.tsx @@ -22,13 +22,52 @@ export default function Page() { responsable: "", }); - const [tiposUso, setTiposUso] = useState([]); - const [marcas, setMarcas] = useState([]); - const [estados, setEstados] = useState([]); - const [adscripciones, setAdscripciones] = useState([]); - const [tiposEquipo, setTiposEquipo] = useState([]); - const [sistemasOperativos, setSistemasOperativos] = useState([]); - const [procesadores, setProcesadores] = useState([]); + // Tipos de datos + interface TipoUso { + id_tipo_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; + tipo_marca: string; + } + + interface Adscripcion { + id_adscripcion: number; + adscripcion: 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 [suggestions, setSuggestions] = useState({ adscripcion: [] as string[], @@ -86,7 +125,7 @@ export default function Page() { }; fetchData(); - }, []); + }, [api_url]); const handleInputChange = (field: string, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); @@ -98,15 +137,32 @@ export default function Page() { }; const handleGuardar = async () => { - const token = Cookies.get("token"); - const headers = { Authorization: `Bearer ${token}` }; - - await axios.post(`${api_url}/equipos/crear`, formData, { headers }); - toast.success("Equipo guardado"); + try { + const token = Cookies.get("token"); + const headers = { Authorization: `Bearer ${token}` }; + await axios.post(`${api_url}/equipos/crear`, formData, { headers }); + toast.success("Equipo guardado correctamente"); + setFormData({ + serie: "", + marca: "", + modelo: "", + tipoEquipo: "", + estado: "", + sistemaOperativo: "", + procesador: "", + tipoUso: "", + observaciones: "", + adscripcion: "", + lugar: "", + responsable: "", + }); + } catch (err) { + toast.error("Error al guardar el equipo"); + } }; const handleCancelar = () => { - toast.success("Acción cancelada"); + toast.error("Acción cancelada"); }; return ( @@ -119,6 +175,7 @@ export default function Page() {
@@ -154,6 +212,7 @@ export default function Page() {
@@ -171,13 +230,14 @@ export default function Page() {
@@ -187,15 +247,16 @@ export default function Page() { {/* Columna Centro */}
- + @@ -213,8 +274,8 @@ export default function Page() { > {procesadores.map((p) => ( - ))} @@ -230,8 +291,11 @@ export default function Page() { > {sistemasOperativos.map((so) => ( - ))} @@ -242,6 +306,7 @@ export default function Page() {
- {/* Columna Derecha */}
diff --git a/src/app/(Operador)/Escaner/page.tsx b/src/app/(Operador)/Escaner/page.tsx index e1f486a..44d201e 100644 --- a/src/app/(Operador)/Escaner/page.tsx +++ b/src/app/(Operador)/Escaner/page.tsx @@ -42,11 +42,13 @@ export default function Dashboard() { if (data) { router.push(`/Editar?equipoId=${data.id}`); } else { - router.push(`/AgregarEquipo?equipoId=${code}`); + toast.error(`No se encontro el equipo ${data.id}`); + router.push(`/Editar?equipoId=${data.id}`); } } catch (error) { - router.push(`/AgregarEquipo?equipoId=${code}`); + toast.error("Error No se encontro el equipo"); } + toast(`${code}`); }; return ( diff --git a/src/components/BarcodeScanner.tsx b/src/components/BarcodeScanner.tsx index 3d72d91..4ddb836 100644 --- a/src/components/BarcodeScanner.tsx +++ b/src/components/BarcodeScanner.tsx @@ -27,7 +27,6 @@ export default function BarcodeScanner({ onScan }: BarcodeScannerProps) { useEffect(() => { if (!scannerRef.current) return; - // ✅ Sin `any`: usamos un objeto literal tipado implícitamente const config: QuaggaConfig = { inputStream: { name: "Live", diff --git a/src/components/Editar.tsx b/src/components/Editar.tsx index 1640d4a..8aadf89 100644 --- a/src/components/Editar.tsx +++ b/src/components/Editar.tsx @@ -10,9 +10,10 @@ import toast from "react-hot-toast"; export default function Editar() { const searchParams = useSearchParams(); - const equipoId = searchParams.get("equipoId"); + const inventario = searchParams.get("equipoId"); const [formData, setFormData] = useState({ + inventario: "", serie: "", marca: "", modelo: "", @@ -38,6 +39,7 @@ export default function Editar() { const api_url = process.env.NEXT_PUBLIC_API_URL; const mostrarCamposComputadora = formData.tipoEquipo !== "Impresora"; + // 🔹 Cargar catálogos useEffect(() => { const fetchCatalogos = async () => { const token = Cookies.get("token"); @@ -78,28 +80,58 @@ export default function Editar() { fetchCatalogos(); }, []); + // 🔹 Obtener equipo por inventario useEffect(() => { const fetchEquipo = async () => { + if (!inventario) return; const token = Cookies.get("token"); const headers = { Authorization: `Bearer ${token}` }; try { - const response = await axios.get(`${api_url}/equipos/${equipoId}`, { - headers, + const response = await axios.get( + `${api_url}/equipos/buscar/${inventario}`, + { + headers, + } + ); + + const equipo = response.data; + + setFormData({ + inventario: equipo.inventario || "", + serie: equipo.serie || "", + marca: equipo.marca?.marca || "", // <- relación + modelo: equipo.modelo || "", + tipoEquipo: equipo.tipoEquipo?.tipo || "", + estado: equipo.estado?.estado || "", + sistemaOperativo: equipo.sistemaOperativo?.nombre || "", + procesador: equipo.procesador?.nombre || "", + tipoUso: equipo.tipoUso?.tipo || "", + observaciones: equipo.observaciones || "", + adscripcion: equipo.adscripcion?.adscripcion || "", + lugar: equipo.lugar || "", + responsable: equipo.responsable || "", // <- devuelto por searchResponsable }); - setFormData(response.data); } catch (error) { console.error("Error al obtener el equipo:", error); toast.error("No se pudo cargar la información del equipo."); } }; - if (equipoId) fetchEquipo(); - }, [equipoId]); + fetchEquipo(); + }, [inventario]); + // 🔹 Guardar cambios const handleGuardar = async () => { + const token = Cookies.get("token"); + const headers = { Authorization: `Bearer ${token}` }; + try { - await axios.patch(`${api_url}/equipos/update/${equipoId}`, formData); + await axios.patch( + `${api_url}/equipos/update/${formData.inventario}`, + formData, + { headers } + ); toast.success("Equipo actualizado correctamente"); } catch (error) { console.error("Error al guardar:", error); @@ -115,17 +147,21 @@ export default function Editar() {

- {equipoId ? `Editar Equipo (${equipoId})` : "Agregar Equipo"} + {inventario ? `Editar Equipo (${inventario})` : "Agregar Equipo"}

{/* Columna 1 */}
+
+ + +
+
setFormData({ ...formData, serie: e.target.value }) @@ -154,7 +190,6 @@ export default function Editar() { setFormData({ ...formData, modelo: e.target.value }) @@ -170,7 +205,7 @@ export default function Editar() { setFormData({ ...formData, tipoEquipo: e.target.value }) } > - + {tiposEquipo.map((t) => ( + {tiposUso.map((t) => (
@@ -290,7 +320,6 @@ export default function Editar() {