fix: show check/preview actions

This commit is contained in:
Ahmed Darrazi 2025-12-30 23:38:05 +01:00
parent a43fef535b
commit 5e16c25fca
2 changed files with 206 additions and 200 deletions

View File

@ -1,4 +1,6 @@
@php @php
$fieldWrapperView = $getFieldWrapperView();
$results = $getState() ?? []; $results = $getState() ?? [];
$results = is_array($results) ? $results : []; $results = is_array($results) ? $results : [];
@ -37,82 +39,83 @@
}; };
@endphp @endphp
<div class="space-y-4"> <x-dynamic-component :component="$fieldWrapperView" :field="$field">
<x-filament::section <div class="space-y-4">
heading="Safety checks" <x-filament::section
:description="$ranAtLabel ? ('Last run: ' . $ranAtLabel) : 'Run checks to evaluate risk before previewing.'" heading="Safety checks"
> :description="$ranAtLabel ? ('Last run: ' . $ranAtLabel) : 'Run checks to evaluate risk before previewing.'"
<div class="flex flex-wrap gap-2"> >
<x-filament::badge :color="$blocking > 0 ? 'danger' : 'gray'"> <div class="flex flex-wrap gap-2">
{{ $blocking }} blocking <x-filament::badge :color="$blocking > 0 ? 'danger' : 'gray'">
</x-filament::badge> {{ $blocking }} blocking
<x-filament::badge :color="$warning > 0 ? 'warning' : 'gray'"> </x-filament::badge>
{{ $warning }} warnings <x-filament::badge :color="$warning > 0 ? 'warning' : 'gray'">
</x-filament::badge> {{ $warning }} warnings
<x-filament::badge :color="$safe > 0 ? 'success' : 'gray'"> </x-filament::badge>
{{ $safe }} safe <x-filament::badge :color="$safe > 0 ? 'success' : 'gray'">
</x-filament::badge> {{ $safe }} safe
</div> </x-filament::badge>
</x-filament::section>
@if ($results === [])
<x-filament::section>
<div class="text-sm text-gray-600 dark:text-gray-300">
No checks have been run yet.
</div> </div>
</x-filament::section> </x-filament::section>
@else
<div class="space-y-3">
@foreach ($results as $result)
@php
$severity = is_array($result) ? ($result['severity'] ?? 'safe') : 'safe';
$title = is_array($result) ? ($result['title'] ?? $result['code'] ?? 'Check') : 'Check';
$message = is_array($result) ? ($result['message'] ?? null) : null;
$meta = is_array($result) ? ($result['meta'] ?? []) : [];
$meta = is_array($meta) ? $meta : [];
$unmappedGroups = $meta['unmapped'] ?? []; @if ($results === [])
$unmappedGroups = is_array($unmappedGroups) ? $limitedList($unmappedGroups) : []; <x-filament::section>
@endphp <div class="text-sm text-gray-600 dark:text-gray-300">
No checks have been run yet.
</div>
</x-filament::section>
@else
<div class="space-y-3">
@foreach ($results as $result)
@php
$severity = is_array($result) ? ($result['severity'] ?? 'safe') : 'safe';
$title = is_array($result) ? ($result['title'] ?? $result['code'] ?? 'Check') : 'Check';
$message = is_array($result) ? ($result['message'] ?? null) : null;
$meta = is_array($result) ? ($result['meta'] ?? []) : [];
$meta = is_array($meta) ? $meta : [];
<x-filament::section> $unmappedGroups = $meta['unmapped'] ?? [];
<div class="flex items-start justify-between gap-4"> $unmappedGroups = is_array($unmappedGroups) ? $limitedList($unmappedGroups) : [];
<div class="space-y-1"> @endphp
<div class="text-sm font-medium text-gray-900 dark:text-white">
{{ $title }} <x-filament::section>
</div> <div class="flex items-start justify-between gap-4">
@if (is_string($message) && $message !== '') <div class="space-y-1">
<div class="text-sm text-gray-600 dark:text-gray-300"> <div class="text-sm font-medium text-gray-900 dark:text-white">
{{ $message }} {{ $title }}
</div> </div>
@endif @if (is_string($message) && $message !== '')
</div> <div class="text-sm text-gray-600 dark:text-gray-300">
{{ $message }}
<x-filament::badge :color="$severityColor($severity)" size="sm"> </div>
{{ ucfirst((string) $severity) }} @endif
</x-filament::badge>
</div>
@if ($unmappedGroups !== [])
<div class="mt-3">
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Unmapped groups
</div> </div>
<ul class="mt-2 space-y-1 text-sm text-gray-700 dark:text-gray-200">
@foreach ($unmappedGroups as $group)
@php
$label = is_array($group) ? ($group['label'] ?? $group['id'] ?? null) : null;
@endphp
@if (is_string($label) && $label !== '')
<li>{{ $label }}</li>
@endif
@endforeach
</ul>
</div>
@endif
</x-filament::section>
@endforeach
</div>
@endif
</div>
<x-filament::badge :color="$severityColor($severity)" size="sm">
{{ ucfirst((string) $severity) }}
</x-filament::badge>
</div>
@if ($unmappedGroups !== [])
<div class="mt-3">
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Unmapped groups
</div>
<ul class="mt-2 space-y-1 text-sm text-gray-700 dark:text-gray-200">
@foreach ($unmappedGroups as $group)
@php
$label = is_array($group) ? ($group['label'] ?? $group['id'] ?? null) : null;
@endphp
@if (is_string($label) && $label !== '')
<li>{{ $label }}</li>
@endif
@endforeach
</ul>
</div>
@endif
</x-filament::section>
@endforeach
</div>
@endif
</div>
</x-dynamic-component>

