CluPilotCloud/resources/views/livewire/admin/host-detail.blade.php

93 lines
5.0 KiB
PHP

<div class="space-y-5" @if ($run && in_array($run->status, ['pending', 'running', 'waiting'])) wire:poll.4s @endif>
@php
$badge = ['pending' => 'pending', 'onboarding' => 'provisioning', 'active' => 'active', 'error' => 'failed', 'disabled' => 'suspended'][$host->status] ?? 'info';
@endphp
<div class="flex flex-wrap items-start justify-between gap-4 animate-rise">
<div class="min-w-0">
<a href="{{ route('admin.hosts') }}" wire:navigate class="inline-flex items-center gap-1.5 text-xs font-medium text-muted hover:text-body">
<x-ui.icon name="arrow-left" class="size-4" />{{ __('hosts.back') }}
</a>
<div class="mt-2 flex items-center gap-3">
<h1 class="font-mono text-2xl font-semibold tracking-tight text-ink">{{ $host->name }}</h1>
<x-ui.badge :status="$badge">{{ __('hosts.status.'.$host->status) }}</x-ui.badge>
</div>
<p class="mt-1 font-mono text-xs text-muted">{{ $host->public_ip }} · {{ $host->datacenter }}</p>
</div>
<div class="flex items-center gap-3">
@if ($run && $run->status === 'failed')
<x-ui.button variant="secondary" size="sm" wire:click="retry" wire:loading.attr="disabled">
<x-ui.icon name="rotate-ccw" class="size-4" />{{ __('hosts.retry') }}
</x-ui.button>
@endif
<x-ui.button variant="danger" size="sm"
x-on:click="$dispatch('openModal', { component: 'admin.confirm-remove-host', arguments: { uuid: '{{ $host->uuid }}' } })">
<x-ui.icon name="trash-2" class="size-4" />{{ __('hosts.remove') }}
</x-ui.button>
</div>
</div>
@if ($host->status === 'active')
<div class="grid grid-cols-2 gap-3 sm:grid-cols-4 animate-rise">
@foreach ([
['meta.cores', $host->cpu_cores],
['meta.ram', $host->total_ram_mb ? round($host->total_ram_mb / 1024).' GB' : __('hosts.unknown')],
['meta.wg_ip', $host->wg_ip ?? __('hosts.unknown')],
['meta.version', $host->pve_version ?? __('hosts.unknown')],
] as [$key, $value])
<div class="rounded-xl border border-line bg-surface p-4 shadow-xs">
<p class="text-xs text-muted">{{ __('hosts.'.$key) }}</p>
<p class="mt-1 truncate font-mono text-sm font-semibold text-ink">{{ $value }}</p>
</div>
@endforeach
</div>
@endif
@if ($run && $run->status === 'failed')
<div class="flex items-start gap-3 rounded-xl border border-danger-border bg-danger-bg p-4 animate-rise">
<x-ui.icon name="alert-triangle" class="size-5 shrink-0 text-danger" />
<div class="min-w-0">
<p class="text-sm font-semibold text-danger">{{ __('hosts.error_title') }}</p>
<p class="mt-0.5 break-words text-sm text-body">{{ $run->error }}</p>
</div>
</div>
@endif
<div class="grid grid-cols-1 gap-4 lg:grid-cols-5">
<div class="rounded-xl border border-line bg-surface p-5 shadow-xs animate-rise lg:col-span-3">
<h2 class="mb-4 text-sm font-semibold text-ink">{{ __('hosts.progress') }}</h2>
@if ($run)
<x-ui.progress-stepper :steps="$steps" />
@else
<p class="text-sm text-muted">{{ __('hosts.no_run') }}</p>
@endif
</div>
<div class="rounded-xl border border-line bg-surface p-5 shadow-xs animate-rise lg:col-span-2">
<h2 class="mb-4 text-sm font-semibold text-ink">{{ __('hosts.events') }}</h2>
@if ($events->isEmpty())
<p class="text-sm text-muted">{{ __('hosts.no_run') }}</p>
@else
<ol class="space-y-3">
@foreach ($events as $event)
@php
$tone = ['advanced' => 'text-success', 'retry' => 'text-warning', 'failed' => 'text-danger', 'info' => 'text-muted'][$event->outcome] ?? 'text-muted';
@endphp
<li class="flex items-start gap-2.5 text-sm">
<span class="mt-1.5 size-1.5 shrink-0 rounded-pill bg-current {{ $tone }}" aria-hidden="true"></span>
<div class="min-w-0">
<p class="text-body">{{ __('hosts.step.'.$event->step) }}</p>
<p class="text-xs text-faint">
{{ __('hosts.outcome.'.$event->outcome) }}
· {{ __('hosts.attempt') }} {{ $event->attempt }}
@if ($event->message) · <span class="break-words">{{ $event->message }}</span> @endif
</p>
</div>
</li>
@endforeach
</ol>
@endif
</div>
</div>
</div>