1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-08 18:30:53 +00:00

[user panel] group owned library: enable group admin to set folder perm

This commit is contained in:
llj
2018-05-15 11:26:33 +08:00
parent 8a95cc5060
commit b0df96a948
10 changed files with 189 additions and 40 deletions

View File

@@ -527,7 +527,7 @@
</ul> </ul>
<div class="menu-inner-divider"></div> <div class="menu-inner-divider"></div>
<ul> <ul>
<% if (app.pageOptions.folder_perm_enabled && is_repo_owner && !is_virtual && has_been_shared_out) { %> <% if (can_set_folder_perm) { %>
<li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li> <li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li>
<% } %> <% } %>
<li><a class="op view-details" href="#">{% trans "Details" %}</a></li> <li><a class="op view-details" href="#">{% trans "Details" %}</a></li>
@@ -602,7 +602,7 @@
<div class="menu-inner-divider"></div> <div class="menu-inner-divider"></div>
<ul> <ul>
<% if (dirent.perm == 'rw') { %> <% if (dirent.perm == 'rw') { %>
<% if (app.pageOptions.folder_perm_enabled && is_repo_owner && !is_virtual && has_been_shared_out) { %> <% if (can_set_folder_perm) { %>
<li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li> <li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li>
<% } %> <% } %>
<li><a class="op view-details" href="#">{% trans "Details" %}</a></li> <li><a class="op view-details" href="#">{% trans "Details" %}</a></li>
@@ -958,7 +958,7 @@
<div class="menu-inner-divider"></div> <div class="menu-inner-divider"></div>
<ul> <ul>
<% if (dirent.perm == 'rw') { %> <% if (dirent.perm == 'rw') { %>
<% if (app.pageOptions.folder_perm_enabled && is_repo_owner) { %> <% if (can_set_folder_perm) { %>
<li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li> <li><a class="op set-folder-permission" href="#">{% trans "Permission" %}</a></li>
<% } %> <% } %>
<li><a class="op view-details" href="#">{% trans "Details" %}</a></li> <li><a class="op view-details" href="#">{% trans "Details" %}</a></li>

View File

@@ -222,8 +222,10 @@ define([
var group_name = Common.groupId2Name(group_id); var group_name = Common.groupId2Name(group_id);
if (group_name) { if (group_name) {
this.switchCurrentView(this.dirView); this.switchCurrentView(this.dirView);
this.dirView.showDir('group/' + group_id, repo_id, path, this.dirView.showDir('group/' + group_id, repo_id, path, {
{'group_name': group_name}); 'group_id': group_id,
'group_name': group_name
});
this.sideNavView.setCurTab('group', { this.sideNavView.setCurTab('group', {
'cur_group_tab': '', 'cur_group_tab': '',
'cur_group_id': group_id 'cur_group_id': group_id

View File

@@ -70,9 +70,9 @@ define([
if ($el.length && if ($el.length &&
!$el.is(target) && !$el.is(target) &&
!$el.find('*').is(target) && !$el.find('*').is(target) &&
!$td.find('.edit-icon').is(target)) { !$td.find('.perm-edit-icon').is(target)) {
$el.hide(); $el.addClass('hide');
$td.find('.cur-perm, .edit-icon').show(); $td.find('.perm').removeClass('hide');
} }
}; };
$(document).on('click', hideItemEdit); $(document).on('click', hideItemEdit);

View File

@@ -443,12 +443,18 @@ define([
var dir = this.dir; var dir = this.dir;
dir.fetch({ dir.fetch({
cache: false, cache: false,
reset: true, //reset: true,
data: { data: {
'p': dir.path, 'p': dir.path,
'thumbnail_size': thumbnail_size 'thumbnail_size': thumbnail_size
}, },
success: function() { success: function() {
_this.dir.user_can_set_folder_perm = false;
if (_this.contextOptions.group_id) { // the repo is in a group
_this.getGroupInfo();
} else {
_this.reset();
}
}, },
error: function(collection, response, opts) { error: function(collection, response, opts) {
var err_msg; var err_msg;
@@ -470,6 +476,34 @@ define([
}); });
}, },
getGroupInfo: function() {
var _this = this;
$.ajax({
url: Common.getUrl({
'name': 'group',
'group_id': this.contextOptions.group_id
}),
cache: false,
dataType: 'json',
success: function(data) {
if (data.parent_group_id != 0 && // address book group
$.inArray(app.pageOptions.username, data.admins) != -1) { // user is group admin
_this.dir.user_can_set_folder_perm = true;
}
_this.reset();
},
error: function(xhr) {
var err_msg;
if (xhr.responseText) {
err_msg = JSON.parse(xhr.responseText).error_msg;
} else {
err_msg = gettext("Please check the network.");
}
_this.$error.html(err_msg).show();
}
});
},
renderPath: function() { renderPath: function() {
var dir = this.dir; var dir = this.dir;
var path = dir.path; var path = dir.path;

View File

@@ -105,6 +105,12 @@ define([
this.$('.img-link').addClass('hl'); this.$('.img-link').addClass('hl');
this.$('.text-link').addClass('hl'); this.$('.text-link').addClass('hl');
var can_set_folder_perm = false;
if (app.pageOptions.folder_perm_enabled && !dir.is_virtual &&
((dir.is_repo_owner && dir.has_been_shared_out) || dir.user_can_set_folder_perm)) {
can_set_folder_perm = true;
}
var op = template({ var op = template({
dirent: this.model.attributes, dirent: this.model.attributes,
dirent_path: this.model.getPath(), dirent_path: this.model.getPath(),
@@ -112,6 +118,7 @@ define([
category: dir.category, category: dir.category,
repo_id: dir.repo_id, repo_id: dir.repo_id,
is_repo_owner: dir.is_repo_owner, is_repo_owner: dir.is_repo_owner,
can_set_folder_perm: can_set_folder_perm,
can_generate_share_link: app.pageOptions.can_generate_share_link, can_generate_share_link: app.pageOptions.can_generate_share_link,
can_generate_upload_link: app.pageOptions.can_generate_upload_link, can_generate_upload_link: app.pageOptions.can_generate_upload_link,
is_pro: app.pageOptions.is_pro, is_pro: app.pageOptions.is_pro,
@@ -256,8 +263,12 @@ define([
var options = { var options = {
'obj_name': this.model.get('obj_name'), 'obj_name': this.model.get('obj_name'),
'dir_path': this.dir.path, 'dir_path': this.dir.path,
'repo_id': this.dir.repo_id 'repo_id': this.dir.repo_id,
'is_group_owned_repo': this.dir.user_can_set_folder_perm ? true : false
}; };
if (options.is_group_owned_repo) {
options.group_id = this.dirView.contextOptions.group_id;
}
new FolderPermView(options); new FolderPermView(options);
return false; return false;
}, },

View File

@@ -46,6 +46,12 @@ define([
template = $(window).width() < 768 ? this.fileMobileTemplate : this.fileTemplate; template = $(window).width() < 768 ? this.fileMobileTemplate : this.fileTemplate;
} }
var can_set_folder_perm = false;
if (app.pageOptions.folder_perm_enabled && !dir.is_virtual &&
((dir.is_repo_owner && dir.has_been_shared_out) || dir.user_can_set_folder_perm)) {
can_set_folder_perm = true;
}
this.$el.html(template({ this.$el.html(template({
dirent: this.model.attributes, dirent: this.model.attributes,
dirent_path: dirent_path, dirent_path: dirent_path,
@@ -57,9 +63,9 @@ define([
category: dir.category, category: dir.category,
repo_id: dir.repo_id, repo_id: dir.repo_id,
is_repo_owner: dir.is_repo_owner, is_repo_owner: dir.is_repo_owner,
is_virtual: dir.is_virtual,
repo_encrypted: dir.encrypted, repo_encrypted: dir.encrypted,
has_been_shared_out: dir.has_been_shared_out,
can_set_folder_perm: can_set_folder_perm,
can_generate_share_link: app.pageOptions.can_generate_share_link, can_generate_share_link: app.pageOptions.can_generate_share_link,
can_generate_upload_link: app.pageOptions.can_generate_upload_link, can_generate_upload_link: app.pageOptions.can_generate_upload_link,
@@ -538,8 +544,12 @@ define([
var options = { var options = {
'obj_name': this.model.get('obj_name'), 'obj_name': this.model.get('obj_name'),
'dir_path': this.dir.path, 'dir_path': this.dir.path,
'repo_id': this.dir.repo_id 'repo_id': this.dir.repo_id,
'is_group_owned_repo': this.dir.user_can_set_folder_perm ? true : false
}; };
if (options.is_group_owned_repo) {
options.group_id = this.dirView.contextOptions.group_id;
}
this._hideMenu(); this._hideMenu();
new FolderPermView(options); new FolderPermView(options);
return false; return false;

View File

@@ -19,6 +19,8 @@ define([
this.repo_id = options.repo_id; this.repo_id = options.repo_id;
this.obj_name = options.obj_name; this.obj_name = options.obj_name;
this.dir_path = options.dir_path; this.dir_path = options.dir_path;
this.is_group_owned_repo = options.is_group_owned_repo;
this.group_id = options.group_id;
this.path = Common.pathJoin([this.dir_path, this.obj_name]) this.path = Common.pathJoin([this.dir_path, this.obj_name])
this.render(); this.render();
@@ -68,14 +70,19 @@ define([
// show existing user folder perm items // show existing user folder perm items
Common.ajaxGet({ Common.ajaxGet({
'get_url': Common.getUrl({ 'get_url': Common.getUrl({
name: 'repo_user_folder_perm', name: this.is_group_owned_repo ?
'group-owned-library-user-folder-permission' :
'repo_user_folder_perm',
repo_id: this.repo_id repo_id: this.repo_id
}), }),
'data': {'folder_path': this.path}, 'data': {'folder_path': this.path},
'after_op_success': function (data) { 'after_op_success': function(data) {
$(data).each(function(index, item) { $(data).each(function(index, item) {
var perm_item = new RepoFolderPermItemView({ var perm_item = new RepoFolderPermItemView({
item_data: $.extend(item, {'for_user': true}) item_data: $.extend(item, {
'is_group_owned_repo': _this.is_group_owned_repo,
'for_user': true
})
}); });
_this.$add_user_perm.after(perm_item.el); _this.$add_user_perm.after(perm_item.el);
}); });
@@ -85,14 +92,19 @@ define([
// show existing group folder perm items // show existing group folder perm items
Common.ajaxGet({ Common.ajaxGet({
'get_url': Common.getUrl({ 'get_url': Common.getUrl({
name: 'repo_group_folder_perm', name: this.is_group_owned_repo ?
'group-owned-library-group-folder-permission' :
'repo_group_folder_perm',
repo_id: this.repo_id repo_id: this.repo_id
}), }),
'data': {'folder_path': this.path}, 'data': {'folder_path': this.path},
'after_op_success': function (data) { 'after_op_success': function (data) {
$(data).each(function(index, item) { $(data).each(function(index, item) {
var perm_item = new RepoFolderPermItemView({ var perm_item = new RepoFolderPermItemView({
item_data: $.extend(item, {'for_user': false}) item_data: $.extend(item, {
'is_group_owned_repo': _this.is_group_owned_repo,
'for_user': false
})
}); });
_this.$add_group_perm.after(perm_item.el); _this.$add_group_perm.after(perm_item.el);
}); });
@@ -100,18 +112,50 @@ define([
}); });
// use select2 to 'user' input in 'add user perm' // use select2 to 'user' input in 'add user perm'
$('[name="email"]', this.$add_user_perm).select2(Common.contactInputOptionsForSelect2()); var url;
if (this.is_group_owned_repo) {
url = Common.getUrl({
'name': 'address_book_group_search_members',
'group_id': this.group_id
});
}
$('[name="email"]', this.$add_user_perm).select2(
Common.contactInputOptionsForSelect2({'url': url}));
// use select2 to 'group' input in 'add group perm' // use select2 to 'group' input in 'add group perm'
var groups = app.pageOptions.joined_groups_exclude_address_book || [], var groups;
g_opts = ''; var prepareGroupSelector = function(groups) {
for (var i = 0, len = groups.length; i < len; i++) { var g_opts = '';
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>'; for (var i = 0, len = groups.length; i < len; i++) {
g_opts += '<option value="' + groups[i].id + '" data-index="' + i + '">' + groups[i].name + '</option>';
}
$('[name="group"]', _this.$add_group_perm).html(g_opts).select2({
placeholder: gettext("Select groups"),
escapeMarkup: function(m) { return m; }
});
};
if (this.is_group_owned_repo) {
$.ajax({
url: Common.getUrl({
'name': 'address_book_sub_groups',
'group_id': this.group_id
}),
cache: false,
dataType: 'json',
success: function(data) {
groups = data;
},
error: function(xhr) {
groups = [];
},
complete: function() {
prepareGroupSelector(groups);
}
});
} else {
groups = app.pageOptions.joined_groups_exclude_address_book || [];
prepareGroupSelector(groups);
} }
$('[name="group"]', this.$add_group_perm).html(g_opts).select2({
placeholder: gettext("Select groups"),
escapeMarkup: function(m) { return m; }
});
}, },
events: { events: {
@@ -126,7 +170,12 @@ define([
$form = this.$add_user_perm; $form = this.$add_user_perm;
$error = $('#user-folder-perm .error'); $error = $('#user-folder-perm .error');
url = Common.getUrl({name: 'repo_user_folder_perm', repo_id: this.repo_id}); url = Common.getUrl({
name: this.is_group_owned_repo ?
'group-owned-library-user-folder-permission' :
'repo_user_folder_perm',
repo_id: this.repo_id
});
var emails_group_ids_input = $('[name="email"]', $form), var emails_group_ids_input = $('[name="email"]', $form),
emails = emails_group_ids_input.val(), emails = emails_group_ids_input.val(),
perm = $('[name="permission"]', $form).val(); perm = $('[name="permission"]', $form).val();
@@ -141,13 +190,22 @@ define([
'permission': perm 'permission': perm
}; };
extended_data = {'for_user': true}; extended_data = {
'is_group_owned_repo': this.is_group_owned_repo,
'for_user': true
};
} else { } else {
$form = this.$add_group_perm; $form = this.$add_group_perm;
$error = $('#group-folder-perm .error'); $error = $('#group-folder-perm .error');
url = Common.getUrl({name: 'repo_group_folder_perm', repo_id: this.repo_id}); url = Common.getUrl({
name: this.is_group_owned_repo ?
'group-owned-library-group-folder-permission' :
'repo_group_folder_perm',
repo_id: this.repo_id
});
var emails_group_ids_input = $('[name="group"]', $form), var emails_group_ids_input = $('[name="group"]', $form),
group_ids = emails_group_ids_input.val().join(','), group_ids = emails_group_ids_input.val().join(','),
perm = $('[name="permission"]', $form).val(); perm = $('[name="permission"]', $form).val();
@@ -162,7 +220,10 @@ define([
'permission': perm 'permission': perm
}; };
extended_data = {'for_user': false}; extended_data = {
'is_group_owned_repo': this.is_group_owned_repo,
'for_user': false
};
} }
var $submit_btn = $form.children('[type="submit"]'); var $submit_btn = $form.children('[type="submit"]');

View File

@@ -64,9 +64,19 @@ define([
} else { } else {
$.extend(data, {'group_id': this.data.group_id}); $.extend(data, {'group_id': this.data.group_id});
} }
var url_name;
if (this.data.is_group_owned_repo) {
url_name = for_user ?
'group-owned-library-user-folder-permission' :
'group-owned-library-group-folder-permission';
} else {
url_name = for_user ?
'repo_user_folder_perm' :
'repo_group_folder_perm';
}
$.ajax({ $.ajax({
url: Common.getUrl({ url: Common.getUrl({
name: for_user ? 'repo_user_folder_perm' : 'repo_group_folder_perm', name: url_name,
repo_id: this.data.repo_id repo_id: this.data.repo_id
}), }),
type: 'PUT', type: 'PUT',
@@ -106,9 +116,19 @@ define([
} else { } else {
$.extend(data, {'group_id': this.data.group_id}); $.extend(data, {'group_id': this.data.group_id});
} }
var url_name;
if (this.data.is_group_owned_repo) {
url_name = for_user ?
'group-owned-library-user-folder-permission' :
'group-owned-library-group-folder-permission';
} else {
url_name = for_user ?
'repo_user_folder_perm' :
'repo_group_folder_perm';
}
$.ajax({ $.ajax({
url: Common.getUrl({ url: Common.getUrl({
name: for_user ? 'repo_user_folder_perm' : 'repo_group_folder_perm', name: url_name,
repo_id: this.data.repo_id repo_id: this.data.repo_id
}), }),
type: 'DELETE', type: 'DELETE',

View File

@@ -125,6 +125,9 @@ define([
case 'repo_labels': return siteRoot + 'api/v2.1/revision-tags/tagged-items/'; case 'repo_labels': return siteRoot + 'api/v2.1/revision-tags/tagged-items/';
case 'user_repo_labels': return siteRoot + 'api/v2.1/revision-tags/tag-names/'; case 'user_repo_labels': return siteRoot + 'api/v2.1/revision-tags/tag-names/';
case 'group-owned-library-user-folder-permission': return siteRoot + 'api/v2.1/group-owned-libraries/' + options.repo_id + '/user-folder-permission/';
case 'group-owned-library-group-folder-permission': return siteRoot + 'api/v2.1/group-owned-libraries/' + options.repo_id + '/group-folder-permission/';
// Share admin // Share admin
case 'share_admin_repos': return siteRoot + 'api/v2.1/shared-repos/'; case 'share_admin_repos': return siteRoot + 'api/v2.1/shared-repos/';
case 'share_admin_repo': return siteRoot + 'api/v2.1/shared-repos/' + options.repo_id + '/'; case 'share_admin_repo': return siteRoot + 'api/v2.1/shared-repos/' + options.repo_id + '/';
@@ -150,6 +153,8 @@ define([
case 'group_repos': return siteRoot + 'api2/groups/' + options.group_id + '/repos/'; case 'group_repos': return siteRoot + 'api2/groups/' + options.group_id + '/repos/';
case 'group_owned_repos': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/group-owned-libraries/'; case 'group_owned_repos': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/group-owned-libraries/';
case 'group_owned_repo': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/group-owned-libraries/' + options.repo_id + '/'; case 'group_owned_repo': return siteRoot + 'api/v2.1/groups/' + options.group_id + '/group-owned-libraries/' + options.repo_id + '/';
case 'address_book_sub_groups': return siteRoot + 'api/v2.1/address-book/groups/' + options.group_id + '/sub-groups/';
case 'address_book_group_search_members': return siteRoot + 'api/v2.1/address-book/groups/' + options.group_id + '/search-member/';
case 'group_discussions': return siteRoot + 'api2/groups/' + options.group_id + '/discussions/'; case 'group_discussions': return siteRoot + 'api2/groups/' + options.group_id + '/discussions/';
case 'group_discussion': return siteRoot + 'api2/groups/' + options.group_id + '/discussions/' + options.discussion_id + '/'; case 'group_discussion': return siteRoot + 'api2/groups/' + options.group_id + '/discussions/' + options.discussion_id + '/';
@@ -630,8 +635,16 @@ define([
} }
}, },
contactInputOptionsForSelect2: function() { contactInputOptionsForSelect2: function(options) {
var _this = this; var _this = this;
var url;
if (options && options.url) {
url = options.url;
} else {
url = _this.getUrl({name: 'search_user'});
}
return { return {
placeholder: gettext("Search users or enter emails and press Enter"), placeholder: gettext("Search users or enter emails and press Enter"),
@@ -647,7 +660,7 @@ define([
formatAjaxError: gettext("Loading failed"), formatAjaxError: gettext("Loading failed"),
ajax: { ajax: {
url: _this.getUrl({name: 'search_user'}), url: url,
dataType: 'json', dataType: 'json',
delay: 250, delay: 250,
cache: true, cache: true,
@@ -657,7 +670,7 @@ define([
}; };
}, },
results: function(data) { results: function(data) {
var user_list = [], users = data['users']; var user_list = [], users = data['users'] || data;
for (var i = 0, len = users.length; i < len; i++) { for (var i = 0, len = users.length; i < len; i++) {
user_list.push({ // 'id' & 'text' are required by the plugin user_list.push({ // 'id' & 'text' are required by the plugin

View File

@@ -191,10 +191,8 @@ define([
success: function(data) { success: function(data) {
if (data.success.length > 0) { if (data.success.length > 0) {
_this.memberCollection.add(data.success, {prepend: true}); _this.memberCollection.add(data.success, {prepend: true});
if (_this.memberCollection.length == 1) { _this.$membersEmptyTip.hide();
_this.$membersEmptyTip.hide(); _this.$membersTable.show();
_this.$membersTable.show();
}
} }
var err_str = ''; var err_str = '';