From 9b4e4d0460a644a7e7734f193d7375bddf300960 Mon Sep 17 00:00:00 2001 From: llj Date: Sun, 7 Feb 2016 17:29:49 +0800 Subject: [PATCH] [lib setting] add 'folder perm' --- media/css/seahub.css | 3 +- seahub/templates/js/templates.html | 121 ++++++++++++++- seahub/utils/__init__.py | 1 + .../app/collections/repo-group-folder-perm.js | 23 +++ .../app/collections/repo-user-folder-perm.js | 23 +++ .../views/dialogs/repo-folder-perm-admin.js | 122 +++++++++++++++ .../views/dialogs/repo-history-settings.js | 2 +- static/scripts/app/views/repo-folder-perm.js | 142 ++++++++++++++++++ static/scripts/app/views/repo.js | 22 ++- static/scripts/common.js | 4 +- 10 files changed, 450 insertions(+), 13 deletions(-) create mode 100644 static/scripts/app/collections/repo-group-folder-perm.js create mode 100644 static/scripts/app/collections/repo-user-folder-perm.js create mode 100644 static/scripts/app/views/dialogs/repo-folder-perm-admin.js create mode 100644 static/scripts/app/views/repo-folder-perm.js diff --git a/media/css/seahub.css b/media/css/seahub.css index dc6a2a43c5..3afbc80b6c 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -3479,7 +3479,8 @@ textarea:-moz-placeholder {/* for FF */ /* user & group folder perm */ #share-popup .tabs-panel, #folder-perm-tabs .tabs-panel, -#repo-shared-links .tabs-panel { +#repo-shared-links .tabs-panel, +#repo-folder-perm .tabs-panel { width:550px; max-height:250px; overflow:auto; diff --git a/seahub/templates/js/templates.html b/seahub/templates/js/templates.html index 294f9bd4a0..6c6b802ea2 100644 --- a/seahub/templates/js/templates.html +++ b/seahub/templates/js/templates.html @@ -49,8 +49,11 @@ @@ -1107,10 +1110,6 @@

- - + + + + diff --git a/seahub/utils/__init__.py b/seahub/utils/__init__.py index f110fbdf65..d8238f195e 100644 --- a/seahub/utils/__init__.py +++ b/seahub/utils/__init__.py @@ -1261,6 +1261,7 @@ def do_urlopen(url, data=None, headers=None): return ret def is_pro_version(): + return True if EVENTS_CONFIG_FILE: return True else: diff --git a/static/scripts/app/collections/repo-group-folder-perm.js b/static/scripts/app/collections/repo-group-folder-perm.js new file mode 100644 index 0000000000..e606c5aed4 --- /dev/null +++ b/static/scripts/app/collections/repo-group-folder-perm.js @@ -0,0 +1,23 @@ +define([ + 'underscore', + 'backbone', + 'common' +], function(_, Backbone, Common) { + 'use strict'; + + var Collection = Backbone.Collection.extend({ + + initialize: function(options) { + this.repo_id = options.repo_id; + }, + + url: function() { + return Common.getUrl({ + name: 'repo_group_folder_perm', + repo_id: this.repo_id + }); + } + }); + + return Collection; +}); diff --git a/static/scripts/app/collections/repo-user-folder-perm.js b/static/scripts/app/collections/repo-user-folder-perm.js new file mode 100644 index 0000000000..389dc69606 --- /dev/null +++ b/static/scripts/app/collections/repo-user-folder-perm.js @@ -0,0 +1,23 @@ +define([ + 'underscore', + 'backbone', + 'common' +], function(_, Backbone, Common) { + 'use strict'; + + var Collection = Backbone.Collection.extend({ + + initialize: function(options) { + this.repo_id = options.repo_id; + }, + + url: function() { + return Common.getUrl({ + name: 'repo_user_folder_perm', + repo_id: this.repo_id + }); + } + }); + + return Collection; +}); diff --git a/static/scripts/app/views/dialogs/repo-folder-perm-admin.js b/static/scripts/app/views/dialogs/repo-folder-perm-admin.js new file mode 100644 index 0000000000..b189b8e2be --- /dev/null +++ b/static/scripts/app/views/dialogs/repo-folder-perm-admin.js @@ -0,0 +1,122 @@ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'app/collections/repo-user-folder-perm', + 'app/collections/repo-group-folder-perm', + 'app/views/repo-folder-perm' +], function($, _, Backbone, Common, UserFolderPerm, GroupFolderPerm, ItemView) { + 'use strict'; + + var View = Backbone.View.extend({ + + template: _.template($('#repo-folder-perm-admin-dialog-tmpl').html()), + + initialize: function(options) { + this.repo_name = options.repo_name; + this.repo_id = options.repo_id; + + this.render(); + this.$('.op-target').css({'max-width':280}); // for long repo name + this.$el.modal({ + focus: false + }); + $("#simplemodal-container").css({ + 'width':'auto', + 'height':'auto' + }); + this.$('.js-tabs').tabs(); + + var userPerm = new UserFolderPerm({repo_id: this.repo_id}); + userPerm.perm_type = 'user'; + this.$userPermPanel = this.$('#js-repo-user-folder-perm'); + + var groupPerm = new GroupFolderPerm({repo_id: this.repo_id}); + groupPerm.perm_type = 'group'; + this.$groupPermPanel = this.$('#js-repo-group-folder-perm'); + + this.renderPanel({ + collection: userPerm, + $panel: this.$userPermPanel + }); + this.renderPanel({ + collection: groupPerm, + $panel: this.$groupPermPanel + }); + }, + + render: function() { + this.$el.html(this.template({ + title: gettext("{placeholder} Folder Permission") + .replace('{placeholder}', + '' + + Common.HTMLescape(this.repo_name) + '') + })); + + return this; + }, + + renderPanel: function(options) { + var collection = options.collection; + var $panel = options.$panel; + var $loadingTip = $('.loading-tip', $panel); + var $error = $('.error', $panel); + + if (collection.perm_type == 'user') { + $('[name="emails"]', $panel).select2($.extend({ + width: '160px' + },Common.contactInputOptionsForSelect2())); + } else { + var groups = app.pageOptions.groups || []; + var g_opts = ''; + for (var i = 0, len = groups.length; i < len; i++) { + g_opts += ''; + } + $('[name="groups"]', $panel).html(g_opts).select2({ + placeholder: gettext("Select groups"), + width: '160px', + escapeMarkup: function(m) { return m; } + }); + } + + // show existing items + this.listenTo(collection, 'add', this.addItem); + collection.fetch({ + cache: false, + success: function(collection, response, opts) { + $loadingTip.hide(); + }, + error: function(collection, response, opts) { + $loadingTip.hide(); + if (response.responseText) { + if (response['status'] == 401 || response['status'] == 403) { + err_msg = gettext("Permission error"); + } else { + err_msg = $.parseJSON(response.responseText).error_msg; + } + } else { + err_msg = gettext('Please check the network.'); + } + $error.html(err_msg).show(); + } + }); + }, + + addItem: function(model, collection, options) { + var perm_type = collection.perm_type; + var $panel = perm_type == 'user' ? this.$userPermPanel : this.$groupPermPanel; + var view = new ItemView({ + model: model, + repo_id: this.repo_id, + perm_type: perm_type, + $error: $('.error', $panel) + }); + $('tbody', $panel).append(view.render().el); + } + + }); + + return View; +}); diff --git a/static/scripts/app/views/dialogs/repo-history-settings.js b/static/scripts/app/views/dialogs/repo-history-settings.js index bd322e3184..4cee6211d2 100644 --- a/static/scripts/app/views/dialogs/repo-history-settings.js +++ b/static/scripts/app/views/dialogs/repo-history-settings.js @@ -32,7 +32,7 @@ define([ render: function() { var repo_name = this.repo_name; this.$el.html(this.template({ - title: gettext("{placeholder} History Settings") + title: gettext("{placeholder} History Setting") .replace('{placeholder}', '' diff --git a/static/scripts/app/views/repo-folder-perm.js b/static/scripts/app/views/repo-folder-perm.js new file mode 100644 index 0000000000..bd3a3fb1a2 --- /dev/null +++ b/static/scripts/app/views/repo-folder-perm.js @@ -0,0 +1,142 @@ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common' +], function($, _, Backbone, Common) { + 'use strict'; + + var View = Backbone.View.extend({ + tagName: 'tr', + + template: _.template($('#repo-folder-perm-item-tmpl').html()), + + events: { + 'mouseenter': 'highlight', + 'mouseleave': 'rmHighlight', + 'click .edit-icon': 'showEdit', + 'change .perm-toggle-select': 'edit', + 'click .remove': 'remove' + }, + + initialize: function(options) { + this.data = {}; + $.extend(this.data, options); + + this.listenTo(this.model, 'change', this.render); + }, + + render: function() { + var obj = {}; + + $.extend(obj, this.model.attributes, { + 'perm_type': this.data.perm_type, + 'repo_id': this.data.repo_id, + 'encoded_path': Common.encodePath(this.model.get('folder_path')) + }); + + this.$el.html(this.template(obj)); + return this; + }, + + highlight: function() { + this.$el.addClass('hl').find('.op-icon').removeClass('vh'); + }, + + rmHighlight: function() { + this.$el.removeClass('hl').find('.op-icon').addClass('vh'); + }, + + showEdit: function(e) { + var $td = $(e.currentTarget).closest('td'); + $('.cur-perm, .edit-icon', $td).hide(); + $('.perm-toggle-select', $td).show(); + }, + + edit: function(e) { + var url = Common.getUrl({ + name: this.data.perm_type == 'user' ? 'repo_user_folder_perm' : 'repo_group_folder_perm', + repo_id: this.data.repo_id + }); + + var new_perm = $(e.currentTarget).val(); + var post_data = { + 'folder_path': this.model.get('folder_path'), + 'permission': new_perm + }; + if (this.data.perm_type == 'user') { + $.extend(post_data, { + 'user_email': this.model.get('user_email') + }); + } else { + $.extend(post_data, { + 'group_id': this.model.get('group_id') + }); + } + + var _this = this; + $.ajax({ + url: url, + type: 'put', + dataType: 'json', + beforeSend: Common.prepareCSRFToken, + data: post_data, + success: function() { + _this.model.set({'permission': new_perm}); + }, + error: function(xhr) { + var err_msg; + if (xhr.responseText) { + err_msg = $.parseJSON(response.responseText).error_msg; + } else { + err_msg = gettext('Please check the network.'); + } + _this.data.$error.html(err_msg).show(); + } + }); + }, + + remove: function() { + var url = Common.getUrl({ + name: this.data.perm_type == 'user' ? 'repo_user_folder_perm' : 'repo_group_folder_perm', + repo_id: this.data.repo_id + }); + var post_data = { + 'folder_path': this.model.get('folder_path') + }; + if (this.data.perm_type == 'user') { + $.extend(post_data, { + 'user_email': this.model.get('user_email') + }); + } else { + $.extend(post_data, { + 'group_id': this.model.get('group_id') + }); + } + + var _this = this; + $.ajax({ + url: url, + type: 'delete', + dataType: 'json', + beforeSend: Common.prepareCSRFToken, + data: post_data, + success: function() { + _this.remove(); + }, + error: function(xhr) { + var err_msg; + if (xhr.responseText) { + err_msg = $.parseJSON(response.responseText).error_msg; + } else { + err_msg = gettext('Please check the network.'); + } + _this.data.$error.html(err_msg).show(); + } + }); + } + + }); + + return View; +}); diff --git a/static/scripts/app/views/repo.js b/static/scripts/app/views/repo.js index c0e835cfc2..7f85e831ad 100644 --- a/static/scripts/app/views/repo.js +++ b/static/scripts/app/views/repo.js @@ -5,9 +5,10 @@ define([ 'common', 'app/views/share', 'app/views/dialogs/repo-history-settings', - 'app/views/dialogs/repo-share-link-admin' + 'app/views/dialogs/repo-share-link-admin', + 'app/views/dialogs/repo-folder-perm-admin' ], function($, _, Backbone, Common, ShareView, HistorySettingsDialog, - RepoShareLinkAdminDialog) { + RepoShareLinkAdminDialog, RepoFolderPermAdminDialog) { 'use strict'; var RepoView = Backbone.View.extend({ @@ -26,8 +27,9 @@ define([ 'click .js-toggle-popup': 'togglePopup', 'click .js-repo-rename': 'rename', 'click .js-repo-transfer': 'transfer', - 'click .js-popup-history-settings': 'popupHistorySettings', - 'click .js-popup-share-link-admin': 'popupShareLinkAdmin' + 'click .js-popup-history-setting': 'popupHistorySetting', + 'click .js-popup-share-link-admin': 'popupShareLinkAdmin', + 'click .js-popup-folder-perm-admin': 'popupFolderPermAdmin' }, initialize: function() { @@ -276,7 +278,7 @@ define([ }); }, - popupHistorySettings: function() { + popupHistorySetting: function() { var options = { 'repo_name': this.model.get('name'), 'repo_id': this.model.get('id') @@ -294,6 +296,16 @@ define([ this.togglePopup(); // close the popup new RepoShareLinkAdminDialog(options); return false; + }, + + popupFolderPermAdmin: function() { + var options = { + 'repo_name': this.model.get('name'), + 'repo_id': this.model.get('id') + }; + this.togglePopup(); // close the popup + new RepoFolderPermAdminDialog(options); + return false; } }); diff --git a/static/scripts/common.js b/static/scripts/common.js index 182a3fff41..8047fed211 100644 --- a/static/scripts/common.js +++ b/static/scripts/common.js @@ -105,7 +105,9 @@ define([ case 'repo_shared_download_link': return siteRoot + 'api2/repos/' + options.repo_id + '/download-shared-links/' + options.token + '/'; case 'repo_shared_upload_links': return siteRoot + 'api2/repos/' + options.repo_id + '/upload-shared-links/'; case 'repo_shared_upload_link': return siteRoot + 'api2/repos/' + options.repo_id + '/upload-shared-links/' + options.token + '/'; - + case 'repo_user_folder_perm': return siteRoot + 'api2/repos/' + options.repo_id + '/user-folder-perm/'; + case 'repo_group_folder_perm': return siteRoot + 'api2/repos/' + options.repo_id + '/group-folder-perm/'; + // Permission 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/';