Posicionamiento de grupos en la tabla
This commit is contained in:
parent
10749c5900
commit
16f2e71430
@ -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,
|
||||||
|
@ -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>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
@ -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"> </div>
|
<div className={css(s.tableIndex)} style="border: none; background: transparent;"> </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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user