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'); + } + }); + }, };