Skip to content

Commit 4436fdf

Browse files
committed
Merge branch 'responsive-filtering' of https://github.com/jkluge/Find-My-Next-Course into responsive-filtering
2 parents dbc3deb + 9b4bf95 commit 4436fdf

9 files changed

Lines changed: 56 additions & 98 deletions

File tree

my-app/firebase.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export function connectToFirebase(model) {
3535
const options = JSON.parse(localStorage.getItem("filterOptions"));
3636
if (options) {
3737
model.setFilterOptions(options);
38-
console.log("Restore options from local storage");
3938
}
4039

4140
reaction(
@@ -241,7 +240,6 @@ export async function uploadDepartmentsAndLocations(departments, locations) {
241240
const departmentsRef = ref(db, "departments");
242241
try {
243242
await set(departmentsRef, departments);
244-
console.log("Uploaded Departments");
245243
} catch (error) {
246244
console.error("Failed to upload departments:", error);
247245
return false;
@@ -251,7 +249,6 @@ export async function uploadDepartmentsAndLocations(departments, locations) {
251249
const locationsRef = ref(db, "locations");
252250
try {
253251
await set(locationsRef, locations);
254-
console.log("Uploaded Locations");
255252
} catch (error) {
256253
console.error("Failed to upload locations:", error);
257254
return false;
@@ -313,7 +310,6 @@ async function loadCoursesFromCacheOrFirebase(model) {
313310
});
314311

315312
if (cachedTimestamp === firebaseTimestamp) {
316-
console.log("Using cached courses from IndexedDB...");
317313
const courseTx = db.transaction("courses", "readonly");
318314
const courseStore = courseTx.objectStore("courses");
319315
const getAllReq = courseStore.getAll();
@@ -329,7 +325,6 @@ async function loadCoursesFromCacheOrFirebase(model) {
329325
}
330326

331327
// fallback: fetch from Firebase
332-
console.log("Fetching courses from Firebase...");
333328
const courses = await fetchAllCourses();
334329
model.setCourses(courses);
335330
saveCoursesToCache(courses, firebaseTimestamp);
@@ -342,7 +337,6 @@ export async function addReviewForCourse(courseCode, review) {
342337
const updateCourseAvgRating = httpsCallable(functions, 'updateCourseAvgRating');
343338
const result = await updateCourseAvgRating({ courseCode });
344339

345-
console.log('Average rating updated:', result.data.avgRating);
346340
} catch (error) {
347341
console.error("Error when adding a course to firebase or updating the average:", error);
348342
}

my-app/src/presenters/FilterPresenter.jsx

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,24 @@ import { SearchbarPresenter } from './SearchbarPresenter.jsx';
66
/* FilterPresenter is responsible for applying the logic necessary to filter out the courses from the overall list */
77
const FilterPresenter = observer(({ model }) => {
88
/* global variable for the scope of this presenter, all the smaller functions depend on it instead of passing it back and forth as params */
9-
var localFilteredCourses = []; //might need to declare out of scope. idk js
9+
var localFilteredCourses = [];
1010

11+
/* functions declared here are generally things the main function of this observer takes and runs if the given filters are enabled,
12+
* this is determined through model.filterOptions.apply*Insert filter name* flags.
13+
* This presenter should be changed such that it uses side-effects instead model.filtersChange flag, since
14+
*/
1115

16+
/* functions */
1217
function applyTranscriptEligibility() {
1318
if (localFilteredCourses.length == 0)
1419
return;
1520

16-
/* */
21+
/* this should be either weak/moderate/strong */
1722
const eligibilitytype = model.filterOptions.eligibility;
1823

24+
/* I am doing this trick in a multitude of filters, essentially the best fitting courses should appear first in the
25+
* list view on the right side, so we just filter for those and at the very end merge them back together into a single array
26+
*/
1927
let strongcourses = [];
2028
let zerocourses = [];
2129
let moderatecourses = [];
@@ -55,6 +63,7 @@ const FilterPresenter = observer(({ model }) => {
5563

5664
});
5765

66+
/* If user selects strong matching he should get all courses which might be strongly fitting (so strong courses and zero/missing prereq courses) */
5867
switch (eligibilitytype) {
5968
case "strong":
6069
{
@@ -73,7 +82,7 @@ const FilterPresenter = observer(({ model }) => {
7382
}
7483
default:
7584
{
76-
console.log("Error: somehow we got into a state where model.eligibility is no \"strong\"/\"moderate\"/\"weak\".");
85+
console.log("Error: somehow we got into a state where model.eligibility is not either \"strong\"/\"moderate\"/\"weak\".");
7786
localFilteredCourses = [];
7887
break;
7988
}
@@ -182,8 +191,6 @@ const FilterPresenter = observer(({ model }) => {
182191
//course?.language.english (true/false/undefined)
183192
//course?.language.swedish (true/false/undefined)
184193

185-
//console.log(data);
186-
187194
switch (languages) {
188195
case "none":
189196
{
@@ -196,8 +203,7 @@ const FilterPresenter = observer(({ model }) => {
196203
try {
197204
return (course?.language?.english === true);
198205
} catch (error) {
199-
console.log(course);
200-
console.log("BIG ERROR", error);
206+
console.log("BIG ERROR", error, course);
201207
return false;
202208
}
203209

@@ -207,8 +213,7 @@ const FilterPresenter = observer(({ model }) => {
207213
try {
208214
return (course?.language === undefined);
209215
} catch (error) {
210-
console.log(course);
211-
console.log("BIG ERROR");
216+
console.log("BIG ERROR", error, course);
212217
return false;
213218
}
214219

@@ -221,8 +226,7 @@ const FilterPresenter = observer(({ model }) => {
221226
try {
222227
return (course?.language?.swedish === true);
223228
} catch (error) {
224-
console.log(course);
225-
console.log("BIG ERROR");
229+
console.log("BIG ERROR", error, course);
226230
return false;
227231
}
228232

@@ -232,8 +236,7 @@ const FilterPresenter = observer(({ model }) => {
232236
try {
233237
return (course?.language === undefined);
234238
} catch (error) {
235-
console.log(course);
236-
console.log("BIG ERROR");
239+
console.log("BIG ERROR", error, course);
237240
return false;
238241
}
239242

@@ -246,8 +249,7 @@ const FilterPresenter = observer(({ model }) => {
246249
try {
247250
return ((course?.language?.english === true) && (course?.language?.swedish === true));
248251
} catch (error) {
249-
console.log(course);
250-
console.log("BIG ERROR");
252+
console.log("BIG ERROR", error, course);
251253
return false;
252254
}
253255

@@ -258,8 +260,7 @@ const FilterPresenter = observer(({ model }) => {
258260
return (((course?.language?.english === true) && (course?.language?.swedish === false))
259261
|| ((course?.language?.english === false) && (course?.language?.swedish === true)));
260262
} catch (error) {
261-
console.log(course);
262-
console.log("BIG ERROR");
263+
console.log("BIG ERROR", error, course);
263264
return false;
264265
}
265266

@@ -269,8 +270,7 @@ const FilterPresenter = observer(({ model }) => {
269270
try {
270271
return (course?.language === undefined);
271272
} catch (error) {
272-
console.log(course);
273-
console.log("BIG ERROR");
273+
console.log("BIG ERROR", error, course);
274274
return false;
275275
}
276276

@@ -293,25 +293,9 @@ const FilterPresenter = observer(({ model }) => {
293293

294294
localFilteredCourses = localFilteredCourses.filter(course => levels.includes(course?.academicLevel));
295295

296-
/*
297-
let levels = model.filterOptions.level;
298-
let stayingCourses = [];
299-
300-
for(let i=0; i<localFilteredCourses.length; i++){
301-
let stay = false;
302-
for(let j=0; j<levels.length; j++){
303-
if(localFilteredCourses[i].academicLevel === levels[j]){
304-
stay = true;
305-
break;
306-
}
307-
}
308-
if(stay) stayingCourses.push(localFilteredCourses[i]);
309-
}
310-
localFilteredCourses = [...stayingCourses];*/
311296
}
312297

313298
function updateDepartments() {
314-
console.log(model.filterOptions.department);
315299
const departments = model.filterOptions.department;
316300
let bestCourses = [];
317301
let worstCourses = [];
@@ -329,7 +313,7 @@ const FilterPresenter = observer(({ model }) => {
329313
try {
330314
return (course?.department === undefined);
331315
} catch (error) {
332-
console.log("BIG ERROR", error);
316+
console.log("BIG ERROR", error, course);
333317
return false;
334318
}
335319

@@ -338,6 +322,10 @@ const FilterPresenter = observer(({ model }) => {
338322
localFilteredCourses = [...bestCourses, ...worstCourses];
339323
}
340324

325+
/* Function that deals with removing the courses that have no properties or have null properties in the categories the user
326+
* using for filtering. The "null" check is a remainder from a version where we didn't use the ?. property accessing yet,
327+
* should be able to be removed without problem in the future.
328+
*/
341329
function updateNoNullcourses(){
342330
let local = [...localFilteredCourses];
343331

@@ -381,6 +369,7 @@ const FilterPresenter = observer(({ model }) => {
381369
localFilteredCourses = [...local];
382370
}
383371

372+
/* function that should run every single time the model changes (see note below) */
384373
async function run() {
385374
if (model.courses.length == 0) {
386375
return;
@@ -416,10 +405,13 @@ const FilterPresenter = observer(({ model }) => {
416405
model.filteredCourses = [...localFilteredCourses];
417406
model.filtersChange = false;
418407
model.setFiltersCalculated();
419-
//console.log("filtered objects number of elements: ", model.filteredCourses.length);
420408
}
421409
}
422410

411+
/* the problem is that unless using sideeffects, the run() not being async and/or it setting the filterschange = false very early can mean
412+
* that 0 courses will get put into the model.filtered courses (which is the list of courses getting passed to search, and then listview)
413+
* therefore TODO: rework it to stop using this dumb flags we started before learning anything about react,observers,js
414+
*/
423415
run();
424416

425417
});

my-app/src/presenters/PrerequisitePresenter.jsx

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ export const PrerequisitePresenter = observer((props) => {
5252
const nodeHeight = 36;
5353

5454
loadTree();
55-
//console.log(initialNodes);
5655

5756
const getLayoutedElements = (nodes, edges, direction = 'LR') => {
5857
const isHorizontal = direction === 'LR';
@@ -242,8 +241,6 @@ export const PrerequisitePresenter = observer((props) => {
242241

243242
if (!Array.isArray(current_object)) { // Is object
244243
let key = Object.keys(current_object)[0];
245-
//console.log("Len: " + current_object[key].length);
246-
//console.log("Type: " + typeof current_object[key]);
247244
if (current_object[key] != null && current_object[key].length == 1 && (typeof current_object[key][0] == "string"
248245
|| (current_object[key][0].length == 1 && typeof current_object[key][0][0] == "string"))) {
249246
prereq_convert(courses_taken, current_object[key], key, previous_node_id);
@@ -286,13 +283,10 @@ export const PrerequisitePresenter = observer((props) => {
286283
if (!started_compressing) {
287284
if (i < current_object.length - 2 && typeof current_object[i + 1] == "string" && typeof current_object[i + 2] == "string") {
288285
let next = current_object[i + 1]; let next_next = current_object[i + 2];
289-
//console.log(next)
290-
//console.log(course_number, next.slice(2), next_next.slice(2))
291286
if (next.slice(0, 2) === course_letters
292287
&& next_next.slice(0, 2) === course_letters && !isNaN(next.slice(2))
293288
&& !isNaN(next_next.slice(2)) && parseInt(next.slice(2)) == course_number + 1
294289
&& parseInt(next_next.slice(2)) == course_number + 2) {
295-
//console.log(course_number, next.slice(2), next_next.slice(2))
296290
current_compresion.push([i, course_letters, course_number]);
297291
current_compresion.push([i + 1, course_letters, course_number + 1]);
298292
current_compresion.push([i + 2, course_letters, course_number + 2]);
@@ -317,7 +311,6 @@ export const PrerequisitePresenter = observer((props) => {
317311
} else {
318312
started_compressing = false;
319313
//refined_course_array.push([i + 1, current_object[i + 1].slice(0, 2), current_object[i + 1].slice(2)]);
320-
//console.log(current_compresion);
321314
refined_course_array.push([-1, "!", current_compresion]);
322315
current_compresion = [];
323316
}
@@ -336,8 +329,6 @@ export const PrerequisitePresenter = observer((props) => {
336329
}
337330

338331
}
339-
//console.log("HERERERERERE!!!")
340-
//console.log(refined_course_array);
341332

342333

343334
for (let i = 0; i < refined_course_array.length; i++) {
@@ -364,8 +355,6 @@ export const PrerequisitePresenter = observer((props) => {
364355
} else if (previous_key == "and" && compressed_done_count == compressed_length) {
365356
course_done = true;
366357
}
367-
//console.log("Compressed:");
368-
//console.log(refined_course_array[i][2]);
369358
course_code = refined_course_array[i][2][0][1] + refined_course_array[i][2][0][2] +
370359
"-" + refined_course_array[i][2][compressed_length - 1][1] + refined_course_array[i][2][compressed_length - 1][2];
371360
input_text = course_code;
@@ -399,9 +388,6 @@ export const PrerequisitePresenter = observer((props) => {
399388
if (typeof current_object == "object" && !Array.isArray(current_object)) {
400389
let key = Object.keys(current_object)[0];
401390
let object_array = current_object[key];
402-
//console.log("DEBUGGING ")
403-
//console.log(current_node)
404-
//console.log(object_array)
405391
let num_of_matches = 0;
406392
for (let i = 0; i < object_array.length; i++) {
407393
if (Array.isArray(object_array[i])) {
@@ -435,15 +421,12 @@ export const PrerequisitePresenter = observer((props) => {
435421
} else if(object_array[i] === true) {num_of_matches++}
436422
}
437423
if (key == "or" && num_of_matches > 0) {
438-
//console.log(current_node)
439424
current_object[key] = true;
440425
if (current_node != null) {
441426
current_node["style"]["backgroundColor"] = "lightgreen";
442427
}
443428
}
444429
else if (key == "and" && num_of_matches == object_array.length) {
445-
//console.log("DEBUGGING 2");
446-
//console.log(num_of_matches, object_array.length)
447430
current_object[key] = true;
448431
if (current_node != null) {
449432
current_node["style"]["backgroundColor"] = "lightgreen";
@@ -458,7 +441,6 @@ export const PrerequisitePresenter = observer((props) => {
458441

459442
function generateTree(courses_taken, prereqs) {
460443
prereq_convert(courses_taken, prereqs, null, props.selectedCourse.code);
461-
//console.log(JSON.stringify(prereqs, null, 4));
462444
let key = Object.keys(prereqs);
463445
if (prereqs[key] === true) {
464446
return true;
@@ -472,7 +454,6 @@ export const PrerequisitePresenter = observer((props) => {
472454

473455
function loadTree() {
474456

475-
//console.log(JSON.stringify(props.selectedCourse.prerequisites, null, 4));
476457
if (!props.selectedCourse?.prerequisites || props.selectedCourse.prerequisites.length == 0) {
477458
let display_node = createNode("No Prerequisites", "No Prerequisites", "default");
478459
display_node.style["pointerEvents"] = "none";

0 commit comments

Comments
 (0)