Limpiar codigo

master
Fernando 2021-08-18 17:09:02 -05:00
parent 07668ed201
commit fe98b12130
3 changed files with 210 additions and 216 deletions

View File

@ -34,6 +34,13 @@ const e = StyleSheet.create({
},
})
const claseCursoNoAgregado = css(
e.contenedorCurso,
estilosGlobales.contenedor,
)
const claseCursoOculto = css(e.cursoOculto)
interface Props {
version: number,
dataAnio: Cursos,
@ -101,129 +108,113 @@ const agruparProfesores = (
return profesores
}
function CursoE(
indiceCurso: string,
datosCurso: Curso,
anio: () => string,
claseCursoAgregado: string,
props: Props
) {
const idCurso = `${props.version}_${anio()}_${datosCurso.abreviado}`
const cursoAgregadoMemo = createMemo(
() => props.listaCursosUsuario.cursos.find((x) => x.nombre === datosCurso.nombre && !x.oculto) !== undefined,
undefined,
(x, y) => x === y,
)
const tituloMemo = createMemo(() => (cursoAgregadoMemo()
? "Remover de mi horario"
: "Agregar a mi horario"))
const claseMemo = createMemo(() => {
if (props.esCursoMiHorario && datosCurso.oculto) {
return claseCursoOculto
}
return cursoAgregadoMemo()
? claseCursoAgregado
: claseCursoNoAgregado
})
const profesoresTeoria = createMemo(() => agruparProfesores(
datosCurso.Teoria,
Number(indiceCurso),
false,
props.setCursosUsuarios,
))
const profesoresLab = createMemo(() => agruparProfesores(
datosCurso.Laboratorio ?? {},
Number(indiceCurso),
true,
props.setCursosUsuarios,
))
const IndicadorGrupos = (profesor: string, grupos: [string, () => void][], esLab: boolean) => (
<td style={{"padding-bottom": "0.5rem", "padding-right": "0.75rem"}}>
<span>
{profesor}&nbsp;
</span>
<For each={grupos}>
{([x, fnOnClick]) => (
<IndicadorGrupo
nombre={x}
esLab={esLab}
idParcial={idCurso}
tablaObserver={props.tablaObserver}
onClick={fnOnClick}
/>
)
}
</For>
</td>
)
return (
<div className={claseMemo()}>
<button
className={css(e.botonCurso, e.inline, e.lineaTexto, e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
onMouseEnter={() => props.tablaObserver.resaltar(idCurso)}
onMouseLeave={() => props.tablaObserver.quitarResaltado()}
>
{datosCurso.abreviado} - {datosCurso.nombre}
</button>
<table>
<tbody>
<tr>
<For each={Object.entries(profesoresTeoria())}>
{([profesor, grupos]) => IndicadorGrupos(profesor, grupos, false)}
</For>
</tr>
<tr>
<For each={Object.entries(profesoresLab())}>
{([profesor, grupos]) => IndicadorGrupos(profesor, grupos, true)}
</For>
</tr>
</tbody>
</table>
<button
className={css(e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
onClick={() => props.fnAgregarCurso(datosCurso)}
>
{tituloMemo}
</button>
</div>
)
}
export function CursosElem(props: Props) {
const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" "))
const claseCursoNoAgregado = css(
e.contenedorCurso,
estilosGlobales.contenedor,
)
const claseCursoAgregado = css(
e.contenedorCurso,
estilosGlobales.contenedor,
!props.esCursoMiHorario && estilosGlobales.contenedorCursorActivo,
)
const claseCursoOculto = css(e.cursoOculto)
return (
<>
<For each={Object.entries(props.dataAnio)}>
{([indiceCurso, datosCurso]) => {
const idCurso = `${props.version}_${anio()}_${datosCurso.abreviado}`
const cursoAgregadoMemo = createMemo(
() => props.listaCursosUsuario.cursos.find((x) => x.nombre === datosCurso.nombre && !x.oculto) !== undefined,
undefined,
(x, y) => x === y,
)
const tituloMemo = createMemo(() => (cursoAgregadoMemo()
? "Remover de mi horario"
: "Agregar a mi horario"))
const claseMemo = createMemo(() => {
if (props.esCursoMiHorario && datosCurso.oculto) {
return claseCursoOculto
}
return cursoAgregadoMemo()
? claseCursoAgregado
: claseCursoNoAgregado
})
const profesoresTeoria = createMemo(() => agruparProfesores(
datosCurso.Teoria,
Number(indiceCurso),
false,
props.setCursosUsuarios,
))
const profesoresLab = createMemo(() => agruparProfesores(
datosCurso.Laboratorio ?? {},
Number(indiceCurso),
true,
props.setCursosUsuarios,
))
return (
<div className={claseMemo()}>
<button
className={css(e.botonCurso, e.inline, e.lineaTexto, e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
onMouseEnter={() => props.tablaObserver.resaltar(idCurso)}
onMouseLeave={() => props.tablaObserver.quitarResaltado()}
>
{datosCurso.abreviado} - {datosCurso.nombre}
</button>
<table>
<tbody>
<tr>
<For each={Object.entries(profesoresTeoria())}>
{([profesor, grupos]) => (
<td style={{"padding-bottom": "0.5rem", "padding-right": "0.75rem"}}>
<span>
{profesor}&nbsp;
</span>
<For each={grupos}>
{([x, fnOnClick]) => (
<IndicadorGrupo
nombre={x}
esLab={false}
idParcial={idCurso}
tablaObserver={props.tablaObserver}
onClick={fnOnClick}
/>
)
}
</For>
</td>
)}
</For>
</tr>
<tr>
<For each={Object.entries(profesoresLab())}>
{([profesor, grupos]) => (
<td style={{"padding-bottom": "0.5rem", "padding-right": "0.75rem"}}>
<span>
{profesor}&nbsp;
</span>
<For each={grupos}>
{([x, fnOnClick]) => (
<IndicadorGrupo
nombre={x}
esLab
idParcial={idCurso}
tablaObserver={props.tablaObserver}
onClick={fnOnClick}
/>
)
}
</For>
</td>
)}
</For>
</tr>
</tbody>
</table>
<button
className={css(e.botonTexto, estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursorSoft)}
onClick={() => props.fnAgregarCurso(datosCurso)}
>
{tituloMemo}
</button>
</div>
)
}}
{([indiceCurso, datosCurso]) => CursoE(indiceCurso, datosCurso, anio, claseCursoAgregado, props)}
</For>
</>
)

View File

@ -72,6 +72,14 @@ const clasesColores = {
Viernes: css(eColores.viernes),
}
interface DatosProps {
id: string,
txt: string,
esLab: boolean,
datosGrupo: DatosGrupo,
fnSeleccionar: () => void
}
interface Props {
/**
* Informacion de los cursos a renderizar en la celda
@ -82,13 +90,7 @@ interface Props {
*
* esLab - Boolean que indica si el grupo es de laboratorio
*/
datos: {
id: string,
txt: string,
esLab: boolean,
datosGrupo: DatosGrupo,
fnSeleccionar: () => void
}[],
datos: DatosProps[],
fnResaltarFila: () => void,
fnDesresaltarFila: () => void,
dia: Dia,
@ -97,109 +99,111 @@ interface Props {
const claseSeldaSeleccionada = css(e.celdaSeleccionado)
function RenderFila(datos: DatosProps, props: Props) {
const id = datos.id
const txt = datos.txt
const esLab = datos.esLab
const fnSeleccionar = datos.fnSeleccionar
const estadoCeldaMemo = props.tablaObserver.registrarConId(id, datos.datosGrupo)
const [estabaResaltado, setEstabaResaltado] = createSignal(false)
// Limpiar los memos, porque cuando se desmonta la celda esos memos quedan sin efecto
onCleanup(() => {
props.tablaObserver.limpiar(id)
})
const clases = createMemo(
() => {
const clases = [
e.celdaCurso,
esLab ? e.celdaCursoLab : e.celdaCursoTeoria,
]
let adicional = ""
const estadoCelda = estadoCeldaMemo()
switch (estadoCelda) {
case "Normal": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
break
}
case "Oculto": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
clases.push(e.celdaOculto)
break
}
case "Resaltado": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltado)
adicional = clasesColores[props.dia]
break
}
case "Seleccionado": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
clases.push(e.celdaSeleccionado)
break
}
case "ResaltadoOculto": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltadoOculto)
adicional = clasesColores[props.dia]
break
}
case "ResaltadoSeleccionado": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltadoSeleccionado)
adicional = clasesColores[props.dia]
break
}
}
return `${css(...clases)} ${adicional}`
},
undefined,
(x, y) => x === y,
)
return (
<button className={clases()}
onMouseEnter={() => {
props.tablaObserver.resaltar(id)
}}
onMouseLeave={() => {
props.tablaObserver.quitarResaltado()
}}
onClick={fnSeleccionar}
>
{txt}
</button>
)
}
export function CeldaFila(props: Props) {
const datos = props.datos
return (
<div className={css(e.celdaComun, estilosGlobales.inlineBlock)}>
<For each={datos}>
{(datos) => {
const id = datos.id
const txt = datos.txt
const esLab = datos.esLab
const fnSeleccionar = datos.fnSeleccionar
const estadoCeldaMemo = props.tablaObserver.registrarConId(id, datos.datosGrupo)
const [estabaResaltado, setEstabaResaltado] = createSignal(false)
// Limpiar los memos, porque cuando se desmonta la celda esos memos quedan sin efecto
onCleanup(() => {
props.tablaObserver.limpiar(id)
})
const clases = createMemo(
() => {
const clases = [
e.celdaCurso,
esLab ? e.celdaCursoLab : e.celdaCursoTeoria,
]
let adicional = ""
const estadoCelda = estadoCeldaMemo()
switch (estadoCelda) {
case "Normal": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
break
}
case "Oculto": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
clases.push(e.celdaOculto)
break
}
case "Resaltado": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltado)
adicional = clasesColores[props.dia]
break
}
case "Seleccionado": {
if (estabaResaltado()) {
props.fnDesresaltarFila()
setEstabaResaltado(false)
}
clases.push(e.celdaSeleccionado)
break
}
case "ResaltadoOculto": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltadoOculto)
adicional = clasesColores[props.dia]
break
}
case "ResaltadoSeleccionado": {
props.fnResaltarFila()
setEstabaResaltado(true)
clases.push(e.celdaResaltadoSeleccionado)
adicional = clasesColores[props.dia]
break
}
}
return `${css(...clases)} ${adicional}`
},
undefined,
(x, y) => x === y,
)
return (
<button className={clases()}
onMouseEnter={() => {
props.tablaObserver.resaltar(id)
}}
onMouseLeave={() => {
props.tablaObserver.quitarResaltado()
}}
onClick={fnSeleccionar}
>
{txt}
</button>
)
}}
{(datos) => RenderFila(datos, props)}
</For>
</div>
)

View File

@ -132,7 +132,6 @@ export function FilaTabla(props: Props) {
</div>
<For each={dias}>
{(dia) => {
console.log("Renderizar dias")
const diaStr = dia.substring(0, 2)
const horaStr = hora.substring(0, 5)