diff --git a/app/Filament/Resources/Learning/ClassSessions/Actions/CopyAssignmentLinkAction.php b/app/Filament/Resources/Learning/Assignments/Actions/CopyAssignmentLinkAction.php similarity index 74% rename from app/Filament/Resources/Learning/ClassSessions/Actions/CopyAssignmentLinkAction.php rename to app/Filament/Resources/Learning/Assignments/Actions/CopyAssignmentLinkAction.php index d4b8a95..32202cd 100644 --- a/app/Filament/Resources/Learning/ClassSessions/Actions/CopyAssignmentLinkAction.php +++ b/app/Filament/Resources/Learning/Assignments/Actions/CopyAssignmentLinkAction.php @@ -1,9 +1,9 @@ color('gray') ->icon('heroicon-o-clipboard-document') ->action(function (array $arguments, $livewire) { - $course = $livewire->course; - $session = ClassSession::find($arguments['session'] ?? null); + $assignment = Assignment::find($arguments['record'] ?? null); + $course = $assignment ? $assignment->course : null; + + if (! $course || ! $assignment) { + return; + } $url = URL::temporarySignedRoute('share.assignment', now()->addHour(), [ 'course' => $course->id, - 'session_id' => $session ? $session->id : null, + 'assignment_id' => $assignment->id, ]); $livewire->js("if (navigator.clipboard) { navigator.clipboard.writeText('{$url}').catch(() => {}); }"); diff --git a/app/Filament/Resources/Learning/ClassSessions/Actions/ShareAssignmentAction.php b/app/Filament/Resources/Learning/Assignments/Actions/ShareAssignmentAction.php similarity index 68% rename from app/Filament/Resources/Learning/ClassSessions/Actions/ShareAssignmentAction.php rename to app/Filament/Resources/Learning/Assignments/Actions/ShareAssignmentAction.php index f168dc6..651b160 100644 --- a/app/Filament/Resources/Learning/ClassSessions/Actions/ShareAssignmentAction.php +++ b/app/Filament/Resources/Learning/Assignments/Actions/ShareAssignmentAction.php @@ -1,8 +1,8 @@ requiresConfirmation() ->modalIcon('heroicon-o-paper-airplane') ->modalHeading('Bagikan Info Tugas') - ->modalDescription('Pilih metode untuk membagikan tautan publik status pengumpulan tugas sesi ini.') + ->modalDescription('Pilih metode untuk membagikan tautan publik status pengumpulan tugas ini.') ->modalSubmitActionLabel('Ke WhatsApp') ->modalCancelAction(false) ->extraModalFooterActions([ CopyAssignmentLinkAction::make(), ]) ->action(function (array $arguments, $livewire) { - $course = $livewire->course; - $session = ClassSession::find($arguments['session'] ?? null); + $assignment = Assignment::with(['course'])->find($arguments['record'] ?? null); + $course = $assignment ? $assignment->course : null; + + if (! $course || ! $assignment) { + return; + } $url = URL::temporarySignedRoute('share.assignment', now()->addHour(), [ 'course' => $course->id, - 'session_id' => $session ? $session->id : null, + 'assignment_id' => $assignment->id, ]); - $text = "*Info Tugas Kelas {$course->name}*\nSesi ke-".($session->session_number ?? '-').' ('.($session->date->translatedFormat('d M Y') ?? '').")\n\nSilakan cek status pengumpulan tugas melalui tautan publik berikut:\n\n{$url}"; + $text = "*Info Tugas Kelas {$course->name}*\nJudul: {$assignment->title}\n\nSilakan cek status pengumpulan tugas melalui tautan publik berikut:\n\n{$url}"; $escapedText = json_encode($text); diff --git a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php index 10b7300..c1241ca 100644 --- a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php +++ b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php @@ -7,6 +7,7 @@ use App\Filament\Resources\Learning\Assignments\Actions\DeleteAssignmentAction; use App\Filament\Resources\Learning\Assignments\Actions\EditAssignmentAction; use App\Filament\Resources\Learning\Assignments\Actions\PinAction; +use App\Filament\Resources\Learning\Assignments\Actions\ShareAssignmentAction; use App\Filament\Resources\Learning\Assignments\AssignmentResource; use App\Filament\Support\SystemNotification; use App\Models\Assignment; @@ -96,6 +97,11 @@ public function deleteAssignmentAction(): Action ->visible(fn () => auth()->user()->can('Delete:Assignment')); } + public function shareAssignmentAction(): Action + { + return ShareAssignmentAction::make(); + } + #[Computed] public function assignments(): Collection { diff --git a/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php b/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php index 9e203a5..2761bb7 100644 --- a/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php +++ b/app/Filament/Resources/Learning/ClassSessions/Pages/ListCourseSessions.php @@ -6,7 +6,6 @@ use App\Filament\Resources\Learning\ClassSessions\Actions\DeleteSessionAction; use App\Filament\Resources\Learning\ClassSessions\Actions\EditSessionAction; use App\Filament\Resources\Learning\ClassSessions\Actions\GenerateSessionsAction; -use App\Filament\Resources\Learning\ClassSessions\Actions\ShareAssignmentAction; use App\Filament\Resources\Learning\ClassSessions\Actions\ShareAttendanceAction; use App\Filament\Resources\Learning\ClassSessions\ClassSessionResource; use App\Models\ClassSession; @@ -140,7 +139,6 @@ protected function getActions(): array { return [ $this->shareAttendanceAction(), - $this->shareAssignmentAction(), $this->viewAttendanceAction(), $this->viewMaterialsAction(), $this->viewAssignmentsAction(), @@ -155,11 +153,6 @@ public function shareAttendanceAction(): Action return ShareAttendanceAction::make(); } - public function shareAssignmentAction(): Action - { - return ShareAssignmentAction::make(); - } - public function viewAttendanceAction(): Action { return Action::make('viewAttendance') diff --git a/resources/views/filament/resources/learning/assignments/index.blade.php b/resources/views/filament/resources/learning/assignments/index.blade.php index 4fb766c..e0ac982 100644 --- a/resources/views/filament/resources/learning/assignments/index.blade.php +++ b/resources/views/filament/resources/learning/assignments/index.blade.php @@ -12,74 +12,74 @@ -
+
@forelse ($this->assignmentCards as $card) -
+
+ class="flex flex-1 items-start gap-4 p-5 text-left min-w-0 hover:bg-primary-500/5 transition-colors cursor-pointer"> -
- +
+
-

+

{{ $card->title }}

-

+

{{ $card->course_name }}

-
+
@if ($card->is_pinned) + class="inline-flex items-center gap-1.5 rounded-full bg-primary-100 text-primary-700 dark:bg-primary-900/30 dark:text-primary-400 px-2.5 py-1 text-xs font-bold whitespace-nowrap border border-primary-200/50 dark:border-primary-500/20"> 📌 Dipinned @endif @if ($card->is_new) + class="inline-flex items-center gap-1.5 rounded-full bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-400 px-2.5 py-1 text-xs font-bold whitespace-nowrap border border-violet-200/50 dark:border-violet-500/20"> ✨ Baru @endif @if ($card->is_group) + class="inline-flex items-center gap-1.5 rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400 px-2.5 py-1 text-xs font-bold whitespace-nowrap border border-blue-200/50 dark:border-blue-500/20"> 👥 Kelompok @endif - + @if ($card->status_icon) - + @endif {{ $card->status_label }} @if ($card->is_urgent) + class="inline-flex items-center gap-1.5 rounded-full bg-danger-500 text-white px-2.5 py-1 text-xs font-bold animate-pulse whitespace-nowrap shadow-sm shadow-danger-300 dark:shadow-none"> 🔥 Segera! @endif
-
- - - Batas: {{ $card->due_date_formatted }} +
+ + + Batas: {{ $card->due_date_formatted }} @if ($card->submitted_at_formatted) - + + class="h-4 w-4 shrink-0" /> Dikumpulkan: {{ $card->submitted_at_formatted }} @endif @@ -88,9 +88,9 @@ class="h-3.5 w-3.5 shrink-0" /> -
+
{{ ($this->pinAction)(['record' => $card->id]) }} + {{ ($this->shareAssignmentAction)(['record' => $card->id]) }} @canAny(['Update:Assignment', 'Delete:Assignment']) {{ ($this->editAssignmentAction)(['record' => $card->id]) }} @@ -102,11 +102,13 @@ class="flex items-center justify-start gap-2 px-4 py-2 border-t border-gray-100
@empty - - +
+ + +
@endforelse
diff --git a/resources/views/filament/resources/learning/class-sessions/show.blade.php b/resources/views/filament/resources/learning/class-sessions/show.blade.php index 9c5f0f2..986b2cc 100644 --- a/resources/views/filament/resources/learning/class-sessions/show.blade.php +++ b/resources/views/filament/resources/learning/class-sessions/show.blade.php @@ -55,7 +55,6 @@
{{ ($this->shareAttendanceAction)(['session' => $session->id]) }} - {{ ($this->shareAssignmentAction)(['session' => $session->id]) }} {{ ($this->editSessionAction)(['session' => $session->id]) }} {{ ($this->deleteSessionAction)(['session' => $session->id]) }}
diff --git a/tests/Feature/AssignmentTest.php b/tests/Feature/AssignmentTest.php index 22736bf..1683a28 100644 --- a/tests/Feature/AssignmentTest.php +++ b/tests/Feature/AssignmentTest.php @@ -300,6 +300,27 @@ }); }); +describe('Assignment Sharing', function () { + beforeEach(function () { + $user = User::factory()->create(); + $user->assignRole(RoleEnum::Student); + $user->givePermissionTo(['ViewAny:Assignment', 'View:CourseSchedule']); + $this->studentProfile = Student::factory()->create(['user_id' => $user->id]); + $this->actingAs($user); + $this->currentSemester = app(GeneralSettings::class)->current_semester; + }); + + it('can share assignment information', function () { + $course = Course::factory()->create(['semester' => $this->currentSemester]); + $assignment = Assignment::factory()->create(['course_id' => $course->id]); + $assignment->students()->attach($this->studentProfile->id); + + Livewire::test(ListAssignments::class) + ->callAction('shareAssignment', [], ['record' => $assignment->id]) + ->assertHasNoActionErrors(); + }); +}); + describe('Assignment Details and Preview', function () { beforeEach(function () { $user = User::factory()->create(); diff --git a/tests/Feature/ClassSessionTest.php b/tests/Feature/ClassSessionTest.php index ab7a5f6..1cbdba7 100644 --- a/tests/Feature/ClassSessionTest.php +++ b/tests/Feature/ClassSessionTest.php @@ -158,15 +158,6 @@ ->assertHasNoActionErrors(); }); - it('can share assignment information', function () { - $course = Course::factory()->create(['semester' => $this->currentSemester]); - $session = ClassSession::factory()->create(['course_id' => $course->id]); - - Livewire::test(ListCourseSessions::class, ['courseId' => $course->id]) - ->callAction('shareAssignment', [], ['session' => $session->id]) - ->assertHasNoActionErrors(); - }); - it('can show modals for attendance, materials and assignments', function () { $course = Course::factory()->create(['semester' => $this->currentSemester]); $session = ClassSession::factory()->create(['course_id' => $course->id]);