Files
coolify/resources/views/livewire/destination/sidebar.blade.php
T
Andras Bacsai fa1895c99a feat(dashboard): add canvas view with active deployment overlay
Add a /dashboard/canvas page that renders every team server with its
resources and their running or queued deployments, backed by a new
ServerCanvasController::dashboard endpoint and a per-server usage
endpoint for zone headers. The dashboard remembers the list/canvas
choice and each section (projects, servers) its own table/grid view.

- Show Deploying/Queued pills on canvas cards and a foldable recent
  deployments panel; add shared CanvasControls component
- Allow backup downloads from the server host via the S3 download
  storage (PrepareFileDownloadJob accepts a null container)
- Extract backup toggle/run actions into ManagesDatabaseBackup and
  surface them in backup execution headers; merge S3 and retention
  sections into the general backup settings
- Move deployments indicator to the top bar and add a main nav
  resource menu with submenus; simplify breadcrumbs and settings
  layouts
- Add shared variables overview canvas and scheduled task modals
- Add feature tests for dashboard canvas, view modes, navbar
  submenus, backup S3 downloads and scheduled task modals
2026-10-14 23:55:28 +02:00

42 lines
2.0 KiB
PHP

@php
$destinationRouteParameters = ['destination_uuid' => $destination->uuid];
$destinationMenuItems = collect([
[
'label' => 'General',
'route' => 'destination.show',
'active' => request()->routeIs('destination.show'),
'icon' => 'settings',
],
$destination->getMorphClass() === 'App\\Models\\StandaloneDocker' ? [
'label' => 'Resources',
'route' => 'destination.resources',
'active' => request()->routeIs('destination.resources'),
'icon' => 'grid',
] : null,
[
'label' => 'Danger Zone',
'route' => 'destination.danger',
'active' => request()->routeIs('destination.danger'),
'icon' => 'danger',
],
])->filter();
@endphp
<x-main-nav-menu :back-href="route('destination.index')" back-label="Destinations" back-title="Back to the destinations"
data-settings-search-items="{{ json_encode(settingsSearchItems(['Destination' => $destinationMenuItems], $destinationRouteParameters)) }}">
<nav aria-label="Destination settings"
class="grid grid-cols-2 gap-0.5 border-y border-neutral-200 py-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-1 xl:border-y-0 xl:py-0 dark:border-white/[0.06]">
@foreach ($destinationMenuItems as $menuItem)
@if ($menuItem['label'] === 'Danger Zone')
<div class="col-span-full my-2 hidden border-t border-neutral-200 xl:block dark:border-white/[0.06]" aria-hidden="true"></div>
@endif
<a wire:key="destination-settings-{{ str($menuItem['label'])->slug() }}"
@class(['menu-item', 'menu-item-active' => $menuItem['active']])
{{ wireNavigate() }} href="{{ route($menuItem['route'], $destinationRouteParameters) }}">
<x-reicon :name="$menuItem['icon']" class="menu-item-icon" />
<span class="menu-item-label">{{ $menuItem['label'] }}</span>
</a>
@endforeach
</nav>
</x-main-nav-menu>