140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * @deprecated since version 2.2.0
 | 
						|
 */
 | 
						|
define([
 | 
						|
    'jquery',
 | 
						|
    'mage/template',
 | 
						|
    'jquery-ui-modules/widget'
 | 
						|
], function ($, mageTemplate) {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    $.widget('mage.itemTable', {
 | 
						|
        options: {
 | 
						|
            addBlock: '[data-template="add-block"]',
 | 
						|
            addBlockData: {},
 | 
						|
            addEvent: 'click',
 | 
						|
            addSelector: '[data-role="add"]',
 | 
						|
            itemsSelector: '[data-container="items"]',
 | 
						|
            keepLastRow: true
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * This method adds a new instance of the block to the items.
 | 
						|
         * @private
 | 
						|
         */
 | 
						|
        _add: function () {
 | 
						|
            var hideShowDelete,
 | 
						|
                deletableItems,
 | 
						|
                addedBlock;
 | 
						|
 | 
						|
            // adding a new row, so increment the count to give each row a unique index
 | 
						|
            this.rowIndex++;
 | 
						|
 | 
						|
            // make sure the block data has the rowIndex
 | 
						|
            this.options.addBlockData.rowIndex = this.rowIndex;
 | 
						|
 | 
						|
            // render the form
 | 
						|
            addedBlock = $(this.addBlockTmpl({
 | 
						|
                data: this.options.addBlockData
 | 
						|
            }));
 | 
						|
 | 
						|
            // add the row to the item block
 | 
						|
            this.element.find(this.options.itemsSelector).append(addedBlock);
 | 
						|
 | 
						|
            // initialize all mage content
 | 
						|
            addedBlock.trigger('contentUpdated');
 | 
						|
 | 
						|
            // determine all existing items in the collection
 | 
						|
            deletableItems = this._getDeletableItems();
 | 
						|
 | 
						|
            // for the most part, show the delete mechanism, except in the case where there is only one it should not
 | 
						|
            // be deleted
 | 
						|
            hideShowDelete = 'showDelete';
 | 
						|
 | 
						|
            if (this.options.keepLastRow && deletableItems.length === 1) {
 | 
						|
                hideShowDelete = 'hideDelete';
 | 
						|
            }
 | 
						|
 | 
						|
            // loop through each control and perform that action on the deletable item
 | 
						|
            $.each(deletableItems, function (index) {
 | 
						|
                $(deletableItems[index]).trigger(hideShowDelete);
 | 
						|
            });
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * This method binds elements found in this widget.
 | 
						|
         * @private
 | 
						|
         */
 | 
						|
        _bind: function () {
 | 
						|
            var handlers = {};
 | 
						|
 | 
						|
            // since the first handler is dynamic, generate the object using array notation
 | 
						|
            handlers[this.options.addEvent + ' ' + this.options.addSelector] = '_add';
 | 
						|
            handlers.deleteItem = '_onDeleteItem';
 | 
						|
 | 
						|
            this._on(handlers);
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * This method constructs a new widget.
 | 
						|
         * @private
 | 
						|
         */
 | 
						|
        _create: function () {
 | 
						|
            this._bind();
 | 
						|
 | 
						|
            this.addBlockTmpl = mageTemplate(this.options.addBlock);
 | 
						|
 | 
						|
            // nothing in the table, so indicate that
 | 
						|
            this.rowIndex = -1;
 | 
						|
 | 
						|
            // make sure the block data is an object
 | 
						|
            if (this.options.addBlockData == null || typeof this.options.addBlockData !== 'object') {
 | 
						|
                // reset the block data to an empty object
 | 
						|
                this.options.addBlockData = {};
 | 
						|
            }
 | 
						|
 | 
						|
            // add the first row to the table
 | 
						|
            this._add();
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * This method returns the list of widgets associated with deletable items from the container (direct children
 | 
						|
         * only).
 | 
						|
         * @private
 | 
						|
         */
 | 
						|
        _getDeletableItems: function () {
 | 
						|
            return this.element.find(this.options.itemsSelector + '> .deletableItem');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * This method removes the item associated with the message.
 | 
						|
         * @private
 | 
						|
         */
 | 
						|
        _onDeleteItem: function (e) {
 | 
						|
            var deletableItems;
 | 
						|
 | 
						|
            // parent elements don't need to see this event
 | 
						|
            e.stopPropagation();
 | 
						|
 | 
						|
            // remove the deletable item
 | 
						|
            $(e.target).remove();
 | 
						|
 | 
						|
            if (this.options.keepLastRow) {
 | 
						|
                // determine if there is only one element remaining, in which case, disable the delete mechanism on it
 | 
						|
                deletableItems = this._getDeletableItems();
 | 
						|
 | 
						|
                if (deletableItems.length === 1) {
 | 
						|
                    $(deletableItems[0]).trigger('hideDelete');
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    return $.mage.itemTable;
 | 
						|
});
 |