Agregar diferentes colores a los indicadores de hora

master
Araozu 2021-03-04 13:05:01 -05:00
parent fa55f56338
commit d8fe5bb2b4
6 changed files with 154 additions and 43 deletions

View File

@ -7,7 +7,7 @@ import { estilosGlobales } from "../Estilos";
import { Show, createSignal, createEffect, createMemo, batch } from "solid-js"; import { Show, createSignal, createEffect, createMemo, batch } from "solid-js";
const datosPromise = (async () => { const datosPromise = (async () => {
const file = await fetch("/horarios/2020_1_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; return YAML.parse(text) as DatosHorario;
})(); })();

View File

@ -1,17 +1,40 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { createEffect, createMemo, createSignal, createState, For } from "solid-js"; import { createMemo, createSignal, For } from "solid-js";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
import { AnioData } from "../types/DatosHorario"; import { AnioData } from "../types/DatosHorario";
import { dias, horas, horasDescanso } 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";
export const coloresBorde = Object.freeze([
"rgba(33,150,243,1)",
"rgba(255,214,0 ,1)",
"rgba(236,64,122 ,1)",
"rgba(29,233,182 ,1)",
"rgba(244,67,54,1)"
]);
export const diaANum = (d: Dia) => {
switch (d) {
case "Lunes":
return 0;
case "Martes":
return 1;
case "Miercoles":
return 2;
case "Jueves":
return 3;
case "Viernes":
return 4;
}
}
const e = StyleSheet.create({ const e = StyleSheet.create({
fila: { fila: {
position: "relative", position: "relative",
zIndex: 2, zIndex: 2,
transition: "background-color 250ms", transition: "background-color 250ms",
marginLeft: "4rem", marginLeft: "4.5rem",
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
minHeight: "1.5rem", minHeight: "1.5rem",

View File

@ -1,24 +1,25 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For, createSignal } from "solid-js"; import { For, createSignal, createMemo } from "solid-js";
import { Dia } from "../../Store";
const e = StyleSheet.create({ const e = StyleSheet.create({
celdaComun: { celdaComun: {
width: "20%", width: "20%",
textAlign: "center", textAlign: "center",
padding: "0 0.7rem", padding: "0 0.7rem",
boxSizing: "border-box" boxSizing: "border-box",
userSelect: "none"
}, },
celdaCurso: { celdaCurso: {
display: "inline-block", display: "inline-block",
padding: "0.25rem 0.35rem", padding: "0.25rem 0.35rem",
cursor: "pointer", cursor: "pointer",
borderRadius: "5px", borderRadius: "5px",
transition: "background-color 100ms, color 100ms" // transition: "background-color 100ms, color 100ms"
}, },
celdaCursoActiva: { celdaCursoActiva: {
backgroundColor: "rgba(200, 200, 200, 0.5)", // color: "#151515"
color: "#151515"
}, },
celdaCursoTeoria: { celdaCursoTeoria: {
fontWeight: "bold" fontWeight: "bold"
@ -28,12 +29,41 @@ const e = StyleSheet.create({
} }
}); });
const eColores = StyleSheet.create({
lunes: {
backgroundColor: "rgba(33,150,243,1)"
},
martes: {
backgroundColor: "rgba(255,214,0 ,1)",
color: "#151515"
},
miercoles: {
backgroundColor: "rgba(236,64,122 ,1)"
},
jueves: {
backgroundColor: "rgba(29,233,182 ,1)",
color: "#151515"
},
viernes: {
backgroundColor: "rgba(244,67,54,1)"
}
});
const clasesColores = {
Lunes: css(eColores.lunes),
Martes: css(eColores.martes),
Miercoles: css(eColores.miercoles),
Jueves: css(eColores.jueves),
Viernes: css(eColores.viernes)
}
interface Props { interface Props {
datos: { id: string, txt: string, esLab: boolean }[], datos: { id: string, txt: string, esLab: boolean }[],
idHover: () => string, idHover: () => string,
setIdHover: (v: string) => string, setIdHover: (v: string) => string,
fnResaltarFila: () => void, fnResaltarFila: () => void,
fnDesresaltarFila: () => void fnDesresaltarFila: () => void,
dia: Dia
} }
export function CeldaFila(props: Props) { export function CeldaFila(props: Props) {
@ -50,18 +80,21 @@ export function CeldaFila(props: Props) {
{({id, txt, esLab}) => { {({id, txt, esLab}) => {
const [estabaResaltado, setEstabaResaltado] = createSignal(false); const [estabaResaltado, setEstabaResaltado] = createSignal(false);
const clases = () => { const clases = createMemo(() => {
const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria]; const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria];
let adicional = "";
if (id === idHover()) { if (id === idHover()) {
props.fnResaltarFila(); props.fnResaltarFila();
clases.push(e.celdaCursoActiva); clases.push(e.celdaCursoActiva);
adicional = clasesColores[props.dia];
setEstabaResaltado(true); setEstabaResaltado(true);
} else if (estabaResaltado()) { } else if (estabaResaltado()) {
props.fnDesresaltarFila(); props.fnDesresaltarFila();
setEstabaResaltado(false); setEstabaResaltado(false);
} }
return css(...clases); return css(...clases) + " " + adicional;
}; });
return <span className={clases()} return <span className={clases()}
onMouseEnter={() => fnOnMouseEnter(id)} onMouseEnter={() => fnOnMouseEnter(id)}

View File

@ -1,27 +1,33 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For, createSignal } from "solid-js"; import { For, createSignal, createMemo, createState, createEffect, State } from "solid-js";
import { 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";
const e = StyleSheet.create({ const e = StyleSheet.create({
celdaHora: { celdaHora: {
textAlign: "center", textAlign: "center",
width: "4rem", width: "3rem",
padding: "0.25rem 0", padding: "0.25rem 0",
position: "absolute", position: "absolute",
top: "-0.75rem" top: "-0.75rem"
}, },
filaResaltado: {
position: "absolute",
zIndex: -1,
height: "100%",
transform: "translateX(-1.5rem)"
},
fila: { fila: {
position: "relative", position: "relative",
zIndex: 2, zIndex: 2,
transition: "background-color 250ms, border 100ms", transition: "background-color 250ms, border 100ms",
marginLeft: "4rem", marginLeft: "4.5rem",
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
minHeight: "1.5rem", minHeight: "1.1rem",
borderLeft: "solid transparent",
":hover": { ":hover": {
// backgroundColor: "rgba(200, 200, 200, 0.25)" // backgroundColor: "rgba(200, 200, 200, 0.25)"
} }
@ -32,13 +38,28 @@ const e = StyleSheet.create({
height: "1px", height: "1px",
width: "100%", width: "100%",
backgroundColor: "rgba(200, 200, 200, 0.25)", backgroundColor: "rgba(200, 200, 200, 0.25)",
zIndex: 1 zIndex: -1
}, },
filaResaltada: { celdaResaltado: {
borderLeft: "solid" height: "101%",
width: "5px",
display: "inline-block"
},
celdaResaltadoTransparente: {
backgroundColor: "transparent"
} }
}); });
// TODO: Usar un arr en vez de un objeto?
const [diasResaltados, setDiasResaltados] = createState({
Lunes: 0,
Martes: 0,
Miercoles: 0,
Jueves: 0,
Viernes: 0,
} as { [k: string]: number });
interface Props { interface Props {
hora: string, hora: string,
data: () => DataProcesada, data: () => DataProcesada,
@ -46,32 +67,64 @@ interface Props {
setIdHover: (v: string) => string setIdHover: (v: string) => string
} }
const diasFilter = createMemo(() => {
return Object.entries(diasResaltados)
.filter(x => x[1] > 0)
.map(x => x[0] as Dia)
.sort((x, y) => diaANum(x) > diaANum(y) ? 1 : -1);
});
const useDiasResaltados: () => [
State<{ [k: string]: boolean }>,
(d: Dia) => void,
(d: Dia) => void
] = () => {
const [diasResaltadosLocal, setDiasResaltadosLocal] = createState({
Lunes: false,
Martes: false,
Miercoles: false,
Jueves: false,
Viernes: false,
} as { [k: string]: boolean });
const fnResaltar = (d: Dia) => {
setDiasResaltadosLocal(d, true);
setDiasResaltados(d, v => v + 1);
};
const fnDesresaltar = (d: Dia) => {
setDiasResaltadosLocal(d, false);
setDiasResaltados(d, v => v - 1);
};
return [diasResaltadosLocal, fnResaltar, fnDesresaltar];
};
export function FilaTabla(props: Props) { export function FilaTabla(props: Props) {
const [filaResaltada, setFilaResaltada] = createSignal(false); const [diasResaltadosLocal, fnResaltar, fnDesresaltar] = useDiasResaltados();
const hora = props.hora; const hora = props.hora;
const data = props.data; const data = props.data;
const claseFilaComun = css(e.fila);
const claseFilaResaltada = css(e.fila, e.filaResaltada);
const resaltarFila = () => {
if (!filaResaltada()) {
setFilaResaltada(true);
}
};
const desresaltarFila = () => {
if (filaResaltada()) {
setFilaResaltada(false);
}
}
return <div style={{position: "relative"}}> return <div style={{position: "relative"}}>
<div className={css(e.celdaHora, estilosGlobales.inlineBlock)}> <div className={css(e.celdaHora, estilosGlobales.inlineBlock)}>
{hora.substring(0, 5)} {hora.substring(0, 5)}
</div> </div>
<div className={filaResaltada() ? claseFilaResaltada : claseFilaComun}> <div className={css(e.fila)}>
<div className={css(estilosGlobales.inlineBlock, e.filaResaltado)}>
<div className={css(e.celdaResaltado, diasResaltadosLocal.Lunes ? null : e.celdaResaltadoTransparente)}
style={{"background-color": coloresBorde[0]}}/>
<div className={css(e.celdaResaltado, diasResaltadosLocal.Martes ? null : e.celdaResaltadoTransparente)}
style={{"background-color": coloresBorde[1]}}/>
<div
className={css(e.celdaResaltado, diasResaltadosLocal.Miercoles ? null : e.celdaResaltadoTransparente)}
style={{"background-color": coloresBorde[2]}}/>
<div className={css(e.celdaResaltado, diasResaltadosLocal.Jueves ? null : e.celdaResaltadoTransparente)}
style={{"background-color": coloresBorde[3]}}/>
<div
className={css(e.celdaResaltado, diasResaltadosLocal.Viernes ? null : e.celdaResaltadoTransparente)}
style={{"background-color": coloresBorde[4]}}/>
</div>
<For each={dias}> <For each={dias}>
{dia => { {dia => {
const diaStr = dia.substring(0, 2); const diaStr = dia.substring(0, 2);
@ -83,8 +136,9 @@ export function FilaTabla(props: Props) {
datos={datos} datos={datos}
idHover={props.idHover} idHover={props.idHover}
setIdHover={props.setIdHover} setIdHover={props.setIdHover}
fnResaltarFila={resaltarFila} fnResaltarFila={() => fnResaltar(dia)}
fnDesresaltarFila={desresaltarFila} fnDesresaltarFila={() => fnDesresaltar(dia)}
dia={dia}
/> />
}} }}
</For> </For>

View File

@ -6,7 +6,9 @@ enum ModoColor {
Auto Auto
} }
export const dias = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]; export type Dia = "Lunes" | "Martes" | "Miercoles" | "Jueves" | "Viernes";
export const dias: Dia[] = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"];
export const horas = [ export const horas = [
"07:00 - 07:50", "07:00 - 07:50",
"07:50 - 08:40", "07:50 - 08:40",

View File

@ -7,7 +7,6 @@ const duracionTransicion = 250;
export function Wallpaper() { export function Wallpaper() {
/// @ts-ignore /// @ts-ignore
const soportaBackdropFilter = document.body.style.backdropFilter !== undefined; const soportaBackdropFilter = document.body.style.backdropFilter !== undefined;
console.log("Soporta backdrop-filter?:", soportaBackdropFilter);
const estilos = StyleSheet.create({ const estilos = StyleSheet.create({
contenedorCover: { contenedorCover: {