From b05e5212b38ea37c0c77381ee3c6e373f45920a5 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Mon, 30 Mar 2026 17:04:12 +0700 Subject: [PATCH] feat: enhance assignment sharing view to support group assignments and update submission statistics display --- .../Assignments/Pages/ListAssignments.php | 50 ++++++++++++++++--- .../Controllers/ShareAssignmentController.php | 27 +++++++--- .../views/pages/share-assignment.blade.php | 36 +++++++++---- 3 files changed, 89 insertions(+), 24 deletions(-) diff --git a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php index 635b8b5..6ddcdfb 100644 --- a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php +++ b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php @@ -55,10 +55,9 @@ public function deleteAssignmentAction(): Action public function assignments(): Collection { $studentProfile = auth()->user()->student; - $pinnedIds = $this->pinnedIds; - return Assignment::with(['course', 'assignmentSubmissions' => function ($q) use ($studentProfile) { + $assignments = Assignment::with(['course', 'assignmentSubmissions' => function ($q) use ($studentProfile) { $q->where('student_id', $studentProfile->id) ->orWhereHas('studyGroup', fn ($sq) => $sq->where('leader_id', $studentProfile->id)->orWhereHas('students', fn ($ssq) => $ssq->whereKey($studentProfile->id))); }, 'studyGroups.students']) @@ -69,12 +68,49 @@ public function assignments(): Collection $query->whereHas('students', fn ($q) => $q->whereKey($studentProfile->id)) ->orWhereHas('studyGroups', fn ($q) => $q->where('leader_id', $studentProfile->id)->orWhereHas('students', fn ($sq) => $sq->whereKey($studentProfile->id))); }) - ->when(! empty($pinnedIds), function ($query) use ($pinnedIds) { - $ids = implode(',', $pinnedIds); - $query->orderByRaw("FIELD(id, $ids) DESC"); - }) - ->orderBy('due_date') ->get(); + + return $assignments->sort(function ($a, $b) use ($pinnedIds) { + if (! empty($pinnedIds)) { + $aIndex = array_search($a->id, $pinnedIds); + $bIndex = array_search($b->id, $pinnedIds); + + $aPinned = $aIndex !== false; + $bPinned = $bIndex !== false; + + if ($aPinned && $bPinned) { + return $bIndex <=> $aIndex; + } + if ($aPinned) { + return -1; + } + if ($bPinned) { + return 1; + } + } + + $aPriority = $this->getAssignmentPriority($a); + $bPriority = $this->getAssignmentPriority($b); + + if ($aPriority !== $bPriority) { + return $aPriority <=> $bPriority; + } + + return $a->due_date <=> $b->due_date; + }); + } + + private function getAssignmentPriority($assignment): int + { + $isSubmitted = $assignment->assignmentSubmissions->isNotEmpty(); + $isOverdue = now()->isAfter($assignment->due_date); + + if (! $isOverdue) { + return $isSubmitted ? 2 : 1; + } + + // Overdue + return $isSubmitted ? 3 : 4; } #[Computed] diff --git a/app/Http/Controllers/ShareAssignmentController.php b/app/Http/Controllers/ShareAssignmentController.php index e3de406..0806c2b 100644 --- a/app/Http/Controllers/ShareAssignmentController.php +++ b/app/Http/Controllers/ShareAssignmentController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Enums\AssignmentType; use App\Models\Assignment; use App\Models\AssignmentSubmission; use App\Models\Course; @@ -15,13 +16,11 @@ class ShareAssignmentController extends Controller public function show(Request $request, Course $course): View { - // Retrieve available assignments for the dropdown (from the whole course) $availableAssignments = Assignment::where('course_id', $course->id) ->with('classSession') ->orderBy('created_at', 'desc') ->get(); - // Default: If session_id is provided, try to find an assignment for that session, or fallback to latest assignment. $assignmentId = $request->query('assignment_id'); $sessionId = $request->query('session_id'); @@ -36,17 +35,28 @@ public function show(Request $request, Course $course): View $sessionInfo = $assignment ? $assignment->classSession : null; - // Get submissions and calculate stats $submissions = collect(); + $isGroup = false; + $totalTargets = 0; + if ($assignment) { - $submissions = AssignmentSubmission::with(['student', 'media']) + $isGroup = $assignment->type === AssignmentType::Group; + $submissions = AssignmentSubmission::with(['student', 'media', 'studyGroup.students']) ->where('assignment_id', $assignment->id) ->get(); + + if ($isGroup) { + $totalTargets = $assignment->studyGroups()->count(); + } else { + $totalTargets = $assignment->students()->count(); + if ($totalTargets === 0) { + $totalTargets = Student::whereHas('user', fn ($q) => $q->active())->count(); + } + } } - $totalStudents = Student::whereHas('user', fn ($q) => $q->active())->count(); $submittedCount = $submissions->count(); - $submissionPercentage = $totalStudents > 0 ? round(($submittedCount / $totalStudents) * 100) : 0; + $submissionPercentage = $totalTargets > 0 ? round(($submittedCount / $totalTargets) * 100) : 0; $formattedDeadline = $assignment && $assignment->due_date ? Carbon::parse($assignment->due_date)->translatedFormat('l, d F Y H:i') @@ -58,10 +68,11 @@ public function show(Request $request, Course $course): View 'availableAssignments', 'sessionInfo', 'submissions', - 'totalStudents', + 'totalTargets', 'submittedCount', 'submissionPercentage', - 'formattedDeadline' + 'formattedDeadline', + 'isGroup' )); } } diff --git a/resources/views/pages/share-assignment.blade.php b/resources/views/pages/share-assignment.blade.php index 792e4b1..d471ea0 100644 --- a/resources/views/pages/share-assignment.blade.php +++ b/resources/views/pages/share-assignment.blade.php @@ -73,8 +73,8 @@ class="fi-card rounded-xl border border-gray-200 dark:border-gray-700 bg-white d - Mahasiswa - Nomor Induk + {{ $isGroup ? 'Kelompok' : 'Mahasiswa' }} + {{ $isGroup ? 'Anggota' : 'Nomor Induk' }} Hasil Tugas @@ -88,15 +88,29 @@ class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800
- {{ $submission->student->full_name }} + @if($isGroup && $submission->studyGroup) + {{ $submission->studyGroup->name }} + Pengumpul: {{ $submission->student->full_name }} + @else + {{ $submission->student->full_name }} + @endif
- - {{ $submission->student->student_number }} - + @if($isGroup && $submission->studyGroup) +
+ @foreach($submission->studyGroup->students as $member) + + {{ $member->full_name }} + + @endforeach +
+ @else + + {{ $submission->student->student_number }} + + @endif
@@ -182,6 +196,10 @@ class="fi-card rounded-xl border border-gray-200 dark:border-gray-700 bg-white d Sesi Ke-{{ $assignment->classSession->session_number }} @endif + + + {{ $isGroup ? 'Tugas Kelompok' : 'Tugas Individu' }} +
@@ -192,8 +210,8 @@ class="fi-card rounded-xl border border-gray-200 dark:border-gray-700 bg-white d class="text-[10px] font-bold text-gray-400 dark:text-gray-500 uppercase tracking-widest mb-0.5">Terkumpul {{ $submittedCount }}/{{ $totalStudents }} - Orang + class="text-[10px] text-gray-400 font-normal ml-0.5">/{{ $totalTargets }} + {{ $isGroup ? 'Kelompok' : 'Orang' }}