diff --git a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php index c1241ca..f9955d6 100644 --- a/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php +++ b/app/Filament/Resources/Learning/Assignments/Pages/ListAssignments.php @@ -12,8 +12,10 @@ use App\Filament\Support\SystemNotification; use App\Models\Assignment; use App\Models\AssignmentPin; +use App\Models\Course; use App\Settings\GeneralSettings; use Filament\Actions\Action; +use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Resources\Pages\Page; use Filament\Schemas\Schema; @@ -27,6 +29,9 @@ class ListAssignments extends Page #[Url] public ?string $search = ''; + #[Url] + public ?int $course_id = null; + protected static string $resource = AssignmentResource::class; protected string $view = 'filament.resources.learning.assignments.index'; @@ -42,7 +47,10 @@ public static function getPagePermission(): string public function mount(): void { - $this->form->fill(); + $this->form->fill([ + 'search' => $this->search, + 'course_id' => $this->course_id, + ]); } public function form(Schema $schema): Schema @@ -51,13 +59,27 @@ public function form(Schema $schema): Schema ->schema([ TextInput::make('search') ->label('Cari') - ->placeholder('Cari Judul Tugas atau Mata Kuliah...') + ->placeholder('Cari Judul Tugas...') ->autocomplete(false) ->live(debounce: 500) ->afterStateUpdated(fn ($state) => $this->search = $state), + + Select::make('course_id') + ->label('Mata Kuliah') + ->placeholder('Semua Mata Kuliah') + ->options(function () { + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->whereHas('courseSchedules') + ->pluck('name', 'id') + ->toArray(); + }) + ->searchable() + ->live() + ->afterStateUpdated(fn ($state) => $this->course_id = $state), ]) ->columns([ - 'sm' => 1, + 'sm' => 2, ]); } @@ -112,6 +134,15 @@ public function assignments(): Collection ->whereHas('course', function ($q) { $q->where('semester', app(GeneralSettings::class)->current_semester); }) + ->when($this->search, function ($query) { + $query->where(function ($q) { + $q->where('title', 'like', "%{$this->search}%") + ->orWhereHas('course', fn ($cq) => $cq->where('name', 'like', "%{$this->search}%")); + }); + }) + ->when($this->course_id, function ($query) { + $query->where('course_id', $this->course_id); + }) ->get(); } @@ -134,6 +165,9 @@ public function assignments(): Collection ->orWhereHas('course', fn ($cq) => $cq->where('name', 'like', "%{$this->search}%")); }); }) + ->when($this->course_id, function ($query) { + $query->where('course_id', $this->course_id); + }) ->get(); return $assignments->sort(function ($a, $b) use ($pinnedIds) { diff --git a/resources/views/filament/resources/learning/assignments/index.blade.php b/resources/views/filament/resources/learning/assignments/index.blade.php index e0ac982..50131d6 100644 --- a/resources/views/filament/resources/learning/assignments/index.blade.php +++ b/resources/views/filament/resources/learning/assignments/index.blade.php @@ -1,20 +1,18 @@ - + {{ $this->heading }} {{ $this->description }} -
-
+
+
{{ $this->form }}
@forelse ($this->assignmentCards as $card) -
- + Batas: {{ $card->due_date_formatted }} @if ($card->submitted_at_formatted) - - + + Dikumpulkan: {{ $card->submitted_at_formatted }} @endif @@ -88,7 +87,8 @@ class="h-4 w-4 shrink-0" /> -
+
{{ ($this->pinAction)(['record' => $card->id]) }} {{ ($this->shareAssignmentAction)(['record' => $card->id]) }} @@ -101,9 +101,9 @@ class="h-4 w-4 shrink-0" />
- @empty + @empty
- diff --git a/tests/Feature/AssignmentTest.php b/tests/Feature/AssignmentTest.php index 1683a28..e0f6e79 100644 --- a/tests/Feature/AssignmentTest.php +++ b/tests/Feature/AssignmentTest.php @@ -298,6 +298,30 @@ ->assertDontSee('Tugas Wajib') ->assertSee('Hore, Belum Ada Tugas!'); }); + + it('can filter assignments by course', function () { + $course1 = Course::factory()->create(['name' => 'Matematika', 'semester' => $this->currentSemester]); + $course2 = Course::factory()->create(['name' => 'Fisika', 'semester' => $this->currentSemester]); + + $assignment1 = Assignment::factory()->create([ + 'title' => 'Tugas Mat', + 'course_id' => $course1->id, + 'due_date' => now()->addDays(1), + ]); + $assignment2 = Assignment::factory()->create([ + 'title' => 'Tugas Fis', + 'course_id' => $course2->id, + 'due_date' => now()->addDays(1), + ]); + + $assignment1->students()->attach($this->studentProfile->id); + $assignment2->students()->attach($this->studentProfile->id); + + Livewire::test(ListAssignments::class) + ->set('course_id', $course1->id) + ->assertSee('Tugas Mat') + ->assertDontSee('Tugas Fis'); + }); }); describe('Assignment Sharing', function () {