Agregar indicador de la hora al resaltar un curso

master
Araozu 2021-03-04 09:33:11 -05:00
parent 611787fbbf
commit fa55f56338
2 changed files with 49 additions and 10 deletions

View File

@ -1,6 +1,6 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For } from "solid-js"; import { For, createSignal } from "solid-js";
const e = StyleSheet.create({ const e = StyleSheet.create({
celdaComun: { celdaComun: {
@ -31,7 +31,9 @@ const e = StyleSheet.create({
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,
fnDesresaltarFila: () => void
} }
export function CeldaFila(props: Props) { export function CeldaFila(props: Props) {
@ -40,19 +42,30 @@ export function CeldaFila(props: Props) {
const idHover = props.idHover; const idHover = props.idHover;
const setIdHover = props.setIdHover; const setIdHover = props.setIdHover;
const fnOnMouseEnter = (id: string) => setIdHover(id);
const fnOnMouseLeave = () => setIdHover("");
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}) => { {({id, txt, esLab}) => {
const [estabaResaltado, setEstabaResaltado] = createSignal(false);
const clases = () => { const clases = () => {
const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria]; const clases = [e.celdaCurso, esLab ? e.celdaCursoLab : e.celdaCursoTeoria];
if (id === idHover()) clases.push(e.celdaCursoActiva); if (id === idHover()) {
props.fnResaltarFila();
clases.push(e.celdaCursoActiva);
setEstabaResaltado(true);
} else if (estabaResaltado()) {
props.fnDesresaltarFila();
setEstabaResaltado(false);
}
return css(...clases); return css(...clases);
}; };
return <span className={clases()} return <span className={clases()}
onMouseEnter={() => setIdHover(id)} onMouseEnter={() => fnOnMouseEnter(id)}
onMouseLeave={() => setIdHover("")} onMouseLeave={fnOnMouseLeave}
> >
{txt} {txt}
</span>; </span>;

View File

@ -1,6 +1,6 @@
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../../Estilos"; import { estilosGlobales } from "../../Estilos";
import { For } from "solid-js"; import { For, createSignal } from "solid-js";
import { dias } from "../../Store"; import { dias } from "../../Store";
import { CeldaFila } from "./CeldaFila"; import { CeldaFila } from "./CeldaFila";
import { DataProcesada } from "../../types/DatosHorario"; import { DataProcesada } from "../../types/DatosHorario";
@ -16,11 +16,12 @@ const e = StyleSheet.create({
fila: { fila: {
position: "relative", position: "relative",
zIndex: 2, zIndex: 2,
transition: "background-color 250ms", transition: "background-color 250ms, border 100ms",
marginLeft: "4rem", marginLeft: "4rem",
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
minHeight: "1.5rem", minHeight: "1.5rem",
borderLeft: "solid transparent",
":hover": { ":hover": {
// backgroundColor: "rgba(200, 200, 200, 0.25)" // backgroundColor: "rgba(200, 200, 200, 0.25)"
} }
@ -33,6 +34,9 @@ const e = StyleSheet.create({
backgroundColor: "rgba(200, 200, 200, 0.25)", backgroundColor: "rgba(200, 200, 200, 0.25)",
zIndex: 1 zIndex: 1
}, },
filaResaltada: {
borderLeft: "solid"
}
}); });
interface Props { interface Props {
@ -43,15 +47,31 @@ interface Props {
} }
export function FilaTabla(props: Props) { export function FilaTabla(props: Props) {
const [filaResaltada, setFilaResaltada] = createSignal(false);
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={css(e.fila)}> <div className={filaResaltada() ? claseFilaResaltada : claseFilaComun}>
<For each={dias}> <For each={dias}>
{dia => { {dia => {
const diaStr = dia.substring(0, 2); const diaStr = dia.substring(0, 2);
@ -59,7 +79,13 @@ export function FilaTabla(props: Props) {
const datos = data()?.[horaStr]?.[diaStr] ?? []; const datos = data()?.[horaStr]?.[diaStr] ?? [];
return <CeldaFila datos={datos} idHover={props.idHover} setIdHover={props.setIdHover}/> return <CeldaFila
datos={datos}
idHover={props.idHover}
setIdHover={props.setIdHover}
fnResaltarFila={resaltarFila}
fnDesresaltarFila={desresaltarFila}
/>
}} }}
</For> </For>
<div className={css(e.filaBorde)}/> <div className={css(e.filaBorde)}/>