ux ux ux ux ui ui ui ui
This commit is contained in:
parent
b5775ff9d2
commit
473bad24b7
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -31,6 +31,6 @@ public function stripeCustomerPortal()
|
||||
}
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.subscription.index')->layout('layouts.subscription');
|
||||
return view('livewire.subscription.index');
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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');
|
||||
|
@ -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 {
|
||||
|
@ -1 +0,0 @@
|
||||
@extends('layouts.subscription')
|
@ -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
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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() {
|
||||
@ -380,7 +390,7 @@ class="absolute w-full duration-100 ease-out sm:max-w-xs"
|
||||
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': !
|
||||
|
@ -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>
|
||||
|
@ -1,7 +1,9 @@
|
||||
@extends('layouts.base')
|
||||
@section('body')
|
||||
@parent
|
||||
@if (isSubscribed())
|
||||
<livewire:layout-popups />
|
||||
@endif
|
||||
@auth
|
||||
<livewire:realtime-connection />
|
||||
@endauth
|
||||
|
@ -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
|
||||
|
@ -1,7 +1,6 @@
|
||||
@extends('layouts.base')
|
||||
@section('body')
|
||||
@parent
|
||||
<x-navbar-subscription />
|
||||
<main>
|
||||
{{ $slot }}
|
||||
</main>
|
||||
|
@ -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
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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 />
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -22,7 +22,7 @@ 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"
|
||||
<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" />
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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'>
|
||||
<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>
|
||||
|
@ -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'"
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -40,7 +40,6 @@
|
||||
@empty
|
||||
<div>
|
||||
<div>No sources found.</div>
|
||||
<x-use-magic-bar link="/source/new" />
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
@ -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', [
|
||||
|
Loading…
Reference in New Issue
Block a user