/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** * @api */ define([ 'jquery', 'Magento_Ui/js/modal/alert', 'mage/translate', 'prototype' ], function (jQuery) { var VarienRulesForm = new Class.create(); VarienRulesForm.prototype = { initialize: function (parent, newChildUrl) { this.parent = $(parent); this.newChildUrl = newChildUrl; this.shownElement = null; this.updateElement = null; this.chooserSelectedItems = $H({}); this.readOnly = false; var elems = this.parent.getElementsByClassName('rule-param'); for (var i = 0; i < elems.length; i++) { this.initParam(elems[i]); } }, setReadonly: function (readonly) { this.readOnly = readonly; var elems = this.parent.getElementsByClassName('rule-param-remove'); for (var i = 0; i < elems.length; i++) { var element = elems[i]; if (this.readOnly) { element.hide(); } else { element.show(); } } var elems = this.parent.getElementsByClassName('rule-param-new-child'); for (var i = 0; i < elems.length; i++) { var element = elems[i]; if (this.readOnly) { element.hide(); } else { element.show(); } } var elems = this.parent.getElementsByClassName('rule-param'); for (var i = 0; i < elems.length; i++) { var container = elems[i]; var label = Element.down(container, '.label'); if (label) { if (this.readOnly) { label.addClassName('label-disabled'); } else { label.removeClassName('label-disabled'); } } } }, initParam: function (container) { container.rulesObject = this; var label = Element.down(container, '.label'); if (label) { Event.observe(label, 'click', this.showParamInputField.bind(this, container)); } var elem = Element.down(container, '.element'); if (elem) { var trig = elem.down('.rule-chooser-trigger'); if (trig) { Event.observe(trig, 'click', this.toggleChooser.bind(this, container)); } var apply = elem.down('.rule-param-apply'); if (apply) { Event.observe(apply, 'click', this.hideParamInputField.bind(this, container)); } else { elem = elem.down('.element-value-changer'); elem.container = container; if (!elem.multiple) { Event.observe(elem, 'change', this.hideParamInputField.bind(this, container)); this.changeVisibilityForValueRuleParam(elem); } Event.observe(elem, 'blur', this.hideParamInputField.bind(this, container)); } } var remove = Element.down(container, '.rule-param-remove'); if (remove) { Event.observe(remove, 'click', this.removeRuleEntry.bind(this, container)); } }, showChooserElement: function (chooser) { this.chooserSelectedItems = $H({}); if (chooser.hasClassName('no-split')) { this.chooserSelectedItems.set(this.updateElement.value, 1); } else { var values = this.updateElement.value.split(','), s = ''; for (i = 0; i < values.length; i++) { s = values[i].strip(); if (s != '') { this.chooserSelectedItems.set(s, 1); } } } new Ajax.Request(chooser.getAttribute('url'), { evalScripts: true, parameters: { 'form_key': FORM_KEY, 'selected[]': this.chooserSelectedItems.keys() }, onSuccess: function (transport) { if (this._processSuccess(transport)) { jQuery(chooser).html(transport.responseText); this.showChooserLoaded(chooser, transport); jQuery(chooser).trigger('contentUpdated'); } }.bind(this), onFailure: this._processFailure.bind(this) }); }, showChooserLoaded: function (chooser, transport) { chooser.style.display = 'block'; }, showChooser: function (container, event) { var chooser = container.up('li'); if (!chooser) { return; } chooser = chooser.down('.rule-chooser'); if (!chooser) { return; } this.showChooserElement(chooser); }, hideChooser: function (container, event) { var chooser = container.up('li'); if (!chooser) { return; } chooser = chooser.down('.rule-chooser'); if (!chooser) { return; } chooser.style.display = 'none'; }, toggleChooser: function (container, event) { if (this.readOnly) { return false; } var chooser = container.up('li').down('.rule-chooser'); if (!chooser) { return; } if (chooser.style.display == 'block') { chooser.style.display = 'none'; this.cleanChooser(container, event); } else { this.showChooserElement(chooser); } }, cleanChooser: function (container, event) { var chooser = container.up('li').down('.rule-chooser'); if (!chooser) { return; } chooser.innerHTML = ''; }, showParamInputField: function (container, event) { if (this.readOnly) { return false; } if (this.shownElement) { this.hideParamInputField(this.shownElement, event); } Element.addClassName(container, 'rule-param-edit'); var elemContainer = Element.down(container, '.element'); var elem = Element.down(elemContainer, 'input.input-text'); jQuery(elem).trigger('contentUpdated'); if (elem) { elem.focus(); if (elem && elem.id && elem.id.match(/__value$/)) { this.updateElement = elem; } } var elem = Element.down(elemContainer, '.element-value-changer'); if (elem) { elem.focus(); } this.shownElement = container; }, hideParamInputField: function (container, event) { Element.removeClassName(container, 'rule-param-edit'); var label = Element.down(container, '.label'), elem; if (!container.hasClassName('rule-param-new-child')) { elem = Element.down(container, '.element-value-changer'); if (elem && elem.options) { var selectedOptions = []; for (i = 0; i < elem.options.length; i++) { if (elem.options[i].selected) { selectedOptions.push(elem.options[i].text); } } var str = selectedOptions.join(', '); label.innerHTML = str != '' ? str : '...'; } this.changeVisibilityForValueRuleParam(elem); elem = Element.down(container, 'input.input-text'); if (elem) { var str = elem.value.replace(/(^\s+|\s+$)/g, ''); elem.value = str; if (str == '') { str = '...'; } else if (str.length > 30) { str = str.substr(0, 30) + '...'; } label.innerHTML = str.escapeHTML(); } } else { elem = container.down('.element-value-changer'); if (elem.value) { this.addRuleNewChild(elem); } elem.value = ''; } if (elem && elem.id && elem.id.match(/__value$/)) { this.hideChooser(container, event); this.updateElement = null; } this.shownElement = null; }, changeVisibilityForValueRuleParam: function(elem) { let parsedElementId = elem.id.split('__'); if (parsedElementId[2] != 'operator') { return false; } let valueElement = jQuery('#' + parsedElementId[0] + '__' + parsedElementId[1] + '__value'); if(elem.value == '<=>') { valueElement.closest('.rule-param').hide(); } else { valueElement.closest('.rule-param').show(); } return true; }, addRuleNewChild: function (elem) { var parent_id = elem.id.replace(/^.*__(.*)__.*$/, '$1'); var children_ul_id = elem.id.replace(/__/g, ':').replace(/[^:]*$/, 'children').replace(/:/g, '__'); var children_ul = $(this.parent).select('#' + children_ul_id)[0]; var max_id = 0, i; var children_inputs = Selector.findChildElements(children_ul, $A(['input.hidden'])); if (children_inputs.length) { children_inputs.each(function (el) { if (el.id.match(/__type$/)) { i = 1 * el.id.replace(/^.*__.*?([0-9]+)__.*$/, '$1'); max_id = i > max_id ? i : max_id; } }); } var new_id = parent_id + '--' + (max_id + 1); var new_type = elem.value; var new_elem = document.createElement('LI'); new_elem.className = 'rule-param-wait'; new_elem.innerHTML = jQuery.mage.__('This won\'t take long . . .'); children_ul.insertBefore(new_elem, $(elem).up('li')); new Ajax.Request(this.newChildUrl, { evalScripts: true, parameters: { form_key: FORM_KEY, type: new_type.replace('/', '-'), id: new_id }, onComplete: this.onAddNewChildComplete.bind(this, new_elem), onSuccess: function (transport) { if (this._processSuccess(transport)) { $(new_elem).update(transport.responseText); } }.bind(this), onFailure: this._processFailure.bind(this) }); }, _processSuccess: function (transport) { if (transport.responseText.isJSON()) { var response = transport.responseText.evalJSON(); if (response.error) { alert(response.message); } if (response.ajaxExpired && response.ajaxRedirect) { setLocation(response.ajaxRedirect); } return false; } return true; }, _processFailure: function (transport) { location.href = BASE_URL; }, onAddNewChildComplete: function (new_elem) { if (this.readOnly) { return false; } $(new_elem).removeClassName('rule-param-wait'); var elems = new_elem.getElementsByClassName('rule-param'); for (var i = 0; i < elems.length; i++) { this.initParam(elems[i]); } }, removeRuleEntry: function (container, event) { var li = Element.up(container, 'li'); li.parentNode.removeChild(li); }, chooserGridInit: function (grid) { //grid.reloadParams = {'selected[]':this.chooserSelectedItems.keys()}; }, chooserGridRowInit: function (grid, row) { if (!grid.reloadParams) { grid.reloadParams = { 'selected[]': this.chooserSelectedItems.keys() }; } }, chooserGridRowClick: function (grid, event) { var trElement = Event.findElement(event, 'tr'); var isInput = Event.element(event).tagName == 'INPUT'; if (trElement) { var checkbox = Element.select(trElement, 'input'); if (checkbox[0]) { var checked = isInput ? checkbox[0].checked : !checkbox[0].checked; grid.setCheckboxChecked(checkbox[0], checked); } } }, chooserGridCheckboxCheck: function (grid, element, checked) { if (checked) { if (!element.up('th')) { this.chooserSelectedItems.set(element.value, 1); } } else { this.chooserSelectedItems.unset(element.value); } grid.reloadParams = { 'selected[]': this.chooserSelectedItems.keys() }; this.updateElement.value = this.chooserSelectedItems.keys().join(', '); } }; return VarienRulesForm; });