/**
* @file
* Responsive navigation tabs.
*
* This also supports collapsible navigable is the 'is-collapsible' class is
* added to the main element, and a target element is included.
*/
(($, Drupal) => {
function init(i, tab) {
const $tab = $(tab);
const $target = $tab.find('[data-drupal-nav-tabs-target]');
const $active = $target.find('.js-active-tab');
const openMenu = () => {
$target.toggleClass('is-open');
};
const toggleOrder = (reset) => {
const current = $active.index();
const original = $active.data('original-order');
// Do not change order if already first or if already reset.
if (original === 0 || reset === (current === original)) {
return;
}
const siblings = {
first: '[data-original-order="0"]',
previous: `[data-original-order="${original - 1}"]`,
};
const $first = $target.find(siblings.first);
const $previous = $target.find(siblings.previous);
if (reset && current !== original) {
$active.insertAfter($previous);
} else if (!reset && current === original) {
$active.insertBefore($first);
}
};
const toggleCollapsed = () => {
if (window.matchMedia('(min-width: 48em)').matches) {
if ($tab.hasClass('is-horizontal') && !$tab.attr('data-width')) {
let width = 0;
$target.find('.js-tabs-link').each((index, value) => {
width += $(value).outerWidth();
});
$tab.attr('data-width', width);
}
// Collapse the tabs if the combined width of the tabs is greater than
// the width of the parent container.
const isHorizontal = $tab.attr('data-width') <= $tab.outerWidth();
$tab.toggleClass('is-horizontal', isHorizontal);
toggleOrder(isHorizontal);
} else {
toggleOrder(false);
}
};
$tab.addClass('position-container is-horizontal-enabled');
$target.find('.js-tab').each((index, element) => {
const $item = $(element);
$item.attr('data-original-order', $item.index());
});
$tab.on('click.tabs', '[data-drupal-nav-tabs-trigger]', openMenu);
$(window)
.on('resize.tabs', Drupal.debounce(toggleCollapsed, 150))
.trigger('resize.tabs');
}
/**
* Initialize the tabs JS.
*/
Drupal.behaviors.navTabs = {
attach(context) {
$(context)
.find('[data-drupal-nav-tabs].is-collapsible')
.once('nav-tabs')
.each((i, value) => {
$(value).each(init);
});
},
};
})(jQuery, Drupal);