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">