## Summary - align tenant dashboard KPI, attention, compare, and operations truth so the page does not read calmer than the tenant's actual state - preserve tenant-safe drill-through continuity into findings, baseline compare, and canonical operations, including disabled helper states for permission-limited members - add the Spec 173 artifact set and focused regression coverage for dashboard truth alignment and drill-through behavior ## Validation - `vendor/bin/sail bin pint --dirty --format agent` - `vendor/bin/sail artisan test --compact tests/Feature/Filament/DashboardKpisWidgetTest.php tests/Feature/Filament/TenantDashboardTruthAlignmentTest.php tests/Feature/Monitoring/OperationsDashboardDrillthroughTest.php tests/Feature/Filament/NeedsAttentionWidgetTest.php tests/Feature/Filament/BaselineCompareNowWidgetTest.php tests/Feature/Filament/BaselineCompareSummaryConsistencyTest.php tests/Feature/Findings/FindingsListDefaultsTest.php tests/Feature/Findings/FindingsListFiltersTest.php tests/Feature/Findings/FindingAdminTenantParityTest.php tests/Feature/OpsUx/CanonicalViewRunLinksTest.php tests/Feature/Filament/TenantDashboardTenantScopeTest.php tests/Feature/Filament/TenantDashboardDbOnlyTest.php tests/Feature/Filament/TableStandardsBaselineTest.php tests/Feature/Filament/TableDetailVisibilityTest.php` - integrated browser smoke on the tenant dashboard, including a permission-limited member scenario Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #204
75 lines
3.7 KiB
PHP
75 lines
3.7 KiB
PHP
<div
|
|
@if ($pollingInterval)
|
|
wire:poll.{{ $pollingInterval }}
|
|
@endif
|
|
>
|
|
<x-filament::section heading="Needs Attention">
|
|
@if (count($items) === 0)
|
|
<div class="flex flex-col gap-3">
|
|
<div class="text-sm text-gray-600 dark:text-gray-300">
|
|
Current governance and findings signals look trustworthy.
|
|
</div>
|
|
|
|
<div class="flex flex-col gap-3">
|
|
@foreach ($healthyChecks as $check)
|
|
<div class="flex items-start gap-3 rounded-lg bg-gray-50 p-4 dark:bg-white/5">
|
|
<x-filament::icon
|
|
icon="heroicon-m-check-circle"
|
|
class="mt-0.5 h-5 w-5 text-success-600 dark:text-success-400"
|
|
/>
|
|
|
|
<div class="flex-1">
|
|
<div class="text-sm font-medium text-gray-950 dark:text-white">{{ $check['title'] }}</div>
|
|
<div class="mt-0.5 text-sm text-gray-600 dark:text-gray-300">{{ $check['body'] }}</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
@else
|
|
<div class="flex flex-col gap-3">
|
|
@foreach ($items as $item)
|
|
<div class="rounded-lg bg-gray-50 p-4 dark:bg-white/5">
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0 flex-1">
|
|
<div class="text-sm font-semibold text-gray-950 dark:text-white">{{ $item['title'] }}</div>
|
|
<div class="mt-1 text-sm text-gray-600 dark:text-gray-300">{{ $item['body'] }}</div>
|
|
|
|
@if (filled($item['supportingMessage'] ?? null))
|
|
<div class="mt-1 text-sm text-gray-600 dark:text-gray-300">
|
|
{{ $item['supportingMessage'] }}
|
|
</div>
|
|
@endif
|
|
|
|
@if (filled($item['actionLabel'] ?? null))
|
|
<div class="mt-3">
|
|
@if (filled($item['actionUrl'] ?? null))
|
|
<x-filament::link :href="$item['actionUrl']" size="sm" class="font-medium">
|
|
{{ $item['actionLabel'] }}
|
|
</x-filament::link>
|
|
@else
|
|
<div class="text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400">
|
|
{{ $item['actionLabel'] }}
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
|
|
@if (filled($item['helperText'] ?? null))
|
|
<div class="mt-1 text-xs text-gray-500 dark:text-gray-400">
|
|
{{ $item['helperText'] }}
|
|
</div>
|
|
@endif
|
|
</div>
|
|
|
|
<x-filament::badge :color="$item['badgeColor']" size="sm">
|
|
{{ $item['badge'] }}
|
|
</x-filament::badge>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
</x-filament::section>
|
|
</div>
|