schema([ Section::make('Sync Run') ->schema([ TextEntry::make('status') ->badge() ->color(fn (InventorySyncRun $record): string => static::statusColor($record->status)), TextEntry::make('selection_hash')->label('Selection hash')->copyable(), TextEntry::make('started_at')->dateTime(), TextEntry::make('finished_at')->dateTime(), TextEntry::make('items_observed_count')->label('Observed')->numeric(), TextEntry::make('items_upserted_count')->label('Upserted')->numeric(), TextEntry::make('errors_count')->label('Errors')->numeric(), TextEntry::make('had_errors')->label('Had errors')->badge(), ]) ->columns(2) ->columnSpanFull(), Section::make('Selection Payload') ->schema([ ViewEntry::make('selection_payload') ->label('') ->view('filament.infolists.entries.snapshot-json') ->state(fn (InventorySyncRun $record) => $record->selection_payload ?? []) ->columnSpanFull(), ]) ->columnSpanFull(), Section::make('Error Summary') ->schema([ ViewEntry::make('error_codes') ->label('Error codes') ->view('filament.infolists.entries.snapshot-json') ->state(fn (InventorySyncRun $record) => $record->error_codes ?? []) ->columnSpanFull(), ViewEntry::make('error_context') ->label('Safe error context') ->view('filament.infolists.entries.snapshot-json') ->state(fn (InventorySyncRun $record) => $record->error_context ?? []) ->columnSpanFull(), ]) ->columnSpanFull(), ]); } public static function table(Table $table): Table { return $table ->defaultSort('id', 'desc') ->columns([ Tables\Columns\TextColumn::make('status') ->badge() ->color(fn (InventorySyncRun $record): string => static::statusColor($record->status)), Tables\Columns\TextColumn::make('selection_hash') ->label('Selection') ->copyable() ->limit(12), Tables\Columns\TextColumn::make('started_at')->since(), Tables\Columns\TextColumn::make('finished_at')->since(), Tables\Columns\TextColumn::make('items_observed_count') ->label('Observed') ->numeric(), Tables\Columns\TextColumn::make('items_upserted_count') ->label('Upserted') ->numeric(), Tables\Columns\TextColumn::make('errors_count') ->label('Errors') ->numeric(), ]) ->actions([ Actions\ViewAction::make(), ]) ->bulkActions([]); } public static function getEloquentQuery(): Builder { $tenantId = Tenant::current()->getKey(); return parent::getEloquentQuery() ->when($tenantId, fn (Builder $query) => $query->where('tenant_id', $tenantId)); } public static function getPages(): array { return [ 'index' => Pages\ListInventorySyncRuns::route('/'), 'view' => Pages\ViewInventorySyncRun::route('/{record}'), ]; } private static function statusColor(?string $status): string { return match ($status) { InventorySyncRun::STATUS_SUCCESS => 'success', InventorySyncRun::STATUS_PARTIAL => 'warning', InventorySyncRun::STATUS_FAILED => 'danger', InventorySyncRun::STATUS_SKIPPED => 'gray', InventorySyncRun::STATUS_RUNNING => 'info', default => 'gray', }; } }