Monotone-Parent: 533cfe8838587987ff2e1ab8c7ed56d0e4b66bb4
Monotone-Revision: fe2bfcd815039f3fc87b6307a5eb4a89ca9d9022 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-08-06T15:34:05 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
parent
0efbccb592
commit
2b9df19550
24
ChangeLog
24
ChangeLog
|
@ -1,5 +1,29 @@
|
||||||
2010-08-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
2010-08-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
|
* UI/WebServerResources/UIxPreferences.js: (_setupEvents): no
|
||||||
|
longer take any parameter, which simplifies the method, as
|
||||||
|
removing the "change" observers on input field is not useful.
|
||||||
|
(initMailAccounts): new method that parses the mail accounts JSON
|
||||||
|
dictionary, populates the mail account UL and setup related
|
||||||
|
events.
|
||||||
|
(onMailAccountInfoChange, onMailIdentityInfoChange)
|
||||||
|
(onMailIdentitySignatureClick, onMailIdentitySignatureOK)
|
||||||
|
(createMailAccountLI, onMailAccountEntryClick, displayMailAccount)
|
||||||
|
(displayAccountSignature, createMailAccount)
|
||||||
|
(onMailAccountAdd, onMailAccountDelete, saveMailAccounts)
|
||||||
|
(compactMailAccounts): new methods completing the above.
|
||||||
|
|
||||||
|
* UI/PreferencesUI/UIxPreferences.m (-identitiesList)
|
||||||
|
(-itemIdentityText, -signature, -setSignature): removed obsolete
|
||||||
|
methods.
|
||||||
|
(-defaultAction): when updating filters, we now only need to query
|
||||||
|
the "0" account since accounts are no longer identified by "name".
|
||||||
|
(-mailAuxiliaryUserAccountsEnabled): new bool method.
|
||||||
|
(-setMailAccounts): new accessor that decodes the new mail
|
||||||
|
accounts dictionary in JSON format and validates it prior to save
|
||||||
|
it in the user defaults.
|
||||||
|
(-mailAccounts): new accessor.
|
||||||
|
|
||||||
* UI/MailerUI/UIxMailFolderActions.m (_setFolderPurpose:): we now
|
* UI/MailerUI/UIxMailFolderActions.m (_setFolderPurpose:): we now
|
||||||
use the corresponding methods on the SOGoUserDefaults instance
|
use the corresponding methods on the SOGoUserDefaults instance
|
||||||
rather than in the user settings (old bug) when setting folders
|
rather than in the user settings (old bug) when setting folders
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
if ((self = [super init]))
|
if ((self = [super init]))
|
||||||
{
|
{
|
||||||
item = nil;
|
item = nil;
|
||||||
|
#warning user should be the owner rather than the activeUser
|
||||||
ASSIGN (user, [context activeUser]);
|
ASSIGN (user, [context activeUser]);
|
||||||
ASSIGN (userDefaults, [user userDefaults]);
|
ASSIGN (userDefaults, [user userDefaults]);
|
||||||
ASSIGN (today, [NSCalendarDate date]);
|
ASSIGN (today, [NSCalendarDate date]);
|
||||||
|
@ -575,35 +576,6 @@
|
||||||
[userDefaults setMailMessageForwarding: newMessageForwarding];
|
[userDefaults setMailMessageForwarding: newMessageForwarding];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// <label><var:string label:value="Default identity:"/>
|
|
||||||
// <var:popup list="identitiesList" item="item"
|
|
||||||
// string="itemIdentityText" selection="defaultIdentity"/></label>
|
|
||||||
- (NSArray *) identitiesList
|
|
||||||
{
|
|
||||||
NSDictionary *primaryAccount;
|
|
||||||
|
|
||||||
#warning we manage only one account per user at this time...
|
|
||||||
primaryAccount = [[user mailAccounts] objectAtIndex: 0];
|
|
||||||
|
|
||||||
return [primaryAccount objectForKey: @"identities"];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSString *) itemIdentityText
|
|
||||||
{
|
|
||||||
return [(NSDictionary *) item keysWithFormat: @"%{fullName} <%{email}>"];
|
|
||||||
} */
|
|
||||||
|
|
||||||
- (NSString *) signature
|
|
||||||
{
|
|
||||||
return [userDefaults mailSignature];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setSignature: (NSString *) newSignature
|
|
||||||
{
|
|
||||||
[userDefaults setMailSignature: newSignature];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray *) replyPlacementList
|
- (NSArray *) replyPlacementList
|
||||||
{
|
{
|
||||||
return [NSArray arrayWithObjects: @"above", @"below", nil];
|
return [NSArray arrayWithObjects: @"above", @"below", nil];
|
||||||
|
@ -676,7 +648,7 @@
|
||||||
|
|
||||||
- (NSString *) sieveCapabilities
|
- (NSString *) sieveCapabilities
|
||||||
{
|
{
|
||||||
#warning this should be deduced from the server
|
#warning sieve caps should be deduced from the server
|
||||||
static NSArray *capabilities = nil;
|
static NSArray *capabilities = nil;
|
||||||
|
|
||||||
if (!capabilities)
|
if (!capabilities)
|
||||||
|
@ -931,8 +903,7 @@
|
||||||
if ([[request method] isEqualToString: @"POST"])
|
if ([[request method] isEqualToString: @"POST"])
|
||||||
{
|
{
|
||||||
SOGoMailAccount *account;
|
SOGoMailAccount *account;
|
||||||
id mailAccounts;
|
SOGoMailAccounts *folder;
|
||||||
id folder;
|
|
||||||
|
|
||||||
dd = [[context activeUser] domainDefaults];
|
dd = [[context activeUser] domainDefaults];
|
||||||
if ([dd sieveScriptsEnabled])
|
if ([dd sieveScriptsEnabled])
|
||||||
|
@ -944,12 +915,9 @@
|
||||||
|
|
||||||
[userDefaults synchronize];
|
[userDefaults synchronize];
|
||||||
|
|
||||||
mailAccounts = [[[context activeUser] mailAccounts] objectAtIndex: 0];
|
|
||||||
folder = [[self clientObject] mailAccountsFolder: @"Mail"
|
folder = [[self clientObject] mailAccountsFolder: @"Mail"
|
||||||
inContext: context];
|
inContext: context];
|
||||||
account = [folder lookupName: [[mailAccounts objectForKey: @"name"] asCSSIdentifier]
|
account = [folder lookupName: @"0" inContext: context acquire: NO];
|
||||||
inContext: context
|
|
||||||
acquire: NO];
|
|
||||||
[account updateFilters];
|
[account updateFilters];
|
||||||
|
|
||||||
if (hasChanged)
|
if (hasChanged)
|
||||||
|
@ -1093,4 +1061,193 @@
|
||||||
return [self labelForKey: item];
|
return [self labelForKey: item];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL) mailAuxiliaryUserAccountsEnabled
|
||||||
|
{
|
||||||
|
return [[user domainDefaults] mailAuxiliaryUserAccountsEnabled];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) _extractMainSignature: (NSDictionary *) account
|
||||||
|
{
|
||||||
|
/* We perform some validation here as we have no guaranty on the input
|
||||||
|
validity. */
|
||||||
|
NSString *signature;
|
||||||
|
NSArray *identities;
|
||||||
|
NSDictionary *identity;
|
||||||
|
|
||||||
|
if ([account isKindOfClass: [NSDictionary class]])
|
||||||
|
{
|
||||||
|
identities = [account objectForKey: @"identities"];
|
||||||
|
if ([identities isKindOfClass: [NSArray class]])
|
||||||
|
{
|
||||||
|
signature = nil;
|
||||||
|
|
||||||
|
if ([identities count] > 0)
|
||||||
|
{
|
||||||
|
identity = [identities objectAtIndex: 0];
|
||||||
|
if ([identity isKindOfClass: [NSDictionary class]])
|
||||||
|
{
|
||||||
|
signature = [identity objectForKey: @"signature"];
|
||||||
|
if (!signature)
|
||||||
|
signature = @"";
|
||||||
|
[userDefaults setMailSignature: signature];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) _validateAccountIdentities: (NSArray *) identities
|
||||||
|
{
|
||||||
|
static NSString *identityKeys[] = { @"fullName", @"email", nil };
|
||||||
|
static NSArray *knownKeys = nil;
|
||||||
|
NSString **key, *value;
|
||||||
|
NSDictionary *identity;
|
||||||
|
NSMutableDictionary *clone;
|
||||||
|
BOOL valid;
|
||||||
|
int count, max;
|
||||||
|
|
||||||
|
if (!knownKeys)
|
||||||
|
{
|
||||||
|
knownKeys = [NSArray arrayWithObjects: @"fullName", @"email",
|
||||||
|
@"signature", nil];
|
||||||
|
[knownKeys retain];
|
||||||
|
}
|
||||||
|
|
||||||
|
valid = [identities isKindOfClass: [NSArray class]];
|
||||||
|
if (valid)
|
||||||
|
{
|
||||||
|
max = [identities count];
|
||||||
|
valid = (max > 0);
|
||||||
|
for (count = 0; valid && count < max; count++)
|
||||||
|
{
|
||||||
|
identity = [identities objectAtIndex: count];
|
||||||
|
clone = [identity mutableCopy];
|
||||||
|
[clone removeObjectsForKeys: knownKeys];
|
||||||
|
valid = ([clone count] == 0);
|
||||||
|
[clone autorelease];
|
||||||
|
if (valid)
|
||||||
|
{
|
||||||
|
key = identityKeys;
|
||||||
|
while (valid && *key)
|
||||||
|
{
|
||||||
|
value = [identity objectForKey: *key];
|
||||||
|
if ([value isKindOfClass: [NSString class]]
|
||||||
|
&& [value length] > 0)
|
||||||
|
key++;
|
||||||
|
else
|
||||||
|
valid = NO;
|
||||||
|
}
|
||||||
|
if (valid)
|
||||||
|
{
|
||||||
|
value = [identity objectForKey: @"signature"];
|
||||||
|
valid = (!value || [value isKindOfClass: [NSString class]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) _validateAccount: (NSDictionary *) account
|
||||||
|
{
|
||||||
|
static NSString *accountKeys[] = { @"name", @"serverName", @"userName",
|
||||||
|
@"password", nil };
|
||||||
|
static NSArray *knownKeys = nil;
|
||||||
|
NSMutableDictionary *clone;
|
||||||
|
NSString **key, *value;
|
||||||
|
BOOL valid;
|
||||||
|
|
||||||
|
if (!knownKeys)
|
||||||
|
{
|
||||||
|
knownKeys = [NSArray arrayWithObjects: @"name", @"serverName",
|
||||||
|
@"userName", @"password", @"encryption",
|
||||||
|
@"identities", @"mailboxes", nil];
|
||||||
|
[knownKeys retain];
|
||||||
|
}
|
||||||
|
|
||||||
|
valid = [account isKindOfClass: [NSDictionary class]];
|
||||||
|
if (valid)
|
||||||
|
{
|
||||||
|
clone = [account mutableCopy];
|
||||||
|
[clone removeObjectsForKeys: knownKeys];
|
||||||
|
valid = ([clone count] == 0);
|
||||||
|
[clone autorelease];
|
||||||
|
|
||||||
|
key = accountKeys;
|
||||||
|
while (valid && *key)
|
||||||
|
{
|
||||||
|
value = [account objectForKey: *key];
|
||||||
|
if ([value isKindOfClass: [NSString class]]
|
||||||
|
&& [value length] > 0)
|
||||||
|
key++;
|
||||||
|
else
|
||||||
|
valid = NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valid)
|
||||||
|
{
|
||||||
|
value = [account objectForKey: @"security"];
|
||||||
|
if (value)
|
||||||
|
valid = ([value isKindOfClass: [NSString class]]
|
||||||
|
&& ([value isEqualToString: @"none"]
|
||||||
|
|| [value isEqualToString: @"ssl"]
|
||||||
|
|| [value isEqualToString: @"tls"]));
|
||||||
|
|
||||||
|
valid &= [self _validateAccountIdentities: [account objectForKey: @"identities"]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) _extractAuxiliaryAccounts: (NSArray *) accounts
|
||||||
|
{
|
||||||
|
int count, max;
|
||||||
|
NSMutableArray *auxAccounts;
|
||||||
|
NSDictionary *account;
|
||||||
|
|
||||||
|
max = [accounts count];
|
||||||
|
auxAccounts = [NSMutableArray arrayWithCapacity: max];
|
||||||
|
|
||||||
|
for (count = 1; count < max; count++)
|
||||||
|
{
|
||||||
|
account = [accounts objectAtIndex: count];
|
||||||
|
if ([self _validateAccount: account])
|
||||||
|
[auxAccounts addObject: account];
|
||||||
|
}
|
||||||
|
|
||||||
|
[userDefaults setAuxiliaryMailAccounts: auxAccounts];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setMailAccounts: (NSString *) newMailAccounts
|
||||||
|
{
|
||||||
|
NSArray *accounts;
|
||||||
|
NSScanner *scanner;
|
||||||
|
int max;
|
||||||
|
|
||||||
|
scanner = [NSScanner scannerWithString: newMailAccounts];
|
||||||
|
[scanner scanJSONArray: &accounts];
|
||||||
|
if (accounts && [accounts isKindOfClass: [NSArray class]])
|
||||||
|
{
|
||||||
|
max = [accounts count];
|
||||||
|
if (max > 0)
|
||||||
|
{
|
||||||
|
[self _extractMainSignature: [accounts objectAtIndex: 0]];
|
||||||
|
|
||||||
|
if (max > 1 && [self mailAuxiliaryUserAccountsEnabled])
|
||||||
|
[self _extractAuxiliaryAccounts: accounts];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) mailAccounts
|
||||||
|
{
|
||||||
|
NSArray *accounts;
|
||||||
|
|
||||||
|
accounts = [user mailAccounts];
|
||||||
|
|
||||||
|
return [accounts jsonRepresentation];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
><var:if condition="userHasMailAccess">
|
><var:if condition="userHasMailAccess">
|
||||||
<li target="mailOptionsView"><span><var:string
|
<li target="mailOptionsView"><span><var:string
|
||||||
label:value="Mail Options"/></span></li>
|
label:value="Mail Options"/></span></li>
|
||||||
<li target="identitiesView"><span><var:string
|
<li target="mailAccountsView"><span><var:string
|
||||||
label:value="Signature"/></span></li>
|
label:value="IMAP Accounts"/></span></li>
|
||||||
<var:if condition="isVacationEnabled"><li target="vacationView"><span><var:string
|
<var:if condition="isVacationEnabled"><li target="vacationView"><span><var:string
|
||||||
label:value="Vacation"/></span></li></var:if
|
label:value="Vacation"/></span></li></var:if
|
||||||
><var:if condition="isForwardEnabled"><li target="forwardView"><span><var:string
|
><var:if condition="isForwardEnabled"><li target="forwardView"><span><var:string
|
||||||
|
@ -122,8 +122,9 @@
|
||||||
></tr>
|
></tr>
|
||||||
</var:foreach>
|
</var:foreach>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table></div>
|
</table>
|
||||||
<div class="bottomToolbar">
|
</div>
|
||||||
|
<div const:id="categoriesToolbar" class="bottomToolbar">
|
||||||
<a const:id="categoryAdd" class="bottomButton" href="#">
|
<a const:id="categoryAdd" class="bottomButton" href="#">
|
||||||
<span><img rsrc:src="add-icon.png" label:title="Add" />
|
<span><img rsrc:src="add-icon.png" label:title="Add" />
|
||||||
</span></a>
|
</span></a>
|
||||||
|
@ -195,8 +196,9 @@
|
||||||
<tbody><!--space --></tbody>
|
<tbody><!--space --></tbody>
|
||||||
</table>
|
</table>
|
||||||
<input type="hidden" const:name="sieveFilters" const:id="sieveFilters"
|
<input type="hidden" const:name="sieveFilters" const:id="sieveFilters"
|
||||||
var:value="sieveFiltersValue"/></div>
|
var:value="sieveFiltersValue"/>
|
||||||
<div class="bottomToolbar">
|
</div>
|
||||||
|
<div const:id="filtersToolbar" class="bottomToolbar">
|
||||||
<a const:id="filterAdd" class="bottomButton" href="#">
|
<a const:id="filterAdd" class="bottomButton" href="#">
|
||||||
<span><img rsrc:src="add-icon.png" label:title="Add" />
|
<span><img rsrc:src="add-icon.png" label:title="Add" />
|
||||||
</span></a>
|
</span></a>
|
||||||
|
@ -212,10 +214,57 @@
|
||||||
</div>
|
</div>
|
||||||
</var:if>
|
</var:if>
|
||||||
</div>
|
</div>
|
||||||
<div id="identitiesView" class="tab"
|
|
||||||
><textarea const:id="signature" const:name="signature"
|
<div id="mailAccountsView" class="tab">
|
||||||
var:value="signature"
|
<input type="hidden" const:name="mailAccountsJSON" const:id="mailAccountsJSON"
|
||||||
/></div>
|
var:value="mailAccounts"/>
|
||||||
|
<div id="mailAccountsListWrapper"
|
||||||
|
><ul id="mailAccountsList"
|
||||||
|
><!-- space --></ul
|
||||||
|
></div>
|
||||||
|
<var:if condition="mailAuxiliaryUserAccountsEnabled">
|
||||||
|
<div const:id="mailAccountsToolbar" class="bottomToolbar">
|
||||||
|
<a const:id="mailAccountAdd" class="bottomButton" href="#">
|
||||||
|
<span><img rsrc:src="add-icon.png" label:title="Add" />
|
||||||
|
</span></a>
|
||||||
|
<a const:id="mailAccountDelete" class="bottomButton" href="#">
|
||||||
|
<span><img rsrc:src="remove-icon.png" label:title="Delete" />
|
||||||
|
</span></a>
|
||||||
|
</div>
|
||||||
|
</var:if>
|
||||||
|
<div id="mailAccountEditor">
|
||||||
|
<fieldset const:id="accountInfo">
|
||||||
|
<label><var:string label:value="Server Name:"/>
|
||||||
|
<input const:name="serverName" const:id="serverName" type="text" const:value=""/></label>
|
||||||
|
<label><var:string label:value="Port:"/>
|
||||||
|
<input const:name="port" const:id="port" type="text" const:value=""/></label><br/><br/>
|
||||||
|
<label><var:string label:value="User Name:"/>
|
||||||
|
<input const:name="userName" const:id="userName" type="text" const:value=""/></label><br/>
|
||||||
|
<label><var:string label:value="Password:"/>
|
||||||
|
<input const:name="password" const:id="password" type="password" const:value=""/></label>
|
||||||
|
|
||||||
|
<input const:name="encryption" type="hidden" const:value="none"/>
|
||||||
|
<!-- <hr/> -->
|
||||||
|
<!-- <var:string label:value="Encryption:"/> -->
|
||||||
|
<!-- <label><input const:name="encryption" type="radio" const:value="none"/> -->
|
||||||
|
<!-- <var:string label:value="None"/></label> -->
|
||||||
|
<!-- <label><input const:name="encryption" type="radio" const:value="ssl"/> -->
|
||||||
|
<!-- <var:string label:value="SSL"/></label> -->
|
||||||
|
<!-- <label><input const:name="encryption" type="radio" const:value="tls"/> -->
|
||||||
|
<!-- <var:string label:value="TLS"/></label> -->
|
||||||
|
</fieldset>
|
||||||
|
<fieldset const:id="identityInfo">
|
||||||
|
<label><var:string label:value="Full Name:"/>
|
||||||
|
<input const:name="fullName" const:id="fullName" type="text" const:value=""
|
||||||
|
/></label><br/>
|
||||||
|
<label><var:string label:value="Email:"/>
|
||||||
|
<input const:name="email" const:id="email" type="text" const:value=""/></label><br/><br/>
|
||||||
|
<var:string label:value="Signature:"/>
|
||||||
|
<span id="actSignature"><!--space --></span>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<var:if condition="isVacationEnabled">
|
<var:if condition="isVacationEnabled">
|
||||||
<div id="vacationView" class="tab">
|
<div id="vacationView" class="tab">
|
||||||
<label><input type="checkbox"
|
<label><input type="checkbox"
|
||||||
|
|
|
@ -5,10 +5,21 @@ DIV#preferencesTabs
|
||||||
right: 5px;
|
right: 5px;
|
||||||
bottom: 5px; }
|
bottom: 5px; }
|
||||||
|
|
||||||
TEXTAREA#signature
|
DIV.bottomToolbar
|
||||||
{ position: absolute;
|
{ position: absolute;
|
||||||
width: 100%;
|
height: 20px;
|
||||||
height: 100%; }
|
margin: 0px;
|
||||||
|
padding: 0px; }
|
||||||
|
|
||||||
|
#categoriesToolbar, #filtersToolbar
|
||||||
|
{ left: 2em;
|
||||||
|
right: 2em;
|
||||||
|
bottom: 8px; }
|
||||||
|
|
||||||
|
#mailAccountsToolbar
|
||||||
|
{ left: 5px;
|
||||||
|
bottom: 9px;
|
||||||
|
width: 130px; }
|
||||||
|
|
||||||
DIV#categoriesListWrapper
|
DIV#categoriesListWrapper
|
||||||
{ overflow: auto;
|
{ overflow: auto;
|
||||||
|
@ -43,14 +54,7 @@ DIV.colorBox
|
||||||
margin: 0 3px 0 0;
|
margin: 0 3px 0 0;
|
||||||
width: 1em; }
|
width: 1em; }
|
||||||
|
|
||||||
DIV#windowButtons
|
/* vacation */
|
||||||
{ position: fixed;
|
|
||||||
bottom: 20px;
|
|
||||||
left: 0px;
|
|
||||||
right: 25px;
|
|
||||||
vertical-align: middle;
|
|
||||||
text-align: right; }
|
|
||||||
|
|
||||||
#vacation, #forward
|
#vacation, #forward
|
||||||
{ padding-left: 2.5em; }
|
{ padding-left: 2.5em; }
|
||||||
#vacation LABEL
|
#vacation LABEL
|
||||||
|
@ -67,13 +71,6 @@ DIV#windowButtons
|
||||||
#passwordView BR
|
#passwordView BR
|
||||||
{ clear: both; }
|
{ clear: both; }
|
||||||
|
|
||||||
DIV.bottomToolbar
|
|
||||||
{ position: absolute;
|
|
||||||
bottom: 9px;
|
|
||||||
left: 2em;
|
|
||||||
right: 2em;
|
|
||||||
margin: 0px; }
|
|
||||||
|
|
||||||
/* mail filters */
|
/* mail filters */
|
||||||
DIV#filtersListWrapper
|
DIV#filtersListWrapper
|
||||||
{ overflow: auto;
|
{ overflow: auto;
|
||||||
|
@ -115,3 +112,81 @@ P.errorMessage#passwordError
|
||||||
|
|
||||||
P.infoMessage#passwordError
|
P.infoMessage#passwordError
|
||||||
{ color: #00f; }
|
{ color: #00f; }
|
||||||
|
|
||||||
|
/* mail accounts */
|
||||||
|
#mailAccountsListWrapper, #mailAccountEditor
|
||||||
|
{ position: absolute;
|
||||||
|
overflow: auto;
|
||||||
|
bottom: 30px;
|
||||||
|
top: 5px;
|
||||||
|
left: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px; }
|
||||||
|
|
||||||
|
#mailAccountsListWrapper
|
||||||
|
{ overflow-x: hidden;
|
||||||
|
left: 5px;
|
||||||
|
width: 130px;
|
||||||
|
background: #ccddec;
|
||||||
|
border-top: 1px solid #9b9b9b;
|
||||||
|
border-left: 1px solid #9b9b9b; }
|
||||||
|
|
||||||
|
#mailAccountsList
|
||||||
|
{ position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px; }
|
||||||
|
|
||||||
|
#mailAccountsList LI
|
||||||
|
{ cursor: pointer;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-left: 5px;
|
||||||
|
height: 20px; }
|
||||||
|
|
||||||
|
#mailAccountsList LI.readonly
|
||||||
|
{ cursor: default;
|
||||||
|
font-style: italic; }
|
||||||
|
|
||||||
|
#mailAccountEditor
|
||||||
|
{ left: 140px;
|
||||||
|
padding-top: 5px;
|
||||||
|
right: 5px; }
|
||||||
|
|
||||||
|
#serverName
|
||||||
|
{ width: 100px; }
|
||||||
|
|
||||||
|
#port
|
||||||
|
{ width: 30px; }
|
||||||
|
|
||||||
|
#userName, #password
|
||||||
|
{ width: 180px; }
|
||||||
|
|
||||||
|
#fullName, #email
|
||||||
|
{ width: 180px; }
|
||||||
|
|
||||||
|
#actSignature
|
||||||
|
{ color: #55f;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: underline; }
|
||||||
|
|
||||||
|
#actSignature.disabled
|
||||||
|
{ color: #999;
|
||||||
|
cursor: default;
|
||||||
|
text-decoration: none; }
|
||||||
|
|
||||||
|
#signatureDialog
|
||||||
|
{ position: absolute;
|
||||||
|
left: 10px;
|
||||||
|
width: auto !important;
|
||||||
|
right: 10px;
|
||||||
|
height: 200px;
|
||||||
|
top: 50px; }
|
||||||
|
|
||||||
|
#signature
|
||||||
|
{ width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
margin: 0px auto;
|
||||||
|
margin-bottom: 10px; }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* -*- Mode: java; tab-width: 2; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
|
|
||||||
var isSieveScriptsEnabled = false;
|
var isSieveScriptsEnabled = false;
|
||||||
var filters = [];
|
var filters = [];
|
||||||
|
var mailAccounts = null;
|
||||||
|
var dialogs = {};
|
||||||
|
|
||||||
function savePreferences(sender) {
|
function savePreferences(sender) {
|
||||||
var sendForm = true;
|
var sendForm = true;
|
||||||
|
@ -45,6 +45,8 @@ function savePreferences(sender) {
|
||||||
$("sieveFilters").setValue(jsonFilters.toJSON());
|
$("sieveFilters").setValue(jsonFilters.toJSON());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
saveMailAccounts();
|
||||||
|
|
||||||
if (sendForm)
|
if (sendForm)
|
||||||
$("mainForm").submit();
|
$("mainForm").submit();
|
||||||
|
|
||||||
|
@ -77,7 +79,7 @@ function prototypeIfyFilters() {
|
||||||
return newFilters;
|
return newFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _setupEvents(enable) {
|
function _setupEvents() {
|
||||||
var widgets = [ "timezone", "shortDateFormat", "longDateFormat",
|
var widgets = [ "timezone", "shortDateFormat", "longDateFormat",
|
||||||
"timeFormat", "weekStartDay", "dayStartTime", "dayEndTime",
|
"timeFormat", "weekStartDay", "dayStartTime", "dayEndTime",
|
||||||
"firstWeek", "messageCheck", "subscribedFoldersOnly",
|
"firstWeek", "messageCheck", "subscribedFoldersOnly",
|
||||||
|
@ -85,10 +87,7 @@ function _setupEvents(enable) {
|
||||||
for (var i = 0; i < widgets.length; i++) {
|
for (var i = 0; i < widgets.length; i++) {
|
||||||
var widget = $(widgets[i]);
|
var widget = $(widgets[i]);
|
||||||
if (widget) {
|
if (widget) {
|
||||||
if (enable)
|
|
||||||
widget.observe("change", onChoiceChanged);
|
widget.observe("change", onChoiceChanged);
|
||||||
else
|
|
||||||
widget.stopObserving("change", onChoiceChanged);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,8 +105,6 @@ function _setupEvents(enable) {
|
||||||
function onChoiceChanged(event) {
|
function onChoiceChanged(event) {
|
||||||
var hasChanged = $("hasChanged");
|
var hasChanged = $("hasChanged");
|
||||||
hasChanged.value = "1";
|
hasChanged.value = "1";
|
||||||
|
|
||||||
_setupEvents(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDefaultEmailAddresses(event) {
|
function addDefaultEmailAddresses(event) {
|
||||||
|
@ -139,14 +136,10 @@ function initPreferences() {
|
||||||
if (filtersListWrapper) {
|
if (filtersListWrapper) {
|
||||||
isSieveScriptsEnabled = true;
|
isSieveScriptsEnabled = true;
|
||||||
}
|
}
|
||||||
_setupEvents(true);
|
_setupEvents();
|
||||||
if (typeof (initAdditionalPreferences) != "undefined")
|
if (typeof (initAdditionalPreferences) != "undefined")
|
||||||
initAdditionalPreferences();
|
initAdditionalPreferences();
|
||||||
|
|
||||||
if ($("signature")) {
|
|
||||||
onComposeMessagesTypeChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
var table = $("categoriesList");
|
var table = $("categoriesList");
|
||||||
if (table) {
|
if (table) {
|
||||||
resetCategoriesColors(null);
|
resetCategoriesColors(null);
|
||||||
|
@ -172,11 +165,12 @@ function initPreferences() {
|
||||||
if (button)
|
if (button)
|
||||||
button.observe("click", addDefaultEmailAddresses);
|
button.observe("click", addDefaultEmailAddresses);
|
||||||
|
|
||||||
var button = $("changePasswordBtn");
|
button = $("changePasswordBtn");
|
||||||
if (button)
|
if (button)
|
||||||
button.observe("click", onChangePasswordClick);
|
button.observe("click", onChangePasswordClick);
|
||||||
|
|
||||||
initSieveFilters();
|
initSieveFilters();
|
||||||
|
initMailAccounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
function initSieveFilters() {
|
function initSieveFilters() {
|
||||||
|
@ -376,6 +370,316 @@ function updateFilterFromEditor(filterId, filter) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* mail accounts */
|
||||||
|
function initMailAccounts() {
|
||||||
|
var mailAccountsJSON = $("mailAccountsJSON");
|
||||||
|
mailAccounts = mailAccountsJSON.value.evalJSON();
|
||||||
|
|
||||||
|
var mailAccountsList = $("mailAccountsList");
|
||||||
|
if (mailAccountsList) {
|
||||||
|
var li = createMailAccountLI(mailAccounts[0], true);
|
||||||
|
mailAccountsList.appendChild(li);
|
||||||
|
for (var i = 1; i < mailAccounts.length; i++) {
|
||||||
|
li = createMailAccountLI(mailAccounts[i]);
|
||||||
|
mailAccountsList.appendChild(li);
|
||||||
|
}
|
||||||
|
var lis = mailAccountsList.childNodesWithTag("li");
|
||||||
|
lis[0].readOnly = true;
|
||||||
|
lis[0].selectElement();
|
||||||
|
|
||||||
|
var button = $("mailAccountAdd");
|
||||||
|
if (button) {
|
||||||
|
button.observe("click", onMailAccountAdd);
|
||||||
|
}
|
||||||
|
button = $("mailAccountDelete");
|
||||||
|
if (button) {
|
||||||
|
button.observe("click", onMailAccountDelete);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var info = $("accountInfo");
|
||||||
|
var inputs = info.getElementsByTagName("input");
|
||||||
|
for (var i = 0; i < inputs.length; i++) {
|
||||||
|
$(inputs[i]).observe("change", onMailAccountInfoChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
info = $("identityInfo");
|
||||||
|
inputs = info.getElementsByTagName("input");
|
||||||
|
for (var i = 0; i < inputs.length; i++) {
|
||||||
|
$(inputs[i]).observe("change", onMailIdentityInfoChange);
|
||||||
|
}
|
||||||
|
$("actSignature").observe("click", onMailIdentitySignatureClick);
|
||||||
|
displayMailAccount(mailAccounts[0], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailAccountInfoChange(event) {
|
||||||
|
this.mailAccount[this.name] = this.value;
|
||||||
|
var hasChanged = $("hasChanged");
|
||||||
|
hasChanged.value = "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailIdentityInfoChange(event) {
|
||||||
|
if (!this.mailAccount["identities"]) {
|
||||||
|
this.mailAccount["identities"] = [{}];
|
||||||
|
}
|
||||||
|
var identity = this.mailAccount["identities"][0];
|
||||||
|
identity[this.name] = this.value;
|
||||||
|
var hasChanged = $("hasChanged");
|
||||||
|
hasChanged.value = "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailIdentitySignatureClick(event) {
|
||||||
|
if (!this.readOnly) {
|
||||||
|
var dialogId = "signatureDialog";
|
||||||
|
var dialog = dialogs[dialogId];
|
||||||
|
if (!dialog) {
|
||||||
|
var label = _("Please enter your signature below:");
|
||||||
|
var fields = createElement("p");
|
||||||
|
fields.appendChild(createElement("textarea", "signature"));
|
||||||
|
fields.appendChild(createElement("br"));
|
||||||
|
fields.appendChild(createButton("okBtn", _("OK"),
|
||||||
|
onMailIdentitySignatureOK));
|
||||||
|
fields.appendChild(createButton("cancelBtn", _("Cancel"),
|
||||||
|
onBodyClickDialogHandler.bind(document.body, dialogId)));
|
||||||
|
var dialog = createDialog(dialogId,
|
||||||
|
_("Signature"),
|
||||||
|
label,
|
||||||
|
fields,
|
||||||
|
"none");
|
||||||
|
document.body.appendChild(dialog);
|
||||||
|
dialog.show();
|
||||||
|
dialogs[dialogId] = dialog;
|
||||||
|
|
||||||
|
if ($("composeMessagesType").value != 0) {
|
||||||
|
CKEDITOR.replace('signature',
|
||||||
|
{ height: "70px",
|
||||||
|
toolbar: [['Bold', 'Italic', '-', 'Link',
|
||||||
|
'Font','FontSize','-','TextColor',
|
||||||
|
'BGColor']
|
||||||
|
],
|
||||||
|
language: localeCode,
|
||||||
|
scayt_sLang: localeCode });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialog.mailAccount = this.mailAccount;
|
||||||
|
if (!this.mailAccount["identities"]) {
|
||||||
|
this.mailAccount["identities"] = [{}];
|
||||||
|
}
|
||||||
|
var identity = this.mailAccount["identities"][0];
|
||||||
|
var area = $("signature");
|
||||||
|
area.value = identity["signature"];
|
||||||
|
dialog.show();
|
||||||
|
$("bgDialogDiv").show();
|
||||||
|
if (!CKEDITOR.instances["signature"])
|
||||||
|
area.focus();
|
||||||
|
event.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailIdentitySignatureOK(event) {
|
||||||
|
var dialog = $("signatureDialog");
|
||||||
|
var mailAccount = dialog.mailAccount;
|
||||||
|
if (!mailAccount["identities"]) {
|
||||||
|
mailAccount["identities"] = [{}];
|
||||||
|
}
|
||||||
|
var identity = mailAccount["identities"][0];
|
||||||
|
|
||||||
|
var content = (CKEDITOR.instances["signature"]
|
||||||
|
? CKEDITOR.instances["signature"].getData()
|
||||||
|
: $("signature").value);
|
||||||
|
identity["signature"] = content;
|
||||||
|
displayAccountSignature(mailAccount);
|
||||||
|
dialog.hide();
|
||||||
|
$("bgDialogDiv").hide();
|
||||||
|
dialog.mailAccount = null;
|
||||||
|
var hasChanged = $("hasChanged");
|
||||||
|
hasChanged.value = "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMailAccountLI(mailAccount, readOnly) {
|
||||||
|
var li = createElement("li");
|
||||||
|
li.appendChild(document.createTextNode(mailAccount["name"]));
|
||||||
|
li.observe("click", onMailAccountEntryClick);
|
||||||
|
li.observe("mousedown", onRowClick);
|
||||||
|
if (readOnly) {
|
||||||
|
li.addClassName("readonly");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var editionCtlr = new RowEditionController();
|
||||||
|
editionCtlr.attachToRowElement(li);
|
||||||
|
editionCtlr.notifyNewValueCallback = function(ignore, newValue) {
|
||||||
|
mailAccount["name"] = newValue;
|
||||||
|
};
|
||||||
|
li.editionController = editionCtlr;
|
||||||
|
}
|
||||||
|
li.mailAccount = mailAccount;
|
||||||
|
|
||||||
|
return li;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailAccountEntryClick(event) {
|
||||||
|
displayMailAccount(this.mailAccount, this.readOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
function displayMailAccount(mailAccount, readOnly) {
|
||||||
|
var editor = $("mailAccountEditor");
|
||||||
|
var inputs = editor.getElementsByTagName("input");
|
||||||
|
for (var i = 0; i < inputs.length; i++) {
|
||||||
|
inputs[i].disabled = readOnly;
|
||||||
|
inputs[i].mailAccount = mailAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
var encryption = "none";
|
||||||
|
|
||||||
|
var encRadioValues = [ "none", "ssl", "tls" ];
|
||||||
|
if (mailAccount["encryption"]) {
|
||||||
|
encryption = mailAccount["encryption"];
|
||||||
|
}
|
||||||
|
var form = $("mainForm");
|
||||||
|
form.setRadioValue("encryption", encRadioValues.indexOf(encryption));
|
||||||
|
|
||||||
|
var port;
|
||||||
|
if (mailAccount["port"]) {
|
||||||
|
port = mailAccount["port"];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (encryption == "ssl") {
|
||||||
|
port = 993;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
port = 143;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$("port").value = port;
|
||||||
|
|
||||||
|
$("serverName").value = mailAccount["serverName"];
|
||||||
|
$("userName").value = mailAccount["userName"];
|
||||||
|
$("password").value = mailAccount["password"];
|
||||||
|
|
||||||
|
var identity = (mailAccount["identities"]
|
||||||
|
? mailAccount["identities"][0]
|
||||||
|
: {} );
|
||||||
|
$("fullName").value = identity["fullName"] || "";
|
||||||
|
$("email").value = identity["email"] || "";
|
||||||
|
|
||||||
|
displayAccountSignature(mailAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function displayAccountSignature(mailAccount) {
|
||||||
|
var actSignature = $("actSignature");
|
||||||
|
actSignature.mailAccount = mailAccount;
|
||||||
|
|
||||||
|
var actSignatureValue;
|
||||||
|
var identity = (mailAccount["identities"]
|
||||||
|
? mailAccount["identities"][0]
|
||||||
|
: {} );
|
||||||
|
var value = identity["signature"];
|
||||||
|
if (value && value.length > 0) {
|
||||||
|
if (value.length < 30) {
|
||||||
|
actSignatureValue = value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
actSignatureValue = value.substr(0, 30) + "...";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
actSignatureValue = _("(Click to create)");
|
||||||
|
}
|
||||||
|
while (actSignature.firstChild) {
|
||||||
|
actSignature.removeChild(actSignature.firstChild);
|
||||||
|
}
|
||||||
|
actSignature.appendChild(document.createTextNode(actSignatureValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMailAccount() {
|
||||||
|
var firstIdentity = mailAccounts[0]["identities"][0];
|
||||||
|
var newIdentity = {};
|
||||||
|
for (var k in firstIdentity) {
|
||||||
|
newIdentity[k] = firstIdentity[k];
|
||||||
|
}
|
||||||
|
delete newIdentity["isDefault"];
|
||||||
|
|
||||||
|
var newMailAccount = { name: _("New Mail Account"),
|
||||||
|
serverName: "mailserver",
|
||||||
|
userName: UserLogin,
|
||||||
|
password: "",
|
||||||
|
identities: [ newIdentity ] };
|
||||||
|
|
||||||
|
return newMailAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailAccountAdd(event) {
|
||||||
|
var newMailAccount = createMailAccount();
|
||||||
|
mailAccounts.push(newMailAccount);
|
||||||
|
var li = createMailAccountLI(newMailAccount);
|
||||||
|
var mailAccountsList = $("mailAccountsList");
|
||||||
|
mailAccountsList.appendChild(li);
|
||||||
|
var selection = mailAccountsList.getSelectedNodes();
|
||||||
|
for (var i = 0; i < selection.length; i++) {
|
||||||
|
selection[i].deselect();
|
||||||
|
}
|
||||||
|
displayMailAccount(newMailAccount, false);
|
||||||
|
li.selectElement();
|
||||||
|
li.editionController.startEditing();
|
||||||
|
event.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMailAccountDelete(event) {
|
||||||
|
var mailAccountsList = $("mailAccountsList");
|
||||||
|
var selection = mailAccountsList.getSelectedNodes();
|
||||||
|
if (selection.length > 0) {
|
||||||
|
var li = selection[0];
|
||||||
|
if (!li.readOnly) {
|
||||||
|
li.deselect();
|
||||||
|
li.editionController = null;
|
||||||
|
var next = li.next();
|
||||||
|
if (!next) {
|
||||||
|
next = li.previous();
|
||||||
|
}
|
||||||
|
mailAccountsList.removeChild(li);
|
||||||
|
var index = mailAccounts.indexOf(li.mailAccount);
|
||||||
|
mailAccounts.splice(index, 1);
|
||||||
|
next.selectElement();
|
||||||
|
displayMailAccount(next.mailAccount, next.readOnly);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveMailAccounts() {
|
||||||
|
/* This removal enables us to avoid a few warning from SOPE for the inputs
|
||||||
|
that were created dynamically. */
|
||||||
|
var editor = $("mailAccountEditor");
|
||||||
|
editor.parentNode.removeChild(editor);
|
||||||
|
|
||||||
|
compactMailAccounts();
|
||||||
|
var mailAccountsJSON = $("mailAccountsJSON");
|
||||||
|
mailAccountsJSON.value = mailAccounts.toJSON();
|
||||||
|
}
|
||||||
|
|
||||||
|
function compactMailAccounts() {
|
||||||
|
for (var i = 1; i < mailAccounts.length; i++) {
|
||||||
|
var account = mailAccounts[i];
|
||||||
|
var encryption = account["encryption"];
|
||||||
|
if (encryption) {
|
||||||
|
if (encryption == "none") {
|
||||||
|
delete account["encryption"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
encryption = "none";
|
||||||
|
}
|
||||||
|
var port = account["port"];
|
||||||
|
if (port) {
|
||||||
|
if ((encryption == "ssl" && port == 993)
|
||||||
|
|| port == 143) {
|
||||||
|
delete account["port"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* categories */
|
||||||
function resetTableActions() {
|
function resetTableActions() {
|
||||||
var r = $$("TABLE#categoriesList tbody tr");
|
var r = $$("TABLE#categoriesList tbody tr");
|
||||||
for (var i = 0; i < r.length; i++) {
|
for (var i = 0; i < r.length; i++) {
|
||||||
|
@ -490,7 +794,7 @@ function onReplyPlacementListChange() {
|
||||||
function onComposeMessagesTypeChange(event) {
|
function onComposeMessagesTypeChange(event) {
|
||||||
// var textArea = $('signature');
|
// var textArea = $('signature');
|
||||||
|
|
||||||
if ($("composeMessagesType").value == 0) /* text */ {
|
if (this.value == 0) /* text */ {
|
||||||
if (CKEDITOR.instances["signature"]) {
|
if (CKEDITOR.instances["signature"]) {
|
||||||
var content = CKEDITOR.instances["signature"].getData();
|
var content = CKEDITOR.instances["signature"].getData();
|
||||||
var htmlEditorWidget = $('cke_signature');
|
var htmlEditorWidget = $('cke_signature');
|
||||||
|
@ -502,10 +806,10 @@ function onComposeMessagesTypeChange(event) {
|
||||||
textArea.style.visibility = "";
|
textArea.style.visibility = "";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!CKEDITOR.instances["signature"]) {
|
if ($("signature") && !CKEDITOR.instances["signature"]) {
|
||||||
CKEDITOR.replace('signature',
|
CKEDITOR.replace('signature',
|
||||||
{
|
{
|
||||||
height: "290px",
|
height: "70px",
|
||||||
toolbar: [['Bold', 'Italic', '-', 'Link',
|
toolbar: [['Bold', 'Italic', '-', 'Link',
|
||||||
'Font','FontSize','-','TextColor',
|
'Font','FontSize','-','TextColor',
|
||||||
'BGColor']
|
'BGColor']
|
||||||
|
|
Loading…
Reference in a new issue