columns([ TextColumn::make('model_type')->label('Tipe') ->formatStateUsing(fn ($state) => class_basename($state)), TextColumn::make('model_id')->label('ID'), TextColumn::make('required_approvals')->label('Dibutuhkan'), TextColumn::make('items_count')->counts('items')->label('Sudah Approve'), TextColumn::make('status')->badge() ->color(fn ($state) => match ($state) { 'approved' => 'success', 'rejected' => 'danger', default => 'warning', }), TextColumn::make('created_at')->label('Dibuat')->date('d M Y'), ]) ->filters([ SelectFilter::make('status')->options([ 'pending' => 'Pending', 'approved' => 'Disetujui', 'rejected' => 'Ditolak', ]), ]) ->recordActions([ Action::make('approve') ->label('Setujui') ->icon('heroicon-o-check-circle') ->color('success') ->requiresConfirmation() ->visible(fn (Approval $record) => $record->status === 'pending') ->form([ Textarea::make('notes')->label('Catatan')->rows(2), ]) ->action(function (Approval $record, array $data): void { ApprovalItem::create([ 'approval_id' => $record->id, 'user_id' => auth()->id(), 'decision' => 'approve', 'notes' => $data['notes'] ?? null, ]); $approveCount = $record->items()->where('decision', 'approve')->count(); if ($approveCount >= $record->required_approvals) { $record->update(['status' => 'approved']); } \App\Models\ActivityLog::create([ 'user_id' => auth()->id(), 'action' => 'approved', 'model_type' => Approval::class, 'model_id' => $record->id, 'description' => auth()->user()->name . " menyetujui " . class_basename($record->model_type) . " #{$record->model_id}", ]); }), Action::make('reject') ->label('Tolak') ->icon('heroicon-o-x-circle') ->color('danger') ->requiresConfirmation() ->visible(fn (Approval $record) => $record->status === 'pending') ->form([ Textarea::make('notes')->label('Alasan Penolakan')->required()->rows(2), ]) ->action(function (Approval $record, array $data): void { ApprovalItem::create([ 'approval_id' => $record->id, 'user_id' => auth()->id(), 'decision' => 'reject', 'notes' => $data['notes'], ]); $record->update(['status' => 'rejected']); \App\Models\ActivityLog::create([ 'user_id' => auth()->id(), 'action' => 'rejected', 'model_type' => Approval::class, 'model_id' => $record->id, 'description' => auth()->user()->name . " menolak " . class_basename($record->model_type) . " #{$record->model_id}", ]); }), EditAction::make(), ]) ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); } }