diff --git a/src/Dropzone/CHANGELOG.md b/src/Dropzone/CHANGELOG.md index 77389fe0f19..3d9929f2cb1 100644 --- a/src/Dropzone/CHANGELOG.md +++ b/src/Dropzone/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 2.23 + +- Support multiple files preview + ## 2.20 - Enable file replacement via "drag-and-drop" diff --git a/src/Dropzone/assets/dist/controller.js b/src/Dropzone/assets/dist/controller.js index ebfb380d12a..2d08ae81661 100644 --- a/src/Dropzone/assets/dist/controller.js +++ b/src/Dropzone/assets/dist/controller.js @@ -32,19 +32,25 @@ class default_1 extends Controller { this.dispatchEvent('clear'); } onInputChange(event) { - const file = event.target.files[0]; - if (typeof file === 'undefined') { + const files = event.target.files; + if (!files.length) { return; } this.inputTarget.style.display = 'none'; this.placeholderTarget.style.display = 'none'; - this.previewFilenameTarget.textContent = file.name; + const firstFile = files[0]; + let displayText = firstFile.name; + if (files.length > 1) { + const additionalFiles = files.length - 1; + displayText += ` +${additionalFiles} ${additionalFiles === 1 ? 'file' : 'files'}`; + } + this.previewFilenameTarget.textContent = displayText; this.previewTarget.style.display = 'flex'; this.previewImageTarget.style.display = 'none'; - if (file.type && file.type.indexOf('image') !== -1) { - this._populateImagePreview(file); + if (firstFile.type && firstFile.type.indexOf('image') !== -1) { + this._populateImagePreview(firstFile); } - this.dispatchEvent('change', file); + this.dispatchEvent('change', files); } _populateImagePreview(file) { if (typeof FileReader === 'undefined') { diff --git a/src/Dropzone/assets/src/controller.ts b/src/Dropzone/assets/src/controller.ts index b2533329388..ed52ea4b2cb 100644 --- a/src/Dropzone/assets/src/controller.ts +++ b/src/Dropzone/assets/src/controller.ts @@ -65,8 +65,8 @@ export default class extends Controller { } onInputChange(event: any) { - const file = event.target.files[0]; - if (typeof file === 'undefined') { + const files = event.target.files; + if (!files.length) { return; } @@ -74,17 +74,23 @@ export default class extends Controller { this.inputTarget.style.display = 'none'; this.placeholderTarget.style.display = 'none'; - // Show the filename in preview - this.previewFilenameTarget.textContent = file.name; + // Show the filename in preview with additional files count if needed + const firstFile = files[0]; + let displayText = firstFile.name; + if (files.length > 1) { + const additionalFiles = files.length - 1; + displayText += ` +${additionalFiles} ${additionalFiles === 1 ? 'file' : 'files'}`; + } + this.previewFilenameTarget.textContent = displayText; this.previewTarget.style.display = 'flex'; - // If the file is an image, load it and display it as preview + // If the first file is an image, load it and display it as preview this.previewImageTarget.style.display = 'none'; - if (file.type && file.type.indexOf('image') !== -1) { - this._populateImagePreview(file); + if (firstFile.type && firstFile.type.indexOf('image') !== -1) { + this._populateImagePreview(firstFile); } - this.dispatchEvent('change', file); + this.dispatchEvent('change', files); } _populateImagePreview(file: Blob) { diff --git a/src/Dropzone/assets/test/controller.test.ts b/src/Dropzone/assets/test/controller.test.ts index b37dadf4bbb..352d8b5e3b0 100644 --- a/src/Dropzone/assets/test/controller.test.ts +++ b/src/Dropzone/assets/test/controller.test.ts @@ -65,6 +65,39 @@ describe('DropzoneController', () => { data-testid="preview-filename"> +