Modificar la interfaz DatosHorario para que permita almacenar cursos ocultos y grupos seleccionados

master
Araozu 2021-03-17 18:24:36 -05:00
parent 24b8647513
commit 2a6d8ddde6
6 changed files with 130 additions and 67 deletions

View File

@ -1,15 +1,59 @@
import YAML from "yaml"; import YAML from "yaml";
import { StyleSheet, css } from "aphrodite"; import { css, StyleSheet } from "aphrodite";
import { MiHorario } from "./MiHorario"; import { MiHorario } from "./MiHorario";
import { Horarios } from "./Horarios"; 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 { 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 datosPromise = (async () => {
const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml"); const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml");
const text = await file.text(); 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 = () => const ElemCargando = () =>
@ -28,27 +72,9 @@ const agregarCursoUsuario = (curso: Curso) => {
const cursoActualIndex = cursosUsuario.cursos.findIndex(x => x.nombre === curso.nombre); const cursoActualIndex = cursosUsuario.cursos.findIndex(x => x.nombre === curso.nombre);
if (cursoActualIndex !== -1) { if (cursoActualIndex !== -1) {
setCursosUsuarios("cursos", cursoActualIndex, "oculto", x => !x); 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() { export function ContenedorHorarios() {

View File

@ -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 { createEffect, createMemo, For } from "solid-js";
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
@ -26,7 +26,7 @@ const e = StyleSheet.create({
}); });
interface Props { interface Props {
dataAnio: AnioData, dataAnio: Cursos,
anioActual: () => string, anioActual: () => string,
fnAgregarCurso: (c: Curso) => void, fnAgregarCurso: (c: Curso) => void,
listaCursosUsuario: ListaCursosUsuario, listaCursosUsuario: ListaCursosUsuario,
@ -45,7 +45,7 @@ function IndicadorGrupo(props: { nombre: string, esLab: boolean, idParcial: stri
</span> </span>
} }
const agruparProfesores = (datos: { [k: string]: DatosVariante }) => { const agruparProfesores = (datos: { [k: string]: DatosGrupo }) => {
const profesores: { [k: string]: string[] } = {}; const profesores: { [k: string]: string[] } = {};
for (const [grupo, datosGrupo] of Object.entries(datos)) { for (const [grupo, datosGrupo] of Object.entries(datos)) {
const nombreProfesor = datosGrupo.Docente; const nombreProfesor = datosGrupo.Docente;
@ -57,7 +57,7 @@ const agruparProfesores = (datos: { [k: string]: DatosVariante }) => {
return profesores; return profesores;
}; };
export function Cursos(props: Props) { export function CursosElem(props: Props) {
const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" ")); const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" "));
const claseCursoNoAgregado = css( const claseCursoNoAgregado = css(
@ -99,7 +99,8 @@ export function Cursos(props: Props) {
const profesoresLab = createMemo(() => agruparProfesores(datosCurso.Laboratorio ?? {})); const profesoresLab = createMemo(() => agruparProfesores(datosCurso.Laboratorio ?? {}));
return <div className={claseMemo()}> return <div className={claseMemo()}>
<div className={css(e.inline, e.lineaTexto, e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)} <div
className={css(e.inline, e.lineaTexto, e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
onMouseEnter={() => props.setIdHover(idCurso)} onMouseEnter={() => props.setIdHover(idCurso)}
onMouseLeave={() => props.setIdHover("")} onMouseLeave={() => props.setIdHover("")}
> >

View File

@ -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 { For, createSignal, createMemo } from "solid-js";
import { css } from "aphrodite"; import { css } from "aphrodite";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
import { Tabla } from "./Tabla"; import { Tabla } from "./Tabla";
import { Cursos } from "./Cursos"; import { CursosElem } from "./CursosElem";
import { EstadoLayout } from "./ContenedorHorarios"; import { EstadoLayout } from "./ContenedorHorarios";
import { BotonMaxMin } from "./BotonMaxMin"; import { BotonMaxMin } from "./BotonMaxMin";
import { Switch, Match } from "solid-js"; import { Switch, Match } from "solid-js";
@ -77,7 +77,7 @@ export function Horarios(props: HorariosProps) {
/> />
</div> </div>
<div> <div>
<Cursos <CursosElem
dataAnio={dataTabla()} dataAnio={dataTabla()}
anioActual={anioActual} anioActual={anioActual}
fnAgregarCurso={props.fnAgregarCurso} fnAgregarCurso={props.fnAgregarCurso}

View File

@ -6,7 +6,7 @@ import { EstadoLayout } from "./ContenedorHorarios";
import { Switch, Match, For, createMemo } from "solid-js"; import { Switch, Match, For, createMemo } from "solid-js";
import { BotonMaxMin } from "./BotonMaxMin"; import { BotonMaxMin } from "./BotonMaxMin";
import { BotonIcono } from "./BotonIcono"; import { BotonIcono } from "./BotonIcono";
import { AnioData, ListaCursosUsuario } from "../types/DatosHorario"; import { Cursos, ListaCursosUsuario } from "../types/DatosHorario";
interface MiHorarioProps { interface MiHorarioProps {
estadoLayout: EstadoLayout, estadoLayout: EstadoLayout,
@ -42,7 +42,7 @@ const e = StyleSheet.create({
export function MiHorario(props: MiHorarioProps) { export function MiHorario(props: MiHorarioProps) {
const datosMiHorario = createMemo(() => { const datosMiHorario = createMemo(() => {
const obj: AnioData = {}; const obj: Cursos = {};
props.cursosUsuario.cursos.forEach(x => { props.cursosUsuario.cursos.forEach(x => {
obj[x.nombre] = {...x}; obj[x.nombre] = {...x};
}); });
@ -83,10 +83,26 @@ export function MiHorario(props: MiHorarioProps) {
Mi horario Mi horario
</div> </div>
| |
<BotonIcono titulo={"Nuevo horario en blanco"} icono={"ph-plus"} onClick={() => {}}/> <BotonIcono titulo={"Nuevo horario en blanco"}
<BotonIcono titulo={"Reiniciar horario"} icono={"ph-arrow-counter-clockwise"} onClick={() => {}}/> icono={"ph-plus"}
<BotonIcono titulo={"Duplicar horario"} icono={"ph-copy"} onClick={() => {}}/> onClick={() => {
<BotonIcono titulo={"Eliminar horario"} icono={"ph-trash"} onClick={() => {}}/> }}
/>
<BotonIcono titulo={"Reiniciar horario"}
icono={"ph-arrow-counter-clockwise"}
onClick={() => {
}}
/>
<BotonIcono titulo={"Duplicar horario"}
icono={"ph-copy"}
onClick={() => {
}}
/>
<BotonIcono titulo={"Eliminar horario"}
icono={"ph-trash"}
onClick={() => {
}}
/>
| |
<BotonMaxMin <BotonMaxMin
fnMaximizar={fnMaximizar} fnMaximizar={fnMaximizar}
@ -100,7 +116,12 @@ export function MiHorario(props: MiHorarioProps) {
e.horario, e.horario,
estilosGlobales.contenedor estilosGlobales.contenedor
)}> )}>
<Tabla data={datosMiHorario()} anio={"Mi horario"} version={1}/> <Tabla data={datosMiHorario()}
anio={"Mi horario"}
version={1}
idHover={() => ""}
setIdHover={(v: string) => ""}
/>
<Horario cursosUsuario={props.cursosUsuario}/> <Horario cursosUsuario={props.cursosUsuario}/>

View File

@ -1,7 +1,7 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { createMemo, createSignal, For } from "solid-js"; import { createMemo, createSignal, For } from "solid-js";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
import { AnioData, CursoUsuario } from "../types/DatosHorario"; import { Cursos, Curso } from "../types/DatosHorario";
import { Dia, dias, horas } from "../Store"; import { Dia, dias, horas } from "../Store";
import { DataProcesada } from "../types/DatosHorario"; import { DataProcesada } from "../types/DatosHorario";
import { FilaTabla } from "./Tabla/FilaTabla"; 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 = {}; const obj: DataProcesada = {};
for (const [, curso] of Object.entries(data)) { for (const [, curso] of Object.entries(data)) {
// TODO: Reemplazar Curso con CursoUsuario, hacer los cambios donde se cargan los datos if (curso.oculto) continue;
if ((curso as CursoUsuario).oculto) continue;
const nombreAbreviado = curso.abreviado; const nombreAbreviado = curso.abreviado;
@ -147,7 +146,7 @@ const procesarAnio = (data: AnioData, anio: string, version: number) => {
} }
interface Props { interface Props {
data: AnioData, data: Cursos,
anio: string, anio: string,
version: number, version: number,
idHover: () => string, idHover: () => string,

View File

@ -1,50 +1,66 @@
export interface DatosVariante { export interface CursoRaw {
nombre: string,
abreviado: string,
Teoria: {
[grupo: string]: {
Docente: string, Docente: string,
Horas: 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 seleccionado: boolean
} }
export interface Curso { export interface Curso {
nombre: string, nombre: string,
abreviado: string, abreviado: string,
Teoria: {
[grupo: string]: DatosVariante
}
Laboratorio?: {
[grupo: string]: DatosVariante
}
}
export interface CursoUsuario extends Curso {
oculto: boolean, oculto: boolean,
Teoria: { Teoria: {
[grupo: string]: DatosVarianteUsuario [grupo: string]: DatosGrupo
} }
Laboratorio?: { Laboratorio?: {
[grupo: string]: DatosVarianteUsuario [grupo: string]: DatosGrupo
} }
} }
export interface ListaCursosUsuario { export interface ListaCursosUsuario {
cursos: CursoUsuario[] cursos: Curso[]
} }
export interface AnioData { export interface Cursos {
[nombre: string]: Curso [nombre: string]: Curso
} }
export interface Anio { export interface Anios {
[key: string]: AnioData [key: string]: Cursos
} }
export interface DatosHorario { export interface DatosHorario {
titulo: string, titulo: string,
descripcion: string, descripcion: string,
version: number, version: number,
años: Anio años: Anios
} }
export interface DataProcesada { export interface DataProcesada {