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:
commit
148bd513b7
16
ChangeLog
16
ChangeLog
|
@ -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>
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
@interface SOGoParentFolder : SOGoFolder
|
||||
{
|
||||
NSMutableDictionary *subFolders;
|
||||
NSMutableDictionary *subFolders, *subscribedSubFolders;
|
||||
NSString *OCSPath;
|
||||
Class subFolderClass;
|
||||
BOOL hasSubscribedSources;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in a new issue