{{-- Stakeholder Report — Page 3 (Resources) Pure resource story: aggregate → per-project breakdown → gaps & risks. Reads ResourcesGateway (ResourceSummary value object). Three sections: 1. Aggregate cards — the 30-second overview (People / Budget / Deps) 2. Per-project breakdown — the "where's it going" drill-down, one row per project 3. Resource gaps & risks — plain-English callouts of imbalances that need attention The old LM-item→program linkage matrix moved off this page — that question belongs on the Logic Model read-out (Page 2), where board readers have context for what "linkage" means. Sizing note: board audiences skew older and reports often get projected or printed. Cards and numbers are intentionally large — this is the default, not an accessibility toggle. Vars in: $resourceSummary null | \Leantime\Core\Resources\Models\ResourceSummary $report array from ReportEngine::buildReport (has .summaries[] with id/name) $scope 'strategy' | 'program' $logicModel, $hasLM — passed through but not used here anymore --}} @php // Does this strategy/program actually have authored resource data? // $resourceSummary is non-null whenever the provider (PgmPro) is installed — // even with nothing authored — so a null check alone leaves a wall of empty // "—" cards. Detect "installed but empty" here to drive the onboarding empty // state and suppress the noisy empty sections below. (For a strategy the // strategy's own board is always empty by design; data rolls up from its // programs — so this is true whenever ANY program in scope has authored it.) // Use the aggregates ResourceSummary already computed — no view-level loop // over people/allocations. "Any active person" (allocation or capacity > 0) // reduces to totalCapacity/totalAllocated being > 0. $hasResourceData = $resourceSummary !== null && ( $resourceSummary->totalCapacity > 0 || $resourceSummary->totalAllocated > 0 || $resourceSummary->totalBudgeted > 0 || count($resourceSummary->dependencies) > 0 ); @endphp @if ($hasResourceData) {{-- Hours / Days unit toggle. The server always renders hours (source of truth); JS swaps any element with `data-hours` to a days display (÷ 8) when the toggle is set. Preference stored in localStorage. --}}