modifyQueryUsing(fn (Builder $query) => $query->where('tenant_id', Tenant::current()->getKey())->with('backupSet')) ->defaultSort('scheduled_for', 'desc') ->columns([ Tables\Columns\TextColumn::make('scheduled_for') ->label('Scheduled for') ->dateTime(), Tables\Columns\TextColumn::make('status') ->badge() ->formatStateUsing(BadgeRenderer::label(BadgeDomain::BackupScheduleRunStatus)) ->color(BadgeRenderer::color(BadgeDomain::BackupScheduleRunStatus)) ->icon(BadgeRenderer::icon(BadgeDomain::BackupScheduleRunStatus)) ->iconColor(BadgeRenderer::iconColor(BadgeDomain::BackupScheduleRunStatus)), Tables\Columns\TextColumn::make('duration') ->label('Duration') ->getStateUsing(function (BackupScheduleRun $record): string { if (! $record->started_at || ! $record->finished_at) { return '—'; } $seconds = max(0, $record->started_at->diffInSeconds($record->finished_at)); if ($seconds < 60) { return $seconds.'s'; } $minutes = intdiv($seconds, 60); $rem = $seconds % 60; return sprintf('%dm %ds', $minutes, $rem); }), Tables\Columns\TextColumn::make('counts') ->label('Counts') ->getStateUsing(function (BackupScheduleRun $record): string { $summary = is_array($record->summary) ? $record->summary : []; $total = (int) ($summary['policies_total'] ?? 0); $backedUp = (int) ($summary['policies_backed_up'] ?? 0); $errors = (int) ($summary['errors_count'] ?? 0); if ($total === 0 && $backedUp === 0 && $errors === 0) { return '—'; } return sprintf('%d/%d (%d errors)', $backedUp, $total, $errors); }), Tables\Columns\TextColumn::make('error_code') ->label('Error') ->badge() ->default('—'), Tables\Columns\TextColumn::make('error_message') ->label('Message') ->default('—') ->limit(80) ->wrap(), Tables\Columns\TextColumn::make('backup_set_id') ->label('Backup set') ->default('—') ->url(function (BackupScheduleRun $record): ?string { if (! $record->backup_set_id) { return null; } return BackupSetResource::getUrl('view', ['record' => $record->backup_set_id], tenant: Tenant::current()); }) ->openUrlInNewTab(true), ]) ->filters([]) ->headerActions([]) ->actions([ Actions\Action::make('view') ->label('View') ->icon('heroicon-o-eye') ->modalHeading('View backup schedule run') ->modalSubmitAction(false) ->modalCancelActionLabel('Close') ->modalContent(function (BackupScheduleRun $record): View { return view('filament.modals.backup-schedule-run-view', [ 'run' => $record, ]); }), ]) ->bulkActions([]); } }