feat: add student current semester handling in course registration logic

This commit is contained in:
Yoga Pangestu 2026-09-02 14:38:08 +07:00
parent 9892f60e5e
commit 28a25fabfd
3 changed files with 32 additions and 7 deletions

View File

@ -93,6 +93,7 @@ public function show(Student $student): Response
'submissions' => $submissions,
'semesters' => $semesters->values(),
'openSemesters' => $activeTerm?->open_semesters ?? [],
'studentCurrentSemester' => $student->current_semester,
'hasActiveTerm' => $activeTerm !== null,
'backHref' => $backHref,
'canReview' => $canReview,
@ -114,6 +115,7 @@ public function save(Student $student, string $semester, SaveCourseRegistrationR
$activeTerm->id,
$semesterNumber,
$activeTerm->open_semesters ?? [],
$student->current_semester,
);
$selectedIds = array_values(array_intersect(

View File

@ -159,9 +159,9 @@ public function availableCourseClasses(int $departmentId, int $academicTermId):
* @param array<int, int> $openSemesters
* @return array<int, int>
*/
public function selectableCourseClassIds(int $departmentId, int $academicTermId, ?int $semesterNumber, array $openSemesters): array
public function selectableCourseClassIds(int $departmentId, int $academicTermId, ?int $semesterNumber, array $openSemesters, ?int $studentCurrentSemester): array
{
if ($semesterNumber === null || ! in_array($semesterNumber, $openSemesters, true)) {
if ($semesterNumber === null || $semesterNumber !== $studentCurrentSemester || ! in_array($semesterNumber, $openSemesters, true)) {
return [];
}

View File

@ -48,6 +48,18 @@ const RegistrationStatusVariants: Record<
rejected: 'destructive',
};
function isSemesterOpenForStudent(
semester: number | null,
openSemesters: number[],
studentCurrentSemester: number,
): boolean {
return (
semester !== null &&
semester === studentCurrentSemester &&
openSemesters.includes(semester)
);
}
function InfoRow({ label, value }: { label: string; value: React.ReactNode }) {
return (
<div className="grid grid-cols-[auto_1fr] gap-x-2 text-sm">
@ -516,7 +528,11 @@ function SemesterCard({
}
alt="Tanda tangan mahasiswa"
error={errors.signature}
editable={!isViewOnly && !isLocked}
editable={
isSemesterOpen &&
!isViewOnly &&
!isLocked
}
/>
<p className="font-semibold">
{student?.user?.profile
@ -608,6 +624,7 @@ type Props = {
submissions: Record<string, CourseRegistrationSubmission>;
semesters: (number | null)[];
openSemesters: number[];
studentCurrentSemester: number;
hasActiveTerm: boolean;
backHref: string | null;
canReview: boolean;
@ -619,6 +636,7 @@ export default function CourseRegistrationDetail({
submissions,
semesters,
openSemesters,
studentCurrentSemester,
hasActiveTerm,
backHref,
canReview,
@ -670,8 +688,11 @@ export default function CourseRegistrationDetail({
{semester !== null
? `Semester ${semester}`
: 'Lainnya'}
{!openSemesters.includes(semester ?? -1) &&
' (Ditutup)'}
{!isSemesterOpenForStudent(
semester,
openSemesters,
studentCurrentSemester,
) && ' (Ditutup)'}
</TabsTrigger>
))}
</TabsList>
@ -684,8 +705,10 @@ export default function CourseRegistrationDetail({
semester={currentSemester}
submission={currentSubmission}
studentId={studentId}
isSemesterOpen={openSemesters.includes(
currentSemester ?? -1,
isSemesterOpen={isSemesterOpenForStudent(
currentSemester,
openSemesters,
studentCurrentSemester,
)}
backHref={backHref}
canReview={canReview}