ui: redesign

This commit is contained in:
Andras Bacsai
2024-03-19 15:37:16 +01:00
parent 42715bba50
commit 91950e1891
40 changed files with 481 additions and 436 deletions

View File

@@ -4,7 +4,7 @@
<h2>Advanced</h2>
</div>
<div>Advanced configuration for your application.</div>
<div class="flex flex-col pt-4 w-96">
<div class="flex flex-col gap-2 pt-4 w-96">
<h3>General</h3>
@if ($application->git_based())
<x-forms.checkbox helper="Automatically deploy new commits based on Git webhooks." instantSave
@@ -42,7 +42,9 @@
<x-forms.checkbox disabled instantSave id="is_custom_ssl" label="Is Custom SSL?" />
<x-forms.checkbox disabled instantSave id="is_http2" label="Is Http2?" /> --}}
</div>
<h3>GPU</h3>
@if ($application->build_pack !== 'dockercompose')
<h3>GPU</h3>
@endif
<form wire:submit="submit">
@if ($application->build_pack !== 'dockercompose')
<div class="w-96">

View File

@@ -3,31 +3,31 @@
<livewire:project.application.heading :application="$application" />
<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 xl:w-48">
<a :class="activeTab === 'general' && 'text-white'"
<a :class="activeTab === 'general' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'general'; window.location.hash = 'general'" href="#">General</a>
@if ($application->destination->server->isSwarm())
<a :class="activeTab === 'swarm' && 'text-white'"
<a :class="activeTab === 'swarm' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'swarm'; window.location.hash = 'swarm'" href="#">Swarm
Configuration</a>
@endif
<a :class="activeTab === 'advanced' && 'text-white'"
<a :class="activeTab === 'advanced' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'advanced'; window.location.hash = 'advanced'" href="#">Advanced</a>
@if ($application->build_pack !== 'static')
<a :class="activeTab === 'environment-variables' && 'text-white'"
<a :class="activeTab === 'environment-variables' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'environment-variables'; window.location.hash = 'environment-variables'"
href="#">Environment
Variables</a>
@endif
@if ($application->build_pack !== 'static' && $application->build_pack !== 'dockercompose')
<a :class="activeTab === 'storages' && 'text-white'"
<a :class="activeTab === 'storages' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'storages'; window.location.hash = 'storages'" href="#">Storages
</a>
@endif
@if ($application->git_based())
<a :class="activeTab === 'source' && 'text-white'"
<a :class="activeTab === 'source' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'source'; window.location.hash = 'source'" href="#">Source</a>
@endif
<a :class="activeTab === 'servers' && 'text-white'" class="flex items-center gap-2"
<a :class="activeTab === 'servers' && 'dark:text-white text-black'" class="flex items-center gap-2"
@click.prevent="activeTab = 'servers'; window.location.hash = 'servers'" href="#">Servers
@if (str($application->status)->contains('degraded'))
<span title="Some servers are unavailable">
@@ -38,42 +38,42 @@
</span>
@endif
</a>
<a :class="activeTab === 'scheduled-tasks' && 'text-white'"
<a :class="activeTab === 'scheduled-tasks' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'scheduled-tasks'; window.location.hash = 'scheduled-tasks'"
href="#">Scheduled Tasks
</a>
<a :class="activeTab === 'webhooks' && 'text-white'"
<a :class="activeTab === 'webhooks' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'webhooks'; window.location.hash = 'webhooks'" href="#">Webhooks
</a>
@if ($application->git_based())
<a :class="activeTab === 'previews' && 'text-white'"
<a :class="activeTab === 'previews' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'previews'; window.location.hash = 'previews'" href="#">Preview
Deployments
</a>
@endif
@if ($application->build_pack !== 'static' && $application->build_pack !== 'dockercompose')
<a :class="activeTab === 'health' && 'text-white'"
<a :class="activeTab === 'health' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'health'; window.location.hash = 'health'" href="#">Healthchecks
</a>
@endif
<a :class="activeTab === 'rollback' && 'text-white'"
<a :class="activeTab === 'rollback' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'rollback'; window.location.hash = 'rollback'" href="#">Rollback
</a>
@if ($application->build_pack !== 'dockercompose')
<a :class="activeTab === 'resource-limits' && 'text-white'"
<a :class="activeTab === 'resource-limits' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'resource-limits'; window.location.hash = 'resource-limits'"
href="#">Resource Limits
</a>
@endif
<a :class="activeTab === 'resource-operations' && 'text-white'"
<a :class="activeTab === 'resource-operations' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'resource-operations'; window.location.hash = 'resource-operations'"
href="#">Resource Operations
</a>
<a :class="activeTab === 'tags' && 'text-white'"
<a :class="activeTab === 'tags' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'tags'; window.location.hash = 'tags'" href="#">Tags
</a>
<a :class="activeTab === 'danger' && 'text-white'"
<a :class="activeTab === 'danger' && 'dark:text-white text-black'"
@click.prevent="activeTab = 'danger'; window.location.hash = 'danger'" href="#">Danger Zone
</a>
</div>

