Agregar funcionalidad para agregar cursos a Mi Horario
This commit is contained in:
parent
8d36e54a5b
commit
34a3402388
@ -2,9 +2,9 @@ import YAML from "yaml";
|
|||||||
import { StyleSheet, css } from "aphrodite";
|
import { StyleSheet, css } from "aphrodite";
|
||||||
import { MiHorario } from "./MiHorario";
|
import { MiHorario } from "./MiHorario";
|
||||||
import { Horarios } from "./Horarios";
|
import { Horarios } from "./Horarios";
|
||||||
import { DatosHorario } from "../types/DatosHorario";
|
import { Curso, CursoUsuario, DatosHorario, DatosVarianteUsuario, ListaCursosUsuario } from "../types/DatosHorario";
|
||||||
import { estilosGlobales } from "../Estilos";
|
import { estilosGlobales } from "../Estilos";
|
||||||
import { Show, createSignal, createEffect, createMemo, batch } from "solid-js";
|
import { Show, createSignal, createEffect, createMemo, batch, createState } from "solid-js";
|
||||||
|
|
||||||
const datosPromise = (async () => {
|
const datosPromise = (async () => {
|
||||||
const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml");
|
const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml");
|
||||||
@ -19,6 +19,37 @@ const ElemCargando = () =>
|
|||||||
|
|
||||||
export type EstadoLayout = "MaxPersonal" | "Normal" | "MaxHorarios";
|
export type EstadoLayout = "MaxPersonal" | "Normal" | "MaxHorarios";
|
||||||
|
|
||||||
|
const [cursosUsuario, setCursosUsuarios] = createState<ListaCursosUsuario>({
|
||||||
|
cursos: []
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const agregarCursoUsuario = (curso: Curso) => {
|
||||||
|
if (cursosUsuario.cursos.find(x => x.nombre === curso.nombre)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const gruposTeoria: { [k: string]: DatosVarianteUsuario } = {};
|
||||||
|
for (const [key, data] of Object.entries(curso.Teoria)) {
|
||||||
|
gruposTeoria[key] = Object.assign({seleccionado: false}, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const gruposLab: { [k: string]: DatosVarianteUsuario } = {};
|
||||||
|
for (const [key, data] of Object.entries(curso.Laboratorio ?? {})) {
|
||||||
|
gruposLab[key] = Object.assign({seleccionado: false}, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cursoUsuario: CursoUsuario = {
|
||||||
|
...curso,
|
||||||
|
oculto: false,
|
||||||
|
Teoria: gruposTeoria,
|
||||||
|
Laboratorio: gruposLab
|
||||||
|
};
|
||||||
|
|
||||||
|
setCursosUsuarios("cursos", a => [...a, cursoUsuario]);
|
||||||
|
};
|
||||||
|
|
||||||
export function ContenedorHorarios() {
|
export function ContenedorHorarios() {
|
||||||
const [datosCargados, setDatosCargados] = createSignal(false);
|
const [datosCargados, setDatosCargados] = createSignal(false);
|
||||||
const [datos, setDatos] = createSignal<DatosHorario | null>(null);
|
const [datos, setDatos] = createSignal<DatosHorario | null>(null);
|
||||||
@ -62,11 +93,14 @@ export function ContenedorHorarios() {
|
|||||||
|
|
||||||
return <div className={css(e().contenedor)}>
|
return <div className={css(e().contenedor)}>
|
||||||
<div>
|
<div>
|
||||||
<MiHorario estadoLayout={estadoLayout()} setEstadoLayout={setEstadoLayout}/>
|
<MiHorario estadoLayout={estadoLayout()} setEstadoLayout={setEstadoLayout} cursosUsuario={cursosUsuario}/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<Show when={datosCargados()}>
|
<Show when={datosCargados()}>
|
||||||
<Horarios data={datos()!!} estadoLayout={estadoLayout()} setEstadoLayout={setEstadoLayout}/>
|
<Horarios data={datos()!!}
|
||||||
|
estadoLayout={estadoLayout()}
|
||||||
|
setEstadoLayout={setEstadoLayout}
|
||||||
|
fnAgregarCurso={agregarCursoUsuario}/>
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>;
|
</div>;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { AnioData } from "../types/DatosHorario";
|
import { AnioData, Curso } from "../types/DatosHorario";
|
||||||
import { For } from "solid-js";
|
import { For } from "solid-js";
|
||||||
import { StyleSheet, css } from "aphrodite";
|
import { StyleSheet, css } from "aphrodite";
|
||||||
import { estilosGlobales } from "../Estilos";
|
import { estilosGlobales } from "../Estilos";
|
||||||
@ -10,7 +10,7 @@ const e = StyleSheet.create({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export function Cursos(props: { dataAnio: AnioData }) {
|
export function Cursos(props: { dataAnio: AnioData, fnAgregarCurso: (c: Curso) => void }) {
|
||||||
return <>
|
return <>
|
||||||
<For each={Object.entries(props.dataAnio)}>
|
<For each={Object.entries(props.dataAnio)}>
|
||||||
{([_, datosCurso]) => {
|
{([_, datosCurso]) => {
|
||||||
@ -20,6 +20,7 @@ export function Cursos(props: { dataAnio: AnioData }) {
|
|||||||
estilosGlobales.contenedorCursor,
|
estilosGlobales.contenedorCursor,
|
||||||
estilosGlobales.contenedorCursorSoft
|
estilosGlobales.contenedorCursorSoft
|
||||||
)}
|
)}
|
||||||
|
onClick={() => props.fnAgregarCurso(datosCurso)}
|
||||||
>
|
>
|
||||||
<i className="ph-plus"/>
|
<i className="ph-plus"/>
|
||||||
{datosCurso.abreviado} - {datosCurso.nombre}
|
{datosCurso.abreviado} - {datosCurso.nombre}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { DatosHorario } from "../types/DatosHorario";
|
import { Curso, DatosHorario } 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";
|
||||||
import { Tabla } from "./Tabla";
|
import { Tabla } from "./Tabla";
|
||||||
@ -11,7 +11,8 @@ import { Switch, Match } from "solid-js";
|
|||||||
interface HorariosProps {
|
interface HorariosProps {
|
||||||
data: DatosHorario,
|
data: DatosHorario,
|
||||||
estadoLayout: EstadoLayout,
|
estadoLayout: EstadoLayout,
|
||||||
setEstadoLayout: (v: EstadoLayout) => EstadoLayout
|
setEstadoLayout: (v: EstadoLayout) => EstadoLayout,
|
||||||
|
fnAgregarCurso: (c: Curso) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Horarios(props: HorariosProps) {
|
export function Horarios(props: HorariosProps) {
|
||||||
@ -61,7 +62,7 @@ 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()}/>
|
<Cursos dataAnio={dataTabla()} fnAgregarCurso={props.fnAgregarCurso}/>
|
||||||
</div>
|
</div>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.estadoLayout === "MaxPersonal"}>
|
<Match when={props.estadoLayout === "MaxPersonal"}>
|
||||||
|
@ -3,26 +3,49 @@ import { StyleSheet, css } from "aphrodite";
|
|||||||
import { Tabla } from "./Tabla";
|
import { Tabla } from "./Tabla";
|
||||||
import { mostrarDescansos } from "../Store";
|
import { mostrarDescansos } from "../Store";
|
||||||
import { EstadoLayout } from "./ContenedorHorarios";
|
import { EstadoLayout } from "./ContenedorHorarios";
|
||||||
import { Switch, Match } from "solid-js";
|
import { Switch, Match, For, createMemo } from "solid-js";
|
||||||
import { BotonMaxMin } from "./BotonMaxMin";
|
import { BotonMaxMin } from "./BotonMaxMin";
|
||||||
|
import { AnioData, ListaCursosUsuario } from "../types/DatosHorario";
|
||||||
|
|
||||||
interface MiHorarioProps {
|
interface MiHorarioProps {
|
||||||
estadoLayout: EstadoLayout,
|
estadoLayout: EstadoLayout,
|
||||||
setEstadoLayout: (v: EstadoLayout) => EstadoLayout
|
setEstadoLayout: (v: EstadoLayout) => EstadoLayout,
|
||||||
|
cursosUsuario: ListaCursosUsuario
|
||||||
}
|
}
|
||||||
|
|
||||||
export function MiHorario(props: MiHorarioProps) {
|
function Horario(props: { cursosUsuario: ListaCursosUsuario }) {
|
||||||
const e = StyleSheet.create({
|
return <div>
|
||||||
horario: {},
|
<For each={props.cursosUsuario.cursos}>
|
||||||
boton: {
|
{c => {
|
||||||
textDecoration: "none",
|
return <div>
|
||||||
// paddingRight: "0.5rem",
|
<p>{c.abreviado} - {c.nombre}</p>
|
||||||
"::before": {
|
</div>
|
||||||
fontSize: "1rem",
|
}}
|
||||||
// transform: "translateY(0.2rem)",
|
</For>
|
||||||
textDecoration: "none"
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const e = StyleSheet.create({
|
||||||
|
horario: {},
|
||||||
|
boton: {
|
||||||
|
textDecoration: "none",
|
||||||
|
// paddingRight: "0.5rem",
|
||||||
|
"::before": {
|
||||||
|
fontSize: "1rem",
|
||||||
|
// transform: "translateY(0.2rem)",
|
||||||
|
textDecoration: "none"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export function MiHorario(props: MiHorarioProps) {
|
||||||
|
|
||||||
|
const datosMiHorario = createMemo(() => {
|
||||||
|
const obj: AnioData = {};
|
||||||
|
props.cursosUsuario.cursos.forEach(x => {
|
||||||
|
obj[x.nombre] = {...x};
|
||||||
|
});
|
||||||
|
return obj;
|
||||||
});
|
});
|
||||||
|
|
||||||
const claseBotonMostrarDescansos = () =>
|
const claseBotonMostrarDescansos = () =>
|
||||||
@ -51,28 +74,16 @@ export function MiHorario(props: MiHorarioProps) {
|
|||||||
estadoActualLayout={estadoActualLayout}
|
estadoActualLayout={estadoActualLayout}
|
||||||
estadoLayoutMax={"MaxPersonal"}
|
estadoLayoutMax={"MaxPersonal"}
|
||||||
/>
|
/>
|
||||||
{/*
|
|
||||||
<div
|
|
||||||
className={css(
|
|
||||||
estilosGlobales.inlineBlock,
|
|
||||||
estilosGlobales.contenedor,
|
|
||||||
estilosGlobales.contenedorCursor,
|
|
||||||
estilosGlobales.contenedorCursorSoft
|
|
||||||
)}
|
|
||||||
onClick={() => setMostrarDescansos(!mostrarDescansos())}
|
|
||||||
>
|
|
||||||
<i className={claseBotonMostrarDescansos()}/>
|
|
||||||
Mostrar descansos
|
|
||||||
</div>
|
|
||||||
*/}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div className={css(
|
<div className={css(
|
||||||
e.horario,
|
e.horario,
|
||||||
estilosGlobales.contenedor
|
estilosGlobales.contenedor
|
||||||
)}>
|
)}>
|
||||||
<Tabla data={{}} anio={"Mi horario"} version={1}/>
|
<Tabla data={datosMiHorario()} anio={"Mi horario"} version={1}/>
|
||||||
|
|
||||||
|
<Horario cursosUsuario={props.cursosUsuario}/>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.estadoLayout === "MaxHorarios"}>
|
<Match when={props.estadoLayout === "MaxHorarios"}>
|
||||||
|
@ -149,10 +149,11 @@ export function Tabla(props: { data: AnioData, anio: string, version: number })
|
|||||||
const [idHover, setIdHover] = createSignal("");
|
const [idHover, setIdHover] = createSignal("");
|
||||||
|
|
||||||
const celdas = createMemo(() => {
|
const celdas = createMemo(() => {
|
||||||
console.log("Renderizar tabla", props.anio);
|
// Hace reaccionar a la reactividad de Solid
|
||||||
|
props.data;
|
||||||
return <For each={horas}>
|
return <For each={horas}>
|
||||||
{hora => {
|
{hora => {
|
||||||
return <FilaTabla data={data} hora={hora} idHover={idHover} setIdHover={setIdHover}/>
|
return <FilaTabla data={data()} hora={hora} idHover={idHover} setIdHover={setIdHover}/>
|
||||||
}}
|
}}
|
||||||
</For>
|
</For>
|
||||||
});
|
});
|
||||||
|
@ -62,7 +62,7 @@ const [diasResaltados, setDiasResaltados] = createState({
|
|||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
hora: string,
|
hora: string,
|
||||||
data: () => DataProcesada,
|
data: DataProcesada,
|
||||||
idHover: () => string,
|
idHover: () => string,
|
||||||
setIdHover: (v: string) => string
|
setIdHover: (v: string) => string
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ export function FilaTabla(props: Props) {
|
|||||||
const diaStr = dia.substring(0, 2);
|
const diaStr = dia.substring(0, 2);
|
||||||
const horaStr = hora.substring(0, 5);
|
const horaStr = hora.substring(0, 5);
|
||||||
|
|
||||||
const datos = data()?.[horaStr]?.[diaStr] ?? [];
|
const datos = data?.[horaStr]?.[diaStr] ?? [];
|
||||||
|
|
||||||
return <CeldaFila
|
return <CeldaFila
|
||||||
datos={datos}
|
datos={datos}
|
||||||
|
@ -1,20 +1,37 @@
|
|||||||
|
export interface DatosVariante {
|
||||||
|
Docente: string,
|
||||||
|
Horas: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DatosVarianteUsuario extends DatosVariante {
|
||||||
|
seleccionado: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export interface Curso {
|
export interface Curso {
|
||||||
nombre: string,
|
nombre: string,
|
||||||
abreviado: string,
|
abreviado: string,
|
||||||
Teoria: {
|
Teoria: {
|
||||||
[grupo: string]: {
|
[grupo: string]: DatosVariante
|
||||||
Docente: string,
|
|
||||||
Horas: string[]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Laboratorio?: {
|
Laboratorio?: {
|
||||||
[grupo: string]: {
|
[grupo: string]: DatosVariante
|
||||||
Docente: string,
|
|
||||||
Horas: string[]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CursoUsuario extends Curso {
|
||||||
|
oculto: boolean,
|
||||||
|
Teoria: {
|
||||||
|
[grupo: string]: DatosVarianteUsuario
|
||||||
|
}
|
||||||
|
Laboratorio?: {
|
||||||
|
[grupo: string]: DatosVarianteUsuario
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ListaCursosUsuario {
|
||||||
|
cursos: CursoUsuario[]
|
||||||
|
}
|
||||||
|
|
||||||
export interface AnioData {
|
export interface AnioData {
|
||||||
[nombre: string]: Curso
|
[nombre: string]: Curso
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user