From 60c8f44c7ecbbe3f750a98854f2688cb9ed06e4e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 21:37:39 +0000
Subject: [PATCH 1/4] Initial plan
From 010696b91a061328c08aebaf3866f7097729ece9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 21:46:41 +0000
Subject: [PATCH 2/4] Add bucket selection functionality with hover and active
styling
Co-authored-by: munezaclovis <51137458+munezaclovis@users.noreply.github.com>
---
app/Livewire/Buckets.php | 13 +++++++++++++
resources/views/livewire/buckets.blade.php | 20 +++++++++++++++++++-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/app/Livewire/Buckets.php b/app/Livewire/Buckets.php
index 19f1614..5e5f47b 100644
--- a/app/Livewire/Buckets.php
+++ b/app/Livewire/Buckets.php
@@ -33,12 +33,25 @@ public function buckets()
return Bucket::forCredential($credential, $activeRegion)->all();
}
+ #[Computed]
+ public function activeBucket()
+ {
+ return Settings::get('active-bucket');
+ }
+
#[On('region-switched')]
public function refreshBuckets(): void
{
unset($this->buckets);
}
+ public function selectBucket(string $bucketName): void
+ {
+ Settings::set('active-bucket', $bucketName);
+
+ $this->dispatch('bucket-selected', bucketName: $bucketName);
+ }
+
public function placeholder()
{
return <<<'HTML'
diff --git a/resources/views/livewire/buckets.blade.php b/resources/views/livewire/buckets.blade.php
index ef2234d..8190fae 100644
--- a/resources/views/livewire/buckets.blade.php
+++ b/resources/views/livewire/buckets.blade.php
@@ -1,7 +1,25 @@
@forelse ($this->buckets as $bucket)
- -
+
- activeBucket === $bucket['name'], 'data-active') }}
+ role="button"
+ wire:click="selectBucket('{{ $bucket['name'] }}')"
+ class="hover:bg-accent data-active:bg-accent flex cursor-pointer items-center justify-between rounded-md p-2 transition-colors">
{{ $bucket['name'] }}
+
+ @if ($this->activeBucket === $bucket['name'])
+
+ @endif
@if (! $loop->last)
From 8bbc648a7ea678b823b03d59d3a6cc4a4a2888f1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 21:48:29 +0000
Subject: [PATCH 3/4] Add comprehensive tests for bucket selection
functionality
Co-authored-by: munezaclovis <51137458+munezaclovis@users.noreply.github.com>
---
tests/Feature/Livewire/BucketsTest.php | 95 ++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
create mode 100644 tests/Feature/Livewire/BucketsTest.php
diff --git a/tests/Feature/Livewire/BucketsTest.php b/tests/Feature/Livewire/BucketsTest.php
new file mode 100644
index 0000000..a3994af
--- /dev/null
+++ b/tests/Feature/Livewire/BucketsTest.php
@@ -0,0 +1,95 @@
+assertStatus(200);
+ });
+
+ it('displays empty state when no buckets are available', function () {
+ Livewire::test(Buckets::class)
+ ->assertSee('No S3 buckets found.');
+ });
+
+ it('can select a bucket', function () {
+ $bucketName = 'test-bucket';
+
+ Livewire::test(Buckets::class)
+ ->call('selectBucket', $bucketName)
+ ->assertDispatched('bucket-selected', bucketName: $bucketName);
+
+ expect(Settings::get('active-bucket'))->toBe($bucketName);
+ });
+
+ it('stores selected bucket in settings', function () {
+ $bucketName = 'my-s3-bucket';
+
+ Livewire::test(Buckets::class)
+ ->call('selectBucket', $bucketName);
+
+ expect(Settings::get('active-bucket'))->toBe($bucketName);
+ });
+
+ it('dispatches bucket-selected event when a bucket is selected', function () {
+ $bucketName = 'production-bucket';
+
+ Livewire::test(Buckets::class)
+ ->call('selectBucket', $bucketName)
+ ->assertDispatched('bucket-selected', bucketName: $bucketName);
+ });
+
+ it('returns null for active bucket when none is selected', function () {
+ Livewire::test(Buckets::class)
+ ->assertSet('activeBucket', null);
+ });
+
+ it('returns active bucket from settings', function () {
+ $bucketName = 'stored-bucket';
+ Settings::set('active-bucket', $bucketName);
+
+ Livewire::test(Buckets::class)
+ ->assertSet('activeBucket', $bucketName);
+ });
+
+ it('refreshes buckets when region is switched', function () {
+ $credential = Credential::factory()->create();
+ Settings::set('active-account', $credential->id);
+
+ $component = Livewire::test(Buckets::class);
+
+ // Trigger the event
+ $component->dispatch('region-switched');
+
+ // Component should still render successfully after refresh
+ $component->assertStatus(200);
+ });
+
+ it('returns empty collection when no credential is set', function () {
+ Settings::forget('active-account');
+
+ $component = Livewire::test(Buckets::class);
+
+ expect($component->get('buckets'))->toBeEmpty();
+ });
+
+ it('returns empty collection when credential does not exist', function () {
+ Settings::set('active-account', 'non-existent-id');
+
+ $component = Livewire::test(Buckets::class);
+
+ expect($component->get('buckets'))->toBeEmpty();
+ });
+});
From 8106ae5f08ee2d669e5e8c96a34993ffb02f34d8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 5 Nov 2025 21:51:57 +0000
Subject: [PATCH 4/4] Fix XSS vulnerability and add wire:key for better
performance
Co-authored-by: munezaclovis <51137458+munezaclovis@users.noreply.github.com>
---
resources/views/livewire/buckets.blade.php | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/resources/views/livewire/buckets.blade.php b/resources/views/livewire/buckets.blade.php
index 8190fae..0046a6b 100644
--- a/resources/views/livewire/buckets.blade.php
+++ b/resources/views/livewire/buckets.blade.php
@@ -1,9 +1,10 @@
@forelse ($this->buckets as $bucket)
- activeBucket === $bucket['name'], 'data-active') }}
role="button"
- wire:click="selectBucket('{{ $bucket['name'] }}')"
+ wire:click="selectBucket({{ json_encode($bucket['name']) }})"
class="hover:bg-accent data-active:bg-accent flex cursor-pointer items-center justify-between rounded-md p-2 transition-colors">
{{ $bucket['name'] }}