From b24f969cecef9a69b1d64163369af5fee61cb3dc Mon Sep 17 00:00:00 2001 From: Araozu Date: Fri, 1 Sep 2023 22:50:24 -0500 Subject: [PATCH] [FE] Fetch custom labels from BE. --- backend/sql/schema.sql | 2 +- .../certs/NewRegister/CustomLabelSelect.tsx | 110 ++++++++++++++++++ frontend/src/types/CustomLabel.ts | 4 + frontend/src/utils/allCustomLabels.ts | 19 +++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 frontend/src/certs/NewRegister/CustomLabelSelect.tsx create mode 100644 frontend/src/types/CustomLabel.ts create mode 100644 frontend/src/utils/allCustomLabels.ts diff --git a/backend/sql/schema.sql b/backend/sql/schema.sql index 3779938..85329c3 100644 --- a/backend/sql/schema.sql +++ b/backend/sql/schema.sql @@ -56,7 +56,7 @@ ALTER TABLE register MODIFY COLUMN register_custom_label INTEGER NOT NULL DEFAUL UPDATE register SET register_custom_label = 1; -- Add constraint after all values are set to empty label -ALTER TABLE register CONSTRAINT fk_register_custom_label +ALTER TABLE register ADD CONSTRAINT fk_register_custom_label FOREIGN KEY (register_custom_label) REFERENCES custom_label(custom_label_id); diff --git a/frontend/src/certs/NewRegister/CustomLabelSelect.tsx b/frontend/src/certs/NewRegister/CustomLabelSelect.tsx new file mode 100644 index 0000000..6d4ad25 --- /dev/null +++ b/frontend/src/certs/NewRegister/CustomLabelSelect.tsx @@ -0,0 +1,110 @@ +import { createEffect, createSignal, For, onMount } from "solid-js"; +import { allCourses } from "../../utils/allCourses"; + +export function CustomLabelSelect(props: { + onChange: (id: number | null) => void, + count: number +}) { + const [filter, setFilter] = createSignal(""); + const [selected, setSelected] = createSignal(null); + const [inputValue, setInputValue] = createSignal(""); + + const iHandler = (ev: KeyboardEvent & {currentTarget: HTMLInputElement, target: Element}) => { + const inputEl = ev.target as HTMLInputElement; + // Clear current selection + setSelected(null); + + let filter: string = inputEl.value.toLowerCase(); + filter = filter.replace("á", "a"); + filter = filter.replace("é", "e"); + filter = filter.replace("í", "i"); + filter = filter.replace("ó", "o"); + filter = filter.replace("ú", "u"); + setFilter(filter); + }; + + createEffect(() => { + props.onChange(selected()); + }); + + createEffect(() => { + // Makes reactivity happen, don't remove + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const _count = props.count; + + setFilter(""); + setSelected(null); + setInputValue(""); + }); + + let inputElement: HTMLInputElement | undefined; + + onMount(() => { + inputElement?.addEventListener("keydown", (ev) => { + if (ev.code === "Enter") { + ev.preventDefault(); + } + }); + }); + + + const filteredOptions = () => { + const filterText = filter(); + + return allCourses().filter((course) => { + let courseText = course.course_name.toLowerCase(); + courseText = courseText.replace("á", "a"); + courseText = courseText.replace("é", "e"); + courseText = courseText.replace("í", "i"); + courseText = courseText.replace("ó", "o"); + courseText = courseText.replace("ú", "u"); + + return selected() === null && courseText.indexOf(filterText) !== -1; + }); + }; + + return ( + <> + setInputValue(ev.target.value)} + autocomplete="off" + /> + +
+
+ + {(s) => ( + + )} + +
+ + ); +} diff --git a/frontend/src/types/CustomLabel.ts b/frontend/src/types/CustomLabel.ts new file mode 100644 index 0000000..f3fa01e --- /dev/null +++ b/frontend/src/types/CustomLabel.ts @@ -0,0 +1,4 @@ +export type CustomLabel = { + custom_label_id: number, + custom_label_value: string, +} diff --git a/frontend/src/utils/allCustomLabels.ts b/frontend/src/utils/allCustomLabels.ts new file mode 100644 index 0000000..2f5a2cb --- /dev/null +++ b/frontend/src/utils/allCustomLabels.ts @@ -0,0 +1,19 @@ +import { createSignal } from "solid-js"; +import { CustomLabel } from "../types/CustomLabel"; + +type CustomLabelsMap = {[k: number]: CustomLabel}; + +export const [customLabelsMap, setCustomLabelsMap] = createSignal<{[k: number]: CustomLabel}>({}); + +(() => { + // Get all labels from the API + fetch(`${import.meta.env.VITE_BACKEND_URL}/api/labels`) + .then((res) => res.json()) + .then((data: Array) => { + const map: CustomLabelsMap = {}; + for (const label of data) { + map[label.custom_label_id] = label; + } + setCustomLabelsMap(map); + }); +})();