View File

@@ -51,6 +51,7 @@
helper="WARNING: Advanced use cases only. Your docker compose file will be deployed as-is. Nothing is modified by Coolify. You need to configure the proxy parts. More info in the <a href='https://coolify.io/docs/docker/compose#raw-docker-compose-deployment'>documentation.</a>" />
</div>
@if (count($parsedServices) > 0 && !$application->settings->is_raw_compose_deployment_enabled)
<h3>Domains</h3>
@foreach (data_get($parsedServices, 'services') as $serviceName => $service)
@if (!isDatabaseImage(data_get($service, 'image')))
<div class="flex items-end gap-2">

View File

@@ -20,7 +20,7 @@
<livewire:project.shared.environment-variable.add />
</x-slot:content>
<button @click="slideOverOpen=true"
class="font-normal text-white normal-case border-none rounded btn btn-primary btn-sm no-animation">+
class="button">+
Add</button>
</x-slide-over>
</div>

View File

@@ -50,7 +50,7 @@
<livewire:project.shared.environment-variable.add />
</x-slot:content>
<button @click="slideOverOpen=true"
class="font-normal text-white normal-case border-none rounded btn btn-primary btn-sm no-animation">+
class="button">+
Add</button>
</x-slide-over>
</div>

View File

@@ -1,12 +1,11 @@
<div>
<div class="flex gap-2">
<h1>Projects</span></h1>
<h1>Projects</h1>
@if ($servers > 0)
<x-forms.button class="btn" onclick="newEmptyProject.showModal()">+ Add</x-forms.button>
<x-forms.button onclick="newEmptyProject.showModal()">+ Add</x-forms.button>
<livewire:project.add-empty />
@endif
</div>
<div class="subtitle ">All Projects</div>
<div class="grid gap-2 lg:grid-cols-2">
@if ($servers === 0)
<div>
@@ -17,14 +16,14 @@
@forelse ($projects as $project)
<div class="gap-2 border border-transparent cursor-pointer box group" x-data
x-on:click="goto('{{ $project->uuid }}')">
<a class="flex flex-col flex-1 mx-6 hover:no-underline"
<a class="flex flex-col flex-1 mx-6 hover:no-underline"
href="{{ route('project.show', ['project_uuid' => data_get($project, 'uuid')]) }}">
<div class="font-bold text-white">{{ $project->name }}</div>
<div class="description ">
{{ $project->description }}</div>
</a>
<div class="flex items-center">
<a class="mx-4 rounded group-hover:text-white"
<a class="mx-4 rounded group-hover:text-white"
href="{{ route('project.edit', ['project_uuid' => data_get($project, 'uuid')]) }}">
<svg xmlns="http://www.w3.org/2000/svg" class="icon hover:text-warning" viewBox="0 0 24 24"
stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round"

View File

@@ -54,16 +54,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -87,16 +87,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -119,16 +119,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -151,16 +151,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -183,16 +183,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -215,16 +215,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>
@@ -247,16 +247,16 @@
<div class="flex gap-2">
<div class="pb-2 font-bold text-white" x-text="item.name"></div>
<template x-if="item.status.startsWith('running')">
<div title="running" class="mt-1 bg-success badge badge-xs"></div>
<div title="running" class="mt-1 bg-success badge "></div>
</template>
<template x-if="item.status.startsWith('exited')">
<div title="exited" class="mt-1 bg-error badge badge-xs"></div>
<div title="exited" class="mt-1 bg-error badge "></div>
</template>
<template x-if="item.status.startsWith('restarting')">
<div title="restarting" class="mt-1 bg-warningbadge badge-xs"></div>
<div title="restarting" class="mt-1 bg-warningbadge "></div>
</template>
<template x-if="item.status.startsWith('degraded')">
<div title="degraded" class="mt-1 bg-warning badge badge-xs"></div>
<div title="degraded" class="mt-1 bg-warning badge "></div>
</template>
</div>
<div class="max-w-full truncate description" x-text="item.description"></div>

