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,
|
'submissions' => $submissions,
|
||||||
'semesters' => $semesters->values(),
|
'semesters' => $semesters->values(),
|
||||||
'openSemesters' => $activeTerm?->open_semesters ?? [],
|
'openSemesters' => $activeTerm?->open_semesters ?? [],
|
||||||
|
'studentCurrentSemester' => $student->current_semester,
|
||||||
'hasActiveTerm' => $activeTerm !== null,
|
'hasActiveTerm' => $activeTerm !== null,
|
||||||
'backHref' => $backHref,
|
'backHref' => $backHref,
|
||||||
'canReview' => $canReview,
|
'canReview' => $canReview,
|
||||||
@ -114,6 +115,7 @@ public function save(Student $student, string $semester, SaveCourseRegistrationR
|
|||||||
$activeTerm->id,
|
$activeTerm->id,
|
||||||
$semesterNumber,
|
$semesterNumber,
|
||||||
$activeTerm->open_semesters ?? [],
|
$activeTerm->open_semesters ?? [],
|
||||||
|
$student->current_semester,
|
||||||
);
|
);
|
||||||
|
|
||||||
$selectedIds = array_values(array_intersect(
|
$selectedIds = array_values(array_intersect(
|
||||||
|
|||||||
@ -159,9 +159,9 @@ public function availableCourseClasses(int $departmentId, int $academicTermId):
|
|||||||
* @param array<int, int> $openSemesters
|
* @param array<int, int> $openSemesters
|
||||||
* @return array<int, int>
|
* @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 [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -48,6 +48,18 @@ const RegistrationStatusVariants: Record<
|
|||||||
rejected: 'destructive',
|
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 }) {
|
function InfoRow({ label, value }: { label: string; value: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<div className="grid grid-cols-[auto_1fr] gap-x-2 text-sm">
|
<div className="grid grid-cols-[auto_1fr] gap-x-2 text-sm">
|
||||||
@ -516,7 +528,11 @@ function SemesterCard({
|
|||||||
}
|
}
|
||||||
alt="Tanda tangan mahasiswa"
|
alt="Tanda tangan mahasiswa"
|
||||||
error={errors.signature}
|
error={errors.signature}
|
||||||
editable={!isViewOnly && !isLocked}
|
editable={
|
||||||
|
isSemesterOpen &&
|
||||||
|
!isViewOnly &&
|
||||||
|
!isLocked
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<p className="font-semibold">
|
<p className="font-semibold">
|
||||||
{student?.user?.profile
|
{student?.user?.profile
|
||||||
@ -608,6 +624,7 @@ type Props = {
|
|||||||
submissions: Record<string, CourseRegistrationSubmission>;
|
submissions: Record<string, CourseRegistrationSubmission>;
|
||||||
semesters: (number | null)[];
|
semesters: (number | null)[];
|
||||||
openSemesters: number[];
|
openSemesters: number[];
|
||||||
|
studentCurrentSemester: number;
|
||||||
hasActiveTerm: boolean;
|
hasActiveTerm: boolean;
|
||||||
backHref: string | null;
|
backHref: string | null;
|
||||||
canReview: boolean;
|
canReview: boolean;
|
||||||
@ -619,6 +636,7 @@ export default function CourseRegistrationDetail({
|
|||||||
submissions,
|
submissions,
|
||||||
semesters,
|
semesters,
|
||||||
openSemesters,
|
openSemesters,
|
||||||
|
studentCurrentSemester,
|
||||||
hasActiveTerm,
|
hasActiveTerm,
|
||||||
backHref,
|
backHref,
|
||||||
canReview,
|
canReview,
|
||||||
@ -670,8 +688,11 @@ export default function CourseRegistrationDetail({
|
|||||||
{semester !== null
|
{semester !== null
|
||||||
? `Semester ${semester}`
|
? `Semester ${semester}`
|
||||||
: 'Lainnya'}
|
: 'Lainnya'}
|
||||||
{!openSemesters.includes(semester ?? -1) &&
|
{!isSemesterOpenForStudent(
|
||||||
' (Ditutup)'}
|
semester,
|
||||||
|
openSemesters,
|
||||||
|
studentCurrentSemester,
|
||||||
|
) && ' (Ditutup)'}
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
))}
|
))}
|
||||||
</TabsList>
|
</TabsList>
|
||||||
@ -684,8 +705,10 @@ export default function CourseRegistrationDetail({
|
|||||||
semester={currentSemester}
|
semester={currentSemester}
|
||||||
submission={currentSubmission}
|
submission={currentSubmission}
|
||||||
studentId={studentId}
|
studentId={studentId}
|
||||||
isSemesterOpen={openSemesters.includes(
|
isSemesterOpen={isSemesterOpenForStudent(
|
||||||
currentSemester ?? -1,
|
currentSemester,
|
||||||
|
openSemesters,
|
||||||
|
studentCurrentSemester,
|
||||||
)}
|
)}
|
||||||
backHref={backHref}
|
backHref={backHref}
|
||||||
canReview={canReview}
|
canReview={canReview}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user