diff --git a/blocks/tabs/assets/tabs.js b/blocks/tabs/assets/tabs.js index 5342ad3..2ae7e81 100644 --- a/blocks/tabs/assets/tabs.js +++ b/blocks/tabs/assets/tabs.js @@ -4,6 +4,8 @@ class Tabs { constructor(wrapper) { this.loadElements(wrapper); + this.addAriaControls(); + this.setTabByHash(); this.setTabActiveState(); this.addEventListeners(); } @@ -14,6 +16,41 @@ class Tabs { this.elements.pattern = wrapper.next().find('.tabs__pattern'); } + addAriaControls() { + this.elements.tab.each( + (index) => { + const tab = this.elements.tab.eq(index); + const pattern = this.elements.pattern.eq(index); + + tab.attr('aria-controls', pattern.attr('id')); + } + ); + } + + setTabByHash() { + const hash = location.hash; + + if (!hash) { + return; + } + + this.elements.pattern.each( + (index) => { + const pattern = this.elements.pattern.eq(index); + + if (pattern.is(hash)) { + this.setActiveTab(index); + return false; + } + + if (pattern.find(hash).length) { + this.setActiveTab(index); + return false; + } + } + ); + } + setTabActiveState() { this.elements.tab.removeClass('tabs__tab--active'); this.elements.pattern.prop('hidden', true); @@ -31,9 +68,20 @@ class Tabs { addEventListeners() { this.elements.tab.on( 'click', + (event) => { + const tab = jQuery(event.currentTarget); + const patternId = tab.attr('aria-controls'); + + history.pushState({}, '', '#' + patternId); + this.setTabByHash(); + this.setTabActiveState(); + } + ); + + window.addEventListener( + 'popstate', () => { - const index = this.elements.tab.index(event.currentTarget); - this.setActiveTab(index); + this.setTabByHash(); this.setTabActiveState(); } ); diff --git a/blocks/tabs/templates/block.php b/blocks/tabs/templates/block.php index 105d055..22060d3 100644 --- a/blocks/tabs/templates/block.php +++ b/blocks/tabs/templates/block.php @@ -85,11 +85,13 @@ class="tabs__tabs" + +