UNPKG

@govbr-ds/core

Version:

Padrão Digital de Governo

106 lines (96 loc) 3.27 kB
import Collapse from './collapse' /** * Classe para o comportamento Accordion. * O Comportamento Accordion é um agrupador de comportamentos Collapse */ export default class Accordion extends Collapse { /** * Instancia um comportamento accordion * @param {object} - Objeto de configuração inicial para destructuring * @property {object} trigger - Elemento DOM que representa o acionador do comportmento accordion * @property {string} iconToShow - Classe que representa o ícone para mostrar o conteúdo (padrão: fa-chevron-down) * @property {string} iconToHide - Classe que representa o ícone para esconder o conteúdo (padrão: fa-chevron-up) * @property {boolean} useIcons - true: com ícone | false: sem ícone (padrão: true) */ constructor({ trigger, iconToShow = 'fa-chevron-down', iconToHide = 'fa-chevron-up', useIcons = true }) { super({ iconToHide, iconToShow, trigger, useIcons }) this._setUp() } /** * Trata a configuração inicial do comportamento accordion * @private */ _setUp() { super._setUp() this._setPriorityVisibility() } /** * Determina qual acionador vai estar visivel, caso mais de 1 acionador esteja visivel no grupo. * Prioridade de cima para baixo * @private */ _setPriorityVisibility() { for (let i = 0; i < this._getGroup().length; i += 1) { if (this._getGroup()[i].dataset.visible === 'true') { this._synchronizeAccordion(this._getGroup()[i]) break } } } /** * Handler para o evento de tecla pressionada (keydown) no acionador * @param {object} event - Objeto do tipo Event * @private */ _handleTriggerKeyPress(event) { super._handleTriggerKeyPress(event) } /** * Configura o estado de visualização do comportamento collapse * @private */ _setVisibilityStatus() { super._setVisibilityStatus() } /** * Obtém todos os acionadores pertencentes ao grupo do comportamento accordion * @returns {array} - Conjunto de elementos DOM representando os acionadores pertencentes ao grupo do comportamento accordion * @private */ _getGroup() { return document.querySelectorAll(`[data-group="${this.trigger.getAttribute('data-group')}"]`) } /** * Handler para o evento 'change' do acionador * @param {object} event - Objeto do tipo Event * @private */ _handleTriggerChangeBehavior(event) { if (!event.currentTarget.hasAttribute('data-sync')) { this._synchronizeAccordion(event.currentTarget) } else { event.currentTarget.removeAttribute('data-sync') } } /** * Sincroniza o grupo de accordion mostrando 1 elemento aberto por vez * @param {object} currentTrigger - Elemento DOM representando um acionador do comportamento accordion * @private */ _synchronizeAccordion(currentTrigger) { this._getGroup().forEach((trigger) => { if (trigger !== currentTrigger && trigger.dataset.visible === 'true') { trigger.setAttribute('data-sync', '') trigger.click() } }) } /** * Configura o comportamento accordion * @public */ setBehavior() { super.setBehavior() this.trigger.addEventListener('change', this._handleTriggerChangeBehavior.bind(this)) } }