ux ux ux ux ui ui ui ui

This commit is contained in:
Andras Bacsai 2024-03-21 14:30:35 +01:00
parent b5775ff9d2
commit 473bad24b7
47 changed files with 449 additions and 481 deletions

View File

@ -3,6 +3,7 @@
namespace App\Livewire;
use App\Models\ApplicationDeploymentQueue;
use App\Models\PrivateKey;
use App\Models\Project;
use App\Models\Server;
use Illuminate\Support\Collection;
@ -13,9 +14,11 @@ class Dashboard extends Component
{
public $projects = [];
public Collection $servers;
public Collection $private_keys;
public $deployments_per_server;
public function mount()
{
$this->private_keys = PrivateKey::ownedByCurrentTeam()->get();
$this->servers = Server::ownedByCurrentTeam()->get();
$this->projects = Project::ownedByCurrentTeam()->get();
$this->get_deployments();

View File

@ -46,10 +46,11 @@ public function mount()
public function submit()
{
$this->validate();
try {
$this->validate();
$this->project->save();
$this->dispatch('saved');
$this->dispatch('success', 'Project updated.');
} catch (\Throwable $e) {
return handleError($e, $this);
}

View File

@ -67,7 +67,7 @@ public function createPrivateKey()
'team_id' => currentTeam()->id
]);
if ($this->from === 'server') {
return redirect()->route('server.create');
return redirect()->route('dashboard');
}
return redirect()->route('security.private-key.show', ['private_key_uuid' => $private_key->uuid]);
} catch (\Throwable $e) {

View File

@ -31,6 +31,6 @@ public function stripeCustomerPortal()
}
public function render()
{
return view('livewire.subscription.index')->layout('layouts.subscription');
return view('livewire.subscription.index');
}
}

View File

