Monotone-Parent: 34791f35dbfae81d89b325cab373497ac8267859
Monotone-Revision: d60b33f55567caeee757661e23d65eee6e952ed9 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-08-03T18:52:49 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
05ef0e573e
commit
9100c3db2f
28
ChangeLog
28
ChangeLog
|
@ -1,5 +1,33 @@
|
|||
2010-08-03 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/WebServerResources/MailerUI.js (composeNewMessage): the first
|
||||
account is always identified as "0".
|
||||
|
||||
* UI/MailerUI/UIxMailMainFrame.m (-mailAccounts): we now return
|
||||
tje JSON rep. of a simple and flat array containing the account
|
||||
display names, since the account are represented with an integer
|
||||
index.
|
||||
(-inboxData): we directly fetch the first mail account by using
|
||||
the "0" key.
|
||||
(-composeAction): same as above.
|
||||
|
||||
* SoObjects/Mailer/SOGoMailAccount.m (-imap4URLString): the
|
||||
"nameInContainer" now represents the index of the current account
|
||||
in the array of user mail accounts, which simplifies this method.
|
||||
We also handle the "encryption" key, albeit currently unused, and
|
||||
we now add the port to the url as needed.
|
||||
(-shortTitle): removed method.
|
||||
(-davDisplayName): we only need to return the "name" key of the
|
||||
current account.
|
||||
|
||||
* SoObjects/Mailer/SOGoMailAccounts.m (-mailAccounts): new utility
|
||||
method that returns the mail account dictionaries corresponding to
|
||||
the owner.
|
||||
(-toManyRelationshipKeys): we now identify mail accounts via their
|
||||
index in the array of accounts, since the order will never vary,
|
||||
this simplifies the code.
|
||||
(-lookupName:inContext:acquire:): same as the above.
|
||||
|
||||
* UI/WebServerResources/RowEditionController.js:
|
||||
RowEditionController.startEditing: keep the "_selected" class
|
||||
when starting edition, if exists.
|
||||
|
|
|
@ -50,7 +50,6 @@ typedef enum {
|
|||
|
||||
@interface SOGoMailAccount : SOGoMailBaseObject
|
||||
{
|
||||
NSString *accountName;
|
||||
SOGoMailFolder *inboxFolder;
|
||||
SOGoDraftsFolder *draftsFolder;
|
||||
SOGoSentFolder *sentFolder;
|
||||
|
@ -58,8 +57,6 @@ typedef enum {
|
|||
SOGoIMAPAclStyle imapAclStyle;
|
||||
}
|
||||
|
||||
- (void) setAccountName: (NSString *) newAccountName;
|
||||
|
||||
- (SOGoIMAPAclStyle) imapAclStyle;
|
||||
- (BOOL) imapAclConformsToIMAPExt;
|
||||
|
||||
|
|
|
@ -69,7 +69,6 @@ static NSString *sieveScriptName = @"sogo";
|
|||
draftsFolder = nil;
|
||||
sentFolder = nil;
|
||||
trashFolder = nil;
|
||||
accountName = nil;
|
||||
imapAclStyle = undefined;
|
||||
}
|
||||
|
||||
|
@ -82,15 +81,9 @@ static NSString *sieveScriptName = @"sogo";
|
|||
[draftsFolder release];
|
||||
[sentFolder release];
|
||||
[trashFolder release];
|
||||
[accountName release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) setAccountName: (NSString *) newAccountName
|
||||
{
|
||||
ASSIGN (accountName, newAccountName);
|
||||
}
|
||||
|
||||
/* listing the available folders */
|
||||
|
||||
- (BOOL) isInDraftsFolder
|
||||
|
@ -475,11 +468,6 @@ static NSString *sieveScriptName = @"sogo";
|
|||
|
||||
/* IMAP4 */
|
||||
|
||||
- (BOOL) useSSL
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSString *) imap4LoginFromHTTP
|
||||
{
|
||||
WORequest *rq;
|
||||
|
@ -505,46 +493,52 @@ static NSString *sieveScriptName = @"sogo";
|
|||
return [creds objectAtIndex:0]; /* the user */
|
||||
}
|
||||
|
||||
- (NSString *) _urlHostString
|
||||
- (NSDictionary *) _mailAccount
|
||||
{
|
||||
NSDictionary *mailAccount;
|
||||
NSString *username, *escUsername, *hostString;
|
||||
NSArray *accounts;
|
||||
SOGoUser *user;
|
||||
|
||||
mailAccount = [[context activeUser] accountWithName: accountName];
|
||||
if (mailAccount)
|
||||
{
|
||||
username = [mailAccount objectForKey: @"userName"];
|
||||
escUsername
|
||||
= [[username stringByEscapingURL] stringByReplacingString: @"@"
|
||||
withString: @"%40"];
|
||||
hostString = [NSString stringWithFormat: @"%@@%@", escUsername,
|
||||
[mailAccount objectForKey: @"serverName"]];
|
||||
}
|
||||
else
|
||||
hostString = @"localhost";
|
||||
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
|
||||
accounts = [user mailAccounts];
|
||||
mailAccount = [accounts objectAtIndex: [nameInContainer intValue]];
|
||||
|
||||
return hostString;
|
||||
return mailAccount;
|
||||
}
|
||||
|
||||
- (NSMutableString *) imap4URLString
|
||||
{
|
||||
/* private, overridden by SOGoSharedMailAccount */
|
||||
NSMutableString *urlString;
|
||||
NSString *host;
|
||||
NSMutableString *imap4URLString;
|
||||
NSDictionary *mailAccount;
|
||||
NSString *encryption, *protocol, *username, *escUsername;
|
||||
int defaultPort, port;
|
||||
|
||||
urlString = [NSMutableString string];
|
||||
|
||||
if ([self useSSL])
|
||||
[urlString appendString: @"imaps://"];
|
||||
mailAccount = [self _mailAccount];
|
||||
encryption = [mailAccount objectForKey: @"encryption"];
|
||||
if ([encryption isEqualToString: @"ssl"])
|
||||
{
|
||||
protocol = @"imaps";
|
||||
defaultPort = 993;
|
||||
}
|
||||
else
|
||||
[urlString appendString: @"imap://"];
|
||||
{
|
||||
protocol = @"imap";
|
||||
defaultPort = 143;
|
||||
}
|
||||
|
||||
username = [mailAccount objectForKey: @"userName"];
|
||||
escUsername
|
||||
= [[username stringByEscapingURL] stringByReplacingString: @"@"
|
||||
withString: @"%40"];
|
||||
imap4URLString = [NSMutableString stringWithFormat: @"%@://%@@%@",
|
||||
protocol, escUsername,
|
||||
[mailAccount objectForKey: @"serverName"]];
|
||||
port = [[mailAccount objectForKey: @"port"] intValue];
|
||||
if (port && port != defaultPort)
|
||||
[imap4URLString appendFormat: @":%d", port];
|
||||
[imap4URLString appendString: @"/"];
|
||||
|
||||
host = [self _urlHostString];
|
||||
if (![host rangeOfString: @"@"].length)
|
||||
[urlString appendFormat: @"%@@", [self imap4LoginFromHTTP]];
|
||||
[urlString appendFormat: @"%@/", host];
|
||||
|
||||
return urlString;
|
||||
return imap4URLString;
|
||||
}
|
||||
|
||||
- (NSMutableString *) traversalFromMailAccount
|
||||
|
@ -800,40 +794,9 @@ static NSString *sieveScriptName = @"sogo";
|
|||
return [[self imap4Connection] createMailbox:_name atURL:[self imap4URL]];
|
||||
}
|
||||
|
||||
- (NSString *) shortTitle
|
||||
{
|
||||
NSString *login, *host;
|
||||
NSRange r;
|
||||
|
||||
r = [accountName rangeOfString:@"@"];
|
||||
if (r.length > 0)
|
||||
{
|
||||
login = [accountName substringToIndex:r.location];
|
||||
host = [accountName substringFromIndex:(r.location + r.length)];
|
||||
}
|
||||
else
|
||||
{
|
||||
login = nil;
|
||||
host = accountName;
|
||||
}
|
||||
|
||||
r = [host rangeOfString:@"."];
|
||||
if (r.length > 0)
|
||||
host = [host substringToIndex:r.location];
|
||||
|
||||
if ([login length] == 0)
|
||||
return host;
|
||||
|
||||
r = [login rangeOfString:@"."];
|
||||
if (r.length > 0)
|
||||
login = [login substringToIndex:r.location];
|
||||
|
||||
return [NSString stringWithFormat:@"%@@%@", login, host];
|
||||
}
|
||||
|
||||
- (NSString *) davDisplayName
|
||||
{
|
||||
return [self shortTitle];
|
||||
return [[self _mailAccount] objectForKey: @"name"];
|
||||
}
|
||||
|
||||
@end /* SOGoMailAccount */
|
||||
|
|
|
@ -41,12 +41,10 @@
|
|||
@class NSMutableDictionary;
|
||||
|
||||
@interface SOGoMailAccounts : SOGoFolder
|
||||
{
|
||||
NSMutableDictionary *accountKeys;
|
||||
}
|
||||
|
||||
- (NSArray *) mailAccounts;
|
||||
|
||||
- (NSArray *) toManyRelationshipKeys;
|
||||
- (NSDictionary *) accountKeys;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -36,113 +36,55 @@
|
|||
|
||||
@implementation SOGoMailAccounts
|
||||
|
||||
/* listing the available mailboxes */
|
||||
|
||||
// - (BOOL) isInHomeFolderBranchOfLoggedInAccount: (NSString *) userLogin
|
||||
// {
|
||||
// return [[container nameInContainer] isEqualToString: userLogin];
|
||||
// }
|
||||
|
||||
- (id) init
|
||||
- (NSArray *) mailAccounts
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
accountKeys = nil;
|
||||
}
|
||||
SOGoUser *user;
|
||||
|
||||
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[accountKeys release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) _initAccountKeys
|
||||
{
|
||||
NSArray *accounts;
|
||||
NSString *currentName;
|
||||
int count, max;
|
||||
|
||||
if (!accountKeys)
|
||||
{
|
||||
accountKeys = [NSMutableDictionary new];
|
||||
|
||||
accounts = [[context activeUser] mailAccounts];
|
||||
max = [accounts count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
currentName = [[accounts objectAtIndex: count] objectForKey: @"name"];
|
||||
[accountKeys setObject: currentName
|
||||
forKey: [currentName asCSSIdentifier]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSDictionary *) accountKeys
|
||||
{
|
||||
[self _initAccountKeys];
|
||||
|
||||
return accountKeys;
|
||||
return [user mailAccounts];
|
||||
}
|
||||
|
||||
- (NSArray *) toManyRelationshipKeys
|
||||
{
|
||||
[self _initAccountKeys];
|
||||
NSMutableArray *keys;
|
||||
NSArray *accounts;
|
||||
int count, max;
|
||||
SOGoUser *user;
|
||||
|
||||
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
|
||||
accounts = [user mailAccounts];
|
||||
max = [accounts count];
|
||||
|
||||
return [accountKeys allKeys];
|
||||
keys = [NSMutableArray arrayWithCapacity: max];
|
||||
for (count = 0; count < max; count++)
|
||||
[keys addObject: [NSString stringWithFormat: @"%d", count]];
|
||||
|
||||
return keys;
|
||||
}
|
||||
|
||||
/* name lookup */
|
||||
|
||||
// - (id) mailAccountWithName: (NSString *) _key
|
||||
// inContext: (id) _ctx
|
||||
// {
|
||||
// static Class ctClass = Nil;
|
||||
// id ct;
|
||||
|
||||
// if (ctClass == Nil)
|
||||
// ctClass = NSClassFromString(@"SOGoMailAccount");
|
||||
// if (ctClass == Nil) {
|
||||
// [self errorWithFormat:@"missing SOGoMailAccount class!"];
|
||||
// return nil;
|
||||
// }
|
||||
|
||||
// ct = [[ctClass alloc] initWithName:_key inContainer:self];
|
||||
|
||||
// return [ct autorelease];
|
||||
// }
|
||||
|
||||
- (id) lookupName: (NSString *) _key
|
||||
inContext: (id) _ctx
|
||||
acquire: (BOOL) _flag
|
||||
{
|
||||
id obj;
|
||||
NSString *accountName;
|
||||
// NSString *userLogin;
|
||||
|
||||
// userLogin = [[context activeUser] login];
|
||||
NSArray *accounts;
|
||||
SOGoUser *user;
|
||||
int keyCount;
|
||||
|
||||
// if (![self isInHomeFolderBranchOfLoggedInAccount: userLogin]) {
|
||||
// [self warnWithFormat:@ "User %@ tried to access mail hierarchy of %@",
|
||||
// userLogin, [container nameInContainer]];
|
||||
|
||||
// return [NSException exceptionWithHTTPStatus:403 /* Forbidden */
|
||||
// reason:@"Tried to access the mail of another user"];
|
||||
// }
|
||||
|
||||
/* first check attributes directly bound to the application */
|
||||
obj = [super lookupName:_key inContext:_ctx acquire:NO];
|
||||
if (!obj)
|
||||
{
|
||||
[self _initAccountKeys];
|
||||
accountName = [accountKeys objectForKey: _key];
|
||||
if ([accountName length])
|
||||
{
|
||||
obj = [SOGoMailAccount objectWithName: _key inContainer: self];
|
||||
[obj setAccountName: accountName];
|
||||
}
|
||||
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
|
||||
accounts = [user mailAccounts];
|
||||
|
||||
keyCount = [_key intValue];
|
||||
if ([_key isEqualToString: [NSString stringWithFormat: @"%d", keyCount]]
|
||||
&& keyCount > -1 && keyCount < [accounts count])
|
||||
obj = [SOGoMailAccount objectWithName: _key inContainer: self];
|
||||
else
|
||||
obj = [NSException exceptionWithHTTPStatus: 404 /* Not Found */];
|
||||
}
|
||||
|
|
|
@ -103,27 +103,12 @@
|
|||
|
||||
- (NSString *) mailAccounts
|
||||
{
|
||||
SOGoMailAccounts *accounts;
|
||||
NSDictionary *accountKeys;
|
||||
NSArray *keys, *entry;
|
||||
NSMutableArray *values;
|
||||
NSString *key;
|
||||
int i, max;
|
||||
NSArray *accounts, *names;
|
||||
|
||||
accounts = [self clientObject];
|
||||
accountKeys = [accounts accountKeys];
|
||||
keys = [accountKeys allKeys];
|
||||
values = [NSMutableArray array];
|
||||
accounts = [[self clientObject] mailAccounts];
|
||||
names = [accounts objectsForKey: @"name" notFoundMarker: nil];
|
||||
|
||||
max = [keys count];
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
key = [keys objectAtIndex: i];
|
||||
entry = [NSArray arrayWithObjects: key, [accountKeys objectForKey: key], nil];
|
||||
[values addObject: entry];
|
||||
}
|
||||
|
||||
return [values jsonRepresentation];
|
||||
return [names jsonRepresentation];
|
||||
}
|
||||
|
||||
- (NSString *) defaultColumnsOrder
|
||||
|
@ -182,21 +167,18 @@
|
|||
SOGoMailAccounts *accounts;
|
||||
SOGoMailAccount *account;
|
||||
SOGoMailFolder *inbox;
|
||||
|
||||
NSString *firstAccount;
|
||||
NSDictionary *data;
|
||||
SOGoUser *activeUser;
|
||||
UIxMailListActions *actions;
|
||||
|
||||
[self _setupContext];
|
||||
|
||||
#warning this code is dirty: we should not invoke UIxMailListActions from here!
|
||||
actions = [[[UIxMailListActions new] initWithRequest: [context request]] autorelease];
|
||||
activeUser = [context activeUser];
|
||||
accounts = [self clientObject];
|
||||
|
||||
firstAccount = [[[accounts accountKeys] allKeys]
|
||||
objectAtIndex: 0];
|
||||
account = [accounts lookupName: firstAccount inContext: context acquire: NO];
|
||||
account = [accounts lookupName: @"0" inContext: context acquire: NO];
|
||||
inbox = [account inboxFolderInContext: context];
|
||||
|
||||
data = [actions getUIDsAndHeadersInFolder: inbox];
|
||||
|
@ -207,8 +189,8 @@
|
|||
- (id <WOActionResults>) composeAction
|
||||
{
|
||||
id contact;
|
||||
NSArray *accounts, *contactsId, *cards;
|
||||
NSString *firstAccount, *firstEscapedAccount, *newLocation, *parameters, *folderId, *uid, *formattedMail;
|
||||
NSArray *contactsId, *cards;
|
||||
NSString *newLocation, *parameters, *folderId, *uid, *formattedMail;
|
||||
NSEnumerator *uids;
|
||||
NSMutableArray *addresses;
|
||||
NGVCard *card;
|
||||
|
@ -222,11 +204,6 @@
|
|||
parameters = nil;
|
||||
co = [self clientObject];
|
||||
|
||||
// We use the first mail account
|
||||
accounts = [[context activeUser] mailAccounts];
|
||||
firstAccount = [[accounts objectsForKey: @"name" notFoundMarker: nil]
|
||||
objectAtIndex: 0];
|
||||
firstEscapedAccount = [firstAccount asCSSIdentifier];
|
||||
request = [context request];
|
||||
|
||||
if ((folderId = [request formValueForKey: @"folder"]) &&
|
||||
|
@ -290,9 +267,8 @@
|
|||
// No parameter passed; simply open the compose window
|
||||
parameters = @"?mailto=";
|
||||
|
||||
newLocation = [NSString stringWithFormat: @"%@/%@/compose%@",
|
||||
newLocation = [NSString stringWithFormat: @"%@/0/compose%@",
|
||||
[co baseURLInContext: context],
|
||||
firstEscapedAccount,
|
||||
parameters];
|
||||
|
||||
return [self redirectToLocation: newLocation];
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* -*- Mode: js2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
|
||||
/* JavaScript for SOGoMail */
|
||||
var accounts = {};
|
||||
var accounts = [];
|
||||
var mailboxTree;
|
||||
var mailAccounts;
|
||||
if (typeof textMailAccounts != 'undefined') {
|
||||
|
@ -223,10 +223,10 @@ function mailListMarkMessage(event) {
|
|||
action = 'markMessageUnread';
|
||||
markread = false;
|
||||
}
|
||||
|
||||
|
||||
markMailInWindow(window, msguid, markread);
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"
|
||||
+ msguid + "/" + action;
|
||||
|
||||
var data = { "msguid": msguid };
|
||||
|
@ -260,10 +260,10 @@ function mailListFlagMessageToggle (e) {
|
|||
action = "markMessageUnflagged";
|
||||
flagged = false;
|
||||
}
|
||||
|
||||
|
||||
flagMailInWindow(window, msguid, flagged);
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"
|
||||
+ msguid + "/" + action;
|
||||
var data = { "msguid": msguid };
|
||||
|
||||
|
@ -283,7 +283,7 @@ function mailListFlagMessageToggleCallback (http) {
|
|||
|
||||
function onUnload(event) {
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/expunge";
|
||||
|
||||
|
||||
new Ajax.Request(url, {
|
||||
asynchronous: false,
|
||||
method: 'get',
|
||||
|
@ -315,7 +315,7 @@ function onDocumentKeydown(event) {
|
|||
if (nextRow && nextRow.id != 'rowTop' && nextRow.id != 'rowBottom') {
|
||||
Mailer.currentMessages[Mailer.currentMailbox] = nextRow.getAttribute("id").substr(4);
|
||||
row.up().deselectAll();
|
||||
|
||||
|
||||
// Adjust the scollbar
|
||||
var viewPort = $("mailboxList");
|
||||
var divDimensions = viewPort.getDimensions();
|
||||
|
@ -328,7 +328,7 @@ function onDocumentKeydown(event) {
|
|||
viewPort.scrollTop += rowBottom - divBottom + centerOffset;
|
||||
else if (viewPort.scrollTop > nextRow.offsetTop)
|
||||
viewPort.scrollTop -= rowScrollOffset.top - nextRow.offsetTop + centerOffset;
|
||||
|
||||
|
||||
// Select and load the next message
|
||||
nextRow.selectElement();
|
||||
loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
|
||||
|
@ -375,7 +375,7 @@ function deleteSelectedMessages(sender) {
|
|||
}
|
||||
else
|
||||
window.alert(_("Please select a message."));
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -493,10 +493,10 @@ function onMailboxTreeItemClick(event) {
|
|||
toggleAddressColumn("from", "to");
|
||||
else
|
||||
toggleAddressColumn("to", "from");
|
||||
|
||||
|
||||
openMailbox(mailbox);
|
||||
}
|
||||
|
||||
|
||||
Event.stop(event);
|
||||
}
|
||||
|
||||
|
@ -519,7 +519,7 @@ function onMailboxMenuMove(event) {
|
|||
var rows = messageList.getSelectedNodes();
|
||||
var uids = new Array(); // message IDs
|
||||
var paths = new Array(); // row IDs
|
||||
|
||||
|
||||
Mailer.currentMessages[Mailer.currentMailbox] = null;
|
||||
$('messageContent').update();
|
||||
|
||||
|
@ -611,11 +611,11 @@ function composeNewMessage() {
|
|||
if (Mailer.currentMailbox)
|
||||
account = Mailer.currentMailbox.split("/")[1];
|
||||
else if (mailAccounts.length)
|
||||
account = mailAccounts[0][0];
|
||||
account = "0";
|
||||
else
|
||||
account = null;
|
||||
if (account) {
|
||||
var url = ApplicationBaseURL + "/" + encodeURI(account) + "/compose";
|
||||
var url = ApplicationBaseURL + encodeURI(account) + "/compose";
|
||||
openMailComposeWindow(url);
|
||||
}
|
||||
}
|
||||
|
@ -624,7 +624,7 @@ function openMailbox(mailbox, reload, updateStatus) {
|
|||
if (mailbox != Mailer.currentMailbox || reload) {
|
||||
var url = ApplicationBaseURL + encodeURI(mailbox);
|
||||
var urlParams = new Hash();
|
||||
|
||||
|
||||
if (!reload) {
|
||||
var messageContent = $("messageContent");
|
||||
messageContent.update();
|
||||
|
@ -641,7 +641,7 @@ function openMailbox(mailbox, reload, updateStatus) {
|
|||
if (sortAttribute && sortAttribute.length > 0) {
|
||||
urlParams.set("sort", sorting["attribute"]);
|
||||
urlParams.set("asc", sorting["ascending"]);
|
||||
|
||||
|
||||
var sortHeader = $(sorting["attribute"] + "Header");
|
||||
if (sortHeader) {
|
||||
var sortImages = sortHeader.up('THEAD').select(".sortImage");
|
||||
|
@ -664,7 +664,7 @@ function openMailbox(mailbox, reload, updateStatus) {
|
|||
var p = urlParams.keys().collect(function(key) { return key + "=" + urlParams.get(key); }).join("&");
|
||||
key += "?" + p;
|
||||
}
|
||||
|
||||
|
||||
var dataSource = Mailer.dataSources.get(key);
|
||||
if (!dataSource || reload) {
|
||||
dataSource = new SOGoMailDataSource(Mailer.dataTable, url);
|
||||
|
@ -704,7 +704,7 @@ function messageListCallback(row, data, isNew) {
|
|||
row.id = data['rowID'];
|
||||
row.writeAttribute('labels', (data['labels']?data['labels']:""));
|
||||
row.className = data['rowClasses'];
|
||||
|
||||
|
||||
// Restore previous selection
|
||||
if (data['uid'] == currentMessage)
|
||||
row.addClassName('_selected');
|
||||
|
@ -755,7 +755,7 @@ function getStatusFolders() {
|
|||
function statusFoldersCallback(http) {
|
||||
var div = $('mailboxContent');
|
||||
var table = $('messageList');
|
||||
|
||||
|
||||
if (http.status == 200) {
|
||||
document.statusFoldersAjaxRequest = null;
|
||||
var data = http.responseText.evalJSON(true);
|
||||
|
@ -766,7 +766,7 @@ function statusFoldersCallback(http) {
|
|||
function updateStatusFolders(count, isDelta) {
|
||||
var span = $("unseenCount");
|
||||
var counter = null;
|
||||
|
||||
|
||||
if (span)
|
||||
counter = span.select("SPAN").first();
|
||||
|
||||
|
@ -794,7 +794,7 @@ function updateMessageListCounter(count, isDelta) {
|
|||
var value = parseInt(cell.innerHTML);
|
||||
count += value;
|
||||
}
|
||||
|
||||
|
||||
if (count > 0)
|
||||
cell.update(count + " " + _("messages"));
|
||||
else
|
||||
|
@ -820,11 +820,11 @@ function onMessageContextMenu(event) {
|
|||
var selectedNodes = topNode.getSelectedRows();
|
||||
|
||||
menu.observe("hideMenu", onMessageContextMenuHide);
|
||||
|
||||
|
||||
if (selectedNodes.length > 1)
|
||||
popupMenu(event, "messagesListMenu", selectedNodes);
|
||||
else
|
||||
popupMenu(event, "messageListMenu", this);
|
||||
popupMenu(event, "messageListMenu", this);
|
||||
}
|
||||
|
||||
function onMessageContextMenuHide(event) {
|
||||
|
@ -890,7 +890,7 @@ function deleteCachedMailboxByType(type) {
|
|||
var nodes = $("mailboxTree").select("DIV[datatype=" + type + "]");
|
||||
if (nodes.length == 1)
|
||||
deleteCachedMailbox(nodes[0].readAttribute("dataname"));
|
||||
|
||||
|
||||
if (Mailer.currentMailboxType == type)
|
||||
refreshCurrentFolder();
|
||||
}
|
||||
|
@ -1154,7 +1154,7 @@ function configureiCalLinksInMessage() {
|
|||
delegatedTo.uidField = "c_mail";
|
||||
delegatedTo.excludeGroups = true;
|
||||
delegatedTo.excludeLists = true;
|
||||
|
||||
|
||||
var editDelegate = $("editDelegate");
|
||||
if (editDelegate) {
|
||||
// The user delegates the invitation
|
||||
|
@ -1260,7 +1260,7 @@ function ICalendarButtonCallback(http) {
|
|||
function resizeMailContent() {
|
||||
var headerTable = document.getElementsByClassName('mailer_fieldtable')[0];
|
||||
var contentDiv = document.getElementsByClassName('mailer_mailcontent')[0];
|
||||
|
||||
|
||||
contentDiv.setStyle({ 'top':
|
||||
(Element.getHeight(headerTable) + headerTable.offsetTop) + 'px' });
|
||||
|
||||
|
@ -1280,7 +1280,7 @@ function resizeMailContent() {
|
|||
function toggleDisplayHeader(event) {
|
||||
var row = this.up("TR");
|
||||
var span = row.down("SPAN");
|
||||
|
||||
|
||||
if (this.hasClassName("collapse")) {
|
||||
this.writeAttribute("src", ResourcesURL + '/minus.png');
|
||||
this.writeAttribute("class", "expand");
|
||||
|
@ -1301,7 +1301,7 @@ function onMessageContentMenu(event) {
|
|||
var element = getTarget(event);
|
||||
if ((element.tagName == 'A' && element.href.substring(0,7) == "mailto:")
|
||||
|| element.tagName == 'IMG')
|
||||
// Don't show the default contextual menu; let the click propagate to
|
||||
// Don't show the default contextual menu; let the click propagate to
|
||||
// other observers
|
||||
return true;
|
||||
popupMenu(event, 'messageContentMenu', this);
|
||||
|
@ -1371,7 +1371,7 @@ function loadMessageCallback(http) {
|
|||
resizeMailContent();
|
||||
configureLoadImagesButton();
|
||||
configureSignatureFlagImage();
|
||||
|
||||
|
||||
if (http.callbackData) {
|
||||
var cachedMessage = new Array();
|
||||
var msguid = http.callbackData.msguid;
|
||||
|
@ -1538,7 +1538,7 @@ function expandUpperTree(node) {
|
|||
function onHeaderClick(event) {
|
||||
if (SOGoResizableTable._onHandle)
|
||||
return;
|
||||
|
||||
|
||||
var headerId = this.getAttribute("id");
|
||||
var newSortAttribute;
|
||||
if (headerId == "subjectHeader")
|
||||
|
@ -1560,9 +1560,9 @@ function onHeaderClick(event) {
|
|||
sorting["attribute"] = newSortAttribute;
|
||||
sorting["ascending"] = true;
|
||||
}
|
||||
|
||||
|
||||
refreshCurrentFolder();
|
||||
|
||||
|
||||
Event.stop(event);
|
||||
}
|
||||
|
||||
|
@ -1581,7 +1581,7 @@ function configureMessageListEvents(headerTable, dataTable) {
|
|||
if (headerTable)
|
||||
// Sortable columns
|
||||
configureSortableTableHeaders(headerTable);
|
||||
|
||||
|
||||
if (dataTable) {
|
||||
dataTable.multiselect = true;
|
||||
// Each body row can load a message
|
||||
|
@ -1704,7 +1704,7 @@ function initMailer(event) {
|
|||
|
||||
initMailboxTree();
|
||||
initMessageCheckTimer();
|
||||
|
||||
|
||||
if (Prototype.Browser.Gecko)
|
||||
Event.observe(document, "keypress", onDocumentKeydown); // for FF2
|
||||
else
|
||||
|
@ -1721,7 +1721,7 @@ function initMailer(event) {
|
|||
|
||||
onMessageListResize();
|
||||
}
|
||||
|
||||
|
||||
onWindowResize.defer();
|
||||
Event.observe(window, "resize", onWindowResize);
|
||||
}
|
||||
|
@ -1773,8 +1773,8 @@ function initMailboxTree() {
|
|||
mailboxTree.pendingRequests = mailAccounts.length;
|
||||
activeAjaxRequests += mailAccounts.length;
|
||||
for (var i = 0; i < mailAccounts.length; i++) {
|
||||
var url = ApplicationBaseURL + encodeURI(mailAccounts[i][0]) + "/mailboxes";
|
||||
triggerAjaxRequest(url, onLoadMailboxesCallback, mailAccounts[i]);
|
||||
var url = ApplicationBaseURL + i + "/mailboxes";
|
||||
triggerAjaxRequest(url, onLoadMailboxesCallback, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1909,9 +1909,7 @@ function generateMenuForMailbox(mailbox, prefix, callback) {
|
|||
callbacks.push(callback);
|
||||
}
|
||||
}
|
||||
var menuWidth = parseInt(menu.offsetWidth) + 15
|
||||
menuWidth = menuWidth + "px";
|
||||
menu.style.width = menuWidth;
|
||||
menu.style.width = (parseInt(menu.offsetWidth) + 15) + "px";
|
||||
|
||||
initMenu(menuDIV, callbacks);
|
||||
|
||||
|
@ -1940,9 +1938,9 @@ function updateMailboxMenus() {
|
|||
|
||||
var submenuIds = new Array();
|
||||
for (var i = 0; i < mailAccounts.length; i++) {
|
||||
var menuEntry = mailboxMenuNode("account", mailAccounts[i][1]);
|
||||
var menuEntry = mailboxMenuNode("account", mailAccounts[i]);
|
||||
menu.appendChild(menuEntry);
|
||||
var mailbox = accounts[mailAccounts[i]];
|
||||
var mailbox = accounts[i];
|
||||
var newSubmenuId = generateMenuForMailbox(mailbox,
|
||||
key, mailboxActions[key]);
|
||||
submenuIds.push(newSubmenuId);
|
||||
|
@ -1955,9 +1953,9 @@ function onLoadMailboxesCallback(http) {
|
|||
if (http.status == 200) {
|
||||
checkAjaxRequestsState();
|
||||
if (http.responseText.length > 0) {
|
||||
var newAccount = buildMailboxes(http.callbackData,
|
||||
http.responseText);
|
||||
accounts[http.callbackData] = newAccount;
|
||||
var accountIdx = parseInt(http.callbackData);
|
||||
var newAccount = buildMailboxes(accountIdx, http.responseText);
|
||||
accounts[accountIdx] = newAccount;
|
||||
mailboxTree.addMailAccount(newAccount);
|
||||
mailboxTree.pendingRequests--;
|
||||
activeAjaxRequests--;
|
||||
|
@ -1991,17 +1989,17 @@ function onLoadMailboxesCallback(http) {
|
|||
// }
|
||||
}
|
||||
|
||||
function buildMailboxes(accountKeys, encoded) {
|
||||
var account = new Mailbox("account", accountKeys[1],
|
||||
function buildMailboxes(accountIdx, encoded) {
|
||||
var account = new Mailbox("account", "" + accountIdx,
|
||||
undefined, //necessary, null will cause issues
|
||||
accountKeys[1]);
|
||||
mailAccounts[accountIdx]);
|
||||
var data = encoded.evalJSON(true);
|
||||
var mailboxes = data.mailboxes;
|
||||
var unseen = (data.status? data.status.unseen : 0);
|
||||
|
||||
if (data.quotas)
|
||||
Mailer.quotas = data.quotas;
|
||||
|
||||
|
||||
for (var i = 0; i < mailboxes.length; i++) {
|
||||
var currentNode = account;
|
||||
var names = mailboxes[i].path.split("/");
|
||||
|
@ -2163,13 +2161,13 @@ function onMenuLabelNone() {
|
|||
else
|
||||
// Menu called from one selection in messages list view
|
||||
messages.push(document.menuTarget.getAttribute("id").substr(4));
|
||||
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/";
|
||||
messages.each(function(id) {
|
||||
triggerAjaxRequest(url + id + "/removeAllLabels",
|
||||
messageFlagCallback,
|
||||
{ mailbox: Mailer.currentMailbox, msg: id, label: null } );
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function _onMenuLabelFlagX(flag) {
|
||||
|
@ -2189,12 +2187,12 @@ function _onMenuLabelFlagX(flag) {
|
|||
// Menu called from one selection in messages list view
|
||||
messages.set(document.menuTarget.getAttribute("id").substr(4),
|
||||
document.menuTarget.getAttribute("labels"));
|
||||
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/";
|
||||
messages.keys().each(function(id) {
|
||||
var flags = messages.get(id).split(" ");
|
||||
var operation = "add";
|
||||
|
||||
|
||||
if (flags.indexOf("label" + flag) > -1)
|
||||
operation = "remove";
|
||||
|
||||
|
@ -2484,16 +2482,16 @@ Mailbox.prototype = {
|
|||
function configureDraggables () {
|
||||
var mainElement = $("dragDropVisual");
|
||||
Draggables.empty ();
|
||||
|
||||
|
||||
if (mainElement == null) {
|
||||
mainElement = new Element ("div", {id: "dragDropVisual"});
|
||||
document.body.appendChild(mainElement);
|
||||
mainElement.absolutize ();
|
||||
}
|
||||
mainElement.hide();
|
||||
|
||||
new Draggable ("dragDropVisual",
|
||||
{ handle: "messageListBody",
|
||||
|
||||
new Draggable ("dragDropVisual",
|
||||
{ handle: "messageListBody",
|
||||
onStart: startDragging,
|
||||
onEnd: stopDragging,
|
||||
onDrag: whileDragging,
|
||||
|
@ -2502,11 +2500,11 @@ function configureDraggables () {
|
|||
|
||||
function configureDroppables () {
|
||||
var drops = $$("div#dmailboxTree1 div.dTreeNode a.node span.nodeName");
|
||||
|
||||
|
||||
Droppables.empty ();
|
||||
drops.each (function (drop) {
|
||||
drop.identify ()
|
||||
Droppables.add (drop.id,
|
||||
Droppables.add (drop.id,
|
||||
{ hoverclass: "genericHoverClass",
|
||||
onDrop: dropAction });
|
||||
});
|
||||
|
@ -2516,10 +2514,10 @@ function startDragging (itm, e) {
|
|||
var target = Event.element(e);
|
||||
if (target.up('TBODY') == undefined)
|
||||
return false;
|
||||
|
||||
|
||||
var handle = $("dragDropVisual");
|
||||
var count = $("messageListBody").getSelectedRowsId().length;
|
||||
|
||||
|
||||
handle.update (count);
|
||||
if (e.shiftKey)
|
||||
handle.addClassName ("copy");
|
||||
|
@ -2546,7 +2544,7 @@ function stopDragging () {
|
|||
function dropAction (dropped, zone, e) {
|
||||
var destination = zone.up("div.dTreeNode");
|
||||
var f;
|
||||
|
||||
|
||||
if ($("dragDropVisual").hasClassName("copy")) {
|
||||
// Message(s) copied
|
||||
f = onMailboxMenuCopy.bind(destination);
|
||||
|
@ -2555,6 +2553,6 @@ function dropAction (dropped, zone, e) {
|
|||
// Message(s) moved
|
||||
f = onMailboxMenuMove.bind(destination);
|
||||
}
|
||||
|
||||
|
||||
f();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue