Skip to content

Commit 5a3af3e

Browse files
committed
Merge remote-tracking branch 'origin/main' into cleanup
2 parents ac5e686 + ea9693a commit 5a3af3e

File tree

8 files changed

+130
-107
lines changed

8 files changed

+130
-107
lines changed

my-app/src/index.jsx

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,46 @@
1-
import { configure, makeAutoObservable } from "mobx";
2-
import { createHashRouter, RouterProvider } from "react-router-dom";
3-
import { createRoot } from "react-dom/client";
4-
import { connectToFirebase } from "../firebase";
5-
import { model } from "./model";
6-
import App from "./pages/App.jsx";
7-
import "./styles.css";
8-
9-
import SharedView from "./pages/SharedView.jsx";
10-
import { JsonToDatabase } from "./presenters/Tests/JsonToDatabase";
11-
import { AllCoursesPresenter } from "./presenters/Tests/AllCoursesPresenter.jsx";
12-
13-
configure({ enforceActions: "never" });
14-
15-
const reactiveModel = makeAutoObservable(model);
16-
connectToFirebase(reactiveModel);
17-
18-
export function makeRouter(reactiveModel) {
19-
return createHashRouter([
20-
{
21-
path: "/",
22-
element: <App model={reactiveModel} />,
23-
},
24-
{
25-
path: "/share",
26-
//element: <SharedView />,
27-
element: <SharedView model={reactiveModel} />,
28-
},
29-
{
30-
path: "/button",
31-
element: <JsonToDatabase model={reactiveModel} />,
32-
},
33-
{
34-
path: "/all",
35-
element: <AllCoursesPresenter model={reactiveModel} />,
36-
},
37-
]);
38-
}
39-
40-
createRoot(document.getElementById("root")).render(
41-
<RouterProvider router={makeRouter(reactiveModel)} />
42-
);
43-
44-
window.myModel = reactiveModel;
1+
import { configure, makeAutoObservable } from "mobx";
2+
import { createBrowserRouter, RouterProvider } from "react-router-dom";
3+
import { createRoot } from "react-dom/client";
4+
import { connectToFirebase } from "../firebase";
5+
import { model } from "./model";
6+
import App from "./pages/App.jsx";
7+
import "./styles.css";
8+
9+
import SharedView from "./pages/SharedView.jsx";
10+
import { JsonToDatabase } from "./presenters/Tests/JsonToDatabase";
11+
import { AllCoursesPresenter } from "./presenters/Tests/AllCoursesPresenter.jsx";
12+
13+
14+
configure({ enforceActions: "never" });
15+
16+
const reactiveModel = makeAutoObservable(model);
17+
connectToFirebase(reactiveModel);
18+
19+
export function makeRouter(reactiveModel) {
20+
return createBrowserRouter([
21+
{
22+
path: "/",
23+
element: <App model={reactiveModel} />,
24+
},
25+
{
26+
path: "/share",
27+
//element: <SharedView />,
28+
element: <SharedView model={reactiveModel} />,
29+
},
30+
{
31+
path: "/button",
32+
element: <JsonToDatabase model={reactiveModel} />,
33+
},
34+
{
35+
path: "/all",
36+
element: <AllCoursesPresenter model={reactiveModel} />,
37+
},
38+
39+
]);
40+
}
41+
42+
createRoot(document.getElementById("root")).render(
43+
<RouterProvider router={makeRouter(reactiveModel)} />
44+
);
45+
46+
window.myModel = reactiveModel;

