SpinaCMS/Spina

View on GitHub
app/assets/javascripts/spina/controllers/selectable_controller.js

Summary

Maintainability
A
0 mins
Test Coverage
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static get targets() {
    return [ "item" ]
  }
  
  select(event) {
    let item = event.currentTarget.closest(`[data-selectable-target*="item"]`)
    
    // Deactivate other items
    this.itemTargets.forEach(function(item) {
      this.deactivate(item)
    }.bind(this))

    this.activate(item)
  }
  
  activate(item) {
    this.toggleClasses(item, true)
  }
  
  deactivate(item) {
    this.toggleClasses(item, false)
  }
  
  toggleClasses(item, force) {
    item.querySelectorAll(`[data-selected-class]`).forEach(function(element) {
      let selectedClasses = element.dataset.selectedClass
      if(selectedClasses) {
        selectedClasses.split(" ").forEach(function(cssClass) {
          element.classList.toggle(cssClass, force)
        })
      }
      
      let deselectedClasses = element.dataset.deselectedClass
      if(deselectedClasses) {
        deselectedClasses.split(" ").forEach(function(cssClass) {
          element.classList.toggle(cssClass, !force)
        }) 
      }
    })
  }
}