Project

General

Profile

Download (17.9 KB) Statistics
| Branch: | Revision:
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">&nbsp;</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">&nbsp;</div>' +
247
            '<div class="plupload_file_status"><span>Status</span></div>' +
248
            '<div class="plupload_file_size">Size</div>' +
249
            '<div class="plupload_clearer">&nbsp;</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">&nbsp;</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

    
(21-21/23)