From 33f260a6557ed7ed4b03c1a55eecd7692a4c51b5 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:27:19 +0200 Subject: [PATCH 1/2] fix(deployments): use full-height deployment logs layout Adjust the deployment view container classes so the logs panel fills the available viewport height instead of capping at 30rem. Add a feature test to lock in the full-height layout classes and prevent regressions. --- .../application/deployment/show.blade.php | 15 ++-- tests/Feature/DeploymentLogsLayoutTest.php | 79 +++++++++++++++++++ 2 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 tests/Feature/DeploymentLogsLayoutTest.php diff --git a/resources/views/livewire/project/application/deployment/show.blade.php b/resources/views/livewire/project/application/deployment/show.blade.php index c17cda55f..d6294f3c8 100644 --- a/resources/views/livewire/project/application/deployment/show.blade.php +++ b/resources/views/livewire/project/application/deployment/show.blade.php @@ -1,4 +1,4 @@ -
+
{{ data_get_str($application, 'name')->limit(10) }} > Deployment | Coolify @@ -165,13 +165,13 @@ this.scheduleScroll(); } } - }"> + }" class="flex flex-1 min-h-0 flex-col overflow-hidden"> -
+
+ class="flex min-h-0 flex-col w-full overflow-hidden bg-white dark:text-white dark:bg-coolgray-100 dark:border-coolgray-300" + :class="fullscreen ? 'h-full' : 'flex-1 border border-dotted rounded-sm'">
@@ -328,8 +328,7 @@ class="p-1 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-
+ class="flex min-h-40 flex-1 flex-col overflow-y-auto p-2 px-4 scrollbar">
@@ -363,4 +362,4 @@ class="shrink-0 text-gray-500">{{ $line['timestamp'] }}
-
\ No newline at end of file +
diff --git a/tests/Feature/DeploymentLogsLayoutTest.php b/tests/Feature/DeploymentLogsLayoutTest.php new file mode 100644 index 000000000..a905b8d15 --- /dev/null +++ b/tests/Feature/DeploymentLogsLayoutTest.php @@ -0,0 +1,79 @@ +user = User::factory()->create(); + $this->team = Team::factory()->create(); + $this->team->members()->attach($this->user->id, ['role' => 'owner']); + + InstanceSettings::unguarded(function () { + InstanceSettings::query()->create([ + 'id' => 0, + 'is_registration_enabled' => true, + ]); + }); + + $this->actingAs($this->user); + session(['currentTeam' => $this->team]); + + $this->server = Server::factory()->create(['team_id' => $this->team->id]); + $this->destination = StandaloneDocker::query()->where('server_id', $this->server->id)->firstOrFail(); + $this->project = Project::factory()->create(['team_id' => $this->team->id]); + $this->environment = Environment::factory()->create(['project_id' => $this->project->id]); + $this->application = Application::factory()->create([ + 'environment_id' => $this->environment->id, + 'destination_id' => $this->destination->id, + 'destination_type' => $this->destination->getMorphClass(), + 'status' => 'running', + ]); +}); + +it('renders deployment logs in a full-height layout', function () { + $deployment = ApplicationDeploymentQueue::create([ + 'application_id' => $this->application->id, + 'deployment_uuid' => 'deploy-layout-test', + 'server_id' => $this->server->id, + 'status' => ApplicationDeploymentStatus::FINISHED->value, + 'logs' => json_encode([ + [ + 'command' => null, + 'output' => 'rolling update started', + 'type' => 'stdout', + 'timestamp' => now()->toISOString(), + 'hidden' => false, + 'batch' => 1, + 'order' => 1, + ], + ], JSON_THROW_ON_ERROR), + ]); + + $response = $this->get(route('project.application.deployment.show', [ + 'project_uuid' => $this->project->uuid, + 'environment_uuid' => $this->environment->uuid, + 'application_uuid' => $this->application->uuid, + 'deployment_uuid' => $deployment->deployment_uuid, + ])); + + $response->assertSuccessful(); + $response->assertSee('rolling update started'); + $response->assertSee('flex h-[calc(100vh-10rem)] min-h-40 flex-col overflow-hidden', false); + $response->assertSee('flex flex-1 min-h-0 flex-col overflow-hidden', false); + $response->assertSee('mt-4 flex flex-1 min-h-0 flex-col overflow-hidden', false); + $response->assertSee('flex min-h-0 flex-col w-full overflow-hidden bg-white', false); + $response->assertSee('flex min-h-40 flex-1 flex-col overflow-y-auto p-2 px-4 scrollbar', false); + + expect($response->getContent())->not->toContain('max-h-[30rem]'); +}); From 0d8a95473a89759fc29165674d4fb66df98957b5 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 9 Apr 2026 19:51:31 +0200 Subject: [PATCH 2/2] fix(ui): improve responsive project headings and controls Refine mobile layout for project resource pages by making breadcrumbs and status blocks responsive, improving dropdown and checkbox touch behavior, and adding support for custom modal triggers. Add feature tests covering breadcrumb visibility and responsive checkbox layout. --- resources/css/utilities.css | 4 + resources/views/components/dropdown.blade.php | 49 +++- .../views/components/forms/checkbox.blade.php | 12 +- .../components/modal-confirmation.blade.php | 6 +- .../resources/breadcrumbs.blade.php | 63 ++-- .../views/components/status/index.blade.php | 66 ++--- .../components/status/services.blade.php | 56 ++-- .../livewire/notifications/email.blade.php | 2 +- .../livewire/notifications/telegram.blade.php | 28 +- .../project/application/general.blade.php | 10 +- .../project/application/heading.blade.php | 227 +++++++++------ .../project/database/heading.blade.php | 148 ++++++---- .../project/service/file-storage.blade.php | 8 +- .../project/service/heading.blade.php | 272 +++++++++++------- .../livewire/project/service/index.blade.php | 2 +- .../project/service/stack-form.blade.php | 4 +- .../project/shared/storages/show.blade.php | 4 +- .../views/livewire/server/proxy.blade.php | 2 +- .../views/livewire/server/sentinel.blade.php | 2 +- .../views/livewire/server/show.blade.php | 2 +- .../livewire/source/github/change.blade.php | 2 +- tests/Feature/BreadcrumbsVisibilityTest.php | 71 +++++ .../Feature/ResponsiveCheckboxLayoutTest.php | 113 ++++++++ 23 files changed, 791 insertions(+), 362 deletions(-) create mode 100644 tests/Feature/BreadcrumbsVisibilityTest.php create mode 100644 tests/Feature/ResponsiveCheckboxLayoutTest.php diff --git a/resources/css/utilities.css b/resources/css/utilities.css index 02be0c0c4..a8e807041 100644 --- a/resources/css/utilities.css +++ b/resources/css/utilities.css @@ -145,6 +145,10 @@ @utility dropdown-item { @apply flex relative gap-2 justify-start items-center py-1 pr-4 pl-2 w-full text-xs transition-colors cursor-pointer select-none dark:text-white hover:bg-neutral-100 dark:hover:bg-coollabs outline-none data-disabled:pointer-events-none data-disabled:opacity-50 focus-visible:bg-neutral-100 dark:focus-visible:bg-coollabs; } +@utility dropdown-item-touch { + @apply min-h-10 px-3 py-2 text-sm; +} + @utility dropdown-item-no-padding { @apply flex relative gap-2 justify-start items-center py-1 w-full text-xs transition-colors cursor-pointer select-none dark:text-white hover:bg-neutral-100 dark:hover:bg-coollabs outline-none data-disabled:pointer-events-none data-disabled:opacity-50 focus-visible:bg-neutral-100 dark:focus-visible:bg-coollabs; } diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php index 666b93dbc..2bb917f79 100644 --- a/resources/views/components/dropdown.blade.php +++ b/resources/views/components/dropdown.blade.php @@ -1,7 +1,44 @@
- -
+ :style="panelStyles" class="absolute top-full z-50 mt-1 min-w-max max-w-[calc(100vw-1rem)] md:top-0 md:mt-6" x-cloak>
+ class="border border-neutral-300 bg-white p-1 shadow-sm dark:border-coolgray-300 dark:bg-coolgray-200"> {{ $slot }}
diff --git a/resources/views/components/forms/checkbox.blade.php b/resources/views/components/forms/checkbox.blade.php index b291759a8..29717b9b8 100644 --- a/resources/views/components/forms/checkbox.blade.php +++ b/resources/views/components/forms/checkbox.blade.php @@ -11,12 +11,12 @@ ])
$fullWidth, 'dark:hover:bg-coolgray-100 cursor-pointer' => !$disabled, ])> -
@if (!isCloud()) -
+
diff --git a/resources/views/livewire/notifications/telegram.blade.php b/resources/views/livewire/notifications/telegram.blade.php index 1c83caf70..f87a13c37 100644 --- a/resources/views/livewire/notifications/telegram.blade.php +++ b/resources/views/livewire/notifications/telegram.blade.php @@ -41,7 +41,7 @@

