diff --git a/app/(private)/BitacoraSanciones/page.tsx b/app/(private)/BitacoraSanciones/page.tsx index 5ebe1ff..f0ed7ac 100644 --- a/app/(private)/BitacoraSanciones/page.tsx +++ b/app/(private)/BitacoraSanciones/page.tsx @@ -2,7 +2,7 @@ import BitacoraAlumno from "@/app/Components/BitacoraSanciones/BitacoraAlumno"; import BitacoraEquipo from "@/app/Components/BitacoraSanciones/BitacoraEquipo"; import BitacoraMesas from "@/app/Components/BitacoraSanciones/BitacoraMesas"; import Sanciones from "@/app/Components/BitacoraSanciones/Sanciones"; -import SearchUser from "@/app/Components/Global/SearchUser/searchUser"; +import SearchUserWithDate from "@/app/Components/Global/SearchUser/SearchUserWithDate"; import Toggle from "@/app/Components/Global/Toggle/Toggle"; import { GetStudent } from "@/app/lib/getStudent"; @@ -13,23 +13,22 @@ export default async function Page(props: { }>; }) { const params = await props.searchParams; - const key = params?.key && params.key ; + const key = params?.key && params.key; const numAcount = params?.numAcount ? params.numAcount : null; - let student: any = null; - - if (numAcount) { - const result = await GetStudent(parseInt(numAcount)); - - if (result.error) { - } else { - student = result; - } + let student: any = null; + + if (numAcount) { + const result = await GetStudent(parseInt(numAcount)); + + if (result.error) { + } else { + student = result; } + } return (
-

BITACORA Y SANCIONES

- + ), @@ -68,7 +67,7 @@ export default async function Page(props: { label: "Sanciones", content: ( <> - + ), }, diff --git a/app/(private)/Impresiones/page.tsx b/app/(private)/Impresiones/page.tsx index ca95c16..48e43df 100644 --- a/app/(private)/Impresiones/page.tsx +++ b/app/(private)/Impresiones/page.tsx @@ -34,7 +34,6 @@ export default async function Page(props: { return (
- {errorMessage && }

IMPRESIONES Y PLOTEO

diff --git a/app/(private)/QuitarSancion/page.tsx b/app/(private)/QuitarSancion/page.tsx index 7e2a7ed..83c7dcf 100644 --- a/app/(private)/QuitarSancion/page.tsx +++ b/app/(private)/QuitarSancion/page.tsx @@ -1,5 +1,7 @@ import SearchUser from "@/app/Components/Global/SearchUser/searchUser"; +import ShowError from "@/app/Components/Global/ShowError"; import QuitarSancion from "@/app/Components/QuitarSancion/QuitarSancion"; +import { GetSancionByStudent } from "@/app/lib/getStudent copy"; export default async function Page(props: { searchParams?: Promise<{ @@ -9,13 +11,25 @@ export default async function Page(props: { const params = await props.searchParams; const numAcount = params?.numAcount ? params.numAcount : null; + let student: any = null; + let errorMessage = ""; + + if (numAcount) { + const result = await GetSancionByStudent(parseInt(numAcount)); + if (result.error) { + errorMessage = `${result.error}`; + } else { + student = result as Student; + } + } return ( <> + {errorMessage && } +

Quitar Sanciones

-
+
- +
); diff --git a/app/Components/BitacoraSanciones/BitacoraAlumno.tsx b/app/Components/BitacoraSanciones/BitacoraAlumno.tsx index fc793b1..ff75106 100644 --- a/app/Components/BitacoraSanciones/BitacoraAlumno.tsx +++ b/app/Components/BitacoraSanciones/BitacoraAlumno.tsx @@ -1,5 +1,4 @@ "use client"; -import SearchDate from "../SearchDate/SearchDate"; import { useState } from "react"; import styles from "./Page.module.css"; @@ -14,8 +13,7 @@ function BitacoraAlumno() { const [alumnos, setAlumnos] = useState([]); return ( <> - -
+
diff --git a/app/Components/BitacoraSanciones/BitacoraEquipo.tsx b/app/Components/BitacoraSanciones/BitacoraEquipo.tsx index a335743..33006fd 100644 --- a/app/Components/BitacoraSanciones/BitacoraEquipo.tsx +++ b/app/Components/BitacoraSanciones/BitacoraEquipo.tsx @@ -16,7 +16,6 @@ function BitacoraEquipo() { const [ubicacion_equipo, setUbicacionEquipo] = useState(""); return ( <> -
@@ -28,12 +27,10 @@ function BitacoraEquipo() { - -
+ +
diff --git a/app/Components/BitacoraSanciones/Sanciones.tsx b/app/Components/BitacoraSanciones/Sanciones.tsx index b4442e9..109ccc2 100644 --- a/app/Components/BitacoraSanciones/Sanciones.tsx +++ b/app/Components/BitacoraSanciones/Sanciones.tsx @@ -19,8 +19,7 @@ export default async function Sanciones(props: { student?: Student }) { NoCuenta={props.student.id_cuenta} Nombre={props.student.nombre} /> - - + )} diff --git a/app/Components/BitacoraSanciones/TableSancion.tsx b/app/Components/BitacoraSanciones/TableSancion.tsx index e45662e..6ff31d2 100644 --- a/app/Components/BitacoraSanciones/TableSancion.tsx +++ b/app/Components/BitacoraSanciones/TableSancion.tsx @@ -24,24 +24,64 @@ interface sancion { } export default function TableSancion() { - const [sanciones, setSanciones] = useState(); + const [sanciones, setSanciones] = useState([]); const [button, setButton] = useState(false); + const [selectedSancion, setSelectedSancion] = useState(""); + const [alumnoSanciones, setAlumnoSanciones] = useState([]); + /* + useEffect(() => { + const getSanciones = async () => { + const response = await axios.get(""); + setSanciones(response); + }; + getSanciones(); + }, [button]); - // useEffect(() => { - // const getSanciones = async () => { - // const response = await axios.get(""); - // setSanciones(response); - // }; - // getSanciones(); - // }, [button]); + + + + + + https://venus.acatlan.unam.mx/asignacionTiempo_test/alumno-sancion/320154041 + .get("https://venus.acatlan.unam.mx/asignacionTiempo_test/sancion") +*/ + useEffect(() => { + axios + .get( + " https://venus.acatlan.unam.mx/asignacionTiempo_test/alumno-sancion/423019393" + ) + .then((response) => { + setAlumnoSanciones(response.data); + }) + .catch((error) => { + console.error("Error al obtener las sanciones:", error); + }); + + axios + .get("https://venus.acatlan.unam.mx/asignacionTiempo_test/sancion") + .then((response) => { + setSanciones(response.data); + }) + .catch((error) => { + console.error("Error al obtener las sanciones:", error); + }); + }, []); const handlebutton = () => { setButton(!button); }; - + + const calcularFechaFin = (fechaInicio: string, duracionSemanas: number) => { + const fecha = new Date(fechaInicio); + fecha.setDate(fecha.getDate() + duracionSemanas * 7); + return fecha.toLocaleDateString(); + }; + return ( <> -
+
{new Date(item.fecha_inicio).toLocaleDateString()} + {calcularFechaFin(item.fecha_inicio, item.sancion?.duracion)} +
@@ -52,19 +92,51 @@ export default function TableSancion() { - + + {sanciones.length > 0 ? ( + alumnoSanciones.map((item: any) => ( + + + + + + + + )) + ) : ( + + + + )} +
Podra utilizar el servicio hasta
{item.alumno?.id_cuenta}{item.sancion?.sancion}{item.sancion?.duracion}{new Date(item.fecha_inicio).toLocaleDateString()} + {calcularFechaFin( + item.fecha_inicio, + item.sancion?.duracion + )} +
No hay sanciones registradas
- setSelectedSancion(e.target.value)} + > - + {sanciones.map((sancion: any) => ( + + ))}
- diff --git a/app/Components/Global/SearchUser/SearchUserWithDate.tsx b/app/Components/Global/SearchUser/SearchUserWithDate.tsx new file mode 100644 index 0000000..e1470c4 --- /dev/null +++ b/app/Components/Global/SearchUser/SearchUserWithDate.tsx @@ -0,0 +1,58 @@ +"use client"; + +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import { useEffect, useState } from "react"; +import SearchDate from "../../SearchDate/SearchDate"; + +interface urlProp { + value: string | null; +} + +function SearchUserWithDate(props: urlProp) { + const [numAcount, setnumAcount] = useState(""); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + useEffect(() => { + if (props.value) { + setnumAcount(props.value); + } + }, [props.value]); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + const params = new URLSearchParams(searchParams.toString()); + if (numAcount) { + params.set("numAcount", `${numAcount}`); + router.push(`${pathname}?${params.toString()}`); + } + }; + + return ( + <> +
+ +
+ { + const value = e.target.value; + if (/^\d*$/.test(value) && value.length <= 9) { + setnumAcount(value); + } + }} + placeholder="Coloca un número de cuenta..." + inputMode="numeric" + pattern="[0-9]*" + /> + +
+
+ + ); +} + +export default SearchUserWithDate; +//IO diff --git a/app/Components/QuitarSancion/QuitarSancion.tsx b/app/Components/QuitarSancion/QuitarSancion.tsx index 03516d2..5187340 100644 --- a/app/Components/QuitarSancion/QuitarSancion.tsx +++ b/app/Components/QuitarSancion/QuitarSancion.tsx @@ -1,48 +1,75 @@ -"use client"; -import { useState } from "react"; - import styles from "./Page.module.css"; -interface quitarSanciones { - id: number; +interface Alumno { + id_cuenta: number; nombre: string; - motivo: string; - duracion: number; - fecha_sancion: string; - utilizar_equipo: number; + credito: number; } -function QuitarSancion() { - const [quitarSanciones, SetQuitarSanciones] = useState([]); +interface Sancion { + id_sancion: number; + sancion: string; + duracion: number; +} + +interface AlumnoSancion { + id_alumno_sancion: number; + fecha_inicio: string; + sancion: Sancion; +} + +interface DataProps { + student: Alumno; + alusancion: AlumnoSancion[]; +} + +interface Props { + data: DataProps | null; +} + +function QuitarSancion({ data }: Props) { + const calcularFechaFin = (fechaInicio: string, duracionSemanas: number) => { + const fecha = new Date(fechaInicio); + fecha.setDate(fecha.getDate() + duracionSemanas * 7); + return fecha.toLocaleDateString(); + }; + return (
-
+
- + - + - + - {quitarSanciones.map((quitarSanciones, index) => ( - - - - - - - + {data && data.alusancion.length > 0 ? ( + data.alusancion.map((item) => ( + + + + + + + + + )) + ) : ( + + - ))} + )}
idID Nombre Motivo SanciónDuracion (semanas) Duración (semanas) Fecha SanciónPodria utilizar el servicio hastaPodría utilizar el servicio hasta
{quitarSanciones.id}{quitarSanciones.nombre}{quitarSanciones.motivo}{quitarSanciones.duracion}{quitarSanciones.fecha_sancion}{quitarSanciones.utilizar_equipo}
{item.id_alumno_sancion}{data.student.nombre}{item.sancion.sancion}{item.sancion.duracion}{new Date(item.fecha_inicio).toLocaleDateString()} + {calcularFechaFin(item.fecha_inicio, item.sancion.duracion)} +
No hay sanciones registradas
-
); } diff --git a/app/lib/getStudent copy.ts b/app/lib/getStudent copy.ts new file mode 100644 index 0000000..27f0431 --- /dev/null +++ b/app/lib/getStudent copy.ts @@ -0,0 +1,19 @@ +import axios from "axios"; +import { envConfig } from "./config"; + +export async function GetSancionByStudent(numAcount: number) { + try { + const response = await axios.get( + `${envConfig.apiUrl}/alumno-sancion/${numAcount}` + ); + + return response.data; + } catch (error: any) { + const msg = + error.response?.data?.message || + error.message || + "Error desconocido al obtener estudiante"; + return { error: msg }; + } +} +//IO diff --git a/package-lock.json b/package-lock.json index 9bc5488..6fbc9c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "react": "19.1.0", "react-dom": "19.1.0", "react-hot-toast": "^2.6.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-toastify": "^11.0.5" }, "devDependencies": { "@types/js-cookie": "^3.0.6", @@ -688,6 +689,15 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -1174,6 +1184,19 @@ "react": "*" } }, + "node_modules/react-toastify": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz", + "integrity": "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", diff --git a/package.json b/package.json index c888ba7..c422cf7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "react": "19.1.0", "react-dom": "19.1.0", "react-hot-toast": "^2.6.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-toastify": "^11.0.5" }, "devDependencies": { "@types/js-cookie": "^3.0.6",