From c8f2ac6c26a4e3d5d0a07d352d6069deb8a0d290 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 12 Mar 2026 08:03:51 +0700 Subject: [PATCH] feat: Filter course-related data by current semester from general settings and rename attendance management page. --- .../Information/CourseSchedule/Index.php | 34 ++++-------------- .../Pages/Learning/StudyGroup/Index.php | 35 ++++++++----------- .../Assignments/Schemas/AssignmentForm.php | 14 +++----- .../Attendances/AttendanceResource.php | 4 +-- ...tendancePage.php => ManageAttendances.php} | 20 +++++++++-- .../Learning/Materials/MaterialResource.php | 27 +++++--------- .../list-course-schedules.blade.php | 2 +- .../pages/list-attendances.blade.php | 29 ++++++++------- 8 files changed, 70 insertions(+), 95 deletions(-) rename app/Filament/Resources/Learning/Attendances/Pages/{AttendancePage.php => ManageAttendances.php} (83%) diff --git a/app/Filament/Pages/Information/CourseSchedule/Index.php b/app/Filament/Pages/Information/CourseSchedule/Index.php index 53d7dc5..2a2345c 100644 --- a/app/Filament/Pages/Information/CourseSchedule/Index.php +++ b/app/Filament/Pages/Information/CourseSchedule/Index.php @@ -7,6 +7,7 @@ use App\Filament\Pages\Information\CourseSchedule\Actions\EditScheduleAction; use App\Models\Course; use App\Models\CourseSchedule; +use App\Settings\GeneralSettings; use BackedEnum; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; @@ -43,8 +44,6 @@ class Index extends Page implements HasActions, HasForms protected string $view = 'filament.pages.information.list-course-schedules'; - public ?int $course_semester = null; - public ?string $search = ''; public static function getPagePermission(): string @@ -54,24 +53,13 @@ public static function getPagePermission(): string public function mount(): void { - $this->course_semester = null; - - $this->form->fill([ - 'course_semester' => $this->course_semester, - ]); + $this->form->fill(); } public function form(Schema $schema): Schema { return $schema ->schema([ - Select::make('course_semester') - ->label('Semester') - ->options(array_combine(range(1, 8), array_map(fn ($i) => "Semester $i", range(1, 8)))) - ->native(false) - ->live() - ->afterStateUpdated(fn ($state) => $this->course_semester = $state), - TextInput::make('search') ->label('Cari') ->placeholder('Cari Mata Kuliah atau Dosen...') @@ -81,7 +69,6 @@ public function form(Schema $schema): Schema ]) ->columns([ 'sm' => 1, - 'md' => 3, ]); } @@ -113,9 +100,7 @@ public function getSchedules(): Collection $query->whereHas('course', fn ($q) => $q->where('lecturer_id', $lecturer->id)); } - if ($this->course_semester) { - $query->whereHas('course', fn ($q) => $q->where('semester', $this->course_semester)); - } + $query->whereHas('course', fn ($q) => $q->where('semester', app(GeneralSettings::class)->current_semester)); if ($this->search) { $query->where(function ($q) { @@ -156,20 +141,15 @@ public function scheduleFormSchema(): array Select::make('course_id') ->label('Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) ->searchable() ->live() ->required() - ->columnSpanFull() - ->optionsLimit(100), + ->columnSpanFull(), Grid::make(3) ->schema([ diff --git a/app/Filament/Pages/Learning/StudyGroup/Index.php b/app/Filament/Pages/Learning/StudyGroup/Index.php index 492ea0e..3c222c2 100644 --- a/app/Filament/Pages/Learning/StudyGroup/Index.php +++ b/app/Filament/Pages/Learning/StudyGroup/Index.php @@ -8,6 +8,7 @@ use App\Models\Course; use App\Models\Student; use App\Models\StudyGroup; +use App\Settings\GeneralSettings; use BackedEnum; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; @@ -58,22 +59,20 @@ public function form(Schema $schema): Schema ->schema([ Select::make('course_id') ->label('Mata Kuliah') + ->placeholder('Semua Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) ->searchable() - ->required() - ->optionsLimit(100), + ->live(), ]) - ->columns(1); + ->columns([ + 'sm' => 1, + ]); } protected function getHeaderActions(): array @@ -95,7 +94,8 @@ protected function deleteStudyGroupAction(): Action public function getStudyGroups(): Collection { - $query = StudyGroup::with(['leader', 'students', 'courses']); + $query = StudyGroup::with(['leader', 'students', 'courses']) + ->whereHas('courses', fn ($q) => $q->where('courses.semester', app(GeneralSettings::class)->current_semester)); if ($this->course_id) { $query->whereHas('courses', fn ($q) => $q->where('courses.id', $this->course_id)); @@ -114,7 +114,7 @@ protected function getViewData(): array public function isMyGroup(StudyGroup $record): bool { - $studentId = $this->studentId; + $studentId = auth()->user()?->student?->id; if (! $studentId) { return false; @@ -131,19 +131,14 @@ public function studyGroupFormSchema(): array Select::make('course_id') ->label('Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) ->multiple() ->searchable() ->required() - ->optionsLimit(100) ->columnSpanFull(), TextInput::make('name') diff --git a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php index ca0d003..6263fc6 100644 --- a/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php +++ b/app/Filament/Resources/Learning/Assignments/Schemas/AssignmentForm.php @@ -6,6 +6,7 @@ use App\Filament\Resources\Learning\Assignments\Actions\SelectAllStudentsAction; use App\Models\Course; use App\Models\Student; +use App\Settings\GeneralSettings; use Asmit\FilamentUpload\Enums\PdfViewFit; use Asmit\FilamentUpload\Forms\Components\AdvancedFileUpload; use Filament\Forms\Components\DateTimePicker; @@ -43,19 +44,14 @@ public static function configure(Schema $schema): Schema Select::make('course_id') ->label('Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) ->searchable() ->live() - ->required() - ->optionsLimit(100), + ->required(), DateTimePicker::make('due_date') ->label('Batas Waktu') diff --git a/app/Filament/Resources/Learning/Attendances/AttendanceResource.php b/app/Filament/Resources/Learning/Attendances/AttendanceResource.php index 174969f..67fbeab 100644 --- a/app/Filament/Resources/Learning/Attendances/AttendanceResource.php +++ b/app/Filament/Resources/Learning/Attendances/AttendanceResource.php @@ -2,7 +2,7 @@ namespace App\Filament\Resources\Learning\Attendances; -use App\Filament\Resources\Learning\Attendances\Pages\AttendancePage; +use App\Filament\Resources\Learning\Attendances\Pages\ManageAttendances; use App\Models\Attendance; use BackedEnum; use Filament\Resources\Resource; @@ -28,7 +28,7 @@ class AttendanceResource extends Resource public static function getPages(): array { return [ - 'index' => AttendancePage::route('/'), + 'index' => ManageAttendances::route('/'), ]; } } diff --git a/app/Filament/Resources/Learning/Attendances/Pages/AttendancePage.php b/app/Filament/Resources/Learning/Attendances/Pages/ManageAttendances.php similarity index 83% rename from app/Filament/Resources/Learning/Attendances/Pages/AttendancePage.php rename to app/Filament/Resources/Learning/Attendances/Pages/ManageAttendances.php index b4845ed..806d7f5 100644 --- a/app/Filament/Resources/Learning/Attendances/Pages/AttendancePage.php +++ b/app/Filament/Resources/Learning/Attendances/Pages/ManageAttendances.php @@ -7,9 +7,10 @@ use App\Models\Attendance; use App\Models\CourseSchedule; use App\Models\User; +use App\Settings\GeneralSettings; use Filament\Resources\Pages\Page; -class AttendancePage extends Page +class ManageAttendances extends Page { protected static string $resource = AttendanceResource::class; @@ -23,11 +24,23 @@ public function getSchedules() { $student = auth()->user()->student; - $today = now()->dayOfWeek; + if (! $student) { + return collect(); + } + + $today = now()->dayOfWeekIso; + $semester = app(GeneralSettings::class)->current_semester; return CourseSchedule::query() ->where('day_of_week', $today) - ->with(['course', 'attendances' => function ($q) use ($student) { + ->whereHas('course', function ($q) use ($semester, $student) { + $q->where('semester', $semester) + ->whereHas('studyGroups', function ($sq) use ($student) { + $sq->where('leader_id', $student->id) + ->orWhereHas('students', fn ($asq) => $asq->where('students.id', $student->id)); + }); + }) + ->with(['course.lecturer.user', 'attendances' => function ($q) use ($student) { $q->where('student_id', $student->id) ->whereDate('date', now()->toDateString()); }]) @@ -64,6 +77,7 @@ public function getScheduleCards() return (object) [ 'id' => $schedule->id, 'course_name' => $schedule->course->name, + 'lecturer_name' => $schedule->course->lecturer?->full_name ?? 'Belum Ditentukan', 'time_range' => $schedule->start_time->format('H:i').' - '.$schedule->end_time->format('H:i'), 'is_attended' => $isAttended, 'can_attend' => $canAttend && ! $isAttended, diff --git a/app/Filament/Resources/Learning/Materials/MaterialResource.php b/app/Filament/Resources/Learning/Materials/MaterialResource.php index 6dee6e2..a52852e 100644 --- a/app/Filament/Resources/Learning/Materials/MaterialResource.php +++ b/app/Filament/Resources/Learning/Materials/MaterialResource.php @@ -11,6 +11,7 @@ use App\Filament\Resources\Learning\Materials\Pages\ManageMaterials; use App\Models\Course; use App\Models\Material; +use App\Settings\GeneralSettings; use Asmit\FilamentUpload\Enums\PdfViewFit; use Asmit\FilamentUpload\Forms\Components\AdvancedFileUpload; use BackedEnum; @@ -60,19 +61,14 @@ public static function form(Schema $schema): Schema Select::make('course_id') ->label('Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) ->searchable() ->live() - ->required() - ->optionsLimit(100), + ->required(), DatePicker::make('published_at') ->label('Tanggal Publikasi') @@ -147,17 +143,12 @@ public static function table(Table $table): Table SelectFilter::make('course_id') ->label('Mata Kuliah') ->options(function () { - return Course::all() - ->groupBy('semester') - ->mapWithKeys(function ($courses, $semester) { - return [ - "Semester $semester" => $courses->pluck('name', 'id')->toArray(), - ]; - }) + return Course::query() + ->where('semester', app(GeneralSettings::class)->current_semester) + ->pluck('name', 'id') ->toArray(); }) - ->searchable() - ->optionsLimit(100), + ->searchable(), Filter::make('published_at') ->schema([ diff --git a/resources/views/filament/pages/information/list-course-schedules.blade.php b/resources/views/filament/pages/information/list-course-schedules.blade.php index d7e396a..5d0a37d 100644 --- a/resources/views/filament/pages/information/list-course-schedules.blade.php +++ b/resources/views/filament/pages/information/list-course-schedules.blade.php @@ -12,7 +12,7 @@ class="fi-section-content rounded-xl border border-info-200 bg-info-50 dark:bg-i
-
+
{{ $this->form }}
diff --git a/resources/views/filament/resources/learning/attendances/pages/list-attendances.blade.php b/resources/views/filament/resources/learning/attendances/pages/list-attendances.blade.php index cc65bba..f2d7128 100644 --- a/resources/views/filament/resources/learning/attendances/pages/list-attendances.blade.php +++ b/resources/views/filament/resources/learning/attendances/pages/list-attendances.blade.php @@ -25,34 +25,33 @@ class="inline-flex items-center gap-1 rounded-full bg-primary-600 px-3 py-1 text @endif
-
- !$card->is_attended, - 'bg-white dark:bg-primary-800/40 text-primary-700 dark:text-primary-200 ring-primary-500/30' => - $card->is_attended, - ])> - {{ $card->course_name }} - -
-

!$card->is_attended, 'text-primary-900 dark:text-primary-100' => $card->is_attended, ])> - !$card->is_attended, 'text-primary-500' => $card->is_attended, ]) /> - Presensi Kuliah + {{ $card->course_name }}

+
!$card->is_attended, + 'text-primary-600 dark:text-primary-400' => $card->is_attended, + ])> + !$card->is_attended]) /> + + {{ $card->lecturer_name }} + +
-
+
!$card->is_attended, @@ -80,7 +79,7 @@ class="text-[10px] font-bold uppercase text-gray-400 tracking-widest leading-non
!$card->is_attended, 'border-primary-200 dark:border-primary-800' => $card->is_attended, ])>