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;