Posicionamiento de grupos en la tabla

master
Araozu 2022-10-13 20:35:23 -05:00
parent 10749c5900
commit 16f2e71430
3 changed files with 92 additions and 93 deletions

View File

@ -1,32 +1,4 @@
interface Curso {
// Nombre completo del curso
nombre: string,
// Nombre del curso abreviado
abreviado: string,
// Información de las horas de teoria
Teoria: {
// grupo es una letra: A, B, C, D
[grupo: string]: DatosGrupo,
},
// Información de las horas de laboratorio
Laboratorio?: {
// grupo es una letra: A, B, C, D
[grupo: string]: DatosGrupo,
},
}
interface DatosGrupo {
// Nombre del docente de este grupo
Docente: string,
/*
Las horas del curso en el siguiente formato: DD_HHMM
DD puede ser Lu, Ma, Mi, Ju, Vi
Ejm: Ma0850, Vi1640, Ju1550
*/
Horas: string[]
}
// Exclusivo de un unico dia // Exclusivo de un unico dia
type Input = { type Input = {
horaInicio: number, horaInicio: number,

View File

@ -1,12 +1,12 @@
import { StyleSheet, css } from "aphrodite" import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos" import { estilosGlobales } from "../../Estilos";
import { For, createMemo } from "solid-js" import { For, createMemo } from "solid-js";
import {createStore, Store} from "solid-js/store" import {createStore, Store} from "solid-js/store";
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 } from "../../types/DatosHorario";
import { coloresBorde, diaANum } from "../Tabla" import { coloresBorde, diaANum } from "../Tabla";
import { TablaObserver } from "../TablaObserver" import { TablaObserver } from "../TablaObserver";
const e = StyleSheet.create({ const e = StyleSheet.create({
celdaHora: { celdaHora: {
@ -50,7 +50,7 @@ const e = StyleSheet.create({
celdaResaltadoTransparente: { celdaResaltadoTransparente: {
backgroundColor: "transparent", backgroundColor: "transparent",
}, },
}) });
const [diasResaltados, setDiasResaltados] = createStore({ const [diasResaltados, setDiasResaltados] = createStore({
Lunes: 0, Lunes: 0,
@ -58,7 +58,7 @@ const [diasResaltados, setDiasResaltados] = createStore({
Miercoles: 0, Miercoles: 0,
Jueves: 0, Jueves: 0,
Viernes: 0, Viernes: 0,
} as { [k: string]: number }) } as { [k: string]: number });
interface Props { interface Props {
hora: string, hora: string,
@ -69,7 +69,7 @@ interface Props {
const diasFilter = createMemo(() => Object.entries(diasResaltados) const diasFilter = createMemo(() => Object.entries(diasResaltados)
.filter((x) => x[1] > 0) .filter((x) => x[1] > 0)
.map((x) => x[0] as Dia) .map((x) => x[0] as Dia)
.sort((x, y) => (diaANum(x) > diaANum(y) ? 1 : -1))) .sort((x, y) => (diaANum(x) > diaANum(y) ? 1 : -1)));
const useDiasResaltados: () => [ const useDiasResaltados: () => [
Store<{ [k: string]: boolean }>, Store<{ [k: string]: boolean }>,
@ -82,26 +82,26 @@ const useDiasResaltados: () => [
Miercoles: false, Miercoles: false,
Jueves: false, Jueves: false,
Viernes: false, Viernes: false,
} as { [k: string]: boolean }) } as { [k: string]: boolean });
const fnResaltar = (d: Dia) => { const fnResaltar = (d: Dia) => {
setDiasResaltadosLocal(d, true) setDiasResaltadosLocal(d, true);
setDiasResaltados(d, (v) => v + 1) setDiasResaltados(d, (v) => v + 1);
} };
const fnDesresaltar = (d: Dia) => { const fnDesresaltar = (d: Dia) => {
setDiasResaltadosLocal(d, false) setDiasResaltadosLocal(d, false);
setDiasResaltados(d, (v) => v - 1) setDiasResaltados(d, (v) => v - 1);
} };
return [diasResaltadosLocal, fnResaltar, fnDesresaltar] return [diasResaltadosLocal, fnResaltar, fnDesresaltar];
} };
export function FilaTabla(props: Props) { export function FilaTabla(props: Props) {
const [diasResaltadosLocal, fnResaltar, fnDesresaltar] = useDiasResaltados() const [diasResaltadosLocal, fnResaltar, fnDesresaltar] = useDiasResaltados();
const hora = props.hora const hora = props.hora;
const data = props.data const data = props.data;
return ( return (
<div style={{position: "relative"}}> <div style={{position: "relative"}}>
@ -133,10 +133,10 @@ export function FilaTabla(props: Props) {
</div> </div>
<For each={dias}> <For each={dias}>
{(dia) => { {(dia) => {
const diaStr = dia.substring(0, 2) const diaStr = dia.substring(0, 2);
const horaStr = hora.substring(0, 5) const horaStr = hora.substring(0, 5);
const datos = data?.[horaStr]?.[diaStr] ?? [] const datos = data?.[horaStr]?.[diaStr] ?? [];
return ( return (
<CeldaFila <CeldaFila
@ -146,11 +146,11 @@ export function FilaTabla(props: Props) {
dia={dia} dia={dia}
tablaObserver={props.tablaObserver} tablaObserver={props.tablaObserver}
/> />
) );
}} }}
</For> </For>
<div className={css(e.filaBorde)} /> <div className={css(e.filaBorde)} />
</div> </div>
</div> </div>
) );
} }

View File

@ -1,10 +1,11 @@
import {StyleSheet, css} from "aphrodite/no-important"; import {StyleSheet, css} from "aphrodite/no-important";
import { createSignal, JSX } from "solid-js"; import { createSignal, For, JSX } from "solid-js";
import { horas } from "../../Store";
const s = StyleSheet.create({ const s = StyleSheet.create({
container: { container: {
display: "grid", display: "grid",
gridTemplateColumns: "3.5rem 1fr 1fr", gridTemplateColumns: "14vw 1fr 1fr",
textAlign: "center", textAlign: "center",
fontSize: "0.9rem", fontSize: "0.9rem",
}, },
@ -15,45 +16,85 @@ const s = StyleSheet.create({
textAlign: "center", textAlign: "center",
}, },
columna: { columna: {
textAlign: "left",
borderRight: "solid 2px var(--color-borde)", borderRight: "solid 2px var(--color-borde)",
}, },
celdaHora: {
position: "relative",
top: "-0.75rem",
height: "3rem",
},
}); });
type DayIndex = 0 | 1 | 2 | 3; type DayIndex = 0 | 1 | 2 | 3;
const days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]; const days = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"];
function Grupo(props: {curso: string, grupo: string}) { type Output = {
curso: string,
grupo: string,
idxHoraInicio: number,
nroHoras: number,
offset: number, // 0, 1, 2
fraccion: number, // por cuanto dividir la celda. 1, 2, 3, ...
}
function Grupo(props: {data: Output}) {
const ss = StyleSheet.create({ const ss = StyleSheet.create({
button: { button: {
display: "inline-block", display: "inline-block",
padding: "0.25rem 0.35rem", padding: "0.2rem 0.2rem",
textAlign: "left", textAlign: "left",
borderRadius: "10px", borderRadius: "10px",
border: "solid 2px red", border: "solid 2px red",
flexGrow: 1, position: "absolute",
margin: "1px",
}, },
}); });
return ( return (
<button className={css(ss.button)}> <button className={css(ss.button)} style={`left: calc((43vw / ${props.data.fraccion}) * ${props.data.offset} - 14vw); top: ${props.data.idxHoraInicio * 3}rem; height: ${props.data.nroHoras * 3}rem; width: calc(100% / ${props.data.fraccion})`}>
{props.curso} {props.data.curso}
<br /> <br />
{props.grupo} {props.data.grupo}
</button> </button>
); );
} }
export function Celda(props: {children: JSX.Element}) { function Dia(props: {dia: string}) {
const ss = StyleSheet.create({ const ss = StyleSheet.create({
celda: { contenedorDia: {
padding: "0 0.25rem", position: "relative",
display: "flex",
}, },
}); });
return ( return (
<div className={css(ss.celda)}> <div className={css(s.columna)}>
{props.children} <div className={css(s.tableIndex)}>{props.dia}</div>
<div className={css(ss.contenedorDia)}>
<Grupo data={{
curso: "TAIS",
grupo: "LA",
idxHoraInicio: 0,
nroHoras: 3,
offset: 1,
fraccion: 3,
}}
/>
<Grupo data={{
curso: "PPP",
grupo: "LB",
idxHoraInicio: 2,
nroHoras: 2,
offset: 2,
fraccion: 3,
}}
/>
<Grupo data={{
curso: "FC",
grupo: "LC",
idxHoraInicio: 1,
nroHoras: 4,
offset: 3,
fraccion: 3,
}}
/>
</div>
</div> </div>
); );
} }
@ -64,27 +105,13 @@ export function Table() {
return ( return (
<div className={css(s.container)}> <div className={css(s.container)}>
<div className={css(s.columna)}> <div className={css(s.columna)}>
<div className={css(s.tableIndex)} style="border: none">&nbsp;</div> <div className={css(s.tableIndex)} style="border: none; background: transparent;">&nbsp;</div>
</div> <For each={horas}>
<div className={css(s.columna)}> {(hora) => <div className={css(s.celdaHora)}>{hora.substring(0, 5)}</div>}
<div className={css(s.tableIndex)}>{days[currentDay()]}</div> </For>
<Celda>
<Grupo curso="TAIS 2" grupo="LA" />
<Grupo curso="ST2" grupo="LB" />
</Celda>
<Celda>
<Grupo curso="TAIS 2" grupo="LB" />
</Celda>
<Celda>
<Grupo curso="TAIS" grupo="LC" />
<Grupo curso="PIS 2" grupo="LB" />
<Grupo curso="PPP" grupo="B" />
</Celda>
</div>
<div className={css(s.columna)}>
<div className={css(s.tableIndex)}>{days[currentDay() + 1]}</div>
<div style="padding: 0 0.25rem" />
</div> </div>
<Dia dia={days[currentDay()]} />
<Dia dia={days[currentDay() + 1]} />
</div> </div>
); );
} }