@ -8,7 +8,9 @@
class SwitchTeam extends Component
{
public string $selectedTeamId = 'default';
public function mount() {
$this->selectedTeamId = auth()->user()->currentTeam()->id;
}
public function updatedSelectedTeamId()
{
$this->switch_to($this->selectedTeamId);

View File

@ -280,6 +280,10 @@ function base_url(bool $withPort = true): string
return url('/');
}
function isSubscribed()
{
return auth()->user()->currentTeam()->subscription()->exists() || auth()->user()->isInstanceAdmin();
}
function isDev(): bool
{
return config('app.env') === 'local';
@ -1282,7 +1286,6 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
$volume = str("$name:$mount");
}
}
} else if (is_array($volume)) {
$source = data_get($volume, 'source');
$target = data_get($volume, 'target');

View File

@ -152,7 +152,7 @@ .custom-modal {
}
.navbar-main {
@apply flex items-end gap-6 py-2 border-b-2 border-solid border-coolgray-200;
@apply flex items-end gap-6 pb-2 border-b-2 border-solid border-coolgray-200;
}
.loading {

View File

@ -1 +0,0 @@
@extends('layouts.subscription')

View File

@ -1,47 +0,0 @@
@auth
<nav class="fixed h-full overflow-hidden overflow-y-auto pt-14 scrollbar">
<a href="/" class="fixed top-0 z-50 mx-3 mt-3 bg-transparent cursor-pointer"><img
class="transition rounded w-11 h-11" src="{{ asset('coolify-transparent.png') }}"></a>
<ul class="flex flex-col h-full gap-4 menu flex-nowrap">
<li title="Dashboard">
<a class="hover:bg-transparent" @if (!request()->is('/')) href="/" @endif>
<svg xmlns="http://www.w3.org/2000/svg" class="{{ request()->is('/') ? 'text-warning icon' : 'icon' }}"
fill="none" viewBox="0 0 24 24" stroke="currentColor">
<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>
</a>
</li>
<li title="Help us!">
<a class="hover:bg-transparent" href="https://coolify.io/sponsorships" target="_blank">
<svg class="icon hover:text-pink-500" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
stroke-width="2">
<path d="M19.5 12.572L12 20l-7.5-7.428A5 5 0 1 1 12 6.006a5 5 0 1 1 7.5 6.572" />
<path
d="M12 6L8.707 9.293a1 1 0 0 0 0 1.414l.543.543c.69.69 1.81.69 2.5 0l1-1a3.182 3.182 0 0 1 4.5 0l2.25 2.25m-7 3l2 2M15 13l2 2" />
</g>
</svg>
</a>
</li>
<li title="Send us feedback or get help!" class="fixed top-0 right-0 p-2 px-4 pt-4 mt-auto text-xs">
<div class="justify-center" wire:click="help" onclick="help.showModal()">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M140 180a12 12 0 1 1-12-12a12 12 0 0 1 12 12M128 72c-22.06 0-40 16.15-40 36v4a8 8 0 0 0 16 0v-4c0-11 10.77-20 24-20s24 9 24 20s-10.77 20-24 20a8 8 0 0 0-8 8v8a8 8 0 0 0 16 0v-.72c18.24-3.35 32-17.9 32-35.28c0-19.85-17.94-36-40-36m104 56A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88a88.1 88.1 0 0 0 88-88" />
</svg>
</div>
</li>
<li class="pb-6" title="Logout">
<form action="/logout" method="POST" class="hover:bg-transparent">
@csrf
<button class="flex items-center gap-2 rounded-none hover:text-white hover:bg-transparent">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2a9.985 9.985 0 0 1 8 4h-2.71a8 8 0 1 0 .001 12h2.71A9.985 9.985 0 0 1 12 22m7-6v-3h-8v-2h8V8l5 4z"/>
</svg>
</button>
</form>
</li>
</ul>
</nav>
@endauth

View File

@ -4,11 +4,15 @@
<div class="text-2xl font-bold tracking-wide dark:text-white">Coolify</div>
<x-version />
</div>
<button onclick="changeTheme()">Dark/light</button>
{{-- <button onclick="changeTheme()">Dark/light</button> --}}
</div>
<div class="px-2 pb-4">
<livewire:switch-team />
</div>
<ul role="list" class="flex flex-col flex-1 gap-y-7">
<li class="flex-1 ">
<ul role="list" class="flex flex-col h-full space-y-1.5">
@if (isSubscribed())
<li>
<a title="Dashboard" href="/"
class="{{ request()->is('/') ? 'menu-item-active menu-item' : 'menu-item' }}">
@ -24,8 +28,9 @@ class="{{ request()->is('/') ? 'menu-item-active menu-item' : 'menu-item' }}">
<a title="Projects"
class="{{ request()->is('project/*') || request()->is('projects') ? 'menu-item menu-item-active' : 'menu-item' }}"
href="/projects">
<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">
<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" />
@ -38,10 +43,12 @@ class="{{ request()->is('project/*') || request()->is('projects') ? 'menu-item m
<a title="Servers"
class="{{ request()->is('server/*') || request()->is('servers') ? 'menu-item menu-item-active' : 'menu-item' }}"
href="/servers">
<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">
<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="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" />
@ -55,8 +62,8 @@ class="{{ request()->is('server/*') || request()->is('servers') ? 'menu-item men
class="{{ request()->is('security*') ? 'menu-item-active menu-item' : 'menu-item' }}"
href="{{ route('security.private-key.index') }}">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
stroke-width="2"
<path fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2"
d="m16.555 3.843l3.602 3.602a2.877 2.877 0 0 1 0 4.069l-2.643 2.643a2.877 2.877 0 0 1-4.069 0l-.301-.301l-6.558 6.558a2 2 0 0 1-1.239.578L5.172 21H4a1 1 0 0 1-.993-.883L3 20v-1.172a2 2 0 0 1 .467-1.284l.119-.13L4 17h2v-2h2v-2l2.144-2.144l-.301-.301a2.877 2.877 0 0 1 0-4.069l2.643-2.643a2.877 2.877 0 0 1 4.069 0zM15 9h.01" />
</svg>
Security
@ -78,15 +85,16 @@ class="{{ request()->is('source*') ? 'menu-item-active menu-item' : 'menu-item'
class="{{ request()->is('notifications*') ? 'menu-item-active menu-item' : 'menu-item' }}"
href="{{ route('notification.index') }}">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
stroke-width="2"
<path fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2"
d="M10 5a2 2 0 1 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3H4a4 4 0 0 0 2-3v-3a7 7 0 0 1 4-6M9 17v1a3 3 0 0 0 6 0v-1" />
</svg>
Notifications
</a>
</li>
<li>
<a title="Tags" class="{{ request()->is('tags*') ? 'menu-item-active menu-item' : 'menu-item' }}"
<a title="Tags"
class="{{ request()->is('tags*') ? 'menu-item-active menu-item' : 'menu-item' }}"
href="{{ route('tags.index') }}">
<svg class="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
@ -103,8 +111,9 @@ class="{{ request()->is('notifications*') ? 'menu-item-active menu-item' : 'menu
<a title="Command Center"
class="{{ request()->is('command-center*') ? 'menu-item-active menu-item' : 'menu-item' }}"
href="{{ route('command-center') }}">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" 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" />
@ -147,7 +156,6 @@ class="{{ request()->is('team*') ? 'menu-item-active menu-item' : 'menu-item' }}
</li>
@if (isCloud())
<li>
<a title="Subscription"
class="{{ request()->is('subscription*') ? 'menu-item-active menu-item' : 'menu-item' }}"
href="{{ route('subscription.show') }}">
@ -157,8 +165,8 @@ class="{{ request()->is('subscription*') ? 'menu-item-active menu-item' : 'menu-
d="M3 8a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3zm0 2h18M7 15h.01M11 15h2" />
</svg>
Subscription
</li>
</a>
</li>
@endif
@if (isInstanceAdmin())
<li>
@ -183,7 +191,8 @@ class="{{ request()->is('settings*') ? 'menu-item-active menu-item' : 'menu-item
<li>
<a title="Admin" class="menu-item" href="/admin">
<svg class="text-pink-600 icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<svg class="text-pink-600 icon" viewBox="0 0 256 256"
xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M177.62 159.6a52 52 0 0 1-34 34a12.2 12.2 0 0 1-3.6.55a12 12 0 0 1-3.6-23.45a28 28 0 0 0 18.32-18.32a12 12 0 0 1 22.9 7.2ZM220 144a92 92 0 0 1-184 0c0-28.81 11.27-58.18 33.48-87.28a12 12 0 0 1 17.9-1.33l19.69 19.11L127 19.89a12 12 0 0 1 18.94-5.12C168.2 33.25 220 82.85 220 144m-24 0c0-41.71-30.61-78.39-52.52-99.29l-20.21 55.4a12 12 0 0 1-19.63 4.5L80.71 82.36C67 103.38 60 124.06 60 144a68 68 0 0 0 136 0" />
</svg>
@ -211,10 +220,12 @@ class="{{ request()->is('onboarding*') ? 'menu-item-active menu-item' : 'menu-it
</a>
</li>
<li>
<a title="Help us!" class="menu-item" href="https://coolify.io/sponsorships" target="_blank">
<svg class="icon hover:text-pink-500" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
stroke-width="2">
<a title="Help us!" class="menu-item" href="https://coolify.io/sponsorships"
target="_blank">
<svg class="icon hover:text-pink-500" viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2">
<path d="M19.5 12.572L12 20l-7.5-7.428A5 5 0 1 1 12 6.006a5 5 0 1 1 7.5 6.572" />
<path
d="M12 6L8.707 9.293a1 1 0 0 0 0 1.414l.543.543c.69.69 1.81.69 2.5 0l1-1a3.182 3.182 0 0 1 4.5 0l2.25 2.25m-7 3l2 2M15 13l2 2" />
@ -223,6 +234,7 @@ class="{{ request()->is('onboarding*') ? 'menu-item-active menu-item' : 'menu-it
Help us!
</a>
</li>
@endif
<li>
<x-modal-input title="How can we help?">
<x-slot:content>

View File

@ -1,25 +1,4 @@
<div class="pb-6">
<div class="flex items-end gap-2">
<h1>Team Notifications</h1>
</div>
<nav class="flex pt-2 pb-10">
<ol class="inline-flex items-center">
<li>
<div class="flex items-center">
<span>Currently active team: <span
class="text-warning">{{ session('currentTeam.name') }}</span></span>
</div>
</li>
</ol>
</nav>
<nav class="navbar-main">
<a class="{{ request()->routeIs('notification.index') ? 'text-white' : '' }}"
href="{{ route('notification.index') }}">
<button>General</button>
</a>
<div class="flex-1"></div>
<div class="-mt-9">
<livewire:switch-team />
</div>
</nav>
<div>
<h1>Notifications</h1>
<div class="subtitle">Get notified about your infrastructure.</div>
</div>

View File

@ -9,9 +9,5 @@
<a href="{{ route('security.api-tokens') }}">
<button>API tokens</button>
</a>
<div class="flex-1"></div>
<div class="-mt-9">
<livewire:switch-team />
</div>
</nav>
</div>

View File

@ -10,7 +10,7 @@
<livewire:server.proxy.status :server="$server" />
@endif
</div>
<div class="subtitle ">{{ data_get($server, 'name') }}.</div>
<div class="subtitle">{{ data_get($server, 'name') }}.</div>
<nav class="navbar-main">
<a class="{{ request()->routeIs('server.show') ? 'text-white' : '' }}"
href="{{ route('server.show', [

View File

@ -1,18 +1,16 @@
<div class="pb-6">
<div class="flex items-end gap-2">
<h1>Team</h1>
<a href="/team/new"><x-forms.button>+ Add Team</x-forms.button></a>
<x-slide-over>
<x-slot:title>New Team</x-slot:title>
<x-slot:content>
<livewire:team.create/>
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
</div>
<nav class="flex pt-2 pb-10">
<ol class="inline-flex items-center">
<li>
<div class="flex items-center">
<span>Currently active team: <span
class="text-warning">{{ session('currentTeam.name') }}</span></span>
</div>
</li>
</ol>
</nav>
<div class="subtitle">Team settings & shared environment variables.</div>
<nav class="navbar-main">
<a class="{{ request()->routeIs('team.index') ? 'text-white' : '' }}" href="{{ route('team.index') }}">
<button>General</button>
@ -30,8 +28,5 @@ class="text-warning">{{ session('currentTeam.name') }}</span></span>
<button>Shared Variables</button>
</a>
<div class="flex-1"></div>
<div class="-mt-9">
<livewire:switch-team />
</div>
</nav>
</div>

View File

@ -319,6 +319,15 @@ class="fixed block w-full group z-[9999] sm:max-w-xs"
<template x-for="(toast, index) in toasts" :key="toast.id">
<li :id="toast.id" x-data="{
toastHovered: false,
copyNotification: false,
copyToClipboard() {
navigator.clipboard.writeText(toast.description);
this.copyNotification = true;
let that = this;
setTimeout(function() {
that.copyNotification = false;
}, 1000);
}
}" x-init="if (position.includes('bottom')) {
$el.firstElementChild.classList.add('toast-bottom');
$el.firstElementChild.classList.add('opacity-0', 'translate-y-full');
@ -344,6 +353,7 @@ class="fixed block w-full group z-[9999] sm:max-w-xs"
}, 2000)
}
});
setTimeout(function() {
setTimeout(function() {
@ -374,13 +384,13 @@ class="fixed block w-full group z-[9999] sm:max-w-xs"
}, 5);
}, 4000);"
@mouseover="toastHovered=true" @mouseout="toastHovered=false"
class="absolute w-full duration-100 ease-out sm:max-w-xs"
class="absolute w-full duration-100 ease-out sm:max-w-xs "
:class="{ 'toast-no-description': !toast.description }">
<span
class="relative flex flex-col items-start shadow-[0_5px_15px_-3px_rgb(0_0_0_/_0.08)] w-full transition-all duration-100 ease-out bg-coolgray-100 border border-coolgray-200 rounded sm:max-w-xs group"
:class="{ 'p-4': !toast.html, 'p-0': toast.html }">
<template x-if="!toast.html">
<div class="relative">
<div class="relative w-full">
<div class="flex items-start"
:class="{ 'text-green-500': toast.type=='success', 'text-blue-500': toast.type=='info', 'text-orange-400': toast.type=='warning', 'text-red-500': toast.type=='danger', 'text-gray-800': toast.type=='default' }">
@ -411,19 +421,45 @@ class="relative flex flex-col items-start shadow-[0_5px_15px_-3px_rgb(0_0_0_/_0.
<p class="leading-2 text-neutral-200" x-html="toast.message">
</p>
</div>
<p x-show="toast.description" :class="{ 'pl-5': toast.type!='default' }"
class="mt-1.5 text-xs leading-2 opacity-90 whitespace-pre-wrap"
x-html="toast.description"></p>
<div x-show="toast.description" :class="{ 'pl-5': toast.type!='default' }"
class="mt-1.5 text-xs px-2 opacity-90 whitespace-pre-wrap w-full break-words"
x-html="toast.description"></div>
</div>
</template>
<template x-if="toast.html">
<div x-html="toast.html"></div>
</template>
<span class="absolute mt-1 text-xs right-[4.4rem] text-success font-bold"
x-show="copyNotification"
:class="{
'opacity-100': toastHovered,
'opacity-0': !
toastHovered
}">
Copied
</span>
<span @click="copyToClipboard()"
class="absolute right-7 p-1.5 mr-2.5 text-neutral-400 duration-100 ease-in-out rounded-full opacity-0 cursor-pointer hover:bg-coolgray-400 hover:text-neutral-300"
:class="{
'top-1/2 -translate-y-1/2': !toast.description && !toast.html,
'top-0 mt-3': (toast
.description || toast.html),
'opacity-100': toastHovered,
'opacity-0': !
toastHovered
}">
<svg class="w-4 h-4 stroke-current" xmlns="http://www.w3.org/2000/svg" fill="none"
viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round"
d="M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25zM6.75 12h.008v.008H6.75V12zm0 3h.008v.008H6.75V15zm0 3h.008v.008H6.75V18z" />
</svg>
</span>
<span @click="burnToast(toast.id)"
class="absolute right-0 p-1.5 mr-2.5 text-neutral-400 duration-100 ease-in-out rounded-full opacity-0 cursor-pointer hover:bg-coolgray-400 hover:text-neutral-300"
:class="{
'top-1/2 -translate-y-1/2': !toast.description && !toast.html,
'top-0 mt-2.5': (toast
'top-0 mt-3.5': (toast
.description || toast.html),
'opacity-100': toastHovered,
'opacity-0': !

View File

@ -1,12 +1,11 @@
<div class="pt-4">
@if (isset($link))
Use the magic
bar (press <span class="kbd-custom">/</span>) to create a new one or
Create a new one
<a href="{{ $link }}" class="underline text-warning">
click here.
here.
</a>
@else
{{-- @else
Use the magic
bar (press <span class="kbd-custom">/</span>) to create a new one.
bar (press <span class="kbd-custom">/</span>) to create a new one. --}}
@endif
</div>

View File

@ -1,7 +1,9 @@
@extends('layouts.base')
@section('body')
@parent
@if (isSubscribed())
<livewire:layout-popups />
@endif
@auth
<livewire:realtime-connection />
@endauth

View File

@ -1,23 +1,13 @@
@extends('layouts.base')
@section('body')
<x-modal-input title="How can we help?">
<x-slot:content>
<div title="Send us feedback or get help!" class="cursor-pointer menu-item" wire:click="help"
onclick="help.showModal()">
<svg class="icon" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor"
d="M140 180a12 12 0 1 1-12-12a12 12 0 0 1 12 12M128 72c-22.06 0-40 16.15-40 36v4a8 8 0 0 0 16 0v-4c0-11 10.77-20 24-20s24 9 24 20s-10.77 20-24 20a8 8 0 0 0-8 8v8a8 8 0 0 0 16 0v-.72c18.24-3.35 32-17.9 32-35.28c0-19.85-17.94-36-40-36m104 56A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88a88.1 88.1 0 0 0 88-88" />
</svg>
Feedback
</div>
</x-slot:content>
<livewire:help />
</x-modal-input>
<div>
<main class="min-h-screen hero">
</div>
{{ $slot }}
{{-- <main class="min-h-screen hero">
<div class="hero-content">
{{ $slot }}
</div>
</main>
</main> --}}
@parent
@endsection

View File

@ -1,7 +1,6 @@
@extends('layouts.base')
@section('body')
@parent
<x-navbar-subscription />
<main>
{{ $slot }}
</main>

View File

@ -1,18 +0,0 @@
@extends('layouts.base')
@section('body')
@parent
@if (isSubscriptionOnGracePeriod())
@persist('magic-bar')
<div class="fixed top-[4.5rem] left-4 z-50" id="vue">
<magic-bar></magic-bar>
</div>
@endpersist
<x-navbar />
@else
<x-navbar-subscription />
@endif
<main class="mx-auto main max-w-screen-2xl">
{{ $slot }}
</main>
@endsection

View File

@ -328,8 +328,16 @@
@endif
</div>
<div class="flex justify-center gap-2 pt-4">
<a wire:click='skipBoarding'>Skip boarding process</a>
<a wire:click='restartBoarding'>Restart boarding process</a>
<a wire:click='skipBoarding' class="cursor-pointer">Skip boarding process</a>
<a wire:click='restartBoarding' class="cursor-pointer">Restart boarding process</a>
<x-modal-input title="How can we help?">
<x-slot:content>
<div class="cursor-pointer dark:hover:text-white" title="Send us feedback or get help!">
Feedback
</div>
</x-slot:content>
<livewire:help />
</x-modal-input>
</div>
</div>
</section>

View File

@ -6,7 +6,6 @@
@else
<div>
<div>No servers found. Without a server, you won't be able to do much.</div>
<x-use-magic-bar link="/server/new" />
</div>
@endif
</div>

View File

@ -2,8 +2,8 @@
@if (session('error'))
<span x-data x-init="$wire.emit('error', '{{ session('error') }}')" />
@endif
<h1 class="title">Dashboard</h1>
{{-- <div class="subtitle">Your self-hosted environment</div> --}}
<h1>Dashboard</h1>
<div class="subtitle">Your self-hosted infrastructure.</div>
@if (request()->query->get('success'))
<div class="mb-10 rounded dark:text-white alert-success">
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 stroke-current shrink-0" fill="none"
@ -16,6 +16,7 @@
</div>
@endif
<h3 class="pb-4">Projects</h3>
<div class="grid grid-cols-1 gap-2 xl:grid-cols-2">
@forelse ($projects as $project)
<div class="gap-2 border border-transparent cursor-pointer box group">
@ -37,7 +38,9 @@
<div class="flex items-center group">
<a class="mx-4 rounded hover:no-underline"
href="{{ route('project.resource.create', ['project_uuid' => data_get($project, 'uuid'), 'environment_name' => data_get($project, 'environments.0.name', 'production')]) }}">
<span class="p-2 font-bold group-hover:dark:text-white group-hover:text-black dark:hover:bg-coollabs hover:bg-neutral-300">+ Add Resource</span>
<span
class="p-2 font-bold group-hover:dark:text-white group-hover:text-black dark:hover:bg-coollabs hover:bg-neutral-300">+
Add Resource</span>
</a>
<a class="mx-4 rounded group-hover:dark:text-white group-hover:text-black"
href="{{ route('project.edit', ['project_uuid' => data_get($project, 'uuid')]) }}">
@ -53,11 +56,19 @@
</div>
</div>
@empty
<div class="flex gap-1">
<span class='font-bold text-warning'>No projects found.</span> Add your first project
<div>
No projects found. Add your first server <a class="underline dark:text-white"
onclick="newEmptyProject.showModal()">here</a> or
go to the <a class="underline dark:text-white" href="{{ route('onboarding') }}">onboarding page.</a>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New Project</x-slot:title>
<x-slot:content>
<livewire:project.add-empty />
</x-slot:content>
<div class="underline cursor-pointer dark:text-white" @click="slideOverOpen=true">here
</div>
</x-slide-over>
</div> or
go to the <a class="underline dark:text-white" href="{{ route('onboarding') }}">onboarding</a> page.
</div>
@endforelse
</div>
@ -91,12 +102,39 @@
<div class="flex-1"></div>
</a>
@empty
@if ($private_keys->count() === 0)
<div class="flex gap-1">
<span class='font-bold text-warning'>No private keys found.</span> Before you can add your server, first add a private key
<div>
No servers found.
Add your first server <a class="underline dark:text-white" href="{{ route('server.create') }}">here</a>
or
go to the <a class="underline dark:text-white" href="{{ route('onboarding') }}">onboarding page.</a>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New Private Key</x-slot:title>
<x-slot:content>
<livewire:security.private-key.create from="server" />
</x-slot:content>
<div class="underline cursor-pointer dark:text-white" @click="slideOverOpen=true">here
</div>
</x-slide-over>
</div> or
go to the <a class="underline dark:text-white" href="{{ route('onboarding') }}">onboarding</a>
page.
</div>
@else
<div class="flex gap-1">
<span class='font-bold text-warning'>No servers found.</span> Add your first server
<div>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New Server</x-slot:title>
<x-slot:content>
<livewire:server.create />
</x-slot:content>
<div class="underline cursor-pointer dark:text-white" @click="slideOverOpen=true">here
</div>
</x-slide-over>
</div> or
go to the <a class="underline dark:text-white" href="{{ route('onboarding') }}">onboarding</a>
page.
</div>
@endif
@endforelse
</div>
<div class="flex items-center gap-2">

View File

@ -14,8 +14,7 @@
<x-modal-input buttonTitle="Send Test Email" title="Send Test Email">
<form wire:submit='submit' class="flex flex-col w-full gap-2">
<x-forms.input placeholder="test@example.com" id="emails" label="Recipients" required />
<x-forms.button onclick="sendTestEmail.close()" wire:click="sendTestNotification"
@click="modalOpen=false">
<x-forms.button wire:click="sendTestNotification" @click="modalOpen=false">
Send Email
</x-forms.button>
</form>

View File

@ -3,6 +3,6 @@
<x-forms.input placeholder="This is my cool project everyone knows about" id="description" label="Description" />
<div class="subtitle">New project will have a default production environment.</div>
<x-forms.button type="submit" @click="slideOverOpen=false">
Save
Continue
</x-forms.button>
</form>

View File

@ -1,12 +1,14 @@
<div>
<form wire:submit='submit' class="flex flex-col pb-10">
<div class="flex gap-2">
<h1>Project: {{ data_get($project, 'name') }}</h1>
<div class="pb-10">Edit project details here.</div>
<form wire:submit='submit' class="flex flex-col gap-2 pb-10">
<div class="flex items-end gap-2">
<h2>General</h2>
<x-forms.button type="submit">Save</x-forms.button>
<livewire:project.delete-project :disabled="$project->resource_count() > 0" :project_id="$project->id" />
</div>
</div>
<div class="pt-2 pb-10">Edit project details here.</div>
<div class="flex gap-2">
<x-forms.input label="Name" id="project.name" />
<x-forms.input label="Description" id="project.description" />
@ -19,8 +21,7 @@
<x-slot:content>
<livewire:project.shared.environment-variable.add />
</x-slot:content>
<button @click="slideOverOpen=true"
class="button">+
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
</div>

View File

@ -1,7 +1,6 @@
<div>
<div class="flex gap-2">
<h1>Projects</h1>
@if ($servers > 0)
<x-slide-over>
<x-slot:title>New Project</x-slot:title>
<x-slot:content>
@ -10,14 +9,13 @@
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
@endif
</div>
<div class="subtitle">All your projects are here.</div>
<div class="grid gap-2 lg:grid-cols-2">
@if ($servers === 0)
<div>
<div>No servers found. Without a server, you won't be able to do much.</div>
<x-use-magic-bar link="/server/new" />
<x-use-magic-bar link="/servers" />
</div>
@else
@forelse ($projects as $project)
@ -46,7 +44,6 @@
@empty
<div>
<div>No project found.</div>
<x-use-magic-bar />
</div>
@endforelse
@endif

View File

@ -166,9 +166,7 @@
<div class="flex items-center gap-4" wire:init='loadServices'>
<h2 class="py-4">Services</h2>
<x-forms.button wire:click="loadServices('force')">Reload List</x-forms.button>
<input
class="input"
wire:model.live.debounce.200ms="search" autofocus placeholder="Search...">
<input class="input" wire:model.live.debounce.200ms="search" autofocus placeholder="Search...">
</div>
<div class="grid justify-start grid-cols-1 gap-4 text-left xl:grid-cols-3">
@if ($loadingServices)
@ -285,7 +283,7 @@ class="input"
Go to servers page
</a></div>
<x-use-magic-bar link="/server/new" />
<x-use-magic-bar link="/servers" />
</div>
@endforelse
</div>

View File

@ -6,7 +6,6 @@
helper="Tokens are created with the current team as scope. You will only have access to this team's resources." />
</div>
<h4>Create New Token</h4>
<span>Currently active team: <span class="text-warning">{{ session('currentTeam.name') }}</span></span>
<form class="flex items-end gap-2 pt-4" wire:submit='addNewToken'>
<x-forms.input required id="description" label="Description" />
<x-forms.button type="submit">Create New Token</x-forms.button>

View File

@ -1,6 +1,5 @@
<div>
<h1>Private Key</h1>
<div class="subtitle">Private Keys are used to connect to your servers without passwords.</div>
{{-- <div class="subtitle">Private Keys are used to connect to your servers without passwords.</div> --}}
<x-forms.button class="mb-4" wire:click="generateNewKey">Generate new SSH key for me</x-forms.button>
<form class="flex flex-col gap-2" wire:submit='createPrivateKey'>
<div class="flex gap-2">

View File

@ -1,9 +1,3 @@
<div>
@if ($private_keys->count() === 0)
<h1>Create Private Key</h1>
<div class="subtitle">You need to create a private key before you can create a server.</div>
<livewire:security.private-key.create from="server" />
@else
<livewire:server.new.by-ip :private_keys="$private_keys" :limit_reached="$limit_reached" />
@endif
</div>

View File

@ -1,9 +1,14 @@
<div>
<div class="flex items-start gap-2">
<h1>Servers</h1>
<a class="text-white hover:no-underline" href="{{ route('server.create') }}">
<x-forms.button >+ Add</x-forms.button>
</a>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New Server</x-slot:title>
<x-slot:content>
<livewire:server.create />
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
</div>
<div class="subtitle">All your servers are here.</div>
@ -12,8 +17,12 @@
<a href="{{ route('server.show', ['server_uuid' => data_get($server, 'uuid')]) }}"
@class([
'gap-2 border cursor-pointer box group',
'border-transparent' => $server->settings->is_reachable && $server->settings->is_usable && !$server->settings->force_disabled,
'border-red-500' => !$server->settings->is_reachable || $server->settings->force_disabled,
'border-transparent' =>
$server->settings->is_reachable &&
$server->settings->is_usable &&
!$server->settings->force_disabled,
'border-red-500' =>
!$server->settings->is_reachable || $server->settings->force_disabled,
])>
<div class="flex flex-col mx-6">
<div class="font-bold text-white">
@ -41,7 +50,6 @@
@empty
<div>
<div>No servers found. Without a server, you won't be able to do much.</div>
<x-use-magic-bar link="/server/new" />
</div>
@endforelse
@isset($error)

View File

@ -2,7 +2,6 @@
@if ($limit_reached)
<x-limit-reached name="servers" />
@else
<h1 class="title">New Server</h1>
<form class="flex flex-col gap-2" wire:submit='submit'>
<div class="flex gap-2">
<x-forms.input id="name" label="Name" required />

View File

@ -1,9 +1,14 @@
<div>
<div class="flex items-end gap-2 pb-6 ">
<h2>Private Key</h2>
<a href="{{ route('security.private-key.create') }}">
<x-forms.button>Add a new Private Key</x-forms.button>
</a>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New Team</x-slot:title>
<x-slot:content>
<livewire:security.private-key.create />
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
<x-forms.button wire:click.prevent='checkConnection'>
Check connection
</x-forms.button>
@ -31,9 +36,7 @@
<div class="text-xs">{{ $private_key->description }}</div>
</x-forms.button>
@empty
<div>No private keys found.
<x-use-magic-bar link="/security/private-key/new" />
</div>
<div>No private keys found. </div>
@endforelse
</div>
</div>

View File

@ -11,17 +11,6 @@
<x-forms.button type="submit">
Save
</x-forms.button>
{{-- @if (isEmailEnabled($settings) && auth()->user()->isAdminFromSession() && isTestEmailEnabled($settings))
<x-modal-input buttonTitle="Send Test Email" title="Send Test Email">
<form wire:submit='submit' class="flex flex-col gap-2">
<x-forms.input placeholder="test@example.com" id="emails" label="Recipients" required />
<x-forms.button onclick="sendTestEmail.close()" wire:click="sendTestNotification"
@click="modalOpen=false">
Send Email
</x-forms.button>
</form>
</x-modal-input>
@endif --}}
</div>
</form>
<div class="flex flex-col gap-4">

View File

@ -22,8 +22,8 @@ class="text-warning">{{ data_get(currentTeam(), 'subscription')->type() }}</stro
<h2 class="pt-4">Manage your subscription</h2>
<div class="pb-4">Cancel, upgrade or downgrade your subscription.</div>
<div class="flex gap-2">
<x-forms.button wire:click='stripeCustomerPortal'>Go to <svg xmlns="http://www.w3.org/2000/svg"
class="w-12" viewBox="0 0 512 214">
<x-forms.button class="gap-2" wire:click='stripeCustomerPortal'>Go to <svg xmlns="http://www.w3.org/2000/svg"
class="w-12 " viewBox="0 0 512 214">
<path fill="#635BFF"
d="M512 110.08c0-36.409-17.636-65.138-51.342-65.138c-33.85 0-54.33 28.73-54.33 64.854c0 42.808 24.179 64.426 58.88 64.426c16.925 0 29.725-3.84 39.396-9.244v-28.445c-9.67 4.836-20.764 7.823-34.844 7.823c-13.796 0-26.027-4.836-27.591-21.618h69.547c0-1.85.284-9.245.284-12.658Zm-70.258-13.511c0-16.071 9.814-22.756 18.774-22.756c8.675 0 17.92 6.685 17.92 22.756h-36.694Zm-90.31-51.627c-13.939 0-22.899 6.542-27.876 11.094l-1.85-8.818h-31.288v165.83l35.555-7.537l.143-40.249c5.12 3.698 12.657 8.96 25.173 8.96c25.458 0 48.64-20.48 48.64-65.564c-.142-41.245-23.609-63.716-48.498-63.716Zm-8.534 97.991c-8.391 0-13.37-2.986-16.782-6.684l-.143-52.765c3.698-4.124 8.818-6.968 16.925-6.968c12.942 0 21.902 14.506 21.902 33.137c0 19.058-8.818 33.28-21.902 33.28ZM241.493 36.551l35.698-7.68V0l-35.698 7.538V36.55Zm0 10.809h35.698v124.444h-35.698V47.36Zm-38.257 10.524L200.96 47.36h-30.72v124.444h35.556V87.467c8.39-10.951 22.613-8.96 27.022-7.396V47.36c-4.551-1.707-21.191-4.836-29.582 10.524Zm-71.112-41.386l-34.702 7.395l-.142 113.92c0 21.05 15.787 36.551 36.836 36.551c11.662 0 20.195-2.133 24.888-4.693V140.8c-4.55 1.849-27.022 8.391-27.022-12.658V77.653h27.022V47.36h-27.022l.142-30.862ZM35.982 83.484c0-5.546 4.551-7.68 12.09-7.68c10.808 0 24.461 3.272 35.27 9.103V51.484c-11.804-4.693-23.466-6.542-35.27-6.542C19.2 44.942 0 60.018 0 85.192c0 39.252 54.044 32.995 54.044 49.92c0 6.541-5.688 8.675-13.653 8.675c-11.804 0-26.88-4.836-38.827-11.378v33.849c13.227 5.689 26.596 8.106 38.827 8.106c29.582 0 49.92-14.648 49.92-40.106c-.142-42.382-54.329-34.845-54.329-50.774Z" />
</svg></x-forms.button>

View File

@ -1,18 +1,12 @@
@if ($settings->is_resale_license_active)
@if (auth()->user()->isAdminFromSession())
<div class="flex justify-center mx-10">
<div x-data>
<div>
<div class="flex gap-2">
<h1>Subscription</h1>
<livewire:switch-team />
<h1>Choose a Plan</h1>
@if (subscriptionProvider() === 'stripe' && $alreadySubscribed)
<x-forms.button wire:click='stripeCustomerPortal'>Manage My Subscription</x-forms.button>
@endif
</div>
<div class="flex items-center pb-8">
<span>Currently active team: <span
class="text-warning">{{ session('currentTeam.name') }}</span></span>
</div>
@if (request()->query->get('cancelled'))
<div class="mb-6 rounded alert-error">
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 stroke-current shrink-0" fill="none"
@ -29,15 +23,10 @@ class="text-warning">{{ session('currentTeam.name') }}</span></span>
<livewire:subscription.pricing-plans />
@endif
</div>
</div>
@else
<div class="flex flex-col justify-center mx-10">
<div class="flex gap-2">
<h1>Subscription</h1>
<livewire:switch-team />
</div>
<div class="flex items-center pb-8">
<span>Currently active team: <span class="text-warning">{{ session('currentTeam.name') }}</span></span>
</div>
<div>You are not an admin or have been removed from this team. If this does not make sense, please <span
class="text-white underline cursor-pointer" wire:click="help" onclick="help.showModal()">contact

View File

@ -1,7 +1,5 @@
<div>
<div>
<h1>Subscription</h1>
<div>Here you can see and manage your subscription.</div>
</div>
<div class="subtitle">Here you can see and manage your subscription.</div>
<livewire:subscription.actions />
</div>

View File

@ -1,8 +1,6 @@
<div class="w-64">
<x-forms.select wire:model.live="selectedTeamId">
<x-forms.select wire:model.live="selectedTeamId" label="Current Team">
<option value="default" disabled selected>Switch team</option>
@foreach (auth()->user()->teams as $team)
<option value="{{ $team->id }}">{{ $team->name }}</option>
@endforeach
</x-forms.select>
</div>
</x-forms.select>

View File

@ -1,12 +1,12 @@
<div>
<h1>Tags</h1>
<div class="flex flex-col gap-2 pb-6 ">
<div class="flex flex-col pb-6 ">
<div class="subtitle">Tags help you to perform actions on multiple resources.</div>
<div class="flex flex-wrap gap-2">
@if ($tags->count() === 0)
<div>No tags yet defined yet. Go to a resource and add a tag there.</div>
@else
<x-forms.select wire:model.live="tag">
<x-forms.select wire:model.live="tag" label="Tags">
<option value="null" disabled selected>Select a tag</option>
@foreach ($tags as $oneTag)
<option value="{{ $oneTag->name }}">{{ $oneTag->name }}</option>

View File

@ -1,11 +1,7 @@
<div>
<h1>New Team</h1>
<div class="subtitle">Add a new team.</div>
<form class="flex flex-col gap-2" wire:submit='submit'>
<form class="flex flex-col gap-2" wire:submit='submit'>
<x-forms.input autofocus id="name" label="Name" required />
<x-forms.input id="description" label="Description" />
<x-forms.button type="submit">
Save Team
Continue
</x-forms.button>
</form>
</div>
</form>

View File

@ -1,6 +1,5 @@
<div>
<x-notifications.navbar />
<h2 class="pb-4">Notifications</h2>
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'email' }" class="flex h-full">
<div class="flex flex-col gap-4 min-w-fit">
<a :class="activeTab === 'email' && 'text-white'"

