*/ protected function getStats(): array { $tenant = Filament::getTenant(); if (! $tenant instanceof Tenant) { return $this->emptyStats(); } $tenantId = (int) $tenant->getKey(); $openDriftFindings = (int) Finding::query() ->where('tenant_id', $tenantId) ->openDrift() ->count(); $highSeverityActiveFindings = (int) Finding::query() ->where('tenant_id', $tenantId) ->highSeverityActive() ->count(); $activeRuns = (int) OperationRun::query() ->where('tenant_id', $tenantId) ->healthyActive() ->count(); $followUpRuns = (int) OperationRun::query() ->where('tenant_id', $tenantId) ->dashboardNeedsFollowUp() ->count(); $openDriftUrl = $openDriftFindings > 0 ? $this->findingsUrl($tenant, [ 'tab' => 'needs_action', 'finding_type' => Finding::FINDING_TYPE_DRIFT, ]) : null; $highSeverityUrl = $highSeverityActiveFindings > 0 ? $this->findingsUrl($tenant, [ 'tab' => 'needs_action', 'high_severity' => 1, ]) : null; $findingsHelperText = $this->findingsHelperText($tenant); return [ Stat::make('Open drift findings', $openDriftFindings) ->description($openDriftUrl === null && $openDriftFindings > 0 ? $findingsHelperText : 'active drift workflow items') ->color($openDriftFindings > 0 ? 'warning' : 'gray') ->url($openDriftUrl), Stat::make('High severity active findings', $highSeverityActiveFindings) ->description($highSeverityUrl === null && $highSeverityActiveFindings > 0 ? $findingsHelperText : 'high or critical findings needing review') ->color($highSeverityActiveFindings > 0 ? 'danger' : 'gray') ->url($highSeverityUrl), Stat::make('Active operations', $activeRuns) ->description('healthy queued or running tenant work') ->color($activeRuns > 0 ? 'info' : 'gray') ->url($activeRuns > 0 ? OperationRunLinks::index($tenant, activeTab: 'active') : null), Stat::make('Operations needing follow-up', $followUpRuns) ->description('failed, warning, or stalled runs') ->color($followUpRuns > 0 ? 'danger' : 'gray') ->url($followUpRuns > 0 ? OperationRunLinks::index($tenant, activeTab: 'blocked') : null), ]; } /** * @return array */ private function emptyStats(): array { return [ Stat::make('Open drift findings', 0), Stat::make('High severity active findings', 0), Stat::make('Active operations', 0), Stat::make('Operations needing follow-up', 0), ]; } /** * @param array $parameters */ private function findingsUrl(Tenant $tenant, array $parameters): ?string { if (! $this->canOpenFindings($tenant)) { return null; } return FindingResource::getUrl('index', $parameters, panel: 'tenant', tenant: $tenant); } private function findingsHelperText(Tenant $tenant): string { return $this->canOpenFindings($tenant) ? 'Open findings' : UiTooltips::INSUFFICIENT_PERMISSION; } private function canOpenFindings(Tenant $tenant): bool { $user = auth()->user(); return $user instanceof User && $user->canAccessTenant($tenant) && $user->can(Capabilities::TENANT_FINDINGS_VIEW, $tenant); } }