diff --git a/src/ContenedorHorarios/ContenedorHorarios.tsx b/src/ContenedorHorarios/ContenedorHorarios.tsx index 9fe7162..8a897bf 100755 --- a/src/ContenedorHorarios/ContenedorHorarios.tsx +++ b/src/ContenedorHorarios/ContenedorHorarios.tsx @@ -1,15 +1,59 @@ import YAML from "yaml"; -import { StyleSheet, css } from "aphrodite"; +import { css, StyleSheet } from "aphrodite"; import { MiHorario } from "./MiHorario"; import { Horarios } from "./Horarios"; -import { Curso, CursoUsuario, DatosHorario, DatosVarianteUsuario, ListaCursosUsuario } from "../types/DatosHorario"; +import { + Anios, + Cursos, + CursoRaw, + Curso, + DatosHorario, + DatosHorarioRaw, + DatosGrupo, + ListaCursosUsuario +} from "../types/DatosHorario"; import { estilosGlobales } from "../Estilos"; -import { Show, createSignal, createEffect, createMemo, batch, createState } from "solid-js"; +import { batch, createEffect, createMemo, createSignal, createState, Show } from "solid-js"; const datosPromise = (async () => { const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml"); const text = await file.text(); - return YAML.parse(text) as DatosHorario; + const datosRaw = YAML.parse(text) as DatosHorarioRaw; + + // 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 = () => @@ -28,27 +72,9 @@ const agregarCursoUsuario = (curso: Curso) => { const cursoActualIndex = cursosUsuario.cursos.findIndex(x => x.nombre === curso.nombre); if (cursoActualIndex !== -1) { setCursosUsuarios("cursos", cursoActualIndex, "oculto", x => !x); - return; + } else { + setCursosUsuarios("cursos", a => [...a, curso]); } - - const gruposTeoria: { [k: string]: DatosVarianteUsuario } = {}; - for (const [key, data] of Object.entries(curso.Teoria)) { - gruposTeoria[key] = Object.assign({seleccionado: false}, data); - } - - const gruposLab: { [k: string]: DatosVarianteUsuario } = {}; - for (const [key, data] of Object.entries(curso.Laboratorio ?? {})) { - gruposLab[key] = Object.assign({seleccionado: false}, data); - } - - const cursoUsuario: CursoUsuario = { - ...curso, - oculto: false, - Teoria: gruposTeoria, - Laboratorio: gruposLab - }; - - setCursosUsuarios("cursos", a => [...a, cursoUsuario]); }; export function ContenedorHorarios() { diff --git a/src/ContenedorHorarios/Cursos.tsx b/src/ContenedorHorarios/CursosElem.tsx similarity index 90% rename from src/ContenedorHorarios/Cursos.tsx rename to src/ContenedorHorarios/CursosElem.tsx index 851fdd9..984580c 100755 --- a/src/ContenedorHorarios/Cursos.tsx +++ b/src/ContenedorHorarios/CursosElem.tsx @@ -1,4 +1,4 @@ -import { AnioData, Curso, DatosVariante, ListaCursosUsuario } from "../types/DatosHorario"; +import { Cursos, CursoRaw, DatosGrupo, ListaCursosUsuario, Curso } from "../types/DatosHorario"; import { createEffect, createMemo, For } from "solid-js"; import { StyleSheet, css } from "aphrodite"; import { estilosGlobales } from "../Estilos"; @@ -26,7 +26,7 @@ const e = StyleSheet.create({ }); interface Props { - dataAnio: AnioData, + dataAnio: Cursos, anioActual: () => string, fnAgregarCurso: (c: Curso) => void, listaCursosUsuario: ListaCursosUsuario, @@ -35,7 +35,7 @@ interface Props { } function IndicadorGrupo(props: { nombre: string, esLab: boolean, idParcial: string, setIdHover: (v: string) => string }) { - const id = `${props.idParcial}_${props.esLab? 'L' : 'T'}_${props.nombre}`; + const id = `${props.idParcial}_${props.esLab ? 'L' : 'T'}_${props.nombre}`; return props.setIdHover(id)} @@ -45,7 +45,7 @@ function IndicadorGrupo(props: { nombre: string, esLab: boolean, idParcial: stri } -const agruparProfesores = (datos: { [k: string]: DatosVariante }) => { +const agruparProfesores = (datos: { [k: string]: DatosGrupo }) => { const profesores: { [k: string]: string[] } = {}; for (const [grupo, datosGrupo] of Object.entries(datos)) { const nombreProfesor = datosGrupo.Docente; @@ -57,7 +57,7 @@ const agruparProfesores = (datos: { [k: string]: DatosVariante }) => { return profesores; }; -export function Cursos(props: Props) { +export function CursosElem(props: Props) { const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" ")); const claseCursoNoAgregado = css( @@ -99,9 +99,10 @@ export function Cursos(props: Props) { const profesoresLab = createMemo(() => agruparProfesores(datosCurso.Laboratorio ?? {})); return