Skip to content

Commit ff1ceae

Browse files
authored
Merge pull request #174 from CS3219-AY2425S1/enhancement/question-cat-enum
Add Category Enum and Refactor
2 parents c917346 + 2ef5325 commit ff1ceae

35 files changed

+1329
-263
lines changed

frontend/app/auth/auth-context.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import { userServiceUri } from "@/lib/api-uri";
3+
import { userServiceUri } from "@/lib/api/api-uri";
44
import { User, UserSchema } from "@/lib/schemas/user-schema";
55
import { useRouter } from "next/navigation";
66
import {

frontend/components/admin-user-management/admin-edit-user-modal.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import {
1111
import { Button } from "../ui/button";
1212
import { Input } from "../ui/input";
1313
import { Label } from "../ui/label";
14-
import { updateUser } from "@/lib/update-user";
14+
import { updateUser } from "@/lib/api/user-service/update-user";
1515
import { useAuth } from "@/app/auth/auth-context";
1616
import { useToast } from "@/components/hooks/use-toast";
1717
import { Switch } from "../ui/switch";
18-
import { updateUserPrivilege } from "@/lib/update-user-privilege";
18+
import { updateUserPrivilege } from "@/lib/api/user-service/update-user-privilege";
1919
import { User } from "@/lib/schemas/user-schema";
2020

2121
interface AdminEditUserModalProps extends React.HTMLProps<HTMLDivElement> {

frontend/components/admin-user-management/admin-user-management.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import AdminEditUserModal from "@/components/admin-user-management/admin-edit-us
1717
import DeleteAccountModal from "@/components/common/delete-account-modal";
1818
import { PencilIcon, Trash2Icon } from "lucide-react";
1919
import { User, UserArraySchema } from "@/lib/schemas/user-schema";
20-
import { userServiceUri } from "@/lib/api-uri";
20+
import { userServiceUri } from "@/lib/api/api-uri";
2121

2222
const fetcher = async (url: string): Promise<User[]> => {
2323
const token = localStorage.getItem("jwtToken");

frontend/components/auth/reset-password-form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { useState } from "react";
44
import { useRouter } from "next/navigation";
5-
import { resetPassword } from "@/lib/reset-password";
5+
import { resetPassword } from "@/lib/api/user-service/reset-password";
66
import { isPasswordComplex } from "@/lib/password";
77
import { useToast } from "@/components/hooks/use-toast";
88

frontend/components/auth/sign-up-form.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Link from "next/link";
44
import { useState } from "react";
55
import { useRouter } from "next/navigation";
66
import { toast } from "@/components/hooks/use-toast";
7-
import { signUp } from "@/lib/signup";
7+
import { signUp } from "@/lib/api/user-service/signup";
88
import { isPasswordComplex } from "@/lib/password";
99

1010
import { Button } from "@/components/ui/button";

frontend/components/forget-password.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { Label } from "@/components/ui/label";
1515
import { Button } from "@/components/ui/button";
1616
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
1717
import { AlertCircle } from "lucide-react";
18-
import { userServiceUri } from "@/lib/api-uri";
18+
import { userServiceUri } from "@/lib/api/api-uri";
1919

2020
const ForgetPassword: React.FC = () => {
2121
const [email, setEmail] = useState("");

frontend/components/questions/question-filter.tsx

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import {
1212
SelectTrigger,
1313
SelectValue,
1414
} from "@/components/ui/select";
15+
import {
16+
CategoryEnumArray,
17+
ComplexityEnumArray,
18+
} from "@/lib/schemas/question-schema";
1519

1620
interface QuestionFilterProps {
1721
category: string;
@@ -52,13 +56,22 @@ const QuestionFilter: React.FC<QuestionFilterProps> = ({
5256
</div>
5357
<div>
5458
<Label htmlFor="category">Category</Label>
55-
<Input
56-
id="category"
59+
<Select
5760
value={category}
58-
onChange={(e) => onCategoryChange(e.target.value)}
59-
placeholder="Enter category"
60-
className="mt-1"
61-
/>
61+
onValueChange={(value) => onCategoryChange(value)}
62+
>
63+
<SelectTrigger id="category" className="mt-1">
64+
<SelectValue placeholder="Select category" />
65+
</SelectTrigger>
66+
<SelectContent>
67+
<SelectItem value="all">All</SelectItem>
68+
{CategoryEnumArray.map((category) => (
69+
<SelectItem key={category} value={category}>
70+
{category}
71+
</SelectItem>
72+
))}
73+
</SelectContent>
74+
</Select>
6275
</div>
6376
<div>
6477
<Label htmlFor="complexity">Complexity</Label>
@@ -71,9 +84,11 @@ const QuestionFilter: React.FC<QuestionFilterProps> = ({
7184
</SelectTrigger>
7285
<SelectContent>
7386
<SelectItem value="all">All</SelectItem>
74-
<SelectItem value="easy">Easy</SelectItem>
75-
<SelectItem value="medium">Medium</SelectItem>
76-
<SelectItem value="hard">Hard</SelectItem>
87+
{ComplexityEnumArray.map((complexity) => (
88+
<SelectItem key={complexity} value={complexity}>
89+
{complexity}
90+
</SelectItem>
91+
))}
7792
</SelectContent>
7893
</Select>
7994
</div>

frontend/components/questions/question-form-modal.tsx

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
"use client";
22

3-
import { Question } from "@/lib/schemas/question-schema";
3+
import {
4+
CategoryEnum,
5+
CategoryEnumArray,
6+
ComplexityEnum,
7+
ComplexityEnumArray,
8+
Question,
9+
} from "@/lib/schemas/question-schema";
410
import { useEffect, useState } from "react";
511
import { Input } from "@/components/ui/input";
612
import {
@@ -19,6 +25,7 @@ import {
1925
DialogFooter,
2026
DialogHeader,
2127
} from "@/components/ui/dialog";
28+
import { MultiSelect } from "@/components/ui/multi-select";
2229

2330
interface QuestionFormModalProps {
2431
showModal: boolean;
@@ -33,8 +40,8 @@ const QuestionFormModal: React.FC<QuestionFormModalProps> = ({ ...props }) => {
3340
const initialQuestionState: Question = {
3441
id: "",
3542
title: "",
36-
category: "",
37-
complexity: "easy",
43+
categories: [],
44+
complexity: "Easy",
3845
description: "",
3946
};
4047

@@ -89,15 +96,19 @@ const QuestionFormModal: React.FC<QuestionFormModalProps> = ({ ...props }) => {
8996
</DialogHeader>
9097
<div>
9198
<Label>Category</Label>
92-
<Input
93-
id="category"
94-
value={question.category}
99+
<MultiSelect
95100
className="mt-2"
96-
onChange={(e) =>
97-
setQuestion({ ...question, category: e.target.value })
101+
defaultValue={question.categories as string[]}
102+
options={CategoryEnumArray.map((category) => ({
103+
label: category,
104+
value: category,
105+
}))}
106+
onValueChange={(v) =>
107+
setQuestion({
108+
...question,
109+
categories: v as CategoryEnum[],
110+
})
98111
}
99-
disabled={!props.isAdmin}
100-
required
101112
/>
102113
</div>
103114

@@ -107,7 +118,7 @@ const QuestionFormModal: React.FC<QuestionFormModalProps> = ({ ...props }) => {
107118
{props.isAdmin ? (
108119
<Select
109120
value={question.complexity}
110-
onValueChange={(e) =>
121+
onValueChange={(e: ComplexityEnum) =>
111122
setQuestion({ ...question, complexity: e })
112123
}
113124
disabled={!props.isAdmin}
@@ -116,19 +127,18 @@ const QuestionFormModal: React.FC<QuestionFormModalProps> = ({ ...props }) => {
116127
<SelectValue placeholder="Select complexity" />
117128
</SelectTrigger>
118129
<SelectContent>
119-
<SelectItem value="easy">Easy</SelectItem>
120-
<SelectItem value="medium">Medium</SelectItem>
121-
<SelectItem value="hard">Hard</SelectItem>
130+
{ComplexityEnumArray.map((complexity) => (
131+
<SelectItem key={complexity} value={complexity}>
132+
{complexity}
133+
</SelectItem>
134+
))}
122135
</SelectContent>
123136
</Select>
124137
) : (
125138
<Input
126139
id="complexity"
127140
value={question.complexity}
128-
onChange={(e) =>
129-
setQuestion({ ...question, complexity: e.target.value })
130-
}
131-
disabled={!props.isAdmin}
141+
disabled
132142
/>
133143
)}
134144
</div>

0 commit comments

Comments
 (0)