annotate core/misc/vertical-tabs.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 1fec387a4317
children
rev   line source
Chris@0 1 /**
Chris@0 2 * DO NOT EDIT THIS FILE.
Chris@0 3 * See the following change record for more information,
Chris@0 4 * https://www.drupal.org/node/2815083
Chris@0 5 * @preserve
Chris@0 6 **/
Chris@0 7
Chris@0 8 (function ($, Drupal, drupalSettings) {
Chris@0 9 var handleFragmentLinkClickOrHashChange = function handleFragmentLinkClickOrHashChange(e, $target) {
Chris@0 10 $target.parents('.vertical-tabs__pane').each(function (index, pane) {
Chris@0 11 $(pane).data('verticalTab').focus();
Chris@0 12 });
Chris@0 13 };
Chris@0 14
Chris@0 15 Drupal.behaviors.verticalTabs = {
Chris@0 16 attach: function attach(context) {
Chris@0 17 var width = drupalSettings.widthBreakpoint || 640;
Chris@0 18 var mq = '(max-width: ' + width + 'px)';
Chris@0 19
Chris@0 20 if (window.matchMedia(mq).matches) {
Chris@0 21 return;
Chris@0 22 }
Chris@0 23
Chris@0 24 $('body').once('vertical-tabs-fragments').on('formFragmentLinkClickOrHashChange.verticalTabs', handleFragmentLinkClickOrHashChange);
Chris@0 25
Chris@0 26 $(context).find('[data-vertical-tabs-panes]').once('vertical-tabs').each(function () {
Chris@0 27 var $this = $(this).addClass('vertical-tabs__panes');
Chris@0 28 var focusID = $this.find(':hidden.vertical-tabs__active-tab').val();
Chris@14 29 var tabFocus = void 0;
Chris@0 30
Chris@0 31 var $details = $this.find('> details');
Chris@0 32 if ($details.length === 0) {
Chris@0 33 return;
Chris@0 34 }
Chris@0 35
Chris@14 36 var tabList = $('<ul class="vertical-tabs__menu"></ul>');
Chris@14 37 $this.wrap('<div class="vertical-tabs clearfix"></div>').before(tabList);
Chris@0 38
Chris@0 39 $details.each(function () {
Chris@0 40 var $that = $(this);
Chris@14 41 var verticalTab = new Drupal.verticalTab({
Chris@0 42 title: $that.find('> summary').text(),
Chris@0 43 details: $that
Chris@0 44 });
Chris@14 45 tabList.append(verticalTab.item);
Chris@14 46 $that.removeClass('collapsed').attr('open', true).addClass('vertical-tabs__pane').data('verticalTab', verticalTab);
Chris@0 47 if (this.id === focusID) {
Chris@14 48 tabFocus = $that;
Chris@0 49 }
Chris@0 50 });
Chris@0 51
Chris@14 52 $(tabList).find('> li').eq(0).addClass('first');
Chris@14 53 $(tabList).find('> li').eq(-1).addClass('last');
Chris@0 54
Chris@14 55 if (!tabFocus) {
Chris@0 56 var $locationHash = $this.find(window.location.hash);
Chris@0 57 if (window.location.hash && $locationHash.length) {
Chris@14 58 tabFocus = $locationHash.closest('.vertical-tabs__pane');
Chris@0 59 } else {
Chris@14 60 tabFocus = $this.find('> .vertical-tabs__pane').eq(0);
Chris@0 61 }
Chris@0 62 }
Chris@14 63 if (tabFocus.length) {
Chris@14 64 tabFocus.data('verticalTab').focus();
Chris@0 65 }
Chris@0 66 });
Chris@0 67 }
Chris@0 68 };
Chris@0 69
Chris@0 70 Drupal.verticalTab = function (settings) {
Chris@0 71 var self = this;
Chris@0 72 $.extend(this, settings, Drupal.theme('verticalTab', settings));
Chris@0 73
Chris@0 74 this.link.attr('href', '#' + settings.details.attr('id'));
Chris@0 75
Chris@0 76 this.link.on('click', function (e) {
Chris@0 77 e.preventDefault();
Chris@0 78 self.focus();
Chris@0 79 });
Chris@0 80
Chris@0 81 this.link.on('keydown', function (event) {
Chris@0 82 if (event.keyCode === 13) {
Chris@0 83 event.preventDefault();
Chris@0 84 self.focus();
Chris@0 85
Chris@0 86 $('.vertical-tabs__pane :input:visible:enabled').eq(0).trigger('focus');
Chris@0 87 }
Chris@0 88 });
Chris@0 89
Chris@0 90 this.details.on('summaryUpdated', function () {
Chris@0 91 self.updateSummary();
Chris@0 92 }).trigger('summaryUpdated');
Chris@0 93 };
Chris@0 94
Chris@0 95 Drupal.verticalTab.prototype = {
Chris@0 96 focus: function focus() {
Chris@0 97 this.details.siblings('.vertical-tabs__pane').each(function () {
Chris@0 98 var tab = $(this).data('verticalTab');
Chris@0 99 tab.details.hide();
Chris@0 100 tab.item.removeClass('is-selected');
Chris@0 101 }).end().show().siblings(':hidden.vertical-tabs__active-tab').val(this.details.attr('id'));
Chris@0 102 this.item.addClass('is-selected');
Chris@0 103
Chris@0 104 $('#active-vertical-tab').remove();
Chris@0 105 this.link.append('<span id="active-vertical-tab" class="visually-hidden">' + Drupal.t('(active tab)') + '</span>');
Chris@0 106 },
Chris@0 107 updateSummary: function updateSummary() {
Chris@0 108 this.summary.html(this.details.drupalGetSummary());
Chris@0 109 },
Chris@0 110 tabShow: function tabShow() {
Chris@0 111 this.item.show();
Chris@0 112
Chris@0 113 this.item.closest('.js-form-type-vertical-tabs').show();
Chris@0 114
Chris@0 115 this.item.parent().children('.vertical-tabs__menu-item').removeClass('first').filter(':visible').eq(0).addClass('first');
Chris@0 116
Chris@0 117 this.details.removeClass('vertical-tab--hidden').show();
Chris@0 118
Chris@0 119 this.focus();
Chris@0 120 return this;
Chris@0 121 },
Chris@0 122 tabHide: function tabHide() {
Chris@0 123 this.item.hide();
Chris@0 124
Chris@0 125 this.item.parent().children('.vertical-tabs__menu-item').removeClass('first').filter(':visible').eq(0).addClass('first');
Chris@0 126
Chris@0 127 this.details.addClass('vertical-tab--hidden').hide();
Chris@0 128
Chris@0 129 var $firstTab = this.details.siblings('.vertical-tabs__pane:not(.vertical-tab--hidden)').eq(0);
Chris@0 130 if ($firstTab.length) {
Chris@0 131 $firstTab.data('verticalTab').focus();
Chris@0 132 } else {
Chris@0 133 this.item.closest('.js-form-type-vertical-tabs').hide();
Chris@0 134 }
Chris@0 135 return this;
Chris@0 136 }
Chris@0 137 };
Chris@0 138
Chris@0 139 Drupal.theme.verticalTab = function (settings) {
Chris@0 140 var tab = {};
Chris@0 141 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>')));
Chris@0 142 return tab;
Chris@0 143 };
Chris@0 144 })(jQuery, Drupal, drupalSettings);