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};