View File

@@ -6,10 +6,10 @@
<div class="relative flex flex-col text-white cursor-default box-without-bg bg-coolgray-100 w-96">
<div class="text-xl font-bold">Primary Server</div>
@if (str($resource->realStatus())->startsWith('running'))
<div title="{{ $resource->realStatus() }}" class="absolute bg-success -top-1 -left-1 badge badge-xs">
<div title="{{ $resource->realStatus() }}" class="absolute bg-success -top-1 -left-1 badge ">
</div>
@elseif (str($resource->realStatus())->startsWith('exited'))
<div title="{{ $resource->realStatus() }}" class="absolute bg-error -top-1 -left-1 badge badge-xs">
<div title="{{ $resource->realStatus() }}" class="absolute bg-error -top-1 -left-1 badge ">
</div>
@endif
<div>
@@ -34,10 +34,10 @@
<div class="relative flex flex-col box w-96">
@if (str(data_get($destination, 'pivot.status'))->startsWith('running'))
<div title="{{ data_get($destination, 'pivot.status') }}"
class="absolute bg-success -top-1 -left-1 badge badge-xs"></div>
class="absolute bg-success -top-1 -left-1 badge "></div>
@elseif (str(data_get($destination, 'pivot.status'))->startsWith('exited'))
<div title="{{ data_get($destination, 'pivot.status') }}"
class="absolute bg-error -top-1 -left-1 badge badge-xs"></div>
class="absolute bg-error -top-1 -left-1 badge "></div>
@endif
<div>
Server: {{ data_get($destination, 'server.name') }}

View File

@@ -8,8 +8,7 @@
<x-slot:content>
<livewire:project.shared.environment-variable.add />
</x-slot:content>
<button @click="slideOverOpen=true"
class="font-normal text-white normal-case border-none rounded btn btn-primary btn-sm no-animation">+ Add</button>
<button @click="slideOverOpen=true" class="button">+ Add</button>
</x-slide-over>
@endif
<x-forms.button

View File

@@ -1,15 +1,10 @@
<dialog id="newTask" class="modal">
<form method="dialog" class="flex flex-col gap-2 rounded modal-box" wire:submit='submit'>
<h3 class="text-lg font-bold">Add Scheduled Task</h3>
<x-forms.input placeholder="Run cron" id="name" label="Name" required />
<x-forms.input placeholder="php artisan schedule:run" id="command" label="Command" required />
<x-forms.input placeholder="0 0 * * * or daily" id="frequency" label="Frequency" required />
<x-forms.input placeholder="php" id="container" helper="You can leave it empty if your resource only have one container." label="Container name" />
<x-forms.button onclick="newTask.close()" type="submit">
Save
</x-forms.button>
</form>
<form method="dialog" class="modal-backdrop">
<button>close</button>
</form>
</dialog>
<form class="flex flex-col gap-2 rounded" wire:submit='submit'>
<x-forms.input placeholder="Run cron" id="name" label="Name" />
<x-forms.input placeholder="php artisan schedule:run" id="command" label="Command" />
<x-forms.input placeholder="0 0 * * * or daily" id="frequency" label="Frequency" />
<x-forms.input placeholder="php" id="container"
helper="You can leave it empty if your resource only have one container." label="Container name" />
<x-forms.button @click="slideOverOpen=false" type="submit">
Save
</x-forms.button>
</form>

View File

@@ -1,11 +1,15 @@
<div>
<div class="flex gap-2">
<h2 class="pb-4">Scheduled Tasks</h2>
<x-forms.button class="btn" onclick="newTask.showModal()">+ Add</x-forms.button>
<livewire:project.shared.scheduled-task.add />
<h2>Scheduled Tasks</h2>
<x-slide-over>
<x-slot:title>New Scheduled Task</x-slot:title>
<x-slot:content>
<livewire:project.shared.scheduled-task.add />
</x-slot:content>
<button @click="slideOverOpen=true" class="button">+ Add</button>
</x-slide-over>
</div>
<div class="flex flex-wrap gap-2">
<div class="flex flex-wrap gap-2 pt-4">
@forelse($resource->scheduled_tasks as $task)
<a class="flex flex-col box"
@if ($resource->type() == 'application')