2015-01-25 10:47:42 +00:00
|
|
|
define([
|
2015-01-30 11:36:42 +00:00
|
|
|
'jquery',
|
|
|
|
'underscore',
|
|
|
|
'backbone',
|
|
|
|
'common',
|
|
|
|
'file-tree',
|
|
|
|
'app/collections/dirents',
|
2015-02-01 06:15:00 +00:00
|
|
|
'app/views/dirent',
|
2015-01-30 11:36:42 +00:00
|
|
|
'text!' + app.config._tmplRoot + 'dir-op-bar.html',
|
|
|
|
'text!' + app.config._tmplRoot + 'path-bar.html',
|
|
|
|
], function($, _, Backbone, Common, FileTree, DirentCollection, DirentView,
|
|
|
|
DirOpBarTemplate, PathBarTemplate) {
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var DirView = Backbone.View.extend({
|
|
|
|
el: $('#dir-view'),
|
|
|
|
path_bar_template: _.template(PathBarTemplate),
|
|
|
|
dir_op_bar_template: _.template(DirOpBarTemplate),
|
2015-01-30 11:47:17 +00:00
|
|
|
newDirTemplate: _.template($("#add-new-dir-form-template").html()),
|
|
|
|
newFileTemplate: _.template($("#add-new-file-form-template").html()),
|
2015-01-30 11:36:42 +00:00
|
|
|
|
|
|
|
initialize: function(options) {
|
|
|
|
this.$dirent_list = this.$('.repo-file-list tbody');
|
|
|
|
this.$path_bar = this.$('.path');
|
|
|
|
// For compatible with css, we use .repo-op instead of .dir-op
|
|
|
|
this.$dir_op_bar = this.$('.repo-op');
|
|
|
|
|
|
|
|
this.dir = new DirentCollection();
|
|
|
|
this.listenTo(this.dir, 'add', this.addOne);
|
|
|
|
this.listenTo(this.dir, 'reset', this.reset);
|
|
|
|
|
|
|
|
// initialize common js behavior
|
|
|
|
$('th .checkbox-orig').unbind();
|
2015-02-03 05:47:22 +00:00
|
|
|
|
|
|
|
var _this = this;
|
|
|
|
$(window).scroll(function() {
|
|
|
|
if ($(_this.el).is(':visible')) {
|
|
|
|
_this.onWindowScroll();
|
|
|
|
}
|
|
|
|
});
|
2015-01-30 11:36:42 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
showDir: function(repo_id, path) {
|
|
|
|
this.$el.show();
|
2015-02-03 05:47:22 +00:00
|
|
|
var loading_tip = this.$('.loading-tip').show();
|
|
|
|
var dir = this.dir;
|
|
|
|
dir.setPath(repo_id, path);
|
|
|
|
dir.fetch({
|
|
|
|
reset: true,
|
|
|
|
data: {'p': path},
|
|
|
|
success: function (collection, response, opts) {
|
|
|
|
dir.last_start = 0; // for 'more'
|
|
|
|
if (response.dirent_list.length == 0 || // the dir is empty
|
|
|
|
!response.dirent_more ) { // no 'more'
|
|
|
|
loading_tip.hide();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
error: function () { // todo
|
|
|
|
loading_tip.hide();
|
|
|
|
}
|
|
|
|
});
|
2015-01-30 11:36:42 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
hide: function() {
|
|
|
|
this.$el.hide();
|
|
|
|
},
|
|
|
|
|
|
|
|
addOne: function(dirent) {
|
|
|
|
var view = new DirentView({model: dirent, dirView: this});
|
|
|
|
this.$dirent_list.append(view.render().el);
|
|
|
|
},
|
|
|
|
|
|
|
|
reset: function() {
|
|
|
|
this.$dirent_list.empty();
|
|
|
|
this.dir.each(this.addOne, this);
|
|
|
|
this.renderPath();
|
|
|
|
this.renderDirOpBar();
|
|
|
|
},
|
|
|
|
|
|
|
|
renderPath: function() {
|
2015-01-30 11:47:17 +00:00
|
|
|
var dir = this.dir,
|
|
|
|
path = dir.path,
|
|
|
|
obj = {path: path, repo_name: dir.repo_name};
|
|
|
|
|
2015-01-30 11:36:42 +00:00
|
|
|
if (path != '/') {
|
|
|
|
$.extend(obj, {
|
|
|
|
path_list: path.substr(1).split('/'),
|
2015-01-30 11:47:17 +00:00
|
|
|
repo_id: dir.repo_id
|
2015-01-30 11:36:42 +00:00
|
|
|
});
|
|
|
|
}
|
2015-01-30 11:47:17 +00:00
|
|
|
|
2015-01-30 11:36:42 +00:00
|
|
|
this.$path_bar.html(this.path_bar_template(obj));
|
|
|
|
},
|
|
|
|
|
|
|
|
renderDirOpBar: function() {
|
2015-01-30 11:47:17 +00:00
|
|
|
var dir = this.dir,
|
|
|
|
user_perm = dir.user_perm;
|
|
|
|
|
2015-01-30 11:36:42 +00:00
|
|
|
this.$dir_op_bar.html($.trim(this.dir_op_bar_template({
|
|
|
|
user_perm: user_perm,
|
|
|
|
encrypted: dir.encrypted,
|
|
|
|
path: dir.path,
|
2015-01-30 11:47:17 +00:00
|
|
|
repo_id: dir.repo_id
|
2015-01-30 11:36:42 +00:00
|
|
|
})));
|
|
|
|
},
|
|
|
|
|
|
|
|
// Directory Operations
|
|
|
|
events: {
|
|
|
|
'click .path-link': 'visitDir',
|
|
|
|
'click #upload-file': 'uploadFile',
|
|
|
|
'click #add-new-dir': 'newDir',
|
|
|
|
'click #add-new-file': 'newFile',
|
|
|
|
'click #share-cur-dir': 'share',
|
|
|
|
'click th.select': 'select',
|
|
|
|
'click #by-name': 'sortByName',
|
|
|
|
'click #by-time': 'sortByTime',
|
|
|
|
'click #del-dirents': 'delete',
|
|
|
|
'click #mv-dirents': 'mv',
|
|
|
|
'click #cp-dirents': 'cp'
|
|
|
|
},
|
|
|
|
|
|
|
|
newDir: function() {
|
2015-01-30 11:47:17 +00:00
|
|
|
var form = $(this.newDirTemplate()),
|
|
|
|
form_id = form.attr('id'),
|
|
|
|
dir = this.dir,
|
|
|
|
dirView = this;
|
|
|
|
|
|
|
|
form.modal({appendTo:'#main'});
|
|
|
|
$('#simplemodal-container').css({'height':'auto'});
|
|
|
|
|
|
|
|
form.submit(function() {
|
|
|
|
var dirent_name = $.trim($('input[name="name"]', form).val()),
|
|
|
|
post_data = {'dirent_name': dirent_name},
|
|
|
|
post_url = Common.getUrl({name: "new_dir", repo_id: dir.repo_id})
|
|
|
|
+ '?parent_dir=' + encodeURIComponent(dir.path);
|
|
|
|
|
|
|
|
if (!dirent_name) {
|
2015-01-31 04:07:49 +00:00
|
|
|
Common.showFormError(form_id, gettext("It is required."));
|
|
|
|
return false;
|
2015-01-30 11:47:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
var after_op_success = function(data) {
|
|
|
|
$.modal.close();
|
|
|
|
|
|
|
|
var new_dirent = dir.add({
|
|
|
|
'is_dir': true,
|
|
|
|
'obj_name': data['name'],
|
|
|
|
'last_modified': new Date().getTime() / 1000,
|
|
|
|
'last_update': gettext("Just now"),
|
|
|
|
'p_dpath': data['p_dpath']
|
|
|
|
}, {silent:true});
|
|
|
|
|
|
|
|
var view = new DirentView({model: new_dirent, dirView: dirView});
|
|
|
|
$('tr:first', dirView.$dirent_list).before(view.render().el); // put the new dir as the first one
|
|
|
|
};
|
|
|
|
|
|
|
|
Common.ajaxPost({
|
|
|
|
'form': form,
|
|
|
|
'post_url': post_url,
|
|
|
|
'post_data': post_data,
|
|
|
|
'after_op_success': after_op_success,
|
|
|
|
'form_id': form_id
|
|
|
|
});
|
|
|
|
|
|
|
|
return false;
|
2015-01-30 11:36:42 +00:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2015-01-30 11:47:17 +00:00
|
|
|
newFile: function() {
|
|
|
|
var form = $(this.newFileTemplate()),
|
|
|
|
form_id = form.attr('id'),
|
|
|
|
file_name = form.find('input[name="name"]'),
|
|
|
|
dir = this.dir,
|
|
|
|
dirView = this;
|
|
|
|
|
|
|
|
form.modal({appendTo:'#main'});
|
|
|
|
$('#simplemodal-container').css({'height':'auto'});
|
|
|
|
|
|
|
|
form.find('.set-file-type').on('click', function() {
|
|
|
|
file_name.val('.' + $(this).data('filetype'));
|
|
|
|
Common.setCaretPos(file_name[0], 0);
|
|
|
|
file_name.focus();
|
|
|
|
});
|
|
|
|
|
|
|
|
form.submit(function() {
|
|
|
|
var dirent_name = $.trim(file_name.val()),
|
|
|
|
post_data = {'dirent_name': dirent_name},
|
|
|
|
post_url = Common.getUrl({name: "new_file", repo_id: dir.repo_id})
|
|
|
|
+ '?parent_dir=' + encodeURIComponent(dir.path);
|
|
|
|
|
|
|
|
if (!dirent_name) {
|
|
|
|
Common.showFormError(form_id, gettext("It is required."));
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
var after_op_success = function(data) {
|
|
|
|
location.href = Common.getUrl({name: "repo_new_file", repo_id: dir.repo_id})
|
|
|
|
+ '?p=' + encodeURIComponent(dir.path) + encodeURIComponent(data['name']);
|
|
|
|
};
|
|
|
|
|
|
|
|
Common.ajaxPost({
|
|
|
|
'form': form,
|
|
|
|
'post_url': post_url,
|
|
|
|
'post_data': post_data,
|
|
|
|
'after_op_success': after_op_success,
|
|
|
|
'form_id': form_id
|
|
|
|
});
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
2015-01-31 03:17:09 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
sortByName: function() {
|
|
|
|
var dirents = this.dir;
|
|
|
|
var el = $('#by-name');
|
|
|
|
this.dir.comparator = function(a, b) {
|
|
|
|
if (a.get('is_dir') && b.get('is_file')) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (el.hasClass('icon-caret-up')) {
|
|
|
|
return a.get('obj_name').toLowerCase() < b.get('obj_name').toLowerCase() ? 1 : -1;
|
|
|
|
} else {
|
|
|
|
return a.get('obj_name').toLowerCase() < b.get('obj_name').toLowerCase() ? -1 : 1;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
dirents.sort();
|
|
|
|
this.$dirent_list.empty();
|
|
|
|
dirents.each(this.addOne, this);
|
|
|
|
el.toggleClass('icon-caret-up icon-caret-down');
|
|
|
|
},
|
|
|
|
|
|
|
|
sortByTime: function () {
|
2015-01-31 04:07:49 +00:00
|
|
|
console.log("sortByTime: " + this.dir.repo_id + " " + this.dir.path);
|
2015-01-31 03:17:09 +00:00
|
|
|
var dirents = this.dir;
|
|
|
|
var el = $('#by-time');
|
|
|
|
dirents.comparator = function(a, b) {
|
|
|
|
if (a.get('is_dir') && b.get('is_file')) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (el.hasClass('icon-caret-down')) {
|
|
|
|
return a.get('last_modified') < b.get('last_modified') ? 1 : -1;
|
|
|
|
} else {
|
|
|
|
return a.get('last_modified') < b.get('last_modified') ? -1 : 1;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
dirents.sort();
|
|
|
|
this.$dirent_list.empty();
|
|
|
|
dirents.each(this.addOne, this);
|
|
|
|
el.toggleClass('icon-caret-up icon-caret-down');
|
|
|
|
},
|
|
|
|
|
2015-02-03 05:47:22 +00:00
|
|
|
onWindowScroll: function () {
|
|
|
|
var dir = this.dir;
|
|
|
|
var start = dir.more_start;
|
|
|
|
if (dir.dirent_more && $(window).scrollTop() + $(window).height() > $(document).height() - $('#footer').outerHeight(true) && start != dir.last_start) {
|
|
|
|
dir.last_start = start;
|
|
|
|
var loading_tip = this.$('.loading-tip');
|
|
|
|
dir.fetch({
|
|
|
|
remove: false,
|
|
|
|
data: {
|
|
|
|
'p': dir.path,
|
|
|
|
'start': dir.more_start
|
|
|
|
},
|
|
|
|
success: function (collection, response, opts) {
|
|
|
|
if (!response.dirent_more ) { // no 'more'
|
|
|
|
loading_tip.hide();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
error: function(xhr, textStatus, errorThrown) {
|
|
|
|
loading_tip.hide();
|
|
|
|
Common.ajaxErrorHandler(xhr, textStatus, errorThrown);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2015-01-30 11:36:42 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
return DirView;
|
2015-01-25 10:47:42 +00:00
|
|
|
});
|