From 9f0ba418e58c630eaf6d80e640bfc29a430332dd Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Sun, 8 Sep 2024 23:24:27 +0100 Subject: [PATCH] Added filtering and pagination for the assignment creator --- src/dashboards/AssignmentCreator.tsx | 88 ++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/src/dashboards/AssignmentCreator.tsx b/src/dashboards/AssignmentCreator.tsx index fa677f5b..c3bdd792 100644 --- a/src/dashboards/AssignmentCreator.tsx +++ b/src/dashboards/AssignmentCreator.tsx @@ -21,6 +21,7 @@ import Checkbox from "@/components/Low/Checkbox"; import {InstructorGender, Variant} from "@/interfaces/exam"; import Select from "@/components/Low/Select"; import useExams from "@/hooks/useExams"; +import {useListSearch} from "@/hooks/useListSearch"; interface Props { isCreating: boolean; @@ -31,7 +32,12 @@ interface Props { cancelCreation: () => void; } +const SIZE = 12; + export default function AssignmentCreator({isCreating, assignment, user, groups, users, cancelCreation}: Props) { + const [studentsPage, setStudentsPage] = useState(0); + const [teachersPage, setTeachersPage] = useState(0); + const [selectedModules, setSelectedModules] = useState(assignment?.exams.map((e) => e.module) || []); const [assignees, setAssignees] = useState(assignment?.assignees || []); const [teachers, setTeachers] = useState(!!assignment ? assignment.teachers || [] : [...(user.type === "teacher" ? [user.id] : [])]); @@ -69,6 +75,29 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, const userStudents = useMemo(() => users.filter((x) => x.type === "student"), [users]); const userTeachers = useMemo(() => users.filter((x) => x.type === "teacher"), [users]); + const {rows: filteredStudentsRows, renderSearch: renderStudentSearch, text: studentText} = useListSearch([["name"], ["email"]], userStudents); + const {rows: filteredTeachersRows, renderSearch: renderTeacherSearch, text: teacherText} = useListSearch([["name"], ["email"]], userTeachers); + + useEffect(() => setStudentsPage(0), [studentText]); + const studentRows = useMemo( + () => + filteredStudentsRows.slice( + studentsPage * SIZE, + (studentsPage + 1) * SIZE > filteredStudentsRows.length ? filteredStudentsRows.length : (studentsPage + 1) * SIZE, + ), + [filteredStudentsRows, studentsPage], + ); + + useEffect(() => setTeachersPage(0), [teacherText]); + const teacherRows = useMemo( + () => + filteredTeachersRows.slice( + teachersPage * SIZE, + (teachersPage + 1) * SIZE > filteredTeachersRows.length ? filteredTeachersRows.length : (teachersPage + 1) * SIZE, + ), + [filteredTeachersRows, teachersPage], + ); + useEffect(() => { setExamIDs((prev) => prev.filter((x) => selectedModules.includes(x.module))); }, [selectedModules]); @@ -347,9 +376,9 @@ export default function AssignmentCreator({isCreating, assignment, user, groups, )} -
+
Assignees ({assignees.length} selected) -
+
{groups.map((g) => (
+ + {renderStudentSearch()} +
- {userStudents.map((user) => ( + {studentRows.map((user) => (
toggleAssignee(user)} className={clsx( @@ -402,12 +434,32 @@ export default function AssignmentCreator({isCreating, assignment, user, groups,
))}
+
+
+ +
+
+ + {studentsPage * SIZE + 1} -{" "} + {(studentsPage + 1) * SIZE > filteredStudentsRows.length ? filteredStudentsRows.length : (studentsPage + 1) * SIZE} /{" "} + {filteredStudentsRows.length} + + +
+
{user.type !== "teacher" && (
Teachers ({teachers.length} selected) -
+
{groups.map((g) => (
+ + {renderTeacherSearch()} +
- {userTeachers.map((user) => ( + {teacherRows.map((user) => (
toggleTeacher(user)} className={clsx( @@ -453,6 +508,29 @@ export default function AssignmentCreator({isCreating, assignment, user, groups,
))}
+ +
+
+ +
+
+ + {teachersPage * SIZE + 1} -{" "} + {(teachersPage + 1) * SIZE > filteredTeachersRows.length + ? filteredTeachersRows.length + : (teachersPage + 1) * SIZE}{" "} + / {filteredTeachersRows.length} + + +
+
)}