No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

270 líneas
8.8 KiB

  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define([
  6. 'jquery',
  7. 'jquery/ui',
  8. 'jquery/jstree/jquery.jstree',
  9. 'mage/backend/suggest'
  10. ], function ($) {
  11. 'use strict';
  12. /* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
  13. var hover_node, dehover_node, select_node, init;
  14. $.extend(true, $, {
  15. // @TODO: Move method 'treeToList' in file with utility functions
  16. mage: {
  17. /**
  18. * @param {Array} list
  19. * @param {Object} nodes
  20. * @param {*} level
  21. * @param {*} path
  22. * @return {*}
  23. */
  24. treeToList: function (list, nodes, level, path) {
  25. $.each(nodes, function () {
  26. if (typeof this === 'object') {
  27. list.push({
  28. label: this.label,
  29. id: this.id,
  30. level: level,
  31. item: this,
  32. path: path + this.label
  33. });
  34. if (this.children) {
  35. $.mage.treeToList(list, this.children, level + 1, path + this.label + ' / ');
  36. }
  37. }
  38. });
  39. return list;
  40. }
  41. }
  42. });
  43. hover_node = $.jstree.core.prototype.hover_node;
  44. dehover_node = $.jstree.core.prototype.dehover_node;
  45. select_node = $.jstree.core.prototype.select_node;
  46. init = $.jstree.core.prototype.init;
  47. $.extend(true, $.jstree.core.prototype, {
  48. /**
  49. * @override
  50. */
  51. init: function () {
  52. this.get_container()
  53. .show()
  54. .on('keydown', $.proxy(function (e) {
  55. var o;
  56. if (e.keyCode === $.ui.keyCode.ENTER) {
  57. o = this.data.ui.hovered || this.data.ui.last_selected || -1;
  58. this.select_node(o, true);
  59. }
  60. }, this));
  61. init.call(this);
  62. },
  63. /**
  64. * @override
  65. */
  66. hover_node: function (obj) {
  67. hover_node.apply(this, arguments);
  68. obj = this._get_node(obj);
  69. if (!obj.length) {
  70. return false;
  71. }
  72. this.get_container().trigger('hover_node', [{
  73. item: obj.find('a:first')
  74. }]);
  75. },
  76. /**
  77. * @override
  78. */
  79. dehover_node: function () {
  80. dehover_node.call(this);
  81. this.get_container().trigger('dehover_node');
  82. },
  83. /**
  84. * @override
  85. */
  86. select_node: function (o) {
  87. var node;
  88. select_node.apply(this, arguments);
  89. node = this._get_node(o);
  90. (node ? $(node) : this.data.ui.last_selected)
  91. .trigger('select_tree_node');
  92. }
  93. });
  94. $.widget('mage.treeSuggest', $.mage.suggest, {
  95. widgetEventPrefix: 'suggest',
  96. options: {
  97. template:
  98. '<% if (data.items.length) { %>' +
  99. '<% if (data.allShown()) { %>' +
  100. '<% if (typeof data.nested === "undefined") { %>' +
  101. '<div style="display:none;" data-mage-init="{&quot;jstree&quot;:{&quot;plugins&quot;:[&quot;themes&quot;,&quot;html_data&quot;,&quot;ui&quot;,&quot;hotkeys&quot;],&quot;themes&quot;:{&quot;theme&quot;:&quot;default&quot;,&quot;dots&quot;:false,&quot;icons&quot;:false}}}">' + //eslint-disable-line max-len
  102. '<% } %>' +
  103. '<ul>' +
  104. '<% _.each(data.items, function(value) { %>' +
  105. '<li class="<% if (data.itemSelected(value)) { %>mage-suggest-selected<% } %>' +
  106. ' <% if (value.is_active == 0) { %> mage-suggest-not-active<% } %>">' +
  107. '<a href="#" <%= data.optionData(value) %>><%- value.label %></a>' +
  108. '<% if (value.children && value.children.length) { %>' +
  109. '<%= data.renderTreeLevel(value.children) %>' +
  110. '<% } %>' +
  111. '</li>' +
  112. '<% }); %>' +
  113. '</ul>' +
  114. '<% if (typeof data.nested === "undefined") { %>' +
  115. '</div>' +
  116. '<% } %>' +
  117. '<% } else { %>' +
  118. '<ul data-mage-init="{&quot;menu&quot;:[]}">' +
  119. '<% _.each(data.items, function(value) { %>' +
  120. '<% if (!data.itemSelected(value)) {%>' +
  121. '<li <%= data.optionData(value) %>>' +
  122. '<a href="#">' +
  123. '<span class="category-label"><%- value.label %></span>' +
  124. '<span class="category-path"><%- value.path %></span>' +
  125. '</a>' +
  126. '</li>' +
  127. '<% } %>' +
  128. '<% }); %>' +
  129. '</ul>' +
  130. '<% } %>' +
  131. '<% } else { %>' +
  132. '<span class="mage-suggest-no-records"><%- data.noRecordsText %></span>' +
  133. '<% } %>',
  134. controls: {
  135. selector: ':ui-menu, :mage-menu, .jstree',
  136. eventsMap: {
  137. focus: ['menufocus', 'hover_node'],
  138. blur: ['menublur', 'dehover_node'],
  139. select: ['menuselect', 'select_tree_node']
  140. }
  141. }
  142. },
  143. /**
  144. * @override
  145. */
  146. _bind: function () {
  147. this._super();
  148. this._on({
  149. /**
  150. * @param {jQuery.Event} event
  151. */
  152. keydown: function (event) {
  153. var keyCode = $.ui.keyCode;
  154. switch (event.keyCode) {
  155. case keyCode.LEFT:
  156. case keyCode.RIGHT:
  157. if (this.isDropdownShown()) {
  158. event.preventDefault();
  159. this._proxyEvents(event);
  160. }
  161. break;
  162. }
  163. }
  164. });
  165. },
  166. /**
  167. * @override
  168. */
  169. close: function (e) {
  170. var eType = e ? e.type : null;
  171. if (eType === 'select_tree_node') {
  172. this.element.focus();
  173. } else {
  174. this._superApply(arguments);
  175. }
  176. },
  177. /**
  178. * @override
  179. */
  180. _filterSelected: function (items, context) {
  181. if (context._allShown) {
  182. return items;
  183. }
  184. return this._superApply(arguments);
  185. },
  186. /**
  187. * @override
  188. */
  189. _prepareDropdownContext: function () {
  190. var context = this._superApply(arguments),
  191. optionData = context.optionData,
  192. templates = this.templates,
  193. tmplName = this.templateName;
  194. /**
  195. * @param {Object} item
  196. * @return {*|String}
  197. */
  198. context.optionData = function (item) {
  199. item = $.extend({}, item);
  200. delete item.children;
  201. return optionData(item);
  202. };
  203. return $.extend(context, {
  204. /**
  205. * @param {*} children
  206. * @return {*|jQuery}
  207. */
  208. renderTreeLevel: function (children) {
  209. var _context = $.extend({}, this, {
  210. items: children,
  211. nested: true
  212. }),
  213. tmpl = templates[tmplName];
  214. tmpl = tmpl({
  215. data: _context
  216. });
  217. return $('<div>').append($(tmpl)).html();
  218. }
  219. });
  220. },
  221. /**
  222. * @override
  223. */
  224. _processResponse: function (e, items, context) {
  225. var control;
  226. if (context && !context._allShown) {
  227. items = this.filter($.mage.treeToList([], items, 0, ''), this._term);
  228. }
  229. control = this.dropdown.find(this._control.selector);
  230. if (control.length && control.hasClass('jstree')) {
  231. control.jstree('destroy');
  232. }
  233. this._superApply([e, items, context]);
  234. }
  235. });
  236. return $.mage.treeSuggest;
  237. });