mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-26 01:33:22 +00:00
Merge pull request #12634 from chahmedejaz/bugfix/12632-voucher-field-focus-issue
Fix Voucher Code Field Focus Issue
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
Reference in New Issue
Block a user