From 8e3d9d0b18764de9ab24f41713348277306a93a1 Mon Sep 17 00:00:00 2001 From: llj Date: Wed, 30 Oct 2013 21:18:58 +0800 Subject: [PATCH] [repo] auto open cur_dir in jstree for mv/cp --- seahub/templates/repo.html | 76 +++++++++++++++++++++++++++++++++++++- seahub/urls.py | 2 +- seahub/views/ajax.py | 20 +++++++++- 3 files changed, 94 insertions(+), 4 deletions(-) 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):