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:
parent
97ce3e6b72
commit
c063832d0d
|
@ -64,6 +64,10 @@
|
||||||
pageName = "UIxAclEditor";
|
pageName = "UIxAclEditor";
|
||||||
actionName = "acls";
|
actionName = "acls";
|
||||||
};
|
};
|
||||||
|
aclsTemplate = {
|
||||||
|
protectedBy = "ReadAcls";
|
||||||
|
pageName = "UIxAclEditor";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
SOGoParentFolder = {
|
SOGoParentFolder = {
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue