From 9c722934761a2e1089c087bfbfd9c9ffc310b1bd Mon Sep 17 00:00:00 2001 From: tuxarmy Date: Sat, 4 Apr 2026 06:32:19 +0700 Subject: [PATCH] feat: tambah kehadiran peserta per kegiatan via RelationManager --- .../Resources/Activities/ActivityResource.php | 8 +++ .../ParticipantsRelationManager.php | 59 +++++++++++++++++++ app/Models/Activity.php | 3 +- app/Models/User.php | 3 +- ...51_add_status_to_activity_member_table.php | 23 ++++++++ 5 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 app/Filament/Resources/Activities/RelationManagers/ParticipantsRelationManager.php create mode 100644 database/migrations/2026_04_03_232251_add_status_to_activity_member_table.php diff --git a/app/Filament/Resources/Activities/ActivityResource.php b/app/Filament/Resources/Activities/ActivityResource.php index 9f09be2..88d7a4f 100644 --- a/app/Filament/Resources/Activities/ActivityResource.php +++ b/app/Filament/Resources/Activities/ActivityResource.php @@ -5,6 +5,7 @@ namespace App\Filament\Resources\Activities; use App\Filament\Resources\Activities\Pages\CreateActivity; use App\Filament\Resources\Activities\Pages\EditActivity; use App\Filament\Resources\Activities\Pages\ListActivities; +use App\Filament\Resources\Activities\RelationManagers\ParticipantsRelationManager; use App\Filament\Resources\Activities\Schemas\ActivityForm; use App\Filament\Resources\Activities\Tables\ActivitiesTable; use App\Models\Activity; @@ -29,6 +30,13 @@ class ActivityResource extends Resource return ActivitiesTable::configure($table); } + public static function getRelations(): array + { + return [ + ParticipantsRelationManager::class, + ]; + } + public static function getPages(): array { return [ diff --git a/app/Filament/Resources/Activities/RelationManagers/ParticipantsRelationManager.php b/app/Filament/Resources/Activities/RelationManagers/ParticipantsRelationManager.php new file mode 100644 index 0000000..a46404b --- /dev/null +++ b/app/Filament/Resources/Activities/RelationManagers/ParticipantsRelationManager.php @@ -0,0 +1,59 @@ +components([ + Select::make('status') + ->options(['hadir' => 'Hadir', 'izin' => 'Izin', 'alpha' => 'Alpha']) + ->default('hadir')->required(), + Textarea::make('notes')->label('Catatan')->rows(2), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + TextColumn::make('name')->label('Anggota')->searchable(), + TextColumn::make('pivot.status')->label('Status')->badge() + ->color(fn ($state) => match ($state) { + 'hadir' => 'success', + 'izin' => 'warning', + 'alpha' => 'danger', + default => 'gray', + }), + TextColumn::make('pivot.notes')->label('Catatan')->placeholder('-'), + ]) + ->headerActions([ + AttachAction::make()->preloadRecordSelect() + ->form(fn (AttachAction $action) => [ + $action->getRecordSelect(), + Select::make('status') + ->options(['hadir' => 'Hadir', 'izin' => 'Izin', 'alpha' => 'Alpha']) + ->default('hadir')->required(), + Textarea::make('notes')->label('Catatan')->rows(2), + ]), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DetachBulkAction::make()])]); + } +} diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 33c2785..0afb5c2 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -33,6 +33,7 @@ class Activity extends Model public function participants(): BelongsToMany { - return $this->belongsToMany(User::class, 'activity_member'); + return $this->belongsToMany(User::class, 'activity_member') + ->withPivot('status', 'notes'); } } diff --git a/app/Models/User.php b/app/Models/User.php index fd9706d..9c94f83 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -40,7 +40,8 @@ class User extends Authenticatable implements FilamentUser public function activities(): BelongsToMany { - return $this->belongsToMany(Activity::class, 'activity_member'); + return $this->belongsToMany(Activity::class, 'activity_member') + ->withPivot('status', 'notes'); } public function statusLogs(): HasMany diff --git a/database/migrations/2026_04_03_232251_add_status_to_activity_member_table.php b/database/migrations/2026_04_03_232251_add_status_to_activity_member_table.php new file mode 100644 index 0000000..478ba53 --- /dev/null +++ b/database/migrations/2026_04_03_232251_add_status_to_activity_member_table.php @@ -0,0 +1,23 @@ +enum('status', ['hadir', 'izin', 'alpha'])->default('hadir')->after('user_id'); + $table->text('notes')->nullable()->after('status'); + }); + } + + public function down(): void + { + Schema::table('activity_member', function (Blueprint $table) { + $table->dropColumn(['status', 'notes']); + }); + } +};