## Summary - collapse secondary and diagnostic operation-run sections by default to reduce page density - visually emphasize the primary next step while keeping counts readable but secondary - keep failures and other actionable detail available without dominating the default reading path ## Testing - vendor/bin/sail artisan test --compact tests/Feature/Filament/OperationRunBaselineTruthSurfaceTest.php tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php tests/Feature/Filament/EnterpriseDetailTemplateRegressionTest.php tests/Feature/Operations/TenantlessOperationRunViewerTest.php - vendor/bin/sail bin pint --dirty --format agent Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #194
85 lines
3.3 KiB
PHP
85 lines
3.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Support\Ui\EnterpriseDetail;
|
|
|
|
final readonly class EnterpriseDetailPageData
|
|
{
|
|
/**
|
|
* @param array{
|
|
* title?: string,
|
|
* description?: ?string,
|
|
* facts?: list<array<string, mixed>>,
|
|
* primaryNextStep?: array{
|
|
* label?: string,
|
|
* text: string,
|
|
* source: string,
|
|
* secondaryGuidance?: list<array{label: string, text: string, source: string}>
|
|
* },
|
|
* compactCounts?: array{
|
|
* summaryLine?: ?string,
|
|
* primaryFacts?: list<array<string, mixed>>,
|
|
* diagnosticFacts?: list<array<string, mixed>>
|
|
* },
|
|
* attentionNote?: ?string
|
|
* }|null $decisionZone
|
|
* @param list<DetailSectionData> $mainSections
|
|
* @param list<SupportingCardData> $supportingGroups
|
|
* @param list<TechnicalDetailData> $technicalSections
|
|
* @param list<array{title: string, description?: ?string, icon?: ?string}> $emptyStateNotes
|
|
*/
|
|
public function __construct(
|
|
public string $resourceType,
|
|
public string $scope,
|
|
public SummaryHeaderData $header,
|
|
public ?array $decisionZone = null,
|
|
public array $mainSections = [],
|
|
public array $supportingGroups = [],
|
|
public array $technicalSections = [],
|
|
public array $emptyStateNotes = [],
|
|
) {}
|
|
|
|
/**
|
|
* @return array{
|
|
* resourceType: string,
|
|
* scope: string,
|
|
* header: array{
|
|
* title: string,
|
|
* subtitle: ?string,
|
|
* statusBadges: list<array{label: string, color?: string, icon?: ?string, iconColor?: ?string}>,
|
|
* keyFacts: list<array{label: string, value: string, hint?: ?string, badge?: ?array{label: string, color?: string, icon?: ?string, iconColor?: ?string}}>,
|
|
* primaryActions: list<array{label: string, placement: string, url: ?string, actionName: ?string, destructive: bool, requiresConfirmation: bool, visible: bool, icon: ?string, openInNewTab: bool}>,
|
|
* descriptionHint: ?string
|
|
* },
|
|
* decisionZone: array<string, mixed>|null,
|
|
* mainSections: list<array<string, mixed>>,
|
|
* supportingGroups: list<array<string, mixed>>,
|
|
* technicalSections: list<array<string, mixed>>,
|
|
* emptyStateNotes: list<array{title: string, description?: ?string, icon?: ?string}>
|
|
* }
|
|
*/
|
|
public function toArray(): array
|
|
{
|
|
return [
|
|
'resourceType' => $this->resourceType,
|
|
'scope' => $this->scope,
|
|
'header' => $this->header->toArray(),
|
|
'decisionZone' => $this->decisionZone,
|
|
'mainSections' => array_values(array_map(
|
|
static fn (DetailSectionData $section): array => $section->toArray(),
|
|
$this->mainSections,
|
|
)),
|
|
'supportingGroups' => array_values(array_map(
|
|
static fn (SupportingCardData $group): array => $group->toArray(),
|
|
$this->supportingGroups,
|
|
)),
|
|
'technicalSections' => array_values(array_map(
|
|
static fn (TechnicalDetailData $section): array => $section->toArray(),
|
|
$this->technicalSections,
|
|
)),
|
|
'emptyStateNotes' => array_values($this->emptyStateNotes),
|
|
];
|
|
}
|
|
}
|