diff --git a/app/Livewire/Server/New/ByHetzner.php b/app/Livewire/Server/New/ByHetzner.php index 0da4ef344..f991bc3e8 100644 --- a/app/Livewire/Server/New/ByHetzner.php +++ b/app/Livewire/Server/New/ByHetzner.php @@ -74,8 +74,6 @@ class ByHetzner extends Component public bool $enable_backups = false; - public bool $show_advanced_hetzner_options = false; - public bool $show_cloud_init_script = false; public ?string $cloud_init_script = null; @@ -131,7 +129,6 @@ public function resetSelection() $this->save_cloud_init_script = false; $this->cloud_init_script_name = null; $this->selected_cloud_init_script_id = null; - $this->show_advanced_hetzner_options = false; $this->show_cloud_init_script = false; $this->selectedHetznerSshKeyIds = []; $this->selectedHetznerFirewallIds = []; @@ -191,7 +188,6 @@ protected function rules(): array 'enable_ipv4' => 'required|boolean', 'enable_ipv6' => 'required|boolean', 'enable_backups' => 'required|boolean', - 'show_advanced_hetzner_options' => 'boolean', 'show_cloud_init_script' => 'boolean', 'cloud_init_script' => ['nullable', 'string', new ValidCloudInitYaml], 'save_cloud_init_script' => 'boolean', @@ -452,22 +448,6 @@ public function getSelectedServerBackupSurchargeProperty(): ?string return '€'.number_format($price * 0.2, 2); } - public function getShouldShowAdvancedHetznerOptionsProperty(): bool - { - return $this->show_advanced_hetzner_options - || $this->selectedHetznerSshKeyIds !== [] - || $this->selectedHetznerFirewallIds !== [] - || $this->selectedHetznerNetworkIds !== [] - || $this->enable_backups - || ! $this->enable_ipv4 - || ! $this->enable_ipv6 - || $this->show_cloud_init_script - || filled($this->cloud_init_script) - || $this->save_cloud_init_script - || filled($this->cloud_init_script_name) - || filled($this->selected_cloud_init_script_id); - } - public function getAdvancedHetznerOptionsSummaryProperty(): array { $summary = []; @@ -502,15 +482,9 @@ public function getAdvancedHetznerOptionsSummaryProperty(): array return $summary; } - public function toggleAdvancedHetznerOptions(): void - { - $this->show_advanced_hetzner_options = ! $this->show_advanced_hetzner_options; - } - public function showCloudInitScript(): void { $this->show_cloud_init_script = true; - $this->show_advanced_hetzner_options = true; } public function updatedSelectedLocation($value) @@ -545,7 +519,6 @@ public function updatedSelectedCloudInitScriptId($value) $this->cloud_init_script = $script->script; $this->cloud_init_script_name = $script->name; $this->show_cloud_init_script = true; - $this->show_advanced_hetzner_options = true; } } diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php index 2bb917f79..b48b04143 100644 --- a/resources/views/components/dropdown.blade.php +++ b/resources/views/components/dropdown.blade.php @@ -1,3 +1,9 @@ +@props([ + 'inline' => false, + 'triggerClass' => '', + 'panelClass' => '', +]) +
- -
-
+ :style="panelStyles" @class([ + 'mt-1 w-full' => $inline, + 'absolute top-full z-50 mt-1 min-w-max max-w-[calc(100vw-1rem)] md:top-0 md:mt-6' => ! $inline, + ]) x-cloak> +
! $inline, + 'border-0 bg-transparent shadow-none dark:border-0 dark:bg-transparent' => $inline, + $panelClass, + ])> {{ $slot }}
diff --git a/resources/views/livewire/server/new/by-hetzner.blade.php b/resources/views/livewire/server/new/by-hetzner.blade.php index 2a25e9958..5587c6e39 100644 --- a/resources/views/livewire/server/new/by-hetzner.blade.php +++ b/resources/views/livewire/server/new/by-hetzner.blade.php @@ -135,95 +135,118 @@ class="p-4 border border-warning-500 dark:border-warning-600 rounded bg-warning-

@endif
-
- - @foreach ($hetznerSshKeys as $sshKey) - - @endforeach - -
- -
- - @foreach ($hetznerFirewalls as $firewall) - - @endforeach - -
- -
- - @foreach ($this->availableNetworks as $network) - - @endforeach - -
- -
- -
- - -
-
- -
- - -
- -
-
- - @if ($saved_cloud_init_scripts->count() > 0) -
- - - @foreach ($saved_cloud_init_scripts as $script) - - @endforeach - - - Clear - -
+ + + Advanced Hetzner options + SSH keys, firewalls, private networks, backups, and cloud-init. + @if (count($this->advancedHetznerOptionsSummary) > 0) + + @foreach ($this->advancedHetznerOptionsSummary as $summaryItem) + + {{ $summaryItem }} + + @endforeach + @endif -
- + -
- -
- +
+
+ + @foreach ($hetznerSshKeys as $sshKey) + + @endforeach + +
+ +
+ + @foreach ($hetznerFirewalls as $firewall) + + @endforeach + + + + @foreach ($this->availableNetworks as $network) + + @endforeach + +
+ +
+ + + +
+ +
+ @if (! $show_cloud_init_script && empty($cloud_init_script) && empty($selected_cloud_init_script_id)) +
+ + Add cloud-init script + +
+ @else +
+ + @if ($saved_cloud_init_scripts->count() > 0) +
+ + + @foreach ($saved_cloud_init_scripts as $script) + + @endforeach + + + Clear + +
+ @else + + Remove + + @endif +
+ + +
+ + @if ($save_cloud_init_script) +
+ +
+ @endif +
+ @endif
-
+
diff --git a/tests/Feature/Server/HetznerServerCreationTest.php b/tests/Feature/Server/HetznerServerCreationTest.php index e5efe3862..34e25d58a 100644 --- a/tests/Feature/Server/HetznerServerCreationTest.php +++ b/tests/Feature/Server/HetznerServerCreationTest.php @@ -189,22 +189,20 @@ expect((bool) $this->team->fresh()->show_boarding)->toBeTrue(); }); - test('keeps advanced Hetzner options collapsed by default in the create dialog', function () { + test('uses the shared dropdown UI for advanced Hetzner options', function () { Livewire::test(ByHetzner::class) ->set('current_step', 2) - ->assertSet('show_advanced_hetzner_options', false) ->assertSee('Advanced Hetzner options') - ->assertDontSee('Extra SSH Keys') - ->assertDontSee('Firewalls') - ->assertDontSee('Private Networks') - ->assertDontSee('Enable Hetzner Backups') - ->assertDontSee('Cloud-Init Script'); + ->assertSeeHtml('dropdownOpen') + ->assertSeeHtml('x-ref="panel"') + ->assertSeeHtml('dark:bg-coolgray-100') + ->assertSeeHtml('dark:bg-transparent') + ->assertSeeHtml('@click.outside="if (! true) close()"'); }); - test('shows advanced Hetzner options when expanded', function () { + test('renders advanced Hetzner option controls inside the dropdown menu', function () { Livewire::test(ByHetzner::class) ->set('current_step', 2) - ->set('show_advanced_hetzner_options', true) ->assertSee('Extra SSH Keys') ->assertSee('Firewalls') ->assertSee('Private Networks') @@ -216,7 +214,6 @@ test('shows the cloud init script name only when saving the script', function () { Livewire::test(ByHetzner::class) ->set('current_step', 2) - ->set('show_advanced_hetzner_options', true) ->set('show_cloud_init_script', true) ->assertSee('Cloud-Init Script') ->assertSee('Save this script for later use')