diff --git a/seahub/templates/repo.html b/seahub/templates/repo.html
index 973b8ecd98..1583bf198d 100644
--- a/seahub/templates/repo.html
+++ b/seahub/templates/repo.html
@@ -1187,8 +1187,80 @@ $('.file-cp, .file-mv, .dir-cp, .dir-mv', context).click(function () {
form.data('op_obj', dirent);
- var file_tree = new FileTree();
- file_tree.renderDirTree($('#current-repo-dirs').data('site_root', '{{SITE_ROOT}}'), form, current_repo);
+ $.ajax({
+ url: '{% url 'get_dirents' repo.id %}?path=' + e(cur_path) + '&dir_only=true&all_dir=true',
+ cache: false,
+ dataType: 'json',
+ success: function(data) {
+ var json_data = [];
+ var repo_data = {
+ 'data': '{{ repo.props.name }}',
+ 'attr': {'repo_id': '{{ repo.props.id }}'},
+ 'state': 'open'
+ };
+
+ var path_eles = cur_path.split('/');
+ path_eles.pop();
+ /* e.g.
+ * path: '/xx/'
+ * path_eles: ['', 'xx']
+ * data: [["xxx", "xx", "test1022"], ["lkjj", "kjhkhi"]]
+ */
+ var len = data.length;
+ var children = [];
+ if (len == 1) {
+ if (data[0].length > 0) {
+ children[0] = [];
+ for (var i = 0, len_0 = data[0].length; i < len_0; i++) {
+ children[0].push({
+ 'data': data[0][i],
+ 'attr': {'repo_id': '{{ repo.props.id }}'},
+ 'state': 'closed'
+ });
+ }
+ $.extend(repo_data, {'children': children[0]});
+ }
+ } else {
+ for (var i = len - 1; i > -1; i-- ) {
+ children[i] = [];
+ if (i == len - 1) {
+ for (var j = 0, j_len = data[i].length; j < j_len; j++) {
+ children[i].push({
+ 'data': data[i][j],
+ 'attr': {'repo_id': '{{ repo.props.id }}'},
+ 'state': 'closed'
+ });
+ }
+ } else {
+ for (var j = 0, j_len = data[i].length; j < j_len; j++) {
+ if (data[i][j] == path_eles[i+1]) {
+ children[i].push({
+ 'data': data[i][j],
+ 'attr': {'repo_id': '{{ repo.props.id }}'},
+ 'state': 'open',
+ 'children': children[i+1]
+ });
+ } else {
+ children[i].push({
+ 'data': data[i][j],
+ 'attr': {'repo_id': '{{ repo.props.id }}'},
+ 'state': 'closed'
+ });
+ }
+ }
+ }
+ }
+ $.extend(repo_data, {'children': children[0]});
+ }
+ json_data.push(repo_data);
+ var file_tree = new FileTree();
+ file_tree.renderDirTree($('#current-repo-dirs').data('site_root', '{{SITE_ROOT}}'), form, json_data);
+ },
+ error: function() {
+ var file_tree = new FileTree();
+ file_tree.renderDirTree($('#current-repo-dirs').data('site_root', '{{SITE_ROOT}}'), form, current_repo);
+ }
+ });
return false;
});
diff --git a/seahub/urls.py b/seahub/urls.py
index d0394ed4cc..47a092edeb 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -106,7 +106,7 @@ urlpatterns = patterns('',
url(r'^modules/toggle/$', toggle_modules, name="toggle_modules"),
### Ajax ###
- (r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/$', get_dirents),
+ url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/delete/$', delete_dirents, name='delete_dirents'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/move/$', mv_dirents, name='mv_dirents'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/copy/$', cp_dirents, name='cp_dirents'),
diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py
index 5d799b9179..924e177419 100644
--- a/seahub/views/ajax.py
+++ b/seahub/views/ajax.py
@@ -68,17 +68,35 @@ def get_dirents(request, repo_id):
path = request.GET.get('path', '')
dir_only = request.GET.get('dir_only', False)
+ all_dir = request.GET.get('all_dir', False)
if not path:
err_msg = _(u"No path.")
return HttpResponse(json.dumps({"err_msg": err_msg}), status=400,
content_type=content_type)
+ # get dirents for every path element
+ if all_dir:
+ all_dirents = []
+ path_eles = path.split('/')[:-1]
+ for i, x in enumerate(path_eles):
+ ele_path = '/'.join(path_eles[:i+1]) + '/'
+ try:
+ ele_path_dirents = seafile_api.list_dir_by_path(repo_id, ele_path.encode('utf-8'))
+ except SearpcError, e:
+ ele_path_dirents = []
+ ds = []
+ for d in ele_path_dirents:
+ if stat.S_ISDIR(d.mode):
+ ds.append(d.obj_name)
+ all_dirents.append(ds)
+ return HttpResponse(json.dumps(all_dirents), content_type=content_type)
+
+ # get dirents in path
try:
dirents = seafile_api.list_dir_by_path(repo_id, path.encode('utf-8'))
except SearpcError, e:
return HttpResponse(json.dumps({"err_msg": e.msg}), status=500,
content_type=content_type)
-
dirent_list = []
for dirent in dirents:
if stat.S_ISDIR(dirent.mode):