You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

444 lines
14 KiB

  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. /**
  6. * @api
  7. */
  8. define([
  9. 'jquery',
  10. 'Magento_Ui/js/modal/alert',
  11. 'mage/translate',
  12. 'prototype'
  13. ], function (jQuery) {
  14. 'use strict';
  15. var VarienRulesForm = new Class.create();
  16. VarienRulesForm.prototype = {
  17. initialize: function (parent, newChildUrl) {
  18. this.parent = $(parent);
  19. this.newChildUrl = newChildUrl;
  20. this.shownElement = null;
  21. this.updateElement = null;
  22. this.chooserSelectedItems = $H({});
  23. this.readOnly = false;
  24. var elems = this.parent.getElementsByClassName('rule-param');
  25. for (var i = 0; i < elems.length; i++) {
  26. this.initParam(elems[i]);
  27. }
  28. },
  29. setReadonly: function (readonly) {
  30. this.readOnly = readonly;
  31. var elems = this.parent.getElementsByClassName('rule-param-remove');
  32. for (var i = 0; i < elems.length; i++) {
  33. var element = elems[i];
  34. if (this.readOnly) {
  35. element.hide();
  36. } else {
  37. element.show();
  38. }
  39. }
  40. var elems = this.parent.getElementsByClassName('rule-param-new-child');
  41. for (var i = 0; i < elems.length; i++) {
  42. var element = elems[i];
  43. if (this.readOnly) {
  44. element.hide();
  45. } else {
  46. element.show();
  47. }
  48. }
  49. var elems = this.parent.getElementsByClassName('rule-param');
  50. for (var i = 0; i < elems.length; i++) {
  51. var container = elems[i];
  52. var label = Element.down(container, '.label');
  53. if (label) {
  54. if (this.readOnly) {
  55. label.addClassName('label-disabled');
  56. } else {
  57. label.removeClassName('label-disabled');
  58. }
  59. }
  60. }
  61. },
  62. initParam: function (container) {
  63. container.rulesObject = this;
  64. var label = Element.down(container, '.label');
  65. if (label) {
  66. Event.observe(label, 'click', this.showParamInputField.bind(this, container));
  67. }
  68. var elem = Element.down(container, '.element');
  69. if (elem) {
  70. var trig = elem.down('.rule-chooser-trigger');
  71. if (trig) {
  72. Event.observe(trig, 'click', this.toggleChooser.bind(this, container));
  73. }
  74. var apply = elem.down('.rule-param-apply');
  75. if (apply) {
  76. Event.observe(apply, 'click', this.hideParamInputField.bind(this, container));
  77. } else {
  78. elem = elem.down('.element-value-changer');
  79. elem.container = container;
  80. if (!elem.multiple) {
  81. Event.observe(elem, 'change', this.hideParamInputField.bind(this, container));
  82. this.changeVisibilityForValueRuleParam(elem);
  83. }
  84. Event.observe(elem, 'blur', this.hideParamInputField.bind(this, container));
  85. }
  86. }
  87. var remove = Element.down(container, '.rule-param-remove');
  88. if (remove) {
  89. Event.observe(remove, 'click', this.removeRuleEntry.bind(this, container));
  90. }
  91. },
  92. showChooserElement: function (chooser) {
  93. this.chooserSelectedItems = $H({});
  94. if (chooser.hasClassName('no-split')) {
  95. this.chooserSelectedItems.set(this.updateElement.value, 1);
  96. } else {
  97. var values = this.updateElement.value.split(','),
  98. s = '';
  99. for (var i = 0; i < values.length; i++) {
  100. s = values[i].strip();
  101. if (s != '') {
  102. this.chooserSelectedItems.set(s, 1);
  103. }
  104. }
  105. }
  106. new Ajax.Request(chooser.getAttribute('url'), {
  107. evalScripts: true,
  108. parameters: {
  109. 'form_key': FORM_KEY, 'selected[]': this.chooserSelectedItems.keys()
  110. },
  111. onSuccess: function (transport) {
  112. if (this._processSuccess(transport)) {
  113. jQuery(chooser).html(transport.responseText);
  114. this.showChooserLoaded(chooser, transport);
  115. jQuery(chooser).trigger('contentUpdated');
  116. }
  117. }.bind(this),
  118. onFailure: this._processFailure.bind(this)
  119. });
  120. },
  121. showChooserLoaded: function (chooser, transport) {
  122. chooser.style.display = 'block';
  123. },
  124. showChooser: function (container, event) {
  125. var chooser = container.up('li');
  126. if (!chooser) {
  127. return;
  128. }
  129. chooser = chooser.down('.rule-chooser');
  130. if (!chooser) {
  131. return;
  132. }
  133. this.showChooserElement(chooser);
  134. },
  135. hideChooser: function (container, event) {
  136. var chooser = container.up('li');
  137. if (!chooser) {
  138. return;
  139. }
  140. chooser = chooser.down('.rule-chooser');
  141. if (!chooser) {
  142. return;
  143. }
  144. chooser.style.display = 'none';
  145. },
  146. toggleChooser: function (container, event) {
  147. if (this.readOnly) {
  148. return false;
  149. }
  150. var chooser = container.up('li').down('.rule-chooser');
  151. if (!chooser) {
  152. return;
  153. }
  154. if (chooser.style.display == 'block') {
  155. chooser.style.display = 'none';
  156. this.cleanChooser(container, event);
  157. } else {
  158. this.showChooserElement(chooser);
  159. }
  160. },
  161. cleanChooser: function (container, event) {
  162. var chooser = container.up('li').down('.rule-chooser');
  163. if (!chooser) {
  164. return;
  165. }
  166. chooser.innerHTML = '';
  167. },
  168. showParamInputField: function (container, event) {
  169. if (this.readOnly) {
  170. return false;
  171. }
  172. if (this.shownElement) {
  173. this.hideParamInputField(this.shownElement, event);
  174. }
  175. Element.addClassName(container, 'rule-param-edit');
  176. var elemContainer = Element.down(container, '.element');
  177. var elem = Element.down(elemContainer, 'input.input-text');
  178. jQuery(elem).trigger('contentUpdated');
  179. if (elem) {
  180. elem.focus();
  181. if (elem && elem.id && elem.id.match(/__value$/)) {
  182. this.updateElement = elem;
  183. }
  184. }
  185. var elem = Element.down(elemContainer, '.element-value-changer');
  186. if (elem) {
  187. elem.focus();
  188. }
  189. this.shownElement = container;
  190. },
  191. hideParamInputField: function (container, event) {
  192. Element.removeClassName(container, 'rule-param-edit');
  193. var label = Element.down(container, '.label'),
  194. elem;
  195. if (!container.hasClassName('rule-param-new-child')) {
  196. elem = Element.down(container, '.element-value-changer');
  197. if (elem && elem.options) {
  198. var selectedOptions = [];
  199. for (var i = 0; i < elem.options.length; i++) {
  200. if (elem.options[i].selected) {
  201. selectedOptions.push(elem.options[i].text);
  202. }
  203. }
  204. var str = selectedOptions.join(', ');
  205. label.innerHTML = str != '' ? str : '...';
  206. }
  207. this.changeVisibilityForValueRuleParam(elem);
  208. elem = Element.down(container, 'input.input-text');
  209. if (elem) {
  210. var str = elem.value.replace(/(^\s+|\s+$)/g, '');
  211. elem.value = str;
  212. if (str == '') {
  213. str = '...';
  214. } else if (str.length > 30) {
  215. str = str.substr(0, 30) + '...';
  216. }
  217. label.innerHTML = str.escapeHTML();
  218. }
  219. } else {
  220. elem = container.down('.element-value-changer');
  221. if (elem.value) {
  222. this.addRuleNewChild(elem);
  223. }
  224. elem.value = '';
  225. }
  226. if (elem && elem.id && elem.id.match(/__value$/)) {
  227. this.hideChooser(container, event);
  228. this.updateElement = null;
  229. }
  230. this.shownElement = null;
  231. },
  232. changeVisibilityForValueRuleParam: function(elem) {
  233. var parsedElementId = elem.id.split('__');
  234. if (parsedElementId[2] !== 'operator') {
  235. return false;
  236. }
  237. var valueElement = jQuery('#' + parsedElementId[0] + '__' + parsedElementId[1] + '__value');
  238. if(elem.value === '<=>') {
  239. valueElement.closest('.rule-param').hide();
  240. } else {
  241. valueElement.closest('.rule-param').show();
  242. }
  243. return true;
  244. },
  245. addRuleNewChild: function (elem) {
  246. var parent_id = elem.id.replace(/^.*__(.*)__.*$/, '$1');
  247. var children_ul_id = elem.id.replace(/__/g, ':').replace(/[^:]*$/, 'children').replace(/:/g, '__');
  248. var children_ul = $(this.parent).select('#' + children_ul_id)[0];
  249. var max_id = 0,
  250. i;
  251. var children_inputs = Selector.findChildElements(children_ul, $A(['input.hidden']));
  252. if (children_inputs.length) {
  253. children_inputs.each(function (el) {
  254. if (el.id.match(/__type$/)) {
  255. i = 1 * el.id.replace(/^.*__.*?([0-9]+)__.*$/, '$1');
  256. max_id = i > max_id ? i : max_id;
  257. }
  258. });
  259. }
  260. var new_id = parent_id + '--' + (max_id + 1);
  261. var new_type = elem.value;
  262. var new_elem = document.createElement('LI');
  263. new_elem.className = 'rule-param-wait';
  264. new_elem.innerHTML = jQuery.mage.__('This won\'t take long . . .');
  265. children_ul.insertBefore(new_elem, $(elem).up('li'));
  266. new Ajax.Request(this.newChildUrl, {
  267. evalScripts: true,
  268. parameters: {
  269. form_key: FORM_KEY, type: new_type.replace('/', '-'), id: new_id
  270. },
  271. onComplete: this.onAddNewChildComplete.bind(this, new_elem),
  272. onSuccess: function (transport) {
  273. if (this._processSuccess(transport)) {
  274. $(new_elem).update(transport.responseText);
  275. }
  276. }.bind(this),
  277. onFailure: this._processFailure.bind(this)
  278. });
  279. },
  280. _processSuccess: function (transport) {
  281. if (transport.responseText.isJSON()) {
  282. var response = transport.responseText.evalJSON();
  283. if (response.error) {
  284. alert(response.message);
  285. }
  286. if (response.ajaxExpired && response.ajaxRedirect) {
  287. setLocation(response.ajaxRedirect);
  288. }
  289. return false;
  290. }
  291. return true;
  292. },
  293. _processFailure: function (transport) {
  294. location.href = BASE_URL;
  295. },
  296. onAddNewChildComplete: function (new_elem) {
  297. if (this.readOnly) {
  298. return false;
  299. }
  300. $(new_elem).removeClassName('rule-param-wait');
  301. var elems = new_elem.getElementsByClassName('rule-param');
  302. for (var i = 0; i < elems.length; i++) {
  303. this.initParam(elems[i]);
  304. }
  305. },
  306. removeRuleEntry: function (container, event) {
  307. var li = Element.up(container, 'li');
  308. li.parentNode.removeChild(li);
  309. },
  310. chooserGridInit: function (grid) {
  311. //grid.reloadParams = {'selected[]':this.chooserSelectedItems.keys()};
  312. },
  313. chooserGridRowInit: function (grid, row) {
  314. if (!grid.reloadParams) {
  315. grid.reloadParams = {
  316. 'selected[]': this.chooserSelectedItems.keys()
  317. };
  318. }
  319. },
  320. chooserGridRowClick: function (grid, event) {
  321. var trElement = Event.findElement(event, 'tr');
  322. var isInput = Event.element(event).tagName == 'INPUT';
  323. if (trElement) {
  324. var checkbox = Element.select(trElement, 'input');
  325. if (checkbox[0]) {
  326. var checked = isInput ? checkbox[0].checked : !checkbox[0].checked;
  327. grid.setCheckboxChecked(checkbox[0], checked);
  328. }
  329. }
  330. },
  331. chooserGridCheckboxCheck: function (grid, element, checked) {
  332. if (checked) {
  333. if (!element.up('th')) {
  334. this.chooserSelectedItems.set(element.value, 1);
  335. }
  336. } else {
  337. this.chooserSelectedItems.unset(element.value);
  338. }
  339. grid.reloadParams = {
  340. 'selected[]': this.chooserSelectedItems.keys()
  341. };
  342. this.updateElement.value = this.chooserSelectedItems.keys().join(', ');
  343. }
  344. };
  345. return VarienRulesForm;
  346. });