Convertir esquema de back a esquema de front/pc

master
Araozu 2022-10-14 18:27:46 -05:00
parent c7c705460a
commit 5c2ae95031
3 changed files with 64 additions and 58 deletions

View File

@ -1,6 +1,6 @@
import { TopBar } from "./SistemasMovil/TopBar";
import { GrupoDia, Table, TableInput } from "./SistemasMovil/Table";
import { getHorariosMock, ListaCursosCompleto } from "../API/CargaHorarios";
import { getHorariosMock, Horario, ListaCursosCompleto } from "../API/CargaHorarios";
import { createSignal } from "solid-js";
import { generarMapaCeldas } from "./SistemasMovil/mapaCeldas";
import { Button } from "../components/Button";
@ -104,6 +104,9 @@ function transformar(input: ListaCursosCompleto): TableInput {
};
}
const horasStr = ["0700","0750","0850","0940","1040","1130","1220","1310","1400",
"1450","1550","1640","1740","1830","1920","2010","2100","2150"];
const horas = [
700,
750,
@ -147,4 +150,18 @@ function infoDiaAOffsets(horaInicio: string, horaFinal: string): [number, number
return [idxInicio, nroHoras];
}
// inicio: 1740 fin 2010 -> 1740,1830,1920
export function infoDiaAListaHoras(horas: Array<Horario>): Array<string> {
const horasFin: Array<string> = [];
for (const grupoHoras of horas) {
const [idx, cantidad] = infoDiaAOffsets(grupoHoras.hora_inicio, grupoHoras.hora_fin);
const strDia = grupoHoras.dia.substring(0, 2);
for (let i = 0; i < cantidad; i += 1) {
horasFin.push(`${strDia}${horasStr[idx + i]}`);
}
}
return horasFin;
}

View File

@ -2,15 +2,56 @@ import { BarraSuperior } from "../../BarraSuperior";
import { ContenedorHorarios } from "./Sistemas/ContenedorHorarios";
import { Creditos } from "../../Creditos";
import { Separador } from "../../Separador";
import { createSignal } from "solid-js";
import { getHorariosMock, ListaCursosCompleto } from "../../API/CargaHorarios";
import { Cursos, DatosGrupo } from "../../types/DatosHorario";
import { infoDiaAListaHoras } from "../SistemasMovil";
export function Sistemas() {
const [data, setData] = createSignal<Cursos>({});
// Obtener cursos seleccionados del servidor
(async() => {
const cursos: Array<string> = JSON.parse(localStorage.getItem("cursos-seleccionados") ?? "[]");
const data = await getHorariosMock({
cursos: cursos.map((x) => parseInt(x, 10)),
});
setData(listaCursosADatos(data));
})();
return (
<div>
<BarraSuperior />
<Separador />
<Separador />
<ContenedorHorarios />
<ContenedorHorarios datos={data()} />
<Creditos />
</div>
);
}
function listaCursosADatos(cursosEntrada: ListaCursosCompleto): Cursos {
const result: Cursos = {};
for (const curso of cursosEntrada) {
const gruposLab: {[grupo: string]: DatosGrupo} = {};
for (const lab of curso.laboratorios) {
gruposLab[lab.grupo] = {
Docente: lab.docente,
Horas: infoDiaAListaHoras(lab.horario),
seleccionado: false,
};
}
result[curso.nombre_curso] = {
nombre: curso.nombre_curso,
abreviado: curso.abreviado,
oculto: false,
Teoria: {},
Laboratorio: gruposLab,
};
}
return result;
}

View File

@ -6,61 +6,11 @@ import {
Anios,
Cursos,
DatosHorario,
DatosHorarioRaw,
DatosGrupo,
} from "../../../types/DatosHorario";
import { estilosGlobales } from "../../../Estilos";
import { batch, createEffect, createMemo, createSignal, Show } from "solid-js";
import { useListaCursos } from "./ContenedorHorarios/useListaCursos";
const datosPromise = (async() => {
const file = await fetch("/horarios/2022_2_fps_ingenieriadesistemas.yaml");
const text = await file.text();
const datosRaw = YAML.parse(text) as DatosHorarioRaw;
console.log(datosRaw);
// Agregar los campos faltantes a DatosHorarioRaw para que sea DatosHorario
const datos: DatosHorario = {
...datosRaw,
años: {},
};
const anios: Anios = {};
for (const [nombreAnio, anio] of Object.entries(datosRaw.años)) {
const anioData: Cursos = {};
for (const [nombreCurso, curso] of Object.entries(anio)) {
const gruposTeoria: { [k: string]: DatosGrupo } = {};
for (const [key, data] of Object.entries(curso.Teoria)) {
gruposTeoria[key] = Object.assign({seleccionado: false}, data);
}
const gruposLab: { [k: string]: DatosGrupo } = {};
for (const [key, data] of Object.entries(curso.Laboratorio ?? {})) {
gruposLab[key] = Object.assign({seleccionado: false}, data);
}
anioData[nombreCurso] = {
...curso,
oculto: false,
Teoria: gruposTeoria,
Laboratorio: gruposLab,
};
}
anios[nombreAnio] = anioData;
}
datos.años = anios;
return datos;
})();
const ElemCargando = () => (
<div className={css(estilosGlobales.contenedor, estilosGlobales.inlineBlock)}>
Recuperando horarios...
</div>
);
export type EstadoLayout = "MaxPersonal" | "Normal" | "MaxHorarios";
const {
@ -69,21 +19,19 @@ const {
agregarCursoALista: agregarCursoUsuario,
} = useListaCursos();
export function ContenedorHorarios() {
const [datosCargados, setDatosCargados] = createSignal(false);
const [datos, setDatos] = createSignal<DatosHorario | null>(null);
export function ContenedorHorarios(props: {datos: Cursos}) {
const [datos, setDatos] = createSignal<Cursos>({});
createEffect(async() => {
const datos = await datosPromise;
const datos = props.datos;
batch(() => {
setDatos(datos);
setDatosCargados(true);
});
});
return (
<MiHorario
cursosUsuario={cursosUsuario}
cursos={datos()}
fnAgregarCurso={agregarCursoUsuario}
setCursosUsuarios={setCursosUsuarios}
/>