Move ACL editor into a separate template

The user rights remain dynamic, based on the object type (addressbook vs
mailbox vs calendar).
This commit is contained in:
Francis Lachapelle 2014-11-03 15:58:54 -05:00
parent 97ce3e6b72
commit c063832d0d
5 changed files with 122 additions and 151 deletions

View file

@ -64,6 +64,10 @@
pageName = "UIxAclEditor"; pageName = "UIxAclEditor";
actionName = "acls"; actionName = "acls";
}; };
aclsTemplate = {
protectedBy = "ReadAcls";
pageName = "UIxAclEditor";
};
}; };
}; };
SOGoParentFolder = { SOGoParentFolder = {

View file

@ -65,107 +65,47 @@
<div data-ui-view="addressbooks"><!-- addressbooks list --></div> <div data-ui-view="addressbooks"><!-- addressbooks list --></div>
<!-- modal for addressbook sharing options --> <!-- modal for addressbook sharing options -->
<script type="text/ng-template" id="addressbookSharing.html"> <script type="text/ng-template" id="userRights.html">
<div id="modalACL"> <div class="addressbookUserRights">
<h2><var:string label:value="Access Rights"/> - <em>{{addressbook.name}}</em></h2>
<ul> <ul>
<!-- left side -->
<li> <li>
<ul class="aclUsers"> <label>
<li data-ng-repeat="user in users | orderBy:['userClass', 'displayName']" <input type="checkbox"
data-ng-click="selectUser(user)" data-ng-checked="selectedUser.rights.canViewObjects"
data-ng-class="{_selected: user==selectedUser}"> data-ng-model="selectedUser.rights.canViewObjects"
<span class="card-picture" data-ng-switch="user.userClass"> data-ng-change="confirmChange(selectedUser)" />
<i data-ng-switch-when="normal-user" class="icon-ion-ios7-person"><!-- normal-user --></i> <var:string label:value="This person can read the cards of this addressbook."/>
<i data-ng-switch-when="public-user" class="icon-ion-ios7-people"><!-- public-user --></i> </label>
</span>
<span class="name">{{user.$shortFormat()}}</span>
<span class="subscriptionArea"
data-ng-hide="user.$isSpecial()">
<label>
<input type="checkbox"
data-ng-model="user.isSubscribed"
data-ng-checked="user.isSubscribed"
data-ng-disabled="user.wasSubscribed" />
<span><var:string label:value="Subscribe User"/></span>
</label>
</span>
</li>
</ul>
<form class="addContactsToolbar"
data-ng-submit="addUser(userToAdd)">
<table id="bottomTable">
<tr>
<td id="td_1"><i class="icon-ion-search"><!-- search --></i>
<input type="search" class="form-control" label:placeholder="email address"
data-ng-model="userToAdd"
data-typeahead-editable="false"
data-typeahead-wait-ms="500"
data-typeahead="user as user.$shortFormat() for user in userFilter($viewValue)"/>
</td>
<td id="td_2">
<button type="submit" ><var:string label:value="Add User" /></button>
<button type="button"
data-ng-disabled="!selectedUser || selectedUser.$isSpecial()"
data-ng-click="removeUser(selectedUser)"><var:string label:value="Remove User"/></button>
</td>
</tr>
</table>
</form>
</li> </li>
<!-- right side --> <li data-ng-hide="selectedUser.$isAnonymous()">
<li id="AccessRightList" data-ng-show="selectedUser"> <label>
<div class="title"> <input type="checkbox"
{{selectedUser.$shortFormat()}} data-ng-checked="selectedUser.rights.canCreateObjects"
</div> data-ng-model="selectedUser.rights.canCreateObjects"
<div class="calendarUserRights"> data-ng-change="confirmChange(selectedUser)" />
<ul> <var:string label:value="This person can add cards to this addressbook."/>
<li> </label>
<label> </li>
<input type="checkbox" <li data-ng-hide="selectedUser.$isAnonymous()">
data-ng-checked="selectedUser.rights.canViewObjects" <label>
data-ng-model="selectedUser.rights.canViewObjects" <input type="checkbox"
data-ng-change="confirmChange(selectedUser)" /> data-ng-checked="selectedUser.rights.canEditObjects"
<var:string label:value="This person can read the cards of this addressbook."/> data-ng-model="selectedUser.rights.canEditObjects"
</label> data-ng-change="confirmChange(selectedUser)" />
</li> <var:string label:value="This person can edit the cards of this addressbook."/>
<li data-ng-hide="selectedUser.$isAnonymous()"> </label>
<label> </li>
<input type="checkbox" <li data-ng-hide="selectedUser.$isAnonymous()">
data-ng-checked="selectedUser.rights.canCreateObjects" <label>
data-ng-model="selectedUser.rights.canCreateObjects" <input type="checkbox"
data-ng-change="confirmChange(selectedUser)" /> data-ng-checked="selectedUser.rights.canEraseObjects"
<var:string label:value="This person can add cards to this addressbook."/> data-ng-model="selectedUser.rights.canEraseObjects"
</label> data-ng-change="confirmChange(selectedUser)" />
</li> <var:string label:value="This person can erase cards from this addressbook."/>
<li data-ng-hide="selectedUser.$isAnonymous()"> </label>
<label>
<input type="checkbox"
data-ng-checked="selectedUser.rights.canEditObjects"
data-ng-model="selectedUser.rights.canEditObjects"
data-ng-change="confirmChange(selectedUser)" />
<var:string label:value="This person can edit the cards of this addressbook."/>
</label>
</li>
<li data-ng-hide="selectedUser.$isAnonymous()">
<label>
<input type="checkbox"
data-ng-checked="selectedUser.rights.canEraseObjects"
data-ng-model="selectedUser.rights.canEraseObjects"
data-ng-change="confirmChange(selectedUser)" />
<var:string label:value="This person can erase cards from this addressbook."/>
</label>
</li>
</ul>
</div>
</li> </li>
</ul> </ul>
</div> </div>
<div id="aclButtons">
<button data-ng-click="closeModal()"><var:string label:value="Close"/></button>
<button data-ng-click="saveModal()"><var:string label:value="Save"/></button>
</div>
<span class="close-reveal-modal" data-ng-click="closeModal()"><i class="icon-close"><!-- close --></i></span>
</script> </script>
<script type="text/ng-template" id="addressbooks.html"> <script type="text/ng-template" id="addressbooks.html">
@ -179,7 +119,7 @@
<li data-ng-hide="addressbook.isRemote"> <li data-ng-hide="addressbook.isRemote">
<span class="button" data-ng-click="edit()"><i class="icon-pencil"><!-- rename --></i></span> <span class="button" data-ng-click="edit()"><i class="icon-pencil"><!-- rename --></i></span>
</li> </li>
<li data-ng-hide="addressbook.isRemote"> <li data-ng-show="addressbook.isOwned">
<span class="button" data-ng-click="share()"><i class="icon-share"><!-- share --></i></span> <span class="button" data-ng-click="share()"><i class="icon-share"><!-- share --></i></span>
</li> </li>
<li data-ng-hide="addressbook.isRemote"> <li data-ng-hide="addressbook.isRemote">

View file

@ -1,57 +1,74 @@
<?xml version="1.0" standalone="yes"?> <?xml version="1.0" standalone="yes"?>
<!DOCTYPE var:component> <!DOCTYPE var:component>
<var:component xmlns="http://www.w3.org/1999/xhtml" <var:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding" xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant" xmlns:const="http://www.skyrix.com/od/constant"
xmlns:uix="OGo:uix" xmlns:uix="OGo:uix"
xmlns:label="OGo:label" xmlns:label="OGo:label"
xmlns:rsrc="OGo:url" xmlns:rsrc="OGo:url"
className="UIxPageFrame" className="UIxPageFrame"
title="title" title="title"
const:toolbar="none" const:toolbar="none"
const:popup="YES"> const:popup="YES">
<script type="text/javascript"> <div id="modalACL">
var canSubscribeUsers = <var:if condition="canSubscribeUsers" <h2><var:string label:value="Access Rights"/> - <em>{{addressbook.name}}</em></h2>
>true</var:if><var:if condition="canSubscribeUsers" <ul>
const:negate="YES" <!-- left side -->
>false</var:if>; <li>
var isPublicAccessEnabled = <var:if condition="isPublicAccessEnabled" <ul class="aclUsers">
>true</var:if><var:if condition="isPublicAccessEnabled" <li data-ng-repeat="user in users | orderBy:['userClass', 'displayName']"
const:negate="YES" data-ng-click="selectUser(user)"
>false</var:if>; data-ng-class="{_selected: user==selectedUser}">
</script> <span class="card-picture" data-ng-switch="user.userClass">
<i data-ng-switch-when="normal-user" class="icon-ion-ios7-person"><!-- normal-user --></i>
<form id="aclForm" const:href="saveAcls"> <i data-ng-switch-when="public-user" class="icon-ion-ios7-people"><!-- public-user --></i>
<div class="acls"> </span>
<div id="userSelectorHeader"> <span class="name">{{user.$shortFormat()}}</span>
<input type="hidden" name="defaultUserID" id="defaultUserID" <span class="subscriptionArea"
var:value="defaultUserID"/> data-ng-hide="user.$isSpecial()">
<input type="hidden" name="action" value="saveAcls"/> <label>
<input type="hidden" name="folderID" id="folderID" var:value="folderID"/> <input type="checkbox"
</div> data-ng-model="user.isSubscribed"
<div class="userSelector" id="userRoles"> data-ng-checked="user.isSubscribed"
<div id="userSelectorButtons"> data-ng-disabled="user.wasSubscribed" />
<a href="#" id="aclAddUser" class="smallToolbarButton"><span> <span><var:string label:value="Subscribe User"/></span>
<img rsrc:src="add-contact.gif" label:title="Add..." /></span></a> </label>
<a href="#" id="aclDeleteUser" class="smallToolbarButton"><span> </span>
<img rsrc:src="remove-contact.gif" label:title="Remove" /></span></a> </li>
</ul>
<form class="addContactsToolbar"
data-ng-submit="addUser(userToAdd)">
<table id="bottomTable">
<tr>
<td id="td_1"><i class="icon-ion-search"><!-- search --></i>
<input type="search" class="form-control" label:placeholder="email address"
data-ng-model="userToAdd"
data-typeahead-editable="false"
data-typeahead-wait-ms="500"
data-typeahead="user as user.$shortFormat() for user in userFilter($viewValue)"/>
</td>
<td id="td_2">
<button type="submit" ><var:string label:value="Add User" /></button>
<button type="button"
data-ng-disabled="!selectedUser || selectedUser.$isSpecial()"
data-ng-click="removeUser(selectedUser)"><var:string label:value="Remove User"/></button>
</td>
</tr>
</table>
</form>
</li>
<!-- right side -->
<li id="AccessRightList" data-ng-show="selectedUser">
<div class="title">
{{selectedUser.$shortFormat()}}
</div> </div>
<ul id="userList"> <div data-ng-include="'userRights.html'"><!-- load template from main wox --></div>
<var:foreach list="usersForObject" item="currentUser" </li>
><li var:id="currentUser.stringByEscapingHTMLString" var:class="currentUserClass"> </ul>
<span class="userFullName" </div>
><var:string value="currentUserDisplayName" <div id="aclButtons">
/></span> <button data-ng-click="closeModal()"><var:string label:value="Close"/></button>
<var:if condition="canSubscribeUsers" <button data-ng-click="saveModal()"><var:string label:value="Save"/></button>
><label class="subscriptionArea"><input type="checkbox" </div>
var:checked="currentUserIsSubscribed" <span class="close-reveal-modal" data-ng-click="closeModal()"><i class="icon-close"><!-- close --></i></span>
var:disabled="currentUserIsSubscribed"
/><var:string label:value="Subscribe User"/></label
></var:if
></li>
</var:foreach>
</ul>
</div>
</div>
</form>
</var:component> </var:component>

View file

@ -38,7 +38,8 @@
$timeout: $timeout, $timeout: $timeout,
$$resource: new Resource(Settings.baseURL), $$resource: new Resource(Settings.baseURL),
$Card: Card, $Card: Card,
$$Acl: Acl $$Acl: Acl,
activeUser: Settings.activeUser
}); });
return AddressBook; // return constructor return AddressBook; // return constructor
@ -77,6 +78,9 @@
// Instanciate AddressBook objects // Instanciate AddressBook objects
angular.forEach(this.$addressbooks, function(o, i) { angular.forEach(this.$addressbooks, function(o, i) {
_this.$addressbooks[i] = new AddressBook(o); _this.$addressbooks[i] = new AddressBook(o);
// Add 'isOwned' attribute based on active user (TODO: add it server-side?)
_this.$addressbooks[i].isOwned = _this.activeUser.isSuperUser
|| _this.$addressbooks[i].owner == _this.activeUser.login;
}); });
} }
return this.$addressbooks; return this.$addressbooks;

View file

@ -9,7 +9,13 @@
angular.module('SOGo.ContactsUI', ['ngSanitize', 'ui.router', 'mm.foundation', 'SOGo.Common', 'SOGo.UIDesktop']) angular.module('SOGo.ContactsUI', ['ngSanitize', 'ui.router', 'mm.foundation', 'SOGo.Common', 'SOGo.UIDesktop'])
.constant('sgSettings', { .constant('sgSettings', {
baseURL: ApplicationBaseURL baseURL: ApplicationBaseURL,
activeUser: {
login: UserLogin,
language: UserLanguage,
folderURL: UserFolderURL,
isSuperUser: IsSuperUser
}
}) })
.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
@ -181,7 +187,7 @@
}; };
$scope.share = function() { $scope.share = function() {
var modal = $modal.open({ var modal = $modal.open({
templateUrl: 'addressbookSharing.html', templateUrl: stateAddressbook.id + '/aclsTemplate',
resolve: { resolve: {
modalUsers: function() { modalUsers: function() {
return stateAddressbook.$acl.$users(); return stateAddressbook.$acl.$users();