Thursday, June 04, 2026 3:48:50 AM
> slim_select_controller.js
import ApplicationController from "./application_controller";
import SlimSelect from "slim-select";

export default class extends ApplicationController {
  static targets = ["select"];
  static values = {
    data: Array,
    placeholder: String,
    searchText: String,
    allowDeselect: Boolean,
    closeOnSelect: Boolean,
    disabled: Boolean,
  };

  connect() {
    const selectElement = this.hasSelectTarget
      ? this.selectTarget
      : this.element;

    const config = {
      select: selectElement,
      data: this.dataValue,
      settings: {
        searchText: this.searchTextValue || "No results",
        searchPlaceholder: this.searchTextValue || "Search",
        closeOnSelect: this.closeOnSelectValue,
        allowDeselect: this.allowDeselectValue,
        placeholderText: this.placeholderValue || "Select value",
        showSearch: true,
        disabled: this.disabledValue || selectElement.disabled,
      },
      events: {
        afterChange: (_) => {
          // Trigger change event for other listeners (including validation)
          this.nextTick(() => {
            selectElement.dispatchEvent(new Event("change", { bubbles: true }));
            selectElement.dispatchEvent(new Event("input", { bubbles: true }));

            // Also trigger blur to force immediate validation if configured
            selectElement.dispatchEvent(new Event("blur", { bubbles: true }));
          });
        },
      },
    };

    this.slimSelect = new SlimSelect(config);
  }

  disconnect() {
    this.slimSelect?.destroy();
  }

  disable() {
    this.slimSelect?.disable();
  }

  enable() {
    this.slimSelect?.enable();
  }

  setData({ detail: { value } }) {
    this.slimSelect?.setData(value);
  }

  clearData() {
    this.slimSelect?.setData([]);
  }

  setSelected({ detail: { value, validate = false } }) {
    this.slimSelect?.setSelected([value], validate);
  }

  clearSelected() {
    this.slimSelect?.setSelected([], false);
  }
}
All opinions represented herein are my own
- © 2024 - 2026 itsthedevman
- build 4294fb2