diff --git a/frontend/src/certs/NewRegister/ManualRegistration.tsx b/frontend/src/certs/NewRegister/ManualRegistration.tsx index 40ebe44..ee822d9 100644 --- a/frontend/src/certs/NewRegister/ManualRegistration.tsx +++ b/frontend/src/certs/NewRegister/ManualRegistration.tsx @@ -1,9 +1,9 @@ import { JSX, Show, createSignal } from "solid-js"; import { SearchableSelect } from "./SearchableSelect"; import { CustomLabelSelect } from "./CustomLabelSelect"; -import { courseMap } from "../../utils/allCourses"; import { RegistrationPreview } from "."; import { customLabelsMap } from "../../utils/allCustomLabels"; +import { useCourses } from ".."; type HTMLEventFn = JSX.EventHandlerUnion { + if (courses === undefined) { + return false; + } + const courseId = selectedCourseId(); if (courseId === null) { return false; } - const course = courseMap()[courseId]; + const course = courses.idMap()[courseId]; return course?.course_has_custom_label === true; }; diff --git a/frontend/src/certs/NewRegister/RegisterPresets.tsx b/frontend/src/certs/NewRegister/RegisterPresets.tsx index a062acd..decfa2d 100644 --- a/frontend/src/certs/NewRegister/RegisterPresets.tsx +++ b/frontend/src/certs/NewRegister/RegisterPresets.tsx @@ -21,7 +21,7 @@ export function RegisterPresets(props: { return {}; } - const coursesMap = courses.map(); + const coursesMap = courses.nameMap(); const matpel1 = coursesMap["Matpel 1"]; const matpel2 = coursesMap["Matpel 2"]; diff --git a/frontend/src/certs/Registers/RegisterElement.tsx b/frontend/src/certs/Registers/RegisterElement.tsx index 7540316..eeb50d7 100644 --- a/frontend/src/certs/Registers/RegisterElement.tsx +++ b/frontend/src/certs/Registers/RegisterElement.tsx @@ -2,7 +2,6 @@ import { Show, createMemo } from "solid-js"; import { certGenerator } from "../../certGenerator"; import { Person } from "../../types/Person"; import { Register } from "../../types/Register"; -import { courseMap } from "../../utils/allCourses"; import { customLabelsMap } from "../../utils/allCustomLabels"; import { DownloadSimpleIcon } from "../../icons/DownloadSimpleIcon"; import { CaretRight } from "../../icons/CaretRight"; @@ -13,6 +12,8 @@ import QR from "qrcode"; import saveAs from "file-saver"; import { genMatpelCarnet } from "../../carnetGenerator/matpel"; import { genMachineryCarnet } from "../../carnetGenerator/machinery"; +import { useCourses } from ".."; +import { Course } from "../../types/Course"; const carnetEnabled = [ "Matpel 3", @@ -25,6 +26,7 @@ const carnetEnabled = [ ]; export function RegisterElement(props: {register: Register, person: Person, onClick: () => void}) { + const courses = useCourses(); const dateComponents = () => { const [, year, month, day] = /(\d{4})-(\d{2})-(\d{2})/.exec(props.register.register_display_date) ?? []; @@ -37,7 +39,7 @@ export function RegisterElement(props: {register: Register, person: Person, onCl }; const courseName = () => { - const course = courseMap()[props.register.register_course_id]; + const course = courses?.idMap()[props.register.register_course_id]; return course?.course_name ?? "Curso no encontrado"; }; @@ -48,10 +50,15 @@ export function RegisterElement(props: {register: Register, person: Person, onCl }; const genCert = () => { + if (courses === undefined) { + alert("Error. La lista de cursos no esta cargada."); + return; + } + const person = props.person; const register = props.register; - generateCert(person, register); + generateCert(person, register, courses.idMap()); }; const generateable = () => { @@ -157,8 +164,8 @@ export function RegisterElement(props: {register: Register, person: Person, onCl ); } -export function generateCert(person: Person, register: Register) { - const courseN = courseMap()[register.register_course_id]?.course_name ?? "Curso no encontrado"; +export function generateCert(person: Person, register: Register, coursesMap: {[course_id: number]: Course}) { + const courseN = coursesMap[register.register_course_id]?.course_name ?? "Curso no encontrado"; const generator = certGenerator[courseN]; if (generator === undefined) { diff --git a/frontend/src/certs/Registers/RegisterSidebar.tsx b/frontend/src/certs/Registers/RegisterSidebar.tsx index 6f29ead..4ad07a6 100644 --- a/frontend/src/certs/Registers/RegisterSidebar.tsx +++ b/frontend/src/certs/Registers/RegisterSidebar.tsx @@ -1,5 +1,6 @@ +import { createMemo } from "solid-js"; +import { useCourses } from ".."; import { Register } from "../../types/Register"; -import { courseMap } from "../../utils/allCourses"; import { formatDate } from "../../utils/functions"; export function RegisterSidebar(props: { @@ -7,6 +8,8 @@ export function RegisterSidebar(props: { close: () => void, onDelete: () => void, }) { + const courses = useCourses(); + const deleteRegister = async() => { const res = await fetch(`${import.meta.env.VITE_BACKEND_URL}/api/register/${props.register.register_id}`,{ @@ -19,7 +22,7 @@ export function RegisterSidebar(props: { } }; - const courseName = () => courseMap()[props.register.register_course_id]?.course_name ?? ""; + const courseName = createMemo(() => courses?.idMap()[props.register.register_course_id]?.course_name ?? ""); return (
>([]); @@ -14,6 +15,7 @@ export function Registers(props: {person: Person | null, count: number}) { const [sidebarRegister, setSidebarRegister] = createSignal(null); const [loading, setLoading] = createSignal(false); const [error, setError] = createSignal(""); + const courses = useCourses(); const loadRegisters = async() => { setLoading(true); @@ -101,10 +103,10 @@ export function Registers(props: {person: Person | null, count: number}) { const [downButtonBg, setDownButtonBg] = createSignal("bg-c-primary text-c-on-primary"); const downloadTodayCerts = () => { - if (props.person === null) return; + if (props.person === null || courses === undefined) return; todayRegisters().forEach((register) => { - generateCert(props.person!, register); + generateCert(props.person!, register, courses.idMap()); }); setDownButtonBg("bg-c-success text-c-on-success"); diff --git a/frontend/src/certs/index.tsx b/frontend/src/certs/index.tsx index 0183a94..24d35d9 100644 --- a/frontend/src/certs/index.tsx +++ b/frontend/src/certs/index.tsx @@ -53,7 +53,8 @@ export function Certs() { const CoursesContext = createContext<{ data: Resource, - map: () => {[course_name: string]: Course}, + nameMap: () => {[course_name: string]: Course}, + idMap: () => {[course_name: string]: Course}, }>(); function CoursesProvider(props: {courses: Resource, children: JSX.Element}) { @@ -64,7 +65,7 @@ function CoursesProvider(props: {courses: Resource, children: JSX.Elem const data = props.courses(); - type CourseMap = {[k: string]: Course}; + type CourseMap = {[course_name: string]: Course}; const map: CourseMap = {}; for (const course of data) { map[course.course_name] = course; @@ -73,9 +74,26 @@ function CoursesProvider(props: {courses: Resource, children: JSX.Elem return map; }); + const courseIdMapMemo = createMemo(() => { + if (props.courses === undefined || props.courses?.state !== "ready") { + return {}; + } + + const data = props.courses(); + + type CourseMap = {[course_id: number]: Course}; + const map: CourseMap = {}; + for (const course of data) { + map[course.course_id] = course; + } + + return map; + }); + const coursesData = { data: props.courses, - map: courseMapMemo, + nameMap: courseMapMemo, + idMap: courseIdMapMemo, }; return ( diff --git a/frontend/src/utils/allCourses.ts b/frontend/src/utils/allCourses.ts deleted file mode 100644 index 08a7a64..0000000 --- a/frontend/src/utils/allCourses.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Accessor, createMemo, createSignal } from "solid-js"; -import { Course } from "../types/Course"; - -type CourseMap = {[k: number]: Course}; - -const [allCourses, setAllCourses] = createSignal>([]); -export const [courseMap, setCourseMap] = createSignal({}); - -(() => { - // Get all courses from the API - fetch(`${import.meta.env.VITE_BACKEND_URL}/api/course`) - .then((res) => res.json()) - .then((data: Array) => { - setAllCourses(data); - - const map: CourseMap = {}; - for (const course of data) { - map[course.course_id] = course; - } - setCourseMap(map); - }); -})(); - -export function getCourseMemo(name: string): Accessor { - return createMemo(() => { - const course = allCourses().find((course) => course.course_name === name); - if (course) { - return course; - } - return null; - }); -} -