schema([ Section::make('Run') ->schema([ TextEntry::make('user.name') ->label('Initiator') ->placeholder('—'), TextEntry::make('resource')->badge(), TextEntry::make('action')->badge(), TextEntry::make('status') ->badge() ->color(fn (BulkOperationRun $record): string => static::statusColor($record->status)), TextEntry::make('total_items')->label('Total')->numeric(), TextEntry::make('processed_items')->label('Processed')->numeric(), TextEntry::make('succeeded')->numeric(), TextEntry::make('failed')->numeric(), TextEntry::make('skipped')->numeric(), TextEntry::make('created_at')->dateTime(), TextEntry::make('updated_at')->dateTime(), TextEntry::make('idempotency_key')->label('Idempotency key')->copyable()->placeholder('—'), ]) ->columns(2) ->columnSpanFull(), Section::make('Items') ->schema([ ViewEntry::make('item_ids') ->label('') ->view('filament.infolists.entries.snapshot-json') ->state(fn (BulkOperationRun $record) => $record->item_ids ?? []) ->columnSpanFull(), ]) ->columnSpanFull(), Section::make('Failures') ->schema([ ViewEntry::make('failures') ->label('') ->view('filament.infolists.entries.snapshot-json') ->state(fn (BulkOperationRun $record) => $record->failures ?? []) ->columnSpanFull(), ]) ->columnSpanFull(), ]); } public static function table(Table $table): Table { return $table ->defaultSort('id', 'desc') ->modifyQueryUsing(function (Builder $query): Builder { $tenantId = Tenant::current()->getKey(); return $query->when($tenantId, fn (Builder $q) => $q->where('tenant_id', $tenantId)); }) ->columns([ Tables\Columns\TextColumn::make('user.name') ->label('Initiator') ->placeholder('—') ->toggleable(), Tables\Columns\TextColumn::make('resource')->badge(), Tables\Columns\TextColumn::make('action')->badge(), Tables\Columns\TextColumn::make('status') ->badge() ->color(fn (BulkOperationRun $record): string => static::statusColor($record->status)), Tables\Columns\TextColumn::make('created_at')->since(), Tables\Columns\TextColumn::make('total_items')->label('Total')->numeric(), Tables\Columns\TextColumn::make('processed_items')->label('Processed')->numeric(), Tables\Columns\TextColumn::make('failed')->numeric(), ]) ->actions([ Actions\ViewAction::make(), ]) ->bulkActions([]); } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with('user') ->latest('id'); } public static function getPages(): array { return [ 'index' => Pages\ListBulkOperationRuns::route('/'), 'view' => Pages\ViewBulkOperationRun::route('/{record}'), ]; } private static function statusColor(?string $status): string { return match ($status) { 'completed' => 'success', 'completed_with_errors' => 'warning', 'failed' => 'danger', 'running' => 'info', default => 'gray', }; } }