VPS and dedicated server ordering, managed panels, SSO, billing, and launcher integration — forked from hosting infrastructure with server-focused routes and dashboard. Co-authored-by: Cursor <cursoragent@cursor.com>
97 lines
5.7 KiB
PHP
97 lines
5.7 KiB
PHP
@extends('layouts.hosting')
|
|
@section('title', 'Overview — Ladill Servers')
|
|
@section('content')
|
|
<div class="mx-auto max-w-5xl">
|
|
<div class="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
<div>
|
|
<h1 class="text-xl font-semibold tracking-tight text-slate-900">Overview</h1>
|
|
<p class="mt-0.5 text-sm text-slate-500">Your VPS and dedicated servers at a glance.</p>
|
|
</div>
|
|
<div class="flex flex-wrap gap-2">
|
|
<a href="{{ route('servers.vps') }}" class="inline-flex items-center justify-center rounded-lg bg-indigo-600 px-4 py-2 text-sm font-semibold text-white transition hover:bg-indigo-700">
|
|
New VPS
|
|
</a>
|
|
<a href="{{ route('servers.dedicated') }}" class="inline-flex items-center justify-center rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">
|
|
New dedicated
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
@foreach([
|
|
['Active servers', $activeCount, route('servers.vps')],
|
|
['VPS', $vpsCount, route('servers.vps')],
|
|
['Dedicated', $dedicatedCount, route('servers.dedicated')],
|
|
['Pending orders', $pendingOrderCount, route('servers.vps')],
|
|
] as [$label, $value, $link])
|
|
<a href="{{ $link }}" class="rounded-2xl border border-slate-200 bg-white p-5 transition hover:border-indigo-200">
|
|
<p class="text-xs font-medium uppercase tracking-wide text-slate-400">{{ $label }}</p>
|
|
<p class="mt-2 text-2xl font-semibold text-slate-900">{{ $value }}</p>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white">
|
|
<div class="flex items-center justify-between border-b border-slate-100 px-5 py-3.5">
|
|
<h2 class="text-sm font-semibold text-slate-900">Your servers</h2>
|
|
</div>
|
|
@if ($recent->isEmpty())
|
|
<div class="px-5 py-12 text-center">
|
|
<p class="text-sm font-semibold text-slate-700">No servers yet</p>
|
|
<p class="mx-auto mt-1 max-w-sm text-xs text-slate-400">Deploy a VPS or dedicated server — configure region, image, and billing in minutes.</p>
|
|
<div class="mt-5 flex flex-wrap justify-center gap-2">
|
|
<a href="{{ route('servers.vps') }}" class="rounded-lg border border-slate-200 px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Browse VPS</a>
|
|
<a href="{{ route('servers.dedicated') }}" class="rounded-lg border border-slate-200 px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Browse dedicated</a>
|
|
</div>
|
|
</div>
|
|
@else
|
|
<div class="divide-y divide-slate-50">
|
|
@foreach ($recent as $order)
|
|
@php
|
|
$panelUrl = $order->control_panel_url ?: route('servers.orders.show', $order);
|
|
@endphp
|
|
<a href="{{ $panelUrl }}" class="flex items-center justify-between px-5 py-3.5 transition hover:bg-slate-50">
|
|
<div class="min-w-0">
|
|
<p class="truncate text-sm font-medium text-slate-900">{{ $order->domain_name ?: ($order->product?->name ?? 'Server') }}</p>
|
|
<p class="mt-0.5 text-xs text-slate-400">
|
|
{{ $order->product?->name ?? 'Server' }}
|
|
@if ($order->server_ip)
|
|
· {{ $order->server_ip }}
|
|
@endif
|
|
</p>
|
|
</div>
|
|
<span @class([
|
|
'shrink-0 rounded-full px-2.5 py-1 text-[11px] font-medium capitalize',
|
|
'bg-emerald-50 text-emerald-700' => $order->status === 'active',
|
|
'bg-amber-50 text-amber-700' => in_array($order->status, ['pending_payment', 'pending_approval', 'approved', 'provisioning'], true),
|
|
'bg-slate-100 text-slate-600' => ! in_array($order->status, ['active', 'pending_payment', 'pending_approval', 'approved', 'provisioning'], true),
|
|
])>{{ \App\Models\CustomerHostingOrder::customerFacingStatusLabelFor($order->status) }}</span>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
</div>
|
|
|
|
@if ($pendingOrders->isNotEmpty())
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white">
|
|
<div class="flex items-center justify-between border-b border-slate-100 px-5 py-3.5">
|
|
<h2 class="text-sm font-semibold text-slate-900">Pending orders</h2>
|
|
</div>
|
|
<div class="divide-y divide-slate-50">
|
|
@foreach ($pendingOrders as $order)
|
|
<a href="{{ route('servers.orders.show', $order) }}" class="flex items-center justify-between px-5 py-3.5 transition hover:bg-slate-50">
|
|
<div class="min-w-0">
|
|
<p class="truncate text-sm font-medium text-slate-900">{{ $order->domain_name ?: ($order->product?->name ?? 'Server order') }}</p>
|
|
<p class="mt-0.5 text-xs text-slate-400">{{ $order->product?->name ?? 'Server' }}</p>
|
|
</div>
|
|
<span class="shrink-0 rounded-full bg-amber-50 px-2.5 py-1 text-[11px] font-medium text-amber-700">
|
|
{{ \App\Models\CustomerHostingOrder::customerFacingStatusLabelFor($order->status) }}
|
|
</span>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endsection
|