From 34a3402388bc96431d72d5a7038f99723cdb0a1d Mon Sep 17 00:00:00 2001 From: Araozu Date: Thu, 11 Mar 2021 08:52:21 -0500 Subject: [PATCH] Agregar funcionalidad para agregar cursos a Mi Horario --- src/ContenedorHorarios/ContenedorHorarios.tsx | 42 +++++++++-- src/ContenedorHorarios/Cursos.tsx | 5 +- src/ContenedorHorarios/Horarios.tsx | 9 +-- src/ContenedorHorarios/MiHorario.tsx | 69 +++++++++++-------- src/ContenedorHorarios/Tabla.tsx | 5 +- src/ContenedorHorarios/Tabla/FilaTabla.tsx | 4 +- src/types/DatosHorario.ts | 33 ++++++--- 7 files changed, 116 insertions(+), 51 deletions(-) diff --git a/src/ContenedorHorarios/ContenedorHorarios.tsx b/src/ContenedorHorarios/ContenedorHorarios.tsx index 8030547..26ecd75 100755 --- a/src/ContenedorHorarios/ContenedorHorarios.tsx +++ b/src/ContenedorHorarios/ContenedorHorarios.tsx @@ -2,9 +2,9 @@ import YAML from "yaml"; import { StyleSheet, css } from "aphrodite"; import { MiHorario } from "./MiHorario"; import { Horarios } from "./Horarios"; -import { DatosHorario } from "../types/DatosHorario"; +import { Curso, CursoUsuario, DatosHorario, DatosVarianteUsuario, ListaCursosUsuario } from "../types/DatosHorario"; import { estilosGlobales } from "../Estilos"; -import { Show, createSignal, createEffect, createMemo, batch } from "solid-js"; +import { Show, createSignal, createEffect, createMemo, batch, createState } from "solid-js"; const datosPromise = (async () => { const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml"); @@ -19,6 +19,37 @@ const ElemCargando = () => export type EstadoLayout = "MaxPersonal" | "Normal" | "MaxHorarios"; +const [cursosUsuario, setCursosUsuarios] = createState({ + cursos: [] +}); + + + +const agregarCursoUsuario = (curso: Curso) => { + if (cursosUsuario.cursos.find(x => x.nombre === curso.nombre)) { + return; + } + + 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() { const [datosCargados, setDatosCargados] = createSignal(false); const [datos, setDatos] = createSignal(null); @@ -62,11 +93,14 @@ export function ContenedorHorarios() { return
- +
- +
; diff --git a/src/ContenedorHorarios/Cursos.tsx b/src/ContenedorHorarios/Cursos.tsx index c18e7a1..4707871 100755 --- a/src/ContenedorHorarios/Cursos.tsx +++ b/src/ContenedorHorarios/Cursos.tsx @@ -1,4 +1,4 @@ -import { AnioData } from "../types/DatosHorario"; +import { AnioData, Curso } from "../types/DatosHorario"; import { For } from "solid-js"; import { StyleSheet, css } from "aphrodite"; import { estilosGlobales } from "../Estilos"; @@ -10,7 +10,7 @@ const e = StyleSheet.create({ } }); -export function Cursos(props: { dataAnio: AnioData }) { +export function Cursos(props: { dataAnio: AnioData, fnAgregarCurso: (c: Curso) => void }) { return <> {([_, datosCurso]) => { @@ -20,6 +20,7 @@ export function Cursos(props: { dataAnio: AnioData }) { estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft )} + onClick={() => props.fnAgregarCurso(datosCurso)} > {datosCurso.abreviado} - {datosCurso.nombre} diff --git a/src/ContenedorHorarios/Horarios.tsx b/src/ContenedorHorarios/Horarios.tsx index 52244a4..d5ecfef 100755 --- a/src/ContenedorHorarios/Horarios.tsx +++ b/src/ContenedorHorarios/Horarios.tsx @@ -1,5 +1,5 @@ -import { DatosHorario } from "../types/DatosHorario"; -import { For, createSignal, createMemo } from "solid-js"; +import { Curso, DatosHorario } from "../types/DatosHorario"; +import { For, createSignal, createMemo} from "solid-js"; import { css } from "aphrodite"; import { estilosGlobales } from "../Estilos"; import { Tabla } from "./Tabla"; @@ -11,7 +11,8 @@ import { Switch, Match } from "solid-js"; interface HorariosProps { data: DatosHorario, estadoLayout: EstadoLayout, - setEstadoLayout: (v: EstadoLayout) => EstadoLayout + setEstadoLayout: (v: EstadoLayout) => EstadoLayout, + fnAgregarCurso: (c: Curso) => void } export function Horarios(props: HorariosProps) { @@ -61,7 +62,7 @@ export function Horarios(props: HorariosProps) {
- +
diff --git a/src/ContenedorHorarios/MiHorario.tsx b/src/ContenedorHorarios/MiHorario.tsx index 12646d3..8d332c0 100755 --- a/src/ContenedorHorarios/MiHorario.tsx +++ b/src/ContenedorHorarios/MiHorario.tsx @@ -3,26 +3,49 @@ import { StyleSheet, css } from "aphrodite"; import { Tabla } from "./Tabla"; import { mostrarDescansos } from "../Store"; import { EstadoLayout } from "./ContenedorHorarios"; -import { Switch, Match } from "solid-js"; +import { Switch, Match, For, createMemo } from "solid-js"; import { BotonMaxMin } from "./BotonMaxMin"; +import { AnioData, ListaCursosUsuario } from "../types/DatosHorario"; interface MiHorarioProps { estadoLayout: EstadoLayout, - setEstadoLayout: (v: EstadoLayout) => EstadoLayout + setEstadoLayout: (v: EstadoLayout) => EstadoLayout, + cursosUsuario: ListaCursosUsuario } -export function MiHorario(props: MiHorarioProps) { - const e = StyleSheet.create({ - horario: {}, - boton: { - textDecoration: "none", - // paddingRight: "0.5rem", - "::before": { - fontSize: "1rem", - // transform: "translateY(0.2rem)", - textDecoration: "none" - } +function Horario(props: { cursosUsuario: ListaCursosUsuario }) { + return
+ + {c => { + return
+

{c.abreviado} - {c.nombre}

+
+ }} +
+
+} + +const e = StyleSheet.create({ + horario: {}, + boton: { + textDecoration: "none", + // paddingRight: "0.5rem", + "::before": { + fontSize: "1rem", + // transform: "translateY(0.2rem)", + textDecoration: "none" } + } +}); + +export function MiHorario(props: MiHorarioProps) { + + const datosMiHorario = createMemo(() => { + const obj: AnioData = {}; + props.cursosUsuario.cursos.forEach(x => { + obj[x.nombre] = {...x}; + }); + return obj; }); const claseBotonMostrarDescansos = () => @@ -51,28 +74,16 @@ export function MiHorario(props: MiHorarioProps) { estadoActualLayout={estadoActualLayout} estadoLayoutMax={"MaxPersonal"} /> - {/* -
setMostrarDescansos(!mostrarDescansos())} - > - -  Mostrar descansos -
- */} -
- + + + +
diff --git a/src/ContenedorHorarios/Tabla.tsx b/src/ContenedorHorarios/Tabla.tsx index 52ffb44..ee2f0dc 100755 --- a/src/ContenedorHorarios/Tabla.tsx +++ b/src/ContenedorHorarios/Tabla.tsx @@ -149,10 +149,11 @@ export function Tabla(props: { data: AnioData, anio: string, version: number }) const [idHover, setIdHover] = createSignal(""); const celdas = createMemo(() => { - console.log("Renderizar tabla", props.anio); + // Hace reaccionar a la reactividad de Solid + props.data; return {hora => { - return + return }} }); diff --git a/src/ContenedorHorarios/Tabla/FilaTabla.tsx b/src/ContenedorHorarios/Tabla/FilaTabla.tsx index e5a4320..3a4eba9 100755 --- a/src/ContenedorHorarios/Tabla/FilaTabla.tsx +++ b/src/ContenedorHorarios/Tabla/FilaTabla.tsx @@ -62,7 +62,7 @@ const [diasResaltados, setDiasResaltados] = createState({ interface Props { hora: string, - data: () => DataProcesada, + data: DataProcesada, idHover: () => string, setIdHover: (v: string) => string } @@ -130,7 +130,7 @@ export function FilaTabla(props: Props) { const diaStr = dia.substring(0, 2); const horaStr = hora.substring(0, 5); - const datos = data()?.[horaStr]?.[diaStr] ?? []; + const datos = data?.[horaStr]?.[diaStr] ?? []; return