270 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
define([
 | 
						|
    'jquery',
 | 
						|
    'jquery/ui',
 | 
						|
    'jquery/jstree/jquery.jstree',
 | 
						|
    'mage/backend/suggest'
 | 
						|
], function ($) {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    /* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
 | 
						|
    var hover_node, dehover_node, select_node, init;
 | 
						|
 | 
						|
    $.extend(true, $, {
 | 
						|
        // @TODO: Move method 'treeToList' in file with utility functions
 | 
						|
        mage: {
 | 
						|
            /**
 | 
						|
             * @param {Array} list
 | 
						|
             * @param {Object} nodes
 | 
						|
             * @param {*} level
 | 
						|
             * @param {*} path
 | 
						|
             * @return {*}
 | 
						|
             */
 | 
						|
            treeToList: function (list, nodes, level, path) {
 | 
						|
                $.each(nodes, function () {
 | 
						|
                    if (typeof this === 'object') {
 | 
						|
                        list.push({
 | 
						|
                            label: this.label,
 | 
						|
                            id: this.id,
 | 
						|
                            level: level,
 | 
						|
                            item: this,
 | 
						|
                            path: path + this.label
 | 
						|
                        });
 | 
						|
 | 
						|
                        if (this.children) {
 | 
						|
                            $.mage.treeToList(list, this.children, level + 1, path + this.label + ' / ');
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                });
 | 
						|
 | 
						|
                return list;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    hover_node = $.jstree.core.prototype.hover_node;
 | 
						|
    dehover_node = $.jstree.core.prototype.dehover_node;
 | 
						|
    select_node = $.jstree.core.prototype.select_node;
 | 
						|
    init = $.jstree.core.prototype.init;
 | 
						|
 | 
						|
    $.extend(true, $.jstree.core.prototype, {
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        init: function () {
 | 
						|
            this.get_container()
 | 
						|
                .show()
 | 
						|
                .on('keydown', $.proxy(function (e) {
 | 
						|
                    var o;
 | 
						|
 | 
						|
                    if (e.keyCode === $.ui.keyCode.ENTER) {
 | 
						|
                        o = this.data.ui.hovered || this.data.ui.last_selected || -1;
 | 
						|
                        this.select_node(o, true);
 | 
						|
                    }
 | 
						|
                }, this));
 | 
						|
            init.call(this);
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        hover_node: function (obj) {
 | 
						|
            hover_node.apply(this, arguments);
 | 
						|
            obj = this._get_node(obj);
 | 
						|
 | 
						|
            if (!obj.length) {
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            this.get_container().trigger('hover_node', [{
 | 
						|
                item: obj.find('a:first')
 | 
						|
            }]);
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        dehover_node: function () {
 | 
						|
            dehover_node.call(this);
 | 
						|
            this.get_container().trigger('dehover_node');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        select_node: function (o) {
 | 
						|
            var node;
 | 
						|
 | 
						|
            select_node.apply(this, arguments);
 | 
						|
            node = this._get_node(o);
 | 
						|
 | 
						|
            (node ? $(node) : this.data.ui.last_selected)
 | 
						|
                .trigger('select_tree_node');
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    $.widget('mage.treeSuggest', $.mage.suggest, {
 | 
						|
        widgetEventPrefix: 'suggest',
 | 
						|
        options: {
 | 
						|
            template:
 | 
						|
                '<% if (data.items.length) { %>' +
 | 
						|
                    '<% if (data.allShown()) { %>' +
 | 
						|
                        '<% if (typeof data.nested === "undefined") { %>' +
 | 
						|
                            '<div style="display:none;" data-mage-init="{"jstree":{"plugins":["themes","html_data","ui","hotkeys"],"themes":{"theme":"default","dots":false,"icons":false}}}">' + //eslint-disable-line max-len
 | 
						|
                        '<% } %>' +
 | 
						|
                        '<ul>' +
 | 
						|
                            '<% _.each(data.items, function(value) { %>' +
 | 
						|
                                '<li class="<% if (data.itemSelected(value)) { %>mage-suggest-selected<% } %>' +
 | 
						|
                '                   <% if (value.is_active == 0) { %> mage-suggest-not-active<% } %>">' +
 | 
						|
                                    '<a href="#" <%= data.optionData(value) %>><%- value.label %></a>' +
 | 
						|
                                    '<% if (value.children && value.children.length) { %>' +
 | 
						|
                                        '<%= data.renderTreeLevel(value.children) %>' +
 | 
						|
                                    '<% } %>' +
 | 
						|
                                '</li>' +
 | 
						|
                            '<% }); %>' +
 | 
						|
                        '</ul>' +
 | 
						|
                        '<% if (typeof data.nested === "undefined") { %>' +
 | 
						|
                            '</div>' +
 | 
						|
                        '<% } %>' +
 | 
						|
                    '<% } else { %>' +
 | 
						|
                        '<ul data-mage-init="{"menu":[]}">' +
 | 
						|
                            '<% _.each(data.items, function(value) { %>' +
 | 
						|
                                '<% if (!data.itemSelected(value)) {%>' +
 | 
						|
                                    '<li <%= data.optionData(value) %>>' +
 | 
						|
                                        '<a href="#">' +
 | 
						|
                                            '<span class="category-label"><%- value.label %></span>' +
 | 
						|
                                            '<span class="category-path"><%- value.path %></span>' +
 | 
						|
                                        '</a>' +
 | 
						|
                                    '</li>' +
 | 
						|
                                '<% } %>' +
 | 
						|
                            '<% }); %>' +
 | 
						|
                        '</ul>' +
 | 
						|
                    '<% } %>' +
 | 
						|
                '<% } else { %>' +
 | 
						|
                    '<span class="mage-suggest-no-records"><%- data.noRecordsText %></span>' +
 | 
						|
                '<% } %>',
 | 
						|
            controls: {
 | 
						|
                selector: ':ui-menu, :mage-menu, .jstree',
 | 
						|
                eventsMap: {
 | 
						|
                    focus: ['menufocus', 'hover_node'],
 | 
						|
                    blur: ['menublur', 'dehover_node'],
 | 
						|
                    select: ['menuselect', 'select_tree_node']
 | 
						|
                }
 | 
						|
            }
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        _bind: function () {
 | 
						|
            this._super();
 | 
						|
            this._on({
 | 
						|
                /**
 | 
						|
                 * @param {jQuery.Event} event
 | 
						|
                 */
 | 
						|
                keydown: function (event) {
 | 
						|
                    var keyCode = $.ui.keyCode;
 | 
						|
 | 
						|
                    switch (event.keyCode) {
 | 
						|
                        case keyCode.LEFT:
 | 
						|
                        case keyCode.RIGHT:
 | 
						|
 | 
						|
                            if (this.isDropdownShown()) {
 | 
						|
                                event.preventDefault();
 | 
						|
                                this._proxyEvents(event);
 | 
						|
                            }
 | 
						|
                            break;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            });
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        close: function (e) {
 | 
						|
            var eType = e ? e.type : null;
 | 
						|
 | 
						|
            if (eType === 'select_tree_node') {
 | 
						|
                this.element.focus();
 | 
						|
            } else {
 | 
						|
                this._superApply(arguments);
 | 
						|
            }
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        _filterSelected: function (items, context) {
 | 
						|
            if (context._allShown) {
 | 
						|
                return items;
 | 
						|
            }
 | 
						|
 | 
						|
            return this._superApply(arguments);
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        _prepareDropdownContext: function () {
 | 
						|
            var context = this._superApply(arguments),
 | 
						|
                optionData = context.optionData,
 | 
						|
                templates = this.templates,
 | 
						|
                tmplName = this.templateName;
 | 
						|
 | 
						|
            /**
 | 
						|
             * @param {Object} item
 | 
						|
             * @return {*|String}
 | 
						|
             */
 | 
						|
            context.optionData = function (item) {
 | 
						|
                item = $.extend({}, item);
 | 
						|
                delete item.children;
 | 
						|
 | 
						|
                return optionData(item);
 | 
						|
            };
 | 
						|
 | 
						|
            return $.extend(context, {
 | 
						|
                /**
 | 
						|
                 * @param {*} children
 | 
						|
                 * @return {*|jQuery}
 | 
						|
                 */
 | 
						|
                renderTreeLevel: function (children) {
 | 
						|
                    var _context = $.extend({}, this, {
 | 
						|
                        items: children,
 | 
						|
                        nested: true
 | 
						|
                    }),
 | 
						|
                    tmpl = templates[tmplName];
 | 
						|
 | 
						|
                    tmpl = tmpl({
 | 
						|
                        data: _context
 | 
						|
                    });
 | 
						|
 | 
						|
                    return $('<div>').append($(tmpl)).html();
 | 
						|
                }
 | 
						|
            });
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * @override
 | 
						|
         */
 | 
						|
        _processResponse: function (e, items, context) {
 | 
						|
            var control;
 | 
						|
 | 
						|
            if (context && !context._allShown) {
 | 
						|
                items = this.filter($.mage.treeToList([], items, 0, ''), this._term);
 | 
						|
            }
 | 
						|
            control = this.dropdown.find(this._control.selector);
 | 
						|
 | 
						|
            if (control.length && control.hasClass('jstree')) {
 | 
						|
                control.jstree('destroy');
 | 
						|
            }
 | 
						|
            this._superApply([e, items, context]);
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    return $.mage.treeSuggest;
 | 
						|
});
 |