From c74a7c7792281ea3a6083aa69f77830c518207d6 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 25 Aug 2026 23:05:19 +0700 Subject: [PATCH] feat: add academic advising logs and letter requests management - Implemented academic advising logs functionality with create, edit, and delete capabilities. - Created UI components for displaying academic advising logs in a data table format. - Added letter requests management with similar CRUD operations and UI components. - Refactored routes to organize academic classes, announcements, finances, and services under appropriate namespaces. --- .../AssignmentController.php | 14 ++-- .../AttendanceController.php | 16 ++-- .../CourseRegistrationController.php | 14 ++-- .../MaterialController.php | 14 ++-- .../ScheduleController.php | 14 ++-- .../SubmissionController.php | 8 +- .../AnnouncementController.php | 12 +-- .../TuitionInvoiceController.php | 12 +-- .../TuitionPaymentController.php | 8 +- .../ClassEnrollmentController.php | 6 +- .../{Course => }/CourseClassController.php | 8 +- .../Manage/{Course => }/CourseController.php | 6 +- .../AcademicAdvisingLogController.php | 12 +-- .../LetterRequestController.php | 12 +-- .../AssignmentRequest.php | 2 +- .../AttendanceStoreRequest.php | 2 +- .../CourseRegistrationRequest.php | 2 +- .../MaterialRequest.php | 2 +- .../ScheduleRequest.php | 2 +- .../SubmissionRequest.php | 2 +- .../AnnouncementRequest.php | 2 +- .../TuitionInvoiceRequest.php | 2 +- .../TuitionPaymentRequest.php | 2 +- .../{Course => }/ClassEnrollmentRequest.php | 2 +- .../{Course => }/CourseClassRequest.php | 2 +- .../Manage/{Course => }/CourseRequest.php | 2 +- .../AcademicAdvisingLogRequest.php | 2 +- .../LetterRequestRequest.php | 2 +- .../AssignmentService.php | 2 +- .../AttendanceService.php | 2 +- .../CourseRegistrationService.php | 2 +- .../MaterialService.php | 2 +- .../ScheduleService.php | 2 +- .../SubmissionService.php | 2 +- .../AnnouncementService.php | 2 +- .../TuitionInvoiceService.php | 2 +- .../TuitionPaymentService.php | 2 +- .../{Course => }/ClassEnrollmentService.php | 2 +- .../{Course => }/CourseClassService.php | 2 +- .../Manage/{Course => }/CourseService.php | 2 +- .../AcademicAdvisingLogService.php | 2 +- .../LetterRequestService.php | 2 +- docs/code-style.md | 73 +++++++++---------- resources/js/components/app-sidebar.tsx | 18 ++--- .../assignments/columns.tsx | 2 +- .../assignments/index.tsx | 2 +- .../assignments/submissions.tsx | 4 +- .../attendances/index.tsx | 2 +- .../attendances/session.tsx | 2 +- .../course-registrations/columns.tsx | 0 .../course-registrations/index.tsx | 2 +- .../materials/columns.tsx | 0 .../materials/index.tsx | 2 +- .../schedules/index.tsx | 2 +- .../{manage => }/announcements/columns.tsx | 0 .../{manage => }/announcements/index.tsx | 2 +- .../tuition-invoices/columns.tsx | 2 +- .../tuition-invoices/index.tsx | 2 +- .../tuition-invoices/payments.tsx | 4 +- .../academic-advising-logs/columns.tsx | 0 .../academic-advising-logs/index.tsx | 2 +- .../letter-requests/columns.tsx | 0 .../letter-requests/index.tsx | 2 +- routes/admin.php | 63 +++++++++------- 64 files changed, 203 insertions(+), 195 deletions(-) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/AssignmentController.php (77%) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/AttendanceController.php (74%) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/CourseRegistrationController.php (81%) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/MaterialController.php (77%) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/ScheduleController.php (75%) rename app/Http/Controllers/Admin/{Manage/Academic => AcademicClasses}/SubmissionController.php (86%) rename app/Http/Controllers/Admin/{Manage/Announcement => Announcements}/AnnouncementController.php (79%) rename app/Http/Controllers/Admin/{Manage/Finance => Finances}/TuitionInvoiceController.php (81%) rename app/Http/Controllers/Admin/{Manage/Finance => Finances}/TuitionPaymentController.php (86%) rename app/Http/Controllers/Admin/Manage/{Course => }/ClassEnrollmentController.php (88%) rename app/Http/Controllers/Admin/Manage/{Course => }/CourseClassController.php (90%) rename app/Http/Controllers/Admin/Manage/{Course => }/CourseController.php (90%) rename app/Http/Controllers/Admin/{Manage/Service => Services}/AcademicAdvisingLogController.php (81%) rename app/Http/Controllers/Admin/{Manage/Service => Services}/LetterRequestController.php (80%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/AssignmentRequest.php (92%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/AttendanceStoreRequest.php (92%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/CourseRegistrationRequest.php (96%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/MaterialRequest.php (93%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/ScheduleRequest.php (93%) rename app/Http/Requests/Admin/{Manage/Academic => AcademicClasses}/SubmissionRequest.php (96%) rename app/Http/Requests/Admin/{Manage/Announcement => Announcements}/AnnouncementRequest.php (90%) rename app/Http/Requests/Admin/{Manage/Finance => Finances}/TuitionInvoiceRequest.php (92%) rename app/Http/Requests/Admin/{Manage/Finance => Finances}/TuitionPaymentRequest.php (93%) rename app/Http/Requests/Admin/Manage/{Course => }/ClassEnrollmentRequest.php (93%) rename app/Http/Requests/Admin/Manage/{Course => }/CourseClassRequest.php (94%) rename app/Http/Requests/Admin/Manage/{Course => }/CourseRequest.php (93%) rename app/Http/Requests/Admin/{Manage/Service => Services}/AcademicAdvisingLogRequest.php (92%) rename app/Http/Requests/Admin/{Manage/Service => Services}/LetterRequestRequest.php (93%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/AssignmentService.php (97%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/AttendanceService.php (98%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/CourseRegistrationService.php (98%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/MaterialService.php (97%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/ScheduleService.php (96%) rename app/Services/Admin/{Manage/Academic => AcademicClasses}/SubmissionService.php (97%) rename app/Services/Admin/{Manage/Announcement => Announcements}/AnnouncementService.php (96%) rename app/Services/Admin/{Manage/Finance => Finances}/TuitionInvoiceService.php (97%) rename app/Services/Admin/{Manage/Finance => Finances}/TuitionPaymentService.php (97%) rename app/Services/Admin/Manage/{Course => }/ClassEnrollmentService.php (96%) rename app/Services/Admin/Manage/{Course => }/CourseClassService.php (97%) rename app/Services/Admin/Manage/{Course => }/CourseService.php (96%) rename app/Services/Admin/{Manage/Service => Services}/AcademicAdvisingLogService.php (97%) rename app/Services/Admin/{Manage/Service => Services}/LetterRequestService.php (98%) rename resources/js/pages/admin/{manage => academic-classes}/assignments/columns.tsx (97%) rename resources/js/pages/admin/{manage => academic-classes}/assignments/index.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/assignments/submissions.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/attendances/index.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/attendances/session.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/course-registrations/columns.tsx (100%) rename resources/js/pages/admin/{manage => academic-classes}/course-registrations/index.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/materials/columns.tsx (100%) rename resources/js/pages/admin/{manage => academic-classes}/materials/index.tsx (99%) rename resources/js/pages/admin/{manage => academic-classes}/schedules/index.tsx (99%) rename resources/js/pages/admin/{manage => }/announcements/columns.tsx (100%) rename resources/js/pages/admin/{manage => }/announcements/index.tsx (99%) rename resources/js/pages/admin/{manage => finances}/tuition-invoices/columns.tsx (98%) rename resources/js/pages/admin/{manage => finances}/tuition-invoices/index.tsx (99%) rename resources/js/pages/admin/{manage => finances}/tuition-invoices/payments.tsx (98%) rename resources/js/pages/admin/{manage => services}/academic-advising-logs/columns.tsx (100%) rename resources/js/pages/admin/{manage => services}/academic-advising-logs/index.tsx (99%) rename resources/js/pages/admin/{manage => services}/letter-requests/columns.tsx (100%) rename resources/js/pages/admin/{manage => services}/letter-requests/index.tsx (99%) diff --git a/app/Http/Controllers/Admin/Manage/Academic/AssignmentController.php b/app/Http/Controllers/Admin/AcademicClasses/AssignmentController.php similarity index 77% rename from app/Http/Controllers/Admin/Manage/Academic/AssignmentController.php rename to app/Http/Controllers/Admin/AcademicClasses/AssignmentController.php index cec712d..b1e7c11 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/AssignmentController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/AssignmentController.php @@ -1,13 +1,13 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'courseClasses' => $this->courseClassService->getAllForSelect(), ]); @@ -33,7 +33,7 @@ public function store(AssignmentRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Tugas berhasil ditambahkan.']); - return to_route('admin.manage.assignments.index'); + return to_route('admin.academic-classes.assignments.index'); } public function update(AssignmentRequest $request, Assignment $assignment): RedirectResponse @@ -42,7 +42,7 @@ public function update(AssignmentRequest $request, Assignment $assignment): Redi Inertia::flash('toast', ['type' => 'success', 'message' => 'Tugas berhasil diperbarui.']); - return to_route('admin.manage.assignments.index'); + return to_route('admin.academic-classes.assignments.index'); } public function destroy(Assignment $assignment): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Academic/AttendanceController.php b/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php similarity index 74% rename from app/Http/Controllers/Admin/Manage/Academic/AttendanceController.php rename to app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php index 08f1e96..51c8a4d 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/AttendanceController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/AttendanceController.php @@ -1,12 +1,12 @@ $this->service->sessions(), 'courseClasses' => $this->courseClassService->getAllForSelect(), ]); @@ -31,7 +31,7 @@ public function session(CourseClass $courseClass, int $meetingNumber): Response $courseClass->load('course'); $data = $this->service->session($courseClass, $meetingNumber); - return Inertia::render('admin/manage/attendances/session', [ + return Inertia::render('admin/academic-classes/attendances/session', [ 'courseClass' => $courseClass, 'meetingNumber' => $meetingNumber, 'roster' => $data['roster'], @@ -45,7 +45,7 @@ public function store(AttendanceStoreRequest $request, CourseClass $courseClass, Inertia::flash('toast', ['type' => 'success', 'message' => 'Kehadiran berhasil disimpan.']); - return to_route('admin.manage.attendances.session', [$courseClass->id, $meetingNumber]); + return to_route('admin.academic-classes.attendances.session', [$courseClass->id, $meetingNumber]); } public function destroy(CourseClass $courseClass, int $meetingNumber): RedirectResponse @@ -54,6 +54,6 @@ public function destroy(CourseClass $courseClass, int $meetingNumber): RedirectR Inertia::flash('toast', ['type' => 'success', 'message' => 'Sesi kehadiran berhasil dihapus.']); - return to_route('admin.manage.attendances.index'); + return to_route('admin.academic-classes.attendances.index'); } } diff --git a/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php b/app/Http/Controllers/Admin/AcademicClasses/CourseRegistrationController.php similarity index 81% rename from app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php rename to app/Http/Controllers/Admin/AcademicClasses/CourseRegistrationController.php index 7e76e8d..f0687cc 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/CourseRegistrationController.php @@ -1,13 +1,13 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), 'academicTerms' => $this->academicTermService->getAllForSelect(), @@ -42,7 +42,7 @@ public function store(CourseRegistrationRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Registrasi KRS berhasil ditambahkan.']); - return to_route('admin.manage.course-registrations.index'); + return to_route('admin.academic-classes.course-registrations.index'); } public function update(CourseRegistrationRequest $request, CourseRegistration $courseRegistration): RedirectResponse @@ -51,7 +51,7 @@ public function update(CourseRegistrationRequest $request, CourseRegistration $c Inertia::flash('toast', ['type' => 'success', 'message' => 'Registrasi KRS berhasil diperbarui.']); - return to_route('admin.manage.course-registrations.index'); + return to_route('admin.academic-classes.course-registrations.index'); } public function destroy(CourseRegistration $courseRegistration): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Academic/MaterialController.php b/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php similarity index 77% rename from app/Http/Controllers/Admin/Manage/Academic/MaterialController.php rename to app/Http/Controllers/Admin/AcademicClasses/MaterialController.php index 82f561e..0962df3 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/MaterialController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php @@ -1,13 +1,13 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'courseClasses' => $this->courseClassService->getAllForSelect(), ]); @@ -33,7 +33,7 @@ public function store(MaterialRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Materi berhasil ditambahkan.']); - return to_route('admin.manage.materials.index'); + return to_route('admin.academic-classes.materials.index'); } public function update(MaterialRequest $request, Material $material): RedirectResponse @@ -42,7 +42,7 @@ public function update(MaterialRequest $request, Material $material): RedirectRe Inertia::flash('toast', ['type' => 'success', 'message' => 'Materi berhasil diperbarui.']); - return to_route('admin.manage.materials.index'); + return to_route('admin.academic-classes.materials.index'); } public function destroy(Material $material): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Academic/ScheduleController.php b/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php similarity index 75% rename from app/Http/Controllers/Admin/Manage/Academic/ScheduleController.php rename to app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php index 8ea4dfb..d09ce33 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/ScheduleController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php @@ -1,12 +1,12 @@ $this->service->all(), 'courseClasses' => $this->courseClassService->getAllForSelect(), ]); @@ -32,7 +32,7 @@ public function store(ScheduleRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Jadwal berhasil ditambahkan.']); - return to_route('admin.manage.schedules.index'); + return to_route('admin.academic-classes.schedules.index'); } public function update(ScheduleRequest $request, Schedule $schedule): RedirectResponse @@ -41,7 +41,7 @@ public function update(ScheduleRequest $request, Schedule $schedule): RedirectRe Inertia::flash('toast', ['type' => 'success', 'message' => 'Jadwal berhasil diperbarui.']); - return to_route('admin.manage.schedules.index'); + return to_route('admin.academic-classes.schedules.index'); } public function destroy(Schedule $schedule): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Academic/SubmissionController.php b/app/Http/Controllers/Admin/AcademicClasses/SubmissionController.php similarity index 86% rename from app/Http/Controllers/Admin/Manage/Academic/SubmissionController.php rename to app/Http/Controllers/Admin/AcademicClasses/SubmissionController.php index 68b34c5..a86b5ba 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/SubmissionController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/SubmissionController.php @@ -1,12 +1,12 @@ load(['courseClass.course', 'courseClass.lecturer.user.profile', 'courseClass.academicTerm']); - return Inertia::render('admin/manage/assignments/submissions', [ + return Inertia::render('admin/academic-classes/assignments/submissions', [ 'assignment' => $assignment, 'submissions' => $this->service->forAssignment($assignment), 'availableStudents' => $this->service->availableStudents($assignment), diff --git a/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php b/app/Http/Controllers/Admin/Announcements/AnnouncementController.php similarity index 79% rename from app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php rename to app/Http/Controllers/Admin/Announcements/AnnouncementController.php index 484561a..cc0f3f7 100644 --- a/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php +++ b/app/Http/Controllers/Admin/Announcements/AnnouncementController.php @@ -1,12 +1,12 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'departments' => $this->departmentService->getAllForSelect(), ]); @@ -33,7 +33,7 @@ public function store(AnnouncementRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil ditambahkan.']); - return to_route('admin.manage.announcements.index'); + return to_route('admin.announcements.index'); } public function update(AnnouncementRequest $request, Announcement $announcement): RedirectResponse @@ -42,7 +42,7 @@ public function update(AnnouncementRequest $request, Announcement $announcement) Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengumuman berhasil diperbarui.']); - return to_route('admin.manage.announcements.index'); + return to_route('admin.announcements.index'); } public function destroy(Announcement $announcement): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php similarity index 81% rename from app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php rename to app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php index a95dd8e..e73a043 100644 --- a/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php +++ b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php @@ -1,12 +1,12 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), 'academicTerms' => $this->academicTermService->getAllForSelect(), @@ -36,7 +36,7 @@ public function store(TuitionInvoiceRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Tagihan berhasil ditambahkan.']); - return to_route('admin.manage.tuition-invoices.index'); + return to_route('admin.finances.tuition-invoices.index'); } public function update(TuitionInvoiceRequest $request, TuitionInvoice $tuitionInvoice): RedirectResponse @@ -45,7 +45,7 @@ public function update(TuitionInvoiceRequest $request, TuitionInvoice $tuitionIn Inertia::flash('toast', ['type' => 'success', 'message' => 'Tagihan berhasil diperbarui.']); - return to_route('admin.manage.tuition-invoices.index'); + return to_route('admin.finances.tuition-invoices.index'); } public function destroy(TuitionInvoice $tuitionInvoice): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Finance/TuitionPaymentController.php b/app/Http/Controllers/Admin/Finances/TuitionPaymentController.php similarity index 86% rename from app/Http/Controllers/Admin/Manage/Finance/TuitionPaymentController.php rename to app/Http/Controllers/Admin/Finances/TuitionPaymentController.php index 7ee49e6..dca4b51 100644 --- a/app/Http/Controllers/Admin/Manage/Finance/TuitionPaymentController.php +++ b/app/Http/Controllers/Admin/Finances/TuitionPaymentController.php @@ -1,12 +1,12 @@ load(['student.user.profile', 'student.department', 'academicTerm']); - return Inertia::render('admin/manage/tuition-invoices/payments', [ + return Inertia::render('admin/finances/tuition-invoices/payments', [ 'invoice' => $tuitionInvoice, 'payments' => $this->service->forInvoice($tuitionInvoice), ]); diff --git a/app/Http/Controllers/Admin/Manage/Course/ClassEnrollmentController.php b/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php similarity index 88% rename from app/Http/Controllers/Admin/Manage/Course/ClassEnrollmentController.php rename to app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php index 291ddd2..c473665 100644 --- a/app/Http/Controllers/Admin/Manage/Course/ClassEnrollmentController.php +++ b/app/Http/Controllers/Admin/Manage/ClassEnrollmentController.php @@ -1,12 +1,12 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), @@ -36,7 +36,7 @@ public function store(AcademicAdvisingLogRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Bimbingan akademik berhasil ditambahkan.']); - return to_route('admin.manage.academic-advising-logs.index'); + return to_route('admin.services.academic-advising-logs.index'); } public function update(AcademicAdvisingLogRequest $request, AcademicAdvisingLog $academicAdvisingLog): RedirectResponse @@ -45,7 +45,7 @@ public function update(AcademicAdvisingLogRequest $request, AcademicAdvisingLog Inertia::flash('toast', ['type' => 'success', 'message' => 'Bimbingan akademik berhasil diperbarui.']); - return to_route('admin.manage.academic-advising-logs.index'); + return to_route('admin.services.academic-advising-logs.index'); } public function destroy(AcademicAdvisingLog $academicAdvisingLog): RedirectResponse diff --git a/app/Http/Controllers/Admin/Manage/Service/LetterRequestController.php b/app/Http/Controllers/Admin/Services/LetterRequestController.php similarity index 80% rename from app/Http/Controllers/Admin/Manage/Service/LetterRequestController.php rename to app/Http/Controllers/Admin/Services/LetterRequestController.php index b21f6e0..60cb003 100644 --- a/app/Http/Controllers/Admin/Manage/Service/LetterRequestController.php +++ b/app/Http/Controllers/Admin/Services/LetterRequestController.php @@ -1,12 +1,12 @@ $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), ]); @@ -33,7 +33,7 @@ public function store(LetterRequestRequest $request): RedirectResponse Inertia::flash('toast', ['type' => 'success', 'message' => 'Surat permohonan berhasil ditambahkan.']); - return to_route('admin.manage.letter-requests.index'); + return to_route('admin.services.letter-requests.index'); } public function update(LetterRequestRequest $request, LetterRequest $letterRequest): RedirectResponse @@ -42,7 +42,7 @@ public function update(LetterRequestRequest $request, LetterRequest $letterReque Inertia::flash('toast', ['type' => 'success', 'message' => 'Surat permohonan berhasil diperbarui.']); - return to_route('admin.manage.letter-requests.index'); + return to_route('admin.services.letter-requests.index'); } public function destroy(LetterRequest $letterRequest): RedirectResponse diff --git a/app/Http/Requests/Admin/Manage/Academic/AssignmentRequest.php b/app/Http/Requests/Admin/AcademicClasses/AssignmentRequest.php similarity index 92% rename from app/Http/Requests/Admin/Manage/Academic/AssignmentRequest.php rename to app/Http/Requests/Admin/AcademicClasses/AssignmentRequest.php index 7cd40e5..10cc89d 100644 --- a/app/Http/Requests/Admin/Manage/Academic/AssignmentRequest.php +++ b/app/Http/Requests/Admin/AcademicClasses/AssignmentRequest.php @@ -1,6 +1,6 @@ ` | +**Aturan utama: namespace/folder PHP (Controller, Request, Service) dan folder +halaman Inertia (`resources/js/pages/admin/...`) SELALU mengikuti prefix route +di `routes/admin.php` — satu grup di sidebar (`app-sidebar.tsx`) = satu prefix +route = satu namespace.** Jangan menebak dari label sidebar; selalu cek dulu +prefix route-nya sebelum menaruh file baru. -"Resource mandiri" dipakai untuk fitur yang tidak cocok masuk ke 4 grup di -atas — misalnya `Admin\FeedbackController` di `admin/feedback` (data -personal milik user yang sedang login, bukan data akademik yang dikelola -admin atas user lain). +| Grup sidebar | Namespace Controller/Request/Service | Prefix route | +| ------------ | ------------------------------------- | ---------------------------- | +| Pengguna | `Admin\Users` | `admin/users/*` | +| Master | `Admin\Master` | `admin/master/*` | +| Kelas | `Admin\AcademicClasses` | `admin/academic-classes/*` | +| Kelola | `Admin\Manage` | `admin/manage/*` | +| Pengumuman | `Admin\Announcements` | `admin/announcements` | +| Keuangan | `Admin\Finances` | `admin/finances/*` | +| Layanan | `Admin\Services` | `admin/services/*` | +| Pengaturan | `Admin\Settings` | `admin/settings/*` | +| Resource mandiri (navSecondary, bukan grup di navMain) | `Admin` (langsung, tanpa sub-namespace) | `admin/` | + +"Resource mandiri" dipakai untuk fitur yang tidak masuk ke grup sidebar +manapun di navMain — misalnya `Admin\FeedbackController` di `admin/feedback` +(dari menu `navSecondary`, data personal milik user yang sedang login, bukan +data akademik yang dikelola admin atas user lain). Nama route mengikuti pola `admin...` (atau -`admin..` untuk resource mandiri), dan file Wayfinder -hasil generate mengikuti struktur folder yang sama di -`resources/js/routes/admin///`. +`admin..` untuk resource mandiri, atau `admin..` +langsung kalau grup itu cuma punya satu resource yang namanya sama dengan +grupnya sendiri — lihat pola Pengumuman/`AnnouncementController` di +`routes/admin.php`, supaya URL-nya tidak jadi `admin/announcements/announcements` +yang berulang). File Wayfinder hasil generate mengikuti struktur folder yang +sama di `resources/js/routes/admin///`, dan folder halaman +Inertia-nya di `resources/js/pages/admin///`. + +Kalau satu Service dipakai lintas grup (mis. `CourseClassService` — miliknya +grup Kelola — dipakai juga oleh controller-controller di grup Kelas untuk +mengisi dropdown), itu boleh, tetap `use` dari namespace aslinya +(`App\Services\Admin\Manage\CourseClassService`) — jangan dipindah/duplikasi +hanya karena dipakai controller di grup lain. Halaman CRUD frontend memakai pola: `PageHeader` (judul + tombol Tambah) → `FormDialog` (Create/Edit) → `DataTable` + `columns.tsx` → `DeleteConfirmDialog`. -### 4.1 Sub-namespace di dalam `Admin\Manage` - -`Admin\Manage` sendiri dipecah lagi jadi 5 sub-namespace, mengikuti -pengelompokan yang sama seperti grup di `app-sidebar.tsx` (Kelas, Kelola, -Pengumuman, Keuangan, Layanan). **URL/nama route tidak berubah** (tetap flat -`admin/manage/*` / `admin.manage.*`) — hanya struktur folder PHP-nya -(Controller, Request, Service) yang mengikuti sub-namespace ini. - -| Sub-namespace | Grup sidebar | Resource | -| --------------------------- | ------------ | -------------------------------------------------------------------------- | -| `Admin\Manage\Course` | Kelola | Course, CourseClass, ClassEnrollment | -| `Admin\Manage\Academic` | Kelas | CourseRegistration, Material, Assignment, Submission, Schedule, Attendance | -| `Admin\Manage\Announcement` | Pengumuman | Announcement | -| `Admin\Manage\Finance` | Keuangan | TuitionInvoice, TuitionPayment | -| `Admin\Manage\Service` | Layanan | LetterRequest, AcademicAdvisingLog | - -Kalau menambah resource baru di salah satu grup ini, taruh Controller di -`app/Http/Controllers/Admin/Manage//`, Request-nya di -`app/Http/Requests/Admin/Manage//`, dan Service-nya di -`app/Services/Admin/Manage//` — jangan taruh langsung di -`Admin\Manage` tanpa sub-namespace lagi. - --- ## 5. Service ✅ diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 76ae7ac..0344d59 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -41,17 +41,17 @@ import { SidebarMenuItem, } from '@/components/ui/sidebar'; import { index as feedbackRoute } from '@/routes/admin/feedback'; -import { index as academicAdvisingLogsRoute } from '@/routes/admin/manage/academic-advising-logs'; -import { index as announcementsRoute } from '@/routes/admin/manage/announcements'; -import { index as assignmentsRoute } from '@/routes/admin/manage/assignments'; -import { index as attendancesRoute } from '@/routes/admin/manage/attendances'; +import { index as academicAdvisingLogsRoute } from '@/routes/admin/services/academic-advising-logs'; +import { index as announcementsRoute } from '@/routes/admin/announcements'; +import { index as assignmentsRoute } from '@/routes/admin/academic-classes/assignments'; +import { index as attendancesRoute } from '@/routes/admin/academic-classes/attendances'; import { index as courseClassesRoute } from '@/routes/admin/manage/course-classes'; -import { index as courseRegistrationsRoute } from '@/routes/admin/manage/course-registrations'; +import { index as courseRegistrationsRoute } from '@/routes/admin/academic-classes/course-registrations'; import { index as coursesRoute } from '@/routes/admin/manage/courses'; -import { index as letterRequestsRoute } from '@/routes/admin/manage/letter-requests'; -import { index as materialsRoute } from '@/routes/admin/manage/materials'; -import { index as schedulesRoute } from '@/routes/admin/manage/schedules'; -import { index as tuitionInvoicesRoute } from '@/routes/admin/manage/tuition-invoices'; +import { index as letterRequestsRoute } from '@/routes/admin/services/letter-requests'; +import { index as materialsRoute } from '@/routes/admin/academic-classes/materials'; +import { index as schedulesRoute } from '@/routes/admin/academic-classes/schedules'; +import { index as tuitionInvoicesRoute } from '@/routes/admin/finances/tuition-invoices'; import { index as academicTerm } from '@/routes/admin/master/academic-terms'; import { index as departmentsRoute } from '@/routes/admin/master/departments'; import { edit as appearanceRoute } from '@/routes/admin/settings/appearance'; diff --git a/resources/js/pages/admin/manage/assignments/columns.tsx b/resources/js/pages/admin/academic-classes/assignments/columns.tsx similarity index 97% rename from resources/js/pages/admin/manage/assignments/columns.tsx rename to resources/js/pages/admin/academic-classes/assignments/columns.tsx index df49eb4..ec90f3a 100644 --- a/resources/js/pages/admin/manage/assignments/columns.tsx +++ b/resources/js/pages/admin/academic-classes/assignments/columns.tsx @@ -2,7 +2,7 @@ import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; import { ClipboardList, Paperclip, Pencil, Trash2 } from 'lucide-react'; import { RowActions } from '@/components/row-actions'; -import { index as submissionsIndex } from '@/routes/admin/manage/assignments/submissions'; +import { index as submissionsIndex } from '@/routes/admin/academic-classes/assignments/submissions'; import type { Assignment } from '@/types/assignment'; export type { Assignment } from '@/types/assignment'; diff --git a/resources/js/pages/admin/manage/assignments/index.tsx b/resources/js/pages/admin/academic-classes/assignments/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/assignments/index.tsx rename to resources/js/pages/admin/academic-classes/assignments/index.tsx index 9dbd7fa..a5d016b 100644 --- a/resources/js/pages/admin/manage/assignments/index.tsx +++ b/resources/js/pages/admin/academic-classes/assignments/index.tsx @@ -26,7 +26,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/assignments'; +} from '@/routes/admin/academic-classes/assignments'; import type { Assignment } from '@/types/assignment'; import { createAssignmentColumns } from './columns'; diff --git a/resources/js/pages/admin/manage/assignments/submissions.tsx b/resources/js/pages/admin/academic-classes/assignments/submissions.tsx similarity index 99% rename from resources/js/pages/admin/manage/assignments/submissions.tsx rename to resources/js/pages/admin/academic-classes/assignments/submissions.tsx index b500227..1e1acfe 100644 --- a/resources/js/pages/admin/manage/assignments/submissions.tsx +++ b/resources/js/pages/admin/academic-classes/assignments/submissions.tsx @@ -24,12 +24,12 @@ import { SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; -import { index as assignmentIndex } from '@/routes/admin/manage/assignments'; +import { index as assignmentIndex } from '@/routes/admin/academic-classes/assignments'; import { destroy, store, update, -} from '@/routes/admin/manage/assignments/submissions'; +} from '@/routes/admin/academic-classes/assignments/submissions'; import type { Assignment } from '@/types/assignment'; import type { Submission, SubmissionStudent } from '@/types/submission'; import { SubmissionStatusLabels, SubmissionStatuses } from '@/types/submission'; diff --git a/resources/js/pages/admin/manage/attendances/index.tsx b/resources/js/pages/admin/academic-classes/attendances/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/attendances/index.tsx rename to resources/js/pages/admin/academic-classes/attendances/index.tsx index 494af49..6694da2 100644 --- a/resources/js/pages/admin/manage/attendances/index.tsx +++ b/resources/js/pages/admin/academic-classes/attendances/index.tsx @@ -23,7 +23,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select'; -import { destroy, session } from '@/routes/admin/manage/attendances'; +import { destroy, session } from '@/routes/admin/academic-classes/attendances'; import type { AttendanceCourseClass, AttendanceSession, diff --git a/resources/js/pages/admin/manage/attendances/session.tsx b/resources/js/pages/admin/academic-classes/attendances/session.tsx similarity index 99% rename from resources/js/pages/admin/manage/attendances/session.tsx rename to resources/js/pages/admin/academic-classes/attendances/session.tsx index 0af8bd8..d84e533 100644 --- a/resources/js/pages/admin/manage/attendances/session.tsx +++ b/resources/js/pages/admin/academic-classes/attendances/session.tsx @@ -10,7 +10,7 @@ import { Label } from '@/components/ui/label'; import { index as attendanceIndex, store, -} from '@/routes/admin/manage/attendances'; +} from '@/routes/admin/academic-classes/attendances'; import type { AttendanceCourseClass, AttendanceRosterEntry, diff --git a/resources/js/pages/admin/manage/course-registrations/columns.tsx b/resources/js/pages/admin/academic-classes/course-registrations/columns.tsx similarity index 100% rename from resources/js/pages/admin/manage/course-registrations/columns.tsx rename to resources/js/pages/admin/academic-classes/course-registrations/columns.tsx diff --git a/resources/js/pages/admin/manage/course-registrations/index.tsx b/resources/js/pages/admin/academic-classes/course-registrations/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/course-registrations/index.tsx rename to resources/js/pages/admin/academic-classes/course-registrations/index.tsx index 990dd86..e4c46fb 100644 --- a/resources/js/pages/admin/manage/course-registrations/index.tsx +++ b/resources/js/pages/admin/academic-classes/course-registrations/index.tsx @@ -22,7 +22,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/course-registrations'; +} from '@/routes/admin/academic-classes/course-registrations'; import type { CourseRegistration, CourseRegistrationCourseClass, diff --git a/resources/js/pages/admin/manage/materials/columns.tsx b/resources/js/pages/admin/academic-classes/materials/columns.tsx similarity index 100% rename from resources/js/pages/admin/manage/materials/columns.tsx rename to resources/js/pages/admin/academic-classes/materials/columns.tsx diff --git a/resources/js/pages/admin/manage/materials/index.tsx b/resources/js/pages/admin/academic-classes/materials/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/materials/index.tsx rename to resources/js/pages/admin/academic-classes/materials/index.tsx index 79e71c0..56e93b9 100644 --- a/resources/js/pages/admin/manage/materials/index.tsx +++ b/resources/js/pages/admin/academic-classes/materials/index.tsx @@ -25,7 +25,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/materials'; +} from '@/routes/admin/academic-classes/materials'; import type { Material } from '@/types/material'; import { createMaterialColumns } from './columns'; diff --git a/resources/js/pages/admin/manage/schedules/index.tsx b/resources/js/pages/admin/academic-classes/schedules/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/schedules/index.tsx rename to resources/js/pages/admin/academic-classes/schedules/index.tsx index 1701e1c..b0817d8 100644 --- a/resources/js/pages/admin/manage/schedules/index.tsx +++ b/resources/js/pages/admin/academic-classes/schedules/index.tsx @@ -19,7 +19,7 @@ import { SelectValue, } from '@/components/ui/select'; import { cn } from '@/lib/utils'; -import { destroy, store, update } from '@/routes/admin/manage/schedules'; +import { destroy, store, update } from '@/routes/admin/academic-classes/schedules'; import type { Schedule } from '@/types/schedule'; import { DayOfWeekLabels, DaysOfWeek } from '@/types/schedule'; diff --git a/resources/js/pages/admin/manage/announcements/columns.tsx b/resources/js/pages/admin/announcements/columns.tsx similarity index 100% rename from resources/js/pages/admin/manage/announcements/columns.tsx rename to resources/js/pages/admin/announcements/columns.tsx diff --git a/resources/js/pages/admin/manage/announcements/index.tsx b/resources/js/pages/admin/announcements/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/announcements/index.tsx rename to resources/js/pages/admin/announcements/index.tsx index 2b19684..30d6704 100644 --- a/resources/js/pages/admin/manage/announcements/index.tsx +++ b/resources/js/pages/admin/announcements/index.tsx @@ -24,7 +24,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/announcements'; +} from '@/routes/admin/announcements'; import type { Announcement, AnnouncementDepartment, diff --git a/resources/js/pages/admin/manage/tuition-invoices/columns.tsx b/resources/js/pages/admin/finances/tuition-invoices/columns.tsx similarity index 98% rename from resources/js/pages/admin/manage/tuition-invoices/columns.tsx rename to resources/js/pages/admin/finances/tuition-invoices/columns.tsx index 006cbd8..b22ad71 100644 --- a/resources/js/pages/admin/manage/tuition-invoices/columns.tsx +++ b/resources/js/pages/admin/finances/tuition-invoices/columns.tsx @@ -4,7 +4,7 @@ import { CreditCard, Pencil, Trash2 } from 'lucide-react'; import { RowActions } from '@/components/row-actions'; import { Badge } from '@/components/ui/badge'; import { formatRupiah } from '@/lib/currency'; -import { index as paymentsIndex } from '@/routes/admin/manage/tuition-invoices/payments'; +import { index as paymentsIndex } from '@/routes/admin/finances/tuition-invoices/payments'; import type { TuitionInvoice } from '@/types/tuition-invoice'; export type { TuitionInvoice } from '@/types/tuition-invoice'; diff --git a/resources/js/pages/admin/manage/tuition-invoices/index.tsx b/resources/js/pages/admin/finances/tuition-invoices/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/tuition-invoices/index.tsx rename to resources/js/pages/admin/finances/tuition-invoices/index.tsx index 7a89802..3c5f69e 100644 --- a/resources/js/pages/admin/manage/tuition-invoices/index.tsx +++ b/resources/js/pages/admin/finances/tuition-invoices/index.tsx @@ -25,7 +25,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/tuition-invoices'; +} from '@/routes/admin/finances/tuition-invoices'; import type { TuitionInvoice, TuitionInvoiceStudent, diff --git a/resources/js/pages/admin/manage/tuition-invoices/payments.tsx b/resources/js/pages/admin/finances/tuition-invoices/payments.tsx similarity index 98% rename from resources/js/pages/admin/manage/tuition-invoices/payments.tsx rename to resources/js/pages/admin/finances/tuition-invoices/payments.tsx index 28b1fa8..dfedda5 100644 --- a/resources/js/pages/admin/manage/tuition-invoices/payments.tsx +++ b/resources/js/pages/admin/finances/tuition-invoices/payments.tsx @@ -26,12 +26,12 @@ import { } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { formatRupiah } from '@/lib/currency'; -import { index as tuitionInvoiceIndex } from '@/routes/admin/manage/tuition-invoices'; +import { index as tuitionInvoiceIndex } from '@/routes/admin/finances/tuition-invoices'; import { destroy, store, update, -} from '@/routes/admin/manage/tuition-invoices/payments'; +} from '@/routes/admin/finances/tuition-invoices/payments'; import type { TuitionInvoice } from '@/types/tuition-invoice'; import type { TuitionPayment } from '@/types/tuition-payment'; import { PaymentStatusLabels, PaymentStatuses } from '@/types/tuition-payment'; diff --git a/resources/js/pages/admin/manage/academic-advising-logs/columns.tsx b/resources/js/pages/admin/services/academic-advising-logs/columns.tsx similarity index 100% rename from resources/js/pages/admin/manage/academic-advising-logs/columns.tsx rename to resources/js/pages/admin/services/academic-advising-logs/columns.tsx diff --git a/resources/js/pages/admin/manage/academic-advising-logs/index.tsx b/resources/js/pages/admin/services/academic-advising-logs/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/academic-advising-logs/index.tsx rename to resources/js/pages/admin/services/academic-advising-logs/index.tsx index 9b8432c..7d33b52 100644 --- a/resources/js/pages/admin/manage/academic-advising-logs/index.tsx +++ b/resources/js/pages/admin/services/academic-advising-logs/index.tsx @@ -25,7 +25,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/academic-advising-logs'; +} from '@/routes/admin/services/academic-advising-logs'; import type { AcademicAdvisingLog, AcademicAdvisingLogLecturer, diff --git a/resources/js/pages/admin/manage/letter-requests/columns.tsx b/resources/js/pages/admin/services/letter-requests/columns.tsx similarity index 100% rename from resources/js/pages/admin/manage/letter-requests/columns.tsx rename to resources/js/pages/admin/services/letter-requests/columns.tsx diff --git a/resources/js/pages/admin/manage/letter-requests/index.tsx b/resources/js/pages/admin/services/letter-requests/index.tsx similarity index 99% rename from resources/js/pages/admin/manage/letter-requests/index.tsx rename to resources/js/pages/admin/services/letter-requests/index.tsx index 51eee88..c30dedf 100644 --- a/resources/js/pages/admin/manage/letter-requests/index.tsx +++ b/resources/js/pages/admin/services/letter-requests/index.tsx @@ -25,7 +25,7 @@ import { destroy, store, update, -} from '@/routes/admin/manage/letter-requests'; +} from '@/routes/admin/services/letter-requests'; import type { LetterRequest, LetterRequestStudent, diff --git a/routes/admin.php b/routes/admin.php index 1843585..c93a6ea 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -1,22 +1,22 @@ except(['create', 'edit', 'show']); }); - Route::prefix('admin/manage')->name('admin.manage.')->group(function () { - Route::resource('courses', CourseController::class)->except(['create', 'edit', 'show']); - Route::resource('course-classes', CourseClassController::class)->except(['create', 'edit', 'show']); - - Route::prefix('course-classes/{course_class}/enrollments')->name('course-classes.enrollments.')->group(function () { - Route::get('/', [ClassEnrollmentController::class, 'index'])->name('index'); - Route::post('/', [ClassEnrollmentController::class, 'store'])->name('store'); - Route::delete('{enrollment}', [ClassEnrollmentController::class, 'destroy'])->name('destroy'); - }); - + Route::prefix('admin/academic-classes')->name('admin.academic-classes.')->group(function () { Route::resource('course-registrations', CourseRegistrationController::class)->except(['create', 'edit', 'show']); Route::resource('materials', MaterialController::class)->except(['create', 'edit', 'show']); @@ -67,7 +58,27 @@ ->whereNumber('meeting_number') ->name('destroy'); }); + }); + Route::prefix('admin/manage')->name('admin.manage.')->group(function () { + Route::resource('courses', CourseController::class)->except(['create', 'edit', 'show']); + Route::resource('course-classes', CourseClassController::class)->except(['create', 'edit', 'show']); + + Route::prefix('course-classes/{course_class}/enrollments')->name('course-classes.enrollments.')->group(function () { + Route::get('/', [ClassEnrollmentController::class, 'index'])->name('index'); + Route::post('/', [ClassEnrollmentController::class, 'store'])->name('store'); + Route::delete('{enrollment}', [ClassEnrollmentController::class, 'destroy'])->name('destroy'); + }); + }); + + Route::prefix('admin/announcements')->name('admin.announcements.')->group(function () { + Route::get('/', [AnnouncementController::class, 'index'])->name('index'); + Route::post('/', [AnnouncementController::class, 'store'])->name('store'); + Route::put('{announcement}', [AnnouncementController::class, 'update'])->name('update'); + Route::delete('{announcement}', [AnnouncementController::class, 'destroy'])->name('destroy'); + }); + + Route::prefix('admin/finances')->name('admin.finances.')->group(function () { Route::resource('tuition-invoices', TuitionInvoiceController::class)->except(['create', 'edit', 'show']); Route::prefix('tuition-invoices/{tuition_invoice}/payments')->name('tuition-invoices.payments.')->group(function () { @@ -76,9 +87,9 @@ Route::put('{payment}', [TuitionPaymentController::class, 'update'])->name('update'); Route::delete('{payment}', [TuitionPaymentController::class, 'destroy'])->name('destroy'); }); + }); - Route::resource('announcements', AnnouncementController::class)->except(['create', 'edit', 'show']); - + Route::prefix('admin/services')->name('admin.services.')->group(function () { Route::resource('letter-requests', LetterRequestController::class)->except(['create', 'edit', 'show']); Route::resource('academic-advising-logs', AcademicAdvisingLogController::class)->except(['create', 'edit', 'show']);