Skip to content

Commit 28684bb

Browse files
authored
Merge branch 'main' into prereq-oaktree
2 parents cb246e3 + 12d45a2 commit 28684bb

9 files changed

Lines changed: 483 additions & 166 deletions

File tree

my-app/src/model.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export const model = {
77
//instead of passing searchcouses lambda function down into the searchbarview.
88
/* courses returned from SearchbarPresenter (search is applied on top of filteredCourses[]) to be shown in the ListView */
99
currentSearch: [],
10+
11+
sidebarIsOpen: true,
1012
/* current query text */
1113
currentSearchText: "",
1214
scrollPosition: 0,
@@ -15,6 +17,7 @@ export const model = {
1517
departments : [],
1618
locations: [],
1719
favourites: [],
20+
searchHistory:[],
1821
isReady: false,
1922
/* this is a boolean flag showing that filtering options in the UI have changed, triggering the FilterPresenter to recalculate the filteredCourses[] */
2023
filtersChange: false,
@@ -43,6 +46,8 @@ export const model = {
4346
period: [true, true, true, true],
4447
applyPeriodFilter: true
4548
},
49+
isPopupOpen: false,
50+
selectedCourse: null,
4651

4752
setUser(user) {
4853
if (!this.user)
@@ -73,6 +78,13 @@ export const model = {
7378
console.error("Error adding course:", error);
7479
}
7580
},
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+
},
7688
setDepartments(departments){
7789
this.departments = departments;
7890
},
@@ -238,4 +250,26 @@ export const model = {
238250
// cache the result
239251
return avgRtg;
240252
},
253+
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+
},
264+
setSidebarState(state) {
265+
this.sidebarIsOpen = state;
266+
},
267+
268+
getSidebarState() {
269+
return this.sidebarIsOpen;
270+
},
271+
272+
toggleSidebarIsOpen() {
273+
this.sidebarIsOpen = !this.sidebarIsOpen;
274+
}
241275
};

my-app/src/pages/App.jsx

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,73 +6,71 @@ import { FilterPresenter } from "../presenters/FilterPresenter.jsx";
66
import { Routes, Route } from 'react-router-dom';
77
import SharedView from '../pages/SharedView.jsx';
88
import { slide as Menu } from 'react-burger-menu';
9+
import { observer } from 'mobx-react-lite';
10+
911

10-
function MainAppLayout({ model }) {
11-
const [sidebarIsOpen, setSidebarIsOpen] = useState(true);
1212

13-
const toggleSidebar = () => {
14-
setSidebarIsOpen(!sidebarIsOpen);
15-
}
13+
function MainAppLayout({ model }) {
1614

15+
const [sidebarIsOpen, setSidebarIsOpen] = useState(model.sidebarIsOpen);
1716

1817
return (
1918
/* The sidebar styling(under the menu)*/
2019
<div className=" flex h-screen w-screen bg-[#6246a8] ">
2120
{ /* If sidebar is open, set length to 400px, else it should not be visible */}
2221
<div className={`${sidebarIsOpen ? 'w-[400px]' : 'w-0'}`}>
2322
<Menu
24-
width={400} // menu width
25-
isOpen={sidebarIsOpen}
23+
width={400}
24+
isOpen={model.sidebarIsOpen}
2625
onStateChange={(state) => setSidebarIsOpen(state.isOpen)}
27-
className="bg-gradient-to-t from-[#6246a8] to-[#6747c0] z-0 h-screen" // The menu styling
26+
className="bg-gradient-to-t from-[#6246a8] to-[#6747c0] z-0 h-screen"
2827
noOverlay
2928
styles={{
3029
bmMenuWrap: {
3130
zIndex: '10'
32-
}
31+
},
32+
bmBurgerButton: {
33+
position: 'fixed',
34+
top: '20px',
35+
left: '20px',
36+
width: '36px',
37+
height: '30px'
38+
},
3339
}}
40+
customBurgerIcon={ <img src="https://img.icons8.com/ios-filled/50/ffffff/menu-2.png" /> }
3441
>
35-
{/* The menu contents */}
36-
<SidebarPresenter model={model} />
42+
<SidebarPresenter model={model}/>
3743
</Menu>
3844
</div>
3945

46+
47+
4048
<div className="flex-1 h-full flex flex-col ">
4149

50+
4251
<div className="bg-gradient-to-t from-[#6246a8] to-[#6747c0] text-white">
4352
<div className="flex items-center">
44-
{/* The button to open the menu */}
45-
<button
46-
onClick={toggleSidebar}
47-
className="p-2 ml-2 text-white hover:bg-purple-700 rounded"
48-
>
49-
<img
50-
src="https://img.icons8.com/ios-filled/50/ffffff/menu-2.png"
51-
alt="menu icon"
52-
className="w-6 h-6"
53-
/>
54-
</button>
55-
<SearchbarPresenter model={model} />
53+
<SearchbarPresenter model={model}/>
5654
</div>
5755
</div>
5856

5957

6058
<div className="flex-auto border bg-[#121212] relative">
61-
<ListViewPresenter model={model} />
59+
<ListViewPresenter model={model}/>
6260
</div>
6361

64-
<FilterPresenter model={model} />
62+
<FilterPresenter model={model}/>
6563
</div>
6664
</div>)
6765
}
6866

69-
function App({ model }) {
67+
function App({model}) {
7068
return (
7169
<Routes>
72-
<Route path="/" element={<MainAppLayout model={model} />} />
73-
<Route path="/share" element={<SharedView model={model} />} />
70+
<Route path="/" element={<MainAppLayout model={model}/>}/>
71+
<Route path="/share" element={<SharedView model={model}/>}/>
7472
</Routes>
7573
);
7674
}
7775

78-
export default App;
76+
export default observer(App);

my-app/src/presenters/ListViewPresenter.jsx

Lines changed: 12 additions & 17 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,36 +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-
127126
return <ListView
128-
// courses={model.courses}
129-
// searchResults={model.currentSearch}
130-
// currentSearchLenght={model.currentSearch.length}
131-
132127
favouriteCourses={model.favourites}
133128
addFavourite={addFavourite}
134129
removeFavourite={removeFavourite}
135130
handleFavouriteClick={handleFavouriteClick}
136131

137-
isPopupOpen={isPopupOpen}
138-
setIsPopupOpen={setIsPopupOpen}
139-
setSelectedCourse={setSelectedCourse}
132+
isPopupOpen={model.isPopupOpen}
133+
handlePopupOpen={(isOpen) => model.setPopupOpen(isOpen)}
134+
setSelectedCourse={(course) => model.setSelectedCourse(course)}
140135
popup={popup}
141136

142137
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/styles.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ html, body {
4141
html::-webkit-scrollbar,
4242
body::-webkit-scrollbar {
4343
display: none; /* Chrome, Safari, Edge */
44-
}
44+
}
45+

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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ function ListView(props) {
162162
<div
163163
onClick={() => {
164164
props.setSelectedCourse(course);
165-
props.setIsPopupOpen(true);
166-
//handleClickBackArrow(course.code);
165+
props.handlePopupOpen(true);
167166
}}
168167
key={course.code}
169168
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)