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.
 
 
 
 
 
 

322 lines
15 KiB

  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /** @var $block \Magento\Tax\Block\Adminhtml\Rule\Edit\Form */
  7. /** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
  8. ?>
  9. <?php $formElementId = /* @noEscape */ \Magento\Tax\Block\Adminhtml\Rate\Form::FORM_ELEMENT_ID;
  10. $jsId = /* @noEscape */ $block->getJsId();
  11. //phpcs:ignore Magento2.SQL.RawQuery
  12. $scriptString = <<<script
  13. require([
  14. 'jquery',
  15. 'Magento_Ui/js/modal/alert',
  16. 'Magento_Ui/js/modal/confirm',
  17. "jquery/ui",
  18. 'mage/multiselect',
  19. "mage/mage",
  20. 'Magento_Ui/js/modal/modal'
  21. ], function($, alert, confirm) {
  22. $.widget("adminhtml.dialogRates", $.mage.modal, {
  23. options: {
  24. itemRate: {},
  25. itemRateDefault: {}
  26. },
  27. _create: function() {
  28. this._super();
  29. this._getFormData(this.options.itemRateDefault);
  30. },
  31. openModal: function() {
  32. var zipIsRange = this.modal.find('#zip_is_range');
  33. this._applyItem(this.options.itemRateDefault);
  34. if (this.options.itemRate && !$.isEmptyObject(this.options.itemRate)) {
  35. this._applyItem(this.options.itemRate);
  36. }
  37. zipIsRange.attr('checked', zipIsRange.val() == 1);
  38. zipIsRange.trigger('change');
  39. updater.update();
  40. this._super();
  41. },
  42. closeModal: function() {
  43. this._super();
  44. },
  45. _applyItem: function(rate) {
  46. var dialogElement = this.modal;
  47. $.each(rate, function(key, value) {
  48. if (!value) {
  49. value = '';
  50. }
  51. dialogElement.find('[name="' + key + '"]').attr('value', value);
  52. });
  53. },
  54. updateItemRate: function() {
  55. this._getFormData(this.options.itemRate);
  56. },
  57. _getFormData: function(data) {
  58. $.each(this.modal.find(':input'), function() {
  59. if (this.name) {
  60. data[this.name] = this.value
  61. }
  62. });
  63. }
  64. });
  65. TaxRateEditableMultiselect = function (settings) {
  66. this.settings = settings || {};
  67. this.isEntityEditable = this.settings.is_entity_editable || false;
  68. this.edit = function() {
  69. var listItem = $(this).closest('.mselect-list-item');
  70. var that = listItem.children('.mselect-edit');
  71. var id = listItem.find('input[type="checkbox"]').attr('value'),
  72. item;
  73. $('body').trigger('processStart');
  74. $.ajax({
  75. type: "POST",
  76. data: {id:id},
  77. url: '{$block->escapeJs($block->getTaxRateLoadUrl())}',
  78. success: function(result, status) {
  79. $('body').trigger('processStop');
  80. if (result.success) {
  81. item=result.result;
  82. item.itemElement = that.prev();
  83. $('#tax-rate-form')
  84. .dialogRates({itemRate: item})
  85. .dialogRates('openModal');
  86. } else {
  87. if (result.error_message)
  88. alert({
  89. content: result.error_message
  90. });
  91. else
  92. alert({
  93. content: '{$block->escapeJs(__('An error occurred'))}'
  94. });
  95. }
  96. },
  97. error: function () {
  98. $('body').trigger('processStop');
  99. alert({
  100. content: '{$block->escapeJs(__('An error occurred'))}'
  101. });
  102. },
  103. dataType: "json"
  104. });
  105. };
  106. TaxRateEditableMultiselect.prototype.init = function () {
  107. var options = {
  108. mselectContainer: '#tax_rate + section.mselect-list',
  109. toggleAddButton:false,
  110. addText: '{$block->escapeJs(__('Add New Tax Rate'))}',
  111. parse: null,
  112. nextPageUrl: '{$block->escapeJs($block->getTaxRatesPageUrl())}',
  113. selectedValues: this.settings.selected_values,
  114. mselectInputSubmitCallback: function (value, options) {
  115. var select = $('#tax_rate');
  116. select.append('<option value="" selected="selected">' + value + '</option>');
  117. var mselectItemHtml = $(options.item.replace(/%value%|%label%/gi, value)
  118. .replace(/%mselectCheckedClass%|%mselectDisabledClass%|%iseditable%|%isremovable%/gi, '')
  119. .replace(/%checked%|%disabled%/gi, '')
  120. .replace(/%mselectListItemClass%/gi, options.mselectListItemClass))
  121. .find('[type=checkbox]')
  122. .attr('checked', true)
  123. .addClass(options.mselectCheckedClass)
  124. .end();
  125. var itemsWrapper = select.nextAll('section.block:first')
  126. .find('.' + options.mselectItemsWrapperClass + '');
  127. itemsWrapper.children('.' + options.mselectListItemClass + '').length
  128. ? itemsWrapper.children('.' + options.mselectListItemClass + ':last').after(mselectItemHtml)
  129. : itemsWrapper.prepend(mselectItemHtml);
  130. }
  131. };
  132. var taxRate = $('#tax_rate'),
  133. taxRateField = taxRate.parent(),
  134. taxRateForm = $('#tax-rate-form'),
  135. taxRateFormElement = $('#{$formElementId}');
  136. if (!this.isEntityEditable) {
  137. // Override default layout of editable multiselect
  138. options['layout'] = '<section class="block %mselectListClass%">'
  139. + '<div class="block-content"><div class="%mselectItemsWrapperClass%">'
  140. + '%items%'
  141. + '</div></div>'
  142. + '<div class="%mselectInputContainerClass%">'
  143. + '<input type="text" class="%mselectInputClass%" title="%inputTitle%"/>'
  144. + '<span class="%mselectButtonCancelClass%" title="%cancelText%"></span>'
  145. + '<span class="%mselectButtonSaveClass%" title="Add"></span>'
  146. + '</div>'
  147. + '</section>';
  148. options['mselectInputSubmitCallback'] = null;
  149. }
  150. taxRate.multiselect2(options);
  151. taxRateField.find('.mselect-button-add').off('click');
  152. taxRateField.find('.mselect-list')
  153. .on('click.mselect-edit', '.mselect-edit', this.edit)
  154. .on("click.mselect-delete", ".mselect-delete", function () {
  155. var that = $(this),
  156. script;
  157. // phpcs:ignore Magento2.SQL.RawQuery
  158. $scriptString .= "select = that.closest('.mselect-list').prev()," . PHP_EOL;
  159. $scriptString .= <<<script
  160. rateValue = that.parent().find('input[type="checkbox"]').val();
  161. confirm({
  162. content: '{$block->escapeJs(__('Do you really want to delete this tax rate?'))}',
  163. actions: {
  164. /**
  165. * Confirm action.
  166. */
  167. confirm: function () {
  168. $('body').trigger('processStart');
  169. var ajaxOptions = {
  170. type: 'POST',
  171. data: {
  172. tax_calculation_rate_id: rateValue,
  173. form_key: $('input[name="form_key"]').val()
  174. },
  175. dataType: 'json',
  176. url: '{$block->escapeJs($block->getTaxRateDeleteUrl())}',
  177. success: function(result, status) {
  178. $('body').trigger('processStop');
  179. if (result.success) {
  180. that.parent().remove();
  181. select.find('option').each(function() {
  182. if (this.value === rateValue) {
  183. $(this).remove();
  184. }
  185. });
  186. select.trigger('change.hiddenSelect');
  187. } else {
  188. if (result.error_message)
  189. alert({
  190. content: result.error_message
  191. });
  192. else
  193. alert({
  194. content: '{$block->escapeJs(__('An error occurred'))}'
  195. });
  196. }
  197. },
  198. error: function () {
  199. $('body').trigger('processStop');
  200. alert({
  201. content: '{$block->escapeJs(__('An error occurred'))}'
  202. });
  203. }
  204. };
  205. $.ajax(ajaxOptions);
  206. }
  207. }
  208. });
  209. })
  210. .on('click.mselectAdd', '.mselect-button-add', function () {
  211. taxRateForm
  212. .dialogRates({itemRate: {}})
  213. .dialogRates('openModal');
  214. })
  215. .on('click.mselect-checked', '.mselect-list-item input', function (event) {
  216. var el = $(this),
  217. checkedClassName = 'mselect-checked';
  218. el[el.is(':checked') ? 'addClass' : 'removeClass'](checkedClassName);
  219. })
  220. .on('dblclick.mselect-list-item', '.mselect-list-item label span', this.edit);
  221. taxRateFormElement.mage('form').mage('validation');
  222. taxRateForm.dialogRates({
  223. title: '{$block->escapeJs(__('Tax Rate'))}',
  224. type: 'slide',
  225. id: '{$jsId}',
  226. modalClass: 'tax-rate-popup',
  227. closed: function () {
  228. taxRateFormElement.data('validation').clearError();
  229. },
  230. buttons: [{
  231. text: '{$block->escapeJs(__('Save'))}',
  232. 'class': 'action-save action-primary',
  233. click: function() {
  234. this.updateItemRate();
  235. var itemRate = this.option('itemRate'),
  236. itemRateData = $.extend({}, itemRate);
  237. if (itemRateData.itemElement) {
  238. script;
  239. //phpcs:ignore Magento2.SQL.RawQuerys
  240. $scriptString .= ' delete itemRateData.itemElement;';
  241. $scriptString.= <<<script
  242. }
  243. if (!taxRateFormElement.validation().valid()) {
  244. return;
  245. }
  246. $('.tax-rate-popup').trigger('processStart');
  247. $('.loading-mask').css('z-index','1004');
  248. var ajaxOptions = {
  249. type: 'POST',
  250. data: itemRateData,
  251. dataType: 'json',
  252. url: '{$block->escapeJs($block->getTaxRateSaveUrl())}',
  253. success: function(result, status) {
  254. $('body').trigger('processStop');
  255. if (result.success) {
  256. itemRate.code = result.code;
  257. if (itemRate.tax_calculation_rate_id) {
  258. itemRate.itemElement.find('span').html(itemRate.code);
  259. } else {
  260. itemRate.tax_calculation_rate_id = result.tax_calculation_rate_id;
  261. taxRateField.find('.mselect-input').val(itemRate.code);
  262. taxRateField.find('.mselect-save').trigger('mousedown');
  263. taxRateField.find('option[value=""]:last')
  264. .val(itemRate.tax_calculation_rate_id);
  265. taxRateField.find('input[type="checkbox"][value="' + itemRate.code + '"]')
  266. .val(itemRate.tax_calculation_rate_id);
  267. taxRateField.find('select').trigger('change.hiddenSelect');
  268. }
  269. taxRateForm.dialogRates('closeModal');
  270. } else {
  271. if (result.error_message)
  272. alert({
  273. content: result.error_message
  274. });
  275. else
  276. alert({
  277. content: '{$block->escapeJs(__('An error occurred'))}'
  278. });
  279. }
  280. },
  281. error: function () {
  282. $('body').trigger('processStop');
  283. alert({
  284. content: '{$block->escapeJs(__('An error occurred'))}'
  285. });
  286. }
  287. };
  288. $.ajax(ajaxOptions);
  289. }
  290. }]
  291. });
  292. $('.grid-loading-mask').hide();
  293. }
  294. };
  295. window.TaxRateEditableMultiselect = TaxRateEditableMultiselect;
  296. });
  297. script;
  298. ?>
  299. <?= /* @noEscape */ $secureRenderer->renderTag('script', [], $scriptString, false) ?>