diff --git a/media/css/seahub.css b/media/css/seahub.css
index 9d1068e75e..7a5133d41a 100644
--- a/media/css/seahub.css
+++ b/media/css/seahub.css
@@ -2162,11 +2162,13 @@ textarea:-moz-placeholder {/* for FF */
padding:2px;
}
/* file/dir share popup */
+#folder-perm-popup,
#file-share,
#share-popup {
padding:15px;
min-height:200px;
}
+#folder-perm-popup .hd,
#file-share .hd,
#share-popup .hd {
margin:0 0 8px 4px;
@@ -2827,7 +2829,10 @@ textarea:-moz-placeholder {/* for FF */
display: inline-block;
}
.perm-add-perm,
+.user-perm-add-perm,
+.group-perm-add-perm,
.perm-toggle-select,
+#folder-perm-tabs .perm-select,
.share-permission-select,
.user-role-select,
.user-status-select {
@@ -3394,17 +3399,6 @@ textarea:-moz-placeholder {/* for FF */
.group-perm-add-tr input {
padding:2px 5px;
}
-
-.user-perm-add-perm,
-.group-perm-add-perm,
-.perm-toggle-select,
-.share-permission-select {
- position:relative;/*for long text in other lang in 'share admin'*/
- padding:3px 2px;
- background:#fff;
- border:1px solid #ddd;
- border-radius:2px;
-}
.perm-add-select-folder {
position:relative;
right:18px;
@@ -3493,7 +3487,6 @@ textarea:-moz-placeholder {/* for FF */
#multi-dirents-op .del-dirents {
background-position: -57px -5px;
}
-
#dir-private-share .label {
margin:6px 0 8px;
}
@@ -3520,3 +3513,21 @@ textarea:-moz-placeholder {/* for FF */
height:36px;
margin:21px 0 10px;
}
+
+/* user & group folder perm */
+#folder-perm-tabs .tabs-panel {
+ width:400px;
+}
+#folder-perm-tabs .perm-select {
+ height:30px;
+}
+#folder-perm-tabs .submit {
+ margin-top:2px;
+ height:30px;
+}
+#folder-perm-tabs .select2-choices {
+ border-radius:2px;
+}
+#folder-perm-tabs table {
+ margin-top:0;
+}
diff --git a/seahub/templates/js/templates.html b/seahub/templates/js/templates.html
index 6ec1c67b46..0047208c27 100644
--- a/seahub/templates/js/templates.html
+++ b/seahub/templates/js/templates.html
@@ -195,6 +195,9 @@
-
+
+
diff --git a/seahub/templates/repo_folder_perm.html b/seahub/templates/repo_folder_perm.html
index c1d691f0ec..864b779fea 100644
--- a/seahub/templates/repo_folder_perm.html
+++ b/seahub/templates/repo_folder_perm.html
@@ -234,12 +234,12 @@ $('.perm-toggle-select').on('change', function() {
if (is_user_tab == true) {
var user = perm_item.attr('data-user'),
- data = { 'user': user, 'path': path, 'perm': perm },
- url = '{% url 'toggle_user_folder_permission' repo.id %}';
+ data = {'user': user, 'path': path, 'perm': perm, 'type': 'modify'},
+ url = '{% url 'set_user_folder_perm' repo.id %}';
} else {
var group_id = perm_item.attr('data-group_id'),
- data = { 'group_id': group_id, 'path': path, 'perm': perm },
- url = '{% url 'toggle_group_folder_permission' repo.id %}';
+ data = {'group_id': group_id, 'path': path, 'perm': perm, 'type': 'modify'},
+ url = '{% url 'set_group_folder_perm' repo.id %}';
}
perm_toggle(select, data, url)
@@ -251,17 +251,20 @@ $('.perm-delete-btn').on('click', function() {
if (is_user_tab == true) {
var user = perm_item.attr('data-user'),
- data = { 'user': user, 'path': path, 'perm': perm },
- url = '{% url 'remove_user_folder_permission' repo.id %}';
+ data = {'user': user, 'path': path, 'perm': perm, 'type': 'delete'},
+ url = '{% url 'set_user_folder_perm' repo.id %}';
} else {
var group_id = perm_item.attr('data-group_id'),
- data = { 'group_id': group_id, 'path': path, 'perm': perm},
- url = '{% url 'remove_group_folder_permission' repo.id %}';
+ data = {'group_id': group_id, 'path': path, 'perm': perm, 'type': 'delete'},
+ url = '{% url 'set_group_folder_perm' repo.id %}';
}
$.ajax({
url: url,
+ type: 'POST',
+ cache: false,
dataType: 'json',
+ beforeSend: prepareCSRFToken,
data: data,
success: function() {
perm_item.remove();
@@ -279,8 +282,8 @@ $('.perm-add-submit').click(function() {
var user = user_input.val(),
perm = $('.user-perm-add-perm').val(),
- data = { 'user': user, 'path': path, 'perm': perm },
- url = '{% url 'add_user_folder_permission' repo.id %}';
+ data = {'user': user, 'path': path, 'perm': perm, 'type': 'add'},
+ url = '{% url 'set_user_folder_perm' repo.id %}';
} else {
var path = $('.group-perm-add-folder-path').val();
if (!$.trim(path)) {
@@ -289,8 +292,8 @@ $('.perm-add-submit').click(function() {
var group_id = $('#perm-add-grp-id').val(),
perm = $('.group-perm-add-perm').val(),
- data = { 'group_id': group_id, 'path': path, 'perm': perm },
- url = '{% url 'add_group_folder_permission' repo.id %}';
+ data = {'group_id': group_id, 'path': path, 'perm': perm, 'type': 'add'},
+ url = '{% url 'set_group_folder_perm' repo.id %}';
}
$.ajax({
diff --git a/seahub/urls.py b/seahub/urls.py
index e0953e477e..7794a83407 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -168,12 +168,9 @@ urlpatterns = patterns('',
url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/change-basic-info/$', ajax_repo_change_basic_info, name='ajax_repo_change_basic_info'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/transfer-owner/$', ajax_repo_transfer_owner, name='ajax_repo_transfer_owner'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/change-passwd/$', ajax_repo_change_passwd, name='ajax_repo_change_passwd'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/user-folder-permission/add/$', add_user_folder_permission, name='add_user_folder_permission'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/user-folder-permission/remove/$', remove_user_folder_permission, name='remove_user_folder_permission'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/user-folder-permission/toggle/$', toggle_user_folder_permission, name='toggle_user_folder_permission'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/group-folder-permission/add/$', add_group_folder_permission, name='add_group_folder_permission'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/group-folder-permission/remove/$', remove_group_folder_permission, name='remove_group_folder_permission'),
- url(r'^ajax/repo/(?P[-0-9a-f]{36})/setting/group-folder-permission/toggle/$', toggle_group_folder_permission, name='toggle_group_folder_permission'),
+ url(r'^ajax/repo/(?P[-0-9a-f]{36})/get-folder-perm-by-path/$', get_folder_perm_by_path, name='get_folder_perm_by_path'),
+ url(r'^ajax/repo/(?P[-0-9a-f]{36})/set-user-folder-perm/$', set_user_folder_perm, name='set_user_folder_perm'),
+ url(r'^ajax/repo/(?P[-0-9a-f]{36})/set-group-folder-perm/$', set_group_folder_perm, name='set_group_folder_perm'),
url(r'^_templates/(?P.*)$', underscore_template, name="underscore_template"),
diff --git a/seahub/utils/repo.py b/seahub/utils/repo.py
index 787ae2a1fd..a509c21bb9 100644
--- a/seahub/utils/repo.py
+++ b/seahub/utils/repo.py
@@ -19,18 +19,15 @@ def list_dir_by_path(cmmt, path):
def check_user_folder_perm_args(from_user, repo_id, path, to_user, perm=None):
if not seafile_api.get_repo(repo_id):
- return {'error': _(u'Library does not exist.'), 'status': 400}
+ return {'error': _(u'Library does not exist'), 'status': 400}
- if check_repo_access_permission(repo_id, from_user) != 'rw':
+ if from_user != seafile_api.get_repo_owner(repo_id):
return {'error': _('Permission denied'), 'status': 403}
if perm is not None:
# add or toggle folder perm
- if seafile_api.get_dir_id_by_path(repo_id, path) is None:
- return {'error': _('Invalid path'), 'status': 400}
-
if perm != 'r' and perm != 'rw':
- return {'error': _('Invalid folder permission'), 'status': 400}
+ return {'error': _('Invalid folder permission, should be "rw" or "r"'), 'status': 400}
if not path.startswith('/'):
return {'error': _('Path should start with "/"'), 'status': 400}
@@ -38,6 +35,9 @@ def check_user_folder_perm_args(from_user, repo_id, path, to_user, perm=None):
if path != '/' and path.endswith('/'):
return {'error': _('Path should NOT ends with "/"'), 'status': 400}
+ if seafile_api.get_dir_id_by_path(repo_id, path) is None:
+ return {'error': _('Invalid path'), 'status': 400}
+
try:
user = User.objects.get(email = to_user)
except User.DoesNotExist:
@@ -52,16 +52,13 @@ def check_group_folder_perm_args(from_user, repo_id, path, group_id, perm = None
if not seafile_api.get_repo(repo_id):
return {'error': _(u'Library does not exist.'), 'status': 400}
- if check_repo_access_permission(repo_id, from_user) != 'rw':
+ if from_user != seafile_api.get_repo_owner(repo_id):
return {'error': _('Permission denied'), 'status': 403}
if perm is not None:
# add or toggle folder perm
- if seafile_api.get_dir_id_by_path(repo_id, path) is None:
- return {'error': _('Invalid path'), 'status': 400}
-
if perm != 'r' and perm != 'rw':
- return {'error': _('Invalid folder permission'), 'status': 400}
+ return {'error': _('Invalid folder permission, should be "rw" or "r"'), 'status': 400}
if not path.startswith('/'):
return {'error': _('Path should start with "/"'), 'status': 400}
@@ -69,6 +66,9 @@ def check_group_folder_perm_args(from_user, repo_id, path, group_id, perm = None
if path != '/' and path.endswith('/'):
return {'error': _('Path should NOT ends with "/"'), 'status': 400}
+ if seafile_api.get_dir_id_by_path(repo_id, path) is None:
+ return {'error': _('Invalid path'), 'status': 400}
+
if not seaserv.get_group(group_id):
return {'error': _('Invalid group'), 'status': 400}
diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py
index 46e0150e12..50dd32ce29 100644
--- a/seahub/views/ajax.py
+++ b/seahub/views/ajax.py
@@ -2222,213 +2222,186 @@ def ajax_repo_change_passwd(request, repo_id):
content_type=content_type)
@login_required_ajax
-def add_user_folder_permission(request, repo_id):
+def get_folder_perm_by_path(request, repo_id):
"""
- Add folder permission to a user
+ Get user/group folder permission by path
+ """
+ result = {}
+ content_type = 'application/json; charset=utf-8'
+
+ path = request.GET.get('path', None)
+
+ if not path:
+ return HttpResponse(json.dumps({"error": _('Argument missing')}),
+ status=400, content_type=content_type)
+
+ user_perms = seafile_api.list_folder_user_perm_by_repo(repo_id)
+ group_perms = seafile_api.list_folder_group_perm_by_repo(repo_id)
+ user_perms.reverse()
+ group_perms.reverse()
+
+ user_result_perms = []
+ for user_perm in user_perms:
+ if path == user_perm.path:
+ user_result_perm = {
+ "perm": user_perm.permission,
+ "user": user_perm.user,
+ }
+ user_result_perms.append(user_result_perm)
+
+ group_result_perms = []
+ for group_perm in group_perms:
+ if path == group_perm.path:
+ group_result_perm = {
+ "perm": group_perm.permission,
+ "group_id": group_perm.group_id,
+ "group_name": get_group(group_perm.group_id).group_name,
+ }
+ group_result_perms.append(group_result_perm)
+
+ result['user_perms'] = user_result_perms
+ result['group_perms'] = group_result_perms
+
+ return HttpResponse(json.dumps(result), content_type=content_type)
+
+@login_required_ajax
+def set_user_folder_perm(request, repo_id):
+ """
+ Add or modify or delete folder permission to a user
"""
if request.method != 'POST':
raise Http404
- result = {}
content_type = 'application/json; charset=utf-8'
user = request.POST.get('user', None)
path = request.POST.get('path', None)
perm = request.POST.get('perm', None)
+ op_type = request.POST.get('type', None)
- if not user or not path or not perm:
+ if not user or not path or not perm or \
+ op_type != 'add' and op_type != 'modify' and op_type != 'delete':
return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
+ status=400, content_type=content_type)
- result = check_user_folder_perm_args(request.user, repo_id, path, user, perm)
+ result = check_user_folder_perm_args(request.user.username, repo_id, path, user, perm)
if 'error' in result:
return HttpResponse(json.dumps(result), status=result['status'],
content_type=content_type)
- try:
- seafile_api.add_folder_user_perm(repo_id, path, perm, user)
- send_perm_audit_msg('add-repo-perm', request.user.username, user, \
- repo_id, path, perm)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
+ user_folder_perm = seafile_api.get_folder_user_perm(repo_id, path, user)
- messages.success(request, _(u'Success'))
+ if op_type == 'add':
+ if not user_folder_perm:
+ try:
+ seafile_api.add_folder_user_perm(repo_id, path, perm, user)
+ send_perm_audit_msg('add-repo-perm', request.user.username, user, \
+ repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Already add this folder permission')}),
+ status=400, content_type=content_type)
+
+ if op_type == 'modify':
+ if user_folder_perm and user_folder_perm != perm:
+ try:
+ seafile_api.set_folder_user_perm(repo_id, path, perm, user)
+ send_perm_audit_msg('modify-repo-perm', request.user.username, user, \
+ repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Wrong folder permission')}),
+ status=400, content_type=content_type)
+
+ if op_type == 'delete':
+ if user_folder_perm:
+ try:
+ seafile_api.rm_folder_user_perm(repo_id, path, user)
+ send_perm_audit_msg('delete-repo-perm', request.user.username, user, \
+ repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Please add folder permission first')}),
+ status=400, content_type=content_type)
return HttpResponse(json.dumps({'success': True}),
content_type=content_type)
@login_required_ajax
-def remove_user_folder_permission(request, repo_id):
+def set_group_folder_perm(request, repo_id):
"""
- Remove folder permission of a user
- """
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- user = request.GET.get('user', None)
- path = request.GET.get('path', None)
- perm = request.GET.get('perm', None)
-
- if not user or not path or not perm:
- return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
-
- result = check_user_folder_perm_args(request.user, repo_id, path, user)
- if 'error' in result:
- return HttpResponse(json.dumps(result), status=result['status'],
- content_type=content_type)
-
- try:
- seafile_api.rm_folder_user_perm(repo_id, path, user)
- send_perm_audit_msg('delete-repo-perm', request.user.username, user, \
- repo_id, path, perm)
- return HttpResponse(json.dumps({'success': True}),
- content_type=content_type)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
-
-@login_required_ajax
-def toggle_user_folder_permission(request, repo_id):
- """
- Change folder permission of a user
+ Add or modify or delete folder permission to a group
"""
if request.method != 'POST':
raise Http404
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- user = request.POST.get('user', None)
- path = request.POST.get('path', None)
- perm = request.POST.get('perm', None)
-
- if not user or not path or not perm:
- return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
-
- result = check_user_folder_perm_args(request.user, repo_id, path, user, perm)
- if 'error' in result:
- return HttpResponse(json.dumps(result), status=result['status'],
- content_type=content_type)
-
- try:
- seafile_api.set_folder_user_perm(repo_id, path, perm, user)
- send_perm_audit_msg('modify-repo-perm', request.user.username, user, \
- repo_id, path, perm)
- return HttpResponse(json.dumps({'success': True}),
- content_type=content_type)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
-
-@login_required_ajax
-def add_group_folder_permission(request, repo_id):
- """
- Add folder permission to a group
- """
- if request.method != 'POST':
- raise Http404
-
- result = {}
content_type = 'application/json; charset=utf-8'
group_id = request.POST.get('group_id', None)
path = request.POST.get('path', None)
perm = request.POST.get('perm', None)
+ op_type = request.POST.get('type', None)
- if not group_id or not path or not perm:
+ if not group_id or not path or not perm or \
+ op_type != 'add' and op_type != 'modify' and op_type != 'delete':
return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
+ status=400, content_type=content_type)
+
group_id = int(group_id)
- result = check_group_folder_perm_args(request.user, repo_id, path, group_id, perm)
+ result = check_group_folder_perm_args(request.user.username, repo_id, path, group_id, perm)
if 'error' in result:
return HttpResponse(json.dumps(result), status=result['status'],
content_type=content_type)
- try:
- seafile_api.add_folder_group_perm(repo_id, path, perm, group_id)
- send_perm_audit_msg('add-repo-perm', request.user.username, \
- group_id, repo_id, path, perm)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
+ group_folder_perm = seafile_api.get_folder_group_perm(repo_id, path, group_id)
+
+ if op_type == 'add':
+ if not group_folder_perm:
+ try:
+ seafile_api.add_folder_group_perm(repo_id, path, perm, group_id)
+ send_perm_audit_msg('add-repo-perm', request.user.username, \
+ group_id, repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Already add this folder permission')}),
+ status=400, content_type=content_type)
+
+ if op_type == 'modify':
+ if group_folder_perm and group_folder_perm != perm:
+ try:
+ seafile_api.set_folder_group_perm(repo_id, path, perm, group_id)
+ send_perm_audit_msg('modify-repo-perm', request.user.username, \
+ group_id, repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Wrong folder permission')}),
+ status=400, content_type=content_type)
+
+ if op_type == 'delete':
+ if group_folder_perm:
+ try:
+ seafile_api.rm_folder_group_perm(repo_id, path, group_id)
+ send_perm_audit_msg('delete-repo-perm', request.user.username, \
+ group_id, repo_id, path, perm)
+ except SearpcError, e:
+ return HttpResponse(json.dumps({"error": e.msg}), status=500,
+ content_type=content_type)
+ else:
+ return HttpResponse(json.dumps({"error": _('Please add folder permission first')}),
+ status=400, content_type=content_type)
- messages.success(request, _(u'Success'))
return HttpResponse(json.dumps({'success': True}),
content_type=content_type)
-@login_required_ajax
-def remove_group_folder_permission(request, repo_id):
- """
- Remove folder permission of a group
- """
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- group_id = int(request.GET.get('group_id', None))
- path = request.GET.get('path', None)
- perm = request.GET.get('perm', None)
-
- if not group_id or not path or not perm:
- return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
-
- result = check_group_folder_perm_args(request.user, repo_id, path, group_id)
- if 'error' in result:
- return HttpResponse(json.dumps(result), status=result['status'],
- content_type=content_type)
-
- try:
- seafile_api.rm_folder_group_perm(repo_id, path, group_id)
- send_perm_audit_msg('delete-repo-perm', request.user.username, \
- group_id, repo_id, path, perm)
- return HttpResponse(json.dumps({'success': True}),
- content_type=content_type)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
-
-@login_required_ajax
-def toggle_group_folder_permission(request, repo_id):
- """
- Change folder permission of a group
- """
- if request.method != 'POST':
- raise Http404
-
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- group_id = int(request.POST.get('group_id', None))
- path = request.POST.get('path', None)
- perm = request.POST.get('perm', None)
-
- if not group_id or not path or not perm:
- return HttpResponse(json.dumps({"error": _('Argument missing')}),
- status=400,
- content_type=content_type)
-
- result = check_group_folder_perm_args(request.user, repo_id, path, group_id, perm)
- if 'error' in result:
- return HttpResponse(json.dumps(result), status=result['status'],
- content_type=content_type)
-
- try:
- seafile_api.set_folder_group_perm(repo_id, path, perm, group_id)
- send_perm_audit_msg('modify-repo-perm', request.user.username, \
- group_id, repo_id, path, perm)
- return HttpResponse(json.dumps({'success': True}),
- content_type=content_type)
- except SearpcError, e:
- return HttpResponse(json.dumps({"error": e.msg}), status=500,
- content_type=content_type)
-
@login_required_ajax
def get_group_basic_info(request, group_id):
'''
diff --git a/static/scripts/app/views/dirent.js b/static/scripts/app/views/dirent.js
index 862cd79716..098f1cdaa2 100644
--- a/static/scripts/app/views/dirent.js
+++ b/static/scripts/app/views/dirent.js
@@ -4,8 +4,9 @@ define([
'backbone',
'common',
'file-tree',
- 'app/views/share'
-], function($, _, Backbone, Common, FileTree, ShareView) {
+ 'app/views/share',
+ 'app/views/folder-perm'
+], function($, _, Backbone, Common, FileTree, ShareView, FolderPermView) {
'use strict';
app = app || {};
@@ -37,6 +38,7 @@ define([
category: dir.category,
repo_id: dir.repo_id,
user_perm: dir.user_perm,
+ is_repo_owner: dir.is_repo_owner,
repo_encrypted: dir.encrypted
}));
return this;
@@ -53,7 +55,8 @@ define([
'click .delete': 'delete',
'click .rename': 'rename',
'click .mv': 'mvcp',
- 'click .cp': 'mvcp'
+ 'click .cp': 'mvcp',
+ 'click .set-folder-permission': 'setFolderPerm'
},
highlight: function() {
@@ -434,6 +437,16 @@ define([
return false;
});
return false;
+ },
+
+ setFolderPerm: function() {
+ var options = {
+ 'obj_name': this.model.get('obj_name'),
+ 'dir_path': this.dir.path,
+ 'repo_id': this.dir.repo_id
+ };
+ new FolderPermView(options);
+ return false;
}
});
diff --git a/static/scripts/app/views/folder-perm-item.js b/static/scripts/app/views/folder-perm-item.js
new file mode 100644
index 0000000000..c943582a6b
--- /dev/null
+++ b/static/scripts/app/views/folder-perm-item.js
@@ -0,0 +1,138 @@
+define([
+ 'jquery',
+ 'underscore',
+ 'backbone',
+ 'common'
+], function($, _, Backbone, Common) {
+ 'use strict';
+
+ var FolderPermItemView = Backbone.View.extend({
+ tagName: 'tr',
+
+ template: _.template($('#folder-perm-item-tmpl').html()),
+
+ initialize: function(options) {
+ this.item_data = options.item_data;
+ this.repo_id = options.repo_id;
+ this.path = options.path;
+
+ this.render();
+ },
+
+ render: function () {
+ this.$el.html(this.template(this.item_data));
+ return this;
+ },
+
+ events: {
+ 'mouseenter': 'showPermOpIcons',
+ 'mouseleave': 'hidePermOpIcons',
+ 'click .perm-edit-icon': 'editIconClick',
+ 'change .perm-toggle-select': 'editPerm',
+ 'click .perm-delete-icon': 'deletePerm'
+ },
+
+ showPermOpIcons: function () {
+ this.$el.find('.op-icon').removeClass('vh');
+ },
+
+ hidePermOpIcons: function () {
+ this.$el.find('.op-icon').addClass('vh');
+ },
+
+ editIconClick: function (e) {
+ $(e.currentTarget).closest('td')
+ .find('.perm').addClass('hide').end()
+ .find('.perm-toggle-select').removeClass('hide');
+ },
+
+ editPerm: function (e) {
+ var _this = this;
+ var perm = $(e.currentTarget).val();
+ var post_data = {
+ 'perm': perm,
+ 'path': this.path,
+ 'type': 'modify'
+ };
+ var is_user_perm = this.item_data.is_user_perm;
+ if (is_user_perm) {
+ $.extend(post_data, {'user': this.item_data.user});
+ } else {
+ $.extend(post_data, {'group_id': this.item_data.group_id});
+ }
+ $.ajax({
+ url: Common.getUrl({
+ name: is_user_perm ? 'set_user_folder_perm' : 'set_group_folder_perm',
+ repo_id: this.repo_id
+ }),
+ type: 'POST',
+ dataType: 'json',
+ cache: false,
+ beforeSend: Common.prepareCSRFToken,
+ data: post_data,
+ success: function() {
+ _this.item_data.perm = perm;
+ _this.render();
+ },
+ error: function(xhr) {
+ var err;
+ if (xhr.responseText) {
+ err = $.parseJSON(xhr.responseText).error;
+ } else {
+ err = gettext("Failed. Please check the network.");
+ }
+ if (is_user_perm) {
+ $('#user-folder-perm .error').html(err).removeClass('hide');
+ } else {
+ $('#group-folder-perm .error').html(err).removeClass('hide');
+ }
+ }
+ });
+ },
+
+ deletePerm: function () {
+ var _this = this;
+ var post_data = {
+ 'perm': this.item_data.perm,
+ 'path': this.path,
+ 'type': 'delete'
+ };
+ var is_user_perm = this.item_data.is_user_perm;
+ if (is_user_perm) {
+ $.extend(post_data, {'user': this.item_data.user});
+ } else {
+ $.extend(post_data, {'group_id': this.item_data.group_id});
+ }
+ $.ajax({
+ url: Common.getUrl({
+ name: is_user_perm ? 'set_user_folder_perm' : 'set_group_folder_perm',
+ repo_id: this.repo_id
+ }),
+ type: 'POST',
+ dataType: 'json',
+ cache: false,
+ beforeSend: Common.prepareCSRFToken,
+ data: post_data,
+ success: function() {
+ _this.remove();
+ },
+ error: function(xhr) {
+ var err;
+ if (xhr.responseText) {
+ err = $.parseJSON(xhr.responseText).error;
+ } else {
+ err = gettext("Failed. Please check the network.");
+ }
+ if (is_user_perm) {
+ $('#user-folder-perm .error').html(err).removeClass('hide');
+ } else {
+ $('#group-folder-perm .error').html(err).removeClass('hide');
+ }
+ }
+ });
+ }
+
+ });
+
+ return FolderPermItemView;
+});
diff --git a/static/scripts/app/views/folder-perm.js b/static/scripts/app/views/folder-perm.js
new file mode 100644
index 0000000000..8c97492e13
--- /dev/null
+++ b/static/scripts/app/views/folder-perm.js
@@ -0,0 +1,223 @@
+define([
+ 'jquery',
+ 'underscore',
+ 'backbone',
+ 'common',
+ 'jquery.ui.tabs',
+ 'select2',
+ 'app/views/folder-perm-item'
+], function($, _, Backbone, Common, Tabs, Select2, FolderPermItemView) {
+ 'use strict';
+
+ var FolderPermView = Backbone.View.extend({
+ tagName: 'div',
+ id: 'folder-perm-popup',
+
+ template: _.template($('#folder-perm-popup-tmpl').html()),
+
+ initialize: function(options) {
+ this.repo_id = options.repo_id;
+ this.obj_name = options.obj_name;
+ this.dir_path = options.dir_path;
+ this.path = this.dir_path + this.obj_name;
+
+ this.render();
+
+ this.$el.modal({
+ appendTo: "#main",
+ focus: false,
+ containerCss: {"padding": 0}
+ });
+ $('#simplemodal-container').css({'width':'auto', 'height':'auto'});
+
+ this.$("#folder-perm-tabs").tabs();
+
+ this.panelsInit();
+
+ var _this = this;
+ $(document).on('click', function(e) {
+ var target = e.target || event.srcElement;
+ if (!_this.$('.perm-edit-icon, .perm-toggle-select').is(target)) {
+ _this.$('.perm').removeClass('hide');
+ _this.$('.perm-toggle-select').addClass('hide');
+ }
+ });
+ },
+
+ render: function () {
+ this.$el.html(this.template({
+ title: gettext("Set {placeholder}'s permission")
+ .replace('{placeholder}', '' + Common.HTMLescape(this.obj_name) + '')
+ }));
+ return this;
+ },
+
+ panelsInit: function() {
+ this.$add_user_perm = this.$('#add-user-folder-perm');
+ this.$add_group_perm = this.$('#add-group-folder-perm');
+
+ var _this = this;
+ var $add_user_perm = this.$add_user_perm,
+ $add_group_perm = this.$add_group_perm;
+
+ // show existing perm items
+ Common.ajaxGet({
+ 'get_url': Common.getUrl({
+ name: 'get_folder_perm_by_path',
+ repo_id: this.repo_id
+ }),
+ 'data': {'path': this.path},
+ 'after_op_success': function (data) {
+ $(data['user_perms']).each(function(index, item) {
+ var perm_item = new FolderPermItemView({
+ 'repo_id': _this.repo_id,
+ 'path': _this.path,
+ 'item_data':$.extend(item, {'is_user_perm': true})
+ });
+ $add_user_perm.after(perm_item.el);
+ });
+
+ $(data['group_perms']).each(function(index, item) {
+ var perm_item = new FolderPermItemView({
+ 'repo_id': _this.repo_id,
+ 'path': _this.path,
+ 'item_data':$.extend(item, {'is_user_perm': false})
+ });
+ $add_group_perm.after(perm_item.el);
+ });
+ }
+ });
+
+ // use select2 to 'user' input in 'add user perm'
+ $('[name="email"]', $add_user_perm).select2({
+ maximumSelectionSize: 1,
+ tags: function () {
+ var contacts = app.pageOptions.contacts || [];
+ var contact_list = [];
+ for (var i = 0, len = contacts.length; i < len; i++) {
+ contact_list.push(contacts[i].email);
+ }
+ return contact_list;
+ },
+ tokenSeparators: [',', ' '],
+ escapeMarkup: function(m) { return m; }
+ });
+
+ // use select2 to 'group' input in 'add group perm'
+ var groups = app.pageOptions.groups || [],
+ g_opts = '';
+ for (var i = 0, len = groups.length; i < len; i++) {
+ g_opts += '';
+ }
+ $('[name="group"]', $add_group_perm).html(g_opts).select2({
+ maximumSelectionSize: 1,
+ escapeMarkup: function(m) { return m; }
+ });
+ },
+
+ events: {
+ 'click #add-user-folder-perm .submit': 'addUserFolderPerm',
+ 'click #add-group-folder-perm .submit': 'addGroupFolderPerm'
+ },
+
+ addUserFolderPerm: function() {
+ var _this = this;
+ var form = this.$add_user_perm, // pseudo form
+ email = $('[name="email"]', form).val();
+ if (!email) {
+ return false;
+ }
+
+ var perm = $('[name="permission"]', form).val();
+ Common.ajaxPost({
+ 'form': form,
+ 'form_id': form.attr('id'),
+ 'post_url': Common.getUrl({
+ name: 'set_user_folder_perm',
+ repo_id: this.repo_id
+ }),
+ 'post_data': {
+ 'path': this.path,
+ 'type': 'add',
+ 'user': email,
+ 'perm': perm
+ },
+ 'after_op_success': function(data) {
+ var perm_item = new FolderPermItemView({
+ 'repo_id': _this.repo_id,
+ 'path': _this.path,
+ 'item_data': {
+ 'user': email,
+ 'perm': perm,
+ 'is_user_perm': true
+ }
+ });
+ form.after(perm_item.el);
+
+ $('[name="email"]', form).select2("val", "");
+ },
+ 'after_op_error': function(xhr) {
+ var err;
+ if (xhr.responseText) {
+ err = $.parseJSON(xhr.responseText).error;
+ } else {
+ err = gettext("Failed. Please check the network.");
+ }
+ $('#user-folder-perm .error').html(err).removeClass('hide');
+ }
+ });
+ },
+
+ addGroupFolderPerm: function() {
+ var _this = this;
+ var form = this.$add_group_perm, // pseudo form
+ group_input = $('[name="group"]', form),
+ group_id = group_input.val()[0];
+ if (!group_id) {
+ return false;
+ }
+
+ var perm = $('[name="permission"]', form).val();
+ Common.ajaxPost({
+ 'form': form,
+ 'form_id': form.attr('id'),
+ 'post_url': Common.getUrl({
+ name: 'set_group_folder_perm',
+ repo_id: this.repo_id
+ }),
+ 'post_data': {
+ 'path': this.path,
+ 'type': 'add',
+ 'group_id': group_id,
+ 'perm': perm
+ },
+ 'after_op_success': function(data) {
+ var perm_item = new FolderPermItemView({
+ 'repo_id': _this.repo_id,
+ 'path': _this.path,
+ 'item_data': {
+ 'is_user_perm': false,
+ 'perm': perm,
+ 'group_id': group_id,
+ 'group_name': $('[name="group"]', form).select2('data')[0].text
+ }
+ });
+ form.after(perm_item.el);
+
+ $('[name="group"]', form).select2("val", "");
+ },
+ 'after_op_error': function(xhr) {
+ var err;
+ if (xhr.responseText) {
+ err = $.parseJSON(xhr.responseText).error;
+ } else {
+ err = gettext("Failed. Please check the network.");
+ }
+ $('#group-folder-perm .error').html(err).removeClass('hide');
+ }
+ });
+ }
+ });
+
+ return FolderPermView;
+});
diff --git a/static/scripts/common.js b/static/scripts/common.js
index 40a90e2df0..f4685ff192 100644
--- a/static/scripts/common.js
+++ b/static/scripts/common.js
@@ -117,6 +117,9 @@ define([
case 'ajax_unset_inner_pub_repo': return siteRoot + 'ajax/unset-inner-pub-repo/' + options.repo_id + '/';
+ case 'get_folder_perm_by_path': return siteRoot + 'ajax/repo/' + options.repo_id + '/get-folder-perm-by-path/';
+ case 'set_user_folder_perm': return siteRoot + 'ajax/repo/' + options.repo_id + '/set-user-folder-perm/';
+ case 'set_group_folder_perm': return siteRoot + 'ajax/repo/' + options.repo_id + '/set-group-folder-perm/';
}
},