From e709e2c131aeebb9a1121437ce5e1ec4c2fc2f0b Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 17 Dec 2025 12:09:13 +0100 Subject: [PATCH] Add toggleable wire:navigate SPA navigation with prefetching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement instance-wide SPA navigation toggle that enables smooth page transitions with prefetching on hover. Excludes terminal links which require full page lifecycle for WebSocket connections. Adds defensive checks to global-search component for SPA navigation compatibility. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 --- app/Livewire/Settings/Advanced.php | 6 +++ app/Models/InstanceSettings.php | 1 + bootstrap/helpers/shared.php | 12 +++++ ...ate_enabled_to_instance_settings_table.php | 28 +++++++++++ .../views/components/limit-reached.blade.php | 2 +- resources/views/components/navbar.blade.php | 32 ++++++------ .../components/notification/navbar.blade.php | 12 ++--- .../resources/breadcrumbs.blade.php | 6 +-- .../components/security/navbar.blade.php | 8 +-- .../components/server/sidebar-proxy.blade.php | 6 +-- .../server/sidebar-security.blade.php | 2 +- .../views/components/server/sidebar.blade.php | 22 ++++---- .../components/settings/navbar.blade.php | 8 +-- .../components/settings/sidebar.blade.php | 6 +-- .../views/components/team/navbar.blade.php | 7 +-- resources/views/errors/400.blade.php | 4 +- resources/views/errors/401.blade.php | 4 +- resources/views/errors/402.blade.php | 4 +- resources/views/errors/403.blade.php | 4 +- resources/views/errors/404.blade.php | 6 +-- resources/views/errors/419.blade.php | 6 +-- resources/views/errors/429.blade.php | 4 +- resources/views/errors/500.blade.php | 4 +- resources/views/errors/503.blade.php | 4 +- resources/views/livewire/dashboard.blade.php | 14 +++--- .../livewire/deployments-indicator.blade.php | 2 +- .../livewire/destination/index.blade.php | 4 +- .../views/livewire/global-search.blade.php | 50 ++++++++++++------- .../views/livewire/layout-popups.blade.php | 6 +-- .../application/configuration.blade.php | 34 ++++++------- .../application/deployment/index.blade.php | 2 +- .../project/application/general.blade.php | 6 +-- .../project/application/heading.blade.php | 6 +-- .../project/application/previews.blade.php | 4 +- .../project/database/configuration.blade.php | 22 ++++---- .../project/database/heading.blade.php | 6 +-- .../project/database/keydb/general.blade.php | 2 +- .../database/mariadb/general.blade.php | 2 +- .../database/mongodb/general.blade.php | 2 +- .../project/database/mysql/general.blade.php | 2 +- .../database/postgresql/general.blade.php | 2 +- .../project/database/redis/general.blade.php | 2 +- .../database/scheduled-backups.blade.php | 2 +- .../project/environment-edit.blade.php | 4 +- .../views/livewire/project/index.blade.php | 4 +- ...ub-private-repository-deploy-key.blade.php | 2 +- .../new/public-git-repository.blade.php | 2 +- .../livewire/project/new/select.blade.php | 4 +- .../livewire/project/resource/index.blade.php | 14 +++--- .../project/service/configuration.blade.php | 22 ++++---- .../project/service/heading.blade.php | 6 +-- .../livewire/project/service/index.blade.php | 2 +- .../project/service/stack-form.blade.php | 2 +- .../project/shared/health-checks.blade.php | 2 +- .../livewire/project/shared/metrics.blade.php | 2 +- .../shared/scheduled-task/all.blade.php | 4 +- .../views/livewire/project/show.blade.php | 4 +- .../livewire/security/api-tokens.blade.php | 2 +- .../security/private-key/index.blade.php | 2 +- .../views/livewire/server/charts.blade.php | 2 +- .../livewire/server/destinations.blade.php | 4 +- .../views/livewire/server/index.blade.php | 2 +- .../views/livewire/server/navbar.blade.php | 8 +-- .../views/livewire/server/resources.blade.php | 2 +- .../server/security/patches.blade.php | 2 +- .../views/livewire/settings-backup.blade.php | 2 +- .../livewire/settings/advanced.blade.php | 7 ++- .../environment/index.blade.php | 2 +- .../livewire/shared-variables/index.blade.php | 6 +-- .../shared-variables/project/index.blade.php | 2 +- .../livewire/source/github/change.blade.php | 1 + .../views/livewire/storage/index.blade.php | 2 +- .../subscription/pricing-plans.blade.php | 2 +- .../views/livewire/tags/deployments.blade.php | 2 +- resources/views/livewire/tags/show.blade.php | 7 +-- resources/views/livewire/team/index.blade.php | 1 + .../livewire/team/member/index.blade.php | 1 + resources/views/source/all.blade.php | 1 + 78 files changed, 286 insertions(+), 216 deletions(-) create mode 100644 database/migrations/2025_12_17_000001_add_is_wire_navigate_enabled_to_instance_settings_table.php diff --git a/app/Livewire/Settings/Advanced.php b/app/Livewire/Settings/Advanced.php index b011d2dc1..fb9c91263 100644 --- a/app/Livewire/Settings/Advanced.php +++ b/app/Livewire/Settings/Advanced.php @@ -38,6 +38,9 @@ class Advanced extends Component #[Validate('boolean')] public bool $disable_two_step_confirmation; + #[Validate('boolean')] + public bool $is_wire_navigate_enabled; + public function rules() { return [ @@ -50,6 +53,7 @@ public function rules() 'allowed_ips' => ['nullable', 'string', new ValidIpOrCidr], 'is_sponsorship_popup_enabled' => 'boolean', 'disable_two_step_confirmation' => 'boolean', + 'is_wire_navigate_enabled' => 'boolean', ]; } @@ -68,6 +72,7 @@ public function mount() $this->is_api_enabled = $this->settings->is_api_enabled; $this->disable_two_step_confirmation = $this->settings->disable_two_step_confirmation; $this->is_sponsorship_popup_enabled = $this->settings->is_sponsorship_popup_enabled; + $this->is_wire_navigate_enabled = $this->settings->is_wire_navigate_enabled ?? true; } public function submit() @@ -146,6 +151,7 @@ public function instantSave() $this->settings->allowed_ips = $this->allowed_ips; $this->settings->is_sponsorship_popup_enabled = $this->is_sponsorship_popup_enabled; $this->settings->disable_two_step_confirmation = $this->disable_two_step_confirmation; + $this->settings->is_wire_navigate_enabled = $this->is_wire_navigate_enabled; $this->settings->save(); $this->dispatch('success', 'Settings updated!'); } catch (\Exception $e) { diff --git a/app/Models/InstanceSettings.php b/app/Models/InstanceSettings.php index 62b576012..376242ca0 100644 --- a/app/Models/InstanceSettings.php +++ b/app/Models/InstanceSettings.php @@ -29,6 +29,7 @@ class InstanceSettings extends Model 'auto_update_frequency' => 'string', 'update_check_frequency' => 'string', 'sentinel_token' => 'encrypted', + 'is_wire_navigate_enabled' => 'boolean', ]; protected static function booted(): void diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 670716164..8b1c0c74a 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -2916,6 +2916,18 @@ function instanceSettings() return InstanceSettings::get(); } +function wireNavigate(): string +{ + try { + $settings = instanceSettings(); + + // Return wire:navigate.hover for SPA navigation with prefetching, or empty string if disabled + return ($settings->is_wire_navigate_enabled ?? true) ? 'wire:navigate.hover' : ''; + } catch (\Exception $e) { + return 'wire:navigate.hover'; + } +} + function getHelperVersion(): string { $settings = instanceSettings(); diff --git a/database/migrations/2025_12_17_000001_add_is_wire_navigate_enabled_to_instance_settings_table.php b/database/migrations/2025_12_17_000001_add_is_wire_navigate_enabled_to_instance_settings_table.php new file mode 100644 index 000000000..9c89dab93 --- /dev/null +++ b/database/migrations/2025_12_17_000001_add_is_wire_navigate_enabled_to_instance_settings_table.php @@ -0,0 +1,28 @@ +boolean('is_wire_navigate_enabled')->default(true); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('instance_settings', function (Blueprint $table) { + $table->dropColumn('is_wire_navigate_enabled'); + }); + } +}; diff --git a/resources/views/components/limit-reached.blade.php b/resources/views/components/limit-reached.blade.php index d53dae3f3..1fc26bbe0 100644 --- a/resources/views/components/limit-reached.blade.php +++ b/resources/views/components/limit-reached.blade.php @@ -1,6 +1,6 @@
You have reached the limit of {{ $name }} you can create. - Please upgrade your + Please upgrade your subscription to create more {{ $name }}.
diff --git a/resources/views/components/navbar.blade.php b/resources/views/components/navbar.blade.php index 84502872e..e351a4480 100644 --- a/resources/views/components/navbar.blade.php +++ b/resources/views/components/navbar.blade.php @@ -79,7 +79,7 @@ }">
@@ -105,7 +105,7 @@ class="px-1 py-0.5 text-xs font-semibold text-neutral-500 dark:text-neutral-400