openfoodfoundation/openfoodnetwork

View on GitHub
app/webpacker/controllers/multiple_checked_select_controller.js

Summary

Maintainability
A
0 mins
Test Coverage
import { Controller } from "stimulus";

export default class extends Controller {
  static targets = ["button", "caret", "options", "option", "filter"];

  connect() {
    this.buttonTarget.addEventListener("click", this.toggleOptions);
    document.addEventListener("click", this.closeOptions);
    this.filterTarget.addEventListener("input", this.filterOptions);
  }

  disconnect() {
    document.removeEventListener("click", this.closeOptions);
  }

  // private methods

  filterOptions = (e) => {
    const filter = e.target.value.toLowerCase();
    this.optionTargets.forEach((option) => {
      if (option.dataset["label"].toLowerCase().includes(filter)) {
        option.classList.remove("hidden");
      } else {
        option.classList.add("hidden");
      }
    });
  };

  toggleOptions = () => {
    this.optionsTarget.classList.toggle("hidden");
    this.caretTarget.classList.toggle("icon-caret-down");
    this.caretTarget.classList.toggle("icon-caret-up");
  };

  closeOptions = (e) => {
    if (!this.element.contains(e.target)) {
      this.optionsTarget.classList.add("hidden");
      this.caretTarget.classList.remove("icon-caret-up");
      this.caretTarget.classList.add("icon-caret-down");
    }
  };
}