2024-03-28 13:23:54 -04:00
|
|
|
import { Controller } from "@hotwired/stimulus";
|
2024-03-10 21:38:31 +00:00
|
|
|
|
|
|
|
export default class extends Controller {
|
2024-03-28 13:23:54 -04:00
|
|
|
// By default, auto-submit is "opt-in" to avoid unexpected behavior. Each `auto` target
|
2024-04-25 07:54:56 -04:00
|
|
|
// will trigger a form submission when the configured event is triggered.
|
2024-03-28 13:23:54 -04:00
|
|
|
static targets = ["auto"];
|
2024-04-25 07:54:56 -04:00
|
|
|
static values = {
|
|
|
|
triggerEvent: { type: String, default: "input" },
|
|
|
|
};
|
2024-03-10 21:38:31 +00:00
|
|
|
|
|
|
|
connect() {
|
2024-03-28 13:23:54 -04:00
|
|
|
this.autoTargets.forEach((element) => {
|
2024-04-25 14:55:39 -04:00
|
|
|
const event =
|
|
|
|
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
|
|
|
|
element.addEventListener(event, this.handleInput);
|
2024-03-28 13:23:54 -04:00
|
|
|
});
|
2024-03-10 21:38:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
disconnect() {
|
2024-03-28 13:23:54 -04:00
|
|
|
this.autoTargets.forEach((element) => {
|
2024-04-25 14:55:39 -04:00
|
|
|
const event =
|
|
|
|
element.dataset.autosubmitTriggerEvent || this.triggerEventValue;
|
|
|
|
element.removeEventListener(event, this.handleInput);
|
2024-03-28 13:23:54 -04:00
|
|
|
});
|
2024-03-10 21:38:31 +00:00
|
|
|
}
|
|
|
|
|
2024-10-21 11:13:55 -03:00
|
|
|
handleInput = (event) => {
|
2025-02-05 09:09:38 -05:00
|
|
|
const target = event.target;
|
2024-10-21 11:13:55 -03:00
|
|
|
|
2024-03-28 13:23:54 -04:00
|
|
|
clearTimeout(this.timeout);
|
|
|
|
this.timeout = setTimeout(() => {
|
|
|
|
this.element.requestSubmit();
|
2024-10-21 11:13:55 -03:00
|
|
|
}, this.#debounceTimeout(target));
|
2024-03-28 13:23:54 -04:00
|
|
|
};
|
2024-10-21 11:13:55 -03:00
|
|
|
|
|
|
|
#debounceTimeout(element) {
|
2025-02-05 09:09:38 -05:00
|
|
|
if (element.dataset.autosubmitDebounceTimeout) {
|
2024-10-21 11:13:55 -03:00
|
|
|
return Number.parseInt(element.dataset.autosubmitDebounceTimeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
const type = element.type || element.tagName;
|
|
|
|
|
|
|
|
switch (type.toLowerCase()) {
|
2025-02-05 09:09:38 -05:00
|
|
|
case "input":
|
|
|
|
case "textarea":
|
2024-10-21 11:13:55 -03:00
|
|
|
return 500;
|
2025-02-05 09:09:38 -05:00
|
|
|
case "select-one":
|
|
|
|
case "select-multiple":
|
2024-10-21 11:13:55 -03:00
|
|
|
return 0;
|
|
|
|
default:
|
|
|
|
return 500;
|
|
|
|
}
|
|
|
|
}
|
2024-03-10 21:38:31 +00:00
|
|
|
}
|