feat: add student current semester handling in course registration logic
This commit is contained in:
parent
9892f60e5e
commit
28a25fabfd
@ -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(
|
||||
|
||||
@ -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 [];
|
||||
}
|
||||
|
||||
|
||||
@ -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}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user