Deployments

-
+
@@ -49,7 +49,7 @@ id="telegramNotificationsDeploymentSuccessThreadId" />
-
+
@@ -57,7 +57,7 @@ id="telegramNotificationsDeploymentFailureThreadId" />
-
+
@@ -71,7 +71,7 @@

Backups

-
+
@@ -80,7 +80,7 @@
-
+
@@ -94,7 +94,7 @@

Scheduled Tasks

-
+
@@ -103,7 +103,7 @@
-
+
@@ -117,7 +117,7 @@

Server

-
+
@@ -126,7 +126,7 @@
-
+
@@ -135,7 +135,7 @@
-
+
@@ -144,7 +144,7 @@
-
+
@@ -153,7 +153,7 @@
-
+
@@ -162,7 +162,7 @@
-
+
@@ -171,7 +171,7 @@
-
+
diff --git a/resources/views/livewire/project/application/general.blade.php b/resources/views/livewire/project/application/general.blade.php index d743e346e..caf105dbf 100644 --- a/resources/views/livewire/project/application/general.blade.php +++ b/resources/views/livewire/project/application/general.blade.php @@ -276,7 +276,7 @@ class="underline" href="https://coolify.io/docs/knowledge-base/docker/registry" helper="It is calculated together with the Base Directory:
{{ Str::start($baseDirectory . $dockerComposeLocation, '/') }}" x-model="composeLocation" @blur="normalizeComposeLocation()" />
-
+
@if ($buildPack !== 'dockercompose') -
+
@endif -
+
HTTP Basic Authentication
-
+
@@ -543,7 +543,7 @@ class="flex items-start gap-2 p-4 mb-4 text-sm rounded-lg bg-blue-50 dark:bg-blu @endif -
+