Mercurial > hg > cmmr2012-drupal-site
diff core/misc/vertical-tabs.js @ 0:c75dbcec494b
Initial commit from drush-created site
| author | Chris Cannam |
|---|---|
| date | Thu, 05 Jul 2018 14:24:15 +0000 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/misc/vertical-tabs.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,144 @@ +/** +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ + +(function ($, Drupal, drupalSettings) { + var handleFragmentLinkClickOrHashChange = function handleFragmentLinkClickOrHashChange(e, $target) { + $target.parents('.vertical-tabs__pane').each(function (index, pane) { + $(pane).data('verticalTab').focus(); + }); + }; + + Drupal.behaviors.verticalTabs = { + attach: function attach(context) { + var width = drupalSettings.widthBreakpoint || 640; + var mq = '(max-width: ' + width + 'px)'; + + if (window.matchMedia(mq).matches) { + return; + } + + $('body').once('vertical-tabs-fragments').on('formFragmentLinkClickOrHashChange.verticalTabs', handleFragmentLinkClickOrHashChange); + + $(context).find('[data-vertical-tabs-panes]').once('vertical-tabs').each(function () { + var $this = $(this).addClass('vertical-tabs__panes'); + var focusID = $this.find(':hidden.vertical-tabs__active-tab').val(); + var tabFocus = void 0; + + var $details = $this.find('> details'); + if ($details.length === 0) { + return; + } + + var tabList = $('<ul class="vertical-tabs__menu"></ul>'); + $this.wrap('<div class="vertical-tabs clearfix"></div>').before(tabList); + + $details.each(function () { + var $that = $(this); + var verticalTab = new Drupal.verticalTab({ + title: $that.find('> summary').text(), + details: $that + }); + tabList.append(verticalTab.item); + $that.removeClass('collapsed').attr('open', true).addClass('vertical-tabs__pane').data('verticalTab', verticalTab); + if (this.id === focusID) { + tabFocus = $that; + } + }); + + $(tabList).find('> li').eq(0).addClass('first'); + $(tabList).find('> li').eq(-1).addClass('last'); + + if (!tabFocus) { + var $locationHash = $this.find(window.location.hash); + if (window.location.hash && $locationHash.length) { + tabFocus = $locationHash.closest('.vertical-tabs__pane'); + } else { + tabFocus = $this.find('> .vertical-tabs__pane').eq(0); + } + } + if (tabFocus.length) { + tabFocus.data('verticalTab').focus(); + } + }); + } + }; + + Drupal.verticalTab = function (settings) { + var self = this; + $.extend(this, settings, Drupal.theme('verticalTab', settings)); + + this.link.attr('href', '#' + settings.details.attr('id')); + + this.link.on('click', function (e) { + e.preventDefault(); + self.focus(); + }); + + this.link.on('keydown', function (event) { + if (event.keyCode === 13) { + event.preventDefault(); + self.focus(); + + $('.vertical-tabs__pane :input:visible:enabled').eq(0).trigger('focus'); + } + }); + + this.details.on('summaryUpdated', function () { + self.updateSummary(); + }).trigger('summaryUpdated'); + }; + + Drupal.verticalTab.prototype = { + focus: function focus() { + this.details.siblings('.vertical-tabs__pane').each(function () { + var tab = $(this).data('verticalTab'); + tab.details.hide(); + tab.item.removeClass('is-selected'); + }).end().show().siblings(':hidden.vertical-tabs__active-tab').val(this.details.attr('id')); + this.item.addClass('is-selected'); + + $('#active-vertical-tab').remove(); + this.link.append('<span id="active-vertical-tab" class="visually-hidden">' + Drupal.t('(active tab)') + '</span>'); + }, + updateSummary: function updateSummary() { + this.summary.html(this.details.drupalGetSummary()); + }, + tabShow: function tabShow() { + this.item.show(); + + this.item.closest('.js-form-type-vertical-tabs').show(); + + this.item.parent().children('.vertical-tabs__menu-item').removeClass('first').filter(':visible').eq(0).addClass('first'); + + this.details.removeClass('vertical-tab--hidden').show(); + + this.focus(); + return this; + }, + tabHide: function tabHide() { + this.item.hide(); + + this.item.parent().children('.vertical-tabs__menu-item').removeClass('first').filter(':visible').eq(0).addClass('first'); + + this.details.addClass('vertical-tab--hidden').hide(); + + var $firstTab = this.details.siblings('.vertical-tabs__pane:not(.vertical-tab--hidden)').eq(0); + if ($firstTab.length) { + $firstTab.data('verticalTab').focus(); + } else { + this.item.closest('.js-form-type-vertical-tabs').hide(); + } + return this; + } + }; + + Drupal.theme.verticalTab = function (settings) { + var tab = {}; + tab.item = $('<li class="vertical-tabs__menu-item" tabindex="-1"></li>').append(tab.link = $('<a href="#"></a>').append(tab.title = $('<strong class="vertical-tabs__menu-item-title"></strong>').text(settings.title)).append(tab.summary = $('<span class="vertical-tabs__menu-item-summary"></span>'))); + return tab; + }; +})(jQuery, Drupal, drupalSettings); \ No newline at end of file
