111 lines
4.6 KiB
PHP
111 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\BackupScheduleResource\RelationManagers;
|
|
|
|
use App\Filament\Resources\BackupSetResource;
|
|
use App\Models\BackupScheduleRun;
|
|
use App\Models\Tenant;
|
|
use Filament\Actions;
|
|
use Filament\Resources\RelationManagers\RelationManager;
|
|
use Filament\Tables;
|
|
use Filament\Tables\Table;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class BackupScheduleRunsRelationManager extends RelationManager
|
|
{
|
|
protected static string $relationship = 'runs';
|
|
|
|
public function table(Table $table): Table
|
|
{
|
|
return $table
|
|
->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()
|
|
->color(fn (?string $state): string => match ($state) {
|
|
BackupScheduleRun::STATUS_SUCCESS => 'success',
|
|
BackupScheduleRun::STATUS_PARTIAL => 'warning',
|
|
BackupScheduleRun::STATUS_RUNNING => 'primary',
|
|
BackupScheduleRun::STATUS_SKIPPED => 'gray',
|
|
BackupScheduleRun::STATUS_FAILED,
|
|
BackupScheduleRun::STATUS_CANCELED => 'danger',
|
|
default => 'gray',
|
|
}),
|
|
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([]);
|
|
}
|
|
}
|