Skip to content

Commit fbaf5b7

Browse files
author
Alexander Tolochko
committed
Fix product images upload in M2.4.7
1 parent 9986709 commit fbaf5b7

File tree

2 files changed

+190
-0
lines changed

2 files changed

+190
-0
lines changed

view/adminhtml/requirejs-config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
*/
55

66
var config = {
7+
map: {
8+
'*': {
9+
'Magento_Backend/js/media-uploader': 'MagestyApps_WebImages/js/media-uploader'
10+
}
11+
},
712
config: {
813
mixins: {
914
'Magento_Ui/js/form/element/image-uploader': {
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
/**
2+
*
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/* eslint-disable no-undef */
8+
9+
/**
10+
* @api
11+
*/
12+
13+
/*global byteConvert*/
14+
define([
15+
'jquery',
16+
'mage/template',
17+
'Magento_Ui/js/modal/alert',
18+
'Magento_Ui/js/form/element/file-uploader',
19+
'mage/translate',
20+
'jquery/uppy-core'
21+
], function ($, mageTemplate, alert, FileUploader) {
22+
'use strict';
23+
24+
let fileUploader = new FileUploader({
25+
dataScope: '',
26+
isMultipleFiles: true
27+
});
28+
29+
fileUploader.initUploader();
30+
31+
$.widget('mage.mediaUploader', {
32+
33+
/**
34+
*
35+
* @private
36+
*/
37+
_create: function () {
38+
let self = this,
39+
arrayFromObj = Array.from,
40+
progressTmpl = mageTemplate('[data-template="uploader"]'),
41+
uploaderElement = '#fileUploader',
42+
targetElement = this.element.find('.fileinput-button.form-buttons')[0],
43+
uploadUrl = $(uploaderElement).attr('data-url'),
44+
fileId = null,
45+
allowedExt = ['jpeg', 'jpg', 'png', 'gif', 'webp', 'svg'], // This is the only changed line !!!
46+
allowedResize = false,
47+
options = {
48+
proudlyDisplayPoweredByUppy: false,
49+
target: targetElement,
50+
hideUploadButton: true,
51+
hideRetryButton: true,
52+
hideCancelButton: true,
53+
inline: true,
54+
debug:true,
55+
showRemoveButtonAfterComplete: true,
56+
showProgressDetails: false,
57+
showSelectedFiles: false,
58+
hideProgressAfterFinish: true
59+
};
60+
61+
$(document).on('click', uploaderElement ,function () {
62+
$(uploaderElement).closest('.fileinput-button.form-buttons')
63+
.find('.uppy-Dashboard-browse').trigger('click');
64+
});
65+
66+
const uppy = new Uppy.Uppy({
67+
autoProceed: true,
68+
69+
onBeforeFileAdded: (currentFile) => {
70+
let fileSize,
71+
tmpl;
72+
73+
fileSize = typeof currentFile.size == 'undefined' ?
74+
$.mage.__('We could not detect a size.') :
75+
byteConvert(currentFile.size);
76+
77+
// check if file is allowed to upload and resize
78+
allowedResize = $.inArray(currentFile.extension, allowedExt) !== -1;
79+
80+
if (!allowedResize) {
81+
fileUploader.aggregateError(currentFile.name,
82+
$.mage.__('Disallowed file type.'));
83+
fileUploader.onLoadingStop();
84+
return false;
85+
}
86+
87+
fileId = Math.random().toString(33).substr(2, 18);
88+
89+
tmpl = progressTmpl({
90+
data: {
91+
name: currentFile.name,
92+
size: fileSize,
93+
id: fileId
94+
}
95+
});
96+
97+
// code to allow duplicate files from same folder
98+
const modifiedFile = {
99+
...currentFile,
100+
id: currentFile.id + '-' + fileId,
101+
tempFileId: fileId
102+
};
103+
104+
$(tmpl).appendTo(self.element);
105+
return modifiedFile;
106+
},
107+
108+
meta: {
109+
'form_key': window.FORM_KEY,
110+
isAjax : true
111+
}
112+
});
113+
114+
// initialize Uppy upload
115+
uppy.use(Uppy.Dashboard, options);
116+
117+
// Resize Image as per configuration
118+
if (this.options.isResizeEnabled) {
119+
uppy.use(Uppy.Compressor, {
120+
maxWidth: this.options.maxWidth,
121+
maxHeight: this.options.maxHeight,
122+
quality: 0.92,
123+
beforeDraw() {
124+
if (!allowedResize) {
125+
this.abort();
126+
}
127+
}
128+
});
129+
}
130+
131+
// drop area for file upload
132+
uppy.use(Uppy.DropTarget, {
133+
target: targetElement,
134+
onDragOver: () => {
135+
// override Array.from method of legacy-build.min.js file
136+
Array.from = null;
137+
},
138+
onDragLeave: () => {
139+
Array.from = arrayFromObj;
140+
}
141+
});
142+
143+
// upload files on server
144+
uppy.use(Uppy.XHRUpload, {
145+
endpoint: uploadUrl,
146+
fieldName: 'image'
147+
});
148+
149+
uppy.on('upload-success', (file, response) => {
150+
if (response.body && !response.body.error) {
151+
self.element.trigger('addItem', response.body);
152+
} else {
153+
fileUploader.aggregateError(file.name, response.body.error);
154+
}
155+
156+
self.element.find('#' + file.tempFileId).remove();
157+
});
158+
159+
uppy.on('upload-progress', (file, progress) => {
160+
let progressWidth = parseInt(progress.bytesUploaded / progress.bytesTotal * 100, 10),
161+
progressSelector = '#' + file.tempFileId + ' .progressbar-container .progressbar';
162+
163+
self.element.find(progressSelector).css('width', progressWidth + '%');
164+
});
165+
166+
uppy.on('upload-error', (error, file) => {
167+
let progressSelector = '#' + file.tempFileId;
168+
169+
self.element.find(progressSelector).removeClass('upload-progress').addClass('upload-failure')
170+
.delay(2000)
171+
.hide('highlight')
172+
.remove();
173+
});
174+
175+
uppy.on('complete', () => {
176+
fileUploader.uploaderConfig.stop();
177+
$(window).trigger('reload.MediaGallery');
178+
Array.from = arrayFromObj;
179+
});
180+
181+
}
182+
});
183+
184+
return $.mage.mediaUploader;
185+
});

0 commit comments

Comments
 (0)