feat/011-restore-run-wizard #37
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user