@stimulus-library/controllers
Version:
A library of useful controllers for Stimulus
36 lines (35 loc) • 1.52 kB
JavaScript
import { BaseController } from "@stimulus-library/utilities";
import { useCollectionEventListener, useEventListener } from "@stimulus-library/mixins";
export class CheckboxSelectAllController extends BaseController {
get _checked() {
return this._enabled.filter(checkbox => checkbox.checked);
}
get _enabled() {
return this.checkboxTargets.filter(checkbox => !checkbox.disabled && !checkbox.readOnly);
}
get _unchecked() {
return this._enabled.filter(checkbox => !checkbox.checked);
}
connect() {
requestAnimationFrame(() => {
if (!this.hasSelectAllTarget) {
return;
}
useEventListener(this, this.selectAllTarget, "change", this._toggle);
useCollectionEventListener(this, this.checkboxTargets, "change", this._refresh);
this._refresh();
});
}
_toggle(event) {
event.preventDefault();
const target = event.target;
this._enabled.forEach((checkbox) => checkbox.checked = (checkbox.disabled || checkbox.readOnly) ? checkbox.checked : target.checked);
}
_refresh() {
const checkboxesCount = this._enabled.length;
const checkboxesCheckedCount = this._checked.length;
this.selectAllTarget.checked = checkboxesCheckedCount > 0;
this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;
}
}
CheckboxSelectAllController.targets = ["selectAll", "checkbox"];