UNPKG

@govbr-ds/core

Version:

Padrão Digital de Governo

168 lines (146 loc) 5.02 kB
/** * Classe do componente BRFooter */ class BRFooter { /** * Instancia um componente BRFooter * @param {string} name - Nome do componente (br-footer) * @param {object} component - Objeto que referencia o elemento DOM do componente */ constructor(name, component) { this.name = name this.component = component this._setUp() this._setBehavior() } /** * Controla a configuração inicial do footer */ _setUp() { this.list = this.component.querySelector('.br-list.horizontal') } /** * Controla os comportamentos do footer * @private */ _setBehavior() { this._setCollapseBehavior() window.onresize = function () { if (window.matchMedia('(min-width: 992px)').matches) { window.document.querySelectorAll('.br-footer .br-list:not(.horizontal)').forEach((trigger) => { trigger.style.display = 'block' }) } else { window.document.querySelectorAll('.br-footer .br-list:not(.horizontal)').forEach((trigger) => { trigger.style.display = 'none' }) window.document.querySelectorAll('.br-footer i').forEach((iconComponent) => { iconComponent.classList.remove('fa-angle-up') iconComponent.classList.add('fa-angle-down') }) } } } /** * Trata do comportamento de collapse do Footer * @private */ _setCollapseBehavior() { this.britems = [] if (this.list) { this.list.querySelectorAll('.br-list').forEach((trigger) => { if (window.matchMedia('(max-width: 992px)').matches) { trigger.style.display = 'none' } }) this.list.querySelectorAll('.br-item').forEach((trigger) => { trigger.addEventListener('click', (e) => { if (window.matchMedia('(max-width: 992px)').matches) { this._showList(e) } }) this.britems.push(trigger) }) this.list.querySelectorAll('.br-item').forEach((trigger) => { trigger.addEventListener('keydown', (e) => { if (e.keyCode === 13) { if (window.matchMedia('(max-width: 992px)').matches) { this._showList(e) } } }) this.britems.push(trigger) }) } } /** * Controla a abertura e fachamento da lista * @param {object} e - Objeto Event * @private */ _showList(e) { parent = e.target.parentElement parent = parent.classList.contains('col-2') ? e.target.parentElement : e.target.parentElement.parentElement parent = parent.classList.contains('col-2') ? parent : e.target.parentElement.parentElement.parentElement // debugger this._closeAllColumns(parent) parent.querySelectorAll('.br-list ').forEach((trigger) => { trigger.style.display = trigger.style.display === 'block' ? 'none' : 'block' const iconComponent = parent.querySelector('i') trigger.style.display === 'block' ? this._iconAngleUP(iconComponent) : this._iconAngleDOWN(iconComponent) this._setAriaAttributes(trigger, e) }) } /** * Fecha todas colunas do Footer */ _closeAllColumns(target) { this.component.querySelectorAll('.br-list:not(.horizontal)').forEach((trigger) => { if (target !== trigger.parentElement) { trigger.style.display = 'none' this.component.querySelectorAll('.header i').forEach((iconComponent) => { this._iconAngleDOWN(iconComponent) }) } }) } /** *Inclui ícone 'fa-angle-up' * @param {objetc} iconComponent - Elemento DOM que representa um ícone * @private */ _iconAngleUP(iconComponent) { iconComponent.classList.remove('fa-angle-down') iconComponent.classList.add('fa-angle-up') } /** * Inclui ícone 'fa-angle-down' * @param {object} iconComponent - Elemento DOM que representa um ícone * @private */ _iconAngleDOWN(iconComponent) { iconComponent.classList.remove('fa-angle-up') iconComponent.classList.add('fa-angle-down') } /** * Define atributos ARIA para um elemento de lista com base na visibilidade de um trigger. * @param {object} trigger - Elemento DOM que controla a visibilidade do elemento de lista * @private */ _setAriaAttributes(optionTriggerExternal, event) { const itemList = this.list.querySelectorAll('.br-item') itemList.forEach(() => { const listId = `list-${Math.floor(Math.random() * 10000)}` const isBlock = optionTriggerExternal.style.display === 'block' const { parentElement } = event.target parentElement.setAttribute('id', listId) parentElement.setAttribute('data-visible', isBlock) parentElement.setAttribute('aria-expanded', isBlock) parentElement.setAttribute('aria-label', isBlock ? 'expandido' : 'recolhido') parentElement.setAttribute('aria-controls', listId) parentElement.setAttribute('data-group', 'group1') parentElement.setAttribute('data-target', listId) }) } } export default BRFooter