merge of '8ec679acd7bba83b03f0f4bbf41999b1d7c4b065'

and 'eca223304213a13e4a7b9e29e6e5cc41c3b1cdb3'

Monotone-Parent: 8ec679acd7bba83b03f0f4bbf41999b1d7c4b065
Monotone-Parent: eca223304213a13e4a7b9e29e6e5cc41c3b1cdb3
Monotone-Revision: 27ff1857cc937c28d83c101f077e83c119249cd6

Monotone-Author: crobert@inverse.ca
Monotone-Date: 2009-06-30T13:15:34
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
C Robert 2009-06-30 13:15:34 +00:00
commit 148bd513b7
9 changed files with 145 additions and 84 deletions

View file

@ -1,7 +1,19 @@
2009-06-29 Cyril Robert <crobert@inverse.ca>
* UI/WebServerResources/ContactsUI.js: Added drag & drop support!
* UI/WebServerResources/ContactsUI.js: Disabled drag & drop for lists
* UI/WebServerResources/ContactsUI.js: Added drag & drop support
2009-06-29 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/SOGo/SOGoParentFolder.m ([SOGoParentFolder
-initSubFolders]): system folders (LDAP sources) are now loaded
unconditionally.
([SOGoFolderParent -initSubscribedSubFolders]): new method to load
only subscribed folders.
([SOGoParent -lookupName:inContext:acquire:]): we now properly
lookup in subscribed folders.
([SOGoParentFolder -subFolders]): since the subscribed folders are
now stored in its own dictionary, we must return keys from both
dictionaries.
2009-06-26 Francis Lachapelle <flachapelle@inverse.ca>

View file