View File

@ -1,5 +1,4 @@
<div>
<h1>New S3 Storage</h1>
<div class="subtitle">S3 Storage used to save backups / files.</div>
<form class="flex flex-col gap-2" wire:submit='submit'>
<div class="flex gap-2">

View File

@ -1,11 +1,17 @@
<div>
<x-team.navbar :team="auth()
->user()
->currentTeam()" />
<x-team.navbar :team="auth()->user()->currentTeam()" />
<div class="flex items-start gap-2">
<h2 class="pb-4">S3 Storages</h2>
<a class="text-white hover:no-underline" href="/team/storages/new"> <x-forms.button >+ Add
</x-forms.button></a>
<x-slide-over fullScreen closeWithX>
<x-slot:title>New S3 Storage</x-slot:title>
<x-slot:content>
<livewire:team.storage.create />
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
{{-- <a class="text-white hover:no-underline" href="/team/storages/new"> <x-forms.button>+ Add
</x-forms.button></a> --}}
</div>
<div class="grid gap-2 lg:grid-cols-2">
@forelse ($s3 as $storage)
@ -21,7 +27,6 @@
@empty
<div>
<div>No storage found.</div>
<x-use-magic-bar link="/team/storages/new" />
</div>
@endforelse
</div>

View File

@ -2,7 +2,14 @@
<x-security.navbar />
<div class="flex gap-2">
<h2 class="pb-4">Private Keys</h2>
<a href="{{ route('security.private-key.create') }}"><x-forms.button>+ Add</x-forms.button></a>
<x-slide-over closeWithX fullScreen>
<x-slot:title>New Private Key</x-slot:title>
<x-slot:content>
<livewire:security.private-key.create />
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+
Add</button>
</x-slide-over>
</div>
<div class="grid gap-2 lg:grid-cols-2">
@forelse ($privateKeys as $key)
@ -13,10 +20,7 @@
</div>
</a>
@empty
<div>
<div>No private keys found.</div>
<x-use-magic-bar link="/security/private-key/new" />
</div>
@endforelse
</div>
</x-layout>