View File

@ -1,4 +1,6 @@
@php @php
$fieldWrapperView = $getFieldWrapperView();
$diffs = $getState() ?? []; $diffs = $getState() ?? [];
$diffs = is_array($diffs) ? $diffs : []; $diffs = is_array($diffs) ? $diffs : [];
@ -33,145 +35,146 @@
}; };
@endphp @endphp
<div class="space-y-4"> <x-dynamic-component :component="$fieldWrapperView" :field="$field">
<x-filament::section <div class="space-y-4">
heading="Preview" <x-filament::section
:description="$ranAtLabel ? ('Generated: ' . $ranAtLabel) : 'Generate a preview to see what would change.'" heading="Preview"
> :description="$ranAtLabel ? ('Generated: ' . $ranAtLabel) : 'Generate a preview to see what would change.'"
<div class="flex flex-wrap gap-2"> >
<x-filament::badge :color="$policiesChanged > 0 ? 'warning' : 'success'"> <div class="flex flex-wrap gap-2">
{{ $policiesChanged }}/{{ $policiesTotal }} policies changed <x-filament::badge :color="$policiesChanged > 0 ? 'warning' : 'success'">
</x-filament::badge> {{ $policiesChanged }}/{{ $policiesTotal }} policies changed
<x-filament::badge :color="$assignmentsChanged > 0 ? 'warning' : 'gray'">
{{ $assignmentsChanged }} assignments changed
</x-filament::badge>
<x-filament::badge :color="$scopeTagsChanged > 0 ? 'warning' : 'gray'">
{{ $scopeTagsChanged }} scope tags changed
</x-filament::badge>
@if ($diffsOmitted > 0)
<x-filament::badge color="gray">
{{ $diffsOmitted }} diffs omitted (limit)
</x-filament::badge> </x-filament::badge>
@endif <x-filament::badge :color="$assignmentsChanged > 0 ? 'warning' : 'gray'">
</div> {{ $assignmentsChanged }} assignments changed
</x-filament::section> </x-filament::badge>
<x-filament::badge :color="$scopeTagsChanged > 0 ? 'warning' : 'gray'">
@if ($diffs === []) {{ $scopeTagsChanged }} scope tags changed
<x-filament::section> </x-filament::badge>
<div class="text-sm text-gray-600 dark:text-gray-300"> @if ($diffsOmitted > 0)
No preview generated yet. <x-filament::badge color="gray">
{{ $diffsOmitted }} diffs omitted (limit)
</x-filament::badge>
@endif
</div> </div>
</x-filament::section> </x-filament::section>
@else
<div class="space-y-3">
@foreach ($diffs as $entry)
@php
$entry = is_array($entry) ? $entry : [];
$name = $entry['display_name'] ?? $entry['policy_identifier'] ?? 'Item';
$type = $entry['policy_type'] ?? 'type';
$platform = $entry['platform'] ?? 'platform';
$action = $entry['action'] ?? 'update';
$diff = is_array($entry['diff'] ?? null) ? $entry['diff'] : [];
$diffSummary = is_array($diff['summary'] ?? null) ? $diff['summary'] : [];
$added = (int) ($diffSummary['added'] ?? 0); @if ($diffs === [])
$removed = (int) ($diffSummary['removed'] ?? 0); <x-filament::section>
$changed = (int) ($diffSummary['changed'] ?? 0); <div class="text-sm text-gray-600 dark:text-gray-300">
No preview generated yet.
</div>
</x-filament::section>
@else
<div class="space-y-3">
@foreach ($diffs as $entry)
@php
$entry = is_array($entry) ? $entry : [];
$name = $entry['display_name'] ?? $entry['policy_identifier'] ?? 'Item';
$type = $entry['policy_type'] ?? 'type';
$platform = $entry['platform'] ?? 'platform';
$action = $entry['action'] ?? 'update';
$diff = is_array($entry['diff'] ?? null) ? $entry['diff'] : [];
$diffSummary = is_array($diff['summary'] ?? null) ? $diff['summary'] : [];
$assignmentsDelta = (bool) ($entry['assignments_changed'] ?? false); $added = (int) ($diffSummary['added'] ?? 0);
$scopeTagsDelta = (bool) ($entry['scope_tags_changed'] ?? false); $removed = (int) ($diffSummary['removed'] ?? 0);
$diffOmitted = (bool) ($entry['diff_omitted'] ?? false); $changed = (int) ($diffSummary['changed'] ?? 0);
$diffTruncated = (bool) ($entry['diff_truncated'] ?? false);
$changedKeys = $limitedKeys(is_array($diff['changed'] ?? null) ? $diff['changed'] : []); $assignmentsDelta = (bool) ($entry['assignments_changed'] ?? false);
$addedKeys = $limitedKeys(is_array($diff['added'] ?? null) ? $diff['added'] : []); $scopeTagsDelta = (bool) ($entry['scope_tags_changed'] ?? false);
$removedKeys = $limitedKeys(is_array($diff['removed'] ?? null) ? $diff['removed'] : []); $diffOmitted = (bool) ($entry['diff_omitted'] ?? false);
@endphp $diffTruncated = (bool) ($entry['diff_truncated'] ?? false);
<x-filament::section :heading="$name" :description="sprintf('%s • %s', $type, $platform)" collapsible :collapsed="true"> $changedKeys = $limitedKeys(is_array($diff['changed'] ?? null) ? $diff['changed'] : []);
<div class="flex flex-wrap gap-2"> $addedKeys = $limitedKeys(is_array($diff['added'] ?? null) ? $diff['added'] : []);
<x-filament::badge :color="$action === 'create' ? 'success' : 'gray'" size="sm"> $removedKeys = $limitedKeys(is_array($diff['removed'] ?? null) ? $diff['removed'] : []);
{{ $action }} @endphp
</x-filament::badge>
<x-filament::badge color="success" size="sm"> <x-filament::section :heading="$name" :description="sprintf('%s • %s', $type, $platform)" collapsible :collapsed="true">
{{ $added }} added <div class="flex flex-wrap gap-2">
</x-filament::badge> <x-filament::badge :color="$action === 'create' ? 'success' : 'gray'" size="sm">
<x-filament::badge color="danger" size="sm"> {{ $action }}
{{ $removed }} removed </x-filament::badge>
</x-filament::badge> <x-filament::badge color="success" size="sm">
<x-filament::badge color="warning" size="sm"> {{ $added }} added
{{ $changed }} changed </x-filament::badge>
</x-filament::badge> <x-filament::badge color="danger" size="sm">
@if ($assignmentsDelta) {{ $removed }} removed
</x-filament::badge>
<x-filament::badge color="warning" size="sm"> <x-filament::badge color="warning" size="sm">
assignments {{ $changed }} changed
</x-filament::badge> </x-filament::badge>
@endif @if ($assignmentsDelta)
@if ($scopeTagsDelta) <x-filament::badge color="warning" size="sm">
<x-filament::badge color="warning" size="sm"> assignments
scope tags </x-filament::badge>
</x-filament::badge>
@endif
@if ($diffTruncated)
<x-filament::badge color="gray" size="sm">
truncated
</x-filament::badge>
@endif
</div>
@if ($diffOmitted)
<div class="mt-3 text-sm text-gray-600 dark:text-gray-300">
Diff details omitted due to preview limits. Narrow scope to see more items in detail.
</div>
@elseif ($changedKeys !== [] || $addedKeys !== [] || $removedKeys !== [])
<div class="mt-3 space-y-3 text-sm text-gray-700 dark:text-gray-200">
@if ($changedKeys !== [])
<div>
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Changed keys (sample)
</div>
<ul class="mt-1 space-y-1">
@foreach ($changedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif @endif
@if ($addedKeys !== []) @if ($scopeTagsDelta)
<div> <x-filament::badge color="warning" size="sm">
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400"> scope tags
Added keys (sample) </x-filament::badge>
</div>
<ul class="mt-1 space-y-1">
@foreach ($addedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif @endif
@if ($removedKeys !== []) @if ($diffTruncated)
<div> <x-filament::badge color="gray" size="sm">
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400"> truncated
Removed keys (sample) </x-filament::badge>
</div>
<ul class="mt-1 space-y-1">
@foreach ($removedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif @endif
</div> </div>
@endif
</x-filament::section>
@endforeach
</div>
@endif
</div>
@if ($diffOmitted)
<div class="mt-3 text-sm text-gray-600 dark:text-gray-300">
Diff details omitted due to preview limits. Narrow scope to see more items in detail.
</div>
@elseif ($changedKeys !== [] || $addedKeys !== [] || $removedKeys !== [])
<div class="mt-3 space-y-3 text-sm text-gray-700 dark:text-gray-200">
@if ($changedKeys !== [])
<div>
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Changed keys (sample)
</div>
<ul class="mt-1 space-y-1">
@foreach ($changedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif
@if ($addedKeys !== [])
<div>
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Added keys (sample)
</div>
<ul class="mt-1 space-y-1">
@foreach ($addedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif
@if ($removedKeys !== [])
<div>
<div class="text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">
Removed keys (sample)
</div>
<ul class="mt-1 space-y-1">
@foreach ($removedKeys as $key)
<li class="rounded bg-gray-50 px-2 py-1 text-xs text-gray-800 dark:bg-white/5 dark:text-gray-200">
{{ $key }}
</li>
@endforeach
</ul>
</div>
@endif
</div>
@endif
</x-filament::section>
@endforeach
</div>
@endif
</div>
</x-dynamic-component>