Cambiar estado del boton al agregar curso a mi horario

This commit is contained in:
Araozu 2021-03-16 13:33:12 -05:00
parent 2b6b6c4134
commit 0ab324d650
6 changed files with 85 additions and 24 deletions

View File

@ -4,6 +4,7 @@ import { Wallpaper } from "./Wallpaper";
import { Show, createSignal } from "solid-js"; import { Show, createSignal } from "solid-js";
import { css } from "aphrodite"; import { css } from "aphrodite";
import { estilosGlobales } from "./Estilos"; import { estilosGlobales } from "./Estilos";
import { Creditos } from "./Creditos";
function App() { function App() {
/// @ts-ignore /// @ts-ignore
@ -34,6 +35,7 @@ function App() {
</Show> </Show>
<div style={{width: "100%", height: "0.5rem"}}/> <div style={{width: "100%", height: "0.5rem"}}/>
<ContenedorHorarios/> <ContenedorHorarios/>
<Creditos/>
</div> </div>
); );
} }

View File

@ -23,8 +23,6 @@ const [cursosUsuario, setCursosUsuarios] = createState<ListaCursosUsuario>({
cursos: [] cursos: []
}); });
const agregarCursoUsuario = (curso: Curso) => { const agregarCursoUsuario = (curso: Curso) => {
if (cursosUsuario.cursos.find(x => x.nombre === curso.nombre)) { if (cursosUsuario.cursos.find(x => x.nombre === curso.nombre)) {
return; return;
@ -100,7 +98,9 @@ export function ContenedorHorarios() {
<Horarios data={datos()!!} <Horarios data={datos()!!}
estadoLayout={estadoLayout()} estadoLayout={estadoLayout()}
setEstadoLayout={setEstadoLayout} setEstadoLayout={setEstadoLayout}
fnAgregarCurso={agregarCursoUsuario}/> fnAgregarCurso={agregarCursoUsuario}
listaCursosUsuario={cursosUsuario}
/>
</Show> </Show>
</div> </div>
</div>; </div>;

View File

@ -1,28 +1,69 @@
import { AnioData, Curso } from "../types/DatosHorario"; import { AnioData, Curso, ListaCursosUsuario } from "../types/DatosHorario";
import { For } from "solid-js"; import { createEffect, createMemo, For } from "solid-js";
import { StyleSheet, css } from "aphrodite"; import { StyleSheet, css } from "aphrodite";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
const e = StyleSheet.create({ const e = StyleSheet.create({
contenedorCurso: { contenedorCurso: {
display: "inline-block", display: "inline-block"
} }
}); });
export function Cursos(props: { dataAnio: AnioData, fnAgregarCurso: (c: Curso) => void }) { interface Props {
return <> dataAnio: AnioData,
<For each={Object.entries(props.dataAnio)}> fnAgregarCurso: (c: Curso) => void,
{([_, datosCurso]) => { listaCursosUsuario: ListaCursosUsuario
return <span title={"Agregar " + datosCurso.abreviado + " a mi horario"} className={css( }
export function Cursos(props: Props) {
const claseCursoNoAgregado = css(
e.contenedorCurso, e.contenedorCurso,
estilosGlobales.contenedor, estilosGlobales.contenedor,
estilosGlobales.contenedorCursor, estilosGlobales.contenedorCursor,
estilosGlobales.contenedorCursorSoft estilosGlobales.contenedorCursorSoft
)} );
const claseCursoAgregado = css(
e.contenedorCurso,
estilosGlobales.contenedor,
estilosGlobales.contenedorCursor,
estilosGlobales.contenedorCursorSoft,
estilosGlobales.contenedorCursorActivo,
);
return <>
<For each={Object.entries(props.dataAnio)}>
{([_, datosCurso]) => {
const cursoAgregadoMemo = createMemo(
() => props.listaCursosUsuario.cursos.find(x => x.nombre === datosCurso.nombre) !== undefined,
undefined,
(x, y) => x === y
);
const tituloMemo = createMemo(() => cursoAgregadoMemo()
? `Remover ${datosCurso.abreviado} de mi horario`
: `Agregar ${datosCurso.abreviado} a mi horario`
);
const claseMemo = createMemo(() =>
cursoAgregadoMemo()
? claseCursoAgregado
: claseCursoNoAgregado
);
const iconoMemo = createMemo(() =>
cursoAgregadoMemo()
? "ph-minus"
: "ph-plus"
);
return <span title={tituloMemo()}
className={claseMemo()}
onClick={() => props.fnAgregarCurso(datosCurso)} onClick={() => props.fnAgregarCurso(datosCurso)}
> >
<i className="ph-plus"/> <i className={iconoMemo()}/>
{datosCurso.abreviado} - {datosCurso.nombre} {datosCurso.abreviado} - {datosCurso.nombre}
</span> </span>
}} }}

View File

@ -1,4 +1,4 @@
import { Curso, DatosHorario } from "../types/DatosHorario"; import { Curso, DatosHorario, ListaCursosUsuario } from "../types/DatosHorario";
import { For, createSignal, createMemo} from "solid-js"; import { For, createSignal, createMemo} from "solid-js";
import { css } from "aphrodite"; import { css } from "aphrodite";
import { estilosGlobales } from "../Estilos"; import { estilosGlobales } from "../Estilos";
@ -12,7 +12,8 @@ interface HorariosProps {
data: DatosHorario, data: DatosHorario,
estadoLayout: EstadoLayout, estadoLayout: EstadoLayout,
setEstadoLayout: (v: EstadoLayout) => EstadoLayout, setEstadoLayout: (v: EstadoLayout) => EstadoLayout,
fnAgregarCurso: (c: Curso) => void fnAgregarCurso: (c: Curso) => void,
listaCursosUsuario: ListaCursosUsuario
} }
export function Horarios(props: HorariosProps) { export function Horarios(props: HorariosProps) {
@ -70,7 +71,11 @@ export function Horarios(props: HorariosProps) {
<Tabla data={dataTabla()} version={props.data.version} anio={anioActual()}/> <Tabla data={dataTabla()} version={props.data.version} anio={anioActual()}/>
</div> </div>
<div> <div>
<Cursos dataAnio={dataTabla()} fnAgregarCurso={props.fnAgregarCurso}/> <Cursos
dataAnio={dataTabla()}
fnAgregarCurso={props.fnAgregarCurso}
listaCursosUsuario={props.listaCursosUsuario}
/>
</div> </div>
</Match> </Match>
<Match when={props.estadoLayout === "MaxPersonal"}> <Match when={props.estadoLayout === "MaxPersonal"}>

View File

@ -58,6 +58,10 @@ export function MiHorario(props: MiHorarioProps) {
const fnMinimizar = () => props.setEstadoLayout("Normal"); const fnMinimizar = () => props.setEstadoLayout("Normal");
const estadoActualLayout = () => props.estadoLayout; const estadoActualLayout = () => props.estadoLayout;
/* TODO: En barra superior colocar todos los horarios. En barra inferior el horario
actual.
Al hacer click en un horario de la barra superior, llevarlo al inicio de la lista.
*/
return <div> return <div>
<Switch> <Switch>
<Match when={props.estadoLayout === "Normal" || props.estadoLayout === "MaxPersonal"}> <Match when={props.estadoLayout === "Normal" || props.estadoLayout === "MaxPersonal"}>
@ -69,12 +73,6 @@ export function MiHorario(props: MiHorarioProps) {
)}> )}>
Mi horario Mi horario
</div> </div>
<div className={css(
estilosGlobales.inlineBlock,
estilosGlobales.contenedor
)}>
Opcion 2
</div>
</div> </div>
<div> <div>

15
src/Creditos.tsx Normal file
View File

@ -0,0 +1,15 @@
import { StyleSheet, css } from "aphrodite";
const e = StyleSheet.create({
creditos: {
textAlign: "center",
paddingTop: "7.5rem",
paddingBottom: "1rem"
}
});
export function Creditos() {
return <div className={css(e.creditos)}>
Desarrollado por Fernando Araoz con TypeScript, JSX y Solid.js.
</div>
}