Agregar propiedades a DataProcesada para permitir seleccionar grupos en la Tabla.tsx

master
Araozu 2021-03-18 19:51:35 -05:00
parent f3fffe25e5
commit ca149399c4
6 changed files with 64 additions and 19 deletions

View File

@ -124,6 +124,7 @@ export function ContenedorHorarios() {
setEstadoLayout={setEstadoLayout} setEstadoLayout={setEstadoLayout}
cursosUsuario={cursosUsuario} cursosUsuario={cursosUsuario}
fnAgregarCurso={agregarCursoUsuario} fnAgregarCurso={agregarCursoUsuario}
setCursosUsuarios={setCursosUsuarios}
/> />
</div> </div>
<div> <div>

View File

@ -3,7 +3,7 @@ import { StyleSheet, css } from "aphrodite";
import { Tabla } from "./Tabla"; import { Tabla } from "./Tabla";
import { mostrarDescansos } from "../Store"; import { mostrarDescansos } from "../Store";
import { EstadoLayout } from "./ContenedorHorarios"; import { EstadoLayout } from "./ContenedorHorarios";
import { Switch, Match, For, createMemo, createSignal } from "solid-js"; import { Switch, Match, For, createMemo, createSignal, SetStateFunction } from "solid-js";
import { BotonMaxMin } from "./BotonMaxMin"; import { BotonMaxMin } from "./BotonMaxMin";
import { BotonIcono } from "./BotonIcono"; import { BotonIcono } from "./BotonIcono";
import { Curso, Cursos, ListaCursosUsuario } from "../types/DatosHorario"; import { Curso, Cursos, ListaCursosUsuario } from "../types/DatosHorario";
@ -14,6 +14,7 @@ interface MiHorarioProps {
setEstadoLayout: (v: EstadoLayout) => EstadoLayout, setEstadoLayout: (v: EstadoLayout) => EstadoLayout,
cursosUsuario: ListaCursosUsuario, cursosUsuario: ListaCursosUsuario,
fnAgregarCurso: (c: Curso) => void, fnAgregarCurso: (c: Curso) => void,
setCursosUsuarios: SetStateFunction<ListaCursosUsuario>
} }
const e = StyleSheet.create({ const e = StyleSheet.create({
@ -32,6 +33,7 @@ const e = StyleSheet.create({
export function MiHorario(props: MiHorarioProps) { export function MiHorario(props: MiHorarioProps) {
const [idHover, setIdHover] = createSignal(""); const [idHover, setIdHover] = createSignal("");
// Simplificar para mantener reactividad (?)
const datosMiHorario = createMemo(() => { const datosMiHorario = createMemo(() => {
const obj: Cursos = {}; const obj: Cursos = {};
props.cursosUsuario.cursos.forEach(x => { props.cursosUsuario.cursos.forEach(x => {
@ -112,6 +114,7 @@ export function MiHorario(props: MiHorarioProps) {
version={1} version={1}
idHover={idHover} idHover={idHover}
setIdHover={setIdHover} setIdHover={setIdHover}
setCursosUsuarios={props.setCursosUsuarios}
/> />
</div> </div>

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, SetStateFunction } from "solid-js";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
import { Cursos, Curso } from "../types/DatosHorario"; import { Cursos, Curso, ListaCursosUsuario } 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,16 +81,24 @@ const e = StyleSheet.create({
} }
}); });
const procesarAnio = (data: Cursos, anio: string, version: number) => { type FnSetCursosUsuarios = SetStateFunction<ListaCursosUsuario>;
const procesarAnio = (data: Cursos, anio: string, version: number, setCursosUsuarios: FnSetCursosUsuarios) => {
const obj: DataProcesada = {}; const obj: DataProcesada = {};
for (const [, curso] of Object.entries(data)) { for (const cursoKey in data) {
const curso = data[cursoKey];
if (curso.oculto) continue; if (curso.oculto) continue;
const nombreAbreviado = curso.abreviado; const nombreAbreviado = curso.abreviado;
for (const [grupoStr, grupo] of Object.entries(curso.Teoria)) { for (const grupoStr in curso.Teoria) {
for (const hora of grupo.Horas) { const grupo = curso.Teoria[grupoStr];
if (!grupo) continue;
for (const horaKey in grupo.Horas) {
const hora = grupo.Horas[horaKey];
const dia = hora.substring(0, 2); const dia = hora.substring(0, 2);
const horas = hora.substring(2, 4); const horas = hora.substring(2, 4);
const minutos = hora.substr(4); const minutos = hora.substr(4);
@ -110,12 +118,20 @@ const procesarAnio = (data: Cursos, anio: string, version: number) => {
obj[horaCompleta][dia].push({ obj[horaCompleta][dia].push({
id, id,
txt: `${nombreAbreviado} ${grupoStr}`, txt: `${nombreAbreviado} ${grupoStr}`,
esLab: false esLab: false,
seleccionado: grupo.seleccionado,
fnSeleccionar: () => {
// setCursosUsuarios("cursos", );
console.log(":D");
}
}); });
} }
} }
for (const [grupoStr, grupo] of Object.entries(curso.Laboratorio ?? {})) { for (const grupoStr in curso.Laboratorio) {
const grupo = curso.Teoria[grupoStr];
if (!grupo) continue;
for (const hora of grupo.Horas) { for (const hora of grupo.Horas) {
const dia = hora.substring(0, 2); const dia = hora.substring(0, 2);
const horas = hora.substring(2, 4); const horas = hora.substring(2, 4);
@ -136,7 +152,11 @@ const procesarAnio = (data: Cursos, anio: string, version: number) => {
obj[horaCompleta][dia].push({ obj[horaCompleta][dia].push({
id, id,
txt: `${nombreAbreviado} L${grupoStr}`, txt: `${nombreAbreviado} L${grupoStr}`,
esLab: true esLab: true,
seleccionado: grupo.seleccionado,
fnSeleccionar: () => {
console.log(":D (lab)");
}
}); });
} }
} }
@ -150,12 +170,13 @@ interface Props {
anio: string, anio: string,
version: number, version: number,
idHover: () => string, idHover: () => string,
setIdHover: (v: string) => string setIdHover: (v: string) => string,
setCursosUsuarios: SetStateFunction<ListaCursosUsuario>
} }
export function Tabla(props: Props) { export function Tabla(props: Props) {
const anio = () => props.anio.substring(0, props.anio.indexOf(" ")); const anio = () => props.anio.substring(0, props.anio.indexOf(" "));
const data = createMemo(() => procesarAnio(props.data, anio(), props.version)); const data = createMemo(() => procesarAnio(props.data, anio(), props.version, props.setCursosUsuarios));
const idHover = props.idHover; const idHover = props.idHover;
const setIdHover = props.setIdHover; const setIdHover = props.setIdHover;
@ -164,7 +185,11 @@ export function Tabla(props: Props) {
props.data; props.data;
return <For each={horas}> return <For each={horas}>
{hora => { {hora => {
return <FilaTabla data={data()} hora={hora} idHover={idHover} setIdHover={setIdHover}/> return <FilaTabla data={data()}
hora={hora}
idHover={idHover}
setIdHover={setIdHover}
/>
}} }}
</For> </For>
}); });

View File

@ -1,7 +1,8 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For, createSignal, createMemo } from "solid-js"; import { For, createSignal, createMemo, createEffect, SetStateFunction } from "solid-js";
import { Dia } from "../../Store"; import { Dia } from "../../Store";
import { ListaCursosUsuario } from "../../types/DatosHorario";
const e = StyleSheet.create({ const e = StyleSheet.create({
celdaComun: { celdaComun: {
@ -70,7 +71,9 @@ interface Props {
datos: { datos: {
id: string, id: string,
txt: string, txt: string,
esLab: boolean esLab: boolean,
seleccionado: boolean,
fnSeleccionar: () => void
}[], }[],
idHover: () => string, idHover: () => string,
setIdHover: (v: string) => string, setIdHover: (v: string) => string,
@ -89,9 +92,19 @@ export function CeldaFila(props: Props) {
return <div className={css(e.celdaComun, estilosGlobales.inlineBlock)}> return <div className={css(e.celdaComun, estilosGlobales.inlineBlock)}>
<For each={datos}> <For each={datos}>
{({id, txt, esLab}) => { {datos => {
const id = datos.id;
const txt = datos.txt;
const esLab = datos.esLab;
const fnSeleccionar = datos.fnSeleccionar;
const [estabaResaltado, setEstabaResaltado] = createSignal(false); const [estabaResaltado, setEstabaResaltado] = createSignal(false);
createEffect(() => {
const seleccionado = datos.seleccionado;
console.log("Cambiado \"seleccionado\":", seleccionado);
});
const clases = createMemo( const clases = createMemo(
() => { () => {
const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria]; const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria];
@ -116,6 +129,7 @@ export function CeldaFila(props: Props) {
return <span className={clases()} return <span className={clases()}
onMouseEnter={() => fnOnMouseEnter(id)} onMouseEnter={() => fnOnMouseEnter(id)}
onMouseLeave={fnOnMouseLeave} onMouseLeave={fnOnMouseLeave}
onClick={fnSeleccionar}
> >
{txt} {txt}
</span>; </span>;

View File

@ -1,9 +1,9 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For, createSignal, createMemo, createState, createEffect, State } from "solid-js"; import { For, createSignal, createMemo, createState, createEffect, State, SetStateFunction } from "solid-js";
import { Dia, dias } from "../../Store"; import { Dia, dias } from "../../Store";
import { CeldaFila } from "./CeldaFila"; import { CeldaFila } from "./CeldaFila";
import { DataProcesada } from "../../types/DatosHorario"; import { DataProcesada, ListaCursosUsuario } from "../../types/DatosHorario";
import { coloresBorde, diaANum } from "../Tabla"; import { coloresBorde, diaANum } from "../Tabla";
const e = StyleSheet.create({ const e = StyleSheet.create({

View File

@ -68,7 +68,9 @@ export interface DataProcesada {
[dia: string]: { [dia: string]: {
id: string, id: string,
txt: string, txt: string,
esLab: boolean esLab: boolean,
seleccionado: boolean,
fnSeleccionar: () => void
}[] }[]
} }
} }