From 5d86a670a41a68196ca42cab83371fdb03a70b60 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sun, 29 Mar 2026 21:02:19 +0700 Subject: [PATCH] feat: Add toggle functionality for user activation status in StudentsTable, including session management and success notifications. Implement status filter for improved user management. --- .../Master/Students/Tables/StudentsTable.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/app/Filament/Resources/Master/Students/Tables/StudentsTable.php b/app/Filament/Resources/Master/Students/Tables/StudentsTable.php index 5466085..d30fdd7 100644 --- a/app/Filament/Resources/Master/Students/Tables/StudentsTable.php +++ b/app/Filament/Resources/Master/Students/Tables/StudentsTable.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\Master\Students\Tables; +use App\Enums\IsActive; use App\Enums\RoleEnum; use App\Enums\Sex; use App\Filament\Actions\Cheerful\DeleteAction; @@ -11,15 +12,18 @@ use App\Filament\Actions\DefaultBulkActions; use App\Filament\Columns\TimestampColumns; use App\Filament\Resources\Master\Students\Actions\ChangePasswordAction; +use App\Filament\Support\SystemNotification; use App\Models\Student; use Filament\Actions\BulkActionGroup; use Filament\Support\Enums\Width; use Filament\Support\Icons\Heroicon; use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Facades\DB; class StudentsTable { @@ -80,9 +84,41 @@ public static function configure(Table $table): Table ->label('Alamat') ->limit(50), + ToggleColumn::make('user.is_active') + ->label('Status') + ->sortable() + ->getStateUsing(fn (Student $record): bool => $record->user?->is_active === IsActive::Active) + ->updateStateUsing(function (Student $record, bool $state): void { + $user = $record->user; + if (! $user) { + return; + } + + $user->is_active = $state ? IsActive::Active : IsActive::Inactive; + $user->save(); + + if ($user->is_active === IsActive::Inactive) { + DB::table('sessions') + ->where('user_id', $user->id) + ->delete(); + } + + SystemNotification::success( + $state ? 'Pengguna Diaktifkan! ✅' : 'Pengguna Dinonaktifkan ⛔', + $state ? 'Status akun pengguna berhasil diaktifkan kembali. Siap beraksi! 🚀' : 'Status akun pengguna telah berhasil dinonaktifkan. Istirahat dulu ya... 😴' + )->send(); + }) + ->visible(fn () => auth()->user()->hasRole([RoleEnum::Kosma, RoleEnum::Developer])), + ...TimestampColumns::make(), ]) ->filters([ + SelectFilter::make('status') + ->label('Status') + ->options(IsActive::class) + ->query(fn (Builder $query, array $data) => $query->when($data['value'], fn ($q) => $q->whereHas('user', fn ($uq) => $uq->where('is_active', $data['value'])))) + ->native(false), + SelectFilter::make('sex') ->label('Jenis Kelamin') ->options(Sex::class)