Skip to content

Commit 3e5a60c

Browse files
committed
Cleaned up the way event handling works for multiple uploads.
1 parent 50fe75b commit 3e5a60c

File tree

2 files changed

+78
-23
lines changed

2 files changed

+78
-23
lines changed

src/dropzone.coffee

+45-20
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,18 @@ class Dropzone extends Em
5252
"removedfile"
5353
"thumbnail"
5454
"error"
55-
"processingfile"
55+
"processing"
56+
"processingmultiple"
5657
"uploadprogress"
5758
"totaluploadprogress"
5859
"sending"
60+
"sendingmultiple"
5961
"success"
62+
"successmultiple"
6063
"canceled"
64+
"canceledmultiple"
6165
"complete"
66+
"completemultiple"
6267
"reset"
6368
]
6469

@@ -303,10 +308,12 @@ class Dropzone extends Em
303308
# Called when a file gets processed. Since there is a cue, not all added
304309
# files are processed immediately.
305310
# Receives `file`
306-
processingfile: (file) ->
311+
processing: (file) ->
307312
file.previewElement.classList.add "dz-processing"
308313
file._removeLink.textContent = @options.dictCancelUpload if file._removeLink
309314

315+
processingmultiple: noop
316+
310317
# Called whenever the upload progress gets updated.
311318
# Receives `file`, `progress` (percentage 0-100) and `bytesSent`.
312319
# To get the total number of bytes of the file, use `file.size`
@@ -322,19 +329,27 @@ class Dropzone extends Em
322329
# `formData` object to add additional information.
323330
sending: noop
324331

332+
sendingmultiple: noop
333+
325334
# When the complete upload is finished and successfull
326335
# Receives `file`
327336
success: (file) ->
328337
file.previewElement.classList.add "dz-success"
329338

339+
successmultiple: noop
340+
330341
# When the upload is canceled.
331342
canceled: (file) -> @emit "error", file, "Upload canceled."
332343

344+
canceledmultiple: noop
345+
333346
# When the upload is finished, either with success or an error.
334347
# Receives `file`
335348
complete: (file) ->
336349
file._removeLink.textContent = @options.dictRemoveFile if file._removeLink
337350

351+
completemultiple: noop
352+
338353

339354

340355

@@ -691,7 +706,7 @@ class Dropzone extends Em
691706
@accept file, (error) =>
692707
if error
693708
file.accepted = false # Backwards compatibility
694-
@errorProcessing file, error # Will set the file.status
709+
@_errorProcessing [ file ], error # Will set the file.status
695710
else
696711
file.status = Dropzone.ACCEPTED
697712
file.accepted = true # Backwards compatibility
@@ -802,7 +817,9 @@ class Dropzone extends Em
802817
file.processing = yes # Backwards compatibility
803818
file.status = Dropzone.UPLOADING
804819

805-
@emit "processingfile", file
820+
@emit "processing", file
821+
822+
@emit "processingmultiple", files if @options.uploadMultiple
806823

807824
@uploadFiles files
808825

@@ -821,10 +838,12 @@ class Dropzone extends Em
821838
groupedFile.status = Dropzone.CANCELED for groupedFile in groupedFiles
822839
file.xhr.abort()
823840
@emit "canceled", groupedFile for groupedFile in groupedFiles
841+
@emit "canceledmultiple", groupedFiles if @options.uploadMultiple
824842

825843
else if file.status in [ Dropzone.ADDED, Dropzone.ACCEPTED, Dropzone.QUEUED ]
826844
file.status = Dropzone.CANCELED
827845
@emit "canceled", file
846+
@emit "canceledmultiple", [ file ] if @options.uploadMultiple
828847

829848
@processQueue()
830849

@@ -847,7 +866,7 @@ class Dropzone extends Em
847866

848867
handleError = =>
849868
for file in files
850-
@errorProcessing file, response || @options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr
869+
@_errorProcessing files, response || @options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr
851870

852871

853872
updateProgress = (e) =>
@@ -895,7 +914,7 @@ class Dropzone extends Em
895914
unless 200 <= xhr.status < 300
896915
handleError()
897916
else
898-
@finished file, response, e for file in files
917+
@_finished files, response, e
899918

