89 lines
2.5 KiB
JavaScript
89 lines
2.5 KiB
JavaScript
/**
|
|
* @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);
|