UI/Common/UIxAclEditor.h

Monotone-Parent: e24f6ea1b25c661581e4f801fec1795b9c8fb5f6
Monotone-Revision: 2f2079c5229941fee5868ae444a3ba34b62083a8

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-04-17T13:56:19
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau
2007-04-17 13:56:19 +00:00
parent 1b1d18ede8
commit 46405eb442
3 changed files with 98 additions and 221 deletions

View File

@@ -1,6 +1,6 @@
/* UIxAclEditor.m - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
* Copyright (C) 2006, 2007 Inverse groupe conseil
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@@ -27,7 +27,7 @@
#import <NGObjWeb/WORequest.h>
#import <NGCards/iCalPerson.h>
#import <SoObjects/SOGo/AgenorUserManager.h>
#import <SoObjects/SOGo/SOGoAclsFolder.h>
#import <SoObjects/SOGo/SOGoContentObject.h>
#import <SoObjects/SOGo/SOGoPermissions.h>
#import "UIxAclEditor.h"
@@ -42,10 +42,8 @@
prepared = NO;
publishInFreeBusy = NO;
users = [NSMutableArray new];
delegates = [NSMutableArray new];
assistants = [NSMutableArray new];
ownerLogin = nil;
currentUser = nil;
savedUIDs = nil;
}
return self;
@@ -53,38 +51,20 @@
- (void) dealloc
{
[savedUIDs release];
[users release];
[delegates release];
[assistants release];
[ownerLogin release];
[currentUser release];
[super dealloc];
}
- (NSArray *) aclsForFolder
- (NSArray *) aclsForObject
{
SOGoAclsFolder *folder;
if (!acls)
{
folder = [SOGoAclsFolder aclsFolder];
acls = [folder aclsForObject: [self clientObject]];
}
acls = [[self clientObject] acls];
return acls;
}
- (NSString *) ownerLogin
{
if (!ownerLogin)
{
ownerLogin = [[self clientObject] ownerInContext: context];
[ownerLogin retain];
}
return ownerLogin;
}
- (NSString *) _displayNameForUID: (NSString *) uid
{
AgenorUserManager *um;
@@ -98,44 +78,35 @@
- (NSString *) ownerName
{
return [self _displayNameForUID: [self ownerLogin]];
NSString *ownerLogin;
ownerLogin = [[self clientObject] ownerInContext: context];
return [self _displayNameForUID: ownerLogin];
}
- (void) _prepareUsers
{
NSEnumerator *aclsEnum;
AgenorUserManager *um;
NSDictionary *currentAcl;
NSString *currentUID;
NSString *currentUID, *ownerLogin;
aclsEnum = [[self aclsForFolder] objectEnumerator];
um = [AgenorUserManager sharedUserManager];
ownerLogin = [[self clientObject] ownerInContext: context];
aclsEnum = [[self aclsForObject] objectEnumerator];
currentAcl = [aclsEnum nextObject];
while (currentAcl)
{
currentUID = [currentAcl objectForKey: @"c_uid"];
if ([currentUID isEqualToString: @"freebusy"])
publishInFreeBusy = YES;
else
{
if (![[um getCNForUID: currentUID]
isEqualToString: [self ownerLogin]])
{
if ([[currentAcl objectForKey: @"c_role"]
isEqualToString: SOGoRole_Delegate])
[delegates addObject: currentUID];
else
[assistants addObject: currentUID];
[users addObject: currentUID];
}
}
if (![currentUID isEqualToString: ownerLogin])
[users addObject: currentUID];
currentAcl = [aclsEnum nextObject];
prepared = YES;
}
}
- (NSArray *) usersForFolder
- (NSArray *) usersForObject
{
if (!prepared)
[self _prepareUsers];
@@ -158,84 +129,61 @@
return [self _displayNameForUID: currentUser];
}
- (NSArray *) delegates
{
if (!prepared)
[self _prepareUsers];
return delegates;
}
- (NSString *) assistantsValue
{
if (!prepared)
[self _prepareUsers];
return [assistants componentsJoinedByString: @","];
}
- (NSString *) delegatesValue
{
if (!prepared)
[self _prepareUsers];
return [delegates componentsJoinedByString: @","];
}
- (BOOL) publishInFreeBusy
{
if (!prepared)
[self _prepareUsers];
return publishInFreeBusy;
}
- (NSString *) toolbar
{
NSString *currentLogin;
NSString *currentLogin, *ownerLogin;
currentLogin = [[context activeUser] login];
ownerLogin = [[self clientObject] ownerInContext: context];
return (([[self ownerLogin] isEqualToString: currentLogin])
return (([ownerLogin isEqualToString: currentLogin])
? @"SOGoAclOwner.toolbar" : @"SOGoAclAssistant.toolbar");
}
- (BOOL) clientIsCalendar
- (void) setUserUIDS: (NSString *) retainedUsers
{
return [NSStringFromClass ([[self clientObject] class])
isEqualToString: @"SOGoAppointmentFolder"];
if ([retainedUsers length] > 0)
savedUIDs = [retainedUsers componentsSeparatedByString: @","];
else
savedUIDs = [NSArray new];
}
- (id) saveAclsAction
- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request
inContext: (WOContext *) context
{
NSString *uids;
NSArray *fbUsers;
WORequest *request;
SOGoAclsFolder *folder;
SOGoObject *clientObject;
return ([[request method] isEqualToString: @"POST"]);
}
- (id <WOActionResults>) saveAclsAction
{
NSEnumerator *aclsEnum;
SOGoObject *clientObject;
NSString *currentUID, *ownerLogin;
folder = [SOGoAclsFolder aclsFolder];
request = [context request];
clientObject = [self clientObject];
uids = [request formValueForKey: @"delegates"];
[folder setRoleForObject: clientObject
forUsers: [uids componentsSeparatedByString: @","]
to: SOGoRole_Delegate];
uids = [request formValueForKey: @"assistants"];
[folder setRoleForObject: clientObject
forUsers: [uids componentsSeparatedByString: @","]
to: SOGoRole_Assistant];
if ([self clientIsCalendar]) {
if ([[request formValueForKey: @"freebusy"] intValue])
fbUsers = [NSArray arrayWithObject: @"freebusy"];
else
fbUsers = nil;
[folder setRoleForObject: clientObject
forUsers: fbUsers
to: SOGoRole_FreeBusy];
}
ownerLogin = [clientObject ownerInContext: context];
aclsEnum = [[self aclsForObject] objectEnumerator];
currentUID = [[aclsEnum nextObject] objectForKey: @"c_uid"];
while (currentUID)
{
if ([currentUID isEqualToString: ownerLogin]
|| [savedUIDs containsObject: currentUID])
[users removeObject: currentUID];
currentUID = [[aclsEnum nextObject] objectForKey: @"c_uid"];
}
[clientObject removeAclsForUsers: users];
return [self jsCloseWithRefreshMethod: nil];
}
// - (id <WOActionResults>) addUserInAcls
// {
// SOGoObject *clientObject;
// NSString *uid;
// uid = [self queryParameterForKey: @"uid"];
// clientObject = [self clientObject];
// }
@end

View File

@@ -14,17 +14,11 @@
<form id="aclForm" const:href="saveAcls">
<div class="acls">
<input type="hidden" name="action" value="saveAcls"/>
<input type="hidden" name="delegates" var:value="delegatesValue"
id="delegates"/>
<input type="hidden" name="assistants" var:value="assistantsValue"
id="assistants"/>
<input type="hidden" id="userUIDS" name="userUIDS"
var:value="userUIDS"/>
<label><var:string label:value="Owner:"/><br/>
<span class="value"><strong><var:string value="ownerName"/></strong></span></label><br/>
<!-- var:component className="UIxContactSelector"
const:checkBoxOnChange="return updateAclStatus(this);"
contacts="usersForFolder" -->
<div class="userSelector" id="userRoles">
<span id="userSelectorButtons">
<a href="#"
@@ -36,29 +30,14 @@
label:title="Remove"
/></a>
</span>
<input type="hidden"
var:id="selectorIdList"
var:name="selectorId"
var:value="initialContactsAsString"/>
<ul id="userList" multiselect="yes">
<var:foreach list="usersForFolder" item="currentUser"
<var:foreach list="usersForObject" item="currentUser"
><li var:id="currentUser">
<img rsrc:src="abcard.gif"/>
<var:string value="currentUserDisplayName"/></li>
</var:foreach>
</ul>
</div>
<select id="userRoleDropDown" name="currentUserRole">
<option value="assistant"><var:string label:value="Assistant"/></option>
<option value="delegate"><var:string label:value="Delegate"/></option>
</select><br/>
<var:if condition="clientIsCalendar"
><label id="freeBusyLabel"><input type="checkbox"
var:checked="publishInFreeBusy"
class="checkBox" name="freebusy" id="freebusy"
/><var:string label:value="Localizable/Publish the Free/Busy information"
/></label></var:if>
</div>
</form>
</var:component>

View File

@@ -6,17 +6,17 @@ function addUser(userName, userID) {
if (!$(userID)) {
var ul = $("userList");
ul.appendChild(nodeForUser(userName, userID));
var roleList = $("assistants");
if (roleList.value.length > 0) {
var uids = roleList.value.split(",");
uids.push(userID);
roleList.value = uids.join(",");
}
else
roleList.value = userID;
var url = window.location.href;
var elements = url.split("/");
elements[elements.length-1] = ("addUserInAcls?uid="
+ userID);
triggerAjaxRequest(elements.join("/"), addUserCallback);
}
}
function addUserCallback(http) {
}
function nodeForUser(userName, userId) {
var node = document.createElement("li");
node.setAttribute("id", userId);
@@ -34,64 +34,14 @@ function nodeForUser(userName, userId) {
}
function saveAcls() {
$("aclForm").submit();
var uidList = new Array();
var users = $("userList").childNodesWithTag("li");
for (var i = 0; i < users.length; i++)
uidList.push(users[i].getAttribute("id"));
$("userUIDS").value = uidList.join(",");
$("aclForm").submit();
return false;
}
function updateSelectedRole(list) {
var select = $("userRoleDropDown");
var selection = list.getSelectedRows();
if (selection.length > 0) {
select.style.visibility = "visible;";
var selected = selection[0];
var assistantsValue = $("assistants");
var uid = selected.getAttribute("id");
var regexp = new RegExp("(^|,)" + uid + "(,|$)","i");
if (regexp.test(assistantsValue.value))
select.selectedIndex = 0;
else
select.selectedIndex = 1;
}
else
select.style.visibility = "hidden;";
}
function onAclSelectionChange() {
log("selectionchange");
updateSelectedRole(this);
}
function onUserRoleDropDownChange() {
var oldList;
var newList;
if (this.selectedIndex == 0) {
oldList = $("delegates");
newList = $("assistants");
} else {
oldList = $("assistants");
newList = $("delegates");
}
var uid = $("userList").getSelectedRows()[0].getAttribute("id");
var newListArray;
if (newList.value.length > 0) {
newListArray = newList.value.split(",");
newListArray.push(uid);
}
else
newListArray = new Array(uid);
newList.value = newListArray.join(",");
var oldListArray = oldList.value.split(",").without(uid);
if (oldListArray.length > 0)
oldList.value = oldListArray.join(",");
else
oldList.value = "";
log("assistants: " + $("assistants").value);
log("delegates: " + $("delegates").value);
return false;
}
function onUserAdd(event) {
@@ -101,24 +51,10 @@ function onUserAdd(event) {
}
function onUserRemove(event) {
var userlist = $("userList");
var node = userlist.getSelectedRows()[0];
var uid = node.getAttribute("id");
var regexp = new RegExp("(^|,)" + uid + "($|,)");
var uids = $("assistants");
if (!regexp.test(uids.value))
uids = $("delegates");
if (regexp.test(uids.value)) {
var list = uids.value.split(",");
var newList = new Array();
for (var i = 0; i < list.length; i++) {
if (list[i] != uid)
newList.push(list[i]);
}
uids.value = newList.join(",");
node.parentNode.removeChild(node);
}
updateSelectedRole(userlist);
var userList = $("userList");
var nodes = userList.getSelectedRows();
for (var i = 0; i < nodes.length; i++)
userList.removeChild(nodes[i]);
event.preventDefault();
}
@@ -127,19 +63,33 @@ function subscribeToFolder(refreshCallback, refreshCallbackData) {
refreshCallbackData["folder"]);
}
function openRightsForUser(button) {
var nodes = $("userList").getSelectedRows();
if (nodes.length > 0) {
var url = window.location.href;
var elements = url.split("/");
elements[elements.length-1] = ("userRights?uid="
+ nodes[0].getAttribute("id"));
window.open(elements.join("/"));
}
return false;
}
function onOpenUserRights(event) {
window.alert("user: " + this.getAttribute("id"));
event.preventDefault();
}
function onAclLoadHandler() {
var ul = $("userList");
ul.addEventListener("selectionchange",
onAclSelectionChange, false);
var lis = ul.childNodesWithTag("li");
for (var i = 0; i < lis.length; i++) {
lis[i].addEventListener("mousedown", listRowMouseDownHandler, false);
lis[i].addEventListener("dblclick", onOpenUserRights, false);
lis[i].addEventListener("click", onRowClick, false);
}
var select = $("userRoleDropDown");
select.addEventListener("change", onUserRoleDropDownChange, false);
var buttons = $("userSelectorButtons").childNodesWithTag("a");
buttons[0].addEventListener("click", onUserAdd, false);
buttons[1].addEventListener("click", onUserRemove, false);