Skip to content
This repository was archived by the owner on Jul 27, 2025. It is now read-only.

Commit 32ec571

Browse files
authored
Fix form submission triggers (#2512)
1 parent f7f6ebb commit 32ec571

File tree

1 file changed

+46
-4
lines changed

1 file changed

+46
-4
lines changed

app/javascript/controllers/auto_submit_form_controller.js

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@ export default class extends Controller {
1010

1111
connect() {
1212
this.autoTargets.forEach((element) => {
13-
const event =
14-
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
13+
const event = this.#getTriggerEvent(element);
1514
element.addEventListener(event, this.handleInput);
1615
});
1716
}
1817

1918
disconnect() {
2019
this.autoTargets.forEach((element) => {
21-
const event =
22-
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
20+
const event = this.#getTriggerEvent(element);
2321
element.removeEventListener(event, this.handleInput);
2422
});
2523
}
@@ -33,6 +31,50 @@ export default class extends Controller {
3331
}, this.#debounceTimeout(target));
3432
};
3533

34+
#getTriggerEvent(element) {
35+
// Check if element has explicit trigger event set
36+
if (element.dataset.autosubmitTriggerEvent) {
37+
return element.dataset.autosubmitTriggerEvent;
38+
}
39+
40+
// Check if form has explicit trigger event set
41+
if (this.triggerEventValue !== "input") {
42+
return this.triggerEventValue;
43+
}
44+
45+
// Otherwise, choose trigger event based on element type
46+
const type = element.type || element.tagName;
47+
48+
switch (type.toLowerCase()) {
49+
case "text":
50+
case "email":
51+
case "password":
52+
case "search":
53+
case "tel":
54+
case "url":
55+
case "textarea":
56+
return "blur";
57+
case "number":
58+
case "date":
59+
case "datetime-local":
60+
case "month":
61+
case "time":
62+
case "week":
63+
case "color":
64+
return "change";
65+
case "checkbox":
66+
case "radio":
67+
case "select":
68+
case "select-one":
69+
case "select-multiple":
70+
return "change";
71+
case "range":
72+
return "input";
73+
default:
74+
return "blur";
75+
}
76+
}
77+
3678
#debounceTimeout(element) {
3779
if (element.dataset.autosubmitDebounceTimeout) {
3880
return Number.parseInt(element.dataset.autosubmitDebounceTimeout);

0 commit comments

Comments
 (0)