From 0824c91acad83e68df808a0f2a13a802568ecc3d Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sat, 15 Aug 2026 20:57:26 +0200 Subject: [PATCH] fix(forms): prevent reparsing partial numeric hosts --- .../views/components/forms/domain-input.blade.php | 6 +++++- tests/Feature/SplitUrlInputTest.php | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/resources/views/components/forms/domain-input.blade.php b/resources/views/components/forms/domain-input.blade.php index e7fc1c063..d6e6bce85 100644 --- a/resources/views/components/forms/domain-input.blade.php +++ b/resources/views/components/forms/domain-input.blade.php @@ -39,7 +39,11 @@ const path = this.path.trim(); const normalizedPath = path && !['/', '?', '#'].includes(path[0]) ? `/${path}` : path; const next = `${this.scheme}://${this.host.trim()}${this.port ? `:${this.port}` : ''}${normalizedPath}`; - if (this.value !== next) this.value = next; + if (this.value !== next) { + this.syncing = true; + this.value = next; + this.$nextTick(() => this.syncing = false); + } }, }" x-modelable="value" {{ $attributes->whereStartsWith('x-model') }}>
diff --git a/tests/Feature/SplitUrlInputTest.php b/tests/Feature/SplitUrlInputTest.php index 5bfa0feb6..e05cc9eb2 100644 --- a/tests/Feature/SplitUrlInputTest.php +++ b/tests/Feature/SplitUrlInputTest.php @@ -22,6 +22,18 @@ it('renders configurable host copy for S3 endpoints', function () { ->toContain("path: ''"); }); +it('does not reparse partial numeric hosts while typing', function () { + $view = file_get_contents(resource_path('views/components/forms/domain-input.blade.php')); + $writeMethod = str($view)->between('write() {', "\n },\n}")->value(); + + expect($writeMethod) + ->toContain('this.syncing = true;') + ->toContain('this.value = next;') + ->toContain('this.$nextTick(() => this.syncing = false);') + ->and(strpos($writeMethod, 'this.syncing = true;')) + ->toBeLessThan(strpos($writeMethod, 'this.value = next;')); +}); + it('keeps validation errors attached to the composed endpoint', function () { $settingsUrl = route('settings.advanced').'#endpoint-section'; $errors = new ViewErrorBag;