improve breadcrumbs a lot
This commit is contained in:
parent
651e19fefe
commit
5d73ac36da
3 changed files with 509 additions and 207 deletions
|
|
@ -3,239 +3,452 @@
|
||||||
'lastDeploymentLink' => null,
|
'lastDeploymentLink' => null,
|
||||||
'resource' => null,
|
'resource' => null,
|
||||||
])
|
])
|
||||||
|
@php
|
||||||
|
$projects = auth()->user()->currentTeam()->projects()->get();
|
||||||
|
$environments = $resource->environment->project->environments()->with(['applications', 'services'])->get();
|
||||||
|
$currentProjectUuid = data_get($resource, 'environment.project.uuid');
|
||||||
|
$currentEnvironmentUuid = data_get($resource, 'environment.uuid');
|
||||||
|
$currentResourceUuid = data_get($resource, 'uuid');
|
||||||
|
@endphp
|
||||||
<nav class="flex pt-2 pb-10">
|
<nav class="flex pt-2 pb-10">
|
||||||
<ol class="flex flex-wrap items-center gap-y-1">
|
<ol class="flex flex-wrap items-center gap-y-1">
|
||||||
<!-- Project Level -->
|
<!-- Project Level -->
|
||||||
<li class="inline-flex items-center" x-data="{ projectOpen: false }">
|
<li class="inline-flex items-center" x-data="{ projectOpen: false }">
|
||||||
<div class="flex items-center relative">
|
<div class="flex items-center relative" @mouseenter="projectOpen = true" @mouseleave="projectOpen = false">
|
||||||
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
||||||
href="{{ route('project.show', ['project_uuid' => data_get($resource, 'environment.project.uuid')]) }}">
|
href="{{ route('project.show', ['project_uuid' => $currentProjectUuid]) }}">
|
||||||
{{ data_get($resource, 'environment.project.name', 'Undefined Name') }}
|
{{ data_get($resource, 'environment.project.name', 'Undefined Name') }}
|
||||||
</a>
|
</a>
|
||||||
<button @mouseenter="projectOpen = true" @mouseleave="projectOpen = false"
|
<span class="px-1 text-warning">
|
||||||
class="px-1 text-warning hover:text-warning-600 focus:outline-none">
|
|
||||||
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': projectOpen }" fill="none"
|
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': projectOpen }" fill="none"
|
||||||
stroke="currentColor" viewBox="0 0 24 24">
|
stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</span>
|
||||||
|
|
||||||
<!-- Project Dropdown -->
|
<!-- Project Dropdown -->
|
||||||
<div x-show="projectOpen" @mouseenter="projectOpen = true" @mouseleave="projectOpen = false"
|
<div x-show="projectOpen"
|
||||||
x-transition:enter="transition ease-out duration-200"
|
x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 scale-95"
|
||||||
x-transition:enter-start="opacity-0 scale-95"
|
x-transition:enter-end="opacity-100 scale-100" x-transition:leave="transition ease-in duration-75"
|
||||||
x-transition:enter-end="opacity-100 scale-100"
|
x-transition:leave-start="opacity-100 scale-100" x-transition:leave-end="opacity-0 scale-95"
|
||||||
x-transition:leave="transition ease-in duration-75"
|
class="absolute z-20 top-full mt-1 w-56 -ml-2 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200 max-h-96 overflow-y-auto scrollbar">
|
||||||
x-transition:leave-start="opacity-100 scale-100"
|
@foreach ($projects as $project)
|
||||||
x-transition:leave-end="opacity-0 scale-95"
|
<a href="{{ route('project.show', ['project_uuid' => $project->uuid]) }}"
|
||||||
class="absolute z-20 mt-34 w-48 -ml-5 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200">
|
class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 {{ $project->uuid === $currentProjectUuid ? 'dark:text-warning font-semibold' : '' }}"
|
||||||
<a href="{{ route('project.show', ['project_uuid' => data_get($resource, 'environment.project.uuid')]) }}"
|
title="{{ $project->name }}">
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
{{ $project->name }}
|
||||||
Overview
|
</a>
|
||||||
</a>
|
@endforeach
|
||||||
<a href="{{ route('project.edit', ['project_uuid' => data_get($resource, 'environment.project.uuid')]) }}"
|
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
|
||||||
Settings
|
|
||||||
</a>
|
|
||||||
<a href="{{ route('project.resource.index', [
|
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
|
||||||
]) }}"
|
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
|
||||||
All Resources
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- Environment Level -->
|
<!-- Environment Level -->
|
||||||
<li class="inline-flex items-center" x-data="{ envOpen: false }">
|
<li class="inline-flex items-center" x-data="{ envOpen: false, activeEnv: null, activeRes: null, activeMenuEnv: null }">
|
||||||
<div class="flex items-center relative">
|
<div class="flex items-center relative" @mouseenter="envOpen = true" @mouseleave="envOpen = false; activeEnv = null; activeRes = null; activeMenuEnv = null">
|
||||||
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
||||||
href="{{ route('project.resource.index', [
|
href="{{ route('project.resource.index', [
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
'environment_uuid' => $currentEnvironmentUuid,
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
'project_uuid' => $currentProjectUuid,
|
||||||
]) }}">
|
]) }}">
|
||||||
{{ data_get($resource, 'environment.name') }}
|
{{ data_get($resource, 'environment.name') }}
|
||||||
</a>
|
</a>
|
||||||
<button @mouseenter="envOpen = true" @mouseleave="envOpen = false"
|
<span class="px-1 text-warning">
|
||||||
class="px-1 text-warning hover:text-warning-600 focus:outline-none">
|
|
||||||
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': envOpen }" fill="none"
|
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': envOpen }" fill="none"
|
||||||
stroke="currentColor" viewBox="0 0 24 24">
|
stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</span>
|
||||||
|
|
||||||
<!-- Environment Dropdown -->
|
<!-- Environment Dropdown Container -->
|
||||||
<div x-show="envOpen" @mouseenter="envOpen = true" @mouseleave="envOpen = false"
|
<div x-show="envOpen"
|
||||||
x-transition:enter="transition ease-out duration-200"
|
x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 scale-95"
|
||||||
x-transition:enter-start="opacity-0 scale-95"
|
x-transition:enter-end="opacity-100 scale-100" x-transition:leave="transition ease-in duration-75"
|
||||||
x-transition:enter-end="opacity-100 scale-100"
|
x-transition:leave-start="opacity-100 scale-100" x-transition:leave-end="opacity-0 scale-95"
|
||||||
x-transition:leave="transition ease-in duration-75"
|
class="absolute z-20 top-full mt-1 flex items-start">
|
||||||
x-transition:leave-start="opacity-100 scale-100"
|
<!-- Environment List -->
|
||||||
x-transition:leave-end="opacity-0 scale-95"
|
<div class="w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200 max-h-96 overflow-y-auto scrollbar">
|
||||||
class="absolute z-20 mt-34 w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200">
|
@foreach ($environments as $environment)
|
||||||
<a href="{{ route('project.resource.index', [
|
@php
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
$envResources = collect()
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
->merge($environment->applications->map(fn($app) => ['type' => 'application', 'resource' => $app]))
|
||||||
]) }}"
|
->merge($environment->databases()->map(fn($db) => ['type' => 'database', 'resource' => $db]))
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
->merge($environment->services->map(fn($svc) => ['type' => 'service', 'resource' => $svc]));
|
||||||
All Resources
|
@endphp
|
||||||
</a>
|
<div @mouseenter="activeEnv = '{{ $environment->uuid }}'; activeRes = null" @mouseleave="activeEnv = null">
|
||||||
<a href="{{ route('project.environment.edit', [
|
<a href="{{ route('project.resource.index', [
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
'environment_uuid' => $environment->uuid,
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
'project_uuid' => $currentProjectUuid,
|
||||||
]) }}"
|
]) }}"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200 {{ $environment->uuid === $currentEnvironmentUuid ? 'dark:text-warning font-semibold' : '' }}"
|
||||||
Environment Settings
|
title="{{ $environment->name }}">
|
||||||
</a>
|
<span class="truncate">{{ $environment->name }}</span>
|
||||||
<a href="{{ route('project.clone-me', [
|
@if ($envResources->count() > 0)
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
]) }}"
|
</svg>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
@endif
|
||||||
Clone Environment
|
</a>
|
||||||
</a>
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Resources Sub-dropdown (2nd level) -->
|
||||||
|
@foreach ($environments as $environment)
|
||||||
|
@php
|
||||||
|
$envResources = collect()
|
||||||
|
->merge($environment->applications->map(fn($app) => ['type' => 'application', 'resource' => $app]))
|
||||||
|
->merge($environment->databases()->map(fn($db) => ['type' => 'database', 'resource' => $db]))
|
||||||
|
->merge($environment->services->map(fn($svc) => ['type' => 'service', 'resource' => $svc]));
|
||||||
|
@endphp
|
||||||
|
@if ($envResources->count() > 0)
|
||||||
|
<div x-show="activeEnv === '{{ $environment->uuid }}'"
|
||||||
|
x-transition:enter="transition ease-out duration-150" x-transition:enter-start="opacity-0"
|
||||||
|
x-transition:enter-end="opacity-100" x-transition:leave="transition ease-in duration-100"
|
||||||
|
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||||
|
@mouseenter="activeEnv = '{{ $environment->uuid }}'" @mouseleave="activeEnv = null; activeRes = null"
|
||||||
|
class="ml-1 flex items-start">
|
||||||
|
<div class="w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200 max-h-96 overflow-y-auto scrollbar">
|
||||||
|
@foreach ($envResources as $envResource)
|
||||||
|
@php
|
||||||
|
$resType = $envResource['type'];
|
||||||
|
$res = $envResource['resource'];
|
||||||
|
$resRoute = match($resType) {
|
||||||
|
'application' => route('project.application.configuration', [
|
||||||
|
'project_uuid' => $currentProjectUuid,
|
||||||
|
'environment_uuid' => $environment->uuid,
|
||||||
|
'application_uuid' => $res->uuid,
|
||||||
|
]),
|
||||||
|
'service' => route('project.service.configuration', [
|
||||||
|
'project_uuid' => $currentProjectUuid,
|
||||||
|
'environment_uuid' => $environment->uuid,
|
||||||
|
'service_uuid' => $res->uuid,
|
||||||
|
]),
|
||||||
|
'database' => route('project.database.configuration', [
|
||||||
|
'project_uuid' => $currentProjectUuid,
|
||||||
|
'environment_uuid' => $environment->uuid,
|
||||||
|
'database_uuid' => $res->uuid,
|
||||||
|
]),
|
||||||
|
};
|
||||||
|
$isCurrentResource = $res->uuid === $currentResourceUuid;
|
||||||
|
@endphp
|
||||||
|
<div @mouseenter="activeRes = '{{ $environment->uuid }}-{{ $res->uuid }}'" @mouseleave="activeRes = null">
|
||||||
|
<a href="{{ $resRoute }}"
|
||||||
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200 {{ $isCurrentResource ? 'dark:text-warning font-semibold' : '' }}"
|
||||||
|
title="{{ $res->name }}">
|
||||||
|
<span class="truncate">{{ $res->name }}</span>
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Menu Sub-dropdown (3rd level) -->
|
||||||
|
@foreach ($envResources as $envResource)
|
||||||
|
@php
|
||||||
|
$resType = $envResource['type'];
|
||||||
|
$res = $envResource['resource'];
|
||||||
|
$resParams = [
|
||||||
|
'project_uuid' => $currentProjectUuid,
|
||||||
|
'environment_uuid' => $environment->uuid,
|
||||||
|
];
|
||||||
|
if ($resType === 'application') {
|
||||||
|
$resParams['application_uuid'] = $res->uuid;
|
||||||
|
} elseif ($resType === 'service') {
|
||||||
|
$resParams['service_uuid'] = $res->uuid;
|
||||||
|
} else {
|
||||||
|
$resParams['database_uuid'] = $res->uuid;
|
||||||
|
}
|
||||||
|
$resKey = $environment->uuid . '-' . $res->uuid;
|
||||||
|
@endphp
|
||||||
|
<div x-show="activeRes === '{{ $resKey }}'"
|
||||||
|
x-transition:enter="transition ease-out duration-150" x-transition:enter-start="opacity-0"
|
||||||
|
x-transition:enter-end="opacity-100" x-transition:leave="transition ease-in duration-100"
|
||||||
|
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||||
|
@mouseenter="activeRes = '{{ $resKey }}'" @mouseleave="activeRes = null; activeMenuEnv = null"
|
||||||
|
class="ml-1 flex items-start">
|
||||||
|
<!-- Main Menu List -->
|
||||||
|
<div class="w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200">
|
||||||
|
@if ($resType === 'application')
|
||||||
|
<div @mouseenter="activeMenuEnv = '{{ $resKey }}-config'" @mouseleave="activeMenuEnv = null">
|
||||||
|
<a href="{{ route('project.application.configuration', $resParams) }}"
|
||||||
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
|
<span>Configuration</span>
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="{{ route('project.application.deployment.index', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Deployments</a>
|
||||||
|
<a href="{{ route('project.application.logs', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Logs</a>
|
||||||
|
@can('canAccessTerminal')
|
||||||
|
<a href="{{ route('project.application.command', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Terminal</a>
|
||||||
|
@endcan
|
||||||
|
@elseif ($resType === 'service')
|
||||||
|
<div @mouseenter="activeMenuEnv = '{{ $resKey }}-config'" @mouseleave="activeMenuEnv = null">
|
||||||
|
<a href="{{ route('project.service.configuration', $resParams) }}"
|
||||||
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
|
<span>Configuration</span>
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="{{ route('project.service.logs', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Logs</a>
|
||||||
|
@can('canAccessTerminal')
|
||||||
|
<a href="{{ route('project.service.command', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Terminal</a>
|
||||||
|
@endcan
|
||||||
|
@else
|
||||||
|
<div @mouseenter="activeMenuEnv = '{{ $resKey }}-config'" @mouseleave="activeMenuEnv = null">
|
||||||
|
<a href="{{ route('project.database.configuration', $resParams) }}"
|
||||||
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
|
<span>Configuration</span>
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<a href="{{ route('project.database.logs', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Logs</a>
|
||||||
|
@can('canAccessTerminal')
|
||||||
|
<a href="{{ route('project.database.command', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Terminal</a>
|
||||||
|
@endcan
|
||||||
|
@if (
|
||||||
|
$res->getMorphClass() === 'App\Models\StandalonePostgresql' ||
|
||||||
|
$res->getMorphClass() === 'App\Models\StandaloneMongodb' ||
|
||||||
|
$res->getMorphClass() === 'App\Models\StandaloneMysql' ||
|
||||||
|
$res->getMorphClass() === 'App\Models\StandaloneMariadb')
|
||||||
|
<a href="{{ route('project.database.backup.index', $resParams) }}" class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Backups</a>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Configuration Sub-menu (4th level) -->
|
||||||
|
<div x-show="activeMenuEnv === '{{ $resKey }}-config'"
|
||||||
|
x-transition:enter="transition ease-out duration-150" x-transition:enter-start="opacity-0"
|
||||||
|
x-transition:enter-end="opacity-100" x-transition:leave="transition ease-in duration-100"
|
||||||
|
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||||
|
@mouseenter="activeMenuEnv = '{{ $resKey }}-config'" @mouseleave="activeMenuEnv = null"
|
||||||
|
class="ml-1 w-52 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200 max-h-96 overflow-y-auto scrollbar">
|
||||||
|
@if ($resType === 'application')
|
||||||
|
<a href="{{ route('project.application.configuration', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
|
<a href="{{ route('project.application.environment-variables', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
|
<a href="{{ route('project.application.persistent-storage', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Persistent Storage</a>
|
||||||
|
<a href="{{ route('project.application.source', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Source</a>
|
||||||
|
<a href="{{ route('project.application.servers', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Servers</a>
|
||||||
|
<a href="{{ route('project.application.scheduled-tasks.show', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Scheduled Tasks</a>
|
||||||
|
<a href="{{ route('project.application.webhooks', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
|
<a href="{{ route('project.application.preview-deployments', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Preview Deployments</a>
|
||||||
|
<a href="{{ route('project.application.healthcheck', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Healthcheck</a>
|
||||||
|
<a href="{{ route('project.application.rollback', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Rollback</a>
|
||||||
|
<a href="{{ route('project.application.resource-limits', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Limits</a>
|
||||||
|
<a href="{{ route('project.application.resource-operations', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.application.metrics', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Metrics</a>
|
||||||
|
<a href="{{ route('project.application.tags', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.application.advanced', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Advanced</a>
|
||||||
|
<a href="{{ route('project.application.danger', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@elseif ($resType === 'service')
|
||||||
|
<a href="{{ route('project.service.configuration', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
|
<a href="{{ route('project.service.environment-variables', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
|
<a href="{{ route('project.service.storages', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Storages</a>
|
||||||
|
<a href="{{ route('project.service.scheduled-tasks.show', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Scheduled Tasks</a>
|
||||||
|
<a href="{{ route('project.service.webhooks', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
|
<a href="{{ route('project.service.resource-operations', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.service.tags', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.service.danger', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@else
|
||||||
|
<a href="{{ route('project.database.configuration', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
|
<a href="{{ route('project.database.environment-variables', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
|
<a href="{{ route('project.database.servers', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Servers</a>
|
||||||
|
<a href="{{ route('project.database.persistent-storage', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Persistent Storage</a>
|
||||||
|
<a href="{{ route('project.database.webhooks', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
|
<a href="{{ route('project.database.resource-limits', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Limits</a>
|
||||||
|
<a href="{{ route('project.database.resource-operations', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.database.metrics', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Metrics</a>
|
||||||
|
<a href="{{ route('project.database.tags', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.database.danger', $resParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- Resource Level -->
|
<!-- Resource Level -->
|
||||||
<li class="inline-flex items-center" x-data="{ resourceOpen: false }">
|
@php
|
||||||
<div class="flex items-center relative">
|
$resourceUuid = data_get($resource, 'uuid');
|
||||||
|
$resourceType = $resource->getMorphClass();
|
||||||
|
$isApplication = $resourceType === 'App\Models\Application';
|
||||||
|
$isService = $resourceType === 'App\Models\Service';
|
||||||
|
$isDatabase = str_contains($resourceType, 'Database') || str_contains($resourceType, 'Standalone');
|
||||||
|
$routeParams = [
|
||||||
|
'project_uuid' => $currentProjectUuid,
|
||||||
|
'environment_uuid' => $currentEnvironmentUuid,
|
||||||
|
];
|
||||||
|
if ($isApplication) {
|
||||||
|
$routeParams['application_uuid'] = $resourceUuid;
|
||||||
|
} elseif ($isService) {
|
||||||
|
$routeParams['service_uuid'] = $resourceUuid;
|
||||||
|
} else {
|
||||||
|
$routeParams['database_uuid'] = $resourceUuid;
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
<li class="inline-flex items-center" x-data="{ resourceOpen: false, activeMenu: null }">
|
||||||
|
<div class="flex items-center relative" @mouseenter="resourceOpen = true" @mouseleave="resourceOpen = false; activeMenu = null">
|
||||||
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
<a class="text-xs truncate lg:text-sm hover:text-warning"
|
||||||
href="{{ $resource->getMorphClass() === 'App\Models\Application'
|
href="{{ $isApplication
|
||||||
? route('project.application.configuration', [
|
? route('project.application.configuration', $routeParams)
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
: ($isService
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
? route('project.service.configuration', $routeParams)
|
||||||
'application_uuid' => data_get($resource, 'uuid')
|
: route('project.database.configuration', $routeParams)) }}">
|
||||||
])
|
|
||||||
: ($resource->getMorphClass() === 'App\Models\Service'
|
|
||||||
? route('project.service.configuration', [
|
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
|
||||||
'service_uuid' => data_get($resource, 'uuid')
|
|
||||||
])
|
|
||||||
: route('project.database.configuration', [
|
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
|
||||||
'database_uuid' => data_get($resource, 'uuid')
|
|
||||||
]))
|
|
||||||
}}">
|
|
||||||
{{ data_get($resource, 'name') }}
|
{{ data_get($resource, 'name') }}
|
||||||
</a>
|
</a>
|
||||||
<button @mouseenter="resourceOpen = true" @mouseleave="resourceOpen = false"
|
<span class="px-1 text-warning">
|
||||||
class="px-1 text-warning hover:text-warning-600 focus:outline-none">
|
|
||||||
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': resourceOpen }" fill="none"
|
<svg class="w-4 h-4 transition-transform" :class="{ 'rotate-down': resourceOpen }" fill="none"
|
||||||
stroke="currentColor" viewBox="0 0 24 24">
|
stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</span>
|
||||||
|
|
||||||
<!-- Resource Dropdown -->
|
<!-- Resource Dropdown Container -->
|
||||||
<div x-show="resourceOpen" @mouseenter="resourceOpen = true" @mouseleave="resourceOpen = false"
|
<div x-show="resourceOpen"
|
||||||
x-transition:enter="transition ease-out duration-200"
|
x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 scale-95"
|
||||||
x-transition:enter-start="opacity-0 scale-95"
|
x-transition:enter-end="opacity-100 scale-100" x-transition:leave="transition ease-in duration-75"
|
||||||
x-transition:enter-end="opacity-100 scale-100"
|
x-transition:leave-start="opacity-100 scale-100" x-transition:leave-end="opacity-0 scale-95"
|
||||||
x-transition:leave="transition ease-in duration-75"
|
class="absolute z-20 top-full mt-1 flex items-start">
|
||||||
x-transition:leave-start="opacity-100 scale-100"
|
<!-- Main Menu List -->
|
||||||
x-transition:leave-end="opacity-0 scale-95"
|
<div class="w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200">
|
||||||
class="absolute z-20 mt-44 w-48 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200">
|
@if ($isApplication)
|
||||||
@if($resource->getMorphClass() === 'App\Models\Application')
|
<!-- Application Main Menus -->
|
||||||
<!-- Application Sections -->
|
<div @mouseenter="activeMenu = 'config'" @mouseleave="activeMenu = null">
|
||||||
<a href="{{ route('project.application.configuration', [
|
<a href="{{ route('project.application.configuration', $routeParams) }}"
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
<span>Configuration</span>
|
||||||
'application_uuid' => data_get($resource, 'uuid')
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
]) }}"
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
</svg>
|
||||||
Configuration
|
</a>
|
||||||
</a>
|
</div>
|
||||||
<a href="{{ route('project.application.deployment.index', [
|
<a href="{{ route('project.application.deployment.index', $routeParams) }}"
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
Deployments
|
||||||
'application_uuid' => data_get($resource, 'uuid')
|
</a>
|
||||||
]) }}"
|
<a href="{{ route('project.application.logs', $routeParams) }}"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
Deployments
|
Logs
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ route('project.application.logs', [
|
@can('canAccessTerminal')
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<a href="{{ route('project.application.command', $routeParams) }}"
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'application_uuid' => data_get($resource, 'uuid')
|
Terminal
|
||||||
]) }}"
|
</a>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
@endcan
|
||||||
Logs
|
@elseif ($isService)
|
||||||
</a>
|
<!-- Service Main Menus -->
|
||||||
<a href="{{ route('project.application.command', [
|
<div @mouseenter="activeMenu = 'config'" @mouseleave="activeMenu = null">
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<a href="{{ route('project.service.configuration', $routeParams) }}"
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'application_uuid' => data_get($resource, 'uuid')
|
<span>Configuration</span>
|
||||||
]) }}"
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
Terminal
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
@elseif(str_contains($resource->getMorphClass(), 'Database'))
|
</div>
|
||||||
<!-- Database Sections -->
|
<a href="{{ route('project.service.logs', $routeParams) }}"
|
||||||
<a href="{{ route('project.database.configuration', [
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
Logs
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
</a>
|
||||||
'database_uuid' => data_get($resource, 'uuid')
|
@can('canAccessTerminal')
|
||||||
]) }}"
|
<a href="{{ route('project.service.command', $routeParams) }}"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
Configuration
|
Terminal
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ route('project.database.backup.index', [
|
@endcan
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
@else
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
<!-- Database Main Menus -->
|
||||||
'database_uuid' => data_get($resource, 'uuid')
|
<div @mouseenter="activeMenu = 'config'" @mouseleave="activeMenu = null">
|
||||||
]) }}"
|
<a href="{{ route('project.database.configuration', $routeParams) }}"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
class="flex items-center justify-between gap-2 px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
Backups
|
<span>Configuration</span>
|
||||||
</a>
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<a href="{{ route('project.database.logs', [
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
</svg>
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
</a>
|
||||||
'database_uuid' => data_get($resource, 'uuid')
|
</div>
|
||||||
]) }}"
|
<a href="{{ route('project.database.logs', $routeParams) }}"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
Logs
|
Logs
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ route('project.database.command', [
|
@can('canAccessTerminal')
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<a href="{{ route('project.database.command', $routeParams) }}"
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'database_uuid' => data_get($resource, 'uuid')
|
Terminal
|
||||||
]) }}"
|
</a>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
@endcan
|
||||||
Terminal
|
@if (
|
||||||
</a>
|
$resourceType === 'App\Models\StandalonePostgresql' ||
|
||||||
@elseif($resource->getMorphClass() === 'App\Models\Service')
|
$resourceType === 'App\Models\StandaloneMongodb' ||
|
||||||
<!-- Service Sections -->
|
$resourceType === 'App\Models\StandaloneMysql' ||
|
||||||
<a href="{{ route('project.service.configuration', [
|
$resourceType === 'App\Models\StandaloneMariadb')
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<a href="{{ route('project.database.backup.index', $routeParams) }}"
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
||||||
'service_uuid' => data_get($resource, 'uuid')
|
Backups
|
||||||
]) }}"
|
</a>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
@endif
|
||||||
Configuration
|
@endif
|
||||||
</a>
|
</div>
|
||||||
<a href="{{ route('project.service.logs', [
|
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<!-- Configuration Sub-menu -->
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
<div x-show="activeMenu === 'config'"
|
||||||
'service_uuid' => data_get($resource, 'uuid')
|
x-transition:enter="transition ease-out duration-150" x-transition:enter-start="opacity-0"
|
||||||
]) }}"
|
x-transition:enter-end="opacity-100" x-transition:leave="transition ease-in duration-100"
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||||
Logs
|
@mouseenter="activeMenu = 'config'" @mouseleave="activeMenu = null"
|
||||||
</a>
|
class="ml-1 w-52 bg-white dark:bg-coolgray-100 rounded-md shadow-lg py-1 border border-coolgray-200 max-h-96 overflow-y-auto scrollbar">
|
||||||
<a href="{{ route('project.service.command', [
|
@if ($isApplication)
|
||||||
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
<a href="{{ route('project.application.configuration', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
<a href="{{ route('project.application.environment-variables', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
'service_uuid' => data_get($resource, 'uuid')
|
<a href="{{ route('project.application.persistent-storage', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Persistent Storage</a>
|
||||||
]) }}"
|
<a href="{{ route('project.application.source', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Source</a>
|
||||||
class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200">
|
<a href="{{ route('project.application.servers', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Servers</a>
|
||||||
Terminal
|
<a href="{{ route('project.application.scheduled-tasks.show', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Scheduled Tasks</a>
|
||||||
</a>
|
<a href="{{ route('project.application.webhooks', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
@endif
|
<a href="{{ route('project.application.preview-deployments', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Preview Deployments</a>
|
||||||
|
<a href="{{ route('project.application.healthcheck', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Healthcheck</a>
|
||||||
|
<a href="{{ route('project.application.rollback', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Rollback</a>
|
||||||
|
<a href="{{ route('project.application.resource-limits', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Limits</a>
|
||||||
|
<a href="{{ route('project.application.resource-operations', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.application.metrics', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Metrics</a>
|
||||||
|
<a href="{{ route('project.application.tags', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.application.advanced', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Advanced</a>
|
||||||
|
<a href="{{ route('project.application.danger', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@elseif ($isService)
|
||||||
|
<a href="{{ route('project.service.configuration', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
|
<a href="{{ route('project.service.environment-variables', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
|
<a href="{{ route('project.service.storages', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Storages</a>
|
||||||
|
<a href="{{ route('project.service.scheduled-tasks.show', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Scheduled Tasks</a>
|
||||||
|
<a href="{{ route('project.service.webhooks', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
|
<a href="{{ route('project.service.resource-operations', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.service.tags', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.service.danger', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@else
|
||||||
|
<a href="{{ route('project.database.configuration', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">General</a>
|
||||||
|
<a href="{{ route('project.database.environment-variables', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Environment Variables</a>
|
||||||
|
<a href="{{ route('project.database.servers', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Servers</a>
|
||||||
|
<a href="{{ route('project.database.persistent-storage', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Persistent Storage</a>
|
||||||
|
<a href="{{ route('project.database.webhooks', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Webhooks</a>
|
||||||
|
<a href="{{ route('project.database.resource-limits', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Limits</a>
|
||||||
|
<a href="{{ route('project.database.resource-operations', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Resource Operations</a>
|
||||||
|
<a href="{{ route('project.database.metrics', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Metrics</a>
|
||||||
|
<a href="{{ route('project.database.tags', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200">Tags</a>
|
||||||
|
<a href="{{ route('project.database.danger', $routeParams) }}" class="block px-4 py-2 text-sm truncate hover:bg-coolgray-200 dark:hover:bg-coolgray-200 text-red-500">Danger Zone</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
@ -251,8 +464,9 @@ class="block px-4 py-2 text-sm hover:bg-coolgray-200 dark:hover:bg-coolgray-200"
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.rotate-down {
|
.rotate-down {
|
||||||
transform: rotate(90deg); /* Arrow points downward */
|
transform: rotate(90deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.transition-transform {
|
.transition-transform {
|
||||||
transition: transform 0.2s ease;
|
transition: transform 0.2s ease;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue