Agregar diferentes colores a los indicadores de hora
This commit is contained in:
parent
fa55f56338
commit
d8fe5bb2b4
@ -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;
|
||||||
})();
|
})();
|
||||||
|
@ -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",
|
||||||
|
@ -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)}
|
||||||
|
@ -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>
|
||||||
|
@ -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",
|
||||||
|
@ -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: {
|
||||||
|
Loading…
Reference in New Issue
Block a user