1
|
define([
|
2
|
"dojo/query",
|
3
|
//'java/applet',
|
4
|
//'plupload/java',
|
5
|
// 'plupload/moxie',
|
6
|
'plupload/plupload',
|
7
|
//'plupload/ui',
|
8
|
'dijit/Dialog'
|
9
|
], function(query){
|
10
|
|
11
|
var upload = {};
|
12
|
// shows the upload dialog with plupload inside
|
13
|
upload.showDialog = function() {
|
14
|
if (!upload.inited) upload.init();
|
15
|
upload.dialog.show();
|
16
|
};
|
17
|
upload.updateList = updateList;
|
18
|
upload.files_uploaded = false;
|
19
|
upload.inited = false;
|
20
|
window.upload = upload;
|
21
|
|
22
|
function handleStatus(file) {
|
23
|
var actionClass, title;
|
24
|
|
25
|
if (file.status == plupload.DONE) {
|
26
|
actionClass = 'plupload_done';
|
27
|
title = "done";
|
28
|
}
|
29
|
|
30
|
if (file.status == plupload.FAILED) {
|
31
|
actionClass = 'plupload_failed';
|
32
|
//title = "failed: " + file.error_message;
|
33
|
if (file.error_message) title = file.error_message;
|
34
|
}
|
35
|
|
36
|
if (file.status == plupload.QUEUED) {
|
37
|
actionClass = 'plupload_delete';
|
38
|
title = "queued";
|
39
|
}
|
40
|
|
41
|
if (file.status == plupload.UPLOADING) {
|
42
|
actionClass = 'plupload_uploading';
|
43
|
title = "uploading";
|
44
|
}
|
45
|
$('#' + file.id).addClass(actionClass);
|
46
|
$('#' + file.id).find('a').css('display', 'block').attr('title', title);
|
47
|
}
|
48
|
|
49
|
function updateTotalProgress() {
|
50
|
// removed target here
|
51
|
$('div.plupload_progress').css('display', 'block');
|
52
|
$('span.plupload_total_status').html(uploader.total.percent + '%');
|
53
|
$('div.plupload_progress_bar').css('width', uploader.total.percent + '%');
|
54
|
$('span.plupload_upload_status').html('Uploaded ' + uploader.total.uploaded + '/' + uploader.files.length + ' files');
|
55
|
|
56
|
// All files are uploaded
|
57
|
if (uploader.total.uploaded == uploader.files.length) {
|
58
|
uploader.stop();
|
59
|
}
|
60
|
}
|
61
|
|
62
|
function updateList() {
|
63
|
var fileList = $('ul.plupload_filelist'),
|
64
|
hasQueuedFiles = false;
|
65
|
|
66
|
fileList.html('');
|
67
|
|
68
|
plupload.each(uploader.files, function(file) {
|
69
|
if (file.status == plupload.DONE) {
|
70
|
} else if(file.status == plupload.QUEUED){
|
71
|
hasQueuedFiles = true;
|
72
|
}
|
73
|
|
74
|
fileList.append(
|
75
|
'<li id="' + file.id + '">' +
|
76
|
'<div class="plupload_file_name"><span>' + file.name + '</span></div>' +
|
77
|
'<div class="plupload_file_action"><a href="#images"></a></div>' +
|
78
|
'<div class="plupload_file_status">' + file.percent + '%</div>' +
|
79
|
'<div class="plupload_file_size">' + plupload.formatSize(file.size) + '</div>' +
|
80
|
'<div class="plupload_clearer"> </div>' +
|
81
|
'</li>');
|
82
|
|
83
|
handleStatus(file);
|
84
|
|
85
|
$('#' + file.id + '.plupload_delete a').click(function(e) {
|
86
|
uploader.removeFile(file);
|
87
|
$('#' + file.id).empty();
|
88
|
e.preventDefault();
|
89
|
});
|
90
|
});
|
91
|
|
92
|
$('a.plupload_start').toggleClass('disabled', !hasQueuedFiles || uploader.state === plupload.STARTED);
|
93
|
$('span.plupload_total_file_size').html(plupload.formatSize(uploader.total.size));
|
94
|
|
95
|
// Scroll to end of file list
|
96
|
fileList[0].scrollTop = fileList[0].scrollHeight;
|
97
|
|
98
|
updateTotalProgress();
|
99
|
|
100
|
// Re-add drag message if there is no files
|
101
|
if (!uploader.files.length && uploader.features.dragdrop && uploader.settings.dragdrop) {
|
102
|
dojo.place('<li class="plupload_droptext" ondrop="uploader.drop(event)" ondragover="uploader.dragover(event);" ondragleave="uploader.dragleave(event);">' + ("Drag image file here.") + '</li>', id + '_filelist', 'last');
|
103
|
}
|
104
|
}//updateList
|
105
|
|
106
|
function myInit() {
|
107
|
$('a.plupload_add').click(function(e){
|
108
|
var old_files = [];
|
109
|
plupload.each(uploader.files, function(file){
|
110
|
if(file.status == plupload.DONE || file.status == plupload.FAILED){
|
111
|
old_files.push(file);
|
112
|
}
|
113
|
});
|
114
|
plupload.each(old_files, function(file){
|
115
|
$('#' + file.id).empty();
|
116
|
uploader.removeFile(file);
|
117
|
});
|
118
|
});
|
119
|
$('#urlupload').focus(function(e){
|
120
|
jQuery('a.plupload_add_url').show();
|
121
|
jQuery('a.plupload_add').hide();
|
122
|
});
|
123
|
|
124
|
$('#urlupload').blur(function(e){
|
125
|
if (!$("#urlupload").val()) {
|
126
|
jQuery('a.plupload_add_url').hide();
|
127
|
jQuery('a.plupload_add').show();
|
128
|
}
|
129
|
});
|
130
|
$('a.plupload_add_url').click(function(e){
|
131
|
var old_files = [];
|
132
|
plupload.each(uploader.files, function(file){
|
133
|
if(file.status == plupload.DONE || file.status == plupload.FAILED){
|
134
|
old_files.push(file);
|
135
|
}
|
136
|
});
|
137
|
plupload.each(old_files, function(file){
|
138
|
$('#' + file.id).empty();
|
139
|
uploader.removeFile(file);
|
140
|
});
|
141
|
if ($("#urlupload").val()) {
|
142
|
var urlfile = $("#urlupload").val();
|
143
|
if(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(urlfile)) {
|
144
|
$(".plupload_add_url").toggleClass('disabled', true);
|
145
|
jQuery.get("/stabile/images?action=urlupload\&url=" + encodeURIComponent(urlfile) + "\&probe=1",
|
146
|
function(data) {
|
147
|
if (data.status == 'OK') {
|
148
|
var match = false;
|
149
|
jQuery.each(uploader.files, function(i, val) {if (val.name == data.name) match=true;});
|
150
|
if (match) {
|
151
|
IRIGO.toast("You have already added a file with that name");
|
152
|
} else {
|
153
|
var nfile = new plupload.File({name: data.name, size: data.size, destroy: function(){;} });
|
154
|
nfile.url = urlfile;
|
155
|
nfile.path = data.path;
|
156
|
//var nfile = {id: 'url_' + Date.now(), name: data.name, size: data.size, status:1, loaded:0, percent:0, url: urlfile, path: data.path, destroy: function(){;}, getSource: function(){return {size: data.size};}};
|
157
|
uploader.files.push(nfile);
|
158
|
updateList();
|
159
|
}
|
160
|
$("#urlupload").val('');
|
161
|
} else {
|
162
|
IRIGO.toast("The file could not be downloaded. " + data.message);
|
163
|
}
|
164
|
$(".plupload_add_url").toggleClass('disabled', false);
|
165
|
jQuery('a.plupload_add_url').hide();
|
166
|
jQuery('a.plupload_add').show();
|
167
|
});
|
168
|
} else {
|
169
|
IRIGO.toast("That's not a valid URL. Please type in a http(s) URL which points to the image you want to upload.");
|
170
|
}
|
171
|
}
|
172
|
e.preventDefault();
|
173
|
});
|
174
|
|
175
|
$('a.plupload_start').click(function(e) {
|
176
|
if (!$('a.plupload_start').hasClass('disabled')) {
|
177
|
uploader.start();
|
178
|
$('a.plupload_start').toggleClass('disabled', true);
|
179
|
}
|
180
|
e.preventDefault();
|
181
|
});
|
182
|
|
183
|
$('a.plupload_stop').click(function(e) {
|
184
|
var finished = true;
|
185
|
uploader.stop();
|
186
|
$('a.plupload_start').toggleClass('disabled', !finished);
|
187
|
e.preventDefault();
|
188
|
});
|
189
|
|
190
|
// Initially start button is disabled.
|
191
|
$('a.plupload_start').addClass('disabled');
|
192
|
}
|
193
|
|
194
|
upload.init = function() {
|
195
|
plupload.Downloader = function(file) {
|
196
|
var percent = 0;
|
197
|
function progress() {
|
198
|
if (percent<100) {
|
199
|
jQuery.get("/stabile/images?action=urlupload\&path=" + encodeURIComponent(file.path) + "\&getsize=1",
|
200
|
function(data) {
|
201
|
if (data.status == 'OK') {
|
202
|
percent = Math.round(100*data.size/file.size);
|
203
|
file.loaded = data.size;
|
204
|
file.percent = percent;
|
205
|
uploader.trigger('UploadProgress', file);
|
206
|
setTimeout(function() {
|
207
|
progress();
|
208
|
}, 2000);
|
209
|
}
|
210
|
});
|
211
|
} else {
|
212
|
file.status = plupload.DONE;
|
213
|
console.log("done downloading", file);
|
214
|
uploader.trigger('FileUploaded', file);
|
215
|
}
|
216
|
}
|
217
|
|
218
|
plupload.extend(this, {
|
219
|
start: function() {
|
220
|
jQuery.get("/stabile/images?action=urlupload\&url=" + encodeURIComponent(file.url)
|
221
|
+ "\&path=" + encodeURIComponent(file.path)
|
222
|
+ "\&name=" + encodeURIComponent(file.name)
|
223
|
+ "\&size=" + file.size,
|
224
|
function(data) {
|
225
|
if (data.status == 'OK') {
|
226
|
progress();
|
227
|
}
|
228
|
}
|
229
|
)
|
230
|
}
|
231
|
});
|
232
|
}
|
233
|
if(!upload.dialog) {
|
234
|
var ucontent = '<div class="plupload_wrapper plupload_scroll">' +
|
235
|
'<div id="uploadDialogDiv_container" class="plupload_container">' +
|
236
|
'<div class="plupload">' +
|
237
|
'<div class="plupload_header">' +
|
238
|
'<div class="plupload_header_content">' +
|
239
|
'<div class="plupload_header_text">Add files to the upload queue and click the start button.</div>' +
|
240
|
'</div>' +
|
241
|
'</div>' +
|
242
|
|
243
|
'<div class="plupload_content" style="margin-bottom:10px;">' +
|
244
|
'<div class="plupload_filelist_header">' +
|
245
|
'<div class="plupload_file_name">Filename</div>' +
|
246
|
'<div class="plupload_file_action"> </div>' +
|
247
|
'<div class="plupload_file_status"><span>Status</span></div>' +
|
248
|
'<div class="plupload_file_size">Size</div>' +
|
249
|
'<div class="plupload_clearer"> </div>' +
|
250
|
'</div>' +
|
251
|
|
252
|
'<ul id="uploadDialogDiv_filelist" class="plupload_filelist"></ul>' +
|
253
|
|
254
|
'<div class="plupload_filelist_footer">' +
|
255
|
'<div class="plupload_file_name">' +
|
256
|
'<span class="plupload_upload_status"></span>' +
|
257
|
'</div>' +
|
258
|
'<div class="plupload_file_action"></div>' +
|
259
|
'<div class="plupload_file_status"><span class="plupload_total_status">0%</span></div>' +
|
260
|
'<div class="plupload_file_size"><span class="plupload_total_file_size">0 b</span></div>' +
|
261
|
'<div class="plupload_progress" style="display:none;">' +
|
262
|
'<div class="plupload_progress_container">' +
|
263
|
'<div class="plupload_progress_bar"></div>' +
|
264
|
'</div>' +
|
265
|
'</div>' +
|
266
|
'<div class="plupload_clearer"> </div>' +
|
267
|
'</div>' +
|
268
|
'</div>' +
|
269
|
'<div id="uploadButtons">' +
|
270
|
'<input style="width:250px; height: 30px; font-size:90%;" id="urlupload" placeholder="Add image file from URL" class="form-control pull-left input-small">' +
|
271
|
'<span class="plupload_buttons">' +
|
272
|
'<a href="#images" style="display:none;" class="plupload_button plupload_add_url btn btn-info btn-sm">Add from URL</a> ' +
|
273
|
'<span id="plupload_container"><a href="#images" id="uploadDialogDiv_browse" class="plupload_button plupload_add btn btn-info btn-sm">Add local file</a></span> ' +
|
274
|
'<a href="#images" class="plupload_button plupload_start btn btn-success btn-sm">Start upload</a>' +
|
275
|
'</span>' +
|
276
|
'</div>' +
|
277
|
'</div>' +
|
278
|
'</div>' +
|
279
|
'<input type="hidden" id="uploadDialogDiv_count" name="uploadDialogDiv_count" value="0" />' +
|
280
|
'</div>';
|
281
|
|
282
|
var content = [
|
283
|
'<div>',
|
284
|
' <div style="float:right; margin-right:10px;"><a href="https://www.origo.io/info/stabiledocs/web/images/upload" rel="help" target="_blank" id="irigo-upload-tooltip">help</a></div>',
|
285
|
' <div id="uploadDialogDiv" style="width: 450px; height: 360px; margin:10px;">' +
|
286
|
ucontent +
|
287
|
'</div>',
|
288
|
'</div>'].join('\n');
|
289
|
|
290
|
upload.dialog = new dijit.Dialog({ id: 'uploadDialog', onCancel: function() {if (upload.files_uploaded) {upload.files_uploaded=false;images.grid.refresh();}}});
|
291
|
upload.dialog.set('title', 'Image Transfers');
|
292
|
upload.dialog.set('content', content);
|
293
|
var q = dojo.query('#irigo-upload-tooltip', upload.dialog.domNode);
|
294
|
if(q.irigoTooltip){q.irigoTooltip();};
|
295
|
|
296
|
var uploader = new plupload.Uploader({
|
297
|
browse_button : document.getElementById('uploadDialogDiv_browse'),
|
298
|
runtimes : 'html5',
|
299
|
url: '/stabile/images?action=upload',
|
300
|
chunk_size : '10mb',
|
301
|
drop_element: ['uploadDialogDiv_filelist', 'uploadDialogDiv_browse'],
|
302
|
java_applet_url: '/stabile/static/applet/plupload.java.jar',
|
303
|
loader_url: '/stabile/static/img/loader.gif',
|
304
|
// dragdrop : true,
|
305
|
container : document.getElementById("plupload_container"),
|
306
|
filters : {
|
307
|
max_file_size : '200gb',
|
308
|
prevent_duplicates: true,
|
309
|
mime_types: [
|
310
|
{title : "Native image files", extensions : "qcow2"},
|
311
|
{title : "Foreign image files", extensions : "img,vdi,vmdk"},
|
312
|
{title : "CDs", extensions : "iso"}
|
313
|
]
|
314
|
},
|
315
|
init: {
|
316
|
Init: function() {
|
317
|
if (!jQuery("#urlupload").val()) {
|
318
|
jQuery('a.plupload_add_url').hide();
|
319
|
jQuery('a.plupload_add').show();
|
320
|
}
|
321
|
myInit();
|
322
|
//updateList();
|
323
|
|
324
|
},
|
325
|
Error: function(up, err) {
|
326
|
var file = err.file, message;
|
327
|
if (file) {
|
328
|
message = err.message;
|
329
|
if (err.details) {
|
330
|
message += " (" + err.details + ")";
|
331
|
IRIGO.toast(("Error: ") + message);
|
332
|
console.log(message, err);
|
333
|
}
|
334
|
if (err.code == plupload.FILE_SIZE_ERROR) {
|
335
|
IRIGO.toast(("Error: File to large: ") + file.name);
|
336
|
}
|
337
|
else if (err.code == plupload.FILE_EXTENSION_ERROR) {
|
338
|
IRIGO.toast(("Error: Invalid file extension: ") + file.name);
|
339
|
}
|
340
|
else {
|
341
|
IRIGO.toast("Error #" + err.code + ": " + err.message);
|
342
|
}
|
343
|
}
|
344
|
//$('div.plupload_progress').css('display', 'none');
|
345
|
},
|
346
|
FilesAdded: function(up, files) {
|
347
|
updateList();
|
348
|
},
|
349
|
FileUploaded: function(up, file, res){
|
350
|
if (res && res.response && res.response.indexOf('Error')==0) {
|
351
|
file.status = plupload.FAILED;
|
352
|
file.error_message = res.response;
|
353
|
IRIGO.toast(res.response);
|
354
|
}
|
355
|
handleStatus(file);
|
356
|
dojo.publish('upload:file_uploaded');
|
357
|
upload.files_uploaded = true;
|
358
|
//$('div.plupload_progress').css('display', 'none');
|
359
|
},
|
360
|
QueueChanged: function() {
|
361
|
updateList();
|
362
|
},
|
363
|
StateChanged: function(up) {
|
364
|
if (uploader.state === plupload.STARTED) {
|
365
|
$('span.plupload_upload_status,div.plupload_progress,a.plupload_stop').css('display', 'block');
|
366
|
$('span.plupload_upload_status').html('Uploaded 0/' + uploader.files.length + ' files');
|
367
|
}
|
368
|
else {
|
369
|
$('a.plupload_stop,div.plupload_progress').css('display', 'none');
|
370
|
$('a.plupload_delete').css('display', 'block');
|
371
|
}
|
372
|
if (up.state == plupload.STOPPED) {
|
373
|
updateList();
|
374
|
}
|
375
|
},
|
376
|
UploadProgress: function(up, file) {
|
377
|
// Set file specific progress
|
378
|
$('#' + file.id + ' div.plupload_file_status').html(file.percent + '%');
|
379
|
handleStatus(file);
|
380
|
updateTotalProgress();
|
381
|
},
|
382
|
BeforeUpload: function(up, file) {
|
383
|
},
|
384
|
UploadFile: function(up, file) {
|
385
|
if(file.url) {
|
386
|
console.log("downloading file", up, file);
|
387
|
var download = new plupload.Downloader(file);
|
388
|
download.start();
|
389
|
return false;
|
390
|
} else {
|
391
|
console.log("uploading file", up, file);
|
392
|
}
|
393
|
}
|
394
|
}
|
395
|
});
|
396
|
|
397
|
uploader.init();
|
398
|
window.uploader = uploader;
|
399
|
upload.inited = true;
|
400
|
}
|
401
|
}
|
402
|
return upload;
|
403
|
});
|
404
|
|