fixed addTime and added new BarNavigation

This commit is contained in:
2026-01-23 12:35:35 -06:00
parent 21bd341762
commit 7af87fa424
12 changed files with 254 additions and 73 deletions
+18 -12
View File
@@ -10,6 +10,7 @@ import "./addTime.css";
import SelectionCo from "@/app/Components/Selection/SelectionCo";
import axios from "axios";
import { envConfig } from "@/app/lib/config";
import Cookies from "js-cookie";
const PLATAFORMA_MAP: Record<string, number> = {
WINDOWS: 1,
@@ -36,8 +37,9 @@ export default function AddTime({
// 🔹 datos del recibo
const [folio, setFolio] = useState("");
const [amount, setAmount] = useState("");
const [date, setDate] = useState("");
const todayISO = new Date().toISOString().split("T")[0];
const [date, setDate] = useState(todayISO);
// 🔹 restricción de fechas
const day = new Date();
const year = day.getFullYear();
@@ -77,23 +79,27 @@ export default function AddTime({
const id_plataforma = PLATAFORMA_MAP[plataformaSeleccionada];
try {
await PostReceipt({
id_cuenta: numAcount,
folio_recibo: folio,
monto: Number(amount),
fecha_recibo: date,
});
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
await axios.post(`${envConfig.apiUrl}/alumno-inscrito/tiempo`, {
idCuenta: numAcount,
idPlataforma: id_plataforma,
});
await axios.post(
`${envConfig.apiUrl}/operations/time`,
{
monto: Number(amount),
id_cuenta: numAcount,
idPlataforma: id_plataforma,
folio_recibo: folio,
fecha_recibo: date,
},
{ headers },
);
toast.success("Tiempo Guardado");
setFolio("");
setAmount("");
setDate("");
router.refresh();
} catch (err: any) {
toast.error(err.message || "Error al guardar");
}
+21
View File
@@ -9,3 +9,24 @@
flex-direction: column;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.firstPartInformationTime {
display: flex;
flex-direction: column;
width: 100%;
max-width: 450px;
}
.containeInformationTime {
display: flex;
gap: 10px;
width: 100%;
}
@media (max-width: 800px) {
.containeInformationTime {
flex-direction: column;
justify-content: center;
align-items: center;
}
}
+33 -33
View File
@@ -3,25 +3,12 @@ import Information from "@/app/Components/Global/Information/information";
import ShowError from "@/app/Components/Global/ShowError";
import { GetRegisterStudent } from "@/app/lib/getRegisterStudent";
import { envConfig } from "@/app/lib/config";
import "./addTime.css";
import AddTime from "./Addtime";
import Table from "@/app/Components/Global/table";
async function getInscripcion(idCuenta: number) {
try {
const res = await fetch(`${envConfig.apiUrl}/alumno-inscrito/${idCuenta}`, {
headers: { "Content-Type": "application/json" },
cache: "no-store",
});
if (!res.ok) throw new Error("No se pudo cargar inscripción");
return await res.json();
} catch {
return [];
}
}
const headers = ["Inscrito", "Tiempo", "Confirmó"];
export default async function Page(props: {
searchParams?: Promise<{ numAcount: string }>;
@@ -41,13 +28,21 @@ export default async function Page(props: {
errorMessage = result.error;
} else {
student = result[0]?.alumno;
inscripcion = await getInscripcion(idCuenta);
inscripcion = result;
}
}
const plataformasInscritas = inscripcion.map(
(ins) => ins.plataforma?.nombre
);
const tableData = Array.isArray(inscripcion)
? inscripcion.map((ins) => ({
Inscrito: ins.plataforma?.nombre || "—",
Tiempo: ins.tiempo_disponible
? `${ins.tiempo_disponible} minutos`
: "—",
Confirmó: ins.platica.data?.[0] === 1 ? "sí" : "no",
}))
: [];
const plataformasInscritas = inscripcion.map((ins) => ins.plataforma?.nombre);
return (
<section className="containerSection">
@@ -55,22 +50,27 @@ export default async function Page(props: {
<h2 className="title">AGREGAR TIEMPO</h2>
<SearchUser value={numAcount} />
<div className="containeInformationTime">
<div className="firstPartInformationTime">
<SearchUser value={numAcount} />
{student && (
<>
<Information
NoCuenta={student.id_cuenta}
Nombre={student.nombre}
/>
{student && (
<>
<Information
NoCuenta={student.id_cuenta}
Nombre={student.nombre}
/>
<AddTime
numAcount={student.id_cuenta}
plataformasInscritas={plataformasInscritas}
/>
</>
)}
</div>
<AddTime
numAcount={student.id_cuenta}
plataformasInscritas={plataformasInscritas}
/>
</>
)}
{student && <Table headers={headers} data={tableData} />}
</div>
</section>
);
}
//IO
//IO
+17 -3
View File
@@ -2,9 +2,11 @@ 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 ShowError from "@/app/Components/Global/ShowError";
import Toggle from "@/app/Components/Global/Toggle/Toggle";
import QuitarSancion from "@/app/Components/QuitarSancion/QuitarSancion";
import { GetStudent } from "@/app/lib/getStudent";
import { GetSancionByStudent } from "@/app/lib/getStudent copy";
@@ -42,7 +44,7 @@ export default async function Page(props: {
options={[
{
key: "Equipo",
label: "Bitacora equipo",
label: "Bitácora equipo",
content: (
<>
<BitacoraEquipo />
@@ -51,7 +53,7 @@ export default async function Page(props: {
},
{
key: "Alumno",
label: "Bitacora alumno",
label: "Bitácora alumno",
content: (
<>
<SearchUserWithDate value={numAcount} />
@@ -61,7 +63,7 @@ export default async function Page(props: {
},
{
key: "Mesas",
label: "Bitacora mesas",
label: "Bitácora mesas",
content: (
<>
<BitacoraMesas />
@@ -77,6 +79,18 @@ export default async function Page(props: {
</>
),
},
{
key: "EliminarSanciones",
label: "Eliminar Sanciones",
content: (
<>
<div className="containerSection">
<SearchUser value={numAcount} />
{/* <QuitarSancion data={student} /> */}
</div>
</>
),
},
]}
/>
</section>
+4
View File
@@ -64,6 +64,7 @@ export default async function Page(props: {
key={1}
costs={[{ value: 1 }, { value: 2 }]}
numAcount={student.id_cuenta}
id_servicio={1}
/>
),
},
@@ -84,6 +85,7 @@ export default async function Page(props: {
{ value: 14 },
]}
numAcount={student.id_cuenta}
id_servicio={2}
/>
),
},
@@ -113,6 +115,7 @@ export default async function Page(props: {
{ value: 200 },
]}
numAcount={student.id_cuenta}
id_servicio={3}
/>
),
},
@@ -124,6 +127,7 @@ export default async function Page(props: {
key={4}
costs={[{ value: 1 }, { value: 2 }, { value: 5 }]}
numAcount={student.id_cuenta}
id_servicio={6}
/>
),
},
+1 -4
View File
@@ -27,10 +27,7 @@ export default async function Page(props: {
{errorMessage && <ShowError key={Date.now()} message={errorMessage} />}
<h2 className="title"> Quitar Sanciones </h2>
<div className="containerSection">
<SearchUser value={numAcount} />
<QuitarSancion data={student} />
</div>
</>
);
}
+7 -2
View File
@@ -13,9 +13,10 @@ interface CostOption {
interface ImpressionsProps {
costs: CostOption[];
numAcount: number | null;
id_servicio: number;
}
function Impressions({ costs, numAcount }: ImpressionsProps) {
function Impressions({ costs, numAcount, id_servicio }: ImpressionsProps) {
const [pages, setPages] = useState("");
const [cost, setCost] = useState("");
@@ -47,6 +48,7 @@ function Impressions({ costs, numAcount }: ImpressionsProps) {
id_cuenta: numAcount,
numero_hojas: parseInt(pages),
monto: parseInt(cost) * parseInt(pages),
id_servicio,
});
if (result.error) {
@@ -101,7 +103,10 @@ function Impressions({ costs, numAcount }: ImpressionsProps) {
/>
</div>
<div className="groupInput" style={{height:"35px", flexWrap:"nowrap"}}>
<div
className="groupInput"
style={{ height: "35px", flexWrap: "nowrap" }}
>
<label className="label">Total:</label>
<label
style={{ width: "100%", minWidth: "200px", maxWidth: "500px" }}
+25
View File
@@ -66,6 +66,13 @@ export default function Inscripcion({
return;
}
if (!plataformaSeleccionada) {
toast.error("Selecciona una plataforma");
return;
}
const id_plataforma = PLATAFORMA_MAP[plataformaSeleccionada];
try {
await PostReceipt({
id_cuenta: numAcount,
@@ -74,6 +81,24 @@ export default function Inscripcion({
fecha_recibo: date,
});
const res = await fetch(`${envConfig.apiUrl}/alumno-inscrito`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
id_cuenta: numAcount,
id_plataforma,
realizo_pago: false,
}),
});
const data = await res.json();
if (!res.ok) {
throw new Error(data.message || "Error al inscribir");
}
toast.success("Alumno con pago");
setFolio("");
setAmount("");
setDate("");
@@ -1,9 +1,9 @@
"use client";
import { useState } from "react";
import "./BarNavigation.css";
import Link from "next/link";
import "./BarNavigation.css";
function BarNavigation() {
export default function BarNavigation() {
const [openMenu, setOpenMenu] = useState(false);
const [openSubMenu, setOpenSubMenu] = useState<number | null>(null);
@@ -169,28 +169,18 @@ function BarNavigation() {
>
<li>Inscritos</li>
</Link>
<Link
href="/BitacoraSanciones"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Bitacora y sanciones</li>
</Link>
</ul>
</li>
<li className="subMenu" onClick={toggleMenu}>
<Link
href="/QuitarSancion"
href="/BitacoraSanciones"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<span>Quitar sanción</span>
<span>Bitácora y sanciones</span>
</Link>
</li>
<li className="subMenu" onClick={toggleMenu}>
@@ -209,6 +199,4 @@ function BarNavigation() {
</nav>
);
}
export default BarNavigation;
//IO
@@ -0,0 +1,119 @@
"use client";
import { useState } from "react";
import Link from "next/link";
import "./BarNavigation.css";
export default function BarNavigationServicio() {
const [openMenu, setOpenMenu] = useState(false);
const [openSubMenu, setOpenSubMenu] = useState<number | null>(null);
const toggleMenu = () => setOpenMenu(!openMenu);
const toggleSubMenu = (index: number) => {
if (typeof window !== "undefined" && window.innerWidth <= 1000) {
setOpenSubMenu(openSubMenu === index ? null : index);
}
};
const closeAllMenus = () => {
setOpenMenu(false);
setOpenSubMenu(null);
};
return (
<nav className="barNavigation">
<div className={`menuToggle ${openMenu ? "" : ""}`} onClick={toggleMenu}>
<div></div>
<div></div>
<div></div>
</div>
<ul className={openMenu ? "active" : ""}>
<li className={`subMenu ${openSubMenu === 0 ? "open" : ""}`}>
<span onClick={() => toggleSubMenu(0)}>Inscripciónes</span>
<ul onClick={toggleMenu}>
<Link
href="/Inscripcion"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Inscripción Usuario</li>
</Link>
<Link
href="/AgregarTiempo"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Agregar Tiempo</li>
</Link>
</ul>
</li>
<li className={`subMenu ${openSubMenu === 1 ? "open" : ""}`}>
<span onClick={() => toggleSubMenu(1)}>Servicios</span>
<ul onClick={toggleMenu}>
<Link
href="/Impresiones"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Impresiones y Ploteo</li>
</Link>
<Link
href="/AsignacionMesas"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Asignación de Mesas</li>
</Link>
<Link
href="/AsignacionEquipo"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Asignación de Equipos</li>
</Link>
<Link
href="/Monitor"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<li>Monitor</li>
</Link>
</ul>
</li>
<li className="subMenu" onClick={toggleMenu}>
<Link
href="/Mensajes"
className="links"
onClick={(e) => {
e.stopPropagation();
closeAllMenus();
}}
>
<span>Mensajes</span>
</Link>
</li>
</ul>
</nav>
);
}
//IO
+4 -2
View File
@@ -3,6 +3,7 @@ import Link from "next/link";
import BarNavigation from "../BarNavigation/BarNavigation";
import header from "./Header.module.css";
import { cookies } from "next/headers";
import BarNavigationServicio from "../BarNavigation/BarNavigationServicio";
export default async function Header() {
const cookieStore = await cookies();
@@ -28,10 +29,11 @@ export default async function Header() {
</Link>
<div className={header.yellowPart}></div>
<div className={header.containerBarNav}>
{role === "ADMINISTRADOR" && <BarNavigation />}
{role === "ADMINIS.TRADOR" && <BarNavigation />}
{role === "SUPER ADMINISTRADOR (quita sanciones)" && <BarNavigation />}
{role === "SERVICIO SOCIAL" && <BarNavigation/>}
{role === "ADMINISTRADOR" && <BarNavigation/>}
{role === "ATENCION A USUARIO" && <BarNavigation/>}
{role === "SERVICIO SOCIAL" && <BarNavigationServicio/>}
</div>
</header>
);
+1 -1
View File
@@ -15,7 +15,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{