fix handling zip archives
[qcg-portal.git] / qcg / templates / qcg / gridftp.html
index c457396..dd24d7e 100644 (file)
         $(function () {
             var statusTimeout;
 
+            String.prototype.endsWith = function(suffix) {
+                return this.indexOf(suffix, this.length - suffix.length) !== -1;
+            };
+
             function status(msg) {
                 clearTimeout(statusTimeout);
                 statusTimeout = setTimeout(function() {
                 $('#status').text(msg);
             }
 
+            function fail() {
+                status('Wystąpił błąd.');
+                console.error(arguments);
+                filex.idle();
+            }
+
             filex.files.on('change:checked reset', function() {
                 var selected = filex.selectedFiles().length;
 
                 $('#btn-rename').toggleClass('disabled', selected != 1);
                 $('#btn-delete').toggleClass('disabled', selected == 0);
+                $('#btn-compress').toggleClass('disabled', selected == 0);
+
+                if (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-upload').on('click', function() {
                         if (response.done.length)
                             filex.reloadFiles();
 
-                    }, 'json');
+                    }, 'json').fail(fail);
 
                     $confirmModal.modal('hide');
                 });
                 $this.find('#id_host').val(filex.host);
                 $this.find('#id_path').val(filex.path.full());
 
-                $.post($this.attr('action'), $this.serialize(), function(response) {
+                $.post($this.attr('action'), $this.serialize(), function() {
                     status('Katalog utworzono pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(function(xhr) {
-                    status('Wystąpił błąd: ' + xhr.responseJSON.msg);
-                    filex.idle();
-                });
+                }, 'json').fail(fail);
             });
 
             $('#rename-form').on('show.bs.modal', function() {
                 filex.busy();
                 $this.modal('hide');
 
-                $.post($this.attr('action'), $this.serialize(), function(response) {
+                $.post($this.attr('action'), $this.serialize(), function() {
                     status('Nazwę zmieniono pomyślnie');
                     filex.reloadFiles();
-                }, 'json').fail(function(xhr) {
-                    status('Wystąpił błąd: ' + xhr.responseJSON.msg);
-                    filex.idle();
-                });
+                }, 'json').fail(fail);
+            });
+
+            $('#compress-form').on('submit', function(e) {
+                e.preventDefault();
+
+                var $this = $(this),
+                    name = $this.find('#id_name').val(),
+                    type = $this.find('#id_type').val(),
+                    archive = name + (name.endsWith(type) ? '' : type),
+                    data = {
+                        host: filex.host,
+                        path: filex.path.full(),
+                        files: _.map(filex.selectedFiles(), function (item) { return item.get('name') }),
+                        archive: 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'));
+
+                    return;
+                }
+
+                filex.busy();
+                $this.modal('hide');
+
+                $.post($this.attr('action'), data, function() {
+                    status('Archiwum utworzono pomyślnie');
+                    filex.reloadFiles();
+                }, 'json').fail(fail);
+            });
+
+            $('#btn-extract').on('click', function() {
+                filex.busy();
+
+                var data = {
+                    host: filex.host,
+                    archive: 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);
             });
         })
     </script>
             </div>
         </div>
     </form>
+
+    <form id="compress-form" action="{% url 'filex:compress' %}" class="modal fade form-horizontal" tabindex="-1" role="dialog" aria-labelledby="compress-modal-label" aria-hidden="true">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                    <h4 class="modal-title" id="compress-modal-label">Podaj nazwę archiwum</h4>
+                </div>
+                <div class="modal-body">
+                    {% csrf_token %}
+                    {% bootstrap_form archive_form layout='horizontal' %}
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Anuluj</button>
+                    <button type="submit" class="btn btn-primary">OK</button>
+                </div>
+            </div>
+        </div>
+    </form>
 {% endblock container %}
 
 {% block footer %}
                     <button class="btn btn-default navbar-btn" data-toggle="modal" data-target="#mkdir-form">Utwórz katalog</button>
                 </div>
                 <div class="btn-group" role="group">
-                    <button id="btn-rename" class="btn btn-default navbar-btn disabled"  data-toggle="modal" data-target="#rename-form">Zmień nazwę</button>
+                    <button id="btn-rename" class="btn btn-default navbar-btn disabled" data-toggle="modal" data-target="#rename-form">Zmień nazwę</button>
                     <button id="btn-delete" class="btn btn-default navbar-btn disabled">Usuń</button>
                 </div>
+                <div class="btn-group" role="group">
+                    <button id="btn-compress" class="btn btn-default navbar-btn disabled" data-toggle="modal" data-target="#compress-form">Spakuj</button>
+                    <button id="btn-extract" class="btn btn-default navbar-btn disabled">Rozpakuj</button>
+                </div>
             </div>
             <p id="status" class="navbar-text"></p>
         </div>