Skip to content

Commit d206b9c

Browse files
authored
Merge pull request #84 from stamford-syntax-club/fe/add-term-sec
2 parents 282987b + b5a9f4f commit d206b9c

File tree

9 files changed

+106
-38
lines changed

9 files changed

+106
-38
lines changed

.github/workflows/dev.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ jobs:
3232
node-version: 18
3333

3434
- name: Setup pnpm
35-
uses: pnpm/action-setup@v2.2.2
35+
uses: pnpm/action-setup@v4
3636
with:
37-
version: 8
3837
run_install: false
3938

4039
- name: Install turbo

.github/workflows/test.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ jobs:
1515
uses: actions/checkout@v3
1616

1717
- name: Setup pnpm
18-
uses: pnpm/action-setup@v2.2.2
18+
uses: pnpm/action-setup@v4
1919
with:
20-
version: 8
2120
run_install: false
2221

2322
- name: Install turbo

apps/web/app/courses/[courseCode]/page.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,12 @@ export default function CourseReview({ params }: CourseReviewProps): JSX.Element
167167
<MyReviewCard
168168
key={`my_review_card_${review.id}`}
169169
review={review}
170-
onEditReview={(id, academicYear, description, rating) =>
170+
onEditReview={(id, section, term, academicYear, description, rating) =>
171171
apiClient
172172
.submitEditedReview(
173173
id,
174+
section,
175+
term,
174176
academicYear,
175177
description,
176178
rating,
@@ -218,9 +220,16 @@ export default function CourseReview({ params }: CourseReviewProps): JSX.Element
218220
</Title>
219221
<WriteReviewForm
220222
courseCode={params.courseCode}
221-
onSubmit={(academicYear, description, rating) =>
223+
onSubmit={(section, term, academicYear, description, rating) =>
222224
apiClient
223-
.submitNewReview(academicYear, description, rating, sessionData?.access_token || "")
225+
.submitNewReview(
226+
section,
227+
term,
228+
academicYear,
229+
description,
230+
rating,
231+
sessionData?.access_token || ""
232+
)
224233
.then((result) => {
225234
handleSubmitResponse(result);
226235
return result.color === "green";

apps/web/components/core/application-navbar.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ export const navItems = [
1818
href: "/my-reviews",
1919
icon: <IconHistory />
2020
},
21+
{
22+
label: "Guidelines",
23+
href: "/guidelines",
24+
icon: <IconCheckbox />
25+
},
2126
{
2227
label: "Resources",
2328
href: "https://center.stamford.dev/resources",
2429
newTab: true,
2530
icon: <IconBooks />
26-
},
27-
{
28-
label: "Guidelines",
29-
href: "/guidelines",
30-
icon: <IconCheckbox />
3131
}
3232
];
3333

apps/web/components/ui/review-card.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,14 @@ import WriteReviewForm from "./write-review-form";
2020

2121
interface ReviewCardProps {
2222
review: Review;
23-
onEditReview?: (id: number, academicYear: string, description: string, rating: number) => void;
23+
onEditReview?: (
24+
id: number,
25+
section: string,
26+
term: string,
27+
academicYear: string,
28+
description: string,
29+
rating: number
30+
) => void;
2431
onDeleteReview?: (id: number) => void;
2532
}
2633

@@ -71,7 +78,9 @@ export function ReviewCard({ review }: ReviewCardProps): JSX.Element {
7178
<Flex direction="column" justify="flex-start" ml="3" gap="4" w="100%">
7279
<Rating size="md" value={review.rating} fractions={2} defaultValue={0} readOnly />
7380
<Text fw={800} size="sm">
74-
Academic Year: {review.academicYear}
81+
Academic Year:{" "}
82+
{review.term ? `${review.term}/${review.academicYear}` : `${review.academicYear}`}
83+
{review.section && ` - Section: ${review.section}`}
7584
</Text>
7685
<Spoiler maxHeight={75} showLabel="Show more" hideLabel="Hide">
7786
<TypographyStylesProvider mt="md">
@@ -131,7 +140,9 @@ export function MyReviewCard({ review, onEditReview, onDeleteReview }: ReviewCar
131140

132141
<Rating size="md" value={review.rating} fractions={2} defaultValue={0} readOnly />
133142
<Text fw={800} size="md">
134-
Academic Year: {review.academicYear}
143+
Academic Year:{" "}
144+
{review.term ? `${review.term}/${review.academicYear}` : `${review.academicYear}`}
145+
{review.section && ` - Section: ${review.section}`}
135146
</Text>
136147
<Spoiler maxHeight={75} showLabel="Show more" hideLabel="Hide">
137148
<TypographyStylesProvider mt="sm">
@@ -169,9 +180,9 @@ export function MyReviewCard({ review, onEditReview, onDeleteReview }: ReviewCar
169180
>
170181
{/* Modal content */}
171182
<WriteReviewForm
172-
onSubmit={(academicYear, description, rating) => {
183+
onSubmit={(section, term, academicYear, description, rating) => {
173184
// when user submit their edited review
174-
if (onEditReview) onEditReview(review.id, academicYear, description, rating);
185+
if (onEditReview) onEditReview(review.id, section, term, academicYear, description, rating);
175186
closeEdit();
176187
return Promise.resolve(true);
177188
}}

apps/web/components/ui/write-review-form.tsx

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,15 @@ import { MarkdownEditor } from "@components/ui/markdown-editor";
1010
import type { Review } from "types/reviews";
1111
import Link from "next/link";
1212

13-
const academicYearOptions = [
14-
{ value: "2020", label: "2020" },
15-
{ value: "2021", label: "2021" },
16-
{ value: "2022", label: "2022" },
17-
{ value: "2023", label: "2023" },
18-
{ value: "2024", label: "2024" }
19-
];
20-
2113
interface WriteReviewFormProps {
2214
courseCode?: string;
23-
onSubmit: (academicYear: string, description: string, rating: number) => Promise<boolean>;
15+
onSubmit: (
16+
section: string,
17+
term: string,
18+
academicYear: string,
19+
description: string,
20+
rating: number
21+
) => Promise<boolean>;
2422
previousReview?: Review;
2523
}
2624

@@ -33,7 +31,7 @@ const reviewGuidelines = [
3331
{
3432
text: (
3533
<div>
36-
Kindly refrain from mentioning names and write your reviews with respect.{" "}
34+
Constructive criticism is encouraged.{" "}
3735
<span className="underline">
3836
<Link href="/guidelines" target="_blank">
3937
Click here to learn more
@@ -48,6 +46,8 @@ const reviewGuidelines = [
4846

4947
// Keys for local storage
5048
const reviewFormKeys = (courseCode: string) => ({
49+
sectionKey: `reviewFormSection_${courseCode}`,
50+
termKey: `reviewFormTerm_${courseCode}`,
5151
academicYearKey: `reviewFormAcademicYear_${courseCode}`,
5252
ratingKey: `reviewFormRating_${courseCode}`,
5353
descriptionKey: `reviewFormDescription_${courseCode}`
@@ -57,6 +57,8 @@ export default function WriteReviewForm({ courseCode, onSubmit, previousReview }
5757
const reviewKeys = useMemo(() => reviewFormKeys(courseCode || ""), [courseCode]);
5858
const [academicYear, setAcademicYear] = useState<string | null>(previousReview?.academicYear || null);
5959
const [rating, setRating] = useState(previousReview?.rating || 0);
60+
const [term, setTerm] = useState<string | null>(null);
61+
const [section, setSection] = useState<string | null>(null);
6062

6163
const markdownEditor = useEditor({
6264
extensions: [
@@ -78,10 +80,14 @@ export default function WriteReviewForm({ courseCode, onSubmit, previousReview }
7880

7981
useEffect(() => {
8082
if (!previousReview) {
83+
const savedSection = localStorage.getItem(reviewKeys.sectionKey);
84+
const savedTerm = localStorage.getItem(reviewKeys.termKey);
8185
const savedAcademicYear = localStorage.getItem(reviewKeys.academicYearKey);
8286
const savedRating = localStorage.getItem(reviewKeys.ratingKey);
8387
const savedDescription = localStorage.getItem(reviewKeys.descriptionKey);
8488

89+
if (savedSection) setSection(savedSection);
90+
if (savedTerm) setTerm(savedTerm);
8591
if (savedAcademicYear) setAcademicYear(savedAcademicYear);
8692
if (savedRating) setRating(parseFloat(savedRating));
8793
if (savedDescription && markdownEditor) markdownEditor.commands.setContent(savedDescription);
@@ -91,6 +97,8 @@ export default function WriteReviewForm({ courseCode, onSubmit, previousReview }
9197
useEffect(() => {
9298
if (rating) localStorage.setItem(reviewKeys.ratingKey, rating.toString());
9399
if (academicYear) localStorage.setItem(reviewKeys.academicYearKey, academicYear);
100+
if (section) localStorage.setItem(reviewKeys.sectionKey, section);
101+
if (term) localStorage.setItem(reviewKeys.termKey, term);
94102
if (markdownEditor) {
95103
const saveMarkdown = () => {
96104
localStorage.setItem(reviewKeys.descriptionKey, markdownEditor.storage.markdown.getMarkdown());
@@ -100,29 +108,44 @@ export default function WriteReviewForm({ courseCode, onSubmit, previousReview }
100108
markdownEditor.off("update", saveMarkdown);
101109
};
102110
}
103-
}, [markdownEditor, academicYear, reviewKeys, rating]);
111+
}, [markdownEditor, academicYear, reviewKeys, rating, section, term]);
104112

105113
const handleSubmit = (e: React.FormEvent<HTMLFormElement>): void => {
106114
e.preventDefault();
107115
const currentDescription = markdownEditor?.storage.markdown.getMarkdown() || "";
108116

109-
if (!academicYear || !currentDescription || !rating) {
117+
const missingFields: string[] = [];
118+
const fields = [
119+
{ name: "academicYear", label: "academic year" },
120+
{ name: "currentDescription", label: "review descriptions" },
121+
{ name: "rating", label: "ratings" },
122+
{ name: "section", label: "section" },
123+
{ name: "term", label: "term" }
124+
];
125+
126+
fields.forEach((field) => {
127+
if (!eval(field.name)) {
128+
missingFields.push(field.label);
129+
}
130+
});
131+
132+
if (missingFields.length > 0) {
110133
notifications.show({
111134
title: "Hold on! Your review still contains some missing fields",
112135
color: "red",
113-
message:
114-
"Make sure you have filled all the fields such as academic year, ratings, and review descriptions",
136+
message: `Please fill in the following fields: ${missingFields.join(", ")}`,
115137
autoClose: 5000
116138
});
117139
return;
118140
}
119-
120-
onSubmit(academicYear, currentDescription, rating).then((success) => {
141+
onSubmit(section!!, term!!, academicYear!!, currentDescription, rating).then((success) => {
121142
if (success) {
122143
resetForm();
123144
localStorage.removeItem(reviewKeys.academicYearKey);
124145
localStorage.removeItem(reviewKeys.ratingKey);
125146
localStorage.removeItem(reviewKeys.descriptionKey);
147+
localStorage.removeItem(reviewKeys.termKey);
148+
localStorage.removeItem(reviewKeys.sectionKey);
126149
}
127150
});
128151
};
@@ -139,13 +162,30 @@ export default function WriteReviewForm({ courseCode, onSubmit, previousReview }
139162
))}
140163

141164
<Paper w="100%" h="100%">
142-
<Flex direction="row" gap="sm" my="sm">
165+
<Flex align="end" wrap="wrap" direction="row" gap="xs" my="sm">
166+
<Select
167+
className="w-[100px]"
168+
data={["1", "2", "3", "4", "5"]}
169+
value={section}
170+
label="Section"
171+
onChange={setSection}
172+
placeholder="Section"
173+
/>
174+
<Select
175+
className="w-[100px]"
176+
data={["1", "2", "3"]}
177+
value={term}
178+
label="Term"
179+
onChange={setTerm}
180+
placeholder="Term"
181+
/>
143182
<Select
144-
data={academicYearOptions}
183+
className="w-[100px]"
184+
data={["2021", "2022", "2023", "2024", "2025"]}
145185
value={academicYear}
146-
defaultSearchValue={academicYear || undefined}
186+
label="Year"
147187
onChange={setAcademicYear}
148-
placeholder="Academic year"
188+
placeholder="Year"
149189
/>
150190
<Rating size="lg" defaultValue={0} fractions={2} value={rating} onChange={setRating} />
151191
</Flex>

apps/web/lib/api/api.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ export default class CourseComposeAPIClient {
8282
}
8383

8484
async submitNewReview(
85+
section: string,
86+
term: string,
8587
academicYear: string,
8688
description: string,
8789
rating: number,
@@ -90,6 +92,8 @@ export default class CourseComposeAPIClient {
9092
const data = await fetch(this.reviewEndpoint, {
9193
method: "POST",
9294
body: JSON.stringify({
95+
section: parseInt(section),
96+
term: parseInt(term),
9397
academic_year: parseInt(academicYear),
9498
description,
9599
rating
@@ -143,6 +147,8 @@ export default class CourseComposeAPIClient {
143147

144148
async submitEditedReview(
145149
id: number,
150+
section: string,
151+
term: string,
146152
academicYear: string,
147153
description: string,
148154
rating: number,
@@ -152,6 +158,8 @@ export default class CourseComposeAPIClient {
152158
method: "PUT",
153159
body: JSON.stringify({
154160
id,
161+
section: parseInt(section),
162+
term: parseInt(term),
155163
academic_year: parseInt(academicYear),
156164
description,
157165
rating

apps/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "web",
3-
"version": "1.2.1",
3+
"version": "1.2.2",
44
"private": true,
55
"scripts": {
66
"dev": "next dev --turbo",

apps/web/types/reviews.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ export interface Review {
33
academicYear: string;
44
description: string;
55
isOwner: boolean;
6+
term: number;
7+
section: number;
68
rating: number;
79
status: string;
810
rejectedReason: string;

0 commit comments

Comments
 (0)