diff --git a/media/scripts/app/views/dirents.js b/media/scripts/app/views/dirents.js
index ee2fa19015..b0c101265e 100644
--- a/media/scripts/app/views/dirents.js
+++ b/media/scripts/app/views/dirents.js
@@ -29,253 +29,253 @@ define([
render: function() {
var dirent_path = Common.pathJoin([this.dirView.dir.path,
- this.model.attributes.obj_name]);
+ this.model.attributes.obj_name]);
//console.log(Common.pathJointhis.dirView.dir.path + "/" + this.model.attributes.obj_name);
this.$el.html(this.template({
- dirent: this.model.attributes,
- repo_id: this.dirView.dir.repo_id,
- // dir_path: this.dirView.dir.path,
- dirent_path: dirent_path,
- user_perm: this.dirView.dir.user_perm,
- repo_encrypted: this.dirView.dir.encrypted
+ dirent: this.model.attributes,
+ repo_id: this.dirView.dir.repo_id,
+ // dir_path: this.dirView.dir.path,
+ dirent_path: dirent_path,
+ user_perm: this.dirView.dir.user_perm,
+ repo_encrypted: this.dirView.dir.encrypted
}));
return this;
},
events: {
- 'mouseenter': 'highlight',
- 'mouseleave': 'rmHighlight',
- 'click .select': 'select',
- 'click .file-star': 'starFile',
- 'click .dir-link': 'visitDir',
- 'click .more-op-icon': 'togglePopup',
- 'click .share': 'share',
- 'click .del': 'delete',
- 'click .rename': 'rename',
- 'click .mv': 'mvcp',
- 'click .cp': 'mvcp',
- 'click .file-update': 'updateFile'
+ 'mouseenter': 'highlight',
+ 'mouseleave': 'rmHighlight',
+ 'click .select': 'select',
+ 'click .file-star': 'starFile',
+ 'click .dir-link': 'visitDir',
+ 'click .more-op-icon': 'togglePopup',
+ 'click .share': 'share',
+ 'click .del': 'delete',
+ 'click .rename': 'rename',
+ 'click .mv': 'mvcp',
+ 'click .cp': 'mvcp',
+ 'click .file-update': 'updateFile'
},
highlight: function() {
- if (app.globalState.noFileOpPopup) {
- this.$el.addClass('hl').find('.repo-file-op').removeClass('vh');
- }
+ if (app.globalState.noFileOpPopup) {
+ this.$el.addClass('hl').find('.repo-file-op').removeClass('vh');
+ }
},
rmHighlight: function() {
- if (app.globalState.noFileOpPopup) {
- this.$el.removeClass('hl').find('.repo-file-op').addClass('vh');
- }
+ if (app.globalState.noFileOpPopup) {
+ this.$el.removeClass('hl').find('.repo-file-op').addClass('vh');
+ }
},
select: function () {
- var checkbox = this.$('.checkbox');
- checkbox.toggleClass('checkbox-checked');
- if (checkbox.hasClass('checkbox-checked')) {
- this.model.set({'selected':true}, {silent:true}); // do not trigger the 'change' event.
- } else {
- this.model.set({'selected':false}, {silent:true});
- }
+ var checkbox = this.$('.checkbox');
+ checkbox.toggleClass('checkbox-checked');
+ if (checkbox.hasClass('checkbox-checked')) {
+ this.model.set({'selected':true}, {silent:true}); // do not trigger the 'change' event.
+ } else {
+ this.model.set({'selected':false}, {silent:true});
+ }
},
starFile: function() {
- var _this = this;
- var dir = this.dirView.dir;
- //var path = dir.path;
- //path += (path == '/' ? '' : '/');
- var starred = this.model.get('starred');
- var options = { repo_id: dir.repo_id };
- options.name = starred ? 'unstar_file' : 'star_file';
- var filePath = Common.pathJoin([dir.path, this.model.get('obj_name')]);
- var url = Common.getUrl(options) + '?file=' + encodeURIComponent(filePath);
- $.ajax({
- url: url,
- dataType: 'json',
- cache: false,
- success: function () {
- if (starred) {
- _this.model.set({'starred':false});
- } else {
- _this.model.set({'starred':true});
- }
- },
- error: Common.ajaxErrorHandler
- });
+ var _this = this;
+ var dir = this.dirView.dir;
+ //var path = dir.path;
+ //path += (path == '/' ? '' : '/');
+ var starred = this.model.get('starred');
+ var options = { repo_id: dir.repo_id };
+ options.name = starred ? 'unstar_file' : 'star_file';
+ var filePath = Common.pathJoin([dir.path, this.model.get('obj_name')]);
+ var url = Common.getUrl(options) + '?file=' + encodeURIComponent(filePath);
+ $.ajax({
+ url: url,
+ dataType: 'json',
+ cache: false,
+ success: function () {
+ if (starred) {
+ _this.model.set({'starred':false});
+ } else {
+ _this.model.set({'starred':true});
+ }
+ },
+ error: Common.ajaxErrorHandler
+ });
},
visitDir: function () {
- // show 'loading'
- this.$('.dirent-icon img').attr({
- 'src': app.config.mediaURL + 'img/loading-icon.gif',
- 'alt':''
- });
- // empty all models
- this.dirView.dir.reset();
- // update url & dirents
- var dir_url = this.$('.dir-link').attr("href");
- app.router.navigate(dir_url, {trigger: true}); // offer an url fragment
- return false;
+ // show 'loading'
+ this.$('.dirent-icon img').attr({
+ 'src': app.config.mediaURL + 'img/loading-icon.gif',
+ 'alt':''
+ });
+ // empty all models
+ this.dirView.dir.reset();
+ // update url & dirents
+ var dir_url = this.$('.dir-link').attr("href");
+ app.router.navigate(dir_url, {trigger: true}); // offer an url fragment
+ return false;
},
togglePopup: function () {
- var icon = this.$('.more-op-icon'),
+ var icon = this.$('.more-op-icon'),
popup = this.$('.hidden-op');
- if (popup.hasClass('hide')) { // the popup is not shown
- if (icon.position().left + icon.width() + popup.outerWidth() < icon.parent().width()) {
- popup.css({'left': icon.position().left + icon.width() + 5});
- if (icon.offset().top + popup.height() <= $('#main').offset().top + $('#main').height()) {
- popup.css('top', 6);
- } else {
- popup.css('bottom', 2);
- }
+ if (popup.hasClass('hide')) { // the popup is not shown
+ if (icon.position().left + icon.width() + popup.outerWidth() < icon.parent().width()) {
+ popup.css({'left': icon.position().left + icon.width() + 5});
+ if (icon.offset().top + popup.height() <= $('#main').offset().top + $('#main').height()) {
+ popup.css('top', 6);
+ } else {
+ popup.css('bottom', 2);
+ }
+ } else {
+ popup.css({'right':0});
+ if (icon.offset().top + popup.height() <= $('#main').offset().top + $('#main').height()) {
+ popup.css('top', icon.position().top + icon.height() + 3);
+ } else {
+ popup.css('bottom', icon.position().top + icon.height() + 3);
+ }
+ }
+ popup.removeClass('hide');
+ app.globalState.noFileOpPopup = false;
+ app.globalState.popup_tr = icon.parents('tr');
} else {
- popup.css({'right':0});
- if (icon.offset().top + popup.height() <= $('#main').offset().top + $('#main').height()) {
- popup.css('top', icon.position().top + icon.height() + 3);
- } else {
- popup.css('bottom', icon.position().top + icon.height() + 3);
- }
+ popup.addClass('hide');
+ app.globalState.noFileOpPopup = true;
+ app.globalState.popup_tr = '';
}
- popup.removeClass('hide');
- app.globalState.noFileOpPopup = false;
- app.globalState.popup_tr = icon.parents('tr');
- } else {
- popup.addClass('hide');
- app.globalState.noFileOpPopup = true;
- app.globalState.popup_tr = '';
- }
},
delete: function() {
- var dirent_name = this.model.get('obj_name');
- var options = {repo_id: this.dirView.dir.repo_id};
- options.name = this.model.get('is_dir') ? 'del_dir' : 'del_file';
- var url_main = Common.getUrl(options);
- var el = this.$el;
- $.ajax({
- url: url_main + '?parent_dir=' + encodeURIComponent(this.dirView.dir.path)
- + '&name=' + encodeURIComponent(dirent_name),
- dataType: 'json',
- success: function(data) {
- el.remove();
- app.globalState.noFileOpPopup = true;// make other items can work normally when hover
- var msg = gettext("Successfully deleted %(name)s");
- msg = msg.replace('%(name)s', dirent_name);
- Common.feedback(msg, 'success');
- },
- error: Common.ajaxErrorHandler
- });
- return false;
+ var dirent_name = this.model.get('obj_name');
+ var options = {repo_id: this.dirView.dir.repo_id};
+ options.name = this.model.get('is_dir') ? 'del_dir' : 'del_file';
+ var url_main = Common.getUrl(options);
+ var el = this.$el;
+ $.ajax({
+ url: url_main + '?parent_dir=' + encodeURIComponent(this.dirView.dir.path)
+ + '&name=' + encodeURIComponent(dirent_name),
+ dataType: 'json',
+ success: function(data) {
+ el.remove();
+ app.globalState.noFileOpPopup = true;// make other items can work normally when hover
+ var msg = gettext("Successfully deleted %(name)s");
+ msg = msg.replace('%(name)s', dirent_name);
+ Common.feedback(msg, 'success');
+ },
+ error: Common.ajaxErrorHandler
+ });
+ return false;
},
rename: function() {
- var is_dir = this.model.get('is_dir');
- //var hd_text = is_dir ? "{% trans "Rename Directory" %}" : "{% trans "Rename File" %}";
- var title = is_dir ? gettext("Rename Directory") : gettext("Rename File");
- //var op_detail = $('.detail', form);
- //op_detail.html(op_detail.html().replace('%(name)s', '' + dirent_name + ''));
- var dirent_name = this.model.get('obj_name');
+ var is_dir = this.model.get('is_dir');
+ //var hd_text = is_dir ? "{% trans "Rename Directory" %}" : "{% trans "Rename File" %}";
+ var title = is_dir ? gettext("Rename Directory") : gettext("Rename File");
+ //var op_detail = $('.detail', form);
+ //op_detail.html(op_detail.html().replace('%(name)s', '' + dirent_name + ''));
+ var dirent_name = this.model.get('obj_name');
- var form = $(this.renameTemplate({
- form_title: title,
- dirent_name: dirent_name,
- }));
- form.modal();
- var form_id = form.attr('id');
- $('#simplemodal-container').css({'width':'auto', 'height':'auto'});
+ var form = $(this.renameTemplate({
+ form_title: title,
+ dirent_name: dirent_name,
+ }));
+ form.modal();
+ var form_id = form.attr('id');
+ $('#simplemodal-container').css({'width':'auto', 'height':'auto'});
- var _this = this;
- var dir = this.dirView.dir;
- form.submit(function() {
- var new_name = $.trim($('[name="newname"]', form).val());
- if (!new_name) {
- Common.showFormError(form_id, gettext("It is required."));
- return false;
- }
- if (new_name == dirent_name) {
- Common.showFormError(form_id, gettext("You have not renamed it."));
- return false;
- }
- var post_data = {'oldname': dirent_name, 'newname':new_name};
- var options = { repo_id: dir.repo_id };
- options.name = is_dir ? 'rename_dir' : 'rename_file';
- var post_url = Common.getUrl(options) + '?parent_dir=' + encodeURIComponent(dir.path);
- var after_op_success = function (data) {
- new_name = data['newname'];
- var now = new Date().getTime()/1000;
- $.modal.close();
- _this.model.set({ // it will trigger 'change' event
- 'obj_name': new_name,
- 'last_modified': now,
- //'last_update': "{% trans "Just now" %}",
- 'last_update': "Just now",
- 'sharelink': '',
- 'sharetoken': ''
+ var _this = this;
+ var dir = this.dirView.dir;
+ form.submit(function() {
+ var new_name = $.trim($('[name="newname"]', form).val());
+ if (!new_name) {
+ Common.showFormError(form_id, gettext("It is required."));
+ return false;
+ }
+ if (new_name == dirent_name) {
+ Common.showFormError(form_id, gettext("You have not renamed it."));
+ return false;
+ }
+ var post_data = {'oldname': dirent_name, 'newname':new_name};
+ var options = { repo_id: dir.repo_id };
+ options.name = is_dir ? 'rename_dir' : 'rename_file';
+ var post_url = Common.getUrl(options) + '?parent_dir=' + encodeURIComponent(dir.path);
+ var after_op_success = function (data) {
+ new_name = data['newname'];
+ var now = new Date().getTime()/1000;
+ $.modal.close();
+ _this.model.set({ // it will trigger 'change' event
+ 'obj_name': new_name,
+ 'last_modified': now,
+ //'last_update': "{% trans "Just now" %}",
+ 'last_update': "Just now",
+ 'sharelink': '',
+ 'sharetoken': ''
+ });
+ if (is_dir) {
+
+ } else {
+ _this.model.set({
+ 'starred': false
+ });
+ }
+ };
+ Common.ajaxPost({
+ 'form': form,
+ 'post_url': post_url,
+ 'post_data': post_data,
+ 'after_op_success': after_op_success,
+ 'form_id': form_id
+ });
+ return false;
});
- if (is_dir) {
+ return false;
+ },
- } else {
- _this.model.set({
- 'starred': false
- });
+ mvcp: function() {
+ var el = event.target || event.srcElement,
+ op_type = $(el).hasClass('mv') ? 'mv':'cp',
+ op_detail,
+ dirent = this.$el,
+ obj_name = this.model.get('obj_name'),
+ obj_type = this.model.get('is_dir') ? 'dir':'file',
+ form = $('#mv-form'), form_hd;
+
+ form.modal({appendTo:'#main', autoResize:true, focus:false});
+ $('#simplemodal-container').css({'width':'auto', 'height':'auto'});
+
+ if (!this.dirView.dir.encrypted) {
+ $('#other-repos').show();
}
- };
- Common.ajaxPost({
- 'form': form,
- 'post_url': post_url,
- 'post_data': post_data,
- 'after_op_success': after_op_success,
- 'form_id': form_id
- });
- return false;
- });
- return false;
- },
- mvcp: function() {
- var el = event.target || event.srcElement,
- op_type = $(el).hasClass('mv') ? 'mv':'cp',
- op_detail,
- dirent = this.$el,
- obj_name = this.model.get('obj_name'),
- obj_type = this.model.get('is_dir') ? 'dir':'file',
- form = $('#mv-form'), form_hd;
+ if (op_type == 'mv') {
+ //form_hd = obj_type == 'dir'? "{% trans "Move Directory" %}":"{% trans "Move File" %}";
+ form_hd = obj_type == 'dir' ? "Move Directory" : "Move File";
+ } else {
+ //form_hd = obj_type == 'dir'? "{% trans "Copy Directory" %}":"{% trans "Copy File" %}";
+ form_hd = obj_type == 'dir' ? "Copy Directory" : "Copy File";
+ }
- form.modal({appendTo:'#main', autoResize:true, focus:false});
- $('#simplemodal-container').css({'width':'auto', 'height':'auto'});
+ //op_detail = op_type == 'mv' ? "{% trans "Move %(name)s to:" %}" : "{% trans "Copy %(name)s to:" %}";
+ op_detail = op_type == 'mv' ? "Move %(name)s to:" : "Copy %(name)s to:";
+ op_detail = op_detail.replace('%(name)s', '' + obj_name + '');
+ form.prepend('
' + form_hd + '
' + op_detail + '
');
- if (!this.dirView.dir.encrypted) {
- $('#other-repos').show();
- }
+ $('input[name="op"]', form).val(op_type);
+ $('input[name="obj_type"]', form).val(obj_type);
+ $('input[name="obj_name"]', form).val(obj_name);
- if (op_type == 'mv') {
- //form_hd = obj_type == 'dir'? "{% trans "Move Directory" %}":"{% trans "Move File" %}";
- form_hd = obj_type == 'dir'? "Move Directory" : "Move File";
- } else {
- //form_hd = obj_type == 'dir'? "{% trans "Copy Directory" %}":"{% trans "Copy File" %}";
- form_hd = obj_type == 'dir'? "Copy Directory" : "Copy File";
- }
-
- //op_detail = op_type == 'mv' ? "{% trans "Move %(name)s to:" %}" : "{% trans "Copy %(name)s to:" %}";
- op_detail = op_type == 'mv' ? "Move %(name)s to:" : "Copy %(name)s to:";
- op_detail = op_detail.replace('%(name)s', '' + obj_name + '');
- form.prepend('' + form_hd + '
' + op_detail + '
');
-
- $('input[name="op"]', form).val(op_type);
- $('input[name="obj_type"]', form).val(obj_type);
- $('input[name="obj_name"]', form).val(obj_name);
-
- form.data('op_obj', dirent);
- FileTree.render_jstree_for_cur_path({
- repo_name: this.dirView.dir.repo_name,
- repo_id: this.dirView.dir.repo_id,
- path: this.dirView.dir.path,
- });
- return false;
- },
+ form.data('op_obj', dirent);
+ FileTree.renderTreeForPath({
+ repo_name: this.dirView.dir.repo_name,
+ repo_id: this.dirView.dir.repo_id,
+ path: this.dirView.dir.path,
+ });
+ return false;
+ },
});
diff --git a/media/scripts/file-tree.js b/media/scripts/file-tree.js
index 5b9693b63f..de4a1363ce 100644
--- a/media/scripts/file-tree.js
+++ b/media/scripts/file-tree.js
@@ -10,267 +10,268 @@ define([
var FileTree = {
- options: {},
+ options: {},
- formatRepoData: function(data) {
- var repos = [], repo;
- for (var i = 0, len = data.length; i < len; i++) {
- repo = {
- 'data': data[i].name,
- 'attr': {'repo_id': data[i].id, 'root_node': true},
- 'state': 'closed'
- }
- repos.push(repo);
- }
- return repos;
- },
-
- /**
- * @container(required): container.data('site_root', '{{SITE_ROOT}}')
- * @options (optional): {'two_state': true}
- */
- renderFileTree: function(container, repo_data, options) {
- var opts = options || {};
- container
- .delegate('.jstree-closed', 'dblclick', function(e) {
- container.jstree('open_node', $(this));
- $(this).find('a').removeClass('jstree-clicked');
- })
- .bind('select_node.jstree', function(e, data) {
- $('.jstree-clicked').removeClass('jstree-clicked'); // do not show selected item
- })
- .jstree({
- 'json_data': {
- 'data': repo_data,
- 'ajax': {
- 'url': function(data) {
- var path = this.get_path(data);
- var repo_id;
- if (path.length == 1) {
- path = '/';
- repo_id = data.attr('repo_id');
- } else {
- var root_node = data.parents('[root_node=true]');
- repo_id = root_node.attr('repo_id');
- path.shift();
- path = '/' + path.join('/') + '/';
- }
- return container.data('site_root') + 'ajax/repo/' + repo_id + '/dirents/?path=' + e(path);
- },
- 'success': function(data) {
- var items = [];
- var o, item;
- for (var i = 0, len = data.length; i < len; i++) {
- o = data[i];
- if (o.type == 'dir') {
- item = {
- 'data': o.name,
- 'attr': { 'type': o.type },
- 'state': 'closed'
- };
- } else {
- item = {
- 'data': o.name,
- 'attr': {'type': o.type }
- };
- }
- items.push(item);
- }
- return items;
- }
- }
- },
- 'core': {
- 'animation': 100
- },
- 'themes': {
- 'theme':'classic'
- },
- 'checkbox':{
- 'two_state': opts.two_state, // default: false. when 'true', dir can be checked separately with file
- // make dir can only be selected
- //'override_ui':true, // nodes can be checked, or selected to be checked
- 'real_checkboxes': true,
- 'real_checkboxes_names': function(node) {
- // get the path array consisting of nodes starting from the root node
- var path_array = this.get_path(node);
- var repo_id, path;
- if (path_array.length == 1) {
- // root node
- path = '/';
- repo_id = node.attr('repo_id');
- } else {
- path_array.shift();
- repo_id = node.parents('[root_node=true]').attr('repo_id');
- if (node.attr('type') == 'dir') {
- path = '/' + path_array.join('/') + '/';
- } else {
- path = '/' + path_array.join('/');
- }
- }
- return ['selected', repo_id + path];
- }
- },
- 'plugins': ['themes', 'json_data', 'ui', 'checkbox']
- });
- },
-
- // only list dirs
- renderDirTree: function(container, form, repo_data) {
- container
- .delegate('.jstree-closed', 'dblclick', function(e) {
- container.jstree('open_node', $(this));
- $(this).find('a').removeClass('jstree-clicked');
- })
- .bind('before.jstree', function(e, data) {
- if (data.func === 'select_node') { // ensure only one selected dir display in the popup
- $('.jstree-clicked', form).removeClass('jstree-clicked');
- }
- })
- .bind('select_node.jstree', function(e, data) {
- var path, repo_id;
- var path_array = data.inst.get_path(data.rslt.obj);
- if (path_array.length == 1) {
- path = '/';
- repo_id = data.rslt.obj.attr('repo_id');
- } else {
- repo_id = data.rslt.obj.parents('[root_node=true]').attr('repo_id');
- path_array.shift();
- path = '/' + path_array.join('/') + '/';
- }
- $('input[name="dst_repo"]', form).val(repo_id);
- $('input[name="dst_path"]', form).val(path);
- })
- .jstree({
- 'json_data': {
- 'data': repo_data,
- 'ajax': {
- 'url': function(data) {
- var path = this.get_path(data);
- var repo_id;
- if (path.length == 1) {
- path = '/';
- repo_id = data.attr('repo_id');
- } else {
- repo_id = data.parents('[root_node=true]').attr('repo_id');
- path.shift();
- path = '/' + path.join('/') + '/';
- }
- return app.config.siteRoot + 'ajax/repo/' + repo_id + '/dirents/?dir_only=true&path=' + encodeURIComponent(path);
- },
- 'success': function(data) {
- var items = [];
- var o, item;
- for (var i = 0, len = data.length; i < len; i++) {
- o = data[i];
- if (o.has_subdir) {
- item = {
- 'data': o.name,
- 'attr': { 'type': o.type },
- 'state': 'closed'
- };
- } else {
- item = {
- 'data': o.name,
- 'attr': {'type': o.type }
- };
- }
- items.push(item);
- }
- return items;
- }
- }
- },
- 'core': {
- 'animation': 100
- },
- 'plugins': ['themes', 'json_data', 'ui']
- });
- },
-
- render_jstree_for_cur_path: function(options) {
- var form = $('#mv-form'),
- container = $('#current-repo-dirs'),
- loading_tip = container.prev();
-
- var repo_name = options.repo_name,
- repo_id = options.repo_id;
- var cur_path = options.path;
- if (cur_path != '/') {
- cur_path += '/';
- }
- var _this = this;
- // container.data('site_root', '{{SITE_ROOT}}');
- $.ajax({
- url: Common.getUrl({name: 'get_dirents', repo_id: options.repo_id})
- + '?path=' + encodeURIComponent(cur_path) + '&dir_only=true&all_dir=true',
- cache: false,
- dataType: 'json',
- success: function(data) {
- var json_data = [];
- var repo_data = {
- 'data': repo_name,
- 'attr': {'repo_id': repo_id, 'root_node': true},
- 'state': 'open'
- };
-
- var path_eles = cur_path.split('/');
- path_eles.pop();
- /* e.g.
- * path: '/xx/'
- * path_eles: ['', 'xx']
- * data: [["xxx", "xx", "test1022"], ["lkjj", "kjhkhi"]]
- * when no dir in '/', data will be [[]];
- */
- var len = data.length;
- var children = [];
- for (var i = len - 1; i > -1; i--) {
- children[i] = [];
- if (i == len - 1) {
- for (var j = 0, len_i = data[i].length; j < len_i; j++) {
- children[i].push({
- 'data': data[i][j],
+ formatRepoData: function(data) {
+ var repos = [], repo;
+ for (var i = 0, len = data.length; i < len; i++) {
+ repo = {
+ 'data': data[i].name,
+ 'attr': {'repo_id': data[i].id, 'root_node': true},
'state': 'closed'
- });
}
- } else {
- for (var j = 0, len_i = data[i].length; j < len_i; j++) {
- if (data[i][j] == path_eles[i+1]) {
- children[i].push({
- 'data': data[i][j],
- 'state': 'open',
- 'children': children[i+1]
- });
- } else {
- children[i].push({
- 'data': data[i][j],
- 'state': 'closed'
- });
- }
- }
- }
+ repos.push(repo);
}
- if (children[0].length > 0) {
- $.extend(repo_data, {'children': children[0]});
- }
- json_data.push(repo_data);
+ return repos;
+ },
- loading_tip.hide();
- _this.renderDirTree(container, form, json_data);
- container.removeClass('hide');
- },
- error: function() {
- var cur_repo = [{
- 'data': repo_name,
- 'attr': {'repo_id': repo_id, 'root_node': true},
- 'state': 'closed'
- }];
- loading_tip.hide();
- _this.renderDirTree(container, form, cur_repo);
- container.removeClass('hide');
- }
- });
- },
+ /**
+ * @container(required): container.data('site_root', '{{SITE_ROOT}}')
+ * @options (optional): {'two_state': true}
+ */
+ renderFileTree: function(container, repo_data, options) {
+ var opts = options || {};
+ container
+ .delegate('.jstree-closed', 'dblclick', function(e) {
+ container.jstree('open_node', $(this));
+ $(this).find('a').removeClass('jstree-clicked');
+ })
+ .bind('select_node.jstree', function(e, data) {
+ $('.jstree-clicked').removeClass('jstree-clicked'); // do not show selected item
+ })
+ .jstree({
+ 'json_data': {
+ 'data': repo_data,
+ 'ajax': {
+ 'url': function(data) {
+ var path = this.get_path(data);
+ var repo_id;
+ if (path.length == 1) {
+ path = '/';
+ repo_id = data.attr('repo_id');
+ } else {
+ var root_node = data.parents('[root_node=true]');
+ repo_id = root_node.attr('repo_id');
+ path.shift();
+ path = '/' + path.join('/') + '/';
+ }
+ return app.config.siteRoot + 'ajax/repo/' + repo_id + '/dirents/?path=' + e(path);
+ },
+ 'success': function(data) {
+ var items = [];
+ var o, item;
+ for (var i = 0, len = data.length; i < len; i++) {
+ o = data[i];
+ if (o.type == 'dir') {
+ item = {
+ 'data': o.name,
+ 'attr': { 'type': o.type },
+ 'state': 'closed'
+ };
+ } else {
+ item = {
+ 'data': o.name,
+ 'attr': {'type': o.type }
+ };
+ }
+ items.push(item);
+ }
+ return items;
+ }
+ }
+ },
+ 'core': {
+ 'animation': 100
+ },
+ 'themes': {
+ 'theme':'classic'
+ },
+ 'checkbox':{
+ 'two_state': opts.two_state, // default: false. when 'true', dir can be checked separately with file
+ // make dir can only be selected
+ //'override_ui':true, // nodes can be checked, or selected to be checked
+ 'real_checkboxes': true,
+ 'real_checkboxes_names': function(node) {
+ // get the path array consisting of nodes starting from the root node
+ var path_array = this.get_path(node);
+ var repo_id, path;
+ if (path_array.length == 1) {
+ // root node
+ path = '/';
+ repo_id = node.attr('repo_id');
+ } else {
+ path_array.shift();
+ repo_id = node.parents('[root_node=true]').attr('repo_id');
+ if (node.attr('type') == 'dir') {
+ path = '/' + path_array.join('/') + '/';
+ } else {
+ path = '/' + path_array.join('/');
+ }
+ }
+ return ['selected', repo_id + path];
+ }
+ },
+ 'plugins': ['themes', 'json_data', 'ui', 'checkbox']
+ });
+ },
+
+ // only list dirs
+ renderDirTree: function(container, form, repo_data) {
+ container
+ .delegate('.jstree-closed', 'dblclick', function(e) {
+ container.jstree('open_node', $(this));
+ $(this).find('a').removeClass('jstree-clicked');
+ })
+ .bind('before.jstree', function(e, data) {
+ if (data.func === 'select_node') { // ensure only one selected dir display in the popup
+ $('.jstree-clicked', form).removeClass('jstree-clicked');
+ }
+ })
+ .bind('select_node.jstree', function(e, data) {
+ var path, repo_id;
+ var path_array = data.inst.get_path(data.rslt.obj);
+ if (path_array.length == 1) {
+ path = '/';
+ repo_id = data.rslt.obj.attr('repo_id');
+ } else {
+ repo_id = data.rslt.obj.parents('[root_node=true]').attr('repo_id');
+ path_array.shift();
+ path = '/' + path_array.join('/') + '/';
+ }
+ $('input[name="dst_repo"]', form).val(repo_id);
+ $('input[name="dst_path"]', form).val(path);
+ })
+ .jstree({
+ 'json_data': {
+ 'data': repo_data,
+ 'ajax': {
+ 'url': function(data) {
+ var path = this.get_path(data);
+ var repo_id;
+ if (path.length == 1) {
+ path = '/';
+ repo_id = data.attr('repo_id');
+ } else {
+ repo_id = data.parents('[root_node=true]').attr('repo_id');
+ path.shift();
+ path = '/' + path.join('/') + '/';
+ }
+ return app.config.siteRoot + 'ajax/repo/' + repo_id + '/dirents/?dir_only=true&path=' + encodeURIComponent(path);
+ },
+ 'success': function(data) {
+ var items = [];
+ var o, item;
+ for (var i = 0, len = data.length; i < len; i++) {
+ o = data[i];
+ if (o.has_subdir) {
+ item = {
+ 'data': o.name,
+ 'attr': { 'type': o.type },
+ 'state': 'closed'
+ };
+ } else {
+ item = {
+ 'data': o.name,
+ 'attr': {'type': o.type }
+ };
+ }
+ items.push(item);
+ }
+ return items;
+ }
+ }
+ },
+ 'core': {
+ 'animation': 100
+ },
+ 'plugins': ['themes', 'json_data', 'ui']
+ });
+ },
+
+ renderTreeForPath: function(options) {
+ // check templates/snippets/lib_op_popups.html for the template
+ var form = $('#mv-form'),
+ container = $('#current-repo-dirs'),
+ loading_tip = container.prev();
+
+ var repo_name = options.repo_name,
+ repo_id = options.repo_id;
+ var cur_path = options.path;
+ if (cur_path != '/') {
+ cur_path += '/';
+ }
+ var _this = this;
+ // container.data('site_root', '{{SITE_ROOT}}');
+ $.ajax({
+ url: Common.getUrl({name: 'get_dirents', repo_id: options.repo_id})
+ + '?path=' + encodeURIComponent(cur_path) + '&dir_only=true&all_dir=true',
+ cache: false,
+ dataType: 'json',
+ success: function(data) {
+ var json_data = [];
+ var repo_data = {
+ 'data': repo_name,
+ 'attr': {'repo_id': repo_id, 'root_node': true},
+ 'state': 'open'
+ };
+
+ var path_eles = cur_path.split('/');
+ path_eles.pop();
+ /* e.g.
+ * path: '/xx/'
+ * path_eles: ['', 'xx']
+ * data: [["xxx", "xx", "test1022"], ["lkjj", "kjhkhi"]]
+ * when no dir in '/', data will be [[]];
+ */
+ var len = data.length;
+ var children = [];
+ for (var i = len - 1; i > -1; i--) {
+ children[i] = [];
+ if (i == len - 1) {
+ for (var j = 0, len_i = data[i].length; j < len_i; j++) {
+ children[i].push({
+ 'data': data[i][j],
+ 'state': 'closed'
+ });
+ }
+ } else {
+ for (var j = 0, len_i = data[i].length; j < len_i; j++) {
+ if (data[i][j] == path_eles[i+1]) {
+ children[i].push({
+ 'data': data[i][j],
+ 'state': 'open',
+ 'children': children[i+1]
+ });
+ } else {
+ children[i].push({
+ 'data': data[i][j],
+ 'state': 'closed'
+ });
+ }
+ }
+ }
+ }
+ if (children[0].length > 0) {
+ $.extend(repo_data, {'children': children[0]});
+ }
+ json_data.push(repo_data);
+
+ loading_tip.hide();
+ _this.renderDirTree(container, form, json_data);
+ container.removeClass('hide');
+ },
+ error: function() {
+ var cur_repo = [{
+ 'data': repo_name,
+ 'attr': {'repo_id': repo_id, 'root_node': true},
+ 'state': 'closed'
+ }];
+ loading_tip.hide();
+ _this.renderDirTree(container, form, cur_repo);
+ container.removeClass('hide');
+ }
+ });
+ },
};