View File

@ -40,7 +40,6 @@
@empty
<div>
<div>No sources found.</div>
<x-use-magic-bar link="/source/new" />
</div>
@endforelse
</div>

View File

@ -129,11 +129,11 @@
});
Route::prefix('team')->group(function () {
Route::get('/', TeamIndex::class)->name('team.index');
Route::get('/new', TeamCreate::class)->name('team.create');
// Route::get('/new', TeamCreate::class)->name('team.create');
Route::get('/members', TeamMemberIndex::class)->name('team.member.index');
Route::get('/shared-variables', TeamSharedVariablesIndex::class)->name('team.shared-variables.index');
Route::get('/storages', TeamStorageIndex::class)->name('team.storage.index');
Route::get('/storages/new', TeamStorageCreate::class)->name('team.storage.create');
// Route::get('/storages/new', TeamStorageCreate::class)->name('team.storage.create');
Route::get('/storages/{storage_uuid}', TeamStorageShow::class)->name('team.storage.show');
});
@ -178,7 +178,7 @@
});
Route::get('/servers', ServerIndex::class)->name('server.index');
Route::get('/server/new', ServerCreate::class)->name('server.create');
// Route::get('/server/new', ServerCreate::class)->name('server.create');
Route::prefix('server/{server_uuid}')->group(function () {
Route::get('/', ServerShow::class)->name('server.show');
@ -195,14 +195,13 @@
Route::get('/security/private-key', fn () => view('security.private-key.index', [
'privateKeys' => PrivateKey::ownedByCurrentTeam(['name', 'uuid', 'is_git_related'])->get()
]))->name('security.private-key.index');
Route::get('/security/private-key/new', SecurityPrivateKeyCreate::class)->name('security.private-key.create');
// Route::get('/security/private-key/new', SecurityPrivateKeyCreate::class)->name('security.private-key.create');
Route::get('/security/private-key/{private_key_uuid}', SecurityPrivateKeyShow::class)->name('security.private-key.show');
Route::get('/security/api-tokens', ApiTokens::class)->name('security.api-tokens');
});
Route::middleware(['auth'])->group(function () {
Route::get('/source/new', fn () => view('source.new'))->name('source.new');
Route::get('/sources', function () {
$sources = currentTeam()->sources();
return view('source.all', [