Skip to content

Commit e8a8a1e

Browse files
committed
fixup! feat(dropzone): enable multiple file uploads
1 parent 59c6d3b commit e8a8a1e

File tree

5 files changed

+36
-7
lines changed

5 files changed

+36
-7
lines changed

src/Dropzone/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# CHANGELOG
22

33
## Unreleased
4-
- Support added for selecting multiple files (#???) - @daFish
4+
- Support added for selecting multiple files (#512) - @daFish
55

66
## 2.0
77

src/Dropzone/Resources/assets/src/controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ export default class extends Controller {
6767
if (file.type && file.type.indexOf('image') !== -1) {
6868
this._populateImagePreview(file);
6969
}
70-
71-
this._dispatchEvent('dropzone:change', file);
7270
}
71+
72+
this._dispatchEvent('dropzone:change', event.target.files);
7373
}
7474

7575
_populateImagePreview(file: Blob) {

src/Dropzone/Resources/assets/test/controller.test.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ describe('DropzoneController', () => {
105105
expect(dispatched).toBe(true);
106106
});
107107

108-
it('file chosen', async () => {
108+
it('single file chosen', async () => {
109109
startStimulus();
110110
await waitFor(() => expect(getByTestId(container, 'input')).toHaveStyle({ display: 'block' }));
111111

@@ -126,6 +126,35 @@ describe('DropzoneController', () => {
126126

127127
// The event should have been dispatched
128128
expect(dispatched).not.toBeNull();
129-
expect(dispatched.detail).toStrictEqual(file);
129+
expect(dispatched.detail[0]).toStrictEqual(file);
130+
});
131+
132+
it('multiple files chosen', async () => {
133+
startStimulus();
134+
await waitFor(() => expect(getByTestId(container, 'input')).toHaveStyle({ display: 'block' }));
135+
136+
// Attach a listener to ensure the event is dispatched
137+
let dispatched = null;
138+
getByTestId(container, 'container').addEventListener('dropzone:change', (event) => (dispatched = event));
139+
140+
// Select the file
141+
const input = getByTestId(container, 'input');
142+
const files = [
143+
new File(['hello'], 'hello.png', { type: 'image/png' }),
144+
new File(['again'], 'again.png', { type: 'image/png' }),
145+
]
146+
147+
user.upload(input, files);
148+
expect(input.files[0]).toStrictEqual(files[0]);
149+
expect(input.files[1]).toStrictEqual(files[1]);
150+
151+
// The dropzone should be in preview mode
152+
await waitFor(() => expect(getByTestId(container, 'input')).toHaveStyle({ display: 'none' }));
153+
await waitFor(() => expect(getByTestId(container, 'placeholder')).toHaveStyle({ display: 'none' }));
154+
155+
// The event should have been dispatched
156+
expect(dispatched).not.toBeNull();
157+
expect(dispatched.detail[0]).toStrictEqual(files[0]);
158+
expect(dispatched.detail[1]).toStrictEqual(files[1]);
130159
});
131160
});

src/Dropzone/Resources/views/form_theme.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
<div class="dropzone-container" data-controller="{{ dataController }}">
7-
<input type="file" {{ block('widget_attributes') }} data-symfony--ux-dropzone--dropzone-target="input">
7+
<input type="file" {{ block('widget_attributes') }} data-symfony--ux-dropzone--dropzone-target="input" />
88

99
<div class="dropzone-placeholder" data-symfony--ux-dropzone--dropzone-target="placeholder">
1010
{%- if attr.placeholder is defined and attr.placeholder is not none -%}

src/Dropzone/Tests/Form/DropzoneTypeTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public function testRenderFormWithMultiFileUploads(): void
7979

8080
$this->assertSame(
8181
'<form name="form" method="post" enctype="multipart/form-data"><div id="form"><div><label for="form_photo" class="required">Photo</label><div class="dropzone-container" data-controller="mydropzone symfony--ux-dropzone--dropzone">
82-
<input type="file" id="form_photo" name="form[photo]" required="required" data-controller="" class="dropzone-input" data-symfony--ux-dropzone--dropzone-target="input" multiple />
82+
<input type="file" id="form_photo" name="form[photo][]" required="required" data-controller="" multiple="multiple" class="dropzone-input" data-symfony--ux-dropzone--dropzone-target="input" />
8383
8484
<div class="dropzone-placeholder" data-symfony--ux-dropzone--dropzone-target="placeholder"></div>
8585

0 commit comments

Comments
 (0)