Skip to content

Commit 12d45a2

Browse files
authored
Fixes and sorting (#116)
* fixed summation after long fight with git :! * sorting kinda works - some problems exist * fixed search + filter interaction * sorting is better now / Metallic Materials are the only issue * asc/desc have correct icon now * added favicon * fixed the website name in index.html * ArrowLeft closes the CoursePopup * popup variables moved to the model * popup variables moved to the model --------- Co-authored-by: Kacper Lisik <lisik@kth.se>
1 parent 8f24619 commit 12d45a2

5 files changed

Lines changed: 60 additions & 47 deletions

File tree

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/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/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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function ListView(props) {
3030
let ret_string = "";
3131
if (periods) {
3232
let keys = Object.keys(periods);
33-
console.log(periods["P1"])
33+
// console.log(periods["P1"])
3434
for (let key of keys) {
3535
if (periods[key]) {
3636
ret_string += key + " | ";
@@ -160,7 +160,7 @@ function ListView(props) {
160160
<div
161161
onClick={() => {
162162
props.setSelectedCourse(course);
163-
props.setIsPopupOpen(true);
163+
props.handlePopupOpen(true);
164164
}}
165165
key={course.code}
166166
className="p-5 mb-3 hover:bg-blue-100 flex items-center border border-b-black border-solid w-full rounded-lg cursor-pointer"

0 commit comments

Comments
 (0)