From 33345ed1f03fff9ff9533e7994dee7f0d2ca0896 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 26 Jun 2015 13:13:25 -0400 Subject: [PATCH] (feat) new mailbox sharing capabilities and mailbox menu --- UI/MailerUI/UIxMailUserRightsEditor.m | 33 ++-- UI/MailerUI/product.plist | 13 +- UI/Templates/MailerUI/UIxMailMainFrame.wox | 88 +++++---- .../MailerUI/UIxMailUserRightsEditor.wox | 171 +++++++++--------- .../js/Mailer/Mailbox.service.js | 7 +- .../js/Mailer/MailboxesController.js | 103 ++++++++++- 6 files changed, 263 insertions(+), 152 deletions(-) diff --git a/UI/MailerUI/UIxMailUserRightsEditor.m b/UI/MailerUI/UIxMailUserRightsEditor.m index 1fc272897..e1ed33c38 100644 --- a/UI/MailerUI/UIxMailUserRightsEditor.m +++ b/UI/MailerUI/UIxMailUserRightsEditor.m @@ -33,11 +33,10 @@ - (BOOL) conformsToRFC4314 { - SOGoMailAccount *mailAccount; + if ([[self clientObject] respondsToSelector: @selector(mailAccountFolder)]) + return ([[[self clientObject] mailAccountFolder] imapAclStyle] == rfc4314); - mailAccount = [[self clientObject] mailAccountFolder]; - - return ([mailAccount imapAclStyle] == rfc4314); + return NO; } - (void) setUserCanReadMails: (BOOL) userCanReadMails @@ -186,58 +185,54 @@ nil]; } -- (void) updateRights +- (void) updateRights: (NSDictionary *) newRights { - WORequest *request; - - request = [context request]; - - if ([[request formValueForKey: SOGoRole_ObjectViewer] length] > 0) + if ([[newRights objectForKey: @"userCanReadMails"] boolValue]) [self appendRight: SOGoRole_ObjectViewer]; else [self removeRight: SOGoRole_ObjectViewer]; - if ([[request formValueForKey: SOGoMailRole_SeenKeeper] length] > 0) + if ([[newRights objectForKey: @"userCanMarkMailsRead"] boolValue]) [self appendRight: SOGoMailRole_SeenKeeper]; else [self removeRight: SOGoMailRole_SeenKeeper]; - if ([[request formValueForKey: SOGoMailRole_Writer] length] > 0) + if ([[newRights objectForKey: @"userCanWriteMails"] boolValue]) [self appendRight: SOGoMailRole_Writer]; else [self removeRight: SOGoMailRole_Writer]; - if ([[request formValueForKey: SOGoRole_ObjectCreator] length] > 0) + if ([[newRights objectForKey: @"userCanInsertMails"] boolValue]) [self appendRight: SOGoRole_ObjectCreator]; else [self removeRight: SOGoRole_ObjectCreator]; - if ([[request formValueForKey: SOGoMailRole_Poster] length] > 0) + if ([[newRights objectForKey: @"userCanPostMails"] boolValue]) [self appendRight: SOGoMailRole_Poster]; else [self removeRight: SOGoMailRole_Poster]; - if ([[request formValueForKey: SOGoRole_FolderCreator] length] > 0) + if ([[newRights objectForKey: @"userCanCreateSubfolders"] boolValue]) [self appendRight: SOGoRole_FolderCreator]; else [self removeRight: SOGoRole_FolderCreator]; - if ([[request formValueForKey: SOGoRole_FolderEraser] length] > 0) + if ([[newRights objectForKey: @"userCanRemoveFolder"] boolValue]) [self appendRight: SOGoRole_FolderEraser]; else [self removeRight: SOGoRole_FolderEraser]; - if ([[request formValueForKey: SOGoRole_ObjectEraser] length] > 0) + if ([[newRights objectForKey: @"userCanEraseMails"] boolValue]) [self appendRight: SOGoRole_ObjectEraser]; else [self removeRight: SOGoRole_ObjectEraser]; - if ([[request formValueForKey: SOGoMailRole_Expunger] length] > 0) + if ([[newRights objectForKey: @"userCanExpungeFolder"] boolValue]) [self appendRight: SOGoMailRole_Expunger]; else [self removeRight: SOGoMailRole_Expunger]; - if ([[request formValueForKey: SOGoMailRole_Administrator] length] > 0) + if ([[newRights objectForKey: @"userIsAdministrator"] boolValue]) [self appendRight: SOGoMailRole_Administrator]; else [self removeRight: SOGoMailRole_Administrator]; diff --git a/UI/MailerUI/product.plist b/UI/MailerUI/product.plist index 6bbbe5ef4..8cfe30d7d 100644 --- a/UI/MailerUI/product.plist +++ b/UI/MailerUI/product.plist @@ -167,15 +167,20 @@ actionClass = "UIxMailFolderActions"; actionName = "setAsTrashFolder"; }; - userRights = { - protectedBy = "ReadAcls"; - pageName = "UIxMailUserRightsEditor"; - }; unseenCount = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; actionName = "unseenCount"; }; + UIxMailUserRightsEditor = { + protectedBy = "ReadAcls"; + pageName = "UIxMailUserRightsEditor"; + }; + userRights = { + protectedBy = "ReadAcls"; + pageName = "UIxMailUserRightsEditor"; + actionName = "userRights"; + }; saveUserRights = { protectedBy = "Change Permissions"; pageName = "UIxMailUserRightsEditor"; diff --git a/UI/Templates/MailerUI/UIxMailMainFrame.wox b/UI/Templates/MailerUI/UIxMailMainFrame.wox index 8f9cc0472..bd0fc9228 100644 --- a/UI/Templates/MailerUI/UIxMailMainFrame.wox +++ b/UI/Templates/MailerUI/UIxMailMainFrame.wox @@ -231,38 +231,8 @@ + + + diff --git a/UI/Templates/MailerUI/UIxMailUserRightsEditor.wox b/UI/Templates/MailerUI/UIxMailUserRightsEditor.wox index 4fc68945b..85fac28c8 100644 --- a/UI/Templates/MailerUI/UIxMailUserRightsEditor.wox +++ b/UI/Templates/MailerUI/UIxMailUserRightsEditor.wox @@ -6,100 +6,91 @@ xmlns:rsrc="OGo:url" xmlns:label="OGo:label" xmlns:uix="OGo:uix"> -
- -
+ + + + + + + + + diff --git a/UI/WebServerResources/js/Mailer/Mailbox.service.js b/UI/WebServerResources/js/Mailer/Mailbox.service.js index 922691048..a51b3f681 100644 --- a/UI/WebServerResources/js/Mailer/Mailbox.service.js +++ b/UI/WebServerResources/js/Mailer/Mailbox.service.js @@ -24,6 +24,7 @@ this.isEditable = this.$isEditable(); // Make a copy of the data for an eventual reset this.$shadowData = this.$omit(); + this.$acl = new Mailbox.$$Acl('Mail/' + this.id); } } else { @@ -38,13 +39,14 @@ * @desc The factory we'll use to register with Angular * @returns the Mailbox constructor */ - Mailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Message', 'sgMailbox_PRELOAD', function($q, $timeout, $log, Settings, Resource, Message, PRELOAD) { + Mailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Message', 'Acl', 'sgMailbox_PRELOAD', function($q, $timeout, $log, Settings, Resource, Message, Acl, PRELOAD) { angular.extend(Mailbox, { $q: $q, $timeout: $timeout, $log: $log, $$resource: new Resource(Settings.activeUser.folderURL + 'Mail', Settings.activeUser), $Message: Message, + $$Acl: Acl, PRELOAD: PRELOAD }); @@ -489,6 +491,9 @@ _.extend(_this.$messages[i], msg); }); } + // Instanciate Acl object + _this.$acl = new Mailbox.$$Acl('Mail/' + _this.id); + Mailbox.$log.debug('mailbox ' + _this.id + ' ready'); _this.$isLoading = false; deferred.resolve(_this.$messages); diff --git a/UI/WebServerResources/js/Mailer/MailboxesController.js b/UI/WebServerResources/js/Mailer/MailboxesController.js index bba748dfd..897e15c01 100644 --- a/UI/WebServerResources/js/Mailer/MailboxesController.js +++ b/UI/WebServerResources/js/Mailer/MailboxesController.js @@ -6,8 +6,8 @@ /** * @ngInject */ - MailboxesController.$inject = ['$scope', '$rootScope', '$stateParams', '$state', '$timeout', 'sgFocus', 'encodeUriFilter', 'Dialog', 'sgSettings', 'Account', 'Mailbox', 'stateAccounts']; - function MailboxesController($scope, $rootScope, $stateParams, $state, $timeout, focus, encodeUriFilter, Dialog, Settings, Account, Mailbox, stateAccounts) { + MailboxesController.$inject = ['$scope', '$rootScope', '$stateParams', '$state', '$timeout', '$q', '$mdDialog', 'sgFocus', 'encodeUriFilter', 'Dialog', 'sgSettings', 'Account', 'Mailbox', 'User', 'stateAccounts']; + function MailboxesController($scope, $rootScope, $stateParams, $state, $timeout, $q, $mdDialog, focus, encodeUriFilter, Dialog, Settings, Account, Mailbox, User, stateAccounts) { $scope.activeUser = Settings.activeUser; $scope.accounts = stateAccounts; @@ -58,7 +58,106 @@ }); }); }; + $scope.share = function(folder) { + //if (addressbook.id != vm.service.selectedFolder.id) { + // Counter the possibility to click on the "hidden" secondary button + //select(addressbook); + // return; + //} + // Fetch list of ACL users + folder.$acl.$users().then(function() { + // Show ACL editor + $mdDialog.show({ + templateUrl: folder.id + '/UIxAclEditor', // UI/Templates/UIxAclEditor.wox + controller: MailboxACLController, + controllerAs: 'acl', + clickOutsideToClose: true, + escapeToClose: true, + locals: { + usersWithACL: folder.$acl.users, + User: User, + folder: folder, + $q: $q + } + }); + }); + /** + * @ngInject + */ + MailboxACLController.$inject = ['$scope', '$mdDialog', 'usersWithACL', 'User', 'folder', '$q']; + function MailboxACLController($scope, $mdDialog, usersWithACL, User, folder, $q) { + var vm = this; + + vm.users = usersWithACL; // ACL users + vm.folder = folder; + vm.selectedUser = null; + vm.userToAdd = ''; + vm.searchText = ''; + vm.userFilter = userFilter; + vm.closeModal = closeModal; + vm.saveModal = saveModal; + vm.confirmChange = confirmChange; + vm.removeUser = removeUser; + vm.addUser = addUser; + vm.selectUser = selectUser; + + function userFilter($query) { + return User.$filter($query, folder.$acl.users); + } + + function closeModal() { + folder.$acl.$resetUsersRights(); // cancel changes + $mdDialog.hide(); + } + + function saveModal() { + folder.$acl.$saveUsersRights().then(function() { + $mdDialog.hide(); + }, function(data, status) { + Dialog.alert(l('Warning'), l('An error occured please try again.')); + }); + } + + function confirmChange(user) { + var confirmation = user.$confirmRights(); + if (confirmation) { + Dialog.confirm(l('Warning'), confirmation).catch(function() { + user.$resetRights(true); + }); + } + } + + function removeUser(user) { + folder.$acl.$removeUser(user.uid).then(function() { + if (user.uid == vm.selectedUser.uid) { + vm.selectedUser = null; + } + }, function(data, status) { + Dialog.alert(l('Warning'), l('An error occured please try again.')) + }); + } + + function addUser(data) { + if (data) { + folder.$acl.$addUser(data).then(function() { + vm.userToAdd = ''; + vm.searchText = ''; + }, function(error) { + Dialog.alert(l('Warning'), error); + }); + } + } + + function selectUser(user) { + // Check if it is a different user + if (vm.selectedUser != user) { + vm.selectedUser = user; + vm.selectedUser.$rights(); + } + } + } + }; $scope.unselectMessages = function() { _.each($rootScope.mailbox.$messages, function(message) { message.selected = false; }); };