Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

245 wiersze
7.5 KiB

  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define([
  6. 'uiComponent',
  7. 'jquery',
  8. 'underscore',
  9. 'Magento_Ui/js/lib/validation/validator',
  10. 'mage/translate',
  11. 'jquery/file-uploader'
  12. ], function (Component, $, _, validator, $t) {
  13. 'use strict';
  14. return Component.extend({
  15. defaults: {
  16. imageUploadInputSelector: '#image-uploader-form',
  17. directoriesPath: 'media_gallery_listing.media_gallery_listing.media_gallery_directories',
  18. actionsPath: 'media_gallery_listing.media_gallery_listing.media_gallery_columns.thumbnail_url',
  19. messagesPath: 'media_gallery_listing.media_gallery_listing.messages',
  20. imageUploadUrl: '',
  21. acceptFileTypes: '',
  22. allowedExtensions: '',
  23. maxFileSize: '',
  24. maxFileNameLength: 90,
  25. loader: false,
  26. modules: {
  27. directories: '${ $.directoriesPath }',
  28. actions: '${ $.actionsPath }',
  29. mediaGridMessages: '${ $.messagesPath }',
  30. sortBy: '${ $.sortByName }',
  31. listingPaging: '${ $.listingPagingName }'
  32. }
  33. },
  34. /**
  35. * Init component
  36. *
  37. * @return {exports}
  38. */
  39. initialize: function () {
  40. this._super().observe(
  41. [
  42. 'loader',
  43. 'count'
  44. ]
  45. );
  46. return this;
  47. },
  48. /**
  49. * Initializes file upload library
  50. */
  51. initializeFileUpload: function () {
  52. $(this.imageUploadInputSelector).fileupload({
  53. url: this.imageUploadUrl,
  54. acceptFileTypes: this.acceptFileTypes,
  55. allowedExtensions: this.allowedExtensions,
  56. maxFileSize: this.maxFileSize,
  57. /**
  58. * Extending the form data
  59. *
  60. * @param {Object} form
  61. * @returns {Array}
  62. */
  63. formData: function (form) {
  64. return form.serializeArray().concat(
  65. [{
  66. name: 'isAjax',
  67. value: true
  68. },
  69. {
  70. name: 'form_key',
  71. value: window.FORM_KEY
  72. },
  73. {
  74. name: 'target_folder',
  75. value: this.getTargetFolder()
  76. }]
  77. );
  78. }.bind(this),
  79. add: function (e, data) {
  80. if (!this.isSizeExceeded(data.files[0]).passed) {
  81. this.addValidationErrorMessage(
  82. $t('Cannot upload "%1". File exceeds maximum file size limit.')
  83. .replace('%1', data.files[0].name)
  84. );
  85. return;
  86. } else if (!this.isFileNameLengthExceeded(data.files[0]).passed) {
  87. this.addValidationErrorMessage(
  88. $t('Cannot upload "%1". Filename is too long, must be 90 characters or less.')
  89. .replace('%1', data.files[0].name)
  90. );
  91. return;
  92. }
  93. this.showLoader();
  94. this.count(1);
  95. data.submit();
  96. }.bind(this),
  97. stop: function () {
  98. this.openNewestImages();
  99. this.mediaGridMessages().scheduleCleanup();
  100. }.bind(this),
  101. start: function () {
  102. this.mediaGridMessages().clear();
  103. }.bind(this),
  104. done: function (e, data) {
  105. var response = data.jqXHR.responseJSON;
  106. if (!response) {
  107. this.showErrorMessage(data, $t('Could not upload the asset.'));
  108. return;
  109. }
  110. if (!response.success) {
  111. this.showErrorMessage(data, response.message);
  112. return;
  113. }
  114. this.showSuccessMessage(data);
  115. this.hideLoader();
  116. this.actions().reloadGrid();
  117. }.bind(this)
  118. });
  119. },
  120. /**
  121. * Add error message after validation error.
  122. *
  123. * @param {String} message
  124. */
  125. addValidationErrorMessage: function (message) {
  126. this.mediaGridMessages().add('error', message);
  127. this.count() < 2 || this.mediaGridMessages().scheduleCleanup();
  128. },
  129. /**
  130. * Checks if size of provided file exceeds
  131. * defined in configuration size limits.
  132. *
  133. * @param {Object} file - File to be checked.
  134. * @returns {Boolean}
  135. */
  136. isSizeExceeded: function (file) {
  137. return validator('validate-max-size', file.size, this.maxFileSize);
  138. },
  139. /**
  140. * Checks if name length of provided file exceeds
  141. * defined in configuration size limits.
  142. *
  143. * @param {Object} file - File to be checked.
  144. * @returns {Boolean}
  145. */
  146. isFileNameLengthExceeded: function (file) {
  147. return validator('max_text_length', file.name, this.maxFileNameLength);
  148. },
  149. /**
  150. * Go to recently uploaded images if at least one uploaded successfully
  151. */
  152. openNewestImages: function () {
  153. this.mediaGridMessages().get().each(function (message) {
  154. if (message.code === 'success') {
  155. this.actions().deselectImage();
  156. this.sortBy().selectDefaultOption();
  157. this.listingPaging().goFirst();
  158. return false;
  159. }
  160. }.bind(this));
  161. },
  162. /**
  163. * Show error meassages with file name.
  164. *
  165. * @param {Object} data
  166. * @param {String} message
  167. */
  168. showErrorMessage: function (data, message) {
  169. data.files.each(function (file) {
  170. this.mediaGridMessages().add(
  171. 'error',
  172. file.name + ': ' + $t(message)
  173. );
  174. }.bind(this));
  175. this.hideLoader();
  176. },
  177. /**
  178. * Show success message, and files counts
  179. */
  180. showSuccessMessage: function () {
  181. this.mediaGridMessages().messages.remove(function (item) {
  182. return item.code === 'success';
  183. });
  184. this.mediaGridMessages().add('success', $t('Assets have been successfully uploaded!'));
  185. this.count(this.count() + 1);
  186. },
  187. /**
  188. * Gets Media Gallery selected folder
  189. *
  190. * @returns {String}
  191. */
  192. getTargetFolder: function () {
  193. if (_.isUndefined(this.directories().activeNode()) ||
  194. _.isNull(this.directories().activeNode())) {
  195. return '/';
  196. }
  197. return this.directories().activeNode();
  198. },
  199. /**
  200. * Shows spinner loader
  201. */
  202. showLoader: function () {
  203. this.loader(true);
  204. },
  205. /**
  206. * Hides spinner loader
  207. */
  208. hideLoader: function () {
  209. this.loader(false);
  210. }
  211. });
  212. });