Skip to content

Commit c496c52

Browse files
committed
ACP2E-4162: Ui component fileUploader not working correctly on 2.4.8-p1/ 2.4-develop
1 parent 6cda09a commit c496c52

File tree

2 files changed

+101
-18
lines changed

2 files changed

+101
-18
lines changed

app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
2-
* Copyright © Magento, Inc. All rights reserved.
3-
* See COPYING.txt for license details.
2+
* Copyright 2016 Adobe
3+
* All Rights Reserved.
44
*/
55

66
/**
@@ -110,10 +110,9 @@ define([
110110
}
111111

112112
// code to allow duplicate files from same folder
113-
const modifiedFile = {
114-
...currentFile,
115-
id: currentFile.id + '-' + Date.now()
116-
};
113+
const modifiedFile = Object.assign({}, currentFile, {
114+
id: currentFile.id + '-' + Date.now()
115+
});
117116

118117
this.onLoadingStart();
119118
return modifiedFile;
@@ -177,10 +176,53 @@ define([
177176
let fileId = fileInput.id, fileName = fileInput.name,
178177
spanElement = '<span id=\'' + fileId + '\'></span>';
179178

180-
$('#' + fileId).closest('.file-uploader-area').attr('upload-area-id', fileName);
179+
$(fileInput).closest('.file-uploader-area').attr('upload-area-id', fileName);
181180
$(fileInput).replaceWith(spanElement);
182-
$('#' + fileId).closest('.file-uploader-area').find('.file-uploader-button:first').on('click', function () {
183-
$('#' + fileId).closest('.file-uploader-area').find('.uppy-Dashboard-browse').trigger('click');
181+
},
182+
183+
/**
184+
* Trigger the file browser dialog
185+
*
186+
* @param {jQuery} $area
187+
*/
188+
triggerFileBrowser: function ($area) {
189+
const $browseBtn = $area.find('.uppy-Dashboard-browse').first();
190+
191+
if ($browseBtn.length > 0) {
192+
$browseBtn[0].click();
193+
return;
194+
}
195+
196+
let $dashboard = $area.find('.uppy-Dashboard-inner'),
197+
$fileInput = $dashboard.find('input[type="file"]:visible').first();
198+
199+
if ($fileInput.length > 0) {
200+
$fileInput[0].click();
201+
}
202+
},
203+
204+
/**
205+
* Binds click events for file browser triggers using event delegation
206+
*
207+
* @param {String} fileId
208+
*/
209+
bindFileBrowserTriggers: function (fileId) {
210+
let self = this,
211+
$area = $('[upload-area-id="' + fileId + '"]').closest('.file-uploader-area'),
212+
$dropZone = $area.closest('[data-role=drop-zone]');
213+
214+
if (!$area.length) {
215+
$area = $('span[id="' + fileId + '"]').closest('.file-uploader-area');
216+
$dropZone = $area.closest('[data-role=drop-zone]');
217+
}
218+
219+
$area.off('click.fileUploader').on('click.fileUploader', '.file-uploader-button:first', function (e) {
220+
e.preventDefault();
221+
self.triggerFileBrowser($area);
222+
});
223+
$dropZone.off('click.fileUploader').on('click.fileUploader', '.file-uploader-placeholder', function (e) {
224+
e.preventDefault();
225+
self.triggerFileBrowser($area);
184226
});
185227
},
186228

@@ -216,11 +258,14 @@ define([
216258
* @param value
217259
* @returns {Promise<void>}
218260
*/
219-
async setImageSize(value) {
220-
let response = await fetch(value.url),
221-
blob = await response.blob();
222-
223-
value.size = blob.size;
261+
setImageSize: function (value) {
262+
return fetch(value.url)
263+
.then(function (response) {
264+
return response.blob();
265+
})
266+
.then(function (blob) {
267+
value.size = blob.size;
268+
});
224269
},
225270

226271
/**
@@ -614,6 +659,7 @@ define([
614659
*/
615660
onElementRender: function (fileInput) {
616661
this.initUploader(fileInput);
662+
this.bindFileBrowserTriggers(fileInput.id);
617663
},
618664

619665
/**

dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/file-uploader.test.js

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
2-
* Copyright © Magento, Inc. All rights reserved.
3-
* See COPYING.txt for license details.
2+
* Copyright 2016 Adobe
3+
* All Rights Reserved.
44
*/
55

66
/*eslint max-nested-callbacks: 0*/
@@ -402,14 +402,51 @@ define([
402402
});
403403

404404
describe('onElementRender handler', function () {
405-
it('invokes initUploader method', function () {
406-
var input = document.createElement('input');
405+
it('invokes initUploader and bindFileBrowserTriggers methods', function () {
406+
let input = document.createElement('input');
407+
408+
input.id = 'test-file-input';
409+
input.name = 'test-file-name';
410+
411+
const $dropZone = $('<div data-role="drop-zone"></div>'),
412+
$fileUploaderArea = $('<div class="file-uploader-area" upload-area-id="' + input.id + '">' +
413+
'<button class="file-uploader-button"></button></div>'),
414+
$placeholder = $('<div class="file-uploader-placeholder"></div>'),
415+
button = $fileUploaderArea.find('.file-uploader-button')[0],
416+
clickEvent = new MouseEvent('click', {bubbles: true, cancelable: true}),
417+
placeholder = $placeholder[0],
418+
clickEvent2 = new MouseEvent('click', {bubbles: true, cancelable: true});
419+
420+
$dropZone.append($fileUploaderArea);
421+
$dropZone.append($placeholder);
422+
$('body').append($dropZone);
407423

408424
spyOn(component, 'initUploader');
425+
spyOn(component, 'bindFileBrowserTriggers').and.callThrough();
426+
spyOn(component, 'triggerFileBrowser');
409427

410428
component.onElementRender(input);
411429

412430
expect(component.initUploader).toHaveBeenCalledWith(input);
431+
expect(component.bindFileBrowserTriggers).toHaveBeenCalledWith(input.id);
432+
433+
button.dispatchEvent(clickEvent);
434+
expect(component.triggerFileBrowser).toHaveBeenCalled();
435+
436+
// eslint-disable-next-line one-var
437+
const arg1 = component.triggerFileBrowser.calls.first().args[0];
438+
439+
expect(arg1[0]).toBe($fileUploaderArea[0]);
440+
441+
placeholder.dispatchEvent(clickEvent2);
442+
expect(component.triggerFileBrowser.calls.count()).toBe(2);
443+
444+
// eslint-disable-next-line one-var
445+
const arg2 = component.triggerFileBrowser.calls.mostRecent().args[0];
446+
447+
expect(arg2[0]).toBe($fileUploaderArea[0]);
448+
449+
$dropZone.remove();
413450
});
414451
});
415452

0 commit comments

Comments
 (0)