my-app/src/model.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const model = {
1717
departments : [],
1818
locations: [],
1919
favourites: [],
20+
searchHistory:[],
2021
isReady: false,
2122
/* this is a boolean flag showing that filtering options in the UI have changed, triggering the FilterPresenter to recalculate the filteredCourses[] */
2223
filtersChange: false,
@@ -45,6 +46,8 @@ export const model = {
4546
period: [true, true, true, true],
4647
applyPeriodFilter: true
4748
},
49+
isPopupOpen: false,
50+
selectedCourse: null,
4851

4952
setUser(user) {
5053
if (!this.user)
@@ -75,6 +78,13 @@ export const model = {
7578
console.error("Error adding course:", error);
7679
}
7780
},
81+
addHistoryItem(course_id) {
82+
try {
83+
this.searchHistory = [...this.searchHistory, course_id];
84+
} catch (error) {
85+
console.error("Error adding course code to the history:", error);
86+
}
87+
},
7888
setDepartments(departments){
7989
this.departments = departments;
8090
},
@@ -241,6 +251,16 @@ export const model = {
241251
return avgRtg;
242252
},
243253

254+
setPopupOpen(isOpen) {
255+
if (isOpen && this.selectedCourse) {
256+
this.addHistoryItem(this.selectedCourse.code);
257+
}
258+
this.isPopupOpen = isOpen;
259+
},
260+
261+
setSelectedCourse(course) {
262+
this.selectedCourse = course;
263+
},
244264
setSidebarState(state) {
245265
this.sidebarIsOpen = state;
246266
},
@@ -252,7 +272,4 @@ export const model = {
252272
toggleSidebarIsOpen() {
253273
this.sidebarIsOpen = !this.sidebarIsOpen;
254274
}
255-
256-
257-
258275
};

my-app/src/presenters/ListViewPresenter.jsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ const ListViewPresenter = observer(({ model }) => {
7474
model.setScrollPosition(position);
7575
}
7676

77-
const [isPopupOpen, setIsPopupOpen] = useState(false);
78-
const [selectedCourse, setSelectedCourse] = useState(null);
7977
const [sortBy, setSortBy] = useState('relevance');
8078
const [sortDirection, setSortDirection] = useState('desc');
8179
const [sortedCourses, setSortedCourses] = useState([]);
@@ -107,38 +105,33 @@ const ListViewPresenter = observer(({ model }) => {
107105

108106
const preP = <PrerequisitePresenter
109107
model={model}
110-
isPopupOpen={isPopupOpen}
111-
setIsPopupOpen={setIsPopupOpen}
112-
setSelectedCourse={setSelectedCourse}
113-
selectedCourse={selectedCourse} />;
114-
const reviewPresenter = <ReviewPresenter model={model} course={selectedCourse} />;
108+
isPopupOpen={model.isPopupOpen}
109+
setIsPopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
110+
setSelectedCourse={(course) => model.setSelectedCourse(course)}
111+
selectedCourse={model.selectedCourse} />;
112+
const reviewPresenter = <ReviewPresenter model={model} course={model.selectedCourse} />;
115113

116114
const popup = <CoursePagePopup
117115
favouriteCourses={model.favourites}
116+
addHistoryItem={model.addHistoryItem}
118117
addFavourite={addFavourite}
119118
removeFavourite={removeFavourite}
120119
handleFavouriteClick={handleFavouriteClick}
121-
isOpen={isPopupOpen} onClose={() => setIsPopupOpen(false)}
122-
course={selectedCourse}
120+
isOpen={model.isPopupOpen}
121+
onClose={() => model.setPopupOpen(false)}
122+
course={model.selectedCourse}
123123
prerequisiteTree={preP}
124124
reviewPresenter={reviewPresenter}/>
125125

126-
127-
128-
129126
return <ListView
130-
// courses={model.courses}
131-
// searchResults={model.currentSearch}
132-
// currentSearchLenght={model.currentSearch.length}
133-
134127
favouriteCourses={model.favourites}
135128
addFavourite={addFavourite}
136129
removeFavourite={removeFavourite}
137130
handleFavouriteClick={handleFavouriteClick}
138131

139-
isPopupOpen={isPopupOpen}
140-
setIsPopupOpen={setIsPopupOpen}
141-
setSelectedCourse={setSelectedCourse}
132+
isPopupOpen={model.isPopupOpen}
133+
handlePopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
134+
setSelectedCourse={(course) => model.setSelectedCourse(course)}
142135
popup={popup}
143136

144137
targetScroll={model.scrollPosition}

my-app/src/presenters/PrerequisitePresenter.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const PrerequisitePresenter = observer((props) => {
2323
let codeCounter = 0;
2424
let hover_popup = document.createElement("div");
2525
hover_popup.setAttribute("id", "course_popup");
26-
hover_popup.style.fontSize = 0.75 + "rem";
26+
hover_popup.style.fontSize = 1 + "rem";
2727
hover_popup.style.pointerEvents = "none";
2828
hover_popup.style.position = "absolute";
2929
hover_popup.style.backgroundColor = "white";
@@ -111,9 +111,9 @@ export const PrerequisitePresenter = observer((props) => {
111111
const popupHeight = pos.height + 20;
112112
hover_popup.style.minWidth = popupWidth + "px";
113113
hover_popup.style.minHeight = popupHeight + "px";
114-
hover_popup.style.maxWidth = pos.width * 3 + "px";
114+
hover_popup.style.maxWidth = pos.width * 2 + "px";
115115

116-
hover_popup.style.fontSize = window.getComputedStyle(document.querySelector(`[data-id="${node.id}"]`)).fontSize;
116+
//hover_popup.style.fontSize = window.getComputedStyle(document.querySelector(`[data-id="${node.id}"]`)).fontSize;
117117
hover_popup.style.display = "flex";
118118

119119

my-app/src/presenters/SearchbarPresenter.jsx

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Fuse from 'fuse.js'
99
import debounce from 'lodash.debounce';
1010

1111
const SearchbarPresenter = observer(({ model }) => {
12-
1312
const [searchQuery, setSearchQuery] = useState("");
1413

1514
const fuseOptions = {
@@ -62,23 +61,27 @@ const SearchbarPresenter = observer(({ model }) => {
6261
model.setFavourite([]);
6362
}
6463

65-
const [isPopupOpen, setIsPopupOpen] = useState(false);
66-
const [selectedCourse, setSelectedCourse] = useState(null);
67-
const preP = <PrerequisitePresenter model={model} selectedCourse={selectedCourse} />;
68-
const reviewPresenter = <ReviewPresenter model={model} course={selectedCourse} />;
69-
70-
const popup = <CoursePagePopup
71-
favouriteCourses={model.favourites}
72-
addFavourite={addFavourite}
73-
removeFavourite={removeFavourite}
74-
handleFavouriteClick={handleFavouriteClick}
75-
isOpen={isPopupOpen}
76-
onClose={() => setIsPopupOpen(false)}
77-
course={selectedCourse}
78-
reviewPresenter={reviewPresenter}
79-
prerequisiteTree={preP}
64+
const preP = <PrerequisitePresenter
65+
model={model}
66+
selectedCourse={model.selectedCourse}
8067
/>;
81-
68+
const reviewPresenter = <ReviewPresenter
69+
model={model}
70+
course={model.selectedCourse}
71+
/>;
72+
73+
//Popup is displayed only in the list view now, to change the displayed course use model.setSelectedCourse(course)
74+
// const popup = <CoursePagePopup
75+
// favouriteCourses={model.favourites}
76+
// addFavourite={addFavourite}
77+
// removeFavourite={removeFavourite}
78+
// handleFavouriteClick={handleFavouriteClick}
79+
// isOpen={model.isPopupOpen}
80+
// onClose={() => model.setPopupOpen(false)}
81+
// course={model.selectedCourse}
82+
// reviewPresenter={reviewPresenter}
83+
// prerequisiteTree={preP}
84+
// />;
8285

8386
if(model.filtersCalculated){
8487
searchCourses(searchQuery);
@@ -92,12 +95,12 @@ const SearchbarPresenter = observer(({ model }) => {
9295
removeAllFavourites={removeAllFavourites}
9396
addFavourite={addFavourite}
9497
removeFavourite={removeFavourite}
95-
isPopupOpen={isPopupOpen}
96-
setIsPopupOpen={setIsPopupOpen}
97-
setSelectedCourse={setSelectedCourse}
98-
popup={popup}
98+
isPopupOpen={model.isPopupOpen}
99+
setIsPopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
100+
setSelectedCourse={(course) => model.setSelectedCourse(course)}
101+
// popup={popup}
99102
setSearchQuery={setSearchQuery}
100-
searchQuery={searchQuery} // Add this line
103+
searchQuery={searchQuery}
101104
handleFavouriteClick={handleFavouriteClick}
102105
totalCredits={creditsSum(model.favourites)}
103106
resetScrollPosition={resetScoll}

my-app/src/styles.css

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,20 @@
2626
.bm-burger-button {
2727
position: absolute;
2828
width: 36px;
29-
height: 30px;
30-
left: 20px;
31-
top: 20px;
29+
height: 36px;
30+
left: 36px;
31+
top: 36px;
3232
}
3333

34-
35-
.bm-menu-wrap {
36-
position: fixed;
37-
height: 100%;
38-
z-index: 10;
39-
}
34+
/* Hide scrollbars everywhere but allow scrolling */
35+
html, body {
36+
overflow: auto;
37+
scrollbar-width: none; /* Firefox */
38+
-ms-overflow-style: none; /* Internet Explorer 10+ */
39+
}
40+
41+
html::-webkit-scrollbar,
42+
body::-webkit-scrollbar {
43+
display: none; /* Chrome, Safari, Edge */
44+
}
4045

my-app/src/views/Components/CoursePagePopup.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function CoursePagePopup({
3434

3535
useEffect(() => {
3636
const handleKeyDown = (event) => {
37-
if (event.key === 'Escape') {
37+
if (event.key === 'Escape' || event.key === 'ArrowLeft') {
3838
onClose();
3939
}
4040
};

my-app/src/views/ListView.jsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useCallback } from 'react';
22
import { DotPulse, Quantum } from 'ldrs/react';
33
import 'ldrs/react/Quantum.css';
44
import InfiniteScroll from 'react-infinite-scroll-component';
5+
import { useNavigate, Link } from 'react-router-dom';
56

67
function ListView(props) {
78
const [displayedCourses, setDisplayedCourses] = useState([]);
@@ -10,7 +11,8 @@ function ListView(props) {
1011
const [isLoading, setIsLoading] = useState(true);
1112
const [sortBy, setSortBy] = useState('relevance');
1213
const [sortDirection, setSortDirection] = useState('asc');
13-
14+
const navigate = useNavigate();
15+
1416
const toggleReadMore = (courseCode) => {
1517
setReadMore(prevState => ({
1618
...prevState,
@@ -30,7 +32,6 @@ function ListView(props) {
3032
let ret_string = "";
3133
if (periods) {
3234
let keys = Object.keys(periods);
33-
console.log(periods["P1"])
3435
for (let key of keys) {
3536
if (periods[key]) {
3637
ret_string += key + " | ";
@@ -42,9 +43,9 @@ function ListView(props) {
4243
}
4344
};
4445

45-
const handlePeriods2 = (course) => {
46-
return "Test";
47-
}
46+
const handleClickBackArrow = (course_name) => {
47+
navigate(course_name);
48+
};
4849

4950

5051
useEffect(() => {
@@ -157,10 +158,11 @@ function ListView(props) {
157158
initialScrollY={0}
158159
>
159160
{displayedCourses.map(course => (
161+
<Link to={'/?' + course.code}>
160162
<div
161163
onClick={() => {
162164
props.setSelectedCourse(course);
163-
props.setIsPopupOpen(true);
165+
props.handlePopupOpen(true);
164166
}}
165167
key={course.code}
166168
className="p-5 mb-3 hover:bg-blue-100 flex items-center border border-b-black border-solid w-full rounded-lg cursor-pointer"
@@ -243,6 +245,7 @@ function ListView(props) {
243245
</div>
244246
</div>
245247
</div>
248+
</Link>
246249
))}
247250
</InfiniteScroll>
248251
</div>

0 commit comments

Comments
 (0)