dataPost.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define([
  6. 'jquery',
  7. 'mage/template',
  8. 'Magento_Ui/js/modal/confirm',
  9. 'jquery/ui'
  10. ], function ($, mageTemplate, uiConfirm) {
  11. 'use strict';
  12. $.widget('mage.dataPost', {
  13. options: {
  14. formTemplate: '<form action="<%- data.action %>" method="post">' +
  15. '<% _.each(data.data, function(value, index) { %>' +
  16. '<input name="<%- index %>" value="<%- value %>">' +
  17. '<% }) %></form>',
  18. postTrigger: ['a[data-post]', 'button[data-post]', 'span[data-post]'],
  19. formKeyInputSelector: 'input[name="form_key"]'
  20. },
  21. /** @inheritdoc */
  22. _create: function () {
  23. this._bind();
  24. },
  25. /** @inheritdoc */
  26. _bind: function () {
  27. var events = {};
  28. $.each(this.options.postTrigger, function (index, value) {
  29. events['click ' + value] = '_postDataAction';
  30. });
  31. this._on(events);
  32. },
  33. /**
  34. * Handler for click.
  35. *
  36. * @param {Object} e
  37. * @private
  38. */
  39. _postDataAction: function (e) {
  40. var params = $(e.currentTarget).data('post');
  41. e.preventDefault();
  42. this.postData(params);
  43. },
  44. /**
  45. * Data post action.
  46. *
  47. * @param {Object} params
  48. */
  49. postData: function (params) {
  50. var formKey = $(this.options.formKeyInputSelector).val(),
  51. $form, input;
  52. if (formKey) {
  53. params.data['form_key'] = formKey;
  54. }
  55. $form = $(mageTemplate(this.options.formTemplate, {
  56. data: params
  57. }));
  58. if (params.files) {
  59. $form[0].enctype = 'multipart/form-data';
  60. $.each(params.files, function (key, files) {
  61. if (files instanceof FileList) {
  62. input = document.createElement('input');
  63. input.type = 'file';
  64. input.name = key;
  65. input.files = files;
  66. $form[0].appendChild(input);
  67. }
  68. });
  69. }
  70. if (params.data.confirmation) {
  71. uiConfirm({
  72. content: params.data.confirmationMessage,
  73. actions: {
  74. /** @inheritdoc */
  75. confirm: function () {
  76. $form.appendTo('body').hide().submit();
  77. }
  78. }
  79. });
  80. } else {
  81. $form.appendTo('body').hide().submit();
  82. }
  83. }
  84. });
  85. $(document).dataPost();
  86. return $.mage.dataPost;
  87. });