query( OperationRun::query() ->where('tenant_id', Filament::getTenant()->id) ->latest('created_at') ) ->columns([ TextColumn::make('type') ->formatStateUsing(fn (?string $state): string => OperationCatalog::label((string) $state)) ->searchable() ->sortable(), TextColumn::make('status') ->badge() ->formatStateUsing(BadgeRenderer::label(BadgeDomain::OperationRunStatus)) ->color(BadgeRenderer::color(BadgeDomain::OperationRunStatus)) ->icon(BadgeRenderer::icon(BadgeDomain::OperationRunStatus)) ->iconColor(BadgeRenderer::iconColor(BadgeDomain::OperationRunStatus)), TextColumn::make('outcome') ->badge() ->formatStateUsing(BadgeRenderer::label(BadgeDomain::OperationRunOutcome)) ->color(BadgeRenderer::color(BadgeDomain::OperationRunOutcome)) ->icon(BadgeRenderer::icon(BadgeDomain::OperationRunOutcome)) ->iconColor(BadgeRenderer::iconColor(BadgeDomain::OperationRunOutcome)), TextColumn::make('initiator_name') ->label('Initiator') ->searchable(), TextColumn::make('created_at') ->dateTime() ->sortable() ->label('Started'), TextColumn::make('duration') ->getStateUsing(function (OperationRun $record) { if ($record->started_at && $record->completed_at) { return $record->completed_at->diffForHumans($record->started_at, true); } return '-'; }), ]) ->filters([ SelectFilter::make('outcome') ->options([ 'succeeded' => 'Succeeded', 'partially_succeeded' => 'Partially Succeeded', 'failed' => 'Failed', 'cancelled' => 'Cancelled', 'pending' => 'Pending', ]), SelectFilter::make('type') ->options( fn () => OperationRun::where('tenant_id', Filament::getTenant()->id) ->distinct() ->pluck('type', 'type') ->toArray() ), Filter::make('created_at') ->form([ DatePicker::make('created_from'), DatePicker::make('created_until'), ]) ->query(function (Builder $query, array $data): Builder { return $query ->when( $data['created_from'], fn (Builder $query, $date) => $query->whereDate('created_at', '>=', $date), ) ->when( $data['created_until'], fn (Builder $query, $date) => $query->whereDate('created_at', '<=', $date), ); }), ]) ->actions([ // View action handled by opening a modal or side-peek ]); } }