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;
|
||||
};
|
||||
|
||||
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[] {
|
||||
const groups: CourseGroup[] = [];
|
||||
let currentKey: string | null = null;
|
||||
@ -324,6 +337,9 @@ function CreateForm({
|
||||
const [lecturer, setLecturer] = useState<Lecturer | null>(null);
|
||||
const courseAnchor = useComboboxAnchor();
|
||||
|
||||
const selectedTerm = academicTerms.find(
|
||||
(term) => String(term.id) === academicTermId,
|
||||
);
|
||||
const takenCourseIds = new Set(
|
||||
courseClassAssignments
|
||||
.filter((a) => String(a.academic_term_id) === academicTermId)
|
||||
@ -331,7 +347,10 @@ function CreateForm({
|
||||
);
|
||||
const selectedCourseIds = new Set(selectedCourses.map((c) => c.id));
|
||||
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 selectedDepartmentIds = new Set(
|
||||
@ -576,6 +595,9 @@ function EditForm({
|
||||
: null,
|
||||
);
|
||||
|
||||
const selectedTerm = academicTerms.find(
|
||||
(term) => String(term.id) === academicTermId,
|
||||
);
|
||||
const takenCourseIds = new Set(
|
||||
courseClassAssignments
|
||||
.filter(
|
||||
@ -585,7 +607,10 @@ function EditForm({
|
||||
)
|
||||
.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 availableLecturers = course
|
||||
? lecturers.filter((l) =>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user