vendor/assets/js/foundation.dropdownMenu.js.es6 in foundation-rails-6.3.1.0 vs vendor/assets/js/foundation.dropdownMenu.js.es6 in foundation-rails-6.4.1.0

- old
+ new

@@ -1,34 +1,41 @@ 'use strict'; -!function($) { +import $ from 'jquery'; +import { Keyboard } from './foundation.util.keyboard'; +import { Nest } from './foundation.util.nest'; +import { Box } from './foundation.util.box'; +import { rtl as Rtl } from './foundation.util.core'; +import { Plugin } from './foundation.plugin'; + /** * DropdownMenu module. * @module foundation.dropdown-menu * @requires foundation.util.keyboard * @requires foundation.util.box * @requires foundation.util.nest */ -class DropdownMenu { +class DropdownMenu extends Plugin { /** * Creates a new instance of DropdownMenu. * @class + * @name DropdownMenu * @fires DropdownMenu#init * @param {jQuery} element - jQuery object to make into a dropdown menu. * @param {Object} options - Overrides to the default plugin settings. */ - constructor(element, options) { + _setup(element, options) { this.$element = element; this.options = $.extend({}, DropdownMenu.defaults, this.$element.data(), options); + this.className = 'DropdownMenu'; // ie9 back compat - Foundation.Nest.Feather(this.$element, 'dropdown'); + Nest.Feather(this.$element, 'dropdown'); this._init(); - Foundation.registerPlugin(this, 'DropdownMenu'); - Foundation.Keyboard.register('DropdownMenu', { + Keyboard.register('DropdownMenu', { 'ENTER': 'open', 'SPACE': 'open', 'ARROW_RIGHT': 'next', 'ARROW_UP': 'up', 'ARROW_DOWN': 'down', @@ -48,24 +55,37 @@ this.$menuItems = this.$element.find('[role="menuitem"]'); this.$tabs = this.$element.children('[role="menuitem"]'); this.$tabs.find('ul.is-dropdown-submenu').addClass(this.options.verticalClass); - if (this.$element.hasClass(this.options.rightClass) || this.options.alignment === 'right' || Foundation.rtl() || this.$element.parents('.top-bar-right').is('*')) { - this.options.alignment = 'right'; - subs.addClass('opens-left'); + if (this.options.alignment === 'auto') { + if (this.$element.hasClass(this.options.rightClass) || Rtl() || this.$element.parents('.top-bar-right').is('*')) { + this.options.alignment = 'right'; + subs.addClass('opens-left'); + } else { + this.options.alignment = 'left'; + subs.addClass('opens-right'); + } } else { - subs.addClass('opens-right'); + if (this.options.alignment === 'right') { + subs.addClass('opens-left'); + } else { + subs.addClass('opens-right'); + } } this.changed = false; this._events(); }; _isVertical() { - return this.$tabs.css('display') === 'block'; + return this.$tabs.css('display') === 'block' || this.$element.css('flex-direction') === 'column'; } + _isRtl() { + return this.$element.hasClass('align-right') || (Rtl() && !this.$element.hasClass('align-left')); + } + /** * Adds event listeners to elements within the menu * @private * @function */ @@ -177,21 +197,21 @@ }; var functions = { open: openSub, close: function() { _this._hide(_this.$element); - _this.$menuItems.find('a:first').focus(); // focus to first element + _this.$menuItems.eq(0).children('a').focus(); // focus to first element e.preventDefault(); }, handled: function() { e.stopImmediatePropagation(); } }; if (isTab) { if (_this._isVertical()) { // vertical menu - if (Foundation.rtl()) { // right aligned + if (_this._isRtl()) { // right aligned $.extend(functions, { down: nextSibling, up: prevSibling, next: closeSub, previous: openSub @@ -203,11 +223,11 @@ next: openSub, previous: closeSub }); } } else { // horizontal menu - if (Foundation.rtl()) { // right aligned + if (_this._isRtl()) { // right aligned $.extend(functions, { next: prevSibling, previous: nextSibling, down: openSub, up: closeSub @@ -220,11 +240,11 @@ up: closeSub }); } } } else { // not tabs -> one sub - if (Foundation.rtl()) { // right aligned + if (_this._isRtl()) { // right aligned $.extend(functions, { next: closeSub, previous: openSub, down: nextSibling, up: prevSibling @@ -236,11 +256,11 @@ down: nextSibling, up: prevSibling }); } } - Foundation.Keyboard.handleKey(e, 'DropdownMenu', functions); + Keyboard.handleKey(e, 'DropdownMenu', functions); }); } /** @@ -274,16 +294,16 @@ })); var $sibs = $sub.parent('li.is-dropdown-submenu-parent').siblings('li.is-dropdown-submenu-parent'); this._hide($sibs, idx); $sub.css('visibility', 'hidden').addClass('js-dropdown-active') .parent('li.is-dropdown-submenu-parent').addClass('is-active'); - var clear = Foundation.Box.ImNotTouchingYou($sub, null, true); + var clear = Box.ImNotTouchingYou($sub, null, true); if (!clear) { var oldClass = this.options.alignment === 'left' ? '-right' : '-left', $parentLi = $sub.parent('.is-dropdown-submenu-parent'); $parentLi.removeClass(`opens${oldClass}`).addClass(`opens-${this.options.alignment}`); - clear = Foundation.Box.ImNotTouchingYou($sub, null, true); + clear = Box.ImNotTouchingYou($sub, null, true); if (!clear) { $parentLi.removeClass(`opens-${this.options.alignment}`).addClass('opens-inner'); } this.changed = true; } @@ -341,16 +361,15 @@ /** * Destroys the plugin. * @function */ - destroy() { + _destroy() { this.$menuItems.off('.zf.dropdownmenu').removeAttr('data-is-click') .removeClass('is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner'); $(document.body).off('.zf.dropdownmenu'); - Foundation.Nest.Burn(this.$element, 'dropdown'); - Foundation.unregisterPlugin(this); + Nest.Burn(this.$element, 'dropdown'); } } /** * Default settings for plugin @@ -391,16 +410,16 @@ * @default 500 */ closingTime: 500, /** - * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'left'` or `'right'`. + * Position of the menu relative to what direction the submenus should open. Handled by JS. Can be `'auto'`, `'left'` or `'right'`. * @option * @type {string} - * @default 'left' + * @default 'auto' */ - alignment: 'left', + alignment: 'auto', /** * Allow clicks on the body to close any open submenus. * @option * @type {boolean} * @default true @@ -434,9 +453,6 @@ * @default true */ forceFollow: true }; -// Window exports -Foundation.plugin(DropdownMenu, 'DropdownMenu'); - -}(jQuery); +export {DropdownMenu};