feat(project): add icons and improve persistent volume management

Add project icon storage and serving with local/S3 support, prevent deletion of compose-managed volumes, and optimize volume backups. Refine project and backup UI components with consistent styling and coverage.
This commit is contained in:
Andras Bacsai
2026-08-13 22:56:52 +02:00
parent a02d02d19b
commit fd5eb3e0cd
43 changed files with 728 additions and 60 deletions
+39 -1
View File
@@ -38,6 +38,7 @@ it('renders the changelog modal above the desktop sidebar toggle', function () {
$component = Livewire::test(SettingsDropdown::class, ['trigger' => 'changelog-sidebar'])
->call('openWhatsNewModal')
->assertNotDispatched('whats-new-opened')
->assertSee("What's new", false)
->assertSee('Test Release')
->assertSee('Mark read')
@@ -47,5 +48,42 @@ it('renders the changelog modal above the desktop sidebar toggle', function () {
// Single-release layout: no nested card chrome / unread left accent bar
expect($component->html())
->not->toContain('dark:bg-raised')
->not->toContain('w-0.5 bg-accent');
->not->toContain('w-0.5 bg-accent')
->toContain('absolute right-2 top-2');
});
it('keeps the account menu mounted while the changelog modal opens', function () {
$dropdownView = file_get_contents(resource_path('views/livewire/settings-dropdown.blade.php'));
$accountMenuView = file_get_contents(resource_path('views/components/top-user-menu.blade.php'));
expect($dropdownView)
->not->toContain('wire:click="openWhatsNewModal" @click="open = false"')
->and($accountMenuView)
->not->toContain('@whats-new-opened.window="open = false"');
});
it('opens the changelog modal when there are no entries', function () {
$user = new User(['email' => 'test@example.com']);
$user->id = 1;
Auth::setUser($user);
app()->instance(ChangelogService::class, new class extends ChangelogService
{
public function getEntriesForUser(User $user): Collection
{
return collect();
}
public function getUnreadCountForUser(User $user): int
{
return 0;
}
});
Livewire::test(SettingsDropdown::class, ['trigger' => 'account-menu'])
->call('openWhatsNewModal')
->assertSet('showWhatsNewModal', true)
->assertSee("What's new", false)
->assertSee('No updates found');
});