@@ -31,7 +31,7 @@ angular.module("umbraco.directives")
31
31
propertyAlias : '@' ,
32
32
accept : '@' ,
33
33
maxFileSize : '@' ,
34
-
34
+
35
35
compact : '@' ,
36
36
hideDropzone : '@' ,
37
37
acceptedMediatypes : '=' ,
@@ -42,9 +42,10 @@ angular.module("umbraco.directives")
42
42
} ,
43
43
link : function ( scope , element , attrs ) {
44
44
scope . queue = [ ] ;
45
- scope . done = [ ] ;
46
- scope . rejected = [ ] ;
45
+ scope . totalQueued = 0 ;
47
46
scope . currentFile = undefined ;
47
+ scope . processed = [ ] ;
48
+ scope . totalMessages = 0 ;
48
49
49
50
function _filterFile ( file ) {
50
51
var ignoreFileNames = [ 'Thumbs.db' ] ;
@@ -65,51 +66,50 @@ angular.module("umbraco.directives")
65
66
function _filesQueued ( files , event ) {
66
67
//Push into the queue
67
68
Utilities . forEach ( files , file => {
68
- if ( _filterFile ( file ) === true ) {
69
-
70
- if ( file . $error ) {
71
- scope . rejected . push ( file ) ;
72
- } else {
73
- scope . queue . push ( file ) ;
74
- }
69
+ if ( _filterFile ( file ) === true ) {
70
+ file . messages = [ ] ;
71
+ scope . queue . push ( file ) ;
75
72
}
76
73
} ) ;
77
74
78
- //when queue is done, kick the uploader
79
- if ( ! scope . working ) {
80
- // Upload not allowed
81
- if ( ! scope . acceptedMediatypes || ! scope . acceptedMediatypes . length ) {
82
- files . map ( file => {
83
- file . uploadStatus = "error" ;
84
- file . serverErrorMessage = "File type is not allowed here" ;
85
- scope . rejected . push ( file ) ;
86
- } ) ;
87
- scope . queue = [ ] ;
88
- }
89
- // If we have Accepted Media Types, we will ask to choose Media Type, if Choose Media Type returns false, it only had one choice and therefor no reason to
90
- if ( scope . acceptedMediatypes && _requestChooseMediaTypeDialog ( ) === false ) {
91
- scope . contentTypeAlias = "umbracoAutoSelect" ;
75
+ // Upload not allowed
76
+ if ( ! scope . acceptedMediatypes || ! scope . acceptedMediatypes . length ) {
77
+ files . map ( file => {
78
+ file . messages . push ( { message : "File type is not allowed here" , type : "Error" } ) ;
79
+ } ) ;
80
+ }
92
81
93
- _processQueueItem ( ) ;
94
- }
82
+ // If we have Accepted Media Types, we will ask to choose Media Type, if Choose Media Type returns false, it only had one choice and therefor no reason to
83
+ if ( scope . acceptedMediatypes && _requestChooseMediaTypeDialog ( ) === false ) {
84
+ scope . contentTypeAlias = "umbracoAutoSelect" ;
95
85
}
86
+
87
+ // Add the processed length, as we might be uploading in stages
88
+ scope . totalQueued = scope . queue . length + scope . processed . length ;
89
+
90
+ _processQueueItems ( ) ;
96
91
}
97
92
98
- function _processQueueItem ( ) {
99
- if ( scope . queue . length > 0 ) {
93
+ function _processQueueItems ( ) {
94
+ // if we have processed all files, either by successful
95
+ // upload, or attending to all messages, we deem the
96
+ // action complete, else continue processing files
97
+ scope . totalMessages = scope . processed . filter ( e => e . messages . length > 0 ) . length ;
98
+ if ( scope . totalQueued === scope . processed . length ) {
99
+ if ( scope . totalMessages === 0 ) {
100
+ if ( scope . filesUploaded ) {
101
+ //queue is empty, trigger the done action
102
+ scope . filesUploaded ( scope . done ) ;
103
+ }
104
+ //auto-clear the done queue after 3 secs
105
+ var currentLength = scope . processed . length ;
106
+ $timeout ( function ( ) {
107
+ scope . processed . splice ( 0 , currentLength ) ;
108
+ } , 3000 ) ;
109
+ }
110
+ } else {
100
111
scope . currentFile = scope . queue . shift ( ) ;
101
112
_upload ( scope . currentFile ) ;
102
- } else if ( scope . done . length > 0 ) {
103
- if ( scope . filesUploaded ) {
104
- //queue is empty, trigger the done action
105
- scope . filesUploaded ( scope . done ) ;
106
- }
107
-
108
- //auto-clear the done queue after 3 secs
109
- var currentLength = scope . done . length ;
110
- $timeout ( function ( ) {
111
- scope . done . splice ( 0 , currentLength ) ;
112
- } , 3000 ) ;
113
113
}
114
114
}
115
115
@@ -134,55 +134,36 @@ angular.module("umbraco.directives")
134
134
var progressPercentage = parseInt ( 100.0 * evt . loaded / evt . total , 10 ) ;
135
135
// set percentage property on file
136
136
file . uploadProgress = progressPercentage ;
137
- // set uploading status on file
138
- file . uploadStatus = "uploading" ;
139
137
}
140
138
} )
141
- . success ( function ( data , status , headers , config ) {
142
- if ( data . notifications && data . notifications . length > 0 ) {
143
- // set error status on file
144
- file . uploadStatus = "error" ;
145
- // Throw message back to user with the cause of the error
146
- file . serverErrorMessage = data . notifications [ 0 ] . message ;
147
- // Put the file in the rejected pool
148
- scope . rejected . push ( file ) ;
149
- } else {
150
- // set done status on file
151
- file . uploadStatus = "done" ;
152
- file . uploadProgress = 100 ;
153
- // set date/time for when done - used for sorting
154
- file . doneDate = new Date ( ) ;
155
- // Put the file in the done pool
156
- scope . done . push ( file ) ;
157
- }
139
+ . success ( function ( data , status , headers , config ) {
140
+ // Set server messages
141
+ file . messages = data . notifications ;
142
+ scope . processed . push ( file ) ;
143
+ //after processing, test if everything is done
158
144
scope . currentFile = undefined ;
159
- //after processing, test if everthing is done
160
- _processQueueItem ( ) ;
145
+ _processQueueItems ( ) ;
161
146
} )
162
147
. error ( function ( evt , status , headers , config ) {
163
- // set status done
164
- file . uploadStatus = "error" ;
165
148
//if the service returns a detailed error
166
149
if ( evt . InnerException ) {
167
- file . serverErrorMessage = evt . InnerException . ExceptionMessage ;
150
+ file . messages . push ( { message : evt . InnerException . ExceptionMessage , type : "Error" } ) ;
168
151
//Check if its the common "too large file" exception
169
152
if ( evt . InnerException . StackTrace &&
170
153
evt . InnerException . StackTrace . indexOf ( "ValidateRequestEntityLength" ) > 0 ) {
171
- file . serverErrorMessage = "File too large to upload" ;
154
+ file . messages . push ( { message : "File too large to upload" , type : "Error" } ) ;
172
155
}
173
156
} else if ( evt . Message ) {
174
- file . serverErrorMessage = evt . Message ;
175
- } else if ( evt && typeof evt === ' string' ) {
176
- file . serverErrorMessage = evt ;
157
+ file . messages . push ( { message : evt . Message , type : "Error" } ) ;
158
+ } else if ( evt && typeof evt === " string" ) {
159
+ file . messages . push ( { message : evt , type : "Error" } ) ;
177
160
}
178
161
// If file not found, server will return a 404 and display this message
179
162
if ( status === 404 ) {
180
- file . serverErrorMessage = "File not found" ;
163
+ file . messages . push ( { message : "File not found" , type : "Error" } ) ;
181
164
}
182
- //after processing, test if everthing is done
183
- scope . rejected . push ( file ) ;
184
165
scope . currentFile = undefined ;
185
- _processQueueItem ( ) ;
166
+ _processQueueItems ( ) ;
186
167
} ) ;
187
168
}
188
169
@@ -224,16 +205,14 @@ angular.module("umbraco.directives")
224
205
availableItems : filteredMediaTypes ,
225
206
submit : function ( model ) {
226
207
scope . contentTypeAlias = model . selectedItem . alias ;
227
- _processQueueItem ( ) ;
208
+ _processQueueItems ( ) ;
228
209
229
210
overlayService . close ( ) ;
230
211
} ,
231
212
close : function ( ) {
232
213
233
214
scope . queue . map ( function ( file ) {
234
- file . uploadStatus = "error" ;
235
- file . serverErrorMessage = "No files uploaded, no mediatype selected" ;
236
- scope . rejected . push ( file ) ;
215
+ file . messages . push ( { message :"No files uploaded, no mediatype selected" , type : "Error" } ) ;
237
216
} ) ;
238
217
scope . queue = [ ] ;
239
218
@@ -245,14 +224,26 @@ angular.module("umbraco.directives")
245
224
overlayService . open ( dialog ) ;
246
225
} ) ;
247
226
248
- return true ; // yes, we did open the choose-media dialog, therefor we return true.
227
+ return true ; // yes, we did open the choose-media dialog, therefore we return true.
228
+ }
229
+
230
+ scope . dismissMessages = function ( file ) {
231
+ file . messages = [ ] ;
232
+ _processQueueItems ( ) ;
233
+ }
234
+
235
+ scope . dismissAllMessages = function ( ) {
236
+ Utilities . forEach ( scope . processed , file => {
237
+ file . messages = [ ] ;
238
+ } ) ;
239
+ _processQueueItems ( ) ;
249
240
}
250
241
251
242
scope . handleFiles = function ( files , event , invalidFiles ) {
252
243
const allFiles = [ ...files , ...invalidFiles ] ;
253
244
254
245
// add unique key for each files to use in ng-repeats
255
- allFiles . forEach ( file => {
246
+ Utilities . forEach ( allFiles , file => {
256
247
file . key = String . CreateGuid ( ) ;
257
248
} ) ;
258
249
0 commit comments