schema([ Section::make('Legacy run view') ->description('Canonical monitoring is now available in Monitoring → Operations.') ->schema([ TextEntry::make('canonical_view') ->label('Canonical view') ->state('View in Operations') ->url(fn (EntraGroupSyncRun $record): string => OperationRunLinks::index(Tenant::current() ?? $record->tenant)) ->badge() ->color('primary'), ]) ->columnSpanFull(), Section::make('Sync Run') ->schema([ TextEntry::make('initiator.name') ->label('Initiator') ->placeholder('—'), TextEntry::make('status') ->badge() ->color(fn (EntraGroupSyncRun $record): string => static::statusColor($record->status)), TextEntry::make('selection_key')->label('Selection'), TextEntry::make('slot_key')->label('Slot')->placeholder('—')->copyable(), TextEntry::make('started_at')->dateTime(), TextEntry::make('finished_at')->dateTime(), TextEntry::make('pages_fetched')->label('Pages')->numeric(), TextEntry::make('items_observed_count')->label('Observed')->numeric(), TextEntry::make('items_upserted_count')->label('Upserted')->numeric(), TextEntry::make('error_count')->label('Errors')->numeric(), TextEntry::make('safety_stop_triggered')->label('Safety stop')->badge(), TextEntry::make('safety_stop_reason')->label('Stop reason')->placeholder('—'), ]) ->columns(2) ->columnSpanFull(), Section::make('Error Summary') ->schema([ TextEntry::make('error_code')->placeholder('—'), TextEntry::make('error_category')->placeholder('—'), ViewEntry::make('error_summary') ->label('Safe error summary') ->view('filament.infolists.entries.snapshot-json') ->state(fn (EntraGroupSyncRun $record) => $record->error_summary ? ['summary' => $record->error_summary] : []) ->columnSpanFull(), ]) ->columns(2) ->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('initiator.name') ->label('Initiator') ->placeholder('—') ->toggleable(), Tables\Columns\TextColumn::make('status') ->badge() ->color(fn (EntraGroupSyncRun $record): string => static::statusColor($record->status)), Tables\Columns\TextColumn::make('selection_key') ->label('Selection') ->limit(24) ->copyable(), Tables\Columns\TextColumn::make('slot_key') ->label('Slot') ->placeholder('—') ->limit(16) ->copyable(), Tables\Columns\TextColumn::make('started_at')->since(), Tables\Columns\TextColumn::make('finished_at')->since(), Tables\Columns\TextColumn::make('pages_fetched')->label('Pages')->numeric(), Tables\Columns\TextColumn::make('items_observed_count')->label('Observed')->numeric(), Tables\Columns\TextColumn::make('items_upserted_count')->label('Upserted')->numeric(), Tables\Columns\TextColumn::make('error_count')->label('Errors')->numeric(), ]) ->actions([ Actions\ViewAction::make(), ]) ->bulkActions([]); } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->with('initiator') ->latest('id'); } public static function getPages(): array { return [ 'index' => Pages\ListEntraGroupSyncRuns::route('/'), 'view' => Pages\ViewEntraGroupSyncRun::route('/{record}'), ]; } private static function statusColor(?string $status): string { return match ($status) { EntraGroupSyncRun::STATUS_SUCCEEDED => 'success', EntraGroupSyncRun::STATUS_PARTIAL => 'warning', EntraGroupSyncRun::STATUS_FAILED => 'danger', EntraGroupSyncRun::STATUS_RUNNING => 'info', EntraGroupSyncRun::STATUS_PENDING => 'gray', default => 'gray', }; } }