diff --git a/backend/src/main/java/edu/gcc/hallmonitor/Department.java b/backend/src/main/java/edu/gcc/hallmonitor/Department.java index 1d8fd25..df15fe2 100644 --- a/backend/src/main/java/edu/gcc/hallmonitor/Department.java +++ b/backend/src/main/java/edu/gcc/hallmonitor/Department.java @@ -29,6 +29,8 @@ private static Filter deserialize(JsonNode value) { private static Set possibleValues(List courses) { return courses.stream() .map(Course::department) + // Don't include ZLOAD "courses" + .filter(s -> !s.equals("ZLOAD")) .collect(Collectors.toSet()); } diff --git a/backend/src/main/java/edu/gcc/hallmonitor/ProfName.java b/backend/src/main/java/edu/gcc/hallmonitor/ProfName.java index 6a494e9..5745ec6 100644 --- a/backend/src/main/java/edu/gcc/hallmonitor/ProfName.java +++ b/backend/src/main/java/edu/gcc/hallmonitor/ProfName.java @@ -30,6 +30,12 @@ private static Set possibleValue(List courses) { return courses.stream() .map(Course::professor) .flatMap(List::stream) + // Remove the staff entries + .filter(s -> !s.contains("Staff, -")) + // Remove empty entries + .filter(s -> !s.isEmpty()) + // Strip PhD from names + .map(s -> s.replace("PhD", "").trim()) .collect(Collectors.toSet()); } diff --git a/backend/src/main/java/edu/gcc/hallmonitor/Search.java b/backend/src/main/java/edu/gcc/hallmonitor/Search.java index e6000e5..89e52f8 100644 --- a/backend/src/main/java/edu/gcc/hallmonitor/Search.java +++ b/backend/src/main/java/edu/gcc/hallmonitor/Search.java @@ -25,7 +25,7 @@ public class Search { private List searchResults; private List matchResults; - private static List allCourses; + public static List allCourses; private static HashMap courseMap; static { diff --git a/backend/src/main/java/edu/gcc/hallmonitor/SearchController.java b/backend/src/main/java/edu/gcc/hallmonitor/SearchController.java index 6f02268..450e48d 100644 --- a/backend/src/main/java/edu/gcc/hallmonitor/SearchController.java +++ b/backend/src/main/java/edu/gcc/hallmonitor/SearchController.java @@ -3,6 +3,7 @@ import java.util.stream.Collectors; import io.javalin.Javalin; +import java.util.List; public class SearchController { private static Search search = new Search(); @@ -62,5 +63,13 @@ public static void registerRoutes(Javalin app) { search.removeFilter(f); } }); + + app.get("/search/filter-values/{filter-type}", ctx -> { + List courses = search.getMatchResults(); + if (courses.isEmpty()) { + courses = Search.allCourses; + } + ctx.json(Filter.possibleValues(ctx.pathParam("filter-type"), courses)); + }); } } diff --git a/backend/src/main/java/edu/gcc/hallmonitor/Time.java b/backend/src/main/java/edu/gcc/hallmonitor/Time.java index ae5666a..2eacd96 100644 --- a/backend/src/main/java/edu/gcc/hallmonitor/Time.java +++ b/backend/src/main/java/edu/gcc/hallmonitor/Time.java @@ -52,7 +52,7 @@ private static Set possibleValues(List courses) { .flatMap(List::stream) .map(time -> List.of(time.startTime(), time.endTime())) .flatMap(List::stream) - .map(time -> time.format(DateTimeFormatter.ofPattern("HH:MM"))) + .map(time -> time.format(DateTimeFormatter.ofPattern("HH:mm"))) .forEach(times::add); return times; } diff --git a/frontend/src/SearchPage.tsx b/frontend/src/SearchPage.tsx index af34eeb..4f06a56 100644 --- a/frontend/src/SearchPage.tsx +++ b/frontend/src/SearchPage.tsx @@ -170,42 +170,30 @@ export default function SearchPage() { setTimeEnd(end); }; - - - - - - // --- LOAD COURSES FOR FILTERS --- + // Set the filter options useEffect(() => { - const fetchCourses = async () => { - const res = await fetch('/courses'); - const items: Course[] = await res.json(); - - setDepartments( - Array.from(new Set(items.map(c => c.subject).filter(d => d && d !== 'ZLOAD'))).sort() - ); - - setProfessors( - Array.from( - new Set( - items - .flatMap(c => c.faculty || []) - .filter(p => p && !p.includes('Staff, -') && p !== '-') - .map(p => p.replace(/,?\s*PhD\.?/i, '').trim()) - ) - ).sort() - ); - - setAvailableCredits( - Array.from(new Set(items.map(c => c.credits).filter(c => c != null))).map(String).sort() - ); - - const times = items - .flatMap(c => c.times?.map(t => t.start_time) || []) - .filter(t => t); // remove empty - setAvailableTimes(Array.from(new Set(times)).sort()); + const getValues = async (t: string) => { + const res = await fetch(`/search/filter-values/${t}`); + const list = await res.json(); + return list.sort(); + }; + const updateFilters = async () => { + // Update: + // Departments + setDepartments(await getValues('department')); + // Professors + setProfessors(await getValues('professor')); + // availableTimes + setAvailableTimes(await getValues('timeRange')); + // availableCredits + setAvailableCredits(await getValues('credits')); }; + updateFilters(); + // Only whenever the course list changes + }, [courses]); + // --- LOAD COURSES FOR FILTERS --- + useEffect(() => { const fetchResults = async() => { const res = await fetch("/search/results"); const items = (await res.json()) as Course[]; @@ -223,8 +211,6 @@ export default function SearchPage() { fetchQuery(); - fetchCourses(); - const setFilters = async () => { const resp = await fetch('/search/filter'); for (const filter of await resp.json()) {