feat: add course term parity validation for course selection in CreateForm and EditForm

This commit is contained in:
Yoga Pangestu 2026-09-02 17:41:35 +07:00
parent c1cee7cd45
commit 5613078c00

View File

@ -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) =>