added data and restrictions

This commit is contained in:
2025-11-03 16:33:07 -06:00
parent fed77433b0
commit afe6410bfb
6 changed files with 355 additions and 28 deletions
+30
View File
@@ -116,6 +116,36 @@ textarea {
}
}
.formGroup {
position: relative;
}
.suggestions {
position: absolute; // mantiene fuera del flujo
top: 100%; // justo debajo del input
left: 0;
width: 100%;
background: #fff;
border: 1px solid #ccc;
border-radius: 6px;
list-style: none;
margin: 4px 0 0 0;
padding: 0;
max-height: 200px;
overflow-y: auto;
z-index: 10;
font-size: 12px;
}
.suggestions li {
padding: 8px;
cursor: pointer;
&:hover {
background: #f2f2f2;
}
}
@media (max-width: 1075px) {
.equipoForm {
flex-wrap: wrap;
+57 -15
View File
@@ -7,11 +7,17 @@ import Cookies from "js-cookie";
import toast from "react-hot-toast";
import "../app/styles/layout/agregarEquipo.scss";
import { AREAS } from "@/data/areas";
import { SO_POR_EQUIPO } from "@/data/so_por_equipo";
import { PROCESADORES_POR_EQUIPO } from "@/data/procesadores";
import { useRouter } from "next/navigation";
export default function Page() {
const searchParams = useSearchParams();
const inventario = searchParams.get("equipoId");
const router = useRouter();
const [formData, setFormData] = useState({
serie: "",
marca: "",
@@ -57,7 +63,7 @@ export default function Page() {
interface Marca {
id_marca: number;
tipo_marca: string;
marca: string;
}
interface Adscripcion {
@@ -80,7 +86,7 @@ export default function Page() {
adscripcion: [] as string[],
});
const mostrarCamposComputadora = formData.tipoEquipo !== "Impresora";
const mostrarCamposComputadora = formData.tipoEquipo !== "PERIFÉRICO";
const api_url = process.env.NEXT_PUBLIC_API_URL;
useEffect(() => {
@@ -151,6 +157,30 @@ export default function Page() {
const handleInputChange = (field: string, value: string) => {
setFormData((prev) => ({ ...prev, [field]: value }));
if (field === "adscripcion") {
if (value.length < 3) {
// Si no hay al menos 3 letras, no mostrar sugerencias
setSuggestions((prev) => ({ ...prev, adscripcion: [] }));
return;
}
// Función para normalizar: minúsculas y quitar acentos
const normalize = (str: string) =>
str
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.trim();
const searchValue = normalize(value);
const matches = AREAS.map((a) => a.label)
.filter((label) => normalize(label).includes(searchValue))
.slice(0, 5); // máximo 10 sugerencias
setSuggestions((prev) => ({ ...prev, adscripcion: matches }));
}
};
const handleSelectSuggestion = (field: string, value: string) => {
@@ -159,6 +189,12 @@ export default function Page() {
};
const handleGuardar = async () => {
const adscripcionesValidas = AREAS.map((a) => a.label);
if (!adscripcionesValidas.includes(formData.adscripcion)) {
toast.error("Debes seleccionar una adscripción válida.");
return;
}
try {
const token = Cookies.get("token");
const headers = { Authorization: `Bearer ${token}` };
@@ -184,7 +220,7 @@ export default function Page() {
};
const handleCancelar = () => {
toast.error("Acción cancelada");
router.push("/Escaner");
};
return (
@@ -224,8 +260,8 @@ export default function Page() {
>
<option value="">Selecciona una marca</option>
{marcas.map((m) => (
<option key={m.id_marca} value={m.tipo_marca}>
{m.tipo_marca}
<option key={m.id_marca} value={m.marca}>
{m.marca}
</option>
))}
</select>
@@ -304,9 +340,9 @@ export default function Page() {
}
>
<option value="">Selecciona procesador</option>
{procesadores.map((p) => (
<option key={p.id_procesador} value={p.procesador}>
{p.procesador}
{PROCESADORES_POR_EQUIPO[formData.tipoEquipo]?.map((p) => (
<option key={p} value={p}>
{p}
</option>
))}
</select>
@@ -321,12 +357,9 @@ export default function Page() {
}
>
<option value="">Selecciona sistema operativo</option>
{sistemasOperativos.map((so) => (
<option
key={so.id_sistema_operativo}
value={so.sistema_operativo}
>
{so.sistema_operativo}
{SO_POR_EQUIPO[formData.tipoEquipo]?.map((so) => (
<option key={so} value={so}>
{so}
</option>
))}
</select>
@@ -334,7 +367,16 @@ export default function Page() {
</>
)}
<div className="formGroup">
{!mostrarCamposComputadora && (
<div className="formGroup">
<label>Tipos de Perifericos</label>
<select>
<option value="">Selecciona periferico</option>
</select>
</div>
)}
<div className="formGroup" style={{ position: "relative" }}>
<label>Adscripción</label>
<input
required
+21 -13
View File
@@ -8,6 +8,8 @@ import toast from "react-hot-toast";
import "../app/styles/layout/agregarEquipo.scss";
import "./editar.css";
import { SO_POR_EQUIPO } from "@/data/so_por_equipo";
import { PROCESADORES_POR_EQUIPO } from "@/data/procesadores";
export default function Editar() {
const searchParams = useSearchParams();
@@ -56,7 +58,7 @@ export default function Editar() {
interface Marca {
id_marca: number;
tipo_marca: string;
marca: string;
}
interface Adscripcion {
@@ -75,7 +77,7 @@ export default function Editar() {
const [procesadores, setProcesadores] = useState<Procesador[]>([]);
const api_url = process.env.NEXT_PUBLIC_API_URL;
const mostrarCamposComputadora = formData.tipoEquipo !== "Impresora";
const mostrarCamposComputadora = formData.tipoEquipo !== "PERIFÉRICO";
// 🔹 Cargar catálogos
useEffect(() => {
@@ -214,8 +216,8 @@ export default function Editar() {
>
<option value="">Selecciona marca</option>
{marcas.map((m) => (
<option key={m.id_marca} value={m.tipo_marca}>
{m.tipo_marca}
<option key={m.id_marca} value={m.marca}>
{m.marca}
</option>
))}
</select>
@@ -298,9 +300,9 @@ export default function Editar() {
}
>
<option value="">Selecciona procesador</option>
{procesadores.map((p) => (
<option key={p.id_procesador} value={p.procesador}>
{p.procesador}
{PROCESADORES_POR_EQUIPO[formData.tipoEquipo]?.map((p) => (
<option key={p} value={p}>
{p}
</option>
))}
</select>
@@ -318,12 +320,9 @@ export default function Editar() {
}
>
<option value="">Selecciona sistema operativo</option>
{sistemasOperativos.map((so) => (
<option
key={so.id_sistema_operativo}
value={so.sistema_operativo}
>
{so.sistema_operativo}
{SO_POR_EQUIPO[formData.tipoEquipo]?.map((so) => (
<option key={so} value={so}>
{so}
</option>
))}
</select>
@@ -331,6 +330,15 @@ export default function Editar() {
</>
)}
{!mostrarCamposComputadora && (
<div className="formGroup">
<label>Tipos de Perifericos</label>
<select>
<option value="">Selecciona periferico</option>
</select>
</div>
)}
<div className="formGroup">
<label>Adscripción</label>
<select
+114
View File
@@ -0,0 +1,114 @@
//Esto es culpa de los webservices
export const AREAS: Array<{ id: number; label: string }> = [
{ id: 128, label: "Coordinación de Actividades Deportivas y Recreativas" },
{ id: 122, label: "Coordinación de Comunicación Social" },
{ id: 9, label: "Coordinación de Cuerpos Colegiados" },
{
id: 126,
label:
"Coordinación de Derecho del Sistema de Universidad Abierta y Educación a Distancia",
},
{ id: 206, label: "Coordinación de Especializaciones" },
{ id: 120, label: "Coordinación de Estudios de Posgrado" },
{
id: 182,
label:
"Coordinación de la Unidad de Investigación Multidisciplinaria Aplicada",
},
{
id: 174,
label:
"Coordinación de LICEL Sistema de Universidad Abierta y Educación a Distancia",
},
{ id: 221, label: "Coordinación de Maestrías y Doctorados" },
{
id: 152,
label:
"Coordinación de Relaciones Internacionales del Sistema de Universidad Abierta y Educación a Distancia",
},
{ id: 121, label: "Coordinación de Servicios Académicos" },
{ id: 125, label: "Coordinación del Centro de Difusión Cultural" },
{ id: 124, label: "Coordinación del Centro de Educación Continua" },
{ id: 129, label: "Coordinación del Centro de Enseñanza de Idiomas" },
{
id: 214,
label: "Coordinación del Centro de Estudios Municipales y Metropolitanos",
},
{
id: 176,
label: "Coordinación del Centro Tecnológico para la Educación a Distancia",
},
{ id: 58, label: "Coordinación del Programa de Actuaría" },
{ id: 57, label: "Coordinación del Programa de Arquitectura" },
{ id: 46, label: "Coordinación del Programa de Comunicación" },
{ id: 56, label: "Coordinación del Programa de Derecho" },
{ id: 55, label: "Coordinación del Programa de Diseño Gráfico" },
{ id: 54, label: "Coordinación del Programa de Economía" },
{ id: 49, label: "Coordinación del Programa de Enseñanza de Inglés" },
{ id: 51, label: "Coordinación del Programa de Ingeniería Civil" },
{
id: 48,
label: "Coordinación del Programa de Matemáticas Aplicadas y Computación",
},
{ id: 47, label: "Coordinación del Programa de Pedagogía" },
{ id: 44, label: "Coordinación del Programa de Sociología" },
{ id: 43, label: "Coordinación del Programa Político" },
{ id: 194, label: "Departamento de Intendencia" },
{
id: 193,
label:
"Departamento de Investigación en Comunicación y Estudios Culturales",
},
{
id: 222,
label:
"Departamento de Orientación Académica del Sistema de Universidad Abierta y Educación a Distancia",
},
{ id: 204, label: "Departamento de Proyectos Administrativos" },
{ id: 86, label: "Departamento de Talleres y Laboratorios" },
{ id: 72, label: "Dirección" },
{ id: 80, label: "División de Ciencias Jurídicas" },
{ id: 79, label: "División de Ciencias Socioeconómicas" },
{ id: 78, label: "División de Diseño y Edificación" },
{ id: 77, label: "División de Humanidades" },
{ id: 76, label: "División de Matemáticas e Ingeniería" },
{
id: 74,
label:
"División del Sistema de Universidad Abierta y Educación a Distancia",
},
{ id: 70, label: "Especialización en Costos en la Construcción" },
{ id: 69, label: "Especialización en Finanzas Públicas" },
{ id: 68, label: "Especialización en Geotecnia" },
{ id: 71, label: "Especialización en Sistemas de Calidad" },
{
id: 220,
label:
"Especialización en Tecnología Digital para la Enseñanza de Matemáticas",
},
{ id: 207, label: "Grupo de Trabajo de Educación para Adultos (GTEA)" },
{ id: 173, label: "Maestría en Docencia para la Educación Media Superior" },
{ id: 224, label: "Posgrado en Ciencias Políticas y Sociales" },
{ id: 62, label: "Posgrado en Derecho" },
{ id: 164, label: "Posgrado en Economía" },
{ id: 197, label: "Posgrado en Pedagogía" },
{ id: 63, label: "Posgrado en Urbanismo" },
{ id: 226, label: "Programa Único de Especializaciones en Derecho" },
{ id: 127, label: "Secretaría Administrativa" },
{ id: 181, label: "Secretaría de Asuntos Académicos Estudiantiles" },
{
id: 177,
label: "Secretaría de Extensión Universitaria y Vinculación Institucional",
},
{ id: 119, label: "Secretaría de Posgrado e Investigación" },
{ id: 8, label: "Secretaría General" },
{ id: 6, label: "Unidad de Administración Escolar" },
{ id: 5, label: "Unidad de Administración y Recursos" },
{ id: 4, label: "Unidad de Planeación" },
{ id: 3, label: "Unidad de Servicios a la Comunidad" },
{ id: 2, label: "Unidad de Servicios Editoriales" },
{ id: 1, label: "Unidad de Talleres, Laboratorios y Audiovisuales" },
{ id: 130, label: "Unidad del Centro de Desarrollo Tecnológico" },
{ id: 123, label: "Unidad del Centro de Información y Documentación" },
];
+97
View File
@@ -0,0 +1,97 @@
export const PROCESADORES_POR_EQUIPO: Record<string, string[]> = {
"ESCRITORIO PC": [
"i7 o equivalentes (13a generación en adelante)",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (5a - 8a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (13a generación en adelante)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (13a generación en adelante)",
"i3 o equivalentes (9a - 12a generación)",
"i3 o equivalentes (5a - 8a generación)",
"i3 o equivalentes (1a - 4a generación)",
"Pentium Silver O Gold",
"Pentium Dual Core o anteriores",
"Celeron (adquirido en 2018 hasta la fecha)",
"Celeron Dual Core o anteriores",
"Core2 Duo, Quad Core, Pentium Dual Core o anteriores",
"Pentium Series J, G",
"Celeron Serie J, G",
],
"ESCRITORIO LINUX": [
"i7 o equivalentes (13a generación en adelante)",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (5a - 8a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (13a generación en adelante)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (13a generación en adelante)",
"i3 o equivalentes (9a - 12a generación)",
"i3 o equivalentes (5a - 8a generación)",
"i3 o equivalentes (1a - 4a generación)",
"Pentium Silver O Gold",
"Pentium Dual Core o anteriores",
],
"PORTÁTILES WINDOWS": [
"i7 o equivalentes (13a generación en adelante)",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (5a - 8a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (13a generación en adelante)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (13a generación en adelante)",
"i3 o equivalentes (9a - 12a generación)",
"i3 o equivalentes (5a - 8a generación)",
"i3 o equivalentes (1a - 4a generación)",
"Pentium Silver O Gold",
"Pentium Dual Core o anteriores",
],
"PORTÁTILES CHROMEBOOK": [
"i7 o equivalentes (13a generación en adelante)",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (5a - 8a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (13a generación en adelante)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (13a generación en adelante)",
"i3 o equivalentes (9a - 12a generación)",
"i3 o equivalentes (5a - 8a generación)",
"i3 o equivalentes (1a - 4a generación)",
],
"ESCRITORIO MAC OS": [
"Familia M2",
"Familia M1",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (1a - 4a generación)",
"Core2 Mac, Quad Core o anteriores",
],
"PORTÁTILES MAC OS": [
"Familia M2",
"Familia M1",
"i7 o equivalentes (9a - 12a generación)",
"i7 o equivalentes (1a - 4a generación)",
"i5 o equivalentes (9a - 12a generación)",
"i5 o equivalentes (5a - 8a generación)",
"i5 o equivalentes (1a - 4a generación)",
"i3 o equivalentes (1a - 4a generación)",
"Core2 Mac, Quad Core o anteriores",
],
SERVIDOR: [
"Xeon Bronce, Plata, Oro 1a generación",
"Xeon E3, E5, E7",
"Xeon Phi",
"Xeon o anteriores",
],
};
+36
View File
@@ -0,0 +1,36 @@
export const SO_POR_EQUIPO: Record<string, string[]> = {
"ESCRITORIO PC": [
"Windows 11",
"Windows 10",
"Windows 7/8",
"Windows XP/Vista",
"Linux",
],
"ESCRITORIO APPLE": [
"Mac OS (13 - Ventura, 14 - Sonoma)",
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterrey)",
"Mac OS X (Yosemite, El Capitan, Sierra, High Sierra)",
"Mac OS X (Snow Leopard, Lion, Mountain Lion, Mavericks)",
],
"TABLETA ANDROID": [
"Windows 11",
"Windows 10",
"Windows 7/8",
"Windows XP/Vista",
"Chrome OS",
],
"TABLETA iPAD OS": [
"Mac OS (13 - Ventura, 14 - Sonoma)",
"Mac OS X (Mojave, Catalina, 11 - Big Sur, 12 - Monterrey)",
"Mac OS X (Yosemite, El Capitan, Sierra, High Sierra)",
"Mac OS X (Snow Leopard, Lion, Mountain Lion, Mavericks)",
],
SERVIDOR: [
"Linux (CentOS, Fedora, Ubuntu, Red Hat Enterprise, entre otros)",
"Unix (AIX, MAC OS Server, Solaris, entre otros)",
"Windows Server 2022/2023",
"Windows Server 2016/2019",
"Windows Server 2008/2012",
"Windows Server 2000/2003",
],
};