UNPKG

@govbr-ds/core

Version:

Padrão Digital de Governo

176 lines (154 loc) 4.84 kB
class BRBreadcrumb { /** * Instancia um componente breadcrumb * @param {string} name - nome do componente * @param {object} component - referencia ao objeto do DOM **/ constructor(name, component) { this.name = name this.component = component this._setBehavior() } /** * Define os comportamentos do componente * @private */ _setBehavior() { this._setView() window.addEventListener('resize', () => { this._setView() }) window.document.addEventListener('click', (event) => { if (!this.component.contains(event.target) && this.component.querySelector('.br-card')) { this.component.querySelector('.br-card').remove() } }) // window.addEventListener('resize', (event) => {}) } /** * Reseta a view do breadcrumb */ resetBreadcrumbs() { this._reset() const brcardBreadcrumb = this.component.querySelector('.br-card') if (brcardBreadcrumb !== null) { brcardBreadcrumb.remove() } this._setView() } /** * Atualiza a visualização do componente * @private */ _setView() { this._reset() for (const crumbList of this.component.querySelectorAll('.crumb-list')) { const crumbs = crumbList.querySelectorAll('.crumb:not([data-active])') if (window.innerWidth < 575) { if (crumbs.length !== 1) { crumbs.forEach((crumb) => { crumb.classList.add('d-none') }) this._insertExpandButton() } } else { if (crumbList.scrollWidth > crumbList.offsetWidth || crumbs.length > 5) { crumbs.forEach((crumb, index) => { if (index > 0 && index < crumbs.length - 1) { crumb.classList.add('d-none') } }) this._insertExpandButton() } } } } /** * Insere botao de expandir * @private */ _insertExpandButton() { const crumb = this._createCrumb() const crumbList = this.component.querySelector('.crumb-list') const crumbs = crumbList.querySelectorAll('.crumb') crumbList.insertBefore(crumb, crumbs[1]) for (const itemTabindex of this.component.querySelectorAll('[aria-current="page"]')) { itemTabindex.setAttribute('tabindex', '-1') } } /** * Reinicia componente * @private */ _reset() { this.component.querySelectorAll('.crumb-list .crumb').forEach((crumb) => { if (crumb.classList.contains('menu-mobil')) { crumb.remove() for (const itemTabindex of this.component.querySelectorAll('[aria-current="page"]')) { itemTabindex.setAttribute('tabindex', '0') } } else { crumb.classList.remove('d-none') } }) } /** * Insere elementos * @private */ _createCrumb() { const crumb = document.createElement('li') crumb.classList.add('crumb', 'menu-mobil') crumb.setAttribute('data-toggle', 'dropdown') const button = document.createElement('button') button.classList.add('br-button', 'circle') button.setAttribute('aria-label', 'Abrir menu Breadcrumb') const span = document.createElement('span') span.classList.add('sr-only') span.innerHTML = 'Botão Menu' const folderIcon = document.createElement('i') folderIcon.classList.add('fas', 'fa-folder-plus') const chevronIcon = document.createElement('i') chevronIcon.classList.add('icon', 'fas', 'fa-chevron-right') crumb.appendChild(chevronIcon) crumb.appendChild(button) button.appendChild(span) button.appendChild(folderIcon) crumb.addEventListener('click', () => { let card = this.component.querySelector('.br-card') if (card) { folderIcon.classList.remove('fas', 'fa-folder-minus') folderIcon.classList.add('fas', 'fa-folder-plus') button.setAttribute('aria-label', 'Breadcrumb menu fechado') this.component.querySelector('.br-card').remove() } else { folderIcon.classList.remove('fas', 'fa-folder-plus') folderIcon.classList.add('fas', 'fa-folder-minus') button.setAttribute('aria-label', 'Breadcrumb menu aberto') card = this._createList() this.component.appendChild(card) } }) return crumb } /** * Cria lista * @private */ _createList() { const card = document.createElement('nav') card.classList.add('br-card') this.component.querySelectorAll('.crumb-list .crumb').forEach((crumb) => { if (crumb.classList.contains('d-none')) { const item = document.createElement('div') item.classList.add('br-item') if (!crumb.classList.contains('home')) { item.appendChild(crumb.querySelector('a').cloneNode(true)) card.appendChild(item) } } }) return card } } export default BRBreadcrumb