149 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
| /**
 | |
|  * Copyright © Magento, Inc. All rights reserved.
 | |
|  * See COPYING.txt for license details.
 | |
|  */
 | |
| 
 | |
| define([
 | |
|     'jquery'
 | |
| ], function ($) {
 | |
|     'use strict';
 | |
| 
 | |
|     /**
 | |
|      * @param {Object} options
 | |
|      */
 | |
|     $.fn.dropdown = function (options) {
 | |
|         var defaults = {
 | |
|                 parent: null,
 | |
|                 autoclose: true,
 | |
|                 btnArrow: '.arrow',
 | |
|                 menu: '[data-target="dropdown"]',
 | |
|                 activeClass: 'active'
 | |
|             },
 | |
|             actionElem = $(this),
 | |
|             self = this;
 | |
| 
 | |
|         options = $.extend(defaults, options);
 | |
|         actionElem = $(this);
 | |
|         self = this;
 | |
| 
 | |
|         /**
 | |
|          * @param {HTMLElement} elem
 | |
|          */
 | |
|         this.openDropdown = function (elem) {
 | |
|             elem
 | |
|                 .addClass(options.activeClass)
 | |
|                 .attr('aria-expanded', true)
 | |
|                 .parent()
 | |
|                     .addClass(options.activeClass);
 | |
| 
 | |
|             elem.parent()
 | |
|                 .find(options.menu)
 | |
|                 .attr('aria-hidden', false);
 | |
| 
 | |
|             $(options.btnArrow, elem).text('-');
 | |
|         };
 | |
| 
 | |
|         /**
 | |
|          * @param {HTMLElement} elem
 | |
|          */
 | |
|         this.closeDropdown = function (elem) {
 | |
|             elem.removeClass(options.activeClass)
 | |
|                 .attr('aria-expanded', false)
 | |
|                 .parent()
 | |
|                     .removeClass(options.activeClass);
 | |
| 
 | |
|             elem.parent()
 | |
|                 .find(options.menu)
 | |
|                 .attr('aria-hidden', true);
 | |
| 
 | |
|             $(options.btnArrow, elem).text('+');
 | |
|         };
 | |
| 
 | |
|         /**
 | |
|          * Reset all dropdowns.
 | |
|          *
 | |
|          * @param {Object} param
 | |
|          */
 | |
|         this.reset = function (param) {
 | |
|             var params = param || {},
 | |
|                 dropdowns = params.elems || actionElem;
 | |
| 
 | |
|             dropdowns.each(function (index, elem) {
 | |
|                 self.closeDropdown($(elem));
 | |
|             });
 | |
|         };
 | |
| 
 | |
|         /* document Event bindings */
 | |
|         if (options.autoclose === true) {
 | |
|             $(document).on('click.hideDropdown', this.reset);
 | |
|             $(document).on('keyup.hideDropdown', function (e) {
 | |
|                 var ESC_CODE = '27';
 | |
| 
 | |
|                 if (e.keyCode == ESC_CODE) { //eslint-disable-line eqeqeq
 | |
|                     self.reset();
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         if (options.events) {
 | |
|             $.each(options.events, function (index, event) {
 | |
|                 $(document).on(event.name, event.selector, event.action);
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         return this.each(function () {
 | |
|             var elem = $(this),
 | |
|                 parent = $(options.parent).length > 0 ? $(options.parent) : elem.parent(),
 | |
|                 menu = $(options.menu, parent) || $('.dropdown-menu', parent);
 | |
| 
 | |
|             // ARIA (adding aria attributes)
 | |
|             if (menu.length) {
 | |
|                 elem.attr('aria-haspopup', true);
 | |
|             }
 | |
| 
 | |
|             if (!elem.hasClass(options.activeClass)) {
 | |
|                 elem.attr('aria-expanded', false);
 | |
|                 menu.attr('aria-hidden', true);
 | |
|             } else {
 | |
|                 elem.attr('aria-expanded', true);
 | |
|                 menu.attr('aria-hidden', false);
 | |
|             }
 | |
| 
 | |
|             if (!elem.is('a, button')) {
 | |
|                 elem.attr('role', 'button');
 | |
|                 elem.attr('tabindex', 0);
 | |
|             }
 | |
| 
 | |
|             if (elem.attr('data-trigger-keypress-button')) {
 | |
|                 elem.on('keypress', function (e) {
 | |
|                     var keyCode = e.keyCode || e.which,
 | |
|                         ENTER_CODE = 13;
 | |
| 
 | |
|                     if (keyCode === ENTER_CODE) {
 | |
|                         e.preventDefault();
 | |
|                         elem.trigger('click.toggleDropdown');
 | |
|                     }
 | |
|                 });
 | |
|             }
 | |
| 
 | |
|             elem.on('click.toggleDropdown', function () {
 | |
|                 var el = actionElem;
 | |
| 
 | |
|                 if (options.autoclose === true) {
 | |
|                     actionElem = $();
 | |
|                     $(document).trigger('click.hideDropdown');
 | |
|                     actionElem = el;
 | |
|                 }
 | |
| 
 | |
|                 self[el.hasClass(options.activeClass) ? 'closeDropdown' : 'openDropdown'](elem);
 | |
| 
 | |
|                 return false;
 | |
|             });
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     return function (data, el) {
 | |
|         $(el).dropdown(data);
 | |
|     };
 | |
| });
 |