@ -31,7 +31,7 @@
@interface SOGoParentFolder : SOGoFolder
{
NSMutableDictionary *subFolders;
NSMutableDictionary *subFolders, *subscribedSubFolders;
NSString *OCSPath;
Class subFolderClass;
BOOL hasSubscribedSources;

View file

@ -243,11 +243,6 @@ static SoSecurityManager *sm = nil;
return nil;
}
- (void) _removeSubscribedSource: (NSString *) key
{
#warning TO BE IMPLEMENTED SOON FIXME
}
- (void) _appendSubscribedSource: (NSString *) sourceKey
{
SOGoGCSFolder *subscribedFolder;
@ -257,12 +252,10 @@ static SoSecurityManager *sm = nil;
inContainer: self];
if (subscribedFolder
&& ![sm validatePermission: SOGoPerm_AccessObject
onObject: subscribedFolder
inContext: context])
[subFolders setObject: subscribedFolder
forKey: [subscribedFolder nameInContainer]];
else
[self _removeSubscribedSource: sourceKey];
onObject: subscribedFolder
inContext: context])
[subscribedSubFolders setObject: subscribedFolder
forKey: [subscribedFolder nameInContainer]];
}
- (NSException *) appendSubscribedSources
@ -336,27 +329,16 @@ static SoSecurityManager *sm = nil;
return error;
}
- (NSException *) initSubFoldersMatching: (NSString *) folderName
- (NSException *) initSubFolders;
{
NSString *login;
NSException *error;
if (!subFolders)
{
subFolders = [NSMutableDictionary new];
error = [self appendPersonalSources];
if (!error
&& !(folderName && [subFolders objectForKey: folderName]))
{
error = [self appendSystemSources];
if (!error
&& !(folderName && [subFolders objectForKey: folderName]))
{
login = [[context activeUser] login];
if ([login isEqualToString: owner])
error = [self appendSubscribedSources];
}
}
if (!error)
error = [self appendSystemSources];
if (error)
{
[subFolders release];
@ -369,15 +351,33 @@ static SoSecurityManager *sm = nil;
return error;
}
// - (void) _appendSubscribedSourcesIfNeeded
// {
// NSString *login;
- (NSException *) initSubscribedSubFolders
{
NSArray *subscribedReferences;
NSUserDefaults *settings;
NSEnumerator *allKeys;
NSString *currentKey, *login;
NSException *error;
// login = [[context activeUser] login];
// if ([login isEqualToString: owner])
// [self appendSubscribedSources];
// hasSubscribedSources = YES;
// }
error = nil; /* we ignore non-DB errors at this time... */
login = [[context activeUser] login];
if (!subscribedSubFolders && [login isEqualToString: owner])
{
subscribedSubFolders = [NSMutableDictionary new];
settings = [[context activeUser] userSettings];
subscribedReferences = [[settings objectForKey: nameInContainer]
objectForKey: @"SubscribedFolders"];
if ([subscribedReferences isKindOfClass: [NSArray class]])
{
allKeys = [subscribedReferences objectEnumerator];
while ((currentKey = [allKeys nextObject]))
[self _appendSubscribedSource: currentKey];
}
}
return error;
}
- (NSArray *) fetchContentObjectNames
{
@ -395,11 +395,8 @@ static SoSecurityManager *sm = nil;
obj = [super lookupName: name inContext: lookupContext acquire: NO];
if (!obj)
{
if (!subFolders)
error = [self initSubFoldersMatching: name];
else
error = nil;
// Lookup in personal folders
error = [self initSubFolders];
if (error)
{
[self errorWithFormat: @"a database error occured: %@", [error reason]];
@ -407,37 +404,48 @@ static SoSecurityManager *sm = nil;
}
else
obj = [subFolders objectForKey: name];
// if (!obj && !hasSubscribedSources)
// {
// [self _appendSubscribedSourcesIfNeeded];
// obj = [subFolders objectForKey: name];
// }
if (!obj)
{
// Lookup in subscribed folders
error = [self initSubscribedSubFolders];
if (error)
{
[self errorWithFormat: @"a database error occured: %@", [error reason]];
obj = [NSException exceptionWithHTTPStatus: 503];
}
else
obj = [subscribedSubFolders objectForKey: name];
}
}
return obj;
}
- (NSArray *) subFolders
{
NSMutableArray *ma;
NSException *error;
if (!subFolders)
error = [self initSubFolders];
if (error)
{
error = [self initSubFoldersMatching: nil];
if (error)
{
/* We exceptionnally raise the exception here because doPROPFIND:
will not care for errors in its response from
toManyRelationShipKeys, which may in turn trigger the
disappearance of user folders in the SOGo extensions. */
[error raise];
}
/* We exceptionnally raise the exception here because doPROPFIND:
will not care for errors in its response from
toManyRelationShipKeys, which may in turn trigger the
disappearance of user folders in the SOGo extensions. */
[error raise];
}
// if (!!hasSubscribedSources)
// [self _appendSubscribedSourcesIfNeeded];
error = [self initSubscribedSubFolders];
if (error)
[error raise];
return [[subFolders allValues]
sortedArrayUsingSelector: @selector (compare:)];
ma = [NSMutableArray arrayWithArray: [subFolders allValues]];
if ([subscribedSubFolders count])
[ma addObjectsFromArray: [subscribedSubFolders allValues]];
return [ma sortedArrayUsingSelector: @selector (compare:)];
}
- (NSArray *) toManyRelationshipKeys

View file

@ -253,7 +253,7 @@ function actionContactCallback(http) {
var error = html.select("p").first().firstChild.nodeValue.trim();
log("actionContactCallback failed: error " + http.status + " (" + error + ")");
if (parseInt(http.status) == 403)
window.alert(labels["You don't have the required privileges to perform the operation."]);
window.alert(clabels["You don't have the required privileges to perform the operation."]);
else if (error)
window.alert(labels[error]);
refreshCurrentFolder();
@ -777,6 +777,8 @@ function onAddressBookMenuPrepareVisibility() {
menuEntry.removeClassName("disabled");
});
}
return true;
}
function updateAddressBooksMenus() {
@ -899,8 +901,7 @@ function onAddressBooksMenuPrepareVisibility() {
sharingOption.addClassName("disabled");
}
// disable the "remove" option when address book is public, otherwise
// enable it
// Disable the "remove" option when address book is public
if (folderOwner == "nobody")
removeOption.addClassName("disabled");
else
@ -914,7 +915,7 @@ function onAddressBooksMenuPrepareVisibility() {
function onContactMenuPrepareVisibility() {
var contactRows = document.menuTarget;
var selectedFolder = $("contactFolders").getSelectedNodes()[0];
var selectedFolder = $("contactFolders").getSelectedNodes().first();
var options = { write: false,
aim: false };
@ -925,9 +926,10 @@ function onContactMenuPrepareVisibility() {
var moveOption = elements[7];
$A(contactRows).each(function(contactRow) {
var emailCell = contactRow.down('td', 1);
var cells = contactRow.getElementsByTagName('td');
var emailCell = cells[1];
options.write |= (emailCell.firstChild != null);
var aimCell = contactRow.down('td', 2);
var aimCell = cells[2];
options.aim |= (aimCell.firstChild != null);
});

View file

@ -390,7 +390,7 @@ function onViewEventCallback(http) {
div.down("P", 1).hide();
if (data["description"].length) {
div.down("P", 2).update(data["description"]);
div.down("P", 2).update(data["description"].replace(/\r\n/g, "<BR/>"));
div.down("P", 2).show();
} else
div.down("P", 2).hide();

View file

@ -54,19 +54,10 @@ SELECT
{ margin-left: 1px; }
LABEL#commentArea
{ height: 15em; }
{ height: 17em; }
LABEL#commentArea textarea
{ padding-bottom: 0em;
top: 0px;
left: 8em;
width: 380px;
height: 15em;
vertical-align: bottom;
position: absolute;
padding: 0px;
margin: 0px;
margin-left: 1px; }
{ height: 15.5em; }
SPAN.checkBoxList#participantsCB
{ height: 7em; }
@ -80,7 +71,7 @@ DIV#participants UL.contactList
SPAN.checkBoxList SPAN.content LABEL
{ display: inline; }
SPAN.content
n0SPAN.content
{ position: absolute;
line-height: 2em;
top: -.25em;

View file

@ -9,3 +9,32 @@ SPAN.datePicker INPUT.textField
SPAN.timeDateControl A.button
{ border: 0; }
SPAN.content
{ position: absolute;
line-height: 2em;
top: -.25em;
left: 8em;
right: 1em; }
SPAN.content > INPUT.textField,
LABEL#commentArea textarea
{ width: 380px; }
LABEL, SPAN.checkBoxList
{ display: block;
position: relative;
line-height: 1.5em;
height: 1.5em;
margin-left: 0px;
margin-bottom: .5em;
width: 100%; }
LABEL#commentArea textarea
{ padding-bottom: 0em;
top: 0px;
left: 8em;
position: absolute;
padding: 0px;
margin: 0px;
margin-left: 1px; }

View file

@ -43,6 +43,7 @@ function onPopupUrlWindow(event) {
}
urlInput.value = newUrl;
}
onWindowResize(event);
return false;
}
@ -134,10 +135,31 @@ function onComponentEditorLoad(event) {
$("repeatList").observe("change", onPopupRecurrenceWindow);
$("reminderHref").observe("click", onPopupReminderWindow);
$("reminderList").observe("change", onPopupReminderWindow);
Event.observe(window, "resize", onWindowResize);
onPopupRecurrenceWindow(null);
onPopupReminderWindow(null);
}
function onWindowResize(event) {
var document = $("documentLabel");
var comment = $("commentArea");
var area = comment.select("textarea").first();
var offset = 6;
var height;
height = window.height() - comment.cumulativeOffset().top - offset;
if (document.visible())
height -= $("changeUrlButton").getHeight();
area.setStyle({ height: (height - offset*2) + "px" });
comment.setStyle({ height: (height - offset) + "px" });
return true;
}
function onPopupRecurrenceWindow(event) {
if (event)
preventDefault(event);

View file

@ -25,10 +25,7 @@ LABEL#commentArea
{ height: 15em; }
LABEL#commentArea textarea
{ padding: 0;
margin: 0;
width: 380px;
height: 15em; }
{ height: 15em; }
SPAN.checkBoxList#participantsCB
{ height: 7em; }