gridftp ui: limit archive functionality only to moss
[qcg-portal.git] / qcg / templates / qcg / gridftp.html
index dd24d7e..6bf6a5d 100644 (file)
     {% include 'filex/source.js.html' %}
 
     <script>
+        var filex = filex || {};
+
         $(function () {
+            'use strict';
+
+            filex.initialLoad();
+
             var statusTimeout;
 
             String.prototype.endsWith = function(suffix) {
                 $('#status').text(msg);
             }
 
-            function fail() {
-                status('Wystąpił błąd.');
-                console.error(arguments);
-                filex.idle();
+            function failModal(msg) {
+                return function(xhr) {
+                    var $errorModal = $('#error-modal');
+
+                    $errorModal.find('#error-modal-label').text('Błąd serwera');
+                    $errorModal.find('.modal-body').html($('<h4>', {text: msg}));
+
+                    var error = (xhr.responseJSON || {}).error || undefined;
+
+                    if (typeof error === 'string')
+                        $errorModal.find('.modal-body').append($('<pre>', {text: error}));
+
+                    filex.idle();
+                    $errorModal.modal();
+
+                    console.error(arguments);
+                };
+            }
+
+            function conflictingName(name, modal) {
+                if (filex.files.some(function(item) { return item.get('name') == name })) {
+                    $('<div>', {
+                        'class': 'alert alert-danger',
+                        html: '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> Plik o podanej już nazwie istnieje!'
+                    }).prependTo(modal.find('.modal-body'));
+
+                    return true;
+                }
+
+                return false;
             }
 
             filex.files.on('change:checked reset', function() {
@@ -38,9 +70,9 @@
 
                 $('#btn-rename').toggleClass('disabled', selected != 1);
                 $('#btn-delete').toggleClass('disabled', selected == 0);
-                $('#btn-compress').toggleClass('disabled', selected == 0);
+                $('#btn-compress').toggleClass('disabled', filex.host != 'moss.man.poznan.pl' || selected == 0);
 
-                if (selected == 1) {
+                if (filex.host == 'moss.man.poznan.pl' && selected == 1) {
                     var filename = filex.selectedFiles()[0].get('name'),
                         is_archive = _.some(['.zip', '.tar.gz', '.tgz', '.tar.bz2', 'tbz'], function(ext) {
                             return filename.endsWith(ext);
                     $('#btn-extract').toggleClass('disabled', !is_archive);
                 }
                 else {
-                    $('#btn-extract').toggleClass('disabled', true);
+                    $('#btn-extract').addClass('disabled');
                 }
             });
 
+            $('form').on('show.bs.modal', function() {
+                $(this).find('.alert').remove();
+                this.reset();
+            }).on('shown.bs.modal', function() {
+                $(this).find('input[type="text"]')[0].focus();
+            });
+
             $('#btn-upload').on('click', function() {
-                var url = '{% url 'gridftp_upload' %}?' + $.param({host: filex.host, path: filex.path.full() + '/'});
+                var url = '{% url 'gridftp_upload' %}?' + $.param({host: filex.host, path: filex.path.full()});
 
                 var win = window.open(url, url, 'height=500,width=800');
                 win.focus();
 
             $('#btn-delete').on('click', function() {
                 var selected = _.groupBy(filex.selectedFiles(), function(item) { return item.get('type') }),
-                    dirs = _.map(selected.directory || [], function (item) { return item.get('name') }),
-                    files = _.map(selected.file || [], function (item) { return item.get('name') }),
+                    path = filex.path.full() + '/',
+                    dirs = _.map(selected.directory || [], function (item) { return path + item.get('name') }),
+                    files = _.map(selected.file || [], function (item) { return path + item.get('name') }),
                     data = {
                         host: filex.host,
-                        path: filex.path.full() + '/',
                         dirs: dirs,
                         files: files
                     },
 
                         if (keys.length) {
                             var $errorModal = $('#error-modal'),
-                                $errorList = $errorModal.find('dl').html('');
+                                $errorBody = $errorModal.find('.modal-body')
+                                                        .html($('<h4>', {text: 'Wystąpiły problemy podczas usuwania:'})),
+                                $errorList = $('<dl>', {'class': 'dl-horizontal'}).appendTo($errorBody);
+
+                            $errorModal.find('#error-modal-label').text('Błąd');
 
                             for (var i in keys) {
-                                $('<dt>', {text: keys[i]}).appendTo($errorList);
-                                $('<dd>', {text: response.fail[keys[i]]}).appendTo($errorList);
+                                if(keys.hasOwnProperty(i)) {
+                                    $('<dt>', {text: keys[i].replace(path, '')}).appendTo($errorList);
+                                    $('<dd>', {text: response.fail[keys[i]]}).appendTo($errorList);
+                                }
                             }
 
                             $errorModal.modal();
                         if (response.done.length)
                             filex.reloadFiles();
 
-                    }, 'json').fail(fail);
+                    }, 'json').fail(failModal('Nie udało się usunąć plików'));
 
                     $confirmModal.modal('hide');
                 });
                 var $this = $(this);
 
                 e.preventDefault();
+
+                if (conflictingName($this.find('#id_name').val(), $this))
+                    return;
+
                 filex.busy();
                 $this.modal('hide');
 
                 $.post($this.attr('action'), $this.serialize(), function() {
                     status('Katalog utworzono pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(fail);
+                }, 'json').fail(failModal('Nie udało się utworzyć katalogu'));
             });
 
             $('#rename-form').on('show.bs.modal', function() {
-                var $this = $(this);
+                $(this).find('#id_dst').val(filex.selectedFiles()[0].get('name'));
+            }).on('submit', function(e) {
+                e.preventDefault();
 
-                var file = filex.selectedFiles()[0];
+                var $this = $(this),
+                    path = filex.path.full() + '/',
+                    newName = $this.find('#id_dst').val(),
+                    data = {
+                        host: filex.host,
+                        src: path + filex.selectedFiles()[0].get('name'),
+                        dst: path + newName
+                    };
 
-                $this.find('#id_host').val(filex.host);
-                $this.find('#id_path').val(filex.path.full());
-                $this.find('#id_src').val(file.get('name'));
-                $this.find('#id_dst').val(file.get('name'));
-            }).on('submit', function(e) {
-                var $this = $(this);
+                if (conflictingName(newName, $this))
+                    return;
 
-                e.preventDefault();
                 filex.busy();
                 $this.modal('hide');
 
-                $.post($this.attr('action'), $this.serialize(), function() {
+                $.post($this.attr('action'), data, function() {
                     status('Nazwę zmieniono pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(fail);
+                }, 'json').fail(failModal('Nie udało się zmienić nazwy'));
             });
 
             $('#compress-form').on('submit', function(e) {
                 e.preventDefault();
 
                 var $this = $(this),
-                    name = $this.find('#id_name').val(),
+                    name = $this.find('#id_archive').val(),
                     type = $this.find('#id_type').val(),
+                    path = filex.path.full(),
                     archive = name + (name.endsWith(type) ? '' : type),
                     data = {
                         host: filex.host,
-                        path: filex.path.full(),
+                        path: path,
                         files: _.map(filex.selectedFiles(), function (item) { return item.get('name') }),
-                        archive: archive
+                        archive: path  + '/' + archive
                     };
 
-                // check if maybe file with given name exists
-                if (filex.files.some(function(item) { return item.get('name') == archive })) {
-                    $this.find('.alert').remove();
-
-                    $('<div>', {
-                        'class': 'alert alert-danger',
-                        html: '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> Plik o podanej już nazwie istnieje!'
-                    }).prependTo($this.find('.modal-body'));
-
+                if (conflictingName(archive, $this))
                     return;
-                }
 
                 filex.busy();
                 $this.modal('hide');
                 $.post($this.attr('action'), data, function() {
                     status('Archiwum utworzono pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(fail);
+                }, 'json').fail(failModal('Nie udało się utworzyć archiwum'));
             });
 
             $('#btn-extract').on('click', function() {
 
                 var data = {
                     host: filex.host,
-                    archive: filex.path.full() + '/' + filex.selectedFiles()[0].get('name'),
+                    path: filex.path.full() + '/' + filex.selectedFiles()[0].get('name'),
                     dst: filex.path.full()
                 };
 
                 $.post('{% url 'filex:extract' %}', data, function() {
                     status('Archiwum rozpakowano pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(fail);
+                }, 'json').fail(failModal('Nie udało się rozpakować archiwum'));
             });
         })
     </script>
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                         <span aria-hidden="true">&times;</span>
                     </button>
-                    <h4 class="modal-title" id="error-modal-label">Błąd</h4>
+                    <h4 class="modal-title" id="error-modal-label"></h4>
                 </div>
                 <div class="modal-body">
-                    <h4>Wystąpiły problemy podczas usuwania:</h4>
-                    <dl class="dl-horizontal"></dl>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-primary" data-dismiss="modal">OK</button>