189 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
| /**
 | |
|  * Copyright © Magento, Inc. All rights reserved.
 | |
|  * See COPYING.txt for license details.
 | |
|  */
 | |
| 
 | |
| define([
 | |
|     'jquery',
 | |
|     'jquery-ui-modules/widget'
 | |
| ], function ($) {
 | |
|     'use strict';
 | |
| 
 | |
|     $.widget('mage.toggleAdvanced', {
 | |
|         options: {
 | |
|             baseToggleClass: 'active' // Class used to be toggled on clicked element
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Toggle creation
 | |
|          * @private
 | |
|          */
 | |
|         _create: function () {
 | |
|             this.beforeCreate();
 | |
|             this._bindCore();
 | |
|             this.afterCreate();
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          *  Core bound events & setup
 | |
|          * @protected
 | |
|          */
 | |
|         _bindCore: function () {
 | |
|             var widget = this;
 | |
| 
 | |
|             this.element.on('click', $.proxy(function (e) {
 | |
|                 widget._onClick();
 | |
|                 e.preventDefault();
 | |
|             }, this));
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Binding Click event
 | |
|          *
 | |
|          * @protected
 | |
|          */
 | |
|         _onClick: function () {
 | |
|             this._prepareOptions();
 | |
|             this._toggleSelectors();
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method used to look for data attributes to override default options
 | |
|          *
 | |
|          * @protected
 | |
|          */
 | |
|         _prepareOptions: function () {
 | |
|             this.options.baseToggleClass = this.element.data('base-toggle-class') ?
 | |
|                 this.element.data('base-toggle-class') : this.options.baseToggleClass;
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method responsible for hiding and revealing specified DOM elements
 | |
|          * Toggle the class on clicked element
 | |
|          *
 | |
|          * @protected
 | |
|          */
 | |
|         _toggleSelectors: function () {
 | |
|             this.element.toggleClass(this.options.baseToggleClass);
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method used to inject 3rd party functionality before create
 | |
|          * @public
 | |
|          */
 | |
|         beforeCreate: function () {},
 | |
| 
 | |
|         /**
 | |
|          * Method used to inject 3rd party functionality after create
 | |
|          * @public
 | |
|          */
 | |
|         afterCreate: function () {}
 | |
|     });
 | |
| 
 | |
|     // Extension for mage.toggle - Adding selectors support for other DOM elements we wish to toggle
 | |
|     $.widget('mage.toggleAdvanced', $.mage.toggleAdvanced, {
 | |
| 
 | |
|         options: {
 | |
|             selectorsToggleClass: 'hidden',    // Class used to be toggled on selectors DOM elements
 | |
|             toggleContainers: null
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method responsible for hiding and revealing specified DOM elements
 | |
|          * If data-toggle-selectors attribute is present - toggle will be done on these selectors
 | |
|          * Otherwise we toggle the class on clicked element
 | |
|          *
 | |
|          * @protected
 | |
|          * @override
 | |
|          */
 | |
|         _toggleSelectors: function () {
 | |
|             this._super();
 | |
| 
 | |
|             if (this.options.toggleContainers) {
 | |
|                 $(this.options.toggleContainers).toggleClass(this.options.selectorsToggleClass);
 | |
|             } else {
 | |
|                 this.element.toggleClass(this.options.baseToggleClass);
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method used to look for data attributes to override default options
 | |
|          *
 | |
|          * @protected
 | |
|          * @override
 | |
|          */
 | |
|         _prepareOptions: function () {
 | |
|             this.options.selectorsToggleClass = this.element.data('selectors-toggle-class') ?
 | |
|                 this.element.data('selectors-toggle-class') : this.options.selectorsToggleClass;
 | |
|             this.options.toggleContainers = this.element.data('toggle-selectors') ?
 | |
|                 this.element.data('toggle-selectors') : this.options.toggleContainers;
 | |
|             this._super();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     // Extension for mage.toggle - Adding label toggle
 | |
|     $.widget('mage.toggleAdvanced', $.mage.toggleAdvanced, {
 | |
| 
 | |
|         options: {
 | |
|             newLabel: null,             // Text of the new label to be used on toggle
 | |
|             curLabel: null,             // Text of the old label to be used on toggle
 | |
|             currentLabelElement: null   // Current label container
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Binding Click event
 | |
|          *
 | |
|          * @protected
 | |
|          * @override
 | |
|          */
 | |
|         _onClick: function () {
 | |
|             this._super();
 | |
|             this._toggleLabel();
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method responsible for replacing clicked element labels
 | |
|          * @protected
 | |
|          */
 | |
|         _toggleLabel: function () {
 | |
|             var cachedLabel, currentLabelSelector;
 | |
| 
 | |
|             if (this.options.newLabel) {
 | |
|                 cachedLabel = this.options.newLabel;
 | |
|                 currentLabelSelector = this.options.currentLabelElement ?
 | |
|                         $(this.options.currentLabelElement) : this.element;
 | |
| 
 | |
|                 this.element.data('toggle-label', this.options.curLabel);
 | |
|                 currentLabelSelector.html(this.options.newLabel);
 | |
| 
 | |
|                 this.options.curLabel = this.options.newLabel;
 | |
|                 this.options.newLabel = cachedLabel;
 | |
|             }
 | |
|         },
 | |
| 
 | |
|         /**
 | |
|          * Method used to look for data attributes to override default options
 | |
|          *
 | |
|          * @protected
 | |
|          * @override
 | |
|          */
 | |
|         _prepareOptions: function () {
 | |
|             this.options.newLabel = this.element.data('toggle-label') ?
 | |
|                 this.element.data('toggle-label') : this.options.newLabel;
 | |
| 
 | |
|             this.options.currentLabelElement = this.element.data('current-label-el') ?
 | |
|                 this.element.data('current-label-el') : this.options.currentLabelElement;
 | |
| 
 | |
|             if (!this.options.currentLabelElement) {
 | |
|                 this.options.currentLabelElement = this.element;
 | |
|             }
 | |
| 
 | |
|             this.options.curLabel = $(this.options.currentLabelElement).html();
 | |
| 
 | |
|             this._super();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     return $.mage.toggleAdvanced;
 | |
| });
 |