Implementar seleccionar grupos en la lista de horarios

master
Araozu 2021-03-24 20:22:33 -05:00
parent d79f44575d
commit e2503967cf
3 changed files with 53 additions and 14 deletions

View File

@ -1,5 +1,5 @@
import { Cursos, CursoRaw, DatosGrupo, ListaCursosUsuario, Curso } from "../types/DatosHorario"; import { Cursos, CursoRaw, DatosGrupo, ListaCursosUsuario, Curso } from "../types/DatosHorario";
import { createEffect, createMemo, For } from "solid-js"; import { createEffect, createMemo, For, SetStateFunction } from "solid-js";
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
@ -35,28 +35,53 @@ interface Props {
listaCursosUsuario: ListaCursosUsuario, listaCursosUsuario: ListaCursosUsuario,
idHover: () => string, idHover: () => string,
setIdHover: (v: string) => string, setIdHover: (v: string) => string,
esCursoMiHorario: boolean esCursoMiHorario: boolean,
setCursosUsuarios: SetStateFunction<ListaCursosUsuario>
} }
function IndicadorGrupo(props: { nombre: string, esLab: boolean, idParcial: string, setIdHover: (v: string) => string }) { type FnSetCursosUsuarios = SetStateFunction<ListaCursosUsuario>;
interface PropsIndicadorGrupo {
nombre: string,
esLab: boolean,
idParcial: string,
setIdHover: (v: string) => string,
onClick: () => void
}
function IndicadorGrupo(props: PropsIndicadorGrupo) {
const id = `${props.idParcial}_${props.esLab ? 'L' : 'T'}_${props.nombre}`; const id = `${props.idParcial}_${props.esLab ? 'L' : 'T'}_${props.nombre}`;
return <span className={css(e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)} return <span className={css(e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
style={props.esLab ? {"font-style": "italic"} : {"font-weight": "bold"}} style={props.esLab ? {"font-style": "italic"} : {"font-weight": "bold"}}
onMouseEnter={() => props.setIdHover(id)} onMouseEnter={() => props.setIdHover(id)}
onMouseLeave={() => props.setIdHover("")} onMouseLeave={() => props.setIdHover("")}
onClick={props.onClick}
> >
{props.esLab ? "L" : ""}{props.nombre} {props.esLab ? "L" : ""}{props.nombre}
</span> </span>
} }
const agruparProfesores = (datos: { [k: string]: DatosGrupo }) => { const agruparProfesores = (datos: { [k: string]: DatosGrupo }, indiceCurso: number, esLab: boolean, setCursosUsuarios: FnSetCursosUsuarios) => {
const profesores: { [k: string]: string[] } = {}; const profesores: { [k: string]: [string, () => void][] } = {};
for (const [grupo, datosGrupo] of Object.entries(datos)) { for (const [grupo, datosGrupo] of Object.entries(datos)) {
const nombreProfesor = datosGrupo.Docente; const nombreProfesor = datosGrupo.Docente;
if (!profesores[nombreProfesor]) { if (!profesores[nombreProfesor]) {
profesores[nombreProfesor] = []; profesores[nombreProfesor] = [];
} }
profesores[nombreProfesor].push(grupo); profesores[nombreProfesor].push([
grupo,
() => {
setCursosUsuarios(
"cursos",
indiceCurso,
esLab ? "Laboratorio" : "Teoria",
/// @ts-ignore
grupo,
"seleccionado",
x => !x
);
}
]);
} }
return profesores; return profesores;
}; };
@ -79,7 +104,7 @@ export function CursosElem(props: Props) {
return <> return <>
<For each={Object.entries(props.dataAnio)}> <For each={Object.entries(props.dataAnio)}>
{([_, datosCurso]) => { {([indiceCurso, datosCurso]) => {
const idCurso = `${anio()}_${datosCurso.abreviado}`; const idCurso = `${anio()}_${datosCurso.abreviado}`;
@ -105,8 +130,18 @@ export function CursosElem(props: Props) {
: claseCursoNoAgregado : claseCursoNoAgregado
}); });
const profesoresTeoria = createMemo(() => agruparProfesores(datosCurso.Teoria)); const profesoresTeoria = createMemo(() => agruparProfesores(
const profesoresLab = createMemo(() => agruparProfesores(datosCurso.Laboratorio ?? {})); datosCurso.Teoria,
parseInt(indiceCurso),
false,
props.setCursosUsuarios
));
const profesoresLab = createMemo(() => agruparProfesores(
datosCurso.Laboratorio ?? {},
parseInt(indiceCurso),
true,
props.setCursosUsuarios
));
return <div className={claseMemo()}> return <div className={claseMemo()}>
<div <div
@ -126,11 +161,12 @@ export function CursosElem(props: Props) {
{profesor}&nbsp; {profesor}&nbsp;
</span> </span>
<For each={grupos}> <For each={grupos}>
{x => {([x, fnOnClick]) =>
<IndicadorGrupo nombre={x} <IndicadorGrupo nombre={x}
esLab={false} esLab={false}
idParcial={idCurso} idParcial={idCurso}
setIdHover={props.setIdHover} setIdHover={props.setIdHover}
onClick={fnOnClick}
/> />
} }
</For> </For>
@ -146,11 +182,12 @@ export function CursosElem(props: Props) {
{profesor}&nbsp; {profesor}&nbsp;
</span> </span>
<For each={grupos}> <For each={grupos}>
{x => {([x, fnOnClick]) =>
<IndicadorGrupo nombre={x} <IndicadorGrupo nombre={x}
esLab={true} esLab={true}
idParcial={idCurso} idParcial={idCurso}
setIdHover={props.setIdHover} setIdHover={props.setIdHover}
onClick={fnOnClick}
/> />
} }
</For> </For>
@ -168,6 +205,6 @@ export function CursosElem(props: Props) {
</span> </span>
</div> </div>
}} }}
</For> </For>
</>; </>;
} }

View File

@ -108,6 +108,7 @@ export function Horarios(props: HorariosProps) {
idHover={idHover} idHover={idHover}
setIdHover={setIdHover} setIdHover={setIdHover}
esCursoMiHorario={false} esCursoMiHorario={false}
setCursosUsuarios={setListaCursos}
/> />
</div> </div>
</Match> </Match>

View File

@ -119,6 +119,7 @@ export function MiHorario(props: MiHorarioProps) {
idHover={idHover} idHover={idHover}
setIdHover={setIdHover} setIdHover={setIdHover}
esCursoMiHorario={true} esCursoMiHorario={true}
setCursosUsuarios={props.setCursosUsuarios}
/> />
</Match> </Match>
<Match when={props.estadoLayout === "MaxHorarios"}> <Match when={props.estadoLayout === "MaxHorarios"}>