From 0d27a9e70698bad7c79226cf91bd19b68d5ffa7f Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 2 Sep 2026 16:45:59 +0700 Subject: [PATCH] feat: remove ClassEnrollmentRequest and related enrollment logic, simplifying class enrollment management --- .../Manage/ClassEnrollmentController.php | 9 - .../Admin/Manage/ClassEnrollmentRequest.php | 29 ---- .../Admin/Manage/ClassEnrollmentService.php | 20 --- .../manage/course-classes/enrollments.tsx | 157 +----------------- routes/admin.php | 1 - 5 files changed, 4 insertions(+), 212 deletions(-) delete mode 100644 app/Http/Requests/Admin/Manage/ClassEnrollmentRequest.php diff --git a/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php b/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php index c473665..0483695 100644 --- a/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php +++ b/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin\Manage; use App\Http\Controllers\Controller; -use App\Http\Requests\Admin\Manage\ClassEnrollmentRequest; use App\Models\ClassEnrollment; use App\Models\CourseClass; use App\Services\Admin\Manage\ClassEnrollmentService; @@ -24,17 +23,9 @@ public function index(CourseClass $courseClass): Response return Inertia::render('admin/manage/course-classes/enrollments', [ 'courseClass' => $courseClass, 'enrollments' => $this->service->forClass($courseClass), - 'availableStudents' => $this->service->availableStudents($courseClass), ]); } - public function store(ClassEnrollmentRequest $request, CourseClass $courseClass): RedirectResponse - { - $this->service->enrollMany($courseClass, $request->validated('student_ids')); - - return Inertia::flash('toast', ['type' => 'success', 'message' => 'Mahasiswa berhasil ditambahkan ke kelas.'])->back(); - } - public function destroy(CourseClass $courseClass, ClassEnrollment $enrollment): RedirectResponse { $this->service->unenroll($enrollment); diff --git a/app/Http/Requests/Admin/Manage/ClassEnrollmentRequest.php b/app/Http/Requests/Admin/Manage/ClassEnrollmentRequest.php deleted file mode 100644 index 42a7cc7..0000000 --- a/app/Http/Requests/Admin/Manage/ClassEnrollmentRequest.php +++ /dev/null @@ -1,29 +0,0 @@ -user()->can('create-course-class-enrollments'); - } - - public function rules(): array - { - $courseClass = $this->route('course_class'); - $departmentId = $courseClass->course->department_id; - - return [ - 'student_ids' => ['required', 'array', 'min:1'], - 'student_ids.*' => [ - 'integer', - Rule::exists('students', 'id')->where('department_id', $departmentId), - Rule::unique('class_enrollments', 'student_id')->where('course_class_id', $courseClass->id), - ], - ]; - } -} diff --git a/app/Services/Admin/Manage/ClassEnrollmentService.php b/app/Services/Admin/Manage/ClassEnrollmentService.php index 3f22136..fc9b7c3 100644 --- a/app/Services/Admin/Manage/ClassEnrollmentService.php +++ b/app/Services/Admin/Manage/ClassEnrollmentService.php @@ -4,7 +4,6 @@ use App\Models\ClassEnrollment; use App\Models\CourseClass; -use App\Models\Student; use Illuminate\Database\Eloquent\Collection; class ClassEnrollmentService @@ -17,25 +16,6 @@ public function forClass(CourseClass $courseClass): Collection ->get(); } - public function availableStudents(CourseClass $courseClass): Collection - { - return Student::query() - ->where('department_id', $courseClass->course->department_id) - ->whereDoesntHave('enrollments', fn ($q) => $q->where('course_class_id', $courseClass->id)) - ->with(['user.profile', 'department']) - ->get(); - } - - public function enrollMany(CourseClass $courseClass, array $studentIds): void - { - foreach ($studentIds as $studentId) { - $courseClass->enrollments()->firstOrCreate( - ['student_id' => $studentId], - ['enrolled_at' => now()], - ); - } - } - public function unenroll(ClassEnrollment $enrollment): bool { return $enrollment->delete(); diff --git a/resources/js/pages/admin/manage/course-classes/enrollments.tsx b/resources/js/pages/admin/manage/course-classes/enrollments.tsx index d0753ea..d8fe916 100644 --- a/resources/js/pages/admin/manage/course-classes/enrollments.tsx +++ b/resources/js/pages/admin/manage/course-classes/enrollments.tsx @@ -1,47 +1,33 @@ import { Head, Link, router } from '@inertiajs/react'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; -import { ArrowLeft, Trash2, UserPlus } from 'lucide-react'; +import { ArrowLeft, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; -import { FormDialog } from '@/components/form-dialog'; -import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; import { RowActions } from '@/components/row-actions'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { Checkbox } from '@/components/ui/checkbox'; -import { Label } from '@/components/ui/label'; import { usePermissions } from '@/hooks/use-permissions'; import { index as courseClassIndex } from '@/routes/admin/manage/course-classes'; -import { - destroy, - store, -} from '@/routes/admin/manage/course-classes/enrollments'; +import { destroy } from '@/routes/admin/manage/course-classes/enrollments'; import { formatAcademicTermLabel } from '@/types/academic-term'; -import type { - ClassEnrollment, - EnrollmentStudent, -} from '@/types/class-enrollment'; +import type { ClassEnrollment } from '@/types/class-enrollment'; import type { CourseClass } from '@/types/course-class'; import { ClassMethodLabels } from '@/types/course-class'; type Props = { courseClass: CourseClass; enrollments: ClassEnrollment[]; - availableStudents: EnrollmentStudent[]; }; export default function ClassEnrollmentIndex({ courseClass, enrollments, - availableStudents, }: Props) { - const [createOpen, setCreateOpen] = useState(false); const [deleting, setDeleting] = useState(null); const { hasPermission } = usePermissions(); - const canCreate = hasPermission('create-course-class-enrollments'); const canDelete = hasPermission('delete-course-class-enrollments'); function handleDelete() { @@ -158,25 +144,10 @@ export default function ClassEnrollmentIndex({ -
-

Daftar Mahasiswa

- {canCreate && ( - - )} -
+

Daftar Mahasiswa

- - { @@ -194,123 +165,3 @@ export default function ClassEnrollmentIndex({ ); } - -function EnrollForm({ - open, - onOpenChange, - courseClassId, - availableStudents, -}: { - open: boolean; - onOpenChange: (open: boolean) => void; - courseClassId: number; - availableStudents: EnrollmentStudent[]; -}) { - const [selectedIds, setSelectedIds] = useState([]); - - const allSelected = - availableStudents.length > 0 && - selectedIds.length === availableStudents.length; - - function toggleAll() { - setSelectedIds( - allSelected ? [] : availableStudents.map((student) => student.id), - ); - } - - function toggleOne(id: number) { - setSelectedIds((prev) => - prev.includes(id) - ? prev.filter((selectedId) => selectedId !== id) - : [...prev, id], - ); - } - - return ( - 0 - ? `Tambahkan (${selectedIds.length})` - : 'Tambahkan' - } - onSuccess={() => { - onOpenChange(false); - setSelectedIds([]); - }} - > - {({ errors }) => ( -
-
-
- - {availableStudents.length > 0 && ( -
- - -
- )} -
- {selectedIds.map((id) => ( - - ))} -
- {availableStudents.length === 0 ? ( -

- Tidak ada mahasiswa dari jurusan yang sama - untuk didaftarkan. -

- ) : ( - availableStudents.map((student) => ( - - )) - )} -
- -
-
- )} -
- ); -} diff --git a/routes/admin.php b/routes/admin.php index 5639982..3972be3 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -117,7 +117,6 @@ Route::prefix('course-classes/{course_class}/enrollments')->name('course-classes.enrollments.')->group(function () { Route::get('/', [ClassEnrollmentController::class, 'index'])->name('index')->middleware('permission:view-course-class-enrollments'); - Route::post('/', [ClassEnrollmentController::class, 'store'])->name('store')->middleware('permission:create-course-class-enrollments'); Route::delete('{enrollment}', [ClassEnrollmentController::class, 'destroy'])->name('destroy')->middleware('permission:delete-course-class-enrollments'); });