900919
xhr.onerror = =>
901920
return if files[0].status == Dropzone.CANCELED
@@ -930,10 +949,8 @@ class Dropzone extends Em
930949

931950

932951
# Let the user add additional data if necessary
933-
if @options.uploadMultiple
934-
@emit "sending", files, xhr, formData
935-
else
936-
@emit "sending", file, xhr, formData for file in files
952+
@emit "sending", file, xhr, formData for file in files
953+
@emit "sendingmultiple", files, xhr, formData if @options.uploadMultiple
937954

938955
# Finally add the file
939956
# Has to be last because some servers (eg: S3) expect the file to be the
@@ -945,21 +962,29 @@ class Dropzone extends Em
945962

946963
# Called internally when processing is finished.
947964
# Individual callbacks have to be called in the appropriate sections.
948-
finished: (file, responseText, e) ->
949-
file.status = Dropzone.SUCCESS
950-
@processQueue()
951-
@emit "success", file, responseText, e
952-
@emit "finished", file, responseText, e # For backwards compatibility
953-
@emit "complete", file
965+
_finished: (files, responseText, e) ->
966+
for file in files
967+
file.status = Dropzone.SUCCESS
968+
@emit "success", file, responseText, e
969+
@emit "complete", file
970+
if @options.uploadMultiple
971+
@emit "successmultiple", files, responseText, e
972+
@emit "completemultiple", files
954973

974+
@processQueue()
955975

956976
# Called internally when processing is finished.
957977
# Individual callbacks have to be called in the appropriate sections.
958-
errorProcessing: (file, message, xhr) ->
959-
file.status = Dropzone.ERROR
978+
_errorProcessing: (files, message, xhr) ->
979+
for file in files
980+
file.status = Dropzone.ERROR
981+
@emit "error", file, message, xhr
982+
@emit "complete", file
983+
if @options.uploadMultiple
984+
@emit "errormultiple", files, message, xhr
985+
@emit "completemultiple", files
986+
960987
@processQueue()
961-
@emit "error", file, message, xhr
962-
@emit "complete", file
963988

964989

965990

test/test.coffee

+33-3
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,33 @@ describe "Dropzone", ->
849849
, 10
850850

851851

852+
it "should emit error and errormultiple when response was not OK", (done) ->
853+
dropzone.options.uploadMultiple = yes
854+
855+
error = no
856+
errormultiple = no
857+
complete = no
858+
completemultiple = no
859+
dropzone.on "error", -> error = yes
860+
dropzone.on "errormultiple", -> errormultiple = yes
861+
dropzone.on "complete", -> complete = yes
862+
dropzone.on "completemultiple", -> completemultiple = yes
863+
864+
dropzone.addFile mockFile
865+
866+
setTimeout ->
867+
868+
mockFile.status.should.eql Dropzone.UPLOADING
869+
870+
requests[0].status = 400
871+
requests[0].readyState = 4
872+
requests[0].onload()
873+
874+
expect(yes == error == errormultiple == complete == completemultiple).to.be.ok
875+
876+
done()
877+
, 10
878+
852879

853880
describe "settings()", ->
854881
it "should correctly set `withCredentials` on the xhr object", ->
@@ -902,9 +929,11 @@ describe "Dropzone", ->
902929
dropzone.options.paramName = "myName"
903930

904931
formData = null
932+
sendingMultipleCount = 0
905933
sendingCount = 0
906-
dropzone.on "sending", (files, xhr, tformData) ->
907-
sendingCount++
934+
dropzone.on "sending", (file, xhr, tformData) -> sendingCount++
935+
dropzone.on "sendingmultiple", (files, xhr, tformData) ->
936+
sendingMultipleCount++
908937
formData = tformData
909938
sinon.spy tformData, "append"
910939

@@ -915,7 +944,8 @@ describe "Dropzone", ->
915944
dropzone.addFile mock2
916945

917946
setTimeout ->
918-
sendingCount.should.equal 1
947+
sendingCount.should.equal 2
948+
sendingMultipleCount.should.equal 1
919949
dropzone.uploadFiles [ mock1, mock2 ]
920950
formData.append.callCount.should.equal 2
921951
formData.append.args[0][0].should.eql "myName[]"

0 commit comments

Comments
 (0)