Files
fizzy/app/javascript/controllers/collapsible_columns_controller.js
T
2025-10-15 12:51:06 -05:00

95 lines
2.2 KiB
JavaScript

import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static classes = [ "collapsed", "noTransitions" ]
static targets = [ "column", "button" ]
connect() {
this.#disableTransitions()
this.#restoreColumns()
requestAnimationFrame(() => this.#enableTransitions())
}
toggle({ target }) {
const column = target.closest('[data-collapsible-columns-target="column"]')
this.#toggleColumn(column);
}
preventToggle(event) {
if (event.target.hasAttribute("data-collapsible-columns-target") && event.detail.attributeName === "class") {
event.preventDefault()
}
}
#disableTransitions() {
this.columnTargets.forEach(column => {
if (this.noTransitionsClass) {
column.classList.add(this.noTransitionsClass)
}
})
}
#enableTransitions() {
this.columnTargets.forEach(column => {
if (this.noTransitionsClass) {
column.classList.remove(this.noTransitionsClass)
}
})
}
#toggleColumn(column) {
this.#collapseAllExcept(column)
if (this.#isCollapsed(column)) {
this.#expand(column)
} else {
this.#collapse(column)
}
}
#collapseAllExcept(clickedColumn) {
this.columnTargets.forEach(column => {
if (column !== clickedColumn) {
this.#collapse(column)
}
})
}
#isCollapsed(column) {
return column.classList.contains(this.collapsedClass)
}
#collapse(column) {
const key = this.#localStorageKeyFor(column)
this.#buttonFor(column).setAttribute("aria-expanded", "false")
column.classList.add(this.collapsedClass)
localStorage.removeItem(key)
}
#expand(column) {
const key = this.#localStorageKeyFor(column)
this.#buttonFor(column).setAttribute("aria-expanded", "true")
column.classList.remove(this.collapsedClass)
localStorage.setItem(key, true)
}
#buttonFor(column) {
return this.buttonTargets.find(button => column.contains(button))
}
#restoreColumns() {
this.columnTargets.forEach(column => {
const key = this.#localStorageKeyFor(column)
if (localStorage.getItem(key)) {
this.#expand(column)
}
})
}
#localStorageKeyFor(column) {
return `expand-${column.getAttribute("id")}`
}
}