From b18fd46acfced0f75f8b4b9ee3f5e3a9ec524ba9 Mon Sep 17 00:00:00 2001 From: evenegas Date: Mon, 30 Jun 2025 12:55:08 -0600 Subject: [PATCH] Cambios de estilo --- src/app/(auth)/page.tsx | 2 +- src/app/alta/alta.tsx | 191 +++++++++++++++++++++++++++++++ src/app/carga/page.tsx | 6 +- src/app/landing/IconCircle.css | 5 +- src/app/landing/globals.css | 24 ++-- src/app/landing/landing_body.tsx | 9 +- src/app/landing/page.tsx | 66 ----------- src/app/layout.tsx | 2 +- src/app/page.tsx | 24 ++-- src/app/visualizacion/page.tsx | 26 +++-- src/components/cargaArchivo.tsx | 2 +- src/containers/LoginPage.tsx | 4 +- 12 files changed, 253 insertions(+), 108 deletions(-) create mode 100644 src/app/alta/alta.tsx delete mode 100644 src/app/landing/page.tsx diff --git a/src/app/(auth)/page.tsx b/src/app/(auth)/page.tsx index 91b4047..3919ba1 100644 --- a/src/app/(auth)/page.tsx +++ b/src/app/(auth)/page.tsx @@ -57,7 +57,7 @@ export default function Page() { transition={{ delay: 0, duration: 0.5 }} >

Bienvenido al sistema de

-

Carga Masiva

+

Servicios PCPUMA y CEDETEC

{ + const [tipoUsuario, setTipoUsuario] = useState(""); + const [formData, setFormData] = useState({}); + const [errores, setErrores] = useState([]); + const [mensaje, setMensaje] = useState(""); + + const camposEstudiante = [ + "num_cuenta", "carrera", "clave_carrera", "nombre", + "a_paterno", "a_materno", "fecha_nacimiento", "genero", "generacion", + ]; + + const camposEspecial = [ + "num_cuenta", "nombre", "a_paterno", "a_materno", "rfc", + "fecha_nacimiento", "genero", "carrera", "clave_carrera", + ]; + + const camposVisibles = + tipoUsuario === "" + ? [] + : tiposUsuarioEstudiante.includes(tipoUsuario) + ? camposEstudiante + : tiposUsuarioEspecial.includes(tipoUsuario) + ? camposEspecial + : []; + + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + + if (name === "tipo_usuario") { + setTipoUsuario(value); + setFormData((prev: any) => ({ + ...prev, + tipo_usuario: value, + })); + } else { + setFormData((prev: any) => ({ + ...prev, + [name]: value, + })); + } + }; + + const validarCampos = (): boolean => { + const faltantes = camposVisibles.filter( + (campo) => !formData[campo] || formData[campo].toString().trim() === "" + ); + setErrores(faltantes); + return faltantes.length === 0; + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setMensaje(""); + + if (!validarCampos()) { + setMensaje("Por favor llena todos los campos obligatorios."); + return; + } + + try { + const token = localStorage.getItem("token"); + const normalizado = { ...formData }; + + if (normalizado.fecha_nacimiento) { + normalizado.fecha_nacimiento = normalizado.fecha_nacimiento.replaceAll("-", "").slice(0, 8); + } + + if (normalizado.generacion !== undefined && normalizado.generacion !== "") { + const num = Number(normalizado.generacion); + if (!isNaN(num)) { + normalizado.generacion = num; + } else { + delete normalizado.generacion; + } + } + + const response = await fetch("http://localhost:4000/excel/carga", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(normalizado), + }); + + if (!response.ok) { + const error = await response.json(); + console.error("Error del servidor:", error); + setMensaje("Ocurrió un error al guardar el usuario ❌"); + return; + } + + setMensaje("Usuario guardado correctamente ✅"); + setFormData({}); + setTipoUsuario(""); + } catch (err) { + console.error("Error en petición fetch:", err); + setMensaje("Ocurrió un error al guardar el usuario ❌"); + } + }; + + return ( +
+

Carga Individual

+ + {/* Select tipo_usuario */} +
+ + +
+ + {/* Renderizado dinámico de campos */} + {camposVisibles.map((campo) => ( +
+ + + {/* campo especial "genero" */} + {campo === "genero" ? ( + + ) : ( + + )} +
+ ))} + + {mensaje && ( +
+ {mensaje} +
+ )} + +
+ +
+
+ ); +}; + +export default FormularioCargaIndividual; diff --git a/src/app/carga/page.tsx b/src/app/carga/page.tsx index 74e27ae..cdc3c6f 100644 --- a/src/app/carga/page.tsx +++ b/src/app/carga/page.tsx @@ -31,7 +31,7 @@ export default function Dashboard() { const data = await res.json(); console.log("Respuesta del backend:", data); - const fuentesConvertidas: Fuente[] = data.map((mov: any) => ({ + const fuentesConvertidas: Fuente[] = data.move.map((mov: any) => ({ nombre: `${mov.reporte}: ${mov.id_mov}`, id_mov: mov.id_mov, fecha: new Date(mov.fecha_mov).toLocaleString("es-MX", { @@ -40,7 +40,7 @@ export default function Dashboard() { month: "long", year: "numeric", }), - activa: true, // puedes ajustar esto si hay una lógica real + activa: data.button, })); setFuentes(fuentesConvertidas); @@ -111,7 +111,7 @@ export default function Dashboard() { ))} -

Carga

+

Carga

diff --git a/src/app/landing/IconCircle.css b/src/app/landing/IconCircle.css index 99b933b..4d30313 100644 --- a/src/app/landing/IconCircle.css +++ b/src/app/landing/IconCircle.css @@ -53,5 +53,6 @@ .floating-icon i { font-size: 1.25rem; - color: #d59f0f; /* Dorado UNAM */ -} + color: #d59f0f; + /* Dorado UNAM */ +} \ No newline at end of file diff --git a/src/app/landing/globals.css b/src/app/landing/globals.css index 2fed0d1..ff45995 100644 --- a/src/app/landing/globals.css +++ b/src/app/landing/globals.css @@ -33,9 +33,11 @@ header div:first-child { background-color: white; padding: 10px; border-radius: 50px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); /* sombra suave */ + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + /* sombra suave */ display: flex; - gap: 1rem; /* espacio entre los */ + gap: 1rem; + /* espacio entre los */ } header a { @@ -80,7 +82,7 @@ p { } /* Botón principal */ -div > button { +div>button { background-color: #003d79; color: white; padding: 0.7rem 2rem; @@ -90,14 +92,14 @@ div > button { cursor: pointer; } -div > div p { +div>div p { margin: 0; font-size: 0.9rem; color: #888; } /* Scroll hint */ -body > p:last-of-type { +body>p:last-of-type { margin-top: 2rem; font-size: 0.85rem; color: #aaa; @@ -112,12 +114,16 @@ body > p:last-of-type { left: none; width: 100vw; height: 100vh; - z-index: -1; /* para que esté detrás de todo */ - pointer-events: none; /* no interfiere con el contenido */ + z-index: -1; + background-color: #003d79c2; + /* para que esté detrás de todo */ + pointer-events: none; + /* no interfiere con el contenido */ display: flex; justify-content: center; align-items: center; - overflow: hidden; + height: 100%; + overflow-y: auto; } .circle { @@ -130,4 +136,4 @@ body > p:last-of-type { .invert { filter: invert(1); -} +} \ No newline at end of file diff --git a/src/app/landing/landing_body.tsx b/src/app/landing/landing_body.tsx index ca7a6c1..9519eb2 100644 --- a/src/app/landing/landing_body.tsx +++ b/src/app/landing/landing_body.tsx @@ -11,18 +11,15 @@ export default function LandingBody() { const router = useRouter(); return ( - Servicios de soporte técnico PCPUMA -

- Accede a PC PUMA Conecta para reportes especializados, módulos de - soporte físico en campus, servicio de correo institucional y - herramientas de gestión académica. -

+ Servicios PCPUMA y CEDETEC +
{ - const [page, setPage] = useState("landing"); - - return ( - - {/*
*/} - -
- {[150, 300, 450, 600, 900].map((size, i) => ( - - ))} -
- -
- {/* renderiza el body según el estado `page` */} - {page === "landing" && } - {page === "login" && } - {page === "carga" && } - {page === "consulta" && } -
- - {/* - - - - */} - -
- - ); -}; - -export default Home; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 32f2e23..4f13e7c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -11,7 +11,7 @@ export default function RootLayout({ }>) { return ( - + { const items: HeaderItem[] = data?.id ? [ - { label: "Inicio", page: "landing" }, - { label: "Consulta", page: "consulta" }, - { label: "Carga", page: "carga" }, - { label: "Público", page: "publico" }, - { label: "Cerrar sesión", onClick: handleLogout }, - ] + { label: "Inicio", page: "landing" }, + { label: "Consulta", page: "consulta" }, + { label: "Carga", page: "carga" }, + { label: "Carga individual", page: "carga individual" }, + { label: "Cerrar sesión", onClick: handleLogout }, + ] : [ - { label: "Consulta", page: "consulta" }, - { label: "Inicio", page: "landing" }, - { label: "Login", page: "login" }, - ]; + { label: "Consulta", page: "consulta" }, + { label: "Inicio", page: "landing" }, + { label: "Login", page: "login" }, + ]; return ( <> @@ -51,6 +52,7 @@ const Home = () => { {page === "login" && } {page === "consulta" && } {page === "carga" && } + {page === 'carga individual' && }