From 7c252bd41b48abb223a2d7900c5411204d7b41f8 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Mon, 6 Apr 2026 15:52:00 +0700 Subject: [PATCH] refactor: migrate hardcoded UI labels to localization keys and improve submission and attendance data mapping logic --- app/Http/Controllers/HomeController.php | 20 +++--- .../Controllers/ShareAssignmentController.php | 35 +++++++--- .../Controllers/ShareAttendanceController.php | 30 ++++++--- lang/id/notif.php | 48 +++++++++++++ .../views/pages/share-assignment.blade.php | 67 ++++++++++++------- .../views/pages/share-attendance.blade.php | 31 ++++++--- 6 files changed, 170 insertions(+), 61 deletions(-) diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e5fb1a8..728e505 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -10,16 +10,16 @@ class HomeController extends Controller public function index(): View { $headings = [ - 'hero_title' => SystemNotification::getMessage('Kuliah Jadi Makin Simpel! 🚀📚', 'Sistem Manajemen Kelas'), - 'hero_subtitle' => SystemNotification::getMessage('Gak Ribet Lagi.', 'Sederhana & Terintegrasi.'), - 'feature_session' => SystemNotification::getMessage('Info Sesi Kuliah 🏢📅', 'Manajemen Sesi'), - 'feature_session_desc' => SystemNotification::getMessage('Pantau jadwal kelasmu biar nggak ketinggalan info penting ya! 🕒✨', 'Pemantauan kelas dan penjadwalan terstruktur dan mudah dilihat.'), - 'feature_task' => SystemNotification::getMessage('Tugas & Materi 📝📚', 'Tugas & Materi'), - 'feature_task_desc' => SystemNotification::getMessage('Ambil materi dan kumpulin tugas dalam satu tempat, praktis banget! 🚀📂', 'Pengelolaan repositori perkuliahan dan pengumpulan tugas.'), - 'feature_attendance' => SystemNotification::getMessage('Presensi Digital 🙋‍♂️✅', 'Presensi Digital'), - 'feature_attendance_desc' => SystemNotification::getMessage('Absen makin gampang, tinggal klik langsung tercatat hadir. Gapake lama! 🔥⚡', 'Sistem pendataan kehadiran yang praktis, cepat, dan real-time.'), - 'feature_group' => SystemNotification::getMessage('Grup Belajar 👯‍♀️💬', 'Grup Belajar'), - 'feature_group_desc' => SystemNotification::getMessage('Bikin kelompok biar belajar bareng temen makin asik dan seru! 🌈✨', 'Ruang kolaborasi, diskusi, dan obrolan untuk saling terhubung.'), + 'hero_title' => SystemNotification::getByKey('labels.home.hero_title'), + 'hero_subtitle' => SystemNotification::getByKey('labels.home.hero_subtitle'), + 'feature_session' => SystemNotification::getByKey('labels.home.feature_session'), + 'feature_session_desc' => SystemNotification::getByKey('labels.home.feature_session_desc'), + 'feature_task' => SystemNotification::getByKey('labels.home.feature_task'), + 'feature_task_desc' => SystemNotification::getByKey('labels.home.feature_task_desc'), + 'feature_attendance' => SystemNotification::getByKey('labels.home.feature_attendance'), + 'feature_attendance_desc' => SystemNotification::getByKey('labels.home.feature_attendance_desc'), + 'feature_group' => SystemNotification::getByKey('labels.home.feature_group'), + 'feature_group_desc' => SystemNotification::getByKey('labels.home.feature_group_desc'), ]; return view('welcome', compact('headings')); diff --git a/app/Http/Controllers/ShareAssignmentController.php b/app/Http/Controllers/ShareAssignmentController.php index 3127a3d..b2f697b 100644 --- a/app/Http/Controllers/ShareAssignmentController.php +++ b/app/Http/Controllers/ShareAssignmentController.php @@ -42,21 +42,40 @@ public function show(Request $request, Course $course): View if ($assignment) { $isGroup = $assignment->type === AssignmentType::Group; - $submissions = AssignmentSubmission::with(['student', 'media', 'studyGroup.students']) + $allSubmissions = AssignmentSubmission::with(['student', 'media', 'studyGroup.students']) ->where('assignment_id', $assignment->id) ->get(); if ($isGroup) { - $totalTargets = $assignment->studyGroups()->count(); + $targets = $assignment->studyGroups()->with('students')->get(); + $submissionMap = $allSubmissions->keyBy('study_group_id'); + + $submissions = $targets->map(fn ($group) => (object) [ + 'studyGroup' => $group, + 'student' => $submissionMap->get($group->id)?->student, + 'submitted_at' => $submissionMap->get($group->id)?->submitted_at, + 'has_submitted' => $submissionMap->has($group->id), + 'submission' => $submissionMap->get($group->id), + ]); + $totalTargets = $targets->count(); } else { - $totalTargets = $assignment->students()->count(); - if ($totalTargets === 0) { - $totalTargets = Student::whereHas('user', fn ($q) => $q->active())->count(); + $targets = $assignment->students()->orderBy('full_name')->get(); + if ($targets->isEmpty()) { + $targets = Student::whereHas('user', fn ($q) => $q->active())->orderBy('full_name')->get(); } + $submissionMap = $allSubmissions->keyBy('student_id'); + + $submissions = $targets->map(fn ($student) => (object) [ + 'student' => $student, + 'submitted_at' => $submissionMap->get($student->id)?->submitted_at, + 'has_submitted' => $submissionMap->has($student->id), + 'submission' => $submissionMap->get($student->id), + ]); + $totalTargets = $targets->count(); } } - $submittedCount = $submissions->count(); + $submittedCount = $allSubmissions ? $allSubmissions->unique($isGroup ? 'study_group_id' : 'student_id')->count() : 0; $submissionPercentage = $totalTargets > 0 ? round(($submittedCount / $totalTargets) * 100) : 0; $formattedDeadline = $assignment && $assignment->due_date @@ -64,8 +83,8 @@ public function show(Request $request, Course $course): View : '-'; $headings = [ - 'list' => SystemNotification::getMessage('Daftar Pengumpulan 🚀✨', 'Daftar Pengumpulan'), - 'info' => SystemNotification::getMessage('Informasi Tugas 📚✨', 'Informasi Tugas'), + 'list' => SystemNotification::getByKey('labels.submission_list.title'), + 'info' => SystemNotification::getByKey('labels.assignment_info_heading.title'), ]; return view('pages.share-assignment', compact( diff --git a/app/Http/Controllers/ShareAttendanceController.php b/app/Http/Controllers/ShareAttendanceController.php index 4c9b7d9..699a3b8 100644 --- a/app/Http/Controllers/ShareAttendanceController.php +++ b/app/Http/Controllers/ShareAttendanceController.php @@ -26,16 +26,24 @@ public function show(Request $request, Course $course): View $defaultDate = $latestAttendance ? $latestAttendance->date?->toDateString() : now()->toDateString(); $date = $request->query('date', $defaultDate); - $attendances = Attendance::with('student') - ->whereHas('courseSchedule', function ($query) use ($course) { - $query->where('course_id', $course->id); - }) - ->whereDate('date', $date) + $activeStudents = Student::whereHas('user', fn ($q) => $q->active()) + ->orderBy('full_name') ->get(); - $availableDates = Attendance::whereHas('courseSchedule', function ($query) use ($course) { + $attendanceRecords = Attendance::whereHas('courseSchedule', function ($query) use ($course) { $query->where('course_id', $course->id); }) + ->whereDate('date', $date) + ->get() + ->keyBy('student_id'); + + $attendances = $activeStudents->map(fn ($student) => (object) [ + 'student' => $student, + 'attended_at' => $attendanceRecords->get($student->id)?->attended_at, + 'has_attended' => $attendanceRecords->has($student->id), + ]); + + $availableDates = ClassSession::where('course_id', $course->id) ->select('date') ->distinct() ->orderByDesc('date') @@ -48,17 +56,17 @@ public function show(Request $request, Course $course): View ->get(); $sessionInfo = ClassSession::where('course_id', $course->id)->whereDate('date', $date)->first(); - $totalStudents = Student::whereHas('user', fn ($q) => $q->active())->count(); - $presentCount = $attendances->count(); + $totalStudents = $activeStudents->count(); + $presentCount = $attendanceRecords->count(); $attendancePercentage = $totalStudents > 0 ? round(($presentCount / $totalStudents) * 100) : 0; $formattedTime = $sessionInfo - ? Carbon::parse($sessionInfo->start_time)->format('H:i').' - '.Carbon::parse($sessionInfo->end_time)->format('H:i') + ? Carbon::parse($sessionInfo->start_time)->translatedFormat('H:i').' - '.Carbon::parse($sessionInfo->end_time)->format('H:i') : '-'; $headings = [ - 'list' => SystemNotification::getMessage('Daftar Kehadiran 📝✨', 'Daftar Kehadiran'), - 'info' => SystemNotification::getMessage('Informasi Sesi 🏢✨', 'Informasi Sesi'), + 'list' => SystemNotification::getByKey('labels.attendance_list.title'), + 'info' => SystemNotification::getByKey('labels.session_info.title'), ]; return view('pages.share-attendance', compact( diff --git a/lang/id/notif.php b/lang/id/notif.php index 98242ec..abe156e 100644 --- a/lang/id/notif.php +++ b/lang/id/notif.php @@ -247,6 +247,30 @@ 'title' => 'Tugas Kelompok', 'description' => 'Hanya Ketua Kelompok yang dapat mengumpulkan atau memperbarui tugas ini. Silakan hubungi ketua kelompok Anda.', ], + 'attendance_list' => [ + 'title' => 'Daftar Kehadiran 📝✨', + ], + 'session_info' => [ + 'title' => 'Informasi Sesi 🏢✨', + ], + 'submission_list' => [ + 'title' => 'Daftar Pengumpulan 🚀✨', + ], + 'assignment_info_heading' => [ + 'title' => 'Informasi Tugas 📚✨', + ], + 'home' => [ + 'hero_title' => 'Kuliah Jadi Makin Simpel! 🚀📚', + 'hero_subtitle' => 'Gak Ribet Lagi.', + 'feature_session' => 'Info Sesi Kuliah 🏢📅', + 'feature_session_desc' => 'Pantau jadwal kelasmu biar nggak ketinggalan info penting ya! 🕒✨', + 'feature_task' => 'Tugas & Materi 📝📚', + 'feature_task_desc' => 'Ambil materi dan kumpulin tugas dalam satu tempat, praktis banget! 🚀📂', + 'feature_attendance' => 'Presensi Digital 🙋‍♂️✅', + 'feature_attendance_desc' => 'Absen makin gampang, tinggal klik langsung tercatat hadir. Gapake lama! 🔥⚡', + 'feature_group' => 'Grup Belajar 👯‍♀️💬', + 'feature_group_desc' => 'Bikin kelompok biar belajar bareng temen makin asik dan seru! 🌈✨', + ], ], // Icons @@ -511,6 +535,30 @@ 'title' => 'Tugas Kelompok', 'description' => 'Hanya Ketua Kelompok yang memiliki otoritas untuk memperbarui atau mengumpulkan tugas kelompok.', ], + 'attendance_list' => [ + 'title' => 'Daftar Kehadiran', + ], + 'session_info' => [ + 'title' => 'Informasi Sesi', + ], + 'submission_list' => [ + 'title' => 'Daftar Pengumpulan', + ], + 'assignment_info_heading' => [ + 'title' => 'Informasi Tugas', + ], + 'home' => [ + 'hero_title' => 'Sistem Manajemen Kelas', + 'hero_subtitle' => 'Sederhana & Terintegrasi.', + 'feature_session' => 'Manajemen Sesi', + 'feature_session_desc' => 'Pemantauan kelas dan penjadwalan terstruktur dan mudah dilihat.', + 'feature_task' => 'Tugas & Materi', + 'feature_task_desc' => 'Pengelolaan repositori perkuliahan dan pengumpulan tugas.', + 'feature_attendance' => 'Presensi Digital', + 'feature_attendance_desc' => 'Sistem pendataan kehadiran yang praktis, cepat, dan real-time.', + 'feature_group' => 'Grup Belajar', + 'feature_group_desc' => 'Ruang kolaborasi, diskusi, dan obrolan untuk saling terhubung.', + ], ], // Icons diff --git a/resources/views/pages/share-assignment.blade.php b/resources/views/pages/share-assignment.blade.php index a181a52..26fd39f 100644 --- a/resources/views/pages/share-assignment.blade.php +++ b/resources/views/pages/share-assignment.blade.php @@ -105,8 +105,8 @@ class="fi-card rounded-xl border border-gray-200 dark:border-gray-700 bg-white d class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50"> {{ $isGroup ? 'Kelompok' : 'Mahasiswa' }} - {{ $isGroup ? 'Anggota' : 'Nomor Induk' }} - + {{ $isGroup ? 'Anggota' : 'NIM' }} + Status Hasil Tugas @@ -114,24 +114,26 @@ class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 - @forelse($submissions as $submission) + @forelse($submissions as $item)
- @if($isGroup && $submission->studyGroup) - {{ $submission->studyGroup->name }} - Pengumpul: {{ $submission->student->full_name }} + @if($isGroup && $item->studyGroup) + {{ $item->studyGroup->name }} + @if($item->has_submitted) + Pengumpul: {{ $item->student->full_name }} + @endif @else - {{ $submission->student->full_name }} + {{ $item->student->full_name }} @endif
- @if($isGroup && $submission->studyGroup) + @if($isGroup && $item->studyGroup)
- @foreach($submission->studyGroup->students as $member) + @foreach($item->studyGroup->students as $member) {{ $member->full_name }} @@ -139,17 +141,30 @@ class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800
@else - {{ $submission->student->student_number }} + {{ $item->student->student_number }} + + @endif + + + @if ($item->has_submitted) + + Sudah Mengumpulkan + + @else + + Belum Mengumpulkan @endif
- @if ($submission->getMedia('submission')->count() > 0) + @if ($item->has_submitted && $item->submission && $item->submission->getMedia('submission')->count() > 0)
- @foreach ($submission->getMedia('submission') as $media) -
@else File - tidak ditemukan + class="text-[10px] text-gray-400 uppercase tracking-widest font-bold italic mt-1">Tidak + ada file @endif
@@ -170,14 +185,18 @@ class="text-[10px] text-danger-500 uppercase tracking-widest font-bold italic mt $isLate = $assignment && $assignment->due_date && - $submission->submitted_at > $assignment->due_date; + $item->submitted_at > $assignment->due_date; @endphp -
- - {{ $submission->submitted_at ? $submission->submitted_at->format('d M Y H:i') : '-' }} -
+ @if($item->has_submitted) +
+ + {{ $item->submitted_at ? $item->submitted_at->format('d M Y H:i') : '-' }} +
+ @else + - + @endif @empty @@ -278,7 +297,7 @@ class="text-[10px] font-bold text-gray-400 dark:text-gray-500 uppercase tracking
- +
- +
diff --git a/resources/views/pages/share-attendance.blade.php b/resources/views/pages/share-attendance.blade.php index 0f688e6..5a25b51 100644 --- a/resources/views/pages/share-attendance.blade.php +++ b/resources/views/pages/share-attendance.blade.php @@ -96,9 +96,6 @@ class="inline-flex items-center rounded-md bg-zinc-100 dark:bg-zinc-800 px-2 py-

{{ $headings['list'] }}

- - {{ $attendances->count() }} Terdata -
Mahasiswa NIM + Status Waktu Presensi @@ -131,12 +129,29 @@ class="font-bold text-gray-950 dark:text-white text-sm">{{ $attendance->student- {{ $attendance->student->student_number }} + + @if ($attendance->has_attended) + + Hadir + + @else + + Alpa + + @endif + -
- - {{ $attendance->attended_at ? $attendance->attended_at->format('H:i') : '-' }} -
+ @if ($attendance->has_attended) +
+ + {{ $attendance->attended_at ? $attendance->attended_at->translatedFormat('d F Y H:i') : '-' }} +
+ @else + - + @endif @empty