mirror of
https://github.com/ershisan99/coolify.git
synced 2026-01-25 12:34:32 +00:00
Merge branch 'v4-next' into notifications
This commit is contained in:
@@ -1,50 +1,64 @@
|
||||
<nav class="flex gap-4 py-2 border-b-2 border-solid border-coolgray-200">
|
||||
<a
|
||||
<nav class="flex items-center gap-4 py-2 border-b-2 border-solid border-coolgray-200">
|
||||
<a class="{{ request()->routeIs('project.application.configuration') ? 'text-white' : '' }}"
|
||||
href="{{ route('project.application.configuration', [
|
||||
'project_uuid' => Route::current()->parameters()['project_uuid'],
|
||||
'application_uuid' => Route::current()->parameters()['application_uuid'],
|
||||
'environment_name' => Route::current()->parameters()['environment_name'],
|
||||
]) }}">
|
||||
Configuration
|
||||
<button>Configuration</button>
|
||||
</a>
|
||||
<a
|
||||
<a class="{{ request()->routeIs('project.application.deployments') ? 'text-white' : '' }}"
|
||||
href="{{ route('project.application.deployments', [
|
||||
'project_uuid' => Route::current()->parameters()['project_uuid'],
|
||||
'application_uuid' => Route::current()->parameters()['application_uuid'],
|
||||
'environment_name' => Route::current()->parameters()['environment_name'],
|
||||
]) }}">
|
||||
Deployments
|
||||
<button>Deployments</button>
|
||||
</a>
|
||||
<div class="flex-1"></div>
|
||||
<div class="dropdown dropdown-hover">
|
||||
<x-inputs.button>Links👇 </x-inputs.button>
|
||||
|
||||
<div class="dropdown dropdown-bottom">
|
||||
<label tabindex="0">
|
||||
<x-forms.button>
|
||||
Open
|
||||
<x-chevron-down />
|
||||
</x-forms.button>
|
||||
</label>
|
||||
<ul tabindex="0"
|
||||
class="p-2 text-xs text-white normal-case rounded min-w-max dropdown-content menu bg-coolgray-200">
|
||||
<li>
|
||||
<a class="text-xs"target="_blank" href="{{ $application->gitBranchLocation }}">
|
||||
Open on Git
|
||||
<x-external-link />
|
||||
</a>
|
||||
</li>
|
||||
class="mt-1 text-xs text-white normal-case rounded min-w-max dropdown-content menu bg-coolgray-200">
|
||||
@if (data_get($application, 'fqdn'))
|
||||
<li>
|
||||
<a class="text-xs hover:no-underline hover:bg-coollabs" target="_blank"
|
||||
href="{{ $application->fqdn }}">
|
||||
{{ $application->fqdn }}
|
||||
<x-external-link />
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
@if (data_get($application, 'ports_mappings_array'))
|
||||
@foreach ($application->ports_mappings_array as $port)
|
||||
@if (config('app.env') === 'local')
|
||||
<li>
|
||||
<a class="text-xs" target="_blank" href="http://localhost:{{ explode(':', $port)[0] }}">Open
|
||||
<a class="text-xs hover:no-underline hover:bg-coollabs" target="_blank"
|
||||
href="http://localhost:{{ explode(':', $port)[0] }}">Port
|
||||
{{ explode(':', $port)[0] }}
|
||||
<x-external-link />
|
||||
</a>
|
||||
</li>
|
||||
@else
|
||||
<li>
|
||||
<a class="text-xs" target="_blank"
|
||||
href="http://{{ $application->destination->server->ip }}:{{ explode(':', $port)[0] }}">Open
|
||||
{{ $port }}</a>
|
||||
<a class="text-xs hover:no-underline hover:bg-coollabs" target="_blank"
|
||||
href="http://{{ $application->destination->server->ip }}:{{ explode(':', $port)[0] }}">Port
|
||||
{{ $port }}
|
||||
<x-external-link />
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
@endforeach
|
||||
@endif
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<livewire:project.application.deploy :applicationId="$application->id" />
|
||||
<livewire:project.application.status :application="$application" />
|
||||
</nav>
|
||||
|
||||
5
resources/views/components/chevron-down.blade.php
Normal file
5
resources/views/components/chevron-down.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
||||
fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M6 9l6 6l6 -6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 276 B |
@@ -22,8 +22,8 @@
|
||||
<div class="flex flex-col items-center justify-center h-full">
|
||||
<div class="pb-5 text-white" x-text="message"></div>
|
||||
<div>
|
||||
<x-inputs.button x-on:click='confirmed()'>Confirm</x-inputs.button>
|
||||
<x-inputs.button x-on:click="open = false">Cancel</x-inputs.button>
|
||||
<x-forms.button x-on:click='confirmed()'>Confirm</x-forms.button>
|
||||
<x-forms.button x-on:click="open = false">Cancel</x-forms.button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1 +1 @@
|
||||
<img class="inline-flex w-3 h-3 mb-1 ml-2" src="{{ asset('svgs/external-link.svg') }}">
|
||||
<img class="inline-flex w-3 h-3" src="{{ asset('svgs/external-link.svg') }}">
|
||||
|
||||
38
resources/views/components/forms/button.blade.php
Normal file
38
resources/views/components/forms/button.blade.php
Normal file
@@ -0,0 +1,38 @@
|
||||
@props([
|
||||
'type' => $attributes->get('type') ?? 'button',
|
||||
'disabled' => null,
|
||||
'confirm' => null,
|
||||
'confirmAction' => null,
|
||||
'tooltip' => null,
|
||||
])
|
||||
@isset($tooltip)
|
||||
<div class="tooltip tooltip-warning" data-tip="{{ $tooltip }}">
|
||||
@endisset
|
||||
@if ($type === 'submit')
|
||||
<button {{ $attributes }} type="submit" @if ($disabled !== null) disabled @endif wire:target="submit"
|
||||
wire:loading.delay.shorter.class="loading"
|
||||
@isset($confirm)
|
||||
x-on:click="toggleConfirmModal('{{ $confirm }}', '{{ explode('(', $confirmAction)[0] }}')"
|
||||
@endisset
|
||||
@isset($confirmAction)
|
||||
x-on:{{ explode('(', $confirmAction)[0] }}.window="$wire.{{ explode('(', $confirmAction)[0] }}"
|
||||
@endisset>
|
||||
{{ $slot }}
|
||||
</button>
|
||||
@elseif($type === 'button')
|
||||
<button {{ $attributes }} @if ($disabled !== null) disabled @endif type="button"
|
||||
wire:target="{{ explode('(', $attributes->whereStartsWith('wire:click')->first())[0] }}"
|
||||
wire:loading.delay.shorter.class="loading"
|
||||
@isset($confirm)
|
||||
x-on:click="toggleConfirmModal('{{ $confirm }}', '{{ explode('(', $confirmAction)[0] }}')"
|
||||
@endisset
|
||||
@isset($confirmAction)
|
||||
x-on:{{ explode('(', $confirmAction)[0] }}.window="$wire.{{ explode('(', $confirmAction)[0] }}"
|
||||
@endisset>
|
||||
{{ $slot }}
|
||||
</button>
|
||||
@endif
|
||||
|
||||
@isset($tooltip)
|
||||
</div>
|
||||
@endisset
|
||||
@@ -16,7 +16,7 @@
|
||||
{{ $id }}
|
||||
@endif
|
||||
@if ($helper)
|
||||
<div class="-mb-1 dropdown dropdown-right">
|
||||
<div class="-mb-1 dropdown dropdown-right dropdown-hover">
|
||||
<label tabindex="0" class="cursor-pointer text-warning">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
class="w-4 h-4 stroke-current">
|
||||
@@ -25,7 +25,7 @@
|
||||
</svg>
|
||||
</label>
|
||||
<div tabindex="0"
|
||||
class="border-2 shadow whitespace-nowrap w-max-fit border-coolgray-500 card compact dropdown-content bg-coolgray-200">
|
||||
class="border rounded shadow border-coolgray-400 card compact dropdown-content bg-coolgray-200 w-96">
|
||||
<div class="card-body">
|
||||
{!! $helper !!}
|
||||
</div>
|
||||
@@ -1,28 +1,22 @@
|
||||
@props([
|
||||
'id' => $attributes->has('id') || $attributes->has('label'),
|
||||
'id' => $attributes->has('id'),
|
||||
'type' => $attributes->get('type') ?? 'text',
|
||||
'required' => null,
|
||||
'label' => $attributes->has('label'),
|
||||
'helper' => $attributes->has('helper'),
|
||||
'noLabel' => $attributes->has('noLabel'),
|
||||
'noDirty' => $attributes->has('noDirty'),
|
||||
'required' => null,
|
||||
'disabled' => null,
|
||||
'helper' => $attributes->has('helper'),
|
||||
'noDirty' => $attributes->has('noDirty'),
|
||||
])
|
||||
|
||||
<div {{ $attributes->merge(['class' => 'w-full form-control']) }}>
|
||||
@if (!$noLabel)
|
||||
@if ($label)
|
||||
<label class="label">
|
||||
<span class="label-text">
|
||||
@if ($label)
|
||||
{{ $label }}
|
||||
@else
|
||||
{{ $id }}
|
||||
@endif
|
||||
{{ $label }}
|
||||
@if ($required)
|
||||
<span class="text-warning">*</span>
|
||||
@endif
|
||||
@if ($helper)
|
||||
<div class="-mb-1 dropdown dropdown-right">
|
||||
<div class="-mb-1 dropdown dropdown-right dropdown-hover">
|
||||
<label tabindex="0" class="cursor-pointer text-warning">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
class="w-4 h-4 stroke-current">
|
||||
@@ -31,7 +25,7 @@
|
||||
</svg>
|
||||
</label>
|
||||
<div tabindex="0"
|
||||
class="border-2 shadow w-96 border-coolgray-500 card compact dropdown-content bg-coolgray-200">
|
||||
class="border rounded shadow border-coolgray-400 card compact dropdown-content bg-coolgray-200 w-96">
|
||||
<div class="card-body">
|
||||
{!! $helper !!}
|
||||
</div>
|
||||
@@ -41,9 +35,11 @@
|
||||
</span>
|
||||
</label>
|
||||
@endif
|
||||
<input {{ $attributes }} type={{ $type }} name={{ $id }} wire:model.defer={{ $id }}
|
||||
@if ($disabled !== null) disabled @endif @if ($required !== null) required @endif
|
||||
@if (!$noDirty) wire:dirty.class="input-warning" @endif />
|
||||
<input type={{ $type }}
|
||||
@if ($id) name={{ $id }} wire:model.defer={{ $id }} @endisset
|
||||
@if ($disabled !== null) disabled @endif
|
||||
@if ($required !== null) required @endif
|
||||
@if (!$noDirty && $id) wire:dirty.class="input-warning" @endif {{ $attributes }} />
|
||||
@error($id)
|
||||
<label class="label">
|
||||
<span class="text-red-500 label-text-alt">{{ $message }}</span>
|
||||
@@ -25,16 +25,18 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@livewireScripts
|
||||
@auth
|
||||
<x-navbar />
|
||||
@endauth
|
||||
<main class="min-h-full px-8 pt-10 mx-auto max-w-7xl">
|
||||
<div class="flex justify-center w-full pt-4 min-h-12">
|
||||
<x-magic-bar />
|
||||
</div>
|
||||
<main>
|
||||
{{ $slot }}
|
||||
</main>
|
||||
<a
|
||||
class="fixed text-xs cursor-pointer left-2 bottom-1 opacity-20 hover:opacity-100 hover:text-white">v{{ config('version') }}</a>
|
||||
class="fixed text-xs cursor-pointer right-2 bottom-1 opacity-60 hover:opacity-100 hover:text-white">v{{ config('version') }}</a>
|
||||
@auth
|
||||
<script>
|
||||
window.addEventListener("keydown", function(event) {
|
||||
@@ -45,48 +47,6 @@
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function checkIfIamDead() {
|
||||
console.log('Checking server\'s pulse...')
|
||||
checkIfIamDeadInterval = setInterval(async () => {
|
||||
try {
|
||||
const res = await fetch('/api/health');
|
||||
if (res.ok) {
|
||||
console.log('I\'m alive. Waiting for server to be dead...');
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('I\'m dead. Charging... Standby... Bzz... Bzz...')
|
||||
checkHealth();
|
||||
if (checkIfIamDeadInterval) clearInterval(checkIfIamDeadInterval);
|
||||
}
|
||||
|
||||
return;
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
function checkHealth() {
|
||||
console.log('Checking server\'s health...')
|
||||
checkHealthInterval = setInterval(async () => {
|
||||
try {
|
||||
const res = await fetch('/api/health');
|
||||
if (res.ok) {
|
||||
console.log('Server is back online. Reloading...')
|
||||
if (checkHealthInterval) clearInterval(checkHealthInterval);
|
||||
window.location.reload();
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Waiting for server to come back from dead...');
|
||||
}
|
||||
|
||||
return;
|
||||
}, 2000);
|
||||
}
|
||||
Livewire.on('updateInitiated', () => {
|
||||
let checkHealthInterval = null;
|
||||
let checkIfIamDeadInterval = null;
|
||||
console.log('Update initiated. Waiting for server to be dead...')
|
||||
checkIfIamDead();
|
||||
})
|
||||
Livewire.on('reloadWindow', () => {
|
||||
window.location.reload();
|
||||
})
|
||||
@@ -100,7 +60,6 @@
|
||||
})
|
||||
</script>
|
||||
@endauth
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div x-data="magicsearchbar" @slash.window="mainMenu = true">
|
||||
<div x-data="magicbar" @slash.window="mainMenu = true">
|
||||
{{-- Main --}}
|
||||
<template x-cloak x-if="isMainMenu">
|
||||
<div>
|
||||
@@ -13,14 +13,10 @@
|
||||
<template x-for="(item,index) in filteredItems" :key="item.name">
|
||||
<div x-on:click="await set(item.next ?? 'server',item.name)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="w-12 badge badge-primary badge-sm" x-show="item.type === 'Apps'"
|
||||
x-text="item.type"></span>
|
||||
<span class="w-12 badge badge-secondary badge-sm" x-show="item.type === 'Add'"
|
||||
x-text="item.type"></span>
|
||||
<span class="w-12 badge badge-success badge-sm" x-show="item.type === 'Jump'"
|
||||
x-text="item.type"></span>
|
||||
<span class="w-12 badge badge-success badge-sm" x-show="item.type === 'New'"
|
||||
x-text="item.type"></span>
|
||||
<span class="magic-badge" x-show="item.type === 'Apps'" x-text="item.type"></span>
|
||||
<span class="magic-badge" x-show="item.type === 'Add'" x-text="item.type"></span>
|
||||
<span class="magic-badge" x-show="item.type === 'Jump'" x-text="item.type"></span>
|
||||
<span class="magic-badge" x-show="item.type === 'New'" x-text="item.type"></span>
|
||||
<span x-text="item.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -42,7 +38,7 @@
|
||||
<template x-for="(server,index) in filteredServers" :key="server.name ?? server">
|
||||
<div x-on:click="await set('destination',server.uuid)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Server</span>
|
||||
<span class="magic-badge">Server</span>
|
||||
<span x-text="server.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -65,7 +61,7 @@
|
||||
<template x-for="(destination,index) in filteredDestinations" :key="destination.name ?? destination">
|
||||
<div x-on:click="await set('project',destination.uuid)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class=" badge badge-primary badge-sm">Destination</span>
|
||||
<span class=" magic-badge">Destination</span>
|
||||
<span x-text="destination.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -88,7 +84,7 @@
|
||||
<template x-for="(project,index) in filteredProjects" :key="project.name ?? project">
|
||||
<div x-on:click="await set('environment',project.uuid)"
|
||||
:class="focusedIndex === index + 1 && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Project</span>
|
||||
<span class="magic-badge">Project</span>
|
||||
<span x-text="project.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -98,7 +94,8 @@
|
||||
{{-- Environments --}}
|
||||
<template x-cloak x-if="environmentMenu">
|
||||
<div x-on:click.outside="closeMenus">
|
||||
<input class="magic-input" x-ref="search" x-model="search" placeholder="Select a environment..."
|
||||
<input class="magic-input" x-ref="search" x-model="search"
|
||||
placeholder="Enter the new environment name or select one..."
|
||||
x-on:keydown.down="focusNext(environments.length + 1)"
|
||||
x-on:keydown.up="focusPrev(environments.length + 1)" x-on:keyup.escape="closeMenus"
|
||||
x-on:keyup.enter="focusedIndex !== '' && await set('jump',filteredEnvironments()[focusedIndex - 1]?.name)" />
|
||||
@@ -106,12 +103,12 @@
|
||||
<div x-on:click="await newEnvironment" :class="focusedIndex === 0 && 'magic-item-focused'"
|
||||
class="magic-item">
|
||||
<span>New Environment</span>
|
||||
<span x-text="search"></span>
|
||||
<span class="text-warning" x-text="search"></span>
|
||||
</div>
|
||||
<template x-for="(environment,index) in filteredEnvironments" :key="environment.name ?? environment">
|
||||
<div x-on:click="await set('jump',environment.name)"
|
||||
:class="focusedIndex === index + 1 && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Env</span>
|
||||
<span class="magic-badge">Env</span>
|
||||
<span x-text="environment.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -121,9 +118,9 @@
|
||||
{{-- Projects --}}
|
||||
<template x-cloak x-if="projectsMenu">
|
||||
<div x-on:click.outside="closeMenus">
|
||||
<input x-ref="search" x-model="search" class="magic-input" placeholder="Select a project..."
|
||||
x-on:keyup.escape="closeMenus" x-on:keydown.down="focusNext(projects.length)"
|
||||
x-on:keydown.up="focusPrev(projects.length)"
|
||||
<input x-ref="search" x-model="search" class="magic-input"
|
||||
placeholder="Enter the new project name or select one..." x-on:keyup.escape="closeMenus"
|
||||
x-on:keydown.down="focusNext(projects.length)" x-on:keydown.up="focusPrev(projects.length)"
|
||||
x-on:keyup.enter="focusedIndex !== '' && await set('jumpToProject',filteredProjects()[focusedIndex]?.uuid)" />
|
||||
<div class="magic-items">
|
||||
<template x-if="projects.length === 0">
|
||||
@@ -134,7 +131,7 @@
|
||||
<template x-for="(project,index) in filteredProjects" :key="project.name ?? project">
|
||||
<div x-on:click="await set('jumpToProject',project.uuid)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Jump</span>
|
||||
<span class="magic-badge">Jump</span>
|
||||
<span x-text="project.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -157,7 +154,7 @@
|
||||
<template x-for="(destination,index) in filteredDestinations" :key="destination.name ?? destination">
|
||||
<div x-on:click="await set('jumpToDestination',destination.uuid)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Jump</span>
|
||||
<span class="magic-badge">Jump</span>
|
||||
<span x-text="destination.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -180,7 +177,7 @@
|
||||
<template x-for="(privateKey,index) in filteredPrivateKeys" :key="privateKey.name ?? privateKey">
|
||||
<div x-on:click="await set('jumpToPrivateKey',privateKey.uuid)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Jump</span>
|
||||
<span class="magic-badge">Jump</span>
|
||||
<span x-text="privateKey.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -203,7 +200,7 @@
|
||||
<template x-for="(source,index) in filteredSources" :key="source.name ?? source">
|
||||
<div x-on:click="await set('jumpToSource',source)"
|
||||
:class="focusedIndex === index && 'magic-item-focused'" class="magic-item">
|
||||
<span class="badge badge-primary badge-sm">Jump</span>
|
||||
<span class="magic-badge">Jump</span>
|
||||
<span x-text="source.name"></span>
|
||||
</div>
|
||||
</template>
|
||||
@@ -214,7 +211,7 @@
|
||||
|
||||
<script>
|
||||
document.addEventListener('alpine:init', () => {
|
||||
Alpine.data('magicsearchbar', () => ({
|
||||
Alpine.data('magicbar', () => ({
|
||||
isMainMenu() {
|
||||
return !this.serverMenu &&
|
||||
!this.destinationMenu &&
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
])
|
||||
<div x-cloak x-show="{{ $show }}" x-transition class="modal modal-open">
|
||||
<div class="relative modal-box">
|
||||
<div class="pb-8 text-base font-bold">{{ $message }}</div>
|
||||
<div class="pb-8 text-base font-bold text-white">{{ $message }}</div>
|
||||
<div class="flex justify-end gap-4 text-xs">
|
||||
<x-inputs.button isWarning wire:click='{{ $action }}' x-on:click="{{ $show }} = false">
|
||||
<x-forms.button wire:click='{{ $action }}' x-on:click="{{ $show }} = false">
|
||||
Yes
|
||||
</x-inputs.button>
|
||||
<x-inputs.button x-on:click="{{ $show }} = false">No</x-inputs.button>
|
||||
</x-forms.button>
|
||||
<x-forms.button x-on:click="{{ $show }} = false">No</x-forms.button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,100 +1,122 @@
|
||||
@auth
|
||||
<div class="navbar">
|
||||
<div class="navbar-start">
|
||||
<div class="dropdown">
|
||||
<label tabindex="0" class="btn btn-ghost xl:hidden">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24"
|
||||
<nav class="main-navbar">
|
||||
<ul class="gap-2 p-1 pt-2 menu" title="Dashboard">
|
||||
<li class="{{ request()->is('/') ? 'text-warning' : '' }}">
|
||||
<a @if (!request()->is('/')) href="/" @endif>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h8m-8 6h16" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="p-2 mt-3 shadow menu menu-compact dropdown-content bg-base-100 rounded-box w-52">
|
||||
<li>
|
||||
<a href="/">
|
||||
Dashboard
|
||||
</a>
|
||||
</li>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@if (auth()->user()->isRoot())
|
||||
<li>
|
||||
<a href="/settings">
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
<li>
|
||||
<a href="/profile">
|
||||
Profile
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/profile/team">
|
||||
Team
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/command-center">
|
||||
Command Center
|
||||
</a>
|
||||
</li>
|
||||
@if (auth()->user()->isRoot())
|
||||
<li>
|
||||
<livewire:force-upgrade />
|
||||
</li>
|
||||
@endif
|
||||
<li>
|
||||
<form action="/logout" method="POST">
|
||||
@csrf
|
||||
<button>Logout</button>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div href="/" class="text-xl text-white normal-case btn btn-ghost hover:bg-transparent">Coolify</div>
|
||||
<div class="form-control">
|
||||
<x-magic-bar />
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden navbar-end xl:flex">
|
||||
<ul class="px-1 menu menu-horizontal text-neutral-400">
|
||||
<li>
|
||||
<a href="/">
|
||||
Dashboard
|
||||
<li class="{{ request()->is('server/*') || request()->is('servers') ? 'text-warning' : '' }}" title="Servers">
|
||||
<a @if (!request()->is('servers')) href="/servers" @endif>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M3 4m0 3a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3z" />
|
||||
<path d="M15 20h-9a3 3 0 0 1 -3 -3v-2a3 3 0 0 1 3 -3h12" />
|
||||
<path d="M7 8v.01" />
|
||||
<path d="M7 16v.01" />
|
||||
<path d="M20 15l-2 3h3l-2 3" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li class="{{ request()->is('project/*') || request()->is('projects') ? 'text-warning' : '' }}"
|
||||
title="Projects">
|
||||
<a @if (!request()->is('projects')) href="/projects" @endif>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M12 4l-8 4l8 4l8 -4l-8 -4" />
|
||||
<path d="M4 12l8 4l8 -4" />
|
||||
<path d="M4 16l8 4l8 -4" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
@if (auth()->user()->isPartOfRootTeam())
|
||||
<li class="{{ request()->is('command-center') ? 'text-warning' : '' }}" title="Command Center">
|
||||
<a @if (!request()->is('command-center')) href="/command-center" @endif>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M5 7l5 5l-5 5" />
|
||||
<path d="M12 19l7 0" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
@if (auth()->user()->isRoot())
|
||||
<li>
|
||||
<a href="/settings">
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
<li class="{{ request()->is('settings') ? 'text-warning' : ' ' }}" title="Settings">
|
||||
<a @if (!request()->is('settings')) href="/settings" @endif>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path
|
||||
d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z" />
|
||||
<path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
</nav>
|
||||
<div class="fixed top-0 right-0 p-2">
|
||||
<div class="dropdown dropdown-left dropdown-hover">
|
||||
<label tabindex="0" class="btn btn-ghost no-animation hover:bg-transparent hover:text-warning">
|
||||
<div class="flex items-center justify-center gap-2 placeholder">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M4 6l16 0" />
|
||||
<path d="M4 12l16 0" />
|
||||
<path d="M4 18l16 0" />
|
||||
</svg>
|
||||
</div>
|
||||
</label>
|
||||
<ul tabindex="0"
|
||||
class="p-2 mt-3 text-white rounded shadow menu menu-compact dropdown-content bg-coolgray-200 w-52">
|
||||
<li>
|
||||
<a href="/profile">
|
||||
Profile
|
||||
<a class="hover:no-underline hover:bg-coollabs" href="/profile">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
|
||||
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
|
||||
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855" />
|
||||
</svg> Profile
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/profile/team">
|
||||
Team
|
||||
<a class="hover:no-underline hover:bg-coollabs" href="/profile/team">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M10 13a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
|
||||
<path d="M8 21v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1" />
|
||||
<path d="M15 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
|
||||
<path d="M17 10h2a2 2 0 0 1 2 2v1" />
|
||||
<path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
|
||||
<path d="M3 13v-1a2 2 0 0 1 2 -2h2" />
|
||||
</svg> Team
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/command-center">
|
||||
Command Center
|
||||
</a>
|
||||
</li>
|
||||
@if (auth()->user()->isRoot())
|
||||
<form action="/logout" method="POST">
|
||||
<li>
|
||||
<livewire:force-upgrade />
|
||||
</li>
|
||||
@endif
|
||||
<li>
|
||||
<form action="/logout" method="POST" class="hover:bg-transparent">
|
||||
@csrf
|
||||
<button class="text-sm link link-hover hover:text-white">Logout</button>
|
||||
</form>
|
||||
</li>
|
||||
<button class="text-sm hover:bg-coollabs"> <svg xmlns="http://www.w3.org/2000/svg" class="icon"
|
||||
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none"
|
||||
stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||
<path d="M13 12v.01" />
|
||||
<path d="M3 21h18" />
|
||||
<path d="M5 21v-16a2 2 0 0 1 2 -2h7.5m2.5 10.5v7.5" />
|
||||
<path d="M14 7h7m-3 -3l3 3l-3 3" />
|
||||
</svg>Logout</button>
|
||||
</li>
|
||||
</form>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user