From 0312cc8ffbe41a94de925a3fcf0fad5c4cb61567 Mon Sep 17 00:00:00 2001
From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Date: Wed, 5 Aug 2026 14:07:19 +0200
Subject: [PATCH] feat(ui): polish email modal, search loading, and volume
tables
Move profile email change into a modal with Alpine focus/close handling,
show a loading overlay during command-palette navigation, and adjust
volumes/config-diff grids plus related service/storage UI. Cover with
feature tests for search, profile, storage, and domains.
---
app/Livewire/Profile/Index.php | 7 +-
resources/css/app.css | 19 ++--
.../deployment/configuration-diff.blade.php | 4 +-
.../views/livewire/global-search.blade.php | 39 +++++--
.../views/livewire/profile/index.blade.php | 100 ++++++++++--------
.../application/backup/index.blade.php | 2 +-
.../project/service/configuration.blade.php | 24 +++++
.../service/partials/domain-table.blade.php | 3 -
.../project/service/storage.blade.php | 2 +-
.../shared/configuration-checker.blade.php | 2 +-
.../project/shared/storages/all.blade.php | 57 +++++-----
tests/Feature/BackupSearchTest.php | 1 +
.../Feature/GlobalSearchLoadingStateTest.php | 14 +++
.../PasswordVisibilityComponentTest.php | 6 ++
.../PersistentStoragePerformanceTest.php | 4 +-
.../PersistentStorageVolumesLayoutTest.php | 19 +++-
.../ProfileAppearanceNavigationTest.php | 16 +++
tests/Feature/ServiceDomainsTest.php | 26 ++++-
18 files changed, 236 insertions(+), 109 deletions(-)
create mode 100644 tests/Feature/GlobalSearchLoadingStateTest.php
diff --git a/app/Livewire/Profile/Index.php b/app/Livewire/Profile/Index.php
index 4a419a12f..970593663 100644
--- a/app/Livewire/Profile/Index.php
+++ b/app/Livewire/Profile/Index.php
@@ -167,6 +167,7 @@ class Index extends Component
$this->show_verification = false;
$this->dispatch('success', 'Email address updated successfully.');
+ $this->dispatch('close-email-change-modal');
} else {
$this->dispatch('error', 'Failed to update email address.');
}
@@ -231,12 +232,6 @@ class Index extends Component
$this->dispatch('success', 'Email change request cancelled.');
}
- public function showEmailChangeForm()
- {
- $this->show_email_change = true;
- $this->new_email = '';
- }
-
public function resetPassword()
{
try {
diff --git a/resources/css/app.css b/resources/css/app.css
index d57223cd2..c7fd6c085 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -1881,17 +1881,17 @@ input[type="search"]::-webkit-search-results-decoration {
grid-template-columns: minmax(10rem, 1.7fr) 6rem minmax(7rem, 0.8fr) 7.5rem minmax(8rem, 1fr) 5rem;
}
-/* Persistent storage volumes: Name | Source | Destination | [PR suffix] | [Actions] */
+/* Persistent storage volumes: Name | Source | Destination | [PR suffix] | Backup | [Actions] */
.volumes-table-grid-readonly {
- grid-template-columns: minmax(12rem, 1.5fr) minmax(8rem, 1fr) minmax(8rem, 1fr);
+ grid-template-columns: minmax(12rem, 1.5fr) minmax(8rem, 1fr) minmax(8rem, 1fr) 5rem;
}
.volumes-table-grid {
- grid-template-columns: minmax(10rem, 1.4fr) minmax(6rem, 1fr) minmax(6rem, 1fr) minmax(10.5rem, auto);
+ grid-template-columns: minmax(10rem, 1.4fr) minmax(6rem, 1fr) minmax(6rem, 1fr) 5rem 17.5rem;
}
.volumes-table-grid-with-pr {
- grid-template-columns: minmax(9rem, 1.2fr) minmax(5.5rem, 0.85fr) minmax(5.5rem, 0.85fr) 9.25rem minmax(10.5rem, auto);
+ grid-template-columns: minmax(9rem, 1.2fr) minmax(5.5rem, 0.85fr) minmax(5.5rem, 0.85fr) 9.25rem 5rem 17.5rem;
}
.volumes-mobile-label {
@@ -1927,7 +1927,7 @@ input[type="search"]::-webkit-search-results-decoration {
@media (max-width: 1100px) {
.volumes-table-grid {
- grid-template-columns: minmax(9rem, 1.2fr) minmax(6rem, 1fr) minmax(9rem, auto);
+ grid-template-columns: minmax(9rem, 1.2fr) minmax(6rem, 1fr) 5rem 17.5rem;
}
.volumes-table-grid > .volumes-col-source,
@@ -1936,7 +1936,7 @@ input[type="search"]::-webkit-search-results-decoration {
}
.volumes-table-grid-with-pr {
- grid-template-columns: minmax(9rem, 1.1fr) minmax(6rem, 1fr) 8.5rem minmax(9rem, auto);
+ grid-template-columns: minmax(9rem, 1.1fr) minmax(6rem, 1fr) 8.5rem 5rem 17.5rem;
}
.volumes-table-grid-with-pr > .volumes-col-source,
@@ -1945,7 +1945,7 @@ input[type="search"]::-webkit-search-results-decoration {
}
.volumes-table-grid-readonly {
- grid-template-columns: minmax(10rem, 1.4fr) minmax(8rem, 1fr);
+ grid-template-columns: minmax(10rem, 1.4fr) minmax(8rem, 1fr) 5rem;
}
.volumes-table-grid-readonly > .volumes-col-source,
@@ -2001,6 +2001,7 @@ input[type="search"]::-webkit-search-results-decoration {
}
.volumes-cell-name,
+ .volumes-col-backup,
.volumes-cell-dest,
.volumes-cell-actions {
display: flex;
@@ -2010,6 +2011,10 @@ input[type="search"]::-webkit-search-results-decoration {
width: 100%;
}
+ .volumes-col-backup {
+ align-items: flex-start;
+ }
+
.volumes-cell-actions {
flex-direction: row;
flex-wrap: wrap;
diff --git a/resources/views/components/deployment/configuration-diff.blade.php b/resources/views/components/deployment/configuration-diff.blade.php
index 53edf455c..7916b8448 100644
--- a/resources/views/components/deployment/configuration-diff.blade.php
+++ b/resources/views/components/deployment/configuration-diff.blade.php
@@ -19,7 +19,7 @@
+ class="grid grid-cols-[minmax(10rem,0.8fr)_minmax(14rem,1fr)_1.5rem_minmax(14rem,1fr)_1.75rem] items-center gap-3 bg-neutral-100 px-3 py-2 text-[11px] font-medium text-neutral-500 dark:bg-white/[0.04] dark:text-fg-faint">
Field
Current
@@ -42,7 +42,7 @@
@endphp
+ class="grid grid-cols-[minmax(10rem,0.8fr)_minmax(14rem,1fr)_1.5rem_minmax(14rem,1fr)_1.75rem] items-start gap-3 px-3 py-2.5 text-sm transition-colors hover:bg-neutral-50 dark:hover:bg-white/[0.025]">
@if ($rowExpandable)
{
+ this.isPaletteTransitioning = false;
+ });
+ },
navigateResults(direction) {
const results = document.querySelectorAll('.search-result-item');
if (results.length === 0) return;
@@ -162,7 +170,7 @@
});
if (matchingItem && typeof $wire !== 'undefined' && $wire) {
- $wire.navigateToResource(matchingItem.type);
+ this.runPaletteTransition(() => $wire.navigateToResource(matchingItem.type));
}
}
});
@@ -313,14 +321,21 @@
-
+
+
+
+
@if ($isSelectingResource)
-
+
+
@if ($selectedServerId === null)
-
@@ -367,7 +382,7 @@
@if ($selectedServerId !== null && $selectedDestinationUuid === null)
-
@@ -415,7 +430,7 @@
@if ($selectedDestinationUuid !== null && $selectedProjectUuid === null)
-
@@ -463,7 +478,7 @@
@if ($selectedProjectUuid !== null && $selectedEnvironmentUuid === null)
-
@@ -509,6 +524,12 @@
@endif
@endif
+
+
+
+
@elseif ($isCreateMode && count($this->filteredCreatableItems) > 0 && !$autoOpenResource)
@@ -569,7 +590,7 @@
{{ $category }}
@foreach ($items as $item)
-