Merge pull request #12634 from chahmedejaz/bugfix/12632-voucher-field-focus-issue

Fix Voucher Code Field Focus Issue
This commit is contained in:
Konrad
2024-07-08 12:19:19 +02:00
committed by GitHub
2 changed files with 44 additions and 8 deletions

View File

@@ -1,5 +1,7 @@
import { Controller } from "stimulus";
const BUTTON_TYPES = ['submit', 'button'];
// Toggle state of a control based on a condition.
//
// 1. When an action occurs on an element,
@@ -57,10 +59,8 @@ export default class extends Controller {
target.disabled = disable;
});
// Focus first when enabled
if (!disable) {
this.controlTargets[0].focus();
}
// Focus first when enabled and it's not a button
if (!disable) this.#focusFieldControl();
}
#toggleDisplay(show) {
@@ -69,9 +69,7 @@ export default class extends Controller {
});
// Focus first when displayed
if (show) {
this.controlTargets[0].focus();
}
if (show) this.#focusFieldControl();
}
// Return input's value, but only if it would be submitted by a form
@@ -81,4 +79,10 @@ export default class extends Controller {
return input.value;
}
}
#focusFieldControl() {
const control = this.controlTargets[0];
const isButton = BUTTON_TYPES.includes(control.type);
if(!isButton) control.focus();
}
}

View File

@@ -71,11 +71,12 @@ describe("ToggleControlController", () => {
</div>`;
});
it("Enables when input is filled", () => {
it("Enables when input is filled and focuses the control", () => {
input.value = "a"
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(false);
expect(document.activeElement).toBe(control);
});
it("Disables when input is emptied", () => {
@@ -88,6 +89,37 @@ describe("ToggleControlController", () => {
expect(control.disabled).toBe(true);
});
});
describe("with button as control target", () => {
beforeEach(() => {
document.body.innerHTML = `<div data-controller="toggle-control">
<input id="input" value="" data-action="input->toggle-control#enableIfPresent" />
<button id="control" data-toggle-control-target="control">
</div>`;
});
it("Enables the button control when input is filled, focus remains on input", () => {
// Simulating click on input to focus it
input.focus();
input.value = "test"
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(false);
expect(document.activeElement).toBe(input);
});
it("Disables the button control when input is emptied, focus remains on input", () => {
// Simulating click on input to focus it
input.focus();
input.value = "test"
input.dispatchEvent(new Event("input"));
input.value = ""
input.dispatchEvent(new Event("input"));
expect(control.disabled).toBe(true);
expect(document.activeElement).toBe(input);
});
})
});
describe("#displayIfMatch", () => {