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
-
props.setIdHover(idCurso)} - onMouseLeave={() => props.setIdHover("")} +
props.setIdHover(idCurso)} + onMouseLeave={() => props.setIdHover("")} > {datosCurso.abreviado} - {datosCurso.nombre}
diff --git a/src/ContenedorHorarios/Horarios.tsx b/src/ContenedorHorarios/Horarios.tsx index 4ffcb0f..52b646d 100755 --- a/src/ContenedorHorarios/Horarios.tsx +++ b/src/ContenedorHorarios/Horarios.tsx @@ -1,9 +1,9 @@ -import { Curso, DatosHorario, ListaCursosUsuario } from "../types/DatosHorario"; +import { Curso, CursoRaw, DatosHorario, DatosHorarioRaw, ListaCursosUsuario } from "../types/DatosHorario"; import { For, createSignal, createMemo } from "solid-js"; import { css } from "aphrodite"; import { estilosGlobales } from "../Estilos"; import { Tabla } from "./Tabla"; -import { Cursos } from "./Cursos"; +import { CursosElem } from "./CursosElem"; import { EstadoLayout } from "./ContenedorHorarios"; import { BotonMaxMin } from "./BotonMaxMin"; import { Switch, Match } from "solid-js"; @@ -77,7 +77,7 @@ export function Horarios(props: HorariosProps) { />
- { - const obj: AnioData = {}; + const obj: Cursos = {}; props.cursosUsuario.cursos.forEach(x => { obj[x.nombre] = {...x}; }); @@ -83,10 +83,26 @@ export function MiHorario(props: MiHorarioProps) { Mi horario
| - {}}/> - {}}/> - {}}/> - {}}/> + { + }} + /> + { + }} + /> + { + }} + /> + { + }} + /> | - + ""} + setIdHover={(v: string) => ""} + /> diff --git a/src/ContenedorHorarios/Tabla.tsx b/src/ContenedorHorarios/Tabla.tsx index 7d07ff2..172ce24 100755 --- a/src/ContenedorHorarios/Tabla.tsx +++ b/src/ContenedorHorarios/Tabla.tsx @@ -1,7 +1,7 @@ import { StyleSheet, css } from "aphrodite"; import { createMemo, createSignal, For } from "solid-js"; import { estilosGlobales } from "../Estilos"; -import { AnioData, CursoUsuario } from "../types/DatosHorario"; +import { Cursos, Curso } from "../types/DatosHorario"; import { Dia, dias, horas } from "../Store"; import { DataProcesada } from "../types/DatosHorario"; import { FilaTabla } from "./Tabla/FilaTabla"; @@ -81,12 +81,11 @@ const e = StyleSheet.create({ } }); -const procesarAnio = (data: AnioData, anio: string, version: number) => { +const procesarAnio = (data: Cursos, anio: string, version: number) => { const obj: DataProcesada = {}; for (const [, curso] of Object.entries(data)) { - // TODO: Reemplazar Curso con CursoUsuario, hacer los cambios donde se cargan los datos - if ((curso as CursoUsuario).oculto) continue; + if (curso.oculto) continue; const nombreAbreviado = curso.abreviado; @@ -147,7 +146,7 @@ const procesarAnio = (data: AnioData, anio: string, version: number) => { } interface Props { - data: AnioData, + data: Cursos, anio: string, version: number, idHover: () => string, diff --git a/src/types/DatosHorario.ts b/src/types/DatosHorario.ts index cfc73b3..53f3529 100755 --- a/src/types/DatosHorario.ts +++ b/src/types/DatosHorario.ts @@ -1,50 +1,66 @@ -export interface DatosVariante { - Docente: string, - Horas: string[] +export interface CursoRaw { + nombre: string, + abreviado: string, + Teoria: { + [grupo: string]: { + Docente: string, + Horas: string[] + } + } + Laboratorio?: { + [grupo: string]: { + Docente: string, + Horas: string[] + } + } } -export interface DatosVarianteUsuario extends DatosVariante { +export interface DatosHorarioRaw { + titulo: string, + descripcion: string, + version: number, + años: { + [key: string]: { + [nombre: string]: CursoRaw + } + } +} + +export interface DatosGrupo { + Docente: string, + Horas: string[] seleccionado: boolean } export interface Curso { nombre: string, abreviado: string, - Teoria: { - [grupo: string]: DatosVariante - } - Laboratorio?: { - [grupo: string]: DatosVariante - } -} - -export interface CursoUsuario extends Curso { oculto: boolean, Teoria: { - [grupo: string]: DatosVarianteUsuario + [grupo: string]: DatosGrupo } Laboratorio?: { - [grupo: string]: DatosVarianteUsuario + [grupo: string]: DatosGrupo } } export interface ListaCursosUsuario { - cursos: CursoUsuario[] + cursos: Curso[] } -export interface AnioData { +export interface Cursos { [nombre: string]: Curso } -export interface Anio { - [key: string]: AnioData +export interface Anios { + [key: string]: Cursos } export interface DatosHorario { titulo: string, descripcion: string, version: number, - años: Anio + años: Anios } export interface DataProcesada {