fixed addTime and added new BarNavigation
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
),
|
||||
},
|
||||
|
||||
@@ -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>
|
||||
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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" }}
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -15,7 +15,7 @@
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"jsx": "react-jsx",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user