feat: add course term parity validation for course selection in CreateForm and EditForm
This commit is contained in:
parent
c1cee7cd45
commit
5613078c00
@ -73,6 +73,19 @@ type CourseClassAssignment = {
|
|||||||
academic_term_id: number;
|
academic_term_id: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function courseMatchesTermParity(
|
||||||
|
course: Course,
|
||||||
|
term: AcademicTerm | undefined,
|
||||||
|
): boolean {
|
||||||
|
if (!term || course.semester_number === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isOddSemester = course.semester_number % 2 === 1;
|
||||||
|
|
||||||
|
return term.semester === 'odd' ? isOddSemester : !isOddSemester;
|
||||||
|
}
|
||||||
|
|
||||||
function groupCoursesByDepartmentAndSemester(courses: Course[]): CourseGroup[] {
|
function groupCoursesByDepartmentAndSemester(courses: Course[]): CourseGroup[] {
|
||||||
const groups: CourseGroup[] = [];
|
const groups: CourseGroup[] = [];
|
||||||
let currentKey: string | null = null;
|
let currentKey: string | null = null;
|
||||||
@ -324,6 +337,9 @@ function CreateForm({
|
|||||||
const [lecturer, setLecturer] = useState<Lecturer | null>(null);
|
const [lecturer, setLecturer] = useState<Lecturer | null>(null);
|
||||||
const courseAnchor = useComboboxAnchor();
|
const courseAnchor = useComboboxAnchor();
|
||||||
|
|
||||||
|
const selectedTerm = academicTerms.find(
|
||||||
|
(term) => String(term.id) === academicTermId,
|
||||||
|
);
|
||||||
const takenCourseIds = new Set(
|
const takenCourseIds = new Set(
|
||||||
courseClassAssignments
|
courseClassAssignments
|
||||||
.filter((a) => String(a.academic_term_id) === academicTermId)
|
.filter((a) => String(a.academic_term_id) === academicTermId)
|
||||||
@ -331,7 +347,10 @@ function CreateForm({
|
|||||||
);
|
);
|
||||||
const selectedCourseIds = new Set(selectedCourses.map((c) => c.id));
|
const selectedCourseIds = new Set(selectedCourses.map((c) => c.id));
|
||||||
const availableCourses = courses.filter(
|
const availableCourses = courses.filter(
|
||||||
(c) => !takenCourseIds.has(c.id) && !selectedCourseIds.has(c.id),
|
(c) =>
|
||||||
|
!takenCourseIds.has(c.id) &&
|
||||||
|
!selectedCourseIds.has(c.id) &&
|
||||||
|
courseMatchesTermParity(c, selectedTerm),
|
||||||
);
|
);
|
||||||
const courseGroups = groupCoursesByDepartmentAndSemester(availableCourses);
|
const courseGroups = groupCoursesByDepartmentAndSemester(availableCourses);
|
||||||
const selectedDepartmentIds = new Set(
|
const selectedDepartmentIds = new Set(
|
||||||
@ -576,6 +595,9 @@ function EditForm({
|
|||||||
: null,
|
: null,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const selectedTerm = academicTerms.find(
|
||||||
|
(term) => String(term.id) === academicTermId,
|
||||||
|
);
|
||||||
const takenCourseIds = new Set(
|
const takenCourseIds = new Set(
|
||||||
courseClassAssignments
|
courseClassAssignments
|
||||||
.filter(
|
.filter(
|
||||||
@ -585,7 +607,10 @@ function EditForm({
|
|||||||
)
|
)
|
||||||
.map((a) => a.course_id),
|
.map((a) => a.course_id),
|
||||||
);
|
);
|
||||||
const availableCourses = courses.filter((c) => !takenCourseIds.has(c.id));
|
const availableCourses = courses.filter(
|
||||||
|
(c) =>
|
||||||
|
!takenCourseIds.has(c.id) && courseMatchesTermParity(c, selectedTerm),
|
||||||
|
);
|
||||||
const courseGroups = groupCoursesByDepartmentAndSemester(availableCourses);
|
const courseGroups = groupCoursesByDepartmentAndSemester(availableCourses);
|
||||||
const availableLecturers = course
|
const availableLecturers = course
|
||||||
? lecturers.filter((l) =>
|
? lecturers.filter((l) =>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user