X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;ds=sidebyside;f=filex%2Fstatic%2Ffilex%2Ffilex.js;h=81b401cf4c9797b5fef83ccf6e072a70290ad162;hb=2a2a8a89e502704bd708daf8a5ac830fa6e41433;hp=3aed569c42a0b98a8c760adb195382d18fbedaba;hpb=562511e3faaa87a7082033c45f7ed2c788a2ef50;p=qcg-portal.git diff --git a/filex/static/filex/filex.js b/filex/static/filex/filex.js index 3aed569..81b401c 100644 --- a/filex/static/filex/filex.js +++ b/filex/static/filex/filex.js @@ -15,6 +15,10 @@ $(function(){ }); Filex.File = OfflineModel.extend({ + defaults: { + checked: false + }, + isDir: function() { return false; }, @@ -25,6 +29,10 @@ $(function(){ isHidden: function() { return this.get('name')[0] == '.'; + }, + + toggle: function() { + this.set('checked', !this.get('checked')); } }); @@ -113,12 +121,14 @@ $(function(){ tagName: 'tr', events: { - 'click .link': 'selected' + 'click .link': 'selected', + 'click input[type=checkbox]': 'toggle' }, initialize: function(options) { this.view = options.view; + this.listenTo(this.model, 'change', this.render); this.listenTo(this.model, 'remove', this.remove); this.listenTo(this.model, 'hidden', this.toggleHidden); }, @@ -136,6 +146,7 @@ $(function(){ path: this.view.path.full(), name: this.model.get('name') }); + data['cid'] = this.model.cid; this.$el.html(this.template()(data)); this.toggleHidden(); @@ -148,10 +159,18 @@ $(function(){ }, selected: function(e) { + e.preventDefault(); if (this.model.isDir()) { - e.preventDefault(); this.model.trigger('selected:dir', this.model); } + else { + this.model.trigger('selected:file', this.model); + this.toggle(); + } + }, + + toggle: function() { + this.model.toggle(); } }); @@ -193,7 +212,8 @@ $(function(){ events: { 'change #show-hidden': 'toggleHidden', - 'click #host-controls .view': 'hostEdit' + 'click #host-controls .view': 'hostEdit', + 'click #select-all': 'selectAll' }, initialize: function(options) { @@ -201,6 +221,7 @@ $(function(){ this.$error = $('#error'); this.$showHidden = $('#show-hidden'); this.$host = $('#host-controls'); + this.$selectAll = $('#select-all'); this.host = options.host; this.path = new Filex.Path(); @@ -212,6 +233,8 @@ $(function(){ this.listenTo(this.path, 'selected', this.selectedPath); this.listenTo(this.files, 'reset', this.resetFiles); this.listenTo(this.files, 'selected:dir', this.selectedDir); + this.listenTo(this.files, 'selected:file', this.selectedFile); + this.listenTo(this.files, 'change:checked', this.updateSelectAll); // used in selectize callbacks var view = this, @@ -259,8 +282,9 @@ $(function(){ }, render: function() { + this.updateSelectAll(); this.$host.find('.view').text(this.host); - this.$noItems.toggle((this.showHidden() ? !Boolean(this.files.length) : !Boolean(this.files.visible().length))); + this.$noItems.toggle(!Boolean(this.visibleFiles().length)); this.$error.hide(); }, @@ -334,6 +358,10 @@ $(function(){ this.path.add({'text': dir.get('name'), 'path': dir.get('name')}); }, + selectedFile: function(file) { + this.trigger('selected:file', this.host + this.path.full() + '/' + file.get('name')); + }, + selectedPath: function(bit) { var newPath = this.path.slice(0, this.path.indexOf(bit) + 1); this.path.set(newPath); @@ -355,6 +383,28 @@ $(function(){ idle: function() { this.$el.removeClass('busy'); + }, + + visibleFiles: function() { + return this.showHidden() ? this.files.models : this.files.visible(); + }, + + selectedFiles: function() { + return _.filter(this.visibleFiles(), function(item) { + return item.get('checked'); + }); + }, + + selectAll: function() { + var checked = this.$selectAll[0].checked; + + _.each(this.visibleFiles(), function(item) { + item.set('checked', checked); + }) + }, + + updateSelectAll: function() { + this.$selectAll.prop('checked', this.selectedFiles().length == this.visibleFiles().length); } }); });