Sha256: 7bd04bb7cee89e6d4e09c37d5b6cd205fc81e12595c00877b4addbb3c7ad4482

Contents?: true

Size: 1.9 KB

Versions: 27

Compression:

Stored size: 1.9 KB

Contents

import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="resource-tab-list"
export default class extends Controller {
  static targets = ["btn", "tab"]
  static values = {
    defaultTab: String,
    activeClasses: String,
    inActiveClasses: String
  }

  connect() {
    this.activeClasses = this.hasActiveClassesValue ? this.activeClassesValue.split(" ") : []
    this.inActiveClasses = this.hasInActiveClassesValue ? this.inActiveClassesValue.split(" ") : []

    this.#selectInternal(this.defaultTabValue || this.btnTargets[0].id)
  }

  select(event) {
    this.#selectInternal(event.currentTarget.id)
  }

  #selectInternal(id) {
    const selectedBtn = this.btnTargets.find(element => element.id === id)
    if (!selectedBtn) {
      console.error(`Tab Button with id "${id}" not found`)
      return
    }

    const selectedTab = this.tabTargets.find(element => element.id === selectedBtn.dataset.target)
    if (!selectedTab) {
      console.error(`Tab Panel with id "${selectedBtn.dataset.target}" not found`)
      return
    }

    // Update tab visibility and ARIA states
    this.tabTargets.forEach(tab => {
      tab.hidden = true
      tab.setAttribute('aria-hidden', 'true')
    })

    // Update button states and classes
    this.btnTargets.forEach(btn => {
      btn.setAttribute('aria-selected', 'false')
      btn.setAttribute('tabindex', '-1')
      btn.classList.remove(...this.activeClasses)
      btn.classList.add(...this.inActiveClasses)
    })

    // Activate selected tab and button
    selectedBtn.setAttribute('aria-selected', 'true')
    selectedBtn.setAttribute('tabindex', '0')
    selectedBtn.classList.remove(...this.inActiveClasses)
    selectedBtn.classList.add(...this.activeClasses)

    selectedTab.hidden = false
    selectedTab.setAttribute('aria-hidden', 'false')

    // Focus management
    if (selectedBtn !== document.activeElement) {
      selectedBtn.focus()
    }
  }
}

Version data entries

27 entries across 27 versions & 1 rubygems

Version Path
plutonium-0.20.4 src/js/controllers/resource_tab_list_controller.js
plutonium-0.20.3 src/js/controllers/resource_tab_list_controller.js
plutonium-0.20.1 src/js/controllers/resource_tab_list_controller.js
plutonium-0.20.0 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.13 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.12 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.11 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.10 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.9 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.8 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.7 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.6 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.5 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.4 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.3 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.2 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.1 src/js/controllers/resource_tab_list_controller.js
plutonium-0.19.0 src/js/controllers/resource_tab_list_controller.js
plutonium-0.18.8 src/js/controllers/resource_tab_list_controller.js
plutonium-0.18.7 src/js/controllers/resource_tab_list_controller.js