This commit is contained in:
Andras Bacsai 2023-06-16 12:35:40 +02:00
parent 7456fc1ac7
commit 3589b92ec9
84 changed files with 285 additions and 244 deletions

View File

@ -13,6 +13,11 @@ class Form extends Component
'destination.network' => 'required', 'destination.network' => 'required',
'destination.server.ip' => 'required', 'destination.server.ip' => 'required',
]; ];
protected $validationAttributes = [
'destination.name' => 'name',
'destination.network' => 'network',
'destination.server.ip' => 'IP Address',
];
public function submit() public function submit()
{ {
$this->validate(); $this->validate();

View File

@ -22,6 +22,11 @@ class StandaloneDocker extends Component
'network' => 'required|string', 'network' => 'required|string',
'server_id' => 'required|integer' 'server_id' => 'required|integer'
]; ];
protected $validationAttributes = [
'name' => 'name',
'network' => 'network',
'server_id' => 'server'
];
public function mount() public function mount()
{ {
if (request()->query('server_id')) { if (request()->query('server_id')) {

View File

@ -15,6 +15,11 @@ class Change extends Component
'private_key.description' => 'nullable|string', 'private_key.description' => 'nullable|string',
'private_key.private_key' => 'required|string' 'private_key.private_key' => 'required|string'
]; ];
protected $validationAttributes = [
'private_key.name' => 'name',
'private_key.description' => 'description',
'private_key.private_key' => 'private key'
];
public function mount() public function mount()
{ {
$this->private_key = PrivateKey::where('uuid', $this->private_key_uuid)->first(); $this->private_key = PrivateKey::where('uuid', $this->private_key_uuid)->first();

View File

@ -16,8 +16,8 @@ class Create extends Component
'value' => 'required|string', 'value' => 'required|string',
]; ];
protected $validationAttributes = [ protected $validationAttributes = [
'name' => 'Name', 'name' => 'name',
'value' => 'Private Key', 'value' => 'private Key',
]; ];
public function createPrivateKey() public function createPrivateKey()
{ {

View File

@ -14,6 +14,9 @@ class Form extends Component
protected $rules = [ protected $rules = [
'name' => 'required', 'name' => 'required',
]; ];
protected $validationAttributes = [
'name' => 'name',
];
public function mount() public function mount()
{ {
$this->userId = auth()->user()->id; $this->userId = auth()->user()->id;

View File

@ -18,6 +18,11 @@ class Add extends Component
'value' => 'required|string', 'value' => 'required|string',
'is_build_time' => 'required|boolean', 'is_build_time' => 'required|boolean',
]; ];
protected $validationAttributes = [
'key' => 'key',
'value' => 'value',
'is_build_time' => 'build',
];
public function mount() public function mount()
{ {
$this->parameters = getRouteParameters(); $this->parameters = getRouteParameters();

View File

@ -15,6 +15,11 @@ class Show extends Component
'env.value' => 'required|string', 'env.value' => 'required|string',
'env.is_build_time' => 'required|boolean', 'env.is_build_time' => 'required|boolean',
]; ];
protected $validationAttributes = [
'key' => 'key',
'value' => 'value',
'is_build_time' => 'build',
];
public function mount() public function mount()
{ {
$this->parameters = getRouteParameters(); $this->parameters = getRouteParameters();

View File

@ -47,6 +47,22 @@ class General extends Component
'application.ports_exposes' => 'required', 'application.ports_exposes' => 'required',
'application.ports_mappings' => 'nullable', 'application.ports_mappings' => 'nullable',
]; ];
protected $validationAttributes = [
'application.name' => 'name',
'application.fqdn' => 'FQDN',
'application.git_repository' => 'Git repository',
'application.git_branch' => 'Git branch',
'application.git_commit_sha' => 'Git commit SHA',
'application.install_command' => 'Install command',
'application.build_command' => 'Build command',
'application.start_command' => 'Start command',
'application.build_pack' => 'Build pack',
'application.static_image' => 'Static image',
'application.base_directory' => 'Base directory',
'application.publish_directory' => 'Publish directory',
'application.ports_exposes' => 'Ports exposes',
'application.ports_mappings' => 'Ports mappings',
];
public function instantSave() public function instantSave()
{ {
// @TODO: find another way - if possible // @TODO: find another way - if possible

View File

@ -14,6 +14,9 @@ class Form extends Component
protected $rules = [ protected $rules = [
'application.preview_url_template' => 'required', 'application.preview_url_template' => 'required',
]; ];
protected $validationAttributes = [
'application.preview_url_template' => 'preview url template',
];
public function resetToDefault() public function resetToDefault()
{ {
$this->application->preview_url_template = '{{pr_id}}.{{domain}}'; $this->application->preview_url_template = '{{pr_id}}.{{domain}}';

View File

@ -17,6 +17,15 @@ class ResourceLimits extends Component
'application.limits_cpuset' => 'nullable', 'application.limits_cpuset' => 'nullable',
'application.limits_cpu_shares' => 'nullable', 'application.limits_cpu_shares' => 'nullable',
]; ];
protected $validationAttributes = [
'application.limits_memory' => 'memory',
'application.limits_memory_swap' => 'swap',
'application.limits_memory_swappiness' => 'swappiness',
'application.limits_memory_reservation' => 'reservation',
'application.limits_cpus' => 'cpus',
'application.limits_cpuset' => 'cpuset',
'application.limits_cpu_shares' => 'cpu shares',
];
public function submit() public function submit()
{ {
try { try {

View File

@ -16,6 +16,11 @@ class Source extends Component
'application.git_branch' => 'required', 'application.git_branch' => 'required',
'application.git_commit_sha' => 'nullable', 'application.git_commit_sha' => 'nullable',
]; ];
protected $validationAttributes = [
'application.git_repository' => 'repository',
'application.git_branch' => 'branch',
'application.git_commit_sha' => 'commit sha',
];
private function get_private_keys() private function get_private_keys()
{ {
$this->private_keys = PrivateKey::whereTeamId(session('currentTeam')->id)->get()->reject(function ($key) { $this->private_keys = PrivateKey::whereTeamId(session('currentTeam')->id)->get()->reject(function ($key) {

View File

@ -17,6 +17,11 @@ class Add extends Component
'mount_path' => 'required|string', 'mount_path' => 'required|string',
'host_path' => 'string|nullable', 'host_path' => 'string|nullable',
]; ];
protected $validationAttributes = [
'name' => 'name',
'mount_path' => 'mount',
'host_path' => 'host',
];
public function mount() public function mount()
{ {
$this->parameters = getRouteParameters(); $this->parameters = getRouteParameters();

View File

@ -12,6 +12,11 @@ class Show extends Component
'storage.mount_path' => 'required|string', 'storage.mount_path' => 'required|string',
'storage.host_path' => 'string|nullable', 'storage.host_path' => 'string|nullable',
]; ];
protected $validationAttributes = [
'name' => 'name',
'mount_path' => 'mount',
'host_path' => 'host',
];
public function submit() public function submit()
{ {
$this->validate(); $this->validate();

View File

@ -3,14 +3,12 @@
namespace App\Http\Livewire\Project; namespace App\Http\Livewire\Project;
use App\Models\Environment; use App\Models\Environment;
use App\Models\Project;
use Livewire\Component; use Livewire\Component;
class DeleteEnvironment extends Component class DeleteEnvironment extends Component
{ {
public array $parameters; public array $parameters;
public int $environment_id; public int $environment_id;
public int $resource_count = 0;
public function mount() public function mount()
{ {

View File

@ -9,7 +9,6 @@ class DeleteProject extends Component
{ {
public array $parameters; public array $parameters;
public int $project_id; public int $project_id;
public int $resource_count = 0;
public function mount() public function mount()
{ {

View File

@ -37,6 +37,12 @@ class PublicGitRepository extends Component
'is_static' => 'required|boolean', 'is_static' => 'required|boolean',
'publish_directory' => 'nullable|string', 'publish_directory' => 'nullable|string',
]; ];
protected $validationAttributes = [
'repository_url' => 'repository',
'port' => 'port',
'is_static' => 'static',
'publish_directory' => 'publish directory',
];
public function mount() public function mount()
{ {
if (isDev()) { if (isDev()) {

View File

@ -16,6 +16,10 @@ class RunCommand extends Component
'server' => 'required', 'server' => 'required',
'command' => 'required', 'command' => 'required',
]; ];
protected $validationAttributes = [
'server' => 'server',
'command' => 'command',
];
public function mount($servers) public function mount($servers)
{ {
$this->servers = $servers; $this->servers = $servers;

View File

@ -21,6 +21,15 @@ class Form extends Component
'server.settings.is_reachable' => 'required', 'server.settings.is_reachable' => 'required',
'server.settings.is_part_of_swarm' => 'required' 'server.settings.is_part_of_swarm' => 'required'
]; ];
protected $validationAttributes = [
'server.name' => 'name',
'server.description' => 'description',
'server.ip' => 'ip',
'server.user' => 'user',
'server.port' => 'port',
'server.settings.is_reachable' => 'is reachable',
'server.settings.is_part_of_swarm' => 'is part of swarm'
];
public function installDocker() public function installDocker()
{ {
$activity = resolve(InstallDocker::class)($this->server); $activity = resolve(InstallDocker::class)($this->server);

View File

@ -22,11 +22,18 @@ class ByIp extends Component
public bool $is_part_of_swarm = false; public bool $is_part_of_swarm = false;
protected $rules = [ protected $rules = [
'name' => 'required', 'name' => 'required|string',
'ip' => 'required', 'description' => 'nullable|string',
'user' => 'required', 'ip' => 'required|ip',
'user' => 'required|string',
'port' => 'required|integer', 'port' => 'required|integer',
'is_part_of_swarm' => 'required|boolean', ];
protected $validationAttributes = [
'name' => 'name',
'description' => 'description',
'ip' => 'ip',
'user' => 'user',
'port' => 'port',
]; ];
public function mount() public function mount()
{ {
@ -43,11 +50,11 @@ public function instantSave()
} }
public function submit() public function submit()
{ {
$this->validate();
try { try {
if (!$this->private_key_id) { if (!$this->private_key_id) {
return $this->emit('error', 'You must select a private key'); return $this->emit('error', 'You must select a private key');
} }
$this->validate();
$server = Server::create([ $server = Server::create([
'name' => $this->name, 'name' => $this->name,
'description' => $this->description, 'description' => $this->description,

View File

@ -25,6 +25,13 @@ class Configuration extends Component
'settings.public_port_max' => 'required', 'settings.public_port_max' => 'required',
'settings.default_redirect_404' => 'nullable', 'settings.default_redirect_404' => 'nullable',
]; ];
protected $validationAttributes = [
'settings.fqdn' => 'FQDN',
'settings.wildcard_domain' => 'Wildcard domain',
'settings.public_port_min' => 'Public port min',
'settings.public_port_max' => 'Public port max',
'settings.default_redirect_404' => 'Default redirect 404',
];
public function mount() public function mount()
{ {
$this->do_not_track = $this->settings->do_not_track; $this->do_not_track = $this->settings->do_not_track;

View File

@ -10,12 +10,13 @@ class Upgrade extends Component
{ {
public bool $showProgress = false; public bool $showProgress = false;
public bool $isUpgradeAvailable = false; public bool $isUpgradeAvailable = false;
public string $latestVersion = '';
public function checkUpdate() public function checkUpdate()
{ {
$latestVersion = get_latest_version_of_coolify(); $this->latestVersion = get_latest_version_of_coolify();
$currentVersion = config('version'); $currentVersion = config('version');
version_compare($currentVersion, $latestVersion, '<') ? $this->isUpgradeAvailable = true : $this->isUpgradeAvailable = false; version_compare($currentVersion, $this->latestVersion, '<') ? $this->isUpgradeAvailable = true : $this->isUpgradeAvailable = false;
if (isDev()) { if (isDev()) {
$this->isUpgradeAvailable = true; $this->isUpgradeAvailable = true;
} }
@ -25,7 +26,7 @@ public function upgrade()
try { try {
$this->showProgress = true; $this->showProgress = true;
resolve(UpdateCoolify::class)(true); resolve(UpdateCoolify::class)(true);
Toaster::success('Upgrading Coolify to latest version...'); Toaster::success("Upgrading Coolify to {$this->latestVersion} version...");
} catch (\Exception $e) { } catch (\Exception $e) {
return general_error_handler(err: $e, that: $this); return general_error_handler(err: $e, that: $this);
} }

View File

@ -1,3 +1,3 @@
<?php <?php
return '4.0.0-nightly.16'; return '4.0.0-nightly.17';

View File

@ -9,7 +9,7 @@ html {
@apply text-neutral-400; @apply text-neutral-400;
} }
body { body {
@apply scrollbar antialiased; @apply scrollbar antialiased text-sm;
} }
.main { .main {
@apply pl-24 pr-10 mx-auto max-w-screen-xl pt-4; @apply pl-24 pr-10 mx-auto max-w-screen-xl pt-4;
@ -28,11 +28,11 @@ textarea {
@apply textarea placeholder:text-neutral-700 text-white rounded scrollbar bg-coolgray-200; @apply textarea placeholder:text-neutral-700 text-white rounded scrollbar bg-coolgray-200;
} }
select { select {
@apply h-7 select select-xs text-sm disabled:bg-coolgray-200 border-none disabled:opacity-50 font-normal placeholder:text-neutral-700 text-white rounded bg-coolgray-200; @apply h-7 select select-xs disabled:bg-coolgray-200 border-none disabled:opacity-50 font-normal placeholder:text-neutral-700 text-white rounded bg-coolgray-200;
} }
.label-text, .label-text,
label { label {
@apply text-neutral-400 text-sm; @apply text-neutral-400;
} }
.loading { .loading {
@ -58,7 +58,7 @@ h4 {
@apply text-base font-bold text-white; @apply text-base font-bold text-white;
} }
a { a {
@apply text-neutral-400 hover:text-white text-sm link link-hover hover:bg-transparent; @apply text-neutral-400 hover:text-white link link-hover hover:bg-transparent;
} }
.kbd-custom { .kbd-custom {
@apply px-2 text-xs border border-dashed rounded border-neutral-700 text-warning; @apply px-2 text-xs border border-dashed rounded border-neutral-700 text-warning;
@ -70,7 +70,7 @@ .icon:hover {
@apply text-white; @apply text-white;
} }
.box { .box {
@apply flex items-center justify-center text-sm rounded min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white p-2 hover:no-underline transition-colors; @apply flex items-center justify-center rounded min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white p-2 hover:no-underline transition-colors;
} }
.lds-heart { .lds-heart {
@ -106,13 +106,13 @@ table {
@apply min-w-full divide-y divide-coolgray-200; @apply min-w-full divide-y divide-coolgray-200;
} }
thead { thead {
@apply uppercase text-sm; @apply uppercase;
} }
tbody { tbody {
@apply divide-y divide-coolgray-200; @apply divide-y divide-coolgray-200;
} }
tr { tr {
@apply text-sm text-neutral-400; @apply text-neutral-400;
} }
tr th { tr th {
@apply px-3 py-3.5 text-left text-white; @apply px-3 py-3.5 text-left text-white;

View File

@ -38,7 +38,7 @@
class="mt-4 mb-2 text-xs font-semibold text-neutral-500">{{ class="mt-4 mb-2 text-xs font-semibold text-neutral-500">{{
possibleSequences[sequenceState.sequence[sequenceState.currentActionIndex]].newTitle }} possibleSequences[sequenceState.sequence[sequenceState.currentActionIndex]].newTitle }}
</h2> </h2>
<ul class="mt-2 -mx-4 text-sm text-white "> <ul class="mt-2 -mx-4 text-white">
<li class="flex items-center px-4 py-2 cursor-pointer select-none group hover:bg-coolgray-400" <li class="flex items-center px-4 py-2 cursor-pointer select-none group hover:bg-coolgray-400"
id="option-1" role="option" tabindex="-1" id="option-1" role="option" tabindex="-1"
@click="addNew(sequenceState.sequence[sequenceState.currentActionIndex])"> @click="addNew(sequenceState.sequence[sequenceState.currentActionIndex])">
@ -65,7 +65,7 @@
</ul> </ul>
</li> </li>
<li> <li>
<ul v-if="magic.length == 0" class="mt-2 -mx-4 text-sm text-white"> <ul v-if="magic.length == 0" class="mt-2 -mx-4 text-white">
<li class="flex items-center px-4 py-2 select-none group"> <li class="flex items-center px-4 py-2 select-none group">
<svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 icon" viewBox="0 0 24 24" <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6 icon" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round"
@ -83,7 +83,7 @@
class="mt-4 mb-2 text-xs font-semibold text-neutral-500">{{ class="mt-4 mb-2 text-xs font-semibold text-neutral-500">{{
possibleSequences[sequenceState.sequence[sequenceState.currentActionIndex]].title }} possibleSequences[sequenceState.sequence[sequenceState.currentActionIndex]].title }}
</h2> </h2>
<ul v-if="magic.length != 0" class="mt-2 -mx-4 text-sm text-white"> <ul v-if="magic.length != 0" class="mt-2 -mx-4 text-white">
<li class="flex items-center px-4 py-2 transition-all cursor-pointer select-none group hover:bg-coolgray-400" <li class="flex items-center px-4 py-2 transition-all cursor-pointer select-none group hover:bg-coolgray-400"
:class="{ 'bg-coollabs': currentFocus === index }" id="option-1" role="option" :class="{ 'bg-coollabs': currentFocus === index }" id="option-1" role="option"
tabindex="-1" v-for="action, index in magic" @click="goThroughSequence(index)" tabindex="-1" v-for="action, index in magic" @click="goThroughSequence(index)"

View File

@ -18,7 +18,7 @@
</div> </div>
@endif @endif
@if (session('status')) @if (session('status'))
<div class="mb-4 text-sm font-medium text-green-600"> <div class="mb-4 font-medium text-green-600">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif

View File

@ -33,7 +33,7 @@ class="text-xs text-center text-white normal-case bg-transparent border-none rou
<x-forms.button type="submit">{{ __('auth.login') }}</x-forms.button> <x-forms.button type="submit">{{ __('auth.login') }}</x-forms.button>
@if (!$is_registration_enabled) @if (!$is_registration_enabled)
<div class="text-sm text-center">{{ __('auth.registration_disabled') }}</div> <div class="text-center ">{{ __('auth.registration_disabled') }}</div>
@endif @endif
@if ($errors->any()) @if ($errors->any())
<div class="text-xs text-center text-error"> <div class="text-xs text-center text-error">
@ -41,7 +41,7 @@ class="text-xs text-center text-white normal-case bg-transparent border-none rou
</div> </div>
@endif @endif
@if (session('status')) @if (session('status'))
<div class="mb-4 text-sm font-medium text-green-600"> <div class="mb-4 font-medium text-green-600">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif

View File

@ -30,7 +30,7 @@
</div> </div>
@endif @endif
@if (session('status')) @if (session('status'))
<div class="mb-4 text-sm font-medium text-green-600"> <div class="mb-4 font-medium text-green-600">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif

View File

@ -36,7 +36,7 @@
</div> </div>
@endif @endif
@if (session('status')) @if (session('status'))
<div class="mb-4 text-sm font-medium text-green-600"> <div class="mb-4 font-medium text-green-600">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Command Center</h1> <h1>Command Center</h1>
<div class="pt-2 pb-10 text-sm">Execute commands on your servers without leaving the browser.</div> <div class="pt-2 pb-10">Execute commands on your servers without leaving the browser.</div>
@if ($servers->count() > 0) @if ($servers->count() > 0)
<livewire:run-command :servers="$servers" /> <livewire:run-command :servers="$servers" />
@else @else

View File

@ -1,3 +1,46 @@
<nav class="flex pt-2 pb-10">
<ol class="flex items-center">
<li class="inline-flex items-center">
<a class="text-xs truncate lg:text-sm"
href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">
{{ $application->environment->project->name }}</a>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<a class="text-xs truncate lg:text-sm"
href="{{ route('project.resources', ['environment_name' => request()->route('environment_name'), 'project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('environment_name') }}</a>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<span class="text-xs truncate lg:text-sm">{{ data_get($application, 'name') }}</span>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<livewire:project.application.status :application="$application" />
</div>
</li>
</ol>
</nav>
<nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200"> <nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200">
<a class="{{ request()->routeIs('project.application.configuration') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('project.application.configuration') ? 'text-white' : '' }}"
href="{{ route('project.application.configuration', [ href="{{ route('project.application.configuration', [
@ -17,7 +60,7 @@
</a> </a>
<div class="flex-1"></div> <div class="flex-1"></div>
<div class="group"> <div class="group">
<label tabindex="0" class="flex items-center gap-2 text-sm cursor-pointer hover:text-white"> Links <label tabindex="0" class="flex items-center gap-2 cursor-pointer hover:text-white"> Links
<x-chevron-down /> <x-chevron-down />
</label> </label>
<div class="absolute hidden group-hover:block"> <div class="absolute hidden group-hover:block">

View File

@ -17,7 +17,7 @@
@if ($type === 'password') @if ($type === 'password')
<div class="w-full rounded join" x-data> <div class="w-full rounded join" x-data>
<input class="join-item" wire:model.defer={{ $id }} wire:dirty.class="input-warning" <input class="join-item" wire:model.defer={{ $id }} wire:dirty.class="input-warning"
@readonly($readonly) @disabled($disabled || $errors->isNotEmpty()) type={{ $type }} id={{ $id }} @readonly($readonly) @disabled($disabled) type={{ $type }} id={{ $id }}
name={{ $name }} @isset($value) value={{ $value }} @endisset name={{ $name }} @isset($value) value={{ $value }} @endisset
@isset($placeholder) placeholder={{ $placeholder }} @endisset> @isset($placeholder) placeholder={{ $placeholder }} @endisset>
@if (!$cannotPeakPassword) @if (!$cannotPeakPassword)
@ -40,12 +40,17 @@
</div> </div>
@else @else
<input id={{ $id }} name={{ $name }} wire:model.defer={{ $id }} <input id={{ $id }} name={{ $name }} wire:model.defer={{ $id }}
wire:dirty.class="input-warning" @readonly($readonly) @disabled($disabled || $errors->isNotEmpty()) wire:dirty.class="input-warning" @readonly($readonly) @disabled($disabled)
@isset($value) value={{ $value }} @endisset @isset($value) value={{ $value }} @endisset
@isset($placeholder) placeholder={{ $placeholder }} @endisset> @isset($placeholder) placeholder={{ $placeholder }} @endisset>
@endif @endif
@if (!$label && $helper) @if (!$label && $helper)
<x-helper :helper="$helper" /> <x-helper :helper="$helper" />
@endif @endif
@error($id)
<label class="label">
<span class="text-red-500 label-text-alt">{{ $message }}</span>
</label>
@enderror
</div> </div>
</div> </div>

View File

@ -44,7 +44,7 @@ class="flex items-center justify-center flex-shrink-0 w-12 h-12 mx-auto rounded-
<h3 class="text-base font-semibold leading-6 text-white" id="modal-title">Delete Resource <h3 class="text-base font-semibold leading-6 text-white" id="modal-title">Delete Resource
</h3> </h3>
<div class="mt-2"> <div class="mt-2">
<p class="text-sm text-neutral-200">{{ $message }}</p> <p class=" text-neutral-200">{{ $message }}</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -117,7 +117,7 @@ class="absolute top-0 right-0 p-2 m-2 my-1 cursor-pointer hover:bg-transparent h
<form action="/logout" method="POST"> <form action="/logout" method="POST">
<li> <li>
@csrf @csrf
<button class="text-sm text-white rounded-none hover:bg-coollabs"> <svg <button class=" text-white rounded-none hover:bg-coollabs"> <svg
xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24" 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-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round"
stroke-linejoin="round"> stroke-linejoin="round">

View File

@ -1,6 +1,6 @@
<div class="pb-6"> <div class="pb-6">
<h1>Server</h1> <h1>Server</h1>
<div class="pt-2 pb-10 text-sm">{{ data_get($server, 'name') }}</div> <div class="pt-2 pb-10 ">{{ data_get($server, 'name') }}</div>
<nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200"> <nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200">
<a class="{{ request()->routeIs('server.show') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('server.show') ? 'text-white' : '' }}"
href="{{ route('server.show', [ href="{{ route('server.show', [

View File

@ -1,6 +1,6 @@
<div class="pb-6"> <div class="pb-6">
<h1>Settings</h1> <h1>Settings</h1>
<div class="pt-2 pb-10 text-sm">Instance wide settings for Coolify.</div> <div class="pt-2 pb-10 ">Instance wide settings for Coolify.</div>
<nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200"> <nav class="flex items-end gap-4 py-2 border-b-2 border-solid border-coolgray-200">
<a class="{{ request()->routeIs('settings.configuration') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('settings.configuration') ? 'text-white' : '' }}"
href="{{ route('settings.configuration') }}"> href="{{ route('settings.configuration') }}">

View File

@ -1,5 +1,5 @@
<x-loading wire:loading.delay.longer /> <x-loading wire:loading.delay.longer />
<div class="flex items-center gap-2 text-sm" wire:loading.remove.delay.longer> <div class="flex items-center gap-2 " wire:loading.remove.delay.longer>
<div class="badge badge-error badge-xs"></div> <div class="badge badge-error badge-xs"></div>
<div class="text-xs font-medium tracking-wide text-error">Stopped</div> <div class="text-xs font-medium tracking-wide text-error">Stopped</div>
</div> </div>

View File

@ -1,5 +1,5 @@
<x-loading wire:loading.delay.longer /> <x-loading wire:loading.delay.longer />
<div class="flex items-center gap-2 text-sm" wire:loading.remove.delay.longer> <div class="flex items-center gap-2 " wire:loading.remove.delay.longer>
<div class="badge badge-success badge-xs"></div> <div class="badge badge-success badge-xs"></div>
<div class="text-xs font-medium tracking-wide text-success">Running</div> <div class="text-xs font-medium tracking-wide text-success">Running</div>
</div> </div>

View File

@ -1,5 +1,5 @@
<x-loading wire:loading.delay.longer /> <x-loading wire:loading.delay.longer />
<div class="flex items-center gap-2 text-sm" wire:loading.remove.delay.longer> <div class="flex items-center gap-2 " wire:loading.remove.delay.longer>
<div class="badge badge-error badge-xs"></div> <div class="badge badge-error badge-xs"></div>
<div class="text-xs font-medium tracking-wide text-error">Stopped</div> <div class="text-xs font-medium tracking-wide text-error">Stopped</div>
</div> </div>

View File

@ -1,6 +1,6 @@
<div class="pb-6"> <div class="pb-6">
<h1>Team</h1> <h1>Team</h1>
<nav class="flex pt-2 pb-10 text-sm"> <nav class="flex pt-2 pb-10 ">
<ol class="inline-flex items-center"> <ol class="inline-flex items-center">
<li class="inline-flex items-center"> <li class="inline-flex items-center">
Currently Active Team Currently Active Team

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Dashboard</h1> <h1>Dashboard</h1>
<div class="pt-2 pb-10 text-sm">Something (more) useful will be here.</div> <div class="pt-2 pb-10">Something (more) useful will be here.</div>
<div class="w-full rounded shadow stats stats-vertical lg:stats-horizontal"> <div class="w-full rounded shadow stats stats-vertical lg:stats-horizontal">
<div class="stat"> <div class="stat">
<div class="stat-title">Servers</div> <div class="stat-title">Servers</div>

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Destinations</h1> <h1>Destinations</h1>
<div class="pt-2 pb-10 text-sm">All Destinations</div> <div class="pt-2 pb-10 ">All Destinations</div>
<div class="grid lg:grid-cols-2 gap-2"> <div class="grid lg:grid-cols-2 gap-2">
@forelse ($destinations as $destination) @forelse ($destinations as $destination)
@if ($destination->getMorphClass() === 'App\Models\StandaloneDocker') @if ($destination->getMorphClass() === 'App\Models\StandaloneDocker')

View File

@ -8,9 +8,9 @@
</p> </p>
<div class="flex items-center justify-center mt-10 gap-x-6"> <div class="flex items-center justify-center mt-10 gap-x-6">
<a href="/" <a href="/"
class="rounded-md bg-coollabs px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-coollabs-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 hover:no-underline">Go class="rounded-md bg-coollabs px-3.5 py-2.5 font-semibold text-white shadow-sm hover:bg-coollabs-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 hover:no-underline">Go
back home</a> back home</a>
<a href="https://docs.coollabs.io/contact.html" class="text-sm font-semibold text-white">Contact <a href="https://docs.coollabs.io/contact.html" class=" font-semibold text-white">Contact
support support
<span aria-hidden="true">&rarr;</span></a> <span aria-hidden="true">&rarr;</span></a>
</div> </div>

View File

@ -14,9 +14,9 @@
</div> </div>
@if ($destination->getMorphClass() === 'App\Models\StandaloneDocker') @if ($destination->getMorphClass() === 'App\Models\StandaloneDocker')
<div class="pt-2 pb-10 text-sm">A Docker network in a non-swarm environment</div> <div class="pt-2 pb-10 ">A Docker network in a non-swarm environment</div>
@else @else
<div class="pt-2 pb-10 text-sm">Your swarm docker network. WIP</div> <div class="pt-2 pb-10 ">Your swarm docker network. WIP</div>
@endif @endif
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="destination.name" label="Name" /> <x-forms.input id="destination.name" label="Name" />

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Destination</h1> <h1>Create a new Destination</h1>
<div class="pt-2 pb-10 text-sm">Destinations are used to segregate resources by network.</div> <div class="pt-2 pb-10 ">Destinations are used to segregate resources by network.</div>
<form class="flex flex-col gap-4" wire:submit.prevent='submit'> <form class="flex flex-col gap-4" wire:submit.prevent='submit'>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="name" label="Name" required /> <x-forms.input id="name" label="Name" required />

View File

@ -6,15 +6,15 @@
</a> </a>
<x-forms.button wire:click='scan'>Scan destinations on the server</x-forms.button> <x-forms.button wire:click='scan'>Scan destinations on the server</x-forms.button>
</div> </div>
<div class="pt-2 pb-6 text-sm">Destinations are used to segregate resources by network.</div> <div class="pt-2 pb-6 ">Destinations are used to segregate resources by network.</div>
<div class="flex gap-2 text-sm"> <div class="flex gap-2 ">
Available for using: Available for using:
@forelse ($server->standaloneDockers as $docker) @forelse ($server->standaloneDockers as $docker)
<a href="{{ route('destination.show', ['destination_uuid' => data_get($docker, 'uuid')]) }}"> <a href="{{ route('destination.show', ['destination_uuid' => data_get($docker, 'uuid')]) }}">
<button class="text-white btn-link">{{ data_get($docker, 'network') }} </button> <button class="text-white btn-link">{{ data_get($docker, 'network') }} </button>
</a> </a>
@empty @empty
<div class="text-sm">N\A</div> <div class="">N\A</div>
@endforelse @endforelse
</div> </div>
<div class="grid gap-2 pt-2"> <div class="grid gap-2 pt-2">
@ -22,7 +22,7 @@
<h3>Scanned available Destinations</h3> <h3>Scanned available Destinations</h3>
@endif @endif
@foreach ($networks as $network) @foreach ($networks as $network)
<div class="flex gap-2 text-sm w-96"> <div class="flex gap-2 w-96">
<div class="w-32">{{ data_get($network, 'Name') }}</div> <div class="w-32">{{ data_get($network, 'Name') }}</div>
<a <a
href="{{ route('destination.new', ['server_id' => $server->id, 'network_name' => data_get($network, 'Name')]) }}"> href="{{ route('destination.new', ['server_id' => $server->id, 'network_name' => data_get($network, 'Name')]) }}">

View File

@ -10,12 +10,12 @@
Delete Delete
</x-forms.button> </x-forms.button>
</div> </div>
<div class="pb-8 text-sm">Private Key used for SSH connection</div> <div class="pb-8 ">Private Key used for SSH connection</div>
<x-forms.input id="private_key.name" label="Name" required /> <x-forms.input id="private_key.name" label="Name" required />
<x-forms.input id="private_key.description" label="Description" /> <x-forms.input id="private_key.description" label="Description" />
<div> <div>
<div class="flex items-end gap-2 py-2 "> <div class="flex items-end gap-2 py-2 ">
<div class="pl-1 text-sm">Private Key <span class='text-helper'>*</span></div> <div class="pl-1 ">Private Key <span class='text-helper'>*</span></div>
<div class="text-xs text-white underline cursor-pointer" x-cloak x-show="!showPrivateKey" <div class="text-xs text-white underline cursor-pointer" x-cloak x-show="!showPrivateKey"
x-on:click="showPrivateKey = true"> x-on:click="showPrivateKey = true">
Show Show

View File

@ -1,8 +1,8 @@
<div x-data="{ deleteApplication: false }"> <div x-data="{ deleteApplication: false }">
<h2>Danger Zone</h2> <h2>Danger Zone</h2>
<div class="text-sm">Woah. I hope you know what are you doing.</div> <div class="">Woah. I hope you know what are you doing.</div>
<h3 class="pt-4">Delete Application</h3> <h3 class="pt-4">Delete Application</h3>
<div class="pb-4 text-sm">This will stop your containers, delete all related data, etc. Beware! There is no coming <div class="pb-4 ">This will stop your containers, delete all related data, etc. Beware! There is no coming
back! back!
</div> </div>
<x-naked-modal show="deleteApplication" /> <x-naked-modal show="deleteApplication" />

View File

@ -1,13 +1,13 @@
<div class="pt-4"> <div class="pt-4">
<livewire:project.application.deployment-navbar :activity="$activity" :application="$application" :deployment_uuid="$deployment_uuid" /> <livewire:project.application.deployment-navbar :activity="$activity" :application="$application" :deployment_uuid="$deployment_uuid" />
@if (data_get($activity, 'properties.status') === 'in_progress') @if (data_get($activity, 'properties.status') === 'in_progress')
<div class="flex items-center gap-1 pt-2 text-sm">Deployment is <div class="flex items-center gap-1 pt-2 ">Deployment is
<div class="text-warning"> {{ Str::headline(data_get($activity, 'properties.status')) }}.</div> <div class="text-warning"> {{ Str::headline(data_get($activity, 'properties.status')) }}.</div>
<x-loading class="loading-ring" /> <x-loading class="loading-ring" />
</div> </div>
<div class="text-sm">Logs will be updated automatically.</div> <div class="">Logs will be updated automatically.</div>
@else @else
<div class="pt-2 text-sm">Deployment is <span <div class="pt-2 ">Deployment is <span
class="text-warning">{{ Str::headline(data_get($activity, 'properties.status')) }}</span>. class="text-warning">{{ Str::headline(data_get($activity, 'properties.status')) }}</span>.
</div> </div>
@endif @endif

View File

@ -23,8 +23,8 @@
class="hover:no-underline"> class="hover:no-underline">
<div class="flex flex-col justify-start"> <div class="flex flex-col justify-start">
<div> <div>
{{ $deployment->id }} <span class="text-sm text-warning">></span> {{ $deployment->deployment_uuid }} {{ $deployment->id }} <span class=" text-warning">></span> {{ $deployment->deployment_uuid }}
<span class="text-sm text-warning">></span> <span class=" text-warning">></span>
{{ $deployment->status }} {{ $deployment->status }}
</div> </div>
@if (data_get($deployment, 'pull_request_id')) @if (data_get($deployment, 'pull_request_id'))

View File

@ -1,7 +1,7 @@
<div> <div>
<h2>Destination</h2> <h2>Destination</h2>
<div class="text-sm">The destination server / network where your application will be deployed to.</div> <div class="">The destination server / network where your application will be deployed to.</div>
<div class="py-4 text-sm"> <div class="py-4 ">
<p>Server: {{ data_get($destination, 'server.name') }}</p> <p>Server: {{ data_get($destination, 'server.name') }}</p>
<p>Destination Network: {{ $destination->network }}</p> <p>Destination Network: {{ $destination->network }}</p>
</div> </div>

View File

@ -1,7 +1,7 @@
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<div> <div>
<h2>Environment Variables</h2> <h2>Environment Variables</h2>
<div class="text-sm">Environment (secrets) variables for normal deployments.</div> <div class="">Environment (secrets) variables for normal deployments.</div>
</div> </div>
@foreach ($application->environment_variables as $env) @foreach ($application->environment_variables as $env)
<livewire:project.application.environment-variable.show wire:key="environment-{{ $env->id }}" <livewire:project.application.environment-variable.show wire:key="environment-{{ $env->id }}"
@ -12,7 +12,7 @@
</div> </div>
<div> <div>
<h3>Preview Deployments</h3> <h3>Preview Deployments</h3>
<div class="text-sm">Environment (secrets) variables for Preview Deployments.</div> <div class="">Environment (secrets) variables for Preview Deployments.</div>
</div> </div>
@foreach ($application->environment_variables_preview as $env) @foreach ($application->environment_variables_preview as $env)
<livewire:project.application.environment-variable.show wire:key="environment-{{ $env->id }}" <livewire:project.application.environment-variable.show wire:key="environment-{{ $env->id }}"

View File

@ -6,7 +6,7 @@
Save Save
</x-forms.button> </x-forms.button>
</div> </div>
<div class="text-sm">General configuration for your application.</div> <div class="">General configuration for your application.</div>
<div class="flex flex-col gap-2 py-4"> <div class="flex flex-col gap-2 py-4">
<div class="flex flex-col items-end gap-2 xl:flex-row"> <div class="flex flex-col items-end gap-2 xl:flex-row">
<x-forms.input id="application.name" label="Name" required /> <x-forms.input id="application.name" label="Name" required />
@ -16,7 +16,7 @@
</div> </div>
@if ($wildcard_domain) @if ($wildcard_domain)
<div class="pb-6"> <div class="pb-6">
<div class="text-sm">Set Random Domain</div> <div class="">Set Random Domain</div>
@if ($global_wildcard_domain) @if ($global_wildcard_domain)
<x-forms.button wire:click="generateGlobalRandomDomain">Global Wildcard <x-forms.button wire:click="generateGlobalRandomDomain">Global Wildcard
</x-forms.button> </x-forms.button>

View File

@ -4,10 +4,10 @@
<x-forms.button type="submit">Save</x-forms.button> <x-forms.button type="submit">Save</x-forms.button>
<x-forms.button wire:click="resetToDefault">Reset template to default</x-forms.button> <x-forms.button wire:click="resetToDefault">Reset template to default</x-forms.button>
</div> </div>
<div class="pb-4 text-sm">Preview Deployments based on pull requests are here.</div> <div class="pb-4 ">Preview Deployments based on pull requests are here.</div>
<div class="flex flex-col gap-2 pb-4"> <div class="flex flex-col gap-2 pb-4">
<x-forms.input id="application.preview_url_template" label="Preview URL Template" <x-forms.input id="application.preview_url_template" label="Preview URL Template"
helper="Templates:<span class='text-helper'>@@{{ random }}</span> to generate random sub-domain each time a PR is deployed, <span class='text-helper'>@@{{ pr_id }}</span> to use pull request ID as sub-domain or <span class='text-helper'>@@{{ domain }}</span> to replace the domain name with the application's domain name." /> helper="Templates:<span class='text-helper'>@@{{ random }}</span> to generate random sub-domain each time a PR is deployed, <span class='text-helper'>@@{{ pr_id }}</span> to use pull request ID as sub-domain or <span class='text-helper'>@@{{ domain }}</span> to replace the domain name with the application's domain name." />
<div class="text-sm">Domain Preview: {{ $preview_url_template }}</div> <div class="">Domain Preview: {{ $preview_url_template }}</div>
</div> </div>
</form> </form>

View File

@ -7,7 +7,7 @@
</x-forms.button> </x-forms.button>
</div> </div>
@isset($rate_limit_remaining) @isset($rate_limit_remaining)
<div class="pt-1 text-sm">Requests remaning till rate limited by Git: {{ $rate_limit_remaining }}</div> <div class="pt-1 ">Requests remaning till rate limited by Git: {{ $rate_limit_remaining }}</div>
@endisset @endisset
@if (count($pull_requests) > 0) @if (count($pull_requests) > 0)
<div wire:loading.remove wire:target='load_prs'> <div wire:loading.remove wire:target='load_prs'>
@ -49,7 +49,7 @@
</div> </div>
@if ($application->previews->count() > 0) @if ($application->previews->count() > 0)
<h4 class="pt-4">Preview Deployments</h4> <h4 class="pt-4">Preview Deployments</h4>
<div class="flex gap-6 text-sm"> <div class="flex gap-6 ">
@foreach ($application->previews as $preview) @foreach ($application->previews as $preview)
<div class="flex flex-col p-4 bg-coolgray-200 " x-init="$wire.loadStatus('{{ data_get($preview, 'pull_request_id') }}')"> <div class="flex flex-col p-4 bg-coolgray-200 " x-init="$wire.loadStatus('{{ data_get($preview, 'pull_request_id') }}')">
<div class="flex gap-2">PR #{{ data_get($preview, 'pull_request_id') }} | <div class="flex gap-2">PR #{{ data_get($preview, 'pull_request_id') }} |

View File

@ -4,7 +4,7 @@
<h2>Resource Limits</h2> <h2>Resource Limits</h2>
<x-forms.button type='submit'>Save</x-forms.button> <x-forms.button type='submit'>Save</x-forms.button>
</div> </div>
<div class="text-sm">Limit your container resources by CPU & memory.</div> <div class="">Limit your container resources by CPU & memory.</div>
<h3 class="pt-4">Limit CPUs</h3> <h3 class="pt-4">Limit CPUs</h3>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input placeholder="1.5" label="Number of CPUs" id="application.limits_cpus" /> <x-forms.input placeholder="1.5" label="Number of CPUs" id="application.limits_cpus" />

View File

@ -3,14 +3,14 @@
<h2>Rollback</h2> <h2>Rollback</h2>
<x-forms.button wire:click='loadImages'>Reload Available Images</x-forms.button> <x-forms.button wire:click='loadImages'>Reload Available Images</x-forms.button>
</div> </div>
<div class="pb-4 text-sm">You can easily rollback to a previously built image quickly.</div> <div class="pb-4 ">You can easily rollback to a previously built image quickly.</div>
<div wire:target='loadImages'> <div wire:target='loadImages'>
<div class="flex flex-wrap"> <div class="flex flex-wrap">
@foreach ($images as $image) @foreach ($images as $image)
<div class="w-2/4 p-2"> <div class="w-2/4 p-2">
<div class="rounded shadow-lg bg-coolgray-200"> <div class="rounded shadow-lg bg-coolgray-200">
<div class="p-2"> <div class="p-2">
<div class="text-sm"> <div class="">
@if (data_get($image, 'is_current')) @if (data_get($image, 'is_current'))
<span class="font-bold text-warning">LIVE</span> <span class="font-bold text-warning">LIVE</span>
| |

View File

@ -18,7 +18,7 @@
</a> </a>
@endif @endif
</div> </div>
<div class="text-sm">Code source of your application.</div> <div class="">Code source of your application.</div>
<x-forms.input placeholder="coollabsio/coolify-example" id="application.git_repository" label="Repository" /> <x-forms.input placeholder="coollabsio/coolify-example" id="application.git_repository" label="Repository" />
<x-forms.input placeholder="main" id="application.git_branch" label="Branch" /> <x-forms.input placeholder="main" id="application.git_branch" label="Branch" />
<div class="flex items-end gap-2 w-96"> <div class="flex items-end gap-2 w-96">
@ -40,7 +40,7 @@
<h4 class="py-2 pt-4">Current Deploy Key: <span <h4 class="py-2 pt-4">Current Deploy Key: <span
class="text-warning">{{ $application->private_key->name }}</span></h4> class="text-warning">{{ $application->private_key->name }}</span></h4>
<div class="py-2 text-sm">Select another Deploy Key</div> <div class="py-2 ">Select another Deploy Key</div>
<div class="flex gap-2"> <div class="flex gap-2">
@foreach ($private_keys as $key) @foreach ($private_keys as $key)
<x-forms.button wire:click.defer="setPrivateKey('{{ $key->id }}')">{{ $key->name }} <x-forms.button wire:click.defer="setPrivateKey('{{ $key->id }}')">{{ $key->name }}

View File

@ -7,7 +7,7 @@
volume volume
name, example: <span class='text-helper'>-pr-1</span>" /> name, example: <span class='text-helper'>-pr-1</span>" />
</div> </div>
<div class="text-sm">Persistent storage to preserve data between deployments.</div> <div class="">Persistent storage to preserve data between deployments.</div>
</div> </div>
<div class="flex flex-col gap-2 py-4"> <div class="flex flex-col gap-2 py-4">
@foreach ($application->persistentStorages as $storage) @foreach ($application->persistentStorages as $storage)

View File

@ -1,12 +1,6 @@
<div x-data="{ deleteEnvironment: false }"> <div x-data="{ deleteEnvironment: false }">
<x-naked-modal show="deleteEnvironment" message='Are you sure you would like to delete this environment?' /> <x-naked-modal show="deleteEnvironment" message='Are you sure you would like to delete this environment?' />
@if ($resource_count > 0) <x-forms.button x-on:click.prevent="deleteEnvironment = true">
<x-forms.button tooltip="First delete all resources." disabled> Delete Environment
Delete Environment </x-forms.button>
</x-forms.button>
@else
<x-forms.button x-on:click.prevent="deleteEnvironment = true">
Delete Environment
</x-forms.button>
@endif
</div> </div>

View File

@ -1,12 +1,6 @@
<div x-data="{ deleteProject: false }"> <div x-data="{ deleteProject: false }">
<x-naked-modal show="deleteProject" message='Are you sure you would like to delete this project?' /> <x-naked-modal show="deleteProject" message='Are you sure you would like to delete this project?' />
@if ($resource_count > 0) <x-forms.button x-on:click.prevent="deleteProject = true">
<x-forms.button disabled="First delete all resources."> Delete Project
Delete Project </x-forms.button>
</x-forms.button>
@else
<x-forms.button x-on:click.prevent="deleteProject = true">
Delete Project
</x-forms.button>
@endif
</div> </div>

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Application</h1> <h1>Create a new Application</h1>
<div class="pt-2 pb-10 text-sm">Deploy any public or private GIT repositories through a Deploy Key.</div> <div class="pt-2 pb-10 ">Deploy any public or private GIT repositories through a Deploy Key.</div>
<h3 class="py-2">Select a Private Key</h3> <h3 class="py-2">Select a Private Key</h3>
@foreach ($private_keys as $key) @foreach ($private_keys as $key)
@if ($private_key_id == $key->id) @if ($private_key_id == $key->id)

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Application</h1> <h1>Create a new Application</h1>
<div class="pb-4 text-sm">Deploy any public or private git repositories through a GitHub App.</div> <div class="pb-4 ">Deploy any public or private git repositories through a GitHub App.</div>
@if ($github_apps->count() > 0) @if ($github_apps->count() > 0)
<form class="flex flex-col" wire:submit.prevent='submit'> <form class="flex flex-col" wire:submit.prevent='submit'>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Application</h1> <h1>Create a new Application</h1>
<div class="pb-4 text-sm">Deploy any public git repositories.</div> <div class="pb-4 ">Deploy any public git repositories.</div>
<form class="flex flex-col gap-2" wire:submit.prevent> <form class="flex flex-col gap-2" wire:submit.prevent>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<div class="flex flex-col"> <div class="flex flex-col">

View File

@ -63,7 +63,7 @@
</div> </div>
@isset($uptime) @isset($uptime)
<h4 class="pb-3">Server Info</h4> <h4 class="pb-3">Server Info</h4>
<div class="text-sm"> <div class="">
<p>Uptime: {{ $uptime }}</p> <p>Uptime: {{ $uptime }}</p>
@isset($dockerVersion) @isset($dockerVersion)
<p>Docker Engine {{ $dockerVersion }}</p> <p>Docker Engine {{ $dockerVersion }}</p>

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Server</h1> <h1>Create a new Server</h1>
<div class="pt-2 pb-10 text-sm">Servers are the main blocks of your infrastructure.</div> <div class="pt-2 pb-10 ">Servers are the main blocks of your infrastructure.</div>
<form class="flex flex-col gap-2" wire:submit.prevent='submit'> <form class="flex flex-col gap-2" wire:submit.prevent='submit'>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="name" label="Name" required /> <x-forms.input id="name" label="Name" required />
@ -22,8 +22,6 @@
@endif @endif
@endforeach @endforeach
</x-forms.select> </x-forms.select>
{{-- <x-forms.checkbox class="pb-8" disabled instantSave noDirty id="is_part_of_swarm"
label="Is it part of a Swarm cluster?" /> --}}
<x-forms.button type="submit"> <x-forms.button type="submit">
Save New Server Save New Server
</x-forms.button> </x-forms.button>

View File

@ -5,15 +5,15 @@
<x-forms.button>Add a new Private Key</x-forms.button> <x-forms.button>Add a new Private Key</x-forms.button>
</a> </a>
</div> </div>
<div class="pt-2 pb-6 text-sm">Selected Private Key for SSH connection</div> <div class="pt-2 pb-6 ">Selected Private Key for SSH connection</div>
<div class="pb-10 text-sm"> <div class="pb-10 ">
@if (data_get($server, 'privateKey.uuid')) @if (data_get($server, 'privateKey.uuid'))
Currently attached Private Key: Currently attached Private Key:
<a href="{{ route('private-key.show', ['private_key_uuid' => data_get($server, 'privateKey.uuid')]) }}"> <a href="{{ route('private-key.show', ['private_key_uuid' => data_get($server, 'privateKey.uuid')]) }}">
<button class="text-white btn-link">{{ data_get($server, 'privateKey.name') }}</button> <button class="text-white btn-link">{{ data_get($server, 'privateKey.name') }}</button>
</a> </a>
@else @else
<div class="text-sm">No private key attached.</div> <div class="">No private key attached.</div>
@endif @endif
</div> </div>
<h3 class="pb-4">Select a different Private Key</h3> <h3 class="pb-4">Select a different Private Key</h3>

View File

@ -18,11 +18,11 @@
@endif @endif
<livewire:server.proxy.status :server="$server" /> <livewire:server.proxy.status :server="$server" />
</div> </div>
<div class="pt-3 pb-4 text-sm">Traefik v2</div> <div class="pt-3 pb-4 ">Traefik v2</div>
@if ( @if (
$server->extra_attributes->proxy_last_applied_settings && $server->extra_attributes->proxy_last_applied_settings &&
$server->extra_attributes->proxy_last_saved_settings !== $server->extra_attributes->proxy_last_applied_settings) $server->extra_attributes->proxy_last_saved_settings !== $server->extra_attributes->proxy_last_applied_settings)
<div class="text-sm text-red-500">Configuration out of sync. Restart to get the new configs. <div class="text-red-500 ">Configuration out of sync. Restart to get the new configs.
</div> </div>
@endif @endif
<div class="container w-full mx-auto"> <div class="container w-full mx-auto">
@ -42,7 +42,7 @@
@else @else
<div> <div>
<h2>Proxy</h2> <h2>Proxy</h2>
<div class="pt-2 pb-10 text-sm">Select a proxy you would like to use on this server.</div> <div class="pt-2 pb-10 ">Select a proxy you would like to use on this server.</div>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.button class="w-32 box" wire:click="setProxy('{{ \App\Enums\ProxyTypes::TRAEFIK_V2 }}')"> <x-forms.button class="w-32 box" wire:click="setProxy('{{ \App\Enums\ProxyTypes::TRAEFIK_V2 }}')">
Traefik Traefik
@ -58,6 +58,6 @@
</div> </div>
@endif @endif
@else @else
<div class="text-sm">Server is not validated. Validate first.</div> <div class="">Server is not validated. Validate first.</div>
@endif @endif
</div> </div>

View File

@ -3,7 +3,7 @@
@if ($server->extra_attributes->proxy_status === 'running') @if ($server->extra_attributes->proxy_status === 'running')
<div class="flex gap-4"> <div class="flex gap-4">
<div class="group"> <div class="group">
<label tabindex="0" class="flex items-center gap-2 text-sm cursor-pointer hover:text-white"> Links <label tabindex="0" class="flex items-center gap-2 cursor-pointer hover:text-white"> Links
<x-chevron-down /> <x-chevron-down />
</label> </label>
<div class="absolute hidden group-hover:block "> <div class="absolute hidden group-hover:block ">
@ -57,7 +57,7 @@ class="relative text-xs text-white normal-case rounded min-w-max menu bg-coolgra
</div> </div>
</div> </div>
@else @else
<button wire:click='deploy' class="flex items-center gap-2 text-sm cursor-pointer hover:text-white"> <svg <button wire:click='deploy' class="flex items-center gap-2 cursor-pointer hover:text-white"> <svg
xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" viewBox="0 0 24 24" stroke-width="1.5" xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" viewBox="0 0 24 24" stroke-width="1.5"
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path stroke="none" d="M0 0h24v24H0z" fill="none" />

View File

@ -6,7 +6,7 @@
Save Save
</x-forms.button> </x-forms.button>
</div> </div>
<div class="pt-2 pb-4 text-sm">SMTP settings for password resets, invitations, etc.</div> <div class="pt-2 pb-4 ">SMTP settings for password resets, invitations, etc.</div>
<div class="flex flex-col"> <div class="flex flex-col">
<x-forms.checkbox instantSave id="settings.extra_attributes.smtp_active" label="Enabled" /> <x-forms.checkbox instantSave id="settings.extra_attributes.smtp_active" label="Enabled" />
</div> </div>

View File

@ -29,7 +29,7 @@
@endif @endif
</div> </div>
</div> </div>
<div class="pt-2 pb-10 text-sm">Your Private GitHub App for private repositories.</div> <div class="pt-2 pb-10 ">Your Private GitHub App for private repositories.</div>
@if ($github_app->app_id) @if ($github_app->app_id)
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="github_app.name" label="App Name" disabled /> <x-forms.input id="github_app.name" label="App Name" disabled />
@ -72,7 +72,7 @@
Application Application
</x-forms.button> </x-forms.button>
</div> </div>
<div class="pt-1 pb-2 text-sm">You need to register a GitHub App before using this source.</div> <div class="pt-1 pb-2 ">You need to register a GitHub App before using this source.</div>
<div class="pt-2 pb-10"> <div class="pt-2 pb-10">
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">
<x-forms.select wire:model='webhook_endpoint' label="Webhook Endpoint" <x-forms.select wire:model='webhook_endpoint' label="Webhook Endpoint"

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Private Keys</h1> <h1>Private Keys</h1>
<div class="pt-2 pb-10 text-sm">All Private Keys</div> <div class="pt-2 pb-10 ">All Private Keys</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($privateKeys as $key) @forelse ($privateKeys as $key)
<a class="text-center hover:no-underline box group" <a class="text-center hover:no-underline box group"

View File

@ -1,5 +1,5 @@
<x-layout> <x-layout>
<h1>Create a new Private Key</h1> <h1>Create a new Private Key</h1>
<div class="pt-2 pb-10 text-sm">Private Keys are used for connection to servers.</div> <div class="pt-2 pb-10 ">Private Keys are used for connection to servers.</div>
<livewire:private-key.create /> <livewire:private-key.create />
</x-layout> </x-layout>

View File

@ -1,10 +1,10 @@
<x-layout> <x-layout>
<h1>Profile</h1> <h1>Profile</h1>
<div class="pt-2 pb-10 text-sm">Your user profile settings.</div> <div class="pt-2 pb-10 ">Your user profile settings.</div>
<livewire:profile.form :request="$request" /> <livewire:profile.form :request="$request" />
<h3 class="py-4">Two-factor Authentication</h3> <h3 class="py-4">Two-factor Authentication</h3>
@if (session('status') == 'two-factor-authentication-enabled') @if (session('status') == 'two-factor-authentication-enabled')
<div class="mb-4 text-sm font-medium"> <div class="mb-4 font-medium">
Please finish configuring two factor authentication below. Read the QR code or enter the secret key Please finish configuring two factor authentication below. Read the QR code or enter the secret key
manually. manually.
</div> </div>
@ -19,17 +19,17 @@
<div x-data="{ showCode: false }" class="py-2"> <div x-data="{ showCode: false }" class="py-2">
<x-forms.button x-on:click="showCode = !showCode">Show secret key to manually enter</x-forms.button> <x-forms.button x-on:click="showCode = !showCode">Show secret key to manually enter</x-forms.button>
<template x-if="showCode"> <template x-if="showCode">
<div class="py-2 text-sm">{!! decrypt($request->user()->two_factor_secret) !!}</div> <div class="py-2 ">{!! decrypt($request->user()->two_factor_secret) !!}</div>
</template> </template>
</div> </div>
</div> </div>
</div> </div>
@elseif(session('status') == 'two-factor-authentication-confirmed') @elseif(session('status') == 'two-factor-authentication-confirmed')
<div class="mb-4 text-sm"> <div class="mb-4 ">
Two factor authentication confirmed and enabled successfully. Two factor authentication confirmed and enabled successfully.
</div> </div>
<div> <div>
<div class="pb-6 text-sm">Here are the recovery codes for your account. Please store them in a secure <div class="pb-6 ">Here are the recovery codes for your account. Please store them in a secure
location.</div> location.</div>
<div class="text-white"> <div class="text-white">
@foreach ($request->user()->recoveryCodes() as $code) @foreach ($request->user()->recoveryCodes() as $code)
@ -39,7 +39,7 @@
</div> </div>
@else @else
@if ($request->user()->two_factor_confirmed_at) @if ($request->user()->two_factor_confirmed_at)
<div class="text-sm"> Two factor authentication is <span class="text-helper">enabled</span>.</div> <div class=""> Two factor authentication is <span class="text-helper">enabled</span>.</div>
<div class="flex gap-2"> <div class="flex gap-2">
<form action="/user/two-factor-authentication" method="POST"> <form action="/user/two-factor-authentication" method="POST">
@csrf @csrf
@ -53,7 +53,7 @@
</div> </div>
@if (session('status') == 'recovery-codes-generated') @if (session('status') == 'recovery-codes-generated')
<div> <div>
<div class="py-6 text-sm">Here are the recovery codes for your account. Please store them in a <div class="py-6 ">Here are the recovery codes for your account. Please store them in a
secure secure
location.</div> location.</div>
<div class="text-white"> <div class="text-white">
@ -64,7 +64,7 @@
</div> </div>
@endif @endif
@else @else
<div class="pb-2 text-sm">Two factor authentication is <span class="text-helper">disabled</span>.</div> <div class="pb-2 ">Two factor authentication is <span class="text-helper">disabled</span>.</div>
<form action="/user/two-factor-authentication" method="POST"> <form action="/user/two-factor-authentication" method="POST">
@csrf @csrf
<x-forms.button type="submit">Configure 2FA</x-forms.button> <x-forms.button type="submit">Configure 2FA</x-forms.button>

View File

@ -1,49 +1,5 @@
<x-layout> <x-layout>
<h1>Configuration</h1> <h1>Configuration</h1>
<nav class="flex pt-2 pb-10">
<ol class="flex items-center">
<li class="inline-flex items-center">
<a class="text-xs truncate lg:text-sm"
href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">
{{ $application->environment->project->name }}</a>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<a class="text-xs truncate lg:text-sm"
href="{{ route('project.resources', ['environment_name' => request()->route('environment_name'), 'project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('environment_name') }}</a>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<span class="text-xs truncate lg:text-sm">{{ data_get($application, 'name') }}</span>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<livewire:project.application.status :application="$application" />
</div>
</li>
</ol>
</nav>
<x-applications.navbar :application="$application" /> <x-applications.navbar :application="$application" />
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'general' }" class="flex h-full pt-6"> <div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'general' }" class="flex h-full pt-6">
<div class="flex flex-col gap-4 min-w-fit"> <div class="flex flex-col gap-4 min-w-fit">

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1 class="py-0">Deployment</h1> <h1 class="py-0">Deployment</h1>
<nav class="flex pt-2 pb-10 text-sm"> <nav class="flex pt-2 pb-10 ">
<ol class="inline-flex items-center"> <ol class="inline-flex items-center">
<li class="inline-flex items-center"> <li class="inline-flex items-center">
<a <a

View File

@ -1,47 +1,5 @@
<x-layout> <x-layout>
<h1>Deployments</h1> <h1>Deployments</h1>
<nav class="flex pt-2 pb-10 text-sm">
<ol class="inline-flex items-center">
<li class="inline-flex items-center">
<a
href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">{{ $application->environment->project->name }}</a>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<a
href="{{ route('project.resources', ['environment_name' => request()->route('environment_name'), 'project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('environment_name') }}</a>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<span>{{ data_get($application, 'name') }}</span>
</div>
</li>
<li>
<div class="flex items-center">
<svg aria-hidden="true" class="w-4 h-4 mx-1 font-bold text-warning" fill="currentColor"
viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path>
</svg>
<livewire:project.application.status :application="$application" />
</div>
</li>
</ol>
</nav>
<x-applications.navbar :application="$application" /> <x-applications.navbar :application="$application" />
<livewire:project.application.deployments :application_id="$application->id" /> <livewire:project.application.deployments :application_id="$application->id" />
</x-layout> </x-layout>

View File

@ -2,14 +2,16 @@
<div class="flex flex-col"> <div class="flex flex-col">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<h1>Resources</h1> <h1>Resources</h1>
<livewire:project.delete-environment :environment_id="$environment->id" :resource_count="$environment->applications->count()" /> @if ($environment->applications->count() === 0)
<livewire:project.delete-environment :environment_id="$environment->id" />
@endif
</div> </div>
<nav class="flex pt-2 pb-10 text-sm"> <nav class="flex pt-2 pb-10">
<ol class="inline-flex items-center"> <ol class="flex items-center">
<li class="inline-flex items-center"> <li class="inline-flex items-center">
<a href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}"> <a class="text-xs truncate lg:text-sm"
{{ $project->name }} href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">
</a> {{ $project->name }}</a>
</li> </li>
<li> <li>
<div class="flex items-center"> <div class="flex items-center">
@ -19,7 +21,8 @@
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
clip-rule="evenodd"></path> clip-rule="evenodd"></path>
</svg> </svg>
{{ request()->route('environment_name') }} <a class="text-xs truncate lg:text-sm"
href="{{ route('project.resources', ['environment_name' => request()->route('environment_name'), 'project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('environment_name') }}</a>
</div> </div>
</li> </li>
</ol> </ol>
@ -28,26 +31,12 @@
@if ($environment->applications->count() === 0) @if ($environment->applications->count() === 0)
<p>No resources found.</p> <p>No resources found.</p>
@endif @endif
<div class="grid lg:grid-cols-2 gap-2"> <div class="grid gap-2 lg:grid-cols-2">
@foreach ($environment->applications->sortBy('name') as $application) @foreach ($environment->applications->sortBy('name') as $application)
<a class="box" <a class="box"
href="{{ route('project.application.configuration', [$project->uuid, $environment->name, $application->uuid]) }}"> href="{{ route('project.application.configuration', [$project->uuid, $environment->name, $application->uuid]) }}">
{{ $application->name }} {{ $application->name }}
</a> </a>
@endforeach @endforeach
{{-- @foreach ($environment->databases as $database)
<p>
<a href="{{ route('project.database', [$project->uuid, $environment->name, $database->uuid]) }}">
{{ $database->name }}
</a>
</p>
@endforeach
@foreach ($environment->services as $service)
<p>
<a href="{{ route('project.service', [$project->uuid, $environment->name, $service->uuid]) }}">
{{ $service->name }}
</a>
</p>
@endforeach --}}
</div> </div>
</x-layout> </x-layout>

View File

@ -1,10 +1,12 @@
<x-layout> <x-layout>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<h1>Environments</h1> <h1>Environments</h1>
<livewire:project.delete-project :project_id="$project->id" :resource_count="$project->applications->count()" /> @if ($project->applications->count() === 0)
<livewire:project.delete-project :project_id="$project->id" />
@endif
</div> </div>
<div class="pt-2 pb-10 text-sm">{{ $project->name }}.</div> <div class="pt-2 pb-10 text-xs truncate lg:text-sm">{{ $project->name }}</div>
<div class="grid lg:grid-cols-2 gap-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($project->environments as $environment) @forelse ($project->environments as $environment)
<a class="box" href="{{ route('project.resources', [$project->uuid, $environment->name]) }}"> <a class="box" href="{{ route('project.resources', [$project->uuid, $environment->name]) }}">
{{ $environment->name }} {{ $environment->name }}

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Projects</h1> <h1>Projects</h1>
<div class="pt-2 pb-10 text-sm">All Projects</div> <div class="pt-2 pb-10 ">All Projects</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($projects as $project) @forelse ($projects as $project)
<a href="{{ route('project.show', ['project_uuid' => data_get($project, 'uuid')]) }}" <a href="{{ route('project.show', ['project_uuid' => data_get($project, 'uuid')]) }}"

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Servers</h1> <h1>Servers</h1>
<div class="pt-2 pb-10 text-sm">All Servers</div> <div class="pt-2 pb-10 ">All Servers</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($servers as $server) @forelse ($servers as $server)
<a class="text-center hover:no-underline box group" <a class="text-center hover:no-underline box group"

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Sources</h1> <h1>Sources</h1>
<div class="pt-2 pb-10 text-sm">All Sources</div> <div class="pt-2 pb-10 ">All Sources</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($sources as $source) @forelse ($sources as $source)
@if ($source->getMorphClass() === 'App\Models\GithubApp') @if ($source->getMorphClass() === 'App\Models\GithubApp')

View File

@ -1,13 +1,13 @@
<x-layout> <x-layout>
<h1>New Source</h1> <h1>New Source</h1>
<div class="pt-2 pb-10 text-sm">Add source providers for your applications.</div> <div class="pt-2 pb-10 ">Add source providers for your applications.</div>
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : '' }"> <div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : '' }">
<div class="flex justify-center h-full gap-2 pb-6"> <div class="flex justify-center h-full gap-2 pb-6">
<a class="flex items-center justify-center w-1/2 p-2 text-sm transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline" <a class="flex items-center justify-center w-1/2 p-2 transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline"
:class="activeTab === 'github' && 'bg-coollabs text-white'" :class="activeTab === 'github' && 'bg-coollabs text-white'"
@click.prevent="activeTab = 'github'; window.location.hash = 'github'" href="#">GitHub @click.prevent="activeTab = 'github'; window.location.hash = 'github'" href="#">GitHub
</a> </a>
<a class="flex items-center justify-center w-1/2 p-2 text-sm transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline" <a class="flex items-center justify-center w-1/2 p-2 transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline"
:class="activeTab === 'gitlab' && 'bg-coollabs text-white'" :class="activeTab === 'gitlab' && 'bg-coollabs text-white'"
@click.prevent="activeTab = 'gitlab'; window.location.hash = 'gitlab'" href="#">GitLab @click.prevent="activeTab = 'gitlab'; window.location.hash = 'gitlab'" href="#">GitLab
</a> </a>

View File

@ -22,7 +22,7 @@
class="relative flex duration-300 transform transition ease-in-out max-w-md w-full pointer-events-auto {{ $position->is('center') ? 'text-center' : 'text-left' }}" class="relative flex duration-300 transform transition ease-in-out max-w-md w-full pointer-events-auto {{ $position->is('center') ? 'text-center' : 'text-left' }}"
:class="toast.select({ error: 'text-white', info: 'text-white', success: 'text-white', warning: 'text-white' })" :class="toast.select({ error: 'text-white', info: 'text-white', success: 'text-white', warning: 'text-white' })"
> >
<i class=" flex items-center gap-2 select-none not-italic pr-6 pl-4 py-3 rounded shadow-lg text-sm w-full {{ $alignment->is('bottom') ? 'mt-3' : 'mb-3' }}" <i class=" flex items-center gap-2 select-none not-italic pr-6 pl-4 py-3 rounded shadow-lg w-full {{ $alignment->is('bottom') ? 'mt-3' : 'mb-3' }}"
:class="toast.select({ :class="toast.select({
error: 'bg-coolgray-300', error: 'bg-coolgray-300',
info: 'bg-coolgray-300', info: 'bg-coolgray-300',

View File

@ -4,7 +4,7 @@
"version": "3.12.31" "version": "3.12.31"
}, },
"v4": { "v4": {
"version": "4.0.0-nightly.16" "version": "4.0.0-nightly.17"
} }
} }
} }