added new boton to refresh monitor and modified search machine and merge Carlos

This commit is contained in:
2026-03-17 09:37:14 -05:00
parent 68d61446c3
commit c60ddf0797
9 changed files with 158 additions and 59 deletions
+29 -8
View File
@@ -27,6 +27,8 @@ export default function PlaticaGate({ inscripcion, numAcount }: Props) {
const [bitacora, setBitacora] = useState<[] | null>([]);
const [error, setError] = useState<string>("Equipo");
const [search, setSearch] = useState("");
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
@@ -148,6 +150,16 @@ export default function PlaticaGate({ inscripcion, numAcount }: Props) {
}
};
const equiposFiltrados = equipos.filter((eq) => {
const texto = search.toLowerCase();
return (
eq.ubicacion?.toString().toLowerCase().includes(texto) ||
eq.plataforma?.nombre?.toLowerCase().includes(texto) ||
eq.nombre_equipo?.toLowerCase().includes(texto)
);
});
if (bitacora) {
return error === "Mesa"
? <p style={{ margin: "1rem", color: "red" }}>Ya cuentas con una mesa asignada</p>
@@ -181,12 +193,20 @@ export default function PlaticaGate({ inscripcion, numAcount }: Props) {
>
<div
className={`selectHeader ${equipoSeleccionado && equipoSeleccionado.plataforma?.nombre?.toUpperCase()}`}
onClick={() => !loadingEquipos && setOpen(!open)}
>
{equipoSeleccionado ? (
onClick={() => !loadingEquipos && setOpen(!open)} >
{open ? (
<input
autoFocus
type="text"
placeholder="Buscar equipo..."
value={search}
onChange={(e) => setSearch(e.target.value)}
onClick={(e) => e.stopPropagation()}
className="inputSelect"
/>
) : equipoSeleccionado ? (
<span>
{equipoSeleccionado.ubicacion}{" "}
{equipoSeleccionado.nombre_equipo}
{equipoSeleccionado.ubicacion} {equipoSeleccionado.nombre_equipo}
</span>
) : (
<span className="placeholder">
@@ -201,19 +221,20 @@ export default function PlaticaGate({ inscripcion, numAcount }: Props) {
{open && (
<div className="options">
{equipos.length === 0 && (
{equiposFiltrados.length === 0 && (
<div className="option disabled">
No hay equipos disponibles
No hay resultados
</div>
)}
{equipos.map((eq) => (
{equiposFiltrados.map((eq) => (
<div
key={eq.id_equipo}
className={`option ${eq.plataforma?.nombre?.toUpperCase()}`}
onClick={() => {
setEquipoSeleccionado(eq);
setOpen(false);
setSearch("");
}}
>
{eq.ubicacion} {eq.nombre_equipo}
+14 -1
View File
@@ -64,7 +64,8 @@
.selectHeader {
border-radius: 6px;
padding: 8px 12px;
padding: 0px 6px;
height: 35px;
display: flex;
justify-content: space-between;
align-items: center;
@@ -91,4 +92,16 @@
z-index: 10;
max-height: 250px;
overflow-y: auto;
}
.inputSelect{
border: none;
padding: 0 5px;
margin: 0;
}
.inputSelect:focus{
background-color: #fff;
outline: none;
box-shadow:none;
}
+34 -26
View File
@@ -13,11 +13,13 @@ type Mesa = {
export default function TableMesas() {
const [mesas, setMesas] = useState<Mesa[]>([]);
const [loading, setLoading] = useState(true);
const [refresh, setRefresh] = useState<boolean>(false)
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
const fetchMesas = async () => {
setLoading(true);
try {
const res = await axios.get(
`${process.env.NEXT_PUBLIC_API_URL}/mesa/usoWhitout`,
@@ -34,37 +36,43 @@ export default function TableMesas() {
useEffect(() => {
fetchMesas();
}, []);
setRefresh(false)
}, [refresh]);
if (loading) {
return <div className={styles.tableContainer}>
<table className={styles.machineTable}>
<thead>
<tr>
<th>Cargando mesas...</th>
</tr>
</thead>
</table>
</div>
return (
<div className={styles.tableContainer}>
<table className={styles.machineTable}>
<thead>
<tr>
<th>Cargando mesas...</th>
</tr>
</thead>
</table>
</div>
)
}
return (
<div className={styles.tableContainer}>
<table className={styles.machineTable}>
<thead>
<tr>
<th>ID Mesa</th>
</tr>
</thead>
<tbody>
{mesas.map((mesa) => (
<tr key={mesa.id_mesa} className={!mesa.ocupado ? '' : styles.ocupado}>
<td>{mesa.id_mesa}</td>
<>
<button className="button buttonCancel" onClick={() => { setRefresh(true) }}>Actualizar informacion</button>
<div className={styles.tableContainer}>
<table className={styles.machineTable}>
<thead>
<tr>
<th>ID Mesa</th>
</tr>
))}
</tbody>
</table>
</div>
</thead>
<tbody>
{mesas.map((mesa) => (
<tr key={mesa.id_mesa} className={!mesa.ocupado ? '' : styles.ocupado}>
<td>{mesa.id_mesa}</td>
</tr>
))}
</tbody>
</table>
</div>
</>
);
}
+17
View File
@@ -0,0 +1,17 @@
"use client"
import { useRouter } from "next/navigation"
import styles from "./Page.module.css"
export default function RefreshButton() {
const router = useRouter()
return (
<button
className={styles.resetButton}
onClick={() => router.refresh()}
>
Actualizar información
</button>
)
}
+4 -1
View File
@@ -4,6 +4,7 @@ import DSC from "./DSC";
import ToggleTable from "@/app/Components/Global/Toggle/ToggleTable";
import TableTable from "./TableTable";
import { Metadata } from "next";
import RefreshButton from "./RefreshButton";
export const metadata: Metadata = {
title: "Monitor",
@@ -21,9 +22,11 @@ export default async function Page(props: {
<h2 className="title">MONITOR</h2>
<div className={styles.actions}>
<button className={styles.resetButton}>Actualizar información</button>
<RefreshButton />
</div>
<ToggleTable
key={Date.now()}
defaultView={key}
options={[
{
+1 -1
View File
@@ -193,7 +193,7 @@ export default function UserPage() {
</button>
</div>
<div style={{ overflow: "auto", maxHeight: "400px" }}>
<div style={{ overflow: "auto", maxHeight: "350px" }}>
<table>
<thead>
<tr>
@@ -21,6 +21,8 @@ export default function BitacoraEquipo({ date }: { date: string | null }) {
const [equipoSeleccionado, setEquipoSeleccionado] = useState<any>(null);
const [equipos, setEquipos] = useState<any[]>([]);
const [search, setSearch] = useState("");
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
@@ -52,6 +54,15 @@ export default function BitacoraEquipo({ date }: { date: string | null }) {
});
}, [equipoSeleccionado, date]);
const equiposFiltrados = equipos.filter((eq) => {
const texto = search.toLowerCase();
return (
eq.ubicacion?.toString().toLowerCase().includes(texto) ||
eq.plataforma?.nombre?.toLowerCase().includes(texto) ||
eq.nombre_equipo?.toLowerCase().includes(texto)
);
});
return (
<>
@@ -64,13 +75,20 @@ export default function BitacoraEquipo({ date }: { date: string | null }) {
>
<div
className={`selectHeader ${equipoSeleccionado && equipoSeleccionado.plataforma?.nombre?.toUpperCase()}`}
onClick={() => !loadingEquipos && setOpen(!open)}
>
{equipoSeleccionado ? (
<span
>
{equipoSeleccionado.ubicacion}{" "}
{equipoSeleccionado.nombre_equipo}
onClick={() => !loadingEquipos && setOpen(!open)} >
{open ? (
<input
autoFocus
type="text"
placeholder="Buscar equipo..."
value={search}
onChange={(e) => setSearch(e.target.value)}
onClick={(e) => e.stopPropagation()}
className="inputSelect"
/>
) : equipoSeleccionado ? (
<span>
{equipoSeleccionado.ubicacion} {equipoSeleccionado.nombre_equipo}
</span>
) : (
<span className="placeholder">
@@ -85,19 +103,20 @@ export default function BitacoraEquipo({ date }: { date: string | null }) {
{open && (
<div className="options" style={{ bottom: "auto" }}>
{equipos.length === 0 && (
{equiposFiltrados.length === 0 && (
<div className="option disabled">
No hay equipos disponibles
No hay resultados
</div>
)}
{equipos.map((eq) => (
{equiposFiltrados.map((eq) => (
<div
key={eq.id_equipo}
className={`option ${eq.plataforma?.nombre?.toUpperCase()}`}
onClick={() => {
setEquipoSeleccionado(eq);
setOpen(false);
setSearch("");
}}
>
{eq.ubicacion} {eq.nombre_equipo}
@@ -35,6 +35,7 @@ export default function SelectorEquipo({ onSearch }: Props) {
const [loadingEquipos, setLoadingEquipos] = useState(false);
const [open, setOpen] = useState(false);
const [search, setSearch] = useState("");
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
@@ -61,6 +62,15 @@ export default function SelectorEquipo({ onSearch }: Props) {
}
}, [paramEquipo, equipos]);
const equiposFiltrados = equipos.filter((eq) => {
const texto = search.toLowerCase();
return (
eq.ubicacion?.toString().toLowerCase().includes(texto) ||
eq.plataforma?.nombre?.toLowerCase().includes(texto) ||
eq.nombre_equipo?.toLowerCase().includes(texto)
);
});
return (
<form className="form-container">
@@ -71,14 +81,20 @@ export default function SelectorEquipo({ onSearch }: Props) {
>
<div
className={`selectHeader ${selected && selected.plataforma?.nombre?.toUpperCase()}`}
onClick={() => !loadingEquipos && setOpen(!open)}
>
{selected ? (
<span
>
{selected.ubicacion}{" "}
{selected.nombre_equipo}{" "}
{selected.areaUbicacion.area}
onClick={() => !loadingEquipos && setOpen(!open)} >
{open ? (
<input
autoFocus
type="text"
placeholder="Buscar equipo..."
value={search}
onChange={(e) => setSearch(e.target.value)}
onClick={(e) => e.stopPropagation()}
className="inputSelect"
/>
) : selected ? (
<span>
{selected.ubicacion} {selected.nombre_equipo}
</span>
) : (
<span className="placeholder">
@@ -93,13 +109,13 @@ export default function SelectorEquipo({ onSearch }: Props) {
{open && (
<div className="options" style={{ bottom: "auto" }}>
{equipos.length === 0 && (
{equiposFiltrados.length === 0 && (
<div className="option disabled">
No hay equipos disponibles
</div>
)}
{equipos.map((eq) => (
{equiposFiltrados.map((eq) => (
<div
key={eq.id_equipo}
className={`option ${eq.plataforma?.nombre?.toUpperCase()}`}
@@ -115,6 +131,8 @@ export default function SelectorEquipo({ onSearch }: Props) {
}
router.push(`${pathname}?${params.toString()}`);
setSearch("");
}}
>
{eq.ubicacion} {eq.nombre_equipo} {eq.areaUbicacion.area}
+2 -2
View File
@@ -42,7 +42,7 @@ export async function proxy(request: NextRequest) {
"/Monitor",
"/ActivosMantenimiento",
"/Periodo",
"/Usuarios",
"/Usuarios",
];
if (role === 5 && !onlyImpresiones.includes(pathname)) {
@@ -68,7 +68,7 @@ export const config = {
matcher: [
"/",
"/Reportes",
"/Usuarios",
"/Usuarios",
"/Periodo",
"/Monitor",
"/QuitarSancion",