diff --git a/.gitignore b/.gitignore index 04a616227..0214a5472 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ */*/obj/ */obj/ .scss-lint-config.yml_ +ActiveSync/ActiveSync.SOGo Documentation/*.docbook Documentation/*.pdf SoObjects/SOGo/SOGo.framework/ @@ -20,11 +21,8 @@ UI/WebServerResources/bower_components/ UI/WebServerResources/css/ UI/WebServerResources/css/styles.css UI/WebServerResources/css/styles.css.map -UI/WebServerResources/js/Common.js* -UI/WebServerResources/js/Contacts.js* -UI/WebServerResources/js/Mailer.js* -UI/WebServerResources/js/Preferences.js* -UI/WebServerResources/js/Scheduler.js* +UI/WebServerResources/js/*.js +UI/WebServerResources/js/*.js.map UI/WebServerResources/js/vendor/ UI/WebServerResources/node_modules/ UI/WebServerResources/scss/.sass-cache/ diff --git a/ActiveSync/GNUmakefile.preamble b/ActiveSync/GNUmakefile.preamble index c302ad8be..545cdf46b 100644 --- a/ActiveSync/GNUmakefile.preamble +++ b/ActiveSync/GNUmakefile.preamble @@ -1 +1,4 @@ -# compilation settings +ifeq ($(HAS_LIBRARY_ssl),yes) +ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 +BUNDLE_LIBS += -lcrypto +endif diff --git a/ActiveSync/NGDOMElement+ActiveSync.m b/ActiveSync/NGDOMElement+ActiveSync.m index e9294e573..61a6015d0 100644 --- a/ActiveSync/NGDOMElement+ActiveSync.m +++ b/ActiveSync/NGDOMElement+ActiveSync.m @@ -101,7 +101,7 @@ static NSArray *asElementArray = nil; int i, count; if (!asElementArray) - asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", nil]; + asElementArray = [[NSArray alloc] initWithObjects: @"Attendee", @"Category", @"Exception", nil]; data = [NSMutableDictionary dictionary]; diff --git a/ActiveSync/NGVCard+ActiveSync.m b/ActiveSync/NGVCard+ActiveSync.m index eb62b9722..45fb93142 100644 --- a/ActiveSync/NGVCard+ActiveSync.m +++ b/ActiveSync/NGVCard+ActiveSync.m @@ -48,11 +48,42 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation NGVCard (ActiveSync) +// +// This function is called for each elements which can be ghosted according to specs. +// https://msdn.microsoft.com/en-us/library/gg650908%28v=exchg.80%29.aspx +// +- (BOOL) _isGhosted: (NSString *) element + inContext: (WOContext *) context +{ + NSArray *supportedElements; + + supportedElements = [context objectForKey: @"SupportedElements"]; + + // If the client does not include a Supported element in the initial Sync command request for + // a folder, then all of the elements that can be ghosted are considered not ghosted. + if (!supportedElements) + return NO; + + // If the client includes an empty Supported element in the initial Sync command request for + // a folder, then all elements that can be ghosted are considered ghosted. + if (![supportedElements count]) + return YES; + + // If the client includes a Supported element that contains child elements in the initial + // Sync command request for a folder, then each child element of that Supported element is + // considered not ghosted. All elements that can be ghosted that are not included as child + // elements of the Supported element are considered ghosted. + if (!([supportedElements indexOfObject: element] == NSNotFound)) + return YES; + + return NO; +} + - (NSString *) activeSyncRepresentationInContext: (WOContext *) context { NSArray *emails, *addresses, *categories, *elements; CardElement *n, *homeAdr, *workAdr; - NSMutableString *s; + NSMutableString *s, *a; NSString *url; id o; @@ -63,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ((o = [n flattenedValueAtIndex: 0 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; - + if ((o = [n flattenedValueAtIndex: 1 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -146,16 +177,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([addresses count]) { homeAdr = [addresses objectAtIndex: 0]; + a = [NSMutableString string]; if ((o = [homeAdr flattenedValueAtIndex: 2 forKey: @""])) - [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; + [a appendString: o]; + + if ((o = [homeAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length]) + [a appendFormat: @"\n%@", o]; + [s appendFormat: @"%@", [a activeSyncRepresentationInContext: context]]; + if ((o = [homeAdr flattenedValueAtIndex: 3 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; if ((o = [homeAdr flattenedValueAtIndex: 4 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; - + if ((o = [homeAdr flattenedValueAtIndex: 5 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -171,9 +208,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([addresses count]) { workAdr = [addresses objectAtIndex: 0]; + a = [NSMutableString string]; if ((o = [workAdr flattenedValueAtIndex: 2 forKey: @""])) - [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; + [a appendString: o]; + + if ((o = [workAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length]) + [a appendFormat: @"\n%@", o]; + + [s appendFormat: @"%@", [a activeSyncRepresentationInContext: context]]; if ((o = [workAdr flattenedValueAtIndex: 3 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -217,6 +260,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inContext: (WOContext *) context { CardElement *element; + NSMutableArray *addressLines; id o; // Contact's note @@ -226,6 +270,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Categories if ((o = [theValues objectForKey: @"Categories"]) && [o length]) [self setCategories: o]; + else + [[self children] removeObjectsInArray: [self childrenWithTag: @"Categories"]]; // Birthday if ((o = [theValues objectForKey: @"Birthday"])) @@ -233,6 +279,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. o = [o calendarDate]; [self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d" timeZone: nil locale: nil]]; } + else if (![self _isGhosted: @"Birthday" inContext: context]) + { + [self setBday: @""]; + } + // // Business address information @@ -244,18 +295,48 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // BusinessCountry // element = [self elementWithTag: @"adr" ofType: @"work"]; - [element setSingleValue: @"" - atIndex: 1 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessStreet"] - atIndex: 2 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessCity"] - atIndex: 3 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessState"] - atIndex: 4 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessPostalCode"] - atIndex: 5 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessCountry"] - atIndex: 6 forKey: @""]; + + if ((o = [theValues objectForKey: @"BusinessStreet"]) || ![self _isGhosted: @"BusinessStreet" inContext: context]) + { + addressLines = [NSMutableArray arrayWithArray: [o componentsSeparatedByString: @"\n"]]; + + [element setSingleValue: @"" + atIndex: 1 forKey: @""]; + [element setSingleValue: [addressLines count] ? [addressLines objectAtIndex: 0] : @"" + atIndex: 2 forKey: @""]; + + // Extended address line. If there are more than 2 address lines we add them to the extended address line. + if ([addressLines count] > 1) + { + [addressLines removeObjectAtIndex: 0]; + [element setSingleValue: [addressLines componentsJoinedByString: @" "] + atIndex: 1 forKey: @""]; + } + } + + if ((o = [theValues objectForKey: @"BusinessCity"]) || ![self _isGhosted: @"BusinessCity" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessCity"] + atIndex: 3 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessState"]) || ![self _isGhosted: @"BusinessState" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessState"] + atIndex: 4 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessPostalCode"]) || ![self _isGhosted: @"BusinessPostalCode" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessPostalCode"] + atIndex: 5 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessCountry"]) || ![self _isGhosted: @"BusinessCountry" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessCountry"] + atIndex: 6 forKey: @""]; + } // // Home address information @@ -267,35 +348,69 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // HomeCountry // element = [self elementWithTag: @"adr" ofType: @"home"]; - [element setSingleValue: @"" - atIndex: 1 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeStreet"] - atIndex: 2 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeCity"] - atIndex: 3 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeState"] - atIndex: 4 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomePostalCode"] - atIndex: 5 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeCountry"] - atIndex: 6 forKey: @""]; + + if ((o = [theValues objectForKey: @"HomeStreet"]) || ![self _isGhosted: @"HomeStreet" inContext: context]) + { + addressLines = [NSMutableArray arrayWithArray: [o componentsSeparatedByString: @"\n"]]; + + [element setSingleValue: @"" + atIndex: 1 forKey: @""]; + [element setSingleValue: [addressLines count] ? [addressLines objectAtIndex: 0] : @"" + atIndex: 2 forKey: @""]; + + // Extended address line. If there are more then 2 address lines we add them to the extended address line. + if ([addressLines count] > 1) + { + [addressLines removeObjectAtIndex: 0]; + [element setSingleValue: [addressLines componentsJoinedByString: @" "] + atIndex: 1 forKey: @""]; + } + } + + if ((o = [theValues objectForKey: @"HomeCity"]) || ![self _isGhosted: @"HomeCity" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeCity"] + atIndex: 3 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomeState"]) || ![self _isGhosted: @"HomeState" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeState"] + atIndex: 4 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomePostalCode"]) || ![self _isGhosted: @"HomePostalCode" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomePostalCode"] + atIndex: 5 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomeCountry"]) || ![self _isGhosted: @"HomeCountry" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeCountry"] + atIndex: 6 forKey: @""]; + } // Company's name if ((o = [theValues objectForKey: @"CompanyName"])) [self setOrg: o units: nil]; + else if (![self _isGhosted: @"CompanyName" inContext: context]) + [self setOrg: @"" units: nil]; // Department if ((o = [theValues objectForKey: @"Department"])) [self setOrg: nil units: [NSArray arrayWithObjects:o,nil]]; + else if (![self _isGhosted: @"Department" inContext: context]) + [self setOrg: nil units: [NSArray arrayWithObjects:@"",nil]]; // Email addresses - if ((o = [theValues objectForKey: @"Email1Address"])) + if ((o = [theValues objectForKey: @"Email1Address"]) || ![self _isGhosted: @"Email1Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"work"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; } - if ((o = [theValues objectForKey: @"Email2Address"])) + if ((o = [theValues objectForKey: @"Email2Address"]) || ![self _isGhosted: @"Email2Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"home"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; @@ -303,7 +418,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOGo currently only supports 2 email addresses ... but AS clients might send 3 // FIXME: revise this when the GUI revamp is done in SOGo - if ((o = [theValues objectForKey: @"Email3Address"])) + if ((o = [theValues objectForKey: @"Email3Address"]) || ![self _isGhosted: @"Email3Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"three"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; @@ -313,45 +428,62 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // MiddleName // Suffix (II) // Title (Mr.) - [self setFn: [theValues objectForKey: @"FileAs"]]; + if ((o = [theValues objectForKey: @"FileAs"]) || ![self _isGhosted: @"FileAs" inContext: context]) + [self setFn: [theValues objectForKey: @"FileAs"]]; [self setNWithFamily: [theValues objectForKey: @"LastName"] given: [theValues objectForKey: @"FirstName"] additional: nil prefixes: nil suffixes: nil]; // IM information - [[self uniqueChildWithTag: @"x-aim"] - setSingleValue: [theValues objectForKey: @"IMAddress"] - forKey: @""]; + if ((o = [theValues objectForKey: @"IMAddress"]) || ![self _isGhosted: @"IMAddress" inContext: context]) + [[self uniqueChildWithTag: @"x-aim"] + setSingleValue: [theValues objectForKey: @"IMAddress"] + forKey: @""]; // // Phone numbrrs // - element = [self elementWithTag: @"tel" ofType: @"work"]; - [element setSingleValue: [theValues objectForKey: @"BusinessPhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"BusinessPhoneNumber"]) || ![self _isGhosted: @"BusinessPhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"work"]; + [element setSingleValue: [theValues objectForKey: @"BusinessPhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"home"]; - [element setSingleValue: [theValues objectForKey: @"HomePhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"HomePhoneNumber"]) || ![self _isGhosted: @"HomePhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"home"]; + [element setSingleValue: [theValues objectForKey: @"HomePhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"cell"]; - [element setSingleValue: [theValues objectForKey: @"MobilePhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"MobilePhoneNumber"]) || ![self _isGhosted: @"MobilePhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"cell"]; + [element setSingleValue: [theValues objectForKey: @"MobilePhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"fax"]; - [element setSingleValue: [theValues objectForKey: @"BusinessFaxNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"BusinessFaxNumber"]) || ![self _isGhosted: @"BusinessFaxNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"fax"]; + [element setSingleValue: [theValues objectForKey: @"BusinessFaxNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"pager"]; - [element setSingleValue: [theValues objectForKey: @"PagerNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"PagerNumber"]) || ![self _isGhosted: @"PagerNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"pager"]; + [element setSingleValue: [theValues objectForKey: @"PagerNumber"] forKey: @""]; + } // Job's title - if ((o = [theValues objectForKey: @"JobTitle"])) + if ((o = [theValues objectForKey: @"JobTitle"]) || ![self _isGhosted: @"JobTitle" inContext: context]) [self setTitle: o]; // WebPage (work) - if ((o = [theValues objectForKey: @"WebPage"])) + if ((o = [theValues objectForKey: @"WebPage"]) || ![self _isGhosted: @"WebPage" inContext: context]) [[self elementWithTag: @"url" ofType: @"work"] setSingleValue: o forKey: @""]; - if ((o = [theValues objectForKey: @"NickName"])) + if ((o = [theValues objectForKey: @"NickName"]) || ![self _isGhosted: @"NickName" inContext: context]) [self setNickname: o]; if ((o = [theValues objectForKey: @"Picture"])) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 950ee4769..836d9ee79 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -112,13 +112,73 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation SOGoActiveSyncDispatcher (Sync) +- (void) _setOrUnsetSyncRequest: (BOOL) set + collections: (NSArray *) collections +{ + SOGoCacheGCSObject *o; + NSNumber *processIdentifier; + NSString *key; + int i; + + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + + o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil useCache: NO]; + [o setObjectType: ActiveSyncGlobalCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + if (set) + { + RELEASE(syncRequest); + syncRequest = [NSNumber numberWithUnsignedInt: [[NSCalendarDate date] timeIntervalSince1970]]; + RETAIN(syncRequest); + + [[o properties] setObject: syncRequest forKey: @"SyncRequest"]; + + for (i = 0; i < [collections count]; i++) + { + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[[collections objectAtIndex: i] getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + [[o properties] setObject: processIdentifier forKey: key]; + } + } + else + { + [[o properties] removeObjectForKey: @"SyncRequest"]; + for (i = 0; i < [collections count]; i++) + { + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[[collections objectAtIndex: i] getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + [[o properties] removeObjectForKey: key]; + } + } + + [o save]; +} + - (void) _setFolderMetadata: (NSDictionary *) theFolderMetadata forKey: (NSString *) theFolderKey { + NSNumber *processIdentifier, *processIdentifierInCache; SOGoCacheGCSObject *o; NSDictionary *values; NSString *key; + if ([theFolderKey hasPrefix: @"folder"]) + key = [NSString stringWithFormat: @"SyncRequest+mail/%@", [theFolderKey substringFromIndex: 6]]; + else + key = [NSString stringWithFormat: @"SyncRequest+%@", theFolderKey]; + + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + processIdentifierInCache = [[self globalMetadataForDevice] objectForKey: key]; + + // Don't update the cache if another request is processing the same collection. + if (!([processIdentifierInCache isEqual: processIdentifier])) + { + if (debugOn) + [self logWithFormat: @"EAS - We lost our lock - discard folder cache update %@ %@ <> %@", key, processIdentifierInCache, processIdentifier]; + + return; + } + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theFolderKey]; values = [theFolderMetadata copy]; @@ -132,7 +192,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; + [[o properties] removeObjectForKey: @"InitialLoadSequence"]; [[o properties] addEntriesFromDictionary: values]; [o save]; @@ -159,7 +221,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *nameInCache; if (theFolderType == ActiveSyncMailFolder) - nameInCache= [[[theCollection mailAccountFolder] imapFolderGUIDs] objectForKey: [theCollection nameInContainer]]; + nameInCache = [imapFolderGUIDS objectForKey: [theCollection nameInContainer]]; else { NSString *component_name; @@ -170,7 +232,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else component_name = @"vtodo"; - nameInCache= [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]; + nameInCache = [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]; } return nameInCache; @@ -403,8 +465,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; - [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; - + if ([syncCache objectForKey: serverId]) + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; } break; case ActiveSyncEventFolder: @@ -414,27 +476,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; - [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; - + if ([syncCache objectForKey: serverId]) + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; } break; case ActiveSyncMailFolder: default: { NSDictionary *result; - NSString *modseq; + NSNumber *modseq; [sogoObject takeActiveSyncValues: allChanges inContext: context]; result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]]; modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"]; - if (modseq) - [syncCache setObject: modseq forKey: serverId]; + if (modseq && [syncCache objectForKey: serverId]) + [syncCache setObject: [modseq stringValue] forKey: serverId]; } } - [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; [theBuffer appendString: @""]; @@ -577,36 +639,44 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. withFilterType: (NSCalendarDate *) theFilterType inBuffer: (NSMutableString *) theBuffer lastServerKey: (NSString **) theLastServerKey - + defaultInterval: (unsigned int) theDefaultInterval { NSMutableDictionary *folderMetadata, *dateCache, *syncCache; NSString *davCollectionTagToStore; NSAutoreleasePool *pool; NSMutableString *s; - BOOL more_available; + BOOL cleanup_needed, more_available; int i, max; s = [NSMutableString string]; - - more_available = NO; + cleanup_needed = more_available = NO; folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; - // If this is a new sync operation, DateCache and SyncCache needs to be deleted + // If this is a new sync operation, DateCache and SyncCache need to be deleted if ([theSyncKey isEqualToString: @"-1"]) { [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"]; [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"]; } + else if ([folderMetadata objectForKey: @"SyncKey"] && !([theSyncKey isEqualToString: [folderMetadata objectForKey: @"SyncKey"]])) + { + // The syncKey received from the client doesn't match the syncKey we have in cache - client might have missed a response. + // We need to cleanup this mess. + [self logWithFormat: @"Cache cleanup needed for device %@ - user: %@ syncKey: %@ cache: %@", [context objectForKey: @"DeviceId"], [[context activeUser] login], theSyncKey, [folderMetadata objectForKey: @"SyncKey"]]; + cleanup_needed = YES; + } syncCache = [folderMetadata objectForKey: @"SyncCache"]; dateCache = [folderMetadata objectForKey: @"DateCache"]; if ((theFolderType == ActiveSyncMailFolder || theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder) && - !([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize or maximumSyncReponseSize - !([theSyncKey isEqualToString: @"-1"]) && // new sync operation - theFilterType) + (cleanup_needed || + ( !([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize or maximumSyncReponseSize + !([folderMetadata objectForKey: @"InitialLoadSequence"]))) && + theFilterType + ) { NSArray *allKeys; NSString *key; @@ -622,14 +692,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([[dateCache objectForKey:key] compare: theFilterType] == NSOrderedAscending) { - [s appendString: @""]; - [s appendFormat: @"%@", key]; - [s appendString: @""]; + if ([syncCache objectForKey:key]) + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete %@", key]; - [syncCache removeObjectForKey: key]; - [dateCache removeObjectForKey: key]; + [s appendString: @""]; + [s appendFormat: @"%@", key]; + [s appendString: @""]; + + [syncCache removeObjectForKey: key]; + //[dateCache removeObjectForKey: key]; - softdelete_count++; + softdelete_count++; + } + else if (cleanup_needed) + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete cleanup %@", key]; + + // With this we make sure that a SoftDelete is set again on next sync. + [syncCache setObject: @"0" forKey: key]; + } + else + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete final delete %@", key]; + + // Now we are save to remove the dateCache entry. + [dateCache removeObjectForKey: key]; + } } if (softdelete_count >= theWindowSize || (theMaxSyncResponseSize > 0 && [s length] >= theMaxSyncResponseSize)) @@ -656,8 +748,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // if ([theSyncKey isEqualToString: [theCollection davCollectionTag]] && !([s length])) return; - - more_available = NO; davCollectionTagToStore = [theCollection davCollectionTag]; @@ -673,7 +763,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSDictionary *component; NSArray *allComponents; - BOOL updated; + BOOL updated, initialLoadInProgress; int deleted, return_count; if (theFolderType == ActiveSyncContactFolder) @@ -683,13 +773,76 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else component_name = @"vtodo"; - allComponents = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType]; - allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending:YES], nil]]; + initialLoadInProgress = NO; + + if ([theSyncKey isEqualToString: @"-1"]) + [folderMetadata setObject: davCollectionTagToStore forKey: @"InitialLoadSequence"]; + + if ([folderMetadata objectForKey: @"InitialLoadSequence"]) + { + if ([theSyncKey intValue] < [[folderMetadata objectForKey: @"InitialLoadSequence"] intValue]) + initialLoadInProgress = YES; + else + [folderMetadata removeObjectForKey: @"InitialLoadSequence"]; + } + + allComponents = [theCollection syncTokenFieldsWithProperties: nil + matchingSyncToken: theSyncKey + fromDate: theFilterType + initialLoad: initialLoadInProgress]; + allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObject: [[[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending: YES] autorelease]]]; // Check for the WindowSize max = [allComponents count]; + // + // Cleanup the mess + // + if (cleanup_needed) + { + + for (i = 0; i < max; i++) + { + component = [allComponents objectAtIndex: i]; + deleted = [[component objectForKey: @"c_deleted"] intValue]; + + if (!deleted && ![[component objectForKey: @"c_component"] isEqualToString: component_name]) + continue; + + uid = [[component objectForKey: @"c_name"] sanitizedServerIdWithType: theFolderType]; + + if (deleted) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: DELETE %@", uid]; + + // For deletes we have to recreate a cache entry to make sure the delete is sent again. + [syncCache setObject: @"0" forKey: uid]; + } + else + { + if ([syncCache objectForKey: uid] && [[component objectForKey: @"c_creationdate"] intValue] > [theSyncKey intValue]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: ADD %@", uid]; + + // Cleanup the cache to make sure the add is sent again. + [syncCache removeObjectForKey: uid]; + [dateCache removeObjectForKey: uid]; + } + else + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: CHANGE %@", uid]; + + // Update cache entry to make sure the change is sent again. + [syncCache setObject: @"0" forKey: uid]; + } + } + } + } + return_count = 0; for (i = 0; i < max; i++) @@ -847,12 +1000,38 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSMutableArray *allCacheObjects, *sortedBySequence; SOGoMailObject *mailObject; - NSArray *allMessages; + NSArray *allMessages, *a; + NSString *firstUIDAdded; - int j, k, return_count; - BOOL found_in_cache; + int j, k, return_count, highestmodseq; + BOOL found_in_cache, initialLoadInProgress; - allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType]; + initialLoadInProgress = NO; + found_in_cache = NO; + firstUIDAdded = nil; + + if ([theSyncKey isEqualToString: @"-1"]) + { + highestmodseq = 0; + + a = [[theCollection davCollectionTag] componentsSeparatedByString: @"-"]; + [folderMetadata setObject: [a objectAtIndex: 1] forKey: @"InitialLoadSequence"]; + } + else + { + a = [theSyncKey componentsSeparatedByString: @"-"]; + highestmodseq = [[a objectAtIndex: 1] intValue]; + } + + if ([folderMetadata objectForKey: @"InitialLoadSequence"]) + { + if (highestmodseq < [[folderMetadata objectForKey: @"InitialLoadSequence"] intValue]) + initialLoadInProgress = YES; + else + [folderMetadata removeObjectForKey: @"InitialLoadSequence"]; + } + + allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType initialLoad: initialLoadInProgress]; max = [allMessages count]; allCacheObjects = [NSMutableArray array]; @@ -860,7 +1039,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for (i = 0; i < max; i++) { [allCacheObjects addObject: [SOGoSyncCacheObject syncCacheObjectWithUID: [[[allMessages objectAtIndex: i] allKeys] lastObject] - sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]]; + sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]]; } sortedBySequence = [[NSMutableArray alloc] initWithDictionary: syncCache]; @@ -869,15 +1048,82 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [allCacheObjects sortUsingSelector: @selector(compareSequence:)]; - //NSLog(@"sortedBySequence (%d) - lastObject: %@", [sortedBySequence count], [sortedBySequence lastObject]); - //NSLog(@"allCacheObjects (%d) - lastObject: %@", [allCacheObjects count], [allCacheObjects lastObject]); + if (debugOn) + { + [self logWithFormat: @"EAS - sortedBySequence (%d) - lastObject: %@", [sortedBySequence count], [sortedBySequence lastObject]]; + [self logWithFormat: @"EAS - allCacheObjects (%d) - lastObject: %@", [allCacheObjects count], [allCacheObjects lastObject]]; + } lastCacheObject = [sortedBySequence lastObject]; + + // + // Cleanup the mess + // + if (cleanup_needed) + { + NSMutableArray *sortedByUID; + int uidnextFromCache; + + sortedByUID = [[NSMutableArray alloc] initWithDictionary: syncCache]; + [sortedByUID sortUsingSelector: @selector(compareUID:)]; + + // Get the uid from SyncKey in cache. The uid is the first uid added to cache by the last sync request. + a = [[folderMetadata objectForKey: @"SyncKey"] componentsSeparatedByString: @"-"]; + uidnextFromCache = [[a objectAtIndex: 0] intValue]; + + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: from uid: %d to uid: %d", uidnextFromCache, [[[sortedByUID lastObject] uid] intValue]]; + + // Remove all entries from cache beginning with the first uid added by the last sync request. + for (j = uidnextFromCache; j <= [[[sortedByUID lastObject] uid] intValue]; j++) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: ADD %d", j]; + + [syncCache removeObjectForKey: [NSString stringWithFormat:@"%d", j]]; + [dateCache removeObjectForKey: [NSString stringWithFormat:@"%d", j]]; + } + + RELEASE(sortedByUID); + + for (j = 0; j < [allCacheObjects count]; j++) + { + // Update the modseq in cache, sence othersie, it would be identical to the modseq from server + //and we would skip the cache when generating the response. + if ([syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]] && ![[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: CHANGE %@", [[allCacheObjects objectAtIndex: j] uid]]; + + [syncCache setObject: @"0" forKey:[[allCacheObjects objectAtIndex: j] uid]]; + } + else if ([[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: DELETE %@", [[allCacheObjects objectAtIndex: j] uid]]; + + // For deletes we have to recreate a cache entry to have the included in the response. + [syncCache setObject: @"0" forKey:[[allCacheObjects objectAtIndex: j] uid]]; + } + } + } - if ([folderMetadata objectForKey: @"MoreAvailable"] && lastCacheObject) + if (!cleanup_needed && + [folderMetadata objectForKey: @"MoreAvailable"] && + lastCacheObject && + !([[lastCacheObject sequence] isEqual: @"0"])) // Sequence 0 is set during cache cleanup. { for (j = 0; j < [allCacheObjects count]; j++) { + if (([[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]] && [syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]]) || + (![[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]] && ![syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]])) + { + // We need to continue with adds or deletes from here. + found_in_cache = YES; + j--; + break; + } + if ([[lastCacheObject uid] isEqual: [[allCacheObjects objectAtIndex: j] uid]]) { // Found out where we're at, let's continue from there... @@ -892,12 +1138,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (found_in_cache) k = j+1; else - { - k = 0; - j = 0; - } - - //NSLog(@"found in cache: %d k = %d", found_in_cache, k); + j = k = 0; + + if (debugOn) + [self logWithFormat: @"EAS - found in cache: %d k = %d", found_in_cache, k]; return_count = 0; @@ -911,20 +1155,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *lastSequence; more_available = YES; - lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? @"1" : [aCacheObject sequence]); - *theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", [aCacheObject uid], lastSequence]; - //NSLog(@"Reached windowSize - lastUID will be: %@", *theLastServerKey); + if (!firstUIDAdded) + { + a = [davCollectionTagToStore componentsSeparatedByString: @"-"]; + firstUIDAdded = [a objectAtIndex: 0]; + RETAIN(firstUIDAdded); + } + lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? [NSString stringWithFormat:@"%d", highestmodseq] : [aCacheObject sequence]); + *theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", firstUIDAdded, lastSequence]; + + if (debugOn) + [self logWithFormat: @"EAS - Reached windowSize - lastUID will be: %@", *theLastServerKey]; + DESTROY(pool); break; } aCacheObject = [allCacheObjects objectAtIndex: k]; - // If found in cache, it's either a Change or a Delete + if (debugOn) + [self logWithFormat: @"EAS - Dealing with cacheObject: %@", aCacheObject]; + + // If found in cache, it's either a Change or a Delete operation. if ([syncCache objectForKey: [aCacheObject uid]]) { if ([[aCacheObject sequence] isEqual: [NSNull null]]) { + if (debugOn) + [self logWithFormat: @"EAS - DELETE!"]; + // Deleted [s appendString: @""]; [s appendFormat: @"%@", [aCacheObject uid]]; @@ -942,9 +1201,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mailObject = [theCollection lookupName: [aCacheObject uid] inContext: context acquire: 0]; - + if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]]) { + if (debugOn) + [self logWithFormat: @"EAS - CHANGE!"]; + [s appendString: @""]; [s appendFormat: @"%@", [aCacheObject uid]]; [s appendString: @""]; @@ -960,6 +1222,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { + if (debugOn) + [self logWithFormat: @"EAS - ADD!"]; + // Added if (![[aCacheObject sequence] isEqual: [NSNull null]]) { @@ -992,11 +1257,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]]; [dateCache setObject: [NSCalendarDate date] forKey: [aCacheObject uid]]; + + // Save the frist UID we add. We will use it for the synckey late. + if (!firstUIDAdded) + { + firstUIDAdded = [aCacheObject uid]; + RETAIN(firstUIDAdded); + if (debugOn) + [self logWithFormat: @"EAS - first uid added %@", firstUIDAdded]; + } + return_count++; } else { - //NSLog(@"skipping old deleted UID: %@", [aCacheObject uid]); + if (debugOn) + [self logWithFormat: @"EAS - skipping old deleted UID: %@", [aCacheObject uid]]; } } @@ -1005,16 +1281,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (more_available) { - [folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"]; + [folderMetadata setObject: [NSNumber numberWithInt: YES] forKey: @"MoreAvailable"]; [folderMetadata setObject: *theLastServerKey forKey: @"SyncKey"]; } else { [folderMetadata removeObjectForKey: @"MoreAvailable"]; - [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; + + if (firstUIDAdded) + { + a = [davCollectionTagToStore componentsSeparatedByString: @"-"]; + [folderMetadata setObject: [[NSString alloc] initWithFormat: @"%@-%@", firstUIDAdded, [a objectAtIndex: 1]] forKey: @"SyncKey"]; + RELEASE(firstUIDAdded); + } + else + [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; } [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; + RELEASE(*theLastServerKey); } // default: @@ -1113,15 +1398,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. changeDetected: (BOOL *) changeDetected maxSyncResponseSize: (int) theMaxSyncResponseSize { - NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache; - SOGoMicrosoftActiveSyncFolderType folderType; - id collection, value; - - NSMutableString *changeBuffer, *commandsBuffer; - BOOL getChanges, first_sync; - unsigned int windowSize, v, status; + NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache, *folderKey; NSMutableDictionary *folderMetadata, *folderOptions; - + NSMutableArray *supportedElements, *supportedElementNames; + NSMutableString *changeBuffer, *commandsBuffer; + id collection, value; + + SOGoMicrosoftActiveSyncFolderType folderType; + unsigned int windowSize, v, status, i; + BOOL getChanges, first_sync; + changeBuffer = [NSMutableString string]; commandsBuffer = [NSMutableString string]; @@ -1144,7 +1430,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //[theBuffer appendString: @""]; return; } - + + // + // First check if we have any concurrent Sync requests going on for this device. + // If we do and we are still within our maximumSyncInterval, we let our EAS + // device know to retry. + // + folderKey = [self _getNameInCache: collection withType: folderType]; + folderMetadata = [self _folderMetadataForKey: folderKey]; + // We check for a window size, default to 100 if not specfied or out of bounds windowSize = [[[(id)[theDocumentElement getElementsByTagName: @"WindowSize"] lastObject] textValue] intValue]; @@ -1169,13 +1463,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. first_sync = NO; - folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; - if ([syncKey isEqualToString: @"0"]) { davCollectionTag = @"-1"; first_sync = YES; *changeDetected = YES; + + supportedElementNames = [[[NSMutableArray alloc] init] autorelease]; + value = [theDocumentElement getElementsByTagName: @"Supported"]; + + if ([value count]) + { + supportedElements = (id)[[value lastObject] childNodes]; + + if ([supportedElements count]) + { + for (i = 0; i < [supportedElements count]; i++) + { + if ([[supportedElements objectAtIndex: i] nodeType] == DOM_ELEMENT_NODE) + [supportedElementNames addObject: [[supportedElements objectAtIndex: i] tagName]]; + } + } + + [folderMetadata setObject: supportedElementNames forKey: @"SupportedElements"]; + + [self _setFolderMetadata: folderMetadata forKey: folderKey]; + + if (debugOn) + [self logWithFormat: @"EAS - %d %@: supportedElements saved: %@", [supportedElements count], [collection nameInContainer], supportedElementNames]; + } } else if ((![syncKey isEqualToString: @"-1"]) && !([folderMetadata objectForKey: @"SyncCache"])) { @@ -1200,6 +1516,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // By default, send MIME mails. See #3146 for details. if (!bodyPreferenceType) bodyPreferenceType = @"4"; + + mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"]; + + if (!mimeSupport) + mimeSupport = @"1"; } else { @@ -1225,11 +1546,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { folderOptions = [[NSDictionary alloc] initWithObjectsAndKeys: mimeSupport, @"MIMESupport", bodyPreferenceType, @"BodyPreferenceType", nil]; [folderMetadata setObject: folderOptions forKey: @"FolderOptions"]; - [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: collection withType: folderType]]; + [self _setFolderMetadata: folderMetadata forKey: folderKey]; } } [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; + [context setObject: mimeSupport forKey: @"MIMESupport"]; + [context setObject: [folderMetadata objectForKey: @"SupportedElements"] forKey: @"SupportedElements"]; // // We process the commands from the request @@ -1268,10 +1591,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. withFolderType: folderType withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]] inBuffer: changeBuffer - lastServerKey: &lastServerKey]; + lastServerKey: &lastServerKey + defaultInterval: [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncInterval]]; } - folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; + folderMetadata = [self _folderMetadataForKey: folderKey]; // If we got any changes or if we have applied any commands // let's regenerate our SyncKey based on the collection tag. @@ -1430,19 +1754,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOGoSystemDefaults *defaults; id aCollection; NSMutableString *output, *s; + NSMutableDictionary *globalMetadata; + NSNumber *syncRequestInCache, *processIdentifier; + NSString *key; NSArray *allCollections; NSData *d; - int i, j, defaultInterval, heartbeatInterval, internalInterval, maxSyncResponseSize; + int i, j, defaultInterval, heartbeatInterval, internalInterval, maxSyncResponseSize, total_sleep; BOOL changeDetected; - changeDetected = NO; - - maxSyncResponseSize = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncResponseSize]; - // We initialize our output buffer output = [[NSMutableString alloc] init]; + defaults = [SOGoSystemDefaults sharedSystemDefaults]; + defaultInterval = [defaults maximumSyncInterval]; + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + + allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"]; + [output appendString: @""]; [output appendString: @""]; [output appendString: @""]; @@ -1457,12 +1786,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [output appendString: @""]; d = [[output dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; [theResponse setContent: d]; + RELEASE(output); return; } + + // Let other requests know about the collections we are dealing with. + [self _setOrUnsetSyncRequest: YES collections: allCollections]; - defaults = [SOGoSystemDefaults sharedSystemDefaults]; + changeDetected = NO; + maxSyncResponseSize = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncResponseSize]; heartbeatInterval = [[[(id)[theDocumentElement getElementsByTagName: @"HeartbeatInterval"] lastObject] textValue] intValue]; - defaultInterval = [defaults maximumSyncInterval]; internalInterval = [defaults internalSyncInterval]; // If the request doesn't contain "HeartbeatInterval" there is no reason to delay the response. @@ -1472,17 +1805,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // We check to see if our heartbeat interval falls into the supported ranges. if (heartbeatInterval > defaultInterval || heartbeatInterval < 1) { + int limit; // Interval is too long, inform the client. heartbeatInterval = defaultInterval; - // Outlook doesn't like this... - //[output appendFormat: @"%d", defaultInterval]; + // When Status = 14, the Wait interval is specified in minutes while + // defaultInterval is specifed in seconds. Adjust accordinlgy. + limit = defaultInterval/60; + if (limit < 1) limit = 1; + if (limit > 59) limit = 59; + //[output appendFormat: @"%d", limit]; //[output appendFormat: @"%d", 14]; } [output appendString: @""]; - - allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"]; // We enter our loop detection change for (i = 0; i < (heartbeatInterval/internalInterval); i++) @@ -1492,25 +1828,62 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for (j = 0; j < [allCollections count]; j++) { aCollection = [allCollections objectAtIndex: j]; - + [self processSyncCollection: aCollection inBuffer: s changeDetected: &changeDetected maxSyncResponseSize: maxSyncResponseSize]; - if (maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize) + // Don't return a response if another Sync is waiting. + globalMetadata = [self globalMetadataForDevice]; + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[aCollection getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + + if (!([[globalMetadata objectForKey: key] isEqual: processIdentifier])) + { + if (debugOn) + [self logWithFormat: @"EAS - Discard response %@", [self globalMetadataForDevice]]; + + [theResponse setStatus: 503]; + + RELEASE(output); + return; + } + + if ((maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize)) break; } if (changeDetected) { - [self logWithFormat: @"Change detected, we push the content."]; + [self logWithFormat: @"Change detected during Sync, we push the content."]; break; } else if (heartbeatInterval > 1) { - [self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval]; - sleep(internalInterval); + total_sleep = 0; + + while (total_sleep < internalInterval) + { + // We check if we must break the current synchronization since an other Sync + // has just arrived. + syncRequestInCache = [[self globalMetadataForDevice] objectForKey: @"SyncRequest"]; + if (!([syncRequest isEqualToNumber: syncRequestInCache])) + { + if (debugOn) + [self logWithFormat: @"EAS - Heartbeat stopped %@", [self globalMetadataForDevice]]; + + // Make sure we end the heardbeat-loop. + heartbeatInterval = internalInterval = 1; + + break; + } + else + { + [self logWithFormat: @"Sleeping %d seconds while detecting changes in Sync...", internalInterval-total_sleep]; + sleep(5); + total_sleep += 5; + } + } } else { @@ -1518,8 +1891,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } - - // Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0 oterwise send an empty response. + // + // Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0, + // otherwise send an empty response. + // if (changeDetected || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"12.0"]) { // We always return the last generated response. diff --git a/ActiveSync/SOGoActiveSyncDispatcher.h b/ActiveSync/SOGoActiveSyncDispatcher.h index d72073ad1..76b4acbe7 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.h +++ b/ActiveSync/SOGoActiveSyncDispatcher.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2014, Inverse inc. +Copyright (c) 2014-2015, Inverse inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -31,15 +31,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SOGoActiveSyncConstants.h" +@class NSCalendarDate; @class NSException; +@class NSMutableDictionary; @class NSURL; +@class NSNumber; @interface SOGoActiveSyncDispatcher : NSObject { NSURL *folderTableURL; + NSDictionary *imapFolderGUIDS; id context; + + NSNumber *syncRequest; + + BOOL debugOn; } +- (NSMutableDictionary *) globalMetadataForDevice; + - (id) collectionFromId: (NSString *) theCollectionId type: (SOGoMicrosoftActiveSyncFolderType) theFolderType; diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 9be2ebe62..eae24fcf3 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -30,8 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SOGoActiveSyncDispatcher.h" #import +#import #import #import +#if GNUSTEP_BASE_MINOR_VERSION >= 21 +#import +#endif #import #import #import @@ -134,6 +138,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#ifdef HAVE_OPENSSL +#include +#include +#include +#endif + @interface SOGoActiveSyncDispatcher (Sync) - (NSMutableDictionary *) _folderMetadataForKey: (NSString *) theFolderKey; @@ -143,20 +153,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation SOGoActiveSyncDispatcher -static BOOL debugOn = NO; - - (id) init { [super init]; debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled]; folderTableURL = nil; + imapFolderGUIDS = nil; + syncRequest = nil; return self; } - (void) dealloc { RELEASE(folderTableURL); + RELEASE(imapFolderGUIDS); + RELEASE(syncRequest); [super dealloc]; } @@ -169,16 +181,16 @@ static BOOL debugOn = NO; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; - [[o properties] removeAllObjects]; - [[o properties] addEntriesFromDictionary: [NSDictionary dictionaryWithObject: theSyncKey forKey: @"FolderSyncKey"]]; + [[o properties] setObject: theSyncKey + forKey: @"FolderSyncKey"]; [o save]; } -- (NSMutableDictionary *) _globalMetadataForDevice +- (NSMutableDictionary *) globalMetadataForDevice { SOGoCacheGCSObject *o; - o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil]; + o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil useCache: NO]; [o setObjectType: ActiveSyncGlobalCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; @@ -202,7 +214,7 @@ static BOOL debugOn = NO; if (theFilter) { o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theCollectionId] inContainer: nil]; - [o setObjectType: ActiveSyncGlobalCacheObject]; + [o setObjectType: ActiveSyncFolderCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; @@ -229,23 +241,27 @@ static BOOL debugOn = NO; SOGoMailAccounts *accountsFolder; SOGoMailAccount *accountFolder; SOGoUserFolder *userFolder; - NSDictionary *imapGUIDs; - userFolder = [[context activeUser] homeFolderInContext: context]; - accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; - accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - - // Get the GUID of the IMAP folder - imapGUIDs = [accountFolder imapFolderGUIDs]; - - //return [[imapGUIDs allKeysForObject: theIdToTranslate] objectAtIndex: 0]; - return [[[imapGUIDs allKeysForObject: [NSString stringWithFormat: @"folder%@", theIdToTranslate]] objectAtIndex: 0] substringFromIndex: 6] ; + if (!imapFolderGUIDS) + { + userFolder = [[context activeUser] homeFolderInContext: context]; + accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; + accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; + + // Get the GUID of the IMAP folder + imapFolderGUIDS = [accountFolder imapFolderGUIDs]; + [imapFolderGUIDS retain]; + + } + + return [[[imapFolderGUIDS allKeysForObject: [NSString stringWithFormat: @"folder%@", theIdToTranslate]] objectAtIndex: 0] substringFromIndex: 6] ; } return theIdToTranslate; } + // // // @@ -691,26 +707,25 @@ static BOOL debugOn = NO; - (void) processFolderSync: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType; + NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType, *operation; + NSMutableDictionary *cachedGUIDs, *metadata; + NSMutableArray *folders, *processedFolders; NSDictionary *folderMetadata, *imapGUIDs; NSArray *allFoldersMetadata, *allKeys; - NSMutableDictionary *cachedGUIDs, *metadata; SOGoMailAccounts *accountsFolder; SOGoMailAccount *accountFolder; NSMutableString *s, *commands; SOGoUserFolder *userFolder; - NSMutableArray *folders, *processedFolders; SoSecurityManager *sm; SOGoCacheGCSObject *o; id currentFolder; NSData *d; int status, command_count, i, type, fi, count; - BOOL first_sync; sm = [SoSecurityManager sharedSecurityManager]; - metadata = [self _globalMetadataForDevice]; + metadata = [self globalMetadataForDevice]; syncKey = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue]; s = [NSMutableString string]; @@ -824,32 +839,38 @@ static BOOL debugOn = NO; } else { - if ([cKey rangeOfString: @"vevent" options: NSCaseInsensitiveSearch].location != NSNotFound || - [cKey rangeOfString: @"vtodo" options: NSCaseInsensitiveSearch].location != NSNotFound) - folderType = @"Calendar"; - else - folderType = @"Contacts"; + if ([cKey rangeOfString: @"vevent" options: NSCaseInsensitiveSearch].location != NSNotFound || + [cKey rangeOfString: @"vtodo" options: NSCaseInsensitiveSearch].location != NSNotFound) + folderType = @"Calendar"; + else + folderType = @"Contacts"; - if ([ cKey rangeOfString: @"/"].location != NSNotFound) - currentFolder = [[[[context activeUser] homeFolderInContext: context] lookupName: folderType inContext: context acquire: NO] + if ([ cKey rangeOfString: @"/"].location != NSNotFound) + currentFolder = [[[[context activeUser] homeFolderInContext: context] lookupName: folderType inContext: context acquire: NO] lookupName: [cKey substringFromIndex: [cKey rangeOfString: @"/"].location+1] inContext: context acquire: NO]; - // remove the folder from device if it doesn't exists or it has not the proper permissions - if (!currentFolder || - [sm validatePermission: SoPerm_DeleteObjects - onObject: currentFolder - inContext: context] || - [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles - onObject: currentFolder - inContext: context]) - { - [commands appendFormat: @"%@", [cKey stringByEscapingURL] ]; - command_count++; - [o destroy]; - } - } - } - } + // We skip personal GCS folders - we always want to synchronize these + if ([currentFolder isKindOfClass: [SOGoGCSFolder class]] && + [[currentFolder nameInContainer] isEqualToString: @"personal"]) + continue; + + // Remove the folder from device if it doesn't exist, we don't want to sync it, or it doesn't have the proper permissions + if (!currentFolder || + ![currentFolder synchronize] || + [sm validatePermission: SoPerm_DeleteObjects + onObject: currentFolder + inContext: context] || + [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles + onObject: currentFolder + inContext: context]) + { + [commands appendFormat: @"%@", [cKey stringByEscapingURL] ]; + command_count++; + [o destroy]; + } + } + } + } // Handle addition and changes for (i = 0; i < [allFoldersMetadata count]; i++) @@ -937,7 +958,9 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; + [[o properties] removeObjectForKey: @"InitialLoadSequence"]; [o save]; command_count++; @@ -946,17 +969,29 @@ static BOOL debugOn = NO; personalFolderName = [[[context activeUser] personalCalendarFolderInContext: context] nameInContainer]; folders = [[[[[context activeUser] homeFolderInContext: context] lookupName: @"Calendar" inContext: context acquire: NO] subFolders] mutableCopy]; + [folders autorelease]; + [folders addObjectsFromArray: [[[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" inContext: context acquire: NO] subFolders]]; - // Inside this loop we remove all the folder without write/delete permissions + // We remove all the folders that aren't GCS-ones, that we don't want to synchronize and + // the ones without write/delete permissions. count = [folders count]-1; for (; count >= 0; count--) { - if ([sm validatePermission: SoPerm_DeleteObjects - onObject: [folders objectAtIndex: count] + currentFolder = [folders objectAtIndex: count]; + + // We skip personal GCS folders - we always want to synchronize these + if ([currentFolder isKindOfClass: [SOGoGCSFolder class]] && + [[currentFolder nameInContainer] isEqualToString: @"personal"]) + continue; + + if (![currentFolder isKindOfClass: [SOGoGCSFolder class]] || + ![currentFolder synchronize] || + [sm validatePermission: SoPerm_DeleteObjects + onObject: currentFolder inContext: context] || [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles - onObject: [folders objectAtIndex: count] + onObject: currentFolder inContext: context]) { [folders removeObjectAtIndex: count]; @@ -964,7 +999,6 @@ static BOOL debugOn = NO; } count = [folders count]-1; - NSString *operation; for (fi = 0; fi <= count ; fi++) { @@ -1022,7 +1056,9 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; + [[o properties] removeObjectForKey: @"InitialLoadSequence"]; } [o save]; @@ -1045,7 +1081,9 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; + [[o properties] removeObjectForKey: @"InitialLoadSequence"]; } [o save]; @@ -1204,7 +1242,7 @@ static BOOL debugOn = NO; filter = [NSCalendarDate dateFromFilterType: [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"FilterType"] lastObject] textValue]]; syncKey = [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"SyncKey"] lastObject] textValue]; - allMessages = [currentCollection syncTokenFieldsWithProperties: nil matchingSyncToken: syncKey fromDate: filter]; + allMessages = [currentCollection syncTokenFieldsWithProperties: nil matchingSyncToken: syncKey fromDate: filter initialLoad: NO]; count = [allMessages count]; @@ -1254,7 +1292,7 @@ static BOOL debugOn = NO; - (void) processItemOperations: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *fileReference, *realCollectionId, *serverId, *bodyPreferenceType, *collectionId; + NSString *fileReference, *realCollectionId, *serverId, *bodyPreferenceType, *mimeSupport, *collectionId; NSMutableString *s; NSArray *fetchRequests; id aFetch; @@ -1367,6 +1405,8 @@ static BOOL debugOn = NO; serverId = [[(id)[theDocumentElement getElementsByTagName: @"ServerId"] lastObject] textValue]; bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue]; [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; + mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue]; + [context setObject: mimeSupport forKey: @"MIMESupport"]; currentCollection = [self collectionFromId: realCollectionId type: folderType]; @@ -2024,13 +2064,13 @@ static BOOL debugOn = NO; if ([foldersWithChanges count]) { - [self logWithFormat: @"Change detected, we push the content."]; + [self logWithFormat: @"Change detected using Ping, we let the EAS client know to send a Sync."]; status = 2; break; } else { - [self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval]; + [self logWithFormat: @"Sleeping %d seconds while detecting changes in Ping...", internalInterval]; sleep(internalInterval); } } @@ -2094,6 +2134,123 @@ static BOOL debugOn = NO; [theResponse setContent: d]; } +// +// +// +#ifdef HAVE_OPENSSL +- (unsigned int) validateCert: (NSString *) theCert +{ + NSData *d; + + const unsigned char *data; + X509_STORE_CTX *ctx; + X509_LOOKUP *lookup; + X509_STORE *store; + X509 *cert; + + BOOL success; + size_t len; + int rc; + + success = NO; + + d = [theCert dataByDecodingBase64]; + data = (unsigned char *)[d bytes]; + len = [d length]; + + cert = d2i_X509(NULL, &data, len); + if (!cert) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: d2i_X509 failed", [context objectForKey: @"DeviceId"]]; + return 17; + } + + store = X509_STORE_new(); + OpenSSL_add_all_algorithms(); + + if (store) + { + lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); + if (lookup) + { + X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT); + lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir()); + if (lookup) + { + X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT); + ERR_clear_error(); + success = YES; + } + } + } + + if (!success) + { + if (store) + { + X509_STORE_free(store); + store = NULL; + } + } + + ctx = X509_STORE_CTX_new(); + if (!ctx) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: X509_STORE_CTX_new failed", [context objectForKey: @"DeviceId"]]; + return 17; + } + + if (X509_STORE_CTX_init(ctx, store, cert, NULL) != 1) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: X509_STORE_CTX_init failed", [context objectForKey: @"DeviceId"]]; + X509_STORE_CTX_free(ctx); + return 17; + } + + rc = X509_verify_cert(ctx); + X509_STORE_CTX_free(ctx); + X509_free(cert); + + if (rc) + { + return 1; + } + else + { + [self logWithFormat: @"EAS - validateCert failed for device %@: err=%d", [context objectForKey: @"DeviceId"], X509_STORE_CTX_get_error(ctx)]; + return 17; + } +} +#else +- (unsigned int) validateCert: (NSString *) theCert +{ + return 17; +} +#endif + +- (void) processValidateCert: (id ) theDocumentElement + inResponse: (WOResponse *) theResponse +{ + NSMutableString *s; + NSString *cert; + NSData *d; + + cert = [[(id)[theDocumentElement getElementsByTagName: @"Certificate"] lastObject] textValue]; + + s = [NSMutableString string]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @"1"]; + [s appendFormat: @"%d", [self validateCert: cert]]; + [s appendString: @""]; + + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; + + [theResponse setContent: d]; +} + + // // // @@ -2410,39 +2567,100 @@ static BOOL debugOn = NO; NGMimeMessageParser *parser; NGMimeMessage *message; NSException *error; - NSData *data; - NGMutableHashMap *map; - NGMimeMessage *messageToSend; - NGMimeMessageGenerator *generator; + NSMutableData *data; + NSData *new_from_header; NSDictionary *identity; NSString *fullName, *email; + + const char *bytes; + int i, e, len; + BOOL found_header; // We get the mail's data - data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding]; + data = [NSMutableData dataWithData: [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding]]; // We extract the recipients parser = [[NGMimeMessageParser alloc] init]; message = [parser parsePartFromData: data]; RELEASE(parser); - map = [NGHashMap hashMapWithDictionary: [message headers]]; - identity = [[context activeUser] primaryIdentity]; fullName = [identity objectForKey: @"fullName"]; email = [identity objectForKey: @"email"]; + if ([fullName length]) - [map setObject: [NSString stringWithFormat: @"%@ <%@>", fullName, email] forKey: @"from"]; + new_from_header = [[NSString stringWithFormat: @"From: %@ <%@>\r\n", [fullName asQPSubjectString: @"utf-8"], email] dataUsingEncoding:NSUTF8StringEncoding]; else - [map setObject: email forKey: @"from"]; + new_from_header = [[NSString stringWithFormat: @"From: %@\r\n", email] dataUsingEncoding:NSUTF8StringEncoding]; - messageToSend = [[[NGMimeMessage alloc] initWithHeader: map] autorelease]; + bytes = [data bytes]; + len = [data length]; + i = 0; + found_header = NO; - [messageToSend setBody: [message body]]; + // Search for the from-header + while (i < len) + { + if (i == 0 && + (*bytes == 'f' || *bytes == 'F') && + (*(bytes+1) == 'r' || *(bytes+1) == 'R') && + (*(bytes+2) == 'o' || *(bytes+2) == 'O') && + (*(bytes+3) == 'm' || *(bytes+3) == 'M') && + (*(bytes+4) == ':')) + { + found_header = YES; + break; + } + + if (((*bytes == '\r') && (*(bytes+1) == '\n')) && + (*(bytes+2) == 'f' || *(bytes+2) == 'F') && + (*(bytes+3) == 'r' || *(bytes+3) == 'R') && + (*(bytes+4) == 'o' || *(bytes+4) == 'O') && + (*(bytes+5) == 'm' || *(bytes+5) == 'M') && + (*(bytes+6) == ':')) + { + found_header = YES; + i = i + 2; // \r\n + bytes = bytes + 2; + break; + } + + bytes++; + i++; + } + + // We search for the first \r\n AFTER the From: header to get the length of the string to replace. + e = i; + while (e < len) + { + if ((*bytes == '\r') && (*(bytes+1) == '\n')) + { + e = e + 2; + break; + } + + bytes++; + e++; + } + + // Update/Add the From header in the MIMEBody of the SendMail request. + // Any other way to modify the mail body would break s/mime emails. + if (found_header) + { + // Change the From header + [data replaceBytesInRange: NSMakeRange(i, (NSUInteger)(e-i)) + withBytes: [new_from_header bytes] + length: [new_from_header length]]; + } + else + { + // Add a From header + [data replaceBytesInRange: NSMakeRange(0, 0) + withBytes: [new_from_header bytes] + length: [new_from_header length]]; + } - generator = [[[NGMimeMessageGenerator alloc] init] autorelease]; - data = [generator generateMimeFromPart: messageToSend]; - error = [self _sendMail: data recipients: [message allRecipients] saveInSentItems: ([(id)[theDocumentElement getElementsByTagName: @"SaveInSentItems"] count] ? YES : NO)]; @@ -2619,6 +2837,11 @@ static BOOL debugOn = NO; [map setObject: [mailObject messageId] forKey: @"in-reply-to"]; references = [[[[[mailObject mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] mutableCopy] autorelease]; + + // If there is no References: header, initialize it with In-Reply-To. + if ([mailObject inReplyTo] && ![references count]) + references = [NSMutableArray arrayWithObject: [mailObject inReplyTo]]; + if ([references count] > 0) { // If there are more than ten identifiers listed, we eliminate the second one. @@ -2934,9 +3157,25 @@ static BOOL debugOn = NO; options: NSCaseInsensitiveSearch].location == NSNotFound) { NSString *value; - - value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil]; - s = [NSString stringWithFormat: @"Date: %@\n%@", value, [theRequest contentAsString]]; +#if GNUSTEP_BASE_MINOR_VERSION < 21 + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" + timeZone: [NSTimeZone timeZoneWithName: @"GMT"] + locale: nil]; +#else + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" + timeZone: [NSTimeZone timeZoneWithName: @"GMT"] + locale: [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr", + @"May", @"Jun", @"Jul", @"Aug", + @"Sep", @"Oct", @"Nov", @"Dec", nil], + @"NSShortMonthNameArray", + [NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu", + @"Fri", @"Sat", nil], + @"NSShortWeekDayNameArray", + nil]]; + +#endif + s = [NSString stringWithFormat: @"Date: %@\r\n%@", value, [theRequest contentAsString]]; } else { @@ -3026,8 +3265,7 @@ static BOOL debugOn = NO; return nil; urlString = [[user domainDefaults] folderInfoURL]; - parts = [[urlString componentsSeparatedByString: @"/"] - mutableCopy]; + parts = [[urlString componentsSeparatedByString: @"/"] mutableCopy]; [parts autorelease]; if ([parts count] == 5) { diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 6b2e1b03a..434e6b9c9 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -472,18 +472,46 @@ struct GlobalObjectId { return d; } +// +// +// +- (BOOL) _sanitinizeNeeded: (NSArray *) theParts +{ + NSString *encoding, *charset; + int i; + + for (i = 0; i < [theParts count]; i++) + { + encoding = [[theParts objectAtIndex: i ] objectForKey: @"encoding"]; + charset = [[[theParts objectAtIndex: i ] objectForKey: @"parameterList"] objectForKey: @"charset"]; + if (encoding && [encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame && + charset && ![charset caseInsensitiveCompare: @"utf-8"] == NSOrderedSame + && ![charset caseInsensitiveCompare: @"us-ascii"] == NSOrderedSame) + { + return YES; + } + + if ([self _sanitinizeNeeded: [[theParts objectAtIndex: i ] objectForKey: @"parts"]]) + return YES; + } + + return NO; +} + // // // - (NSData *) _preferredBodyDataUsingType: (int) theType + mimeSupport: (int) theMimeSupport nativeType: (int *) theNativeType { NSString *type, *subtype, *encoding; NSData *d; + BOOL isSMIME, sanitinizeNeeded; type = [[[self bodyStructure] valueForKey: @"type"] lowercaseString]; subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; - + isSMIME = NO; d = nil; // We determine the native type @@ -494,8 +522,14 @@ struct GlobalObjectId { else if ([type isEqualToString: @"multipart"]) *theNativeType = 4; + if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && theMimeSupport > 0) + { + *theNativeType = 4; + isSMIME = YES; + } + // We get the right part based on the preference - if (theType == 1 || theType == 2) + if ((theType == 1 || theType == 2) && !isSMIME) { if ([type isEqualToString: @"text"] && ![subtype isEqualToString: @"calendar"]) { @@ -536,12 +570,12 @@ struct GlobalObjectId { d = [self _preferredBodyDataInMultipartUsingType: theType nativeTypeFound: theNativeType]; } } - else if (theType == 4) + else if (theType == 4 || isSMIME) { - // We sanitize the content *ONLY* for Outlook clients and if the content-transfer-encoding is 8bit. Outlook has strange issues - // with quoted-printable/base64 encoded text parts. It just doesn't decode them. - encoding = [[self lookupInfoForBodyPart: @""] objectForKey: @"encoding"]; - if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"] || ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame)) + // We sanitize the content if the content-transfer-encoding is 8bit and charset is not utf-8 or us-ascii. + sanitinizeNeeded = [self _sanitinizeNeeded: [NSArray arrayWithObject: [self bodyStructure]]]; + + if (sanitinizeNeeded && !isSMIME) d = [self _sanitizedMIMEMessage]; else d = [self content]; @@ -656,16 +690,18 @@ struct GlobalObjectId { { NSData *d, *globalObjId; NSArray *attachmentKeys; - NSMutableString *s; - - uint32_t v; - NSString *p; - - id value; - iCalCalendar *calendar; + NSString *p, *subtype; + NSMutableString *s; + id value; - int preferredBodyType, nativeBodyType; + int preferredBodyType, mimeSupport, nativeBodyType; + uint32_t v; + + subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; + + preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue]; + mimeSupport = [[context objectForKey: @"MIMESupport"] intValue]; s = [NSMutableString string]; @@ -862,7 +898,12 @@ struct GlobalObjectId { else { // MesssageClass and ContentClass - [s appendFormat: @"%@", @"IPM.Note"]; + if ([subtype isEqualToString: @"signed"]) + [s appendFormat: @"%@", @"IPM.Note.SMIME.MultipartSigned"]; + else if ([subtype isEqualToString: @"pkcs7-mime"]) + [s appendFormat: @"%@", @"IPM.Note.SMIME"]; + else + [s appendFormat: @"%@", @"IPM.Note"]; [s appendFormat: @"%@", @"urn:content-classes:message"]; } @@ -876,10 +917,8 @@ struct GlobalObjectId { [s appendFormat: @"%@", @"65001"]; // Body - namespace 17 - preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue]; - nativeBodyType = 1; - d = [self _preferredBodyDataUsingType: preferredBodyType nativeType: &nativeBodyType]; + d = [self _preferredBodyDataUsingType: preferredBodyType mimeSupport: mimeSupport nativeType: &nativeBodyType]; if (calendar && !d) { @@ -981,9 +1020,12 @@ struct GlobalObjectId { { [s appendString: @""]; - // Set the correct type if client requested text/html but we got text/plain + // Set the correct type if client requested text/html but we got text/plain. + // For s/mime mails type is always 4 if mimeSupport is 1 or 2. if (preferredBodyType == 2 && nativeBodyType == 1) [s appendString: @"1"]; + else if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && mimeSupport > 0) + [s appendString: @"4"]; else [s appendFormat: @"%d", preferredBodyType]; @@ -1001,7 +1043,8 @@ struct GlobalObjectId { // Attachments -namespace 16 attachmentKeys = [self fetchFileAttachmentKeys]; - if ([attachmentKeys count]) + + if ([attachmentKeys count] && !([subtype isEqualToString: @"signed"])) { int i; @@ -1071,9 +1114,15 @@ struct GlobalObjectId { if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) { + id value; NSString *reference; - reference = [[[[self mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] objectAtIndex: 0]; + value = [[self mailHeaders] objectForKey: @"references"]; + + if ([value isKindOfClass: [NSArray class]]) + reference = [[[value objectAtIndex: 0] componentsSeparatedByString: @" "] objectAtIndex: 0]; + else + reference = [[value componentsSeparatedByString: @" "] objectAtIndex: 0]; if ([reference length] > 0) [s appendFormat: @"%@", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]]; diff --git a/ActiveSync/SOGoSyncCacheObject.h b/ActiveSync/SOGoSyncCacheObject.h index c6ba61068..a86d1067b 100644 --- a/ActiveSync/SOGoSyncCacheObject.h +++ b/ActiveSync/SOGoSyncCacheObject.h @@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @interface SOGoSyncCacheObject : NSObject { + @public id _uid; id _sequence; } diff --git a/ActiveSync/SOGoSyncCacheObject.m b/ActiveSync/SOGoSyncCacheObject.m index 63c545b34..79761a343 100644 --- a/ActiveSync/SOGoSyncCacheObject.m +++ b/ActiveSync/SOGoSyncCacheObject.m @@ -32,9 +32,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import + +static Class NSNullK; @implementation SOGoSyncCacheObject ++ (void) initialize +{ + NSNullK = [NSNull class]; +} + - (id) init { if ((self = [super init])) @@ -46,14 +54,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. return self; } -+ (id) syncCacheObjectWithUID: (id) theUID sequence: (id) theSequence; ++ (id) syncCacheObjectWithUID: (id) theUID sequence: (id) theSequence { id o; o = [[self alloc] init]; - - [o setUID: theUID]; - [o setSequence: theSequence]; + + [o setUID: [NSNumber numberWithInt: [theUID intValue]]]; + [o setSequence: ([theSequence isKindOfClass: NSNullK] ? theSequence : [NSNumber numberWithInt: [theSequence intValue]])]; return [o autorelease]; } @@ -67,7 +75,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (id) uid { - return _uid; + return [_uid description]; } - (void) setUID: (id) theUID @@ -77,7 +85,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (id) sequence { - return _sequence; + return ([_sequence isKindOfClass: NSNullK] ? _sequence : [_sequence description]); } - (void) setSequence: (id) theSequence @@ -88,7 +96,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSComparisonResult) compareUID: (SOGoSyncCacheObject *) theSyncCacheObject { - return [[self uid] compare: [theSyncCacheObject uid]]; + return [self->_uid compare: theSyncCacheObject->_uid]; } // @@ -97,21 +105,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // - (NSComparisonResult) compareSequence: (SOGoSyncCacheObject *) theSyncCacheObject { - if ([[self sequence] isEqual: [NSNull null]] && - [[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if ([self->_sequence isEqual: [NSNull null]] && + [theSyncCacheObject->_sequence isEqual: [NSNull null]]) return [self compareUID: theSyncCacheObject]; - if (![[self sequence] isEqual: [NSNull null]] && [[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if (![self->_sequence isEqual: [NSNull null]] && [theSyncCacheObject->_sequence isEqual: [NSNull null]]) return NSOrderedDescending; - if ([[self sequence] isEqual: [NSNull null]] && ![[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if ([self->_sequence isEqual: [NSNull null]] && ![theSyncCacheObject->_sequence isEqual: [NSNull null]]) return NSOrderedAscending; // Must check this here, to avoid comparing NSNull objects - if ([[self sequence] compare: [theSyncCacheObject sequence]] == NSOrderedSame) + if ([self->_sequence compare: theSyncCacheObject->_sequence] == NSOrderedSame) return [self compareUID: theSyncCacheObject]; - return [[self sequence] compare: [theSyncCacheObject sequence]]; + return [self->_sequence compare: theSyncCacheObject->_sequence]; } - (NSString *) description @@ -120,3 +128,4 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } @end + diff --git a/ActiveSync/iCalAlarm+ActiveSync.m b/ActiveSync/iCalAlarm+ActiveSync.m index 33e6dbb73..62a3ad146 100644 --- a/ActiveSync/iCalAlarm+ActiveSync.m +++ b/ActiveSync/iCalAlarm+ActiveSync.m @@ -58,7 +58,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // don't send negative reminder - not supported if (delta > 0) - [s appendFormat: @"%d", delta]; + [s appendFormat: @"%d", (int)delta]; } return s; diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index 2156b1eac..463d79faa 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -38,6 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import +#import #import #import #import @@ -45,11 +47,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import +#import +#import #import #import +#import #import +#import #include "iCalAlarm+ActiveSync.h" #include "iCalRecurrenceRule+ActiveSync.h" @@ -98,10 +105,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else if ([self created]) [s appendFormat: @"%@", [[self created] activeSyncRepresentationWithoutSeparatorsInContext: context]]; + // Timezone + tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone]; + // StartTime -- http://msdn.microsoft.com/en-us/library/ee157132(v=exchg.80).aspx if ([self startDate]) { - if ([self isAllDay]) + if ([self isAllDay] && !tz) [s appendFormat: @"%@", [[[self startDate] dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 @@ -114,7 +124,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // EndTime -- http://msdn.microsoft.com/en-us/library/ee157945(v=exchg.80).aspx if ([self endDate]) { - if ([self isAllDay]) + if ([self isAllDay] && !tz) [s appendFormat: @"%@", [[[self endDate] dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 @@ -124,9 +134,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendFormat: @"%@", [[self endDate] activeSyncRepresentationWithoutSeparatorsInContext: context]]; } - // Timezone - tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone]; - if (!tz) tz = [iCalTimeZone timeZoneForName: [userTimeZone name]]; @@ -226,9 +233,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //[s appendFormat: @"%d", v]; // UID -- http://msdn.microsoft.com/en-us/library/ee159919(v=exchg.80).aspx - if ([[self uid] length]) + if (![self recurrenceId] && [[self uid] length]) [s appendFormat: @"%@", [self uid]]; - + // Sensitivity if ([[self accessClass] isEqualToString: @"PRIVATE"]) v = 2; @@ -251,7 +258,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendFormat: @""]; } - // Reminder -- http://msdn.microsoft.com/en-us/library/ee219691(v=exchg.80).aspx // TODO: improve this to handle more alarm types if ([self hasAlarms]) @@ -265,7 +271,74 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Recurrence rules if ([self isRecurrent]) { + NSMutableArray *components, *exdates; + iCalEvent *current_component; + NSString *recurrence_id; + + unsigned int count, max, i; + [s appendString: [[[self recurrenceRules] lastObject] activeSyncRepresentationInContext: context]]; + + components = [NSMutableArray arrayWithArray: [[self parent] events]]; + max = [components count]; + + if (max > 1 || [self hasExceptionDates]) + { + exdates = [NSMutableArray arrayWithArray: [self exceptionDates]]; + + [s appendString: @""]; + + for (count = 1; count < max; count++) + { + current_component = [components objectAtIndex: count] ; + + if ([self isAllDay]) + { + recurrence_id = [NSString stringWithFormat: @"%@", + [[[current_component recurrenceId] dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -[userTimeZone secondsFromGMTForDate: + [current_component recurrenceId]]] + activeSyncRepresentationWithoutSeparatorsInContext: context]]; + } + else + { + recurrence_id = [NSString stringWithFormat: @"%@", [[current_component recurrenceId] + activeSyncRepresentationWithoutSeparatorsInContext: context]]; + } + + [s appendString: @""]; + [s appendFormat: @"%@", recurrence_id]; + [s appendFormat: @"%@", [current_component activeSyncRepresentationInContext: context]]; + [s appendString: @""]; + } + + for (i = 0; i < [exdates count]; i++) + { + [s appendString: @""]; + [s appendString: @"1"]; + + if ([self isAllDay]) + { + recurrence_id = [NSString stringWithFormat: @"%@", + [[[[exdates objectAtIndex: i] asCalendarDate] dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -[userTimeZone secondsFromGMTForDate: + [[exdates objectAtIndex: i] asCalendarDate]]] + activeSyncRepresentationWithoutSeparatorsInContext: context]]; + } + else + { + recurrence_id = [NSString stringWithFormat: @"%@", [[[exdates objectAtIndex: i] asCalendarDate] + activeSyncRepresentationWithoutSeparatorsInContext: context]]; + } + + [s appendFormat: @"%@", recurrence_id]; + [s appendString: @""]; + } + + [s appendString: @""]; + } } // Comment @@ -285,13 +358,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { [s appendString: @""]; [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%d", (int)[o length]]; [s appendFormat: @"%@", o]; [s appendString: @""]; } } - [s appendFormat: @"%d", 1]; + if (![self recurrenceId]) + [s appendFormat: @"%d", 1]; return s; } @@ -337,13 +411,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) takeActiveSyncValues: (NSDictionary *) theValues inContext: (WOContext *) context { - iCalDateTime *start, *end; + iCalDateTime *start, *end; //, *oldstart; + NSCalendarDate *oldstart; NSTimeZone *userTimeZone; iCalTimeZone *tz; id o; + int deltasecs; BOOL isAllDay; - + + NSMutableArray *occurences; + + occurences = [NSMutableArray arrayWithArray: [[self parent] events]]; + if ((o = [theValues objectForKey: @"UID"])) [self setUid: o]; @@ -356,6 +436,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { isAllDay = YES; } + else if ([occurences count] && !([theValues objectForKey: @"AllDayEvent"])) + { + // If the occurence has no AllDay tag use it from master. + isAllDay = [[occurences objectAtIndex: 0] isAllDay]; + } // // 0- free, 1- tentative, 2- busy and 3- out of office @@ -422,6 +507,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { o = [o calendarDate]; start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"]; + oldstart = [start dateTime]; [start setTimeZone: tz]; if (isAllDay) @@ -433,6 +519,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { [start setDateTime: o]; } + + // Calculate delta if start date has been changed. + if (oldstart) + deltasecs = [[start dateTime ] timeIntervalSinceDate: oldstart] * -1; + else + deltasecs = 0; } if ((o = [theValues objectForKey: @"EndTime"])) @@ -491,6 +583,177 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. RELEASE(rule); [rule takeActiveSyncValues: o inContext: context]; + + // Exceptions + if ((o = [theValues objectForKey: @"Exceptions"]) && [o isKindOfClass: [NSArray class]]) + { + NSCalendarDate *recurrenceId, *adjustedRecurrenceId, *currentId; + NSMutableArray *exdates, *exceptionstouched; + iCalEvent *currentOccurence; + NSDictionary *exception; + + unsigned int i, count, max; + + [self removeAllExceptionDates]; + + exdates = [NSMutableArray array]; + exceptionstouched = [NSMutableArray array]; + + for (i = 0; i < [o count]; i++) + { + exception = [o objectAtIndex: i]; + + if (![[exception objectForKey: @"Exception_Deleted"] intValue]) + { + recurrenceId = [[exception objectForKey: @"Exception_StartTime"] asCalendarDate]; + + if (isAllDay) + recurrenceId = [recurrenceId dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: [userTimeZone secondsFromGMTForDate:recurrenceId]]; + + // When moving the calendar entry (i.e. changing the startDate) iOS and Android sometimes send a value for + // Exception_StartTime which is not what we expect. + // With this we make sure the recurrenceId is always correct. + // + // iOS problem - If the master is a no-allday-event but the exception is, an invalid Exception_StartTime is in the request. + // e.g. it sends 20150409T040000Z instead of 20150409T060000Z; + // This might be a special case since iPhone doesn't allow an allday-exception on a non-allday-event. + if (!([[start dateTime] compare: [[start dateTime] hour:[recurrenceId hourOfDay] minute:[recurrenceId minuteOfHour]]] == NSOrderedSame)) + recurrenceId = [recurrenceId hour:[[start dateTime] hourOfDay] minute:[[start dateTime] minuteOfHour]]; + + // We need to store the recurrenceIds and exception dates adjusted by deltasecs. + // This ensures that the adjustment in SOGoCalendarComponent->updateComponent->_updateRecurrenceIDsWithEvent gives the correct dates. + adjustedRecurrenceId = [recurrenceId dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 seconds: deltasecs]; + + // search for an existing occurence and update it + max = [occurences count]; + currentOccurence = nil; + count = 1; + while (count < max) + { + currentOccurence = [occurences objectAtIndex: count] ; + currentId = [currentOccurence recurrenceId]; + + if ([currentId compare: adjustedRecurrenceId] == NSOrderedSame) + { + [exceptionstouched addObject: adjustedRecurrenceId]; + [currentOccurence takeActiveSyncValues: exception inContext: context]; + + break; + } + + count++; + currentOccurence = nil; + } + + // Create a new occurence if we found none to update. + if (!currentOccurence) + { + iCalDateTime *recid; + + currentOccurence = [self mutableCopy]; + [currentOccurence removeAllRecurrenceRules]; + [currentOccurence removeAllExceptionRules]; + [currentOccurence removeAllExceptionDates]; + + [[self parent] addToEvents: currentOccurence]; + [currentOccurence takeActiveSyncValues: exception inContext: context]; + + recid = (iCalDateTime *)[currentOccurence uniqueChildWithTag: @"recurrence-id"]; + if (isAllDay) + [recid setDate: adjustedRecurrenceId]; + else + [recid setDateTime: adjustedRecurrenceId]; + + [exceptionstouched addObject: [recid dateTime]]; + } + } + else if ([[exception objectForKey: @"Exception_Deleted"] intValue]) + { + recurrenceId = [[exception objectForKey: @"Exception_StartTime"] asCalendarDate]; + + if (isAllDay) + recurrenceId = [recurrenceId dateByAddingYears: 0 months: 0 + days: 0 hours: 0 minutes: 0 + seconds: [userTimeZone secondsFromGMTForDate:recurrenceId]]; + + // We add only valid exception dates. + if ([self doesOccurOnDate: recurrenceId] && + ([[start dateTime] compare: [[start dateTime] hour:[recurrenceId hourOfDay] + minute:[recurrenceId minuteOfHour]]] == NSOrderedSame)) + { + // We need to store the recurrenceIds and exception dates adjusted by deltasecs. + // This ensures that the adjustment in SOGoCalendarComponent->updateComponent->_updateRecurrenceIDsWithEvent gives the correct dates. + [exdates addObject: [recurrenceId dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: deltasecs]]; + } + } + } + + // Update exception dates in master event. + max = [exdates count]; + if (max > 0) + { + for (count = 0; count < max; count++) + { + if (([exceptionstouched indexOfObject: [exdates objectAtIndex: count]] == NSNotFound)) + [self addToExceptionDates: [exdates objectAtIndex: count]]; + } + } + + // Remove all exceptions included in the request. + max = [occurences count]; + count = 1; // skip the master event + while (count < max) + { + currentOccurence = [occurences objectAtIndex: count] ; + currentId = [currentOccurence recurrenceId]; + + // Delete all occurences which are not touched (modified/added). + if (([exceptionstouched indexOfObject: currentId] == NSNotFound)) + [[[self parent] children] removeObject: currentOccurence]; + + count++; + } + } + else if ([self isRecurrent]) + { + // We have no exceptions in request but there is a recurrence rule. + // Remove all excpetions and exception dates. + iCalEvent *currentOccurence; + unsigned int count, max; + + [self removeAllExceptionDates]; + max = [occurences count]; + count = 1; // skip the master event + while (count < max) + { + currentOccurence = [occurences objectAtIndex: count]; + [[[self parent] children] removeObject: currentOccurence]; + count++; + } + } + } + else if ([self isRecurrent]) + { + // We have no recurrence rule in request. + // Remove all exceptions, exception dates and recurrence rules. + iCalEvent *currentOccurence; + unsigned int count, max; + + [self removeAllRecurrenceRules]; + [self removeAllExceptionRules]; + [self removeAllExceptionDates]; + + max = [occurences count]; + count = 1; // skip the master event + while (count < max) + { + currentOccurence = [occurences objectAtIndex: count]; + [[[self parent] children] removeObject: currentOccurence]; + count++; + } } // Organizer - we don't touch the value unless we're the organizer @@ -498,7 +761,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ([self userIsOrganizer: [context activeUser]] || [[context activeUser] hasEmail: o])) { iCalPerson *person; - + person = [iCalPerson elementWithTag: @"organizer"]; [person setEmail: o]; [person setCn: [theValues objectForKey: @"Organizer_Name"]]; diff --git a/ActiveSync/iCalRecurrenceRule+ActiveSync.m b/ActiveSync/iCalRecurrenceRule+ActiveSync.m index a9060fe27..225bbd90a 100644 --- a/ActiveSync/iCalRecurrenceRule+ActiveSync.m +++ b/ActiveSync/iCalRecurrenceRule+ActiveSync.m @@ -140,7 +140,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Simple reccurrence rule of type "Monthly" type = 2; [s appendFormat: @"%d", - [[[self parent] startDate] dayOfMonth]]; + (int)[[[self parent] startDate] dayOfMonth]]; } } else if ([self frequency] == iCalRecurrenceFrequenceYearly) diff --git a/ActiveSync/iCalToDo+ActiveSync.m b/ActiveSync/iCalToDo+ActiveSync.m index e9417752c..94e0f9756 100644 --- a/ActiveSync/iCalToDo+ActiveSync.m +++ b/ActiveSync/iCalToDo+ActiveSync.m @@ -140,7 +140,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { [s appendString: @""]; [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%d", (int)[o length]]; [s appendFormat: @"%@", o]; [s appendString: @""]; } diff --git a/ChangeLog b/ChangeLog index 845239066..9ff78fafc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,2958 @@ -commit 5c017c19fc34acfa3c49559d3f0ffaf15b47c371 +commit 233b9c0613e630273808d15c324b99a6ef5039b4 +Author: Ludovic Marcotte +Date: Mon Aug 31 11:08:41 2015 -0400 + + (js/css) updates for the new packages + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Mailer.services.js +M UI/WebServerResources/js/Mailer.services.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-animate.js +M UI/WebServerResources/js/vendor/angular-animate.min.js +M UI/WebServerResources/js/vendor/angular-animate.min.js.map +M UI/WebServerResources/js/vendor/angular-aria.js +M UI/WebServerResources/js/vendor/angular-aria.min.js +M UI/WebServerResources/js/vendor/angular-file-upload.min.js +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js +M UI/WebServerResources/js/vendor/angular-sanitize.js +M UI/WebServerResources/js/vendor/angular-sanitize.min.js +M UI/WebServerResources/js/vendor/angular.js +M UI/WebServerResources/js/vendor/angular.min.js +M UI/WebServerResources/js/vendor/angular.min.js.map + +commit 89206f37054229a48ee6e33bad5177593c6ceda1 +Author: Francis Lachapelle +Date: Mon Aug 31 09:51:08 2015 -0400 + + (css) Fix for latest md changes + +M UI/WebServerResources/scss/components/progressCircular/progress-circular.scss + +commit a87daf282c311150a1b32db3696b44a80b9c4b16 +Author: Ludovic Marcotte +Date: Sat Aug 29 16:30:07 2015 -0400 + + (fix) workaround for Firefox with menus which include md-checkbox + + See https://github.com/angular/material/issues/4212 for details + on the Angular Material bug. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit fb4889a15e03bdbadbc30f579ba8f26342a1cbfd +Author: Ludovic Marcotte +Date: Fri Aug 28 20:11:21 2015 -0400 + + (fix) small code refactoring + +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/UIxMailMainFrame.m + +commit 3fdabf867180449cea525db052013d967cdc4286 +Author: Ludovic Marcotte +Date: Fri Aug 28 15:50:46 2015 -0400 + + (fix) properly update flags when message was answered/forwarded + +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 66c52f22dd86dc63e955e83ca92291902271c7c2 +Author: Ludovic Marcotte +Date: Fri Aug 28 15:25:43 2015 -0400 + + (fix) added timepicker directive + +A UI/WebServerResources/js/Common/sgTimepicker.directive.js + +commit 8f7334f11d15fd56cbf7638c4eae9c3a9cc8c5cd +Author: Francis Lachapelle +Date: Fri Aug 28 15:15:40 2015 -0400 + + (js) Simplify Account and Message services + +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 624833eca9c83f6743d309d6269fae4a26a412e6 +Author: Ludovic Marcotte +Date: Fri Aug 28 14:09:20 2015 -0400 + + (fix) updates for new packages + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common.js +M UI/WebServerResources/js/Common.js.map +M UI/WebServerResources/js/Contacts.js +M UI/WebServerResources/js/Contacts.js.map +M UI/WebServerResources/js/Contacts.services.js +M UI/WebServerResources/js/Contacts.services.js.map +M UI/WebServerResources/js/Mailer.js +M UI/WebServerResources/js/Mailer.js.map +M UI/WebServerResources/js/Mailer.services.js +M UI/WebServerResources/js/Mailer.services.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js + +commit 431c53b84d822d1be7cc31473274ec369697f45a +Author: Ludovic Marcotte +Date: Fri Aug 28 13:59:41 2015 -0400 + + (feat) new time picker component + enabled it in the calendar module + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/WebServerResources/js/Scheduler/Component.service.js +A UI/WebServerResources/scss/components/timepicker/timepicker-default-theme.css +A UI/WebServerResources/scss/components/timepicker/timepicker.scss +M UI/WebServerResources/scss/styles.scss + +commit c9d9f7b47a6101de8f11762a0620401576f5b4ed +Author: Francis Lachapelle +Date: Thu Aug 27 15:55:56 2015 -0400 + + (js) Add caching of cards + +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js + +commit 1667f8879ddd325fe08c9292f587716cf5f619ac +Author: Francis Lachapelle +Date: Thu Aug 27 14:09:43 2015 -0400 + + (js) New progress indicator in AddressBook module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit 3611c4021dff18b4189eaa4f5a7b1e95e677dae7 +Author: Francis Lachapelle +Date: Thu Aug 27 13:37:47 2015 -0400 + + Improve view detail (messages, cards) + +M UI/Contacts/English.lproj/Localizable.strings +M UI/MailerUI/English.lproj/Localizable.strings +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Contacts/CardController.js +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit bba0d6f44d7515343c8513b293608d09e1f1dc1f +Author: Luc Charland +Date: Thu Aug 27 11:27:23 2015 -0400 + + make the tests more robust when data is invalid in DB/Webdav + +M Tests/Integration/carddav.py +M Tests/Integration/test-carddav.py + +commit bf390f17dd6c6e8c6165bd4f675f422d3f0c0fc9 +Author: Luc Charland +Date: Wed Aug 26 15:07:11 2015 -0400 + + fixed when strings not initialized in prefs + +M Tests/Integration/preferences.py +M Tests/Integration/test-prevent-invitations.py + +commit 834aba85a67dbab0a7a87b7caf4d4ff539db0917 +Author: Ludovic Marcotte +Date: Thu Aug 27 11:47:51 2015 -0400 + + (fix) cleanups + +M UI/MailPartViewers/UIxMailPartTextViewer.h +M UI/MailPartViewers/UIxMailPartTextViewer.m + +commit d878c69c15cc2f6ff2995558c5961538b799aecb +Author: Ludovic Marcotte +Date: Thu Aug 27 11:01:23 2015 -0400 + + (feat) can now create mails from address book module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Contacts/Contacts.app.js +M UI/WebServerResources/js/Mailer/Account.service.js + +commit d9d59c6b52382769d7793883da50782bfb10cdbc +Author: Francis Lachapelle +Date: Wed Aug 26 21:22:39 2015 -0400 + + (fix) Force a single mail composer dialog + +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MessageController.js + +commit 69000a0929ffe4dc640c904abd36f6ebb4322f4b +Author: Francis Lachapelle +Date: Wed Aug 26 17:28:03 2015 -0400 + + Review animations of view detail (messages, cards) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Contacts/CardController.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/scss/views/_view.scss + +commit 876d9cfa213cbf26c72bbac1ba1cb1d509b386bb +Author: Ludovic Marcotte +Date: Wed Aug 26 11:56:47 2015 -0400 + + (fix) make messages loading very fast + + Avoid calling angular.extend() loading when unwrapping the mailbox + and never call again Message.id directly, but rather use Message.$absolutePath() + which does initialization and caching + +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 117e6b6bc1484a223df8051ccd36cb6c5e3b3bef +Author: Luc Charland +Date: Wed Aug 26 11:26:38 2015 -0400 + + added the multiple phone test + +M Tests/Integration/test-carddav.py + +commit 01e2256483c72c75bc3f8f6d972a7b82401a0fb7 +Author: Francis Lachapelle +Date: Wed Aug 26 09:48:47 2015 -0400 + + (css) Improve autocompletion menu + +M UI/WebServerResources/scss/components/autocomplete/autocomplete.scss +M UI/WebServerResources/scss/components/chips/chips.scss + +commit 49e7cf0994d1df4331016188eba9e40e5ed02dab +Author: Francis Lachapelle +Date: Wed Aug 26 09:40:47 2015 -0400 + + (css) Adapt fullscreen dialogs to new md layout + +M UI/WebServerResources/scss/components/dialog/dialog.scss + +commit b3d6973fb15d0b7138b4f7ad8483b3f152ef1280 +Author: Ludovic Marcotte +Date: Wed Aug 26 09:31:08 2015 -0400 + + (fix) small optimization + +M SoObjects/SOGo/NSArray+Utilities.h +M SoObjects/SOGo/NSArray+Utilities.m +M UI/MailerUI/UIxMailListActions.m + +commit aae522259f26a980d7fea18b9070ffd8d9d00a68 +Author: Ludovic Marcotte +Date: Wed Aug 26 08:28:19 2015 -0400 + + (fix) expose the json accounts call + +M UI/MailerUI/product.plist + +commit 68ef8784a0b0bd16df296cc64c09bb0523c4a8a4 +Author: Ludovic Marcotte +Date: Wed Aug 26 08:27:45 2015 -0400 + + (fix) added json call to get all mail accounts + +M UI/MailerUI/UIxMailMainFrame.m + +commit da821ea6c78372364af9d63798110fb742e3b1bc +Author: Francis Lachapelle +Date: Tue Aug 25 22:17:57 2015 -0400 + + (js) Improve recipient auto-completion + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Mailer/MessageEditorController.js +M UI/WebServerResources/scss/components/chips/chips.scss + +commit 4dee99e0ba71e203c12d35bed6acc0ee3c62e4bd +Author: Ludovic Marcotte +Date: Tue Aug 25 20:47:12 2015 -0400 + + (fix) improved padding usage to better align icons + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/UIxTopnavToolbarTemplate.wox + +commit eea08d083daa8b73f034a0df49d12774fefe52b8 +Author: Francis Lachapelle +Date: Tue Aug 25 14:53:43 2015 -0400 + + (html) Improve contacts list + +M UI/Contacts/English.lproj/Localizable.strings +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 8055acfd4aba4268a4451106bc7f7e585d107648 +Author: Francis Lachapelle +Date: Tue Aug 25 14:20:20 2015 -0400 + + (fix) Restore previous sort in Contacts module + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit 1fc947d8c818f7e89f7eda4703ce1af1515e1e06 +Author: Francis Lachapelle +Date: Tue Aug 25 13:46:33 2015 -0400 + + (fix) Define CSS styles for ALL calendars + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 7b3a238fb9a25857ef05cda3de2df1ae3a4a4f20 +Author: Francis Lachapelle +Date: Tue Aug 25 12:20:46 2015 -0400 + + (js) New progress indicator in Mail module + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/scss/components/progressCircular/_extends.scss +M UI/WebServerResources/scss/components/progressCircular/progress-circular.scss +M UI/WebServerResources/scss/styles.scss + +commit 99d121fd3e9ed085062abf02ce336f3563a55688 +Author: Ludovic Marcotte +Date: Tue Aug 25 11:46:14 2015 -0400 + + (fix) updates for new packages + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common.js +M UI/WebServerResources/js/Common.js.map +M UI/WebServerResources/js/Contacts.js +M UI/WebServerResources/js/Contacts.js.map +M UI/WebServerResources/js/Mailer.js +M UI/WebServerResources/js/Mailer.js.map +M UI/WebServerResources/js/Mailer.services.js +M UI/WebServerResources/js/Mailer.services.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-animate.js +M UI/WebServerResources/js/vendor/angular-animate.min.js +M UI/WebServerResources/js/vendor/angular-animate.min.js.map +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js +M UI/WebServerResources/js/vendor/angular-sanitize.js +M UI/WebServerResources/js/vendor/angular-sanitize.min.js +M UI/WebServerResources/js/vendor/angular-sanitize.min.js.map +M UI/WebServerResources/js/vendor/angular.js +M UI/WebServerResources/js/vendor/angular.min.js +M UI/WebServerResources/js/vendor/angular.min.js.map + +commit eab3ee111a65f75e95e1ea46e7bf7135b3949d52 +Author: Ludovic Marcotte +Date: Tue Aug 25 11:45:17 2015 -0400 + + (feat) now use md-on-demand for (hopefully) faster mailbox loading + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js + +commit eeb6be1f0871130b9d12b90a7771135e3ea6c780 +Author: Francis Lachapelle +Date: Tue Aug 25 10:24:34 2015 -0400 + + (css) Match new ng-material files names + +M UI/WebServerResources/scss/components/bottomSheet/_extends.scss +A UI/WebServerResources/scss/components/bottomSheet/bottom-sheet.scss +D UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +M UI/WebServerResources/scss/components/gridList/_extends.scss +A UI/WebServerResources/scss/components/gridList/grid-list.scss +D UI/WebServerResources/scss/components/gridList/gridList.scss +A UI/WebServerResources/scss/components/progressCircular/progress-circular.scss +D UI/WebServerResources/scss/components/progressCircular/progressCircular.scss +M UI/WebServerResources/scss/components/progressLinear/_extends.scss +A UI/WebServerResources/scss/components/progressLinear/progress-linear.scss +D UI/WebServerResources/scss/components/progressLinear/progressLinear.scss +M UI/WebServerResources/scss/components/virtualRepeat/_extends.scss +A UI/WebServerResources/scss/components/virtualRepeat/virtual-repeat.scss +D UI/WebServerResources/scss/components/virtualRepeat/virtualRepeat.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 29108bbb62c6104d72819e173ad208cdf97df50f +Author: Francis Lachapelle +Date: Tue Aug 25 06:34:34 2015 -0400 + + (html) Localization + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 9c6884bd7d2e09f163e369b717f8da4550a9071f +Author: Ludovic Marcotte +Date: Mon Aug 24 20:04:56 2015 -0400 + + (feat) add single export/save as actions + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Contacts/CardController.js +M UI/WebServerResources/js/Mailer/MessageController.js + +commit 0aac4897fa521881186bf2eeda93c147a4307dd9 +Author: Francis Lachapelle +Date: Mon Aug 24 17:28:01 2015 -0400 + + (fix) Set virtual item size in contacts list + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 2a99d1fd8072284982a9ef92143f16af5e9d5487 +Author: Ludovic Marcotte +Date: Mon Aug 24 16:17:44 2015 -0400 + + (fix) reset search filter when switching address books + +M UI/WebServerResources/js/Contacts/AddressBooksController.js + +commit ba148eec5bee94f07c162f16abf2964051d740e6 +Author: Francis Lachapelle +Date: Mon Aug 24 14:54:25 2015 -0400 + + (js) Fix error in Component.prototype.$reset + +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 49c4884cc9ac8d11be381163df594f65f21b2b6e +Author: Francis Lachapelle +Date: Mon Aug 24 14:40:20 2015 -0400 + + (html) Improve grids layout in recurrence editor + +M UI/Templates/SchedulerUI/UIxRecurrenceEditor.wox + +commit e5d6ee93c3b4f17be4925dbb696038ac043b271e +Author: Francis Lachapelle +Date: Mon Aug 24 11:32:00 2015 -0400 + + Update Angular to version 1.4.x + +M UI/WebServerResources/bower.json + +commit 40eff05d4e61e645ddd253583c1287e6d90aa7ff +Author: Ludovic Marcotte +Date: Mon Aug 24 11:26:00 2015 -0400 + + (feat) added toolbar to account editing dialog + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox + +commit be031fe2c99981caeed3d9904f906920af305431 +Author: Francis Lachapelle +Date: Mon Aug 24 11:24:51 2015 -0400 + + (html) Restore animation when opening a card + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 0fe141928944f420ca29b003c8d8f8de091f56ac +Author: Francis Lachapelle +Date: Mon Aug 24 11:23:34 2015 -0400 + + (html) Enlarge folder links dialog width + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit 9db633cada44eecea42362029310b4beb2507fe1 +Author: Francis Lachapelle +Date: Mon Aug 24 11:20:35 2015 -0400 + + (html) Replace md-layout-fill by layout-fill + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 8a2d7d56e01908976ca7f30c736c6f754efe7702 +Author: Ludovic Marcotte +Date: Mon Aug 24 11:20:23 2015 -0400 + + (feat) added toolbar to filter editor dialog + +M UI/Templates/PreferencesUI/UIxFilterEditor.wox + +commit 0c17e745f198d7ef64a1800d916e5a6e4f204e37 +Author: Francis Lachapelle +Date: Mon Aug 24 11:11:23 2015 -0400 + + (html) Localization + +M UI/Templates/UIxTopnavToolbarTemplate.wox + +commit 18bc75e50b4fb7db57872e18e5073064164ab455 +Author: Ludovic Marcotte +Date: Mon Aug 24 08:49:31 2015 -0400 + + (fix) adjust import path due to md changes + +M UI/WebServerResources/scss/core/layout.scss + +commit 68ad3c104581e3c92f7749cd235db95004ead61c +Author: Ludovic Marcotte +Date: Sat Aug 22 07:51:13 2015 -0400 + + (fix) localize 'me' + +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 85c8aebbd4f8a54525451e0dea4d4215530625c7 +Author: Ludovic Marcotte +Date: Fri Aug 21 20:56:21 2015 -0400 + + (feat) initial support for contact import in the address book module + +M UI/Contacts/UIxContactFolderActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Contacts/Contacts.app.js + +commit 0a8834193f9fc509766fc4fd173b633db4746e6b +Author: Ludovic Marcotte +Date: Fri Aug 21 13:40:07 2015 -0400 + + (fix) updates for new packages + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Contacts.js +M UI/WebServerResources/js/Contacts.js.map +M UI/WebServerResources/js/Contacts.services.js +M UI/WebServerResources/js/Contacts.services.js.map +M UI/WebServerResources/js/Mailer.services.js +M UI/WebServerResources/js/Mailer.services.js.map +M UI/WebServerResources/js/Preferences.js +M UI/WebServerResources/js/Preferences.js.map +M UI/WebServerResources/js/Scheduler.js +M UI/WebServerResources/js/Scheduler.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-animate.js +M UI/WebServerResources/js/vendor/angular-animate.min.js +M UI/WebServerResources/js/vendor/angular-animate.min.js.map +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js +M UI/WebServerResources/js/vendor/angular-sanitize.js +M UI/WebServerResources/js/vendor/angular-sanitize.min.js +M UI/WebServerResources/js/vendor/angular.js +M UI/WebServerResources/js/vendor/angular.min.js +M UI/WebServerResources/js/vendor/angular.min.js.map + +commit 91e4c2cefc10cd3c72c2b46229e18250128917ea +Author: Ludovic Marcotte +Date: Fri Aug 21 13:37:18 2015 -0400 + + (feat) improved the mailviewer with regards to sender + recipients + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/Message.service.js + +commit b80d8dbb06ef98b4b65cc7cf39b4f54423dcf0ba +Author: Ludovic Marcotte +Date: Fri Aug 21 10:30:47 2015 -0400 + + (fix) Session fix when SOGoEnableDomainBasedUID is enabled but logins are domain-less + +M NEWS +M SoObjects/SOGo/SOGoUserManager.m +M UI/MainUI/SOGoRootPage.m + +commit 525d1ad80f7e784b32f99cab1e01117b476df1e6 +Author: Ludovic Marcotte +Date: Thu Aug 20 22:38:01 2015 -0400 + + (fix) also return all calendars in findAll + +M UI/WebServerResources/js/Scheduler/Calendar.service.js + +commit 332dd0d96d5c58ff9cf1b96cd32f07009f0277da +Author: Ludovic Marcotte +Date: Thu Aug 20 22:37:27 2015 -0400 + + (fix) small optimization + +M UI/Contacts/UIxContactFoldersView.m + +commit a45000d15d239f089dd23ba8b91b25910c956ce8 +Author: Ludovic Marcotte +Date: Thu Aug 20 19:42:24 2015 -0400 + + (fix) show delete option only where objectEraser is on + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 3301bdb0550a0cfeaa6fa983ffaefc2b2ad11f07 +Author: Ludovic Marcotte +Date: Thu Aug 20 19:37:30 2015 -0400 + + (fix) return the complete list of addressbooks + + This fixes many bugs / side effects, especially with ACLs + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit 2f82b5cfd3430d7560a0d41d1076c86ab7037408 +Author: Francis Lachapelle +Date: Thu Aug 20 16:39:34 2015 -0400 + + (js) Localization of toast message + +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit e3b64e035ddf15a86488007cfedb90b9656a208e +Author: Francis Lachapelle +Date: Tue Aug 18 21:25:31 2015 -0400 + + (css) New md-fab-overlap-bottom class + +M UI/WebServerResources/scss/components/button/button.scss + +commit 1470258b5ce7bb35cf9761bacf69b1582cfec97f +Author: Francis Lachapelle +Date: Tue Aug 18 21:20:34 2015 -0400 + + (js) Simplify Account.prototype.$newMailbox + +M UI/WebServerResources/js/Mailer/Account.service.js + +commit 83fee27ca836fbe823c02a772eccc2751bdba967 +Author: Francis Lachapelle +Date: Tue Aug 18 21:16:05 2015 -0400 + + (js) Simplify Mailbox.prototype.$emptyTrash + +M UI/WebServerResources/js/Mailer/Mailbox.service.js + +commit e5b0596bc9b14fc491332bb9c8fadf03dbbf73c7 +Author: Ludovic Marcotte +Date: Thu Aug 20 15:47:41 2015 -0400 + + (fix) don't convert back the birthday date object on non-deep omits + +M UI/WebServerResources/js/Contacts/Card.service.js + +commit 26e8276b08c8cad37f7a6560e7c15a17e405bb4b +Author: Ludovic Marcotte +Date: Thu Aug 20 15:47:11 2015 -0400 + + (feat) improved ACLs handling for address book + +M UI/Contacts/UIxContactFoldersView.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 078ba95f8efd1a119b6d33b489b14e4e4fea3076 +Author: Ludovic Marcotte +Date: Thu Aug 20 14:53:43 2015 -0400 + + (feat) show small toast when preferences are saved to give user's feedback + +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 65525dd33bc541caf1eb8a7c9b6419ffa085a783 +Author: Ludovic Marcotte +Date: Thu Aug 20 10:29:47 2015 -0400 + + (feat) added date picker in contact editor + now handle correctly birthday + +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxContactView.m +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Contacts/CardController.js + +commit da81f7bc589ce3666d73c98b7c92efd2680518e0 +Author: Ludovic Marcotte +Date: Wed Aug 19 20:45:07 2015 -0400 + + (fix) set background to transparent by default + +M UI/WebServerResources/scss/components/datepicker/datePicker.scss + +commit 8fcd594be615e45d00ff7d3fa044cac5a78ace9f +Author: Ludovic Marcotte +Date: Wed Aug 19 19:38:42 2015 -0400 + + (fix) removed unused code + +M UI/Contacts/UIxContactFoldersView.m + +commit 548f056b9cfbce214fab2a969f137fb680ec655f +Author: Ludovic Marcotte +Date: Wed Aug 19 11:23:03 2015 -0400 + + (fix) small formatting nit + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit dffdbf318c0a1605cee4a7d750a0ff54da5afbb2 +Author: Ludovic Marcotte +Date: Wed Aug 19 11:22:17 2015 -0400 + + (feat) new 'viewable' property on events/tasks for full viewers + +M UI/Scheduler/UIxCalListingActions.m +M UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox +M UI/WebServerResources/js/Scheduler/CalendarListController.js + +commit 161bcfac875b73d8a0301b67dc8446c106663058 +Author: Ludovic Marcotte +Date: Wed Aug 19 10:39:10 2015 -0400 + + (fix) proper loading of transalations + +M SoObjects/SOGo/NSObject+Utilities.h +M SoObjects/SOGo/NSObject+Utilities.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailListActions.m +M UI/Scheduler/UIxCalListingActions.m + +commit c6f17cd45cff78a378da62c15c074c6bd895dc44 +Author: Ludovic Marcotte +Date: Wed Aug 19 08:47:33 2015 -0400 + + (feat) make use of the sieve capabilities + +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/FiltersDialogController.js +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 38713a6c675f717ef58fcc94cfed3752731e0d1a +Author: Ludovic Marcotte +Date: Tue Aug 18 16:21:47 2015 -0400 + + (feat) handle multiple home/work phones, emails and urls + +M SoObjects/Contacts/NGVCard+SOGo.h +M SoObjects/Contacts/NGVCard+SOGo.m +M UI/Contacts/UIxContactEditor.m + +commit 8cef98eba1fefeacf1e0959d3007eba0dbffbd21 +Author: Ludovic Marcotte +Date: Tue Aug 18 15:32:44 2015 -0400 + + (fix) add flex/flex-sm attributes + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox + +commit 2144d3122af4acdb0d6484069e4022610d3236e2 +Author: Ludovic Marcotte +Date: Tue Aug 18 15:25:51 2015 -0400 + + (feat) added support back for SOGoForwardConstraints + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 9d272ae0632cb190b708f633a847a05fa7d342d8 +Author: Ludovic Marcotte +Date: Tue Aug 18 14:57:29 2015 -0400 + + (feat) added the 'add default email addresses' feature in vacation module + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit fcd0140ffd7ac460932de91888f40e4d365fc09f +Author: Ludovic Marcotte +Date: Tue Aug 18 14:52:47 2015 -0400 + + Revert "(fix) by default, open links in new tab/window from html mails" + + This reverts commit 869b3c4cd1625af5bd3f21b7443c5999c8ab01fe. + +M UI/Templates/MailPartViewers/UIxMailPartHTMLViewer.wox + +commit d783782af7d6becb3edb845ace7fe55da685c37a +Author: Ludovic Marcotte +Date: Tue Aug 18 11:31:42 2015 -0400 + + (fix) adding basic flags + +M UI/Templates/PreferencesUI/UIxFilterEditor.wox + +commit 869b3c4cd1625af5bd3f21b7443c5999c8ab01fe +Author: Ludovic Marcotte +Date: Tue Aug 18 11:13:27 2015 -0400 + + (fix) by default, open links in new tab/window from html mails + +M UI/Templates/MailPartViewers/UIxMailPartHTMLViewer.wox + +commit 2da29373913fcd7cb8c40532e6f9fd918ae092f3 +Author: Ludovic Marcotte +Date: Tue Aug 18 11:01:59 2015 -0400 + + (fix) formatting improvements + +M UI/Templates/MailPartViewers/UIxMailPartHTMLViewer.wox + +commit 5034d6655a751d4b92856eef6cd3dd1eacfe1902 +Author: Ludovic Marcotte +Date: Tue Aug 18 10:10:37 2015 -0400 + + (fix) correctly refresh the mailboxes list when empty'ing the trash that contains subfolders + +M UI/WebServerResources/js/Mailer/Mailbox.service.js + +commit d1446f7dc109270d86fdd24c4534454e7f25d88d +Author: Ludovic Marcotte +Date: Tue Aug 18 09:57:07 2015 -0400 + + (fix) broken top level mailbox creation + +M UI/WebServerResources/js/Mailer/Account.service.js + +commit c5a219add8d05a8a2e747363a510bcb228994dc2 +Author: Ludovic Marcotte +Date: Tue Aug 18 09:27:33 2015 -0400 + + (fix) wrong check for web calendars + +M UI/Scheduler/UIxComponentEditor.m + +commit bc2c839fbce17887c1bd9715c73428f3d872e755 +Author: Ludovic Marcotte +Date: Tue Aug 18 08:39:20 2015 -0400 + + Update for the new packaging + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common.js +M UI/WebServerResources/js/Common.js.map +M UI/WebServerResources/js/Contacts.js +M UI/WebServerResources/js/Contacts.js.map +M UI/WebServerResources/js/Contacts.services.js +M UI/WebServerResources/js/Contacts.services.js.map +M UI/WebServerResources/js/Preferences.services.js +M UI/WebServerResources/js/Preferences.services.js.map +M UI/WebServerResources/js/Scheduler.js +M UI/WebServerResources/js/Scheduler.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-aria.js +M UI/WebServerResources/js/vendor/angular-aria.min.js +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js + +commit 20bf66d9311c7da05e5d2dff4f5fd6800cf023ea +Author: Ludovic Marcotte +Date: Mon Aug 17 16:21:10 2015 -0400 + + (feat) handle links to addressbooks like we do for calendars + + also included missing template commit for calendar + +M SoObjects/Contacts/SOGoContactGCSFolder.h +M SoObjects/Contacts/SOGoContactGCSFolder.m +M UI/Contacts/UIxContactFolderLinksTemplate.h +M UI/Contacts/UIxContactFolderLinksTemplate.m +M UI/Contacts/UIxContactFoldersView.m +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox +M UI/WebServerResources/js/Contacts/AddressBooksController.js + +commit 864a7f8028369143fbd05b1fbf726bed1c7b18c2 +Author: Francis Lachapelle +Date: Fri Aug 14 02:31:27 2015 -0400 + + (html) Improve Preferences module + +M UI/Templates/PreferencesUI/UIxFilterEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 7b5541b5d1b1c6b9275c734762e4598555b79ddd +Author: Ludovic Marcotte +Date: Mon Aug 17 13:44:21 2015 -0400 + + (fix) reuse the calendar urls from the model + +M UI/Scheduler/UIxCalendarFolderLinksTemplate.h +M UI/Scheduler/UIxCalendarFolderLinksTemplate.m +M UI/Scheduler/product.plist +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit 744cba4422078f4a2e094a97b00c432977208661 +Author: Ludovic Marcotte +Date: Mon Aug 17 10:10:57 2015 -0400 + + (feat) integrated md-datepicker and enabled it in the Preferences module (Vacation) + + The date picker suffers from this bug: https://github.com/angular/material/issues/4192 + + Which makes it not that usable right now. + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/Preferences.service.js +A UI/WebServerResources/scss/components/datepicker/_extends-calendar.scss +A UI/WebServerResources/scss/components/datepicker/_extends-datePicker.scss +A UI/WebServerResources/scss/components/datepicker/calendar.scss +A UI/WebServerResources/scss/components/datepicker/datePicker.scss +M UI/WebServerResources/scss/components/menu/menu.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit ded467e0a2bfab88981308286390bcb8e2049418 +Author: Ludovic Marcotte +Date: Mon Aug 17 09:55:14 2015 -0400 + + (fix) add empty settings hashes to prever JS exceptions + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit a718b87d9194940898354dd29d650e10049e062f +Author: Ludovic Marcotte +Date: Sun Aug 16 21:42:53 2015 -0400 + + (fix) minor gui improvement to links templates + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit 6e2e71b2026541d03a6f791645ac1287558a2297 +Author: Ludovic Marcotte +Date: Sat Aug 15 17:25:04 2015 -0400 + + (fix) correctly set flex attribut on sm devices + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox + +commit 04e63e5edf182985f85c6672b094a85ba1f97364 +Author: Ludovic Marcotte +Date: Sat Aug 15 17:08:15 2015 -0400 + + (fix) add minimal constraints when creating events or tasks + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox + +commit f1a50bcb74a9c580116614d95bdd139d67a0b5cf +Author: Ludovic Marcotte +Date: Fri Aug 14 16:31:29 2015 -0400 + + (feat) added refresh support to calendar + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 0672b96b8b1a33d9b3952279591c72c9b2e874fc +Author: Ludovic Marcotte +Date: Fri Aug 14 15:51:17 2015 -0400 + + (fix) show the alarm name as a floating label for now + + This might change as the text is so tiny! + +M UI/WebServerResources/js/Common/Alarm.service.js + +commit 93fa74d2793064086bfd348cc9efe638206341ee +Author: Ludovic Marcotte +Date: Fri Aug 14 15:22:59 2015 -0400 + + (feat) save/restore sorting state for address books + + The initial loading doesn't work yet. Will work on this later. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit ffa4079fa8a412bc5f706fd3955bb4082a3ab4df +Author: Ludovic Marcotte +Date: Fri Aug 14 15:11:07 2015 -0400 + + (fix) b0rk3n sort saving regarding the asc/desc state + +M UI/Contacts/UIxContactsListActions.m +M UI/Scheduler/UIxCalListingActions.m + +commit 8f75bdce2d97ce850c8ecf00b53115d5caefe6c9 +Author: Luc Charland +Date: Fri Aug 14 12:46:37 2015 -0400 + + Use Json for testing webcalendar + +M Tests/Integration/test-ui-posts.py + +commit 4f53ea70e152018a39e407b3fb63003e621df24f +Author: Luc Charland +Date: Fri Aug 14 12:46:03 2015 -0400 + + Commented out testing two phones same type until fixed + +M Tests/Integration/test-carddav.py + +commit b72a9383a49a0273c61ad7bbe9782a0e050c1844 +Author: Ludovic Marcotte +Date: Fri Aug 14 12:14:15 2015 -0400 + + (feat) major rework of the sidenav and top toolbars + +M UI/Common/UIxPageFrame.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/UIxPageFrame.wox +M UI/Templates/UIxSidenavToolbarTemplate.wox +M UI/Templates/UIxTopnavToolbarTemplate.wox +M UI/WebServerResources/js/Common/Common.app.js +M UI/WebServerResources/js/Common/navController.js + +commit 02daebe36be620611a26bef5f8f662fb11dce60d +Author: Ludovic Marcotte +Date: Wed Aug 12 18:31:06 2015 -0400 + + (fix) also handle tasks deletion correctly + +M UI/WebServerResources/js/Scheduler/Calendar.service.js + +commit 336e4c93e9ab155d591c886fe091d28691e82740 +Author: Ludovic Marcotte +Date: Wed Aug 12 18:25:15 2015 -0400 + + (fix) added temporary fix for file inputs on firefox + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 47252affba52c706ec2d7bd1e98fbf001c33ef91 +Author: Ludovic Marcotte +Date: Wed Aug 12 16:11:38 2015 -0400 + + (feat) initial selection + ops in calendar module + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Scheduler/Calendar.service.js +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 8fb5c1d09fe2119b597259f93ded116c55b85df9 +Author: Luc Charland +Date: Wed Aug 12 14:34:32 2015 -0400 + + Added sort saving to Contacts + +M UI/Contacts/UIxContactsListActions.m + +commit 54334b294e7aecc7a3c3950c74b37d708374f55e +Author: Ludovic Marcotte +Date: Wed Aug 12 10:31:06 2015 -0400 + + (fix) small fix in the template + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit c51bed258080303937bae494f665b04c9d2d8911 +Author: Ludovic Marcotte +Date: Wed Aug 12 09:43:55 2015 -0400 + + (fix) updated js/css/map files for packaging + +M UI/WebServerResources/angular-material +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common.js +M UI/WebServerResources/js/Common.js.map +M UI/WebServerResources/js/Common/Acl.service.js +M UI/WebServerResources/js/Contacts.js +M UI/WebServerResources/js/Contacts.js.map +M UI/WebServerResources/js/Contacts.services.js +M UI/WebServerResources/js/Contacts.services.js.map +M UI/WebServerResources/js/Mailer.js +M UI/WebServerResources/js/Mailer.js.map +M UI/WebServerResources/js/Mailer.services.js +M UI/WebServerResources/js/Mailer.services.js.map +M UI/WebServerResources/js/Main.js +M UI/WebServerResources/js/Main.js.map +M UI/WebServerResources/js/Scheduler.js +M UI/WebServerResources/js/Scheduler.js.map +M UI/WebServerResources/js/Scheduler.services.js +M UI/WebServerResources/js/Scheduler.services.js.map +M UI/WebServerResources/js/vendor/angular-file-upload.min.js +M UI/WebServerResources/js/vendor/angular-material.js +M UI/WebServerResources/js/vendor/angular-material.min.js + +commit 935df2bd002b62ec0e8c32a769c95a5aac778c83 +Author: Ludovic Marcotte +Date: Tue Aug 11 21:16:16 2015 -0400 + + (fix) wrong label name + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 85a843bc1edd32472fe6bf9563b418e60789fb61 +Author: Ludovic Marcotte +Date: Tue Aug 11 20:58:39 2015 -0400 + + (fix) now show the event/task list instead of the day/week/month views on sm devices + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 723372dddb46cda3f722696a376cd8064fb6313b +Author: Ludovic Marcotte +Date: Tue Aug 11 15:05:31 2015 -0400 + + (fix) when batch deleting, update the unseen count accordingly + +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit 9362513feed6d4747f740c7863c9c82917364c77 +Author: Ludovic Marcotte +Date: Tue Aug 11 14:48:45 2015 -0400 + + (fix) moved the mailbox cleanup after expunge in the service + +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 2e3057c2cea8d727625f1a13d33e22359adde2ff +Author: Ludovic Marcotte +Date: Tue Aug 11 13:40:38 2015 -0400 + + (fix) calendar views now honor "breakpoints" + + We also now use again the default top nav toolbar and we + hide the fab button on sm devices. This of course needs a bit + more work but we are getting there! + +M UI/Templates/SchedulerUI/UIxCalDayView.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalMonthView.wox +M UI/Templates/SchedulerUI/UIxCalWeekView.wox + +commit 456649a38a167eff8128ffab38d32d4029a44f14 +Author: Ludovic Marcotte +Date: Tue Aug 11 13:38:28 2015 -0400 + + (fix) allow fullsreen editor on sm devices + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox + +commit 86818d4f64cc8ae853bb5f6bb56237d0adb4603a +Author: Ludovic Marcotte +Date: Tue Aug 11 13:10:11 2015 -0400 + + (fix) fixed scrolling during contact edition + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit b59287d6df86d5fa1eb71a9cb562c6b1ea7fa284 +Author: Ludovic Marcotte +Date: Tue Aug 11 11:18:41 2015 -0400 + + (fix) removed unused code + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit bdc8dfb2b458d70592ff3462321482b3620afb20 +Author: Ludovic Marcotte +Date: Tue Aug 11 09:38:53 2015 -0400 + + (fix) removed unused code + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 2825285b72388fcabea69f2d73913e602c51868c +Author: Ludovic Marcotte +Date: Tue Aug 11 08:45:05 2015 -0400 + + (fix) author cleanup + +M UI/Templates/UIxPageFrame.wox + +commit 314dcfd30ee4e3a5c1802e595fc671f282b3f45a +Author: Ludovic Marcotte +Date: Mon Aug 10 23:48:59 2015 -0400 + + (fix) properly cleanup the Trash folder after empty'ing + +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit d28fccf71e21ca850731c28530aa8b3b959b533b +Author: Ludovic Marcotte +Date: Mon Aug 10 23:14:40 2015 -0400 + + (fix) open attachment in new window + +M UI/Templates/MailPartViewers/UIxMailPartLinkViewer.wox + +commit ff632ec3e88ba229ef749190499c34659d3ce46c +Author: Ludovic Marcotte +Date: Mon Aug 10 22:02:43 2015 -0400 + + (fix) leave some room for the message date + +M UI/WebServerResources/scss/views/MailerUI.scss + +commit b7af83f7e335688d5b75be460655a13f9638259f +Author: Ludovic Marcotte +Date: Mon Aug 10 20:47:58 2015 -0400 + + (feat) pimped the login window + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/scss/views/LoginUI.scss + +commit d2aeee39eff73aceb9a6ddcdea1c59cb9599ef64 +Author: Ludovic Marcotte +Date: Mon Aug 10 14:13:25 2015 -0400 + + (feat) now able to rename folders w/o double-tap + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit ecc0c453d7e9348445cc21659d32cfb57ecf54ac +Author: Ludovic Marcotte +Date: Mon Aug 10 13:27:35 2015 -0400 + + (fix) pimped the priority editor + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 420dece1e75e292b05660b002fef0edecab2f8f8 +Author: Ludovic Marcotte +Date: Mon Aug 10 13:10:45 2015 -0400 + + (feat) flag selected messages and mark selected messages as unread + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit c738a2dc70a1f8911d804961452953cfc042d36d +Author: Ludovic Marcotte +Date: Mon Aug 10 11:02:23 2015 -0400 + + (fix) wrong use of this which was breaking ACL module + +M UI/WebServerResources/js/Common/User.service.js + +commit e41e17c5d951f78a3065072edb41a46eae6ecf89 +Author: Ludovic Marcotte +Date: Mon Aug 10 09:54:14 2015 -0400 + + (fix) use proper var:string value + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 5741d7f95ce13ba78b7228441f804a0333e845ec +Author: Ludovic Marcotte +Date: Mon Aug 10 09:48:47 2015 -0400 + + (feat) can now copy selected cards + +M UI/Common/UIxFolderActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit e13f7a267bc96ebc501b2c1b1aa88b882a8e9b77 +Author: Ludovic Marcotte +Date: Sun Aug 9 20:21:09 2015 -0400 + + (feat) show email priority + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit dd7b929f17341a5cf63519b05874a87fba5c15f5 +Author: Ludovic Marcotte +Date: Sun Aug 9 10:36:54 2015 -0400 + + (feat) compose mail with clicked email address + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit ad9b969d6d21922ab6a9560177597d11361a9257 +Author: Ludovic Marcotte +Date: Fri Aug 7 21:14:17 2015 -0400 + + (fix) avoid displaying the chips line + +M UI/Templates/MailPartViewers/UIxMailPartICalViewer.wox + +commit 704307e6d6d2d11172684e7788d7ff319716caad +Author: Ludovic Marcotte +Date: Fri Aug 7 20:38:26 2015 -0400 + + (feat) pimped the mail part viewers + +M UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox +M UI/Templates/MailPartViewers/UIxMailPartLinkViewer.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/scss/views/MailerUI.scss + +commit ce8a4b6d8a9104dd41fb319134e70005beb7b273 +Author: Francis Lachapelle +Date: Fri Aug 7 15:32:00 2015 -0400 + + (js) Make events clickable in month view + +M UI/Templates/SchedulerUI/UIxCalMonthView.wox +M UI/WebServerResources/js/Scheduler/sgCalendarDayBlock.directive.js +M UI/WebServerResources/js/Scheduler/sgCalendarDayTable.directive.js +M UI/WebServerResources/js/Scheduler/sgCalendarMonthDay.directive.js +M UI/WebServerResources/js/Scheduler/sgCalendarMonthEvent.directive.js +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit 8ab591a1b645cfd013f3899cc61903d61e71162b +Author: Francis Lachapelle +Date: Fri Aug 7 14:25:57 2015 -0400 + + (html) Improve task viewer + +M UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox + +commit 4434547a18b6fb6527a3a9d92cbb7051c00cff11 +Author: Francis Lachapelle +Date: Fri Aug 7 14:25:14 2015 -0400 + + (css) Don't highlight disabled list items + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/scss/components/list/list.scss + +commit 29d86ad478fee8fc55b22a05b797124aa972ddf9 +Author: Francis Lachapelle +Date: Fri Aug 7 14:13:27 2015 -0400 + + (js) Respect user's settings in Calendar module + +M UI/Scheduler/UIxCalMainView.m +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 15a5ab0b12862ad1c5b4a995d06db310a977f4b2 +Author: Ludovic Marcotte +Date: Fri Aug 7 13:46:01 2015 -0400 + + (fix) added tooltip for consistency + +M UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox + +commit 3b5013555de7b3651c90dc0a2bfdf61a9e2a7d9f +Author: Francis Lachapelle +Date: Fri Aug 7 11:22:24 2015 -0400 + + (html) Improve/fix appointment/task viewer/editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/Templates/SchedulerUI/UIxReminderEditor.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox + +commit 655a499cd461f240f36d257f712585f931767993 +Author: Francis Lachapelle +Date: Fri Aug 7 11:18:40 2015 -0400 + + (css) Fix subheader margin + +M UI/WebServerResources/scss/components/subheader/subheader.scss + +commit 52559087b32e86acb6b0fa2e4a9716459c932d6c +Author: Francis Lachapelle +Date: Fri Aug 7 11:17:09 2015 -0400 + + (css) Merge autoScrollList.scss with list.scss + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +D UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/styles.scss + +commit fb7d5b628ffded1541d426599098aa2f2eee47f1 +Author: Francis Lachapelle +Date: Fri Aug 7 11:04:04 2015 -0400 + + (js) Make use of 'controllerAs' in MainUI module + +M UI/MainUI/English.lproj/Localizable.strings +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/Common/Authentication.service.js +M UI/WebServerResources/js/Main/Main.app.js + +commit 6e82a7ba7b49fbdce28a339d83bc23f00d119fb6 +Author: Francis Lachapelle +Date: Fri Aug 7 11:02:34 2015 -0400 + + (js) Indentation + +M UI/WebServerResources/js/Common/AclController.js + +commit fbcaf254284f22c31b391730dbf91f3a877630cc +Author: Ludovic Marcotte +Date: Fri Aug 7 10:46:45 2015 -0400 + + Bumped to v3.0.0 + +M Version + +commit a17e59af58bb04bbc45b9552a249b03471a49ba3 +Author: Ludovic Marcotte +Date: Fri Aug 7 10:37:36 2015 -0400 + + (feat) added v3 js/css/map files for packaging + +A UI/WebServerResources/css/styles.css +A UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/js/Common.js +A UI/WebServerResources/js/Common.js.map +A UI/WebServerResources/js/Contacts.js +A UI/WebServerResources/js/Contacts.js.map +A UI/WebServerResources/js/Contacts.services.js +A UI/WebServerResources/js/Contacts.services.js.map +A UI/WebServerResources/js/Mailer.js +A UI/WebServerResources/js/Mailer.js.map +A UI/WebServerResources/js/Mailer.services.js +A UI/WebServerResources/js/Mailer.services.js.map +A UI/WebServerResources/js/Main.js +A UI/WebServerResources/js/Main.js.map +A UI/WebServerResources/js/Preferences.js +A UI/WebServerResources/js/Preferences.js.map +A UI/WebServerResources/js/Preferences.services.js +A UI/WebServerResources/js/Preferences.services.js.map +A UI/WebServerResources/js/Scheduler.js +A UI/WebServerResources/js/Scheduler.js.map +A UI/WebServerResources/js/Scheduler.services.js +A UI/WebServerResources/js/Scheduler.services.js.map +A UI/WebServerResources/js/vendor/angular-animate.js +A UI/WebServerResources/js/vendor/angular-animate.min.js +A UI/WebServerResources/js/vendor/angular-animate.min.js.map +A UI/WebServerResources/js/vendor/angular-aria.js +A UI/WebServerResources/js/vendor/angular-aria.min.js +A UI/WebServerResources/js/vendor/angular-aria.min.js.map +A UI/WebServerResources/js/vendor/angular-file-upload.min.js +A UI/WebServerResources/js/vendor/angular-material.js +A UI/WebServerResources/js/vendor/angular-material.min.js +A UI/WebServerResources/js/vendor/angular-sanitize.js +A UI/WebServerResources/js/vendor/angular-sanitize.min.js +A UI/WebServerResources/js/vendor/angular-sanitize.min.js.map +A UI/WebServerResources/js/vendor/angular-ui-router.js +A UI/WebServerResources/js/vendor/angular-ui-router.min.js +A UI/WebServerResources/js/vendor/angular.js +A UI/WebServerResources/js/vendor/angular.min.js +A UI/WebServerResources/js/vendor/angular.min.js.map +A UI/WebServerResources/js/vendor/lodash.js +A UI/WebServerResources/js/vendor/lodash.min.js + +commit b966fd3e308d3836d0396ca5b5eb1fdb5b52e93e +Author: Francis Lachapelle +Date: Fri Aug 7 09:56:47 2015 -0400 + + (js) Move *.app.js files to their directories + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/Gruntfile.js +D UI/WebServerResources/js/Contacts.app.js +A UI/WebServerResources/js/Contacts/Contacts.app.js +D UI/WebServerResources/js/Mailer.app.js +A UI/WebServerResources/js/Mailer/Mailer.app.js +D UI/WebServerResources/js/Main.app.js +A UI/WebServerResources/js/Main/Main.app.js +D UI/WebServerResources/js/Preferences.app.js +A UI/WebServerResources/js/Preferences/Preferences.app.js +D UI/WebServerResources/js/Scheduler.app.js +A UI/WebServerResources/js/Scheduler/Scheduler.app.js + +commit caa50d25cb9fc41a4fb308ca4cb6bd57d97c977c +Author: Ludovic Marcotte +Date: Fri Aug 7 09:49:51 2015 -0400 + + (fix) removed broken parts from the template + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 636e5c375ecc859cb2e66904dbe942bcac53de3b +Author: Francis Lachapelle +Date: Fri Aug 7 09:35:44 2015 -0400 + + (js) Merge utils.js to Common.js + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Common/utils.js + +commit f6ea2229f8c61698391b0d438bcd68661238d766 +Author: Ludovic Marcotte +Date: Fri Aug 7 09:15:38 2015 -0400 + + (fix) reworked the targets to not always generate static files + +M UI/WebServerResources/GNUmakefile + +commit 063e973ef3709c20825ad378f9a76169f6788dd2 +Author: Francis Lachapelle +Date: Thu Aug 6 16:24:14 2015 -0400 + + (css) Cleanup variables already in material + +M UI/WebServerResources/scss/components/list/list.scss + +commit eb543ce14f76711f7c17ed45c9784665cb63dc90 +Author: Francis Lachapelle +Date: Thu Aug 6 16:19:42 2015 -0400 + + (js) Allow to change the labels of Dialog.confirm + +M UI/WebServerResources/js/Common/Dialog.service.js +M UI/WebServerResources/js/Contacts/CardController.js + +commit 9465fbad4b45508ec829d9988a52e0db16140100 +Author: Francis Lachapelle +Date: Thu Aug 6 16:18:39 2015 -0400 + + (obj-c) Indentation + +M SoObjects/Appointments/SOGoAppointmentObject.m + +commit 560feb45d93ca285f746b5732379a66f182d3f16 +Author: Ludovic Marcotte +Date: Thu Aug 6 16:18:53 2015 -0400 + + (fix) massively pimped the email composer + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit b5ca697b43ed07d384d9225517e1b7567dcfa7d4 +Author: Ludovic Marcotte +Date: Thu Aug 6 16:18:10 2015 -0400 + + (fix) imprived the gravatar directive to extract email address between < > + +M UI/WebServerResources/js/Common/Gravatar.service.js + +commit 33d0f30d97a7f038d2eb90553455ba79fb35cb75 +Author: Ludovic Marcotte +Date: Thu Aug 6 16:17:31 2015 -0400 + + (fix) avoid closing the email composition window by error + +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit 0d537ab27b2f36c4916548a7aa6828974be2a031 +Author: Francis Lachapelle +Date: Thu Aug 6 16:15:12 2015 -0400 + + Return recurrence rules of occurrence + +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m + +commit 2239286697e3b116d19c7299e0f297ca02668835 +Author: Francis Lachapelle +Date: Thu Aug 6 16:13:10 2015 -0400 + + (js) Use CK Editor in mail account editor (Prefs) + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences.app.js +M UI/WebServerResources/js/Preferences/AccountDialogController.js +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit d0d79728d2a58c0698291771a131b60e3a67d1ff +Author: Francis Lachapelle +Date: Thu Aug 6 16:09:49 2015 -0400 + + (js) Set locale to CKEditor in Mail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit e6c9289784da44ef2181cbe4c17f877b4369fc65 +Author: Francis Lachapelle +Date: Thu Aug 6 16:07:46 2015 -0400 + + Add LocaleCode to JSON defaults + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit ae017b50bcb88d52cb151b797c05cea38e7892f7 +Author: Francis Lachapelle +Date: Thu Aug 6 16:04:39 2015 -0400 + + (js) Improve ckEditor directive + + The directive will now consider the following attributes: + + - ck-options: a JSON object of options + - ck-locale: the locale code to be used as the language and the speller + language + +M UI/WebServerResources/js/vendor/ckeditor/ck.js + +commit 42eb9e51b45dc78bc6a912ca99d397bc4a09c350 +Author: Luc Charland +Date: Thu Aug 6 14:21:38 2015 -0400 + + Reworked saving Events filter and added Tasks filter + +M UI/Scheduler/UIxCalListingActions.m + +commit 7bb551a4ad50bd9ddab71aba28e1a9994e132144 +Author: Luc Charland +Date: Thu Aug 6 12:38:26 2015 -0400 + + Added saving of sort order for Events and Tasks + +M UI/Scheduler/UIxCalListingActions.m + +commit 31b959a7dc7096bb9f50d2116ac261da3b084de8 +Author: Luc Charland +Date: Thu Aug 6 12:16:17 2015 -0400 + + Added saving of Calendar Sort to jsonSettings + +M UI/Scheduler/UIxCalListingActions.m + +commit 2a132b4e8f2917507219aba5273bce6b74593c76 +Author: Francis Lachapelle +Date: Thu Aug 6 11:48:42 2015 -0400 + + (css) Cleanup directives already in material + +M UI/WebServerResources/scss/components/divider/divider.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/core/typography.scss + +commit ff1a1e6f595607df72f8f66de1bf4c3784eab02e +Author: Francis Lachapelle +Date: Thu Aug 6 11:26:26 2015 -0400 + + (html) Cleanup UIxContactFoldersView.wox + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit a4a75607fac93e989f096688943561ae4b6261ba +Author: Francis Lachapelle +Date: Thu Aug 6 11:22:23 2015 -0400 + + (js,html) Improve sgSubscribe directive + +M UI/Contacts/English.lproj/Localizable.strings +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/WebServerResources/js/Common/sgSubscribe.directive.js + +commit 6641bbded2b0743c0426e8cc09ad9d8e820cefe4 +Author: Francis Lachapelle +Date: Thu Aug 6 11:18:53 2015 -0400 + + (js) Improve User.$filter function + +M UI/WebServerResources/js/Common/User.service.js + +commit 78975b9e6848d68c8377f01f290d9812fca5e5a9 +Author: Ludovic Marcotte +Date: Thu Aug 6 09:36:43 2015 -0400 + + (fix) add proper class to avoid displaying the chips' line + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit 2f122f12b6bc9b0ad0cc0969cc5ba0f5eef23a8b +Author: Ludovic Marcotte +Date: Wed Aug 5 20:23:11 2015 -0400 + + (fix) don't show a dialog on top of a dialog for acl confirmation + +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/Common/AclController.js + +commit 5e19a889c2bed84f5fa3e55fe0dc37fb5bb18e65 +Author: Francis Lachapelle +Date: Wed Aug 5 16:44:25 2015 -0400 + + (feat) Handle invitations in appointment viewer + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxCalMainView.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss + +commit 87aec2fc01b0c05c73b1761135b103bb2d80ce14 +Author: Ludovic Marcotte +Date: Wed Aug 5 16:02:57 2015 -0400 + + (feat) added batch export option to cards + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit 5327df4c7adf01c002facf5dd3d4f9a327fa8480 +Author: Ludovic Marcotte +Date: Wed Aug 5 15:04:47 2015 -0400 + + (feat) added select all feature to contacts module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit a220ee67b786d2ebb7d3bff8559b031b258df67c +Author: Ludovic Marcotte +Date: Wed Aug 5 14:39:58 2015 -0400 + + (feat) reworked batch menu + added save messages option + +M UI/MailerUI/UIxMailFolderActions.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit 124ca5d8cf0f72bfbfbe57969c9fedeca1749b12 +Author: Ludovic Marcotte +Date: Wed Aug 5 11:08:36 2015 -0400 + + (fix) escape the HTML content from the raw source before returning it + +M UI/MailerUI/UIxMailSourceView.m + +commit 9dac8e55ff70be7f5f55dfdd7d75e804c2a1f2af +Author: Francis Lachapelle +Date: Wed Aug 5 10:14:32 2015 -0400 + + (js) Avoid accidentally closing the composer + +M UI/WebServerResources/js/Mailer/MessageController.js + +commit 4539fd4c5ed4e4813c06cbc75580116032948fa3 +Author: Francis Lachapelle +Date: Wed Aug 5 10:12:51 2015 -0400 + + (html) Internationalized labels in message viewer + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit 923ab97309755bbc95ee7e8a60b3bc47e1543f86 +Author: Luc Charland +Date: Wed Aug 5 10:05:21 2015 -0400 + + Added tooltips for saving/view attachments + +M UI/MailPartViewers/English.lproj/Localizable.strings +M UI/Templates/MailPartViewers/UIxMailPartLinkViewer.wox + +commit c56644f0e57f270a45f9e7ce20fbcc1f6035fa39 +Author: Luc Charland +Date: Wed Aug 5 09:39:06 2015 -0400 + + Added tooltips to Contacts + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit da119ef3ad48f2229de933de30018022b6eb0803 +Author: Ludovic Marcotte +Date: Tue Aug 4 20:32:43 2015 -0400 + + (feat) raw source support in contact module + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Contacts/CardController.js + +commit 6e114b84be14675549d45957f3777122a4102cae +Author: Ludovic Marcotte +Date: Tue Aug 4 16:51:33 2015 -0400 + + (feat) reorganized menu + added view raw source feature + +M UI/MailerUI/UIxMailSourceView.h +M UI/MailerUI/UIxMailSourceView.m +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/MessageController.js + +commit dff7b59036461b2615592cc5a174fa1b4487f4ef +Author: Ludovic Marcotte +Date: Tue Aug 4 16:39:02 2015 -0400 + + (fix) wrong tagging for dialog content + +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit 7f43f894b0629d764bf802f19aee2232d8d83376 +Author: Ludovic Marcotte +Date: Tue Aug 4 16:08:17 2015 -0400 + + (fix) update the unseenCount when reading messages + +M UI/WebServerResources/js/Mailer/Message.service.js + +commit a27f106a4ada9fdc7101579a9de355607e3f54cb +Author: Ludovic Marcotte +Date: Tue Aug 4 13:52:31 2015 -0400 + + (fix) pimped ical viewer + +M UI/MailPartViewers/UIxMailPartICalViewer.h +M UI/MailPartViewers/UIxMailPartICalViewer.m +M UI/Templates/MailPartViewers/UIxMailPartICalViewer.wox +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/sgIMIP.directive.js +M UI/WebServerResources/scss/components/icon/icon.scss + +commit 95a360dd36e3b7111530d50cffc3c9935cd2933d +Author: Francis Lachapelle +Date: Tue Aug 4 13:45:17 2015 -0400 + + (fix) Variable test in Component service + +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 09224f587f447fd95251aa7d11a9ac608f43b985 +Author: Luc Charland +Date: Tue Aug 4 12:52:25 2015 -0400 + + Added a few tooltips for the mail view + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit ff1b9e7ed1349550dc6e22b7aae9c0d324d6dc07 +Author: Francis Lachapelle +Date: Tue Aug 4 10:56:55 2015 -0400 + + (fix) Draft initialization + +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/MessageController.js + +commit 6d260c58c7ad65dc9c1013c2ebef039d262cdfaa +Author: Francis Lachapelle +Date: Tue Aug 4 10:37:07 2015 -0400 + + (js) Update Gruntfile.js for changes in vendor js + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/Gruntfile.js + +commit ba69bd4c82e9f256eed409b05d99f347c44d19cb +Author: Francis Lachapelle +Date: Tue Aug 4 07:06:42 2015 -0400 + + (css) Improve color picker inside md-avatar + +M UI/WebServerResources/scss/components/button/button.scss + +commit 2a45a2133b1f27b89ab00107098e313d28cd88e5 +Author: Francis Lachapelle +Date: Mon Aug 3 16:34:44 2015 -0400 + + (fix) Padding of mail account delegation dialog + +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox + +commit 57fbc453a63296ebe8d02009e7e543e029976a52 +Author: Francis Lachapelle +Date: Mon Aug 3 16:32:59 2015 -0400 + + (html) Add avatars to ACL editor + +M UI/Templates/UIxAclEditor.wox + +commit f17b3638d79e9c56d9477585a18363328b1c5381 +Author: Francis Lachapelle +Date: Mon Aug 3 16:20:24 2015 -0400 + + (js) Fix usage of Settings.activeUser + +M UI/WebServerResources/js/Scheduler/Calendar.service.js + +commit 67517e0b2832a2a0ed45202dfd5027d43b307ff4 +Author: extrafu +Date: Mon Aug 3 20:40:59 2015 -0400 + + Update README.md + +M README.md + +commit d2b2cb186e358ffce254c66adc8d895a6c471cd7 +Author: Francis Lachapelle +Date: Mon Aug 3 16:18:23 2015 -0400 + + (js) Fix usage of Settings.activeUser + +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit ca8b64bd889def913100689581319208222bff4e +Author: Francis Lachapelle +Date: Mon Aug 3 16:17:02 2015 -0400 + + (js) Fix error when deleting an ACL user + +M UI/WebServerResources/js/Common/AclController.js + +commit 732b8c9d8a2003ae3a541cab710267de4797fb42 +Author: Francis Lachapelle +Date: Mon Aug 3 16:15:59 2015 -0400 + + (css) Fullscreen dialogs on small screens + +M UI/WebServerResources/scss/components/dialog/dialog.scss + +commit ba6418fb936f50fa2af73e4e62fa4361e439fc1a +Author: Francis Lachapelle +Date: Mon Aug 3 14:44:11 2015 -0400 + + (html) Review the toolbar of dialog boxes + +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/Common/AclController.js + +commit ab1cd36c7755ce76d83b13d2ff5b881c1bf71691 +Author: Francis Lachapelle +Date: Mon Aug 3 14:40:18 2015 -0400 + + Review delegation dialog in Mail app module + +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 9f2c5b5f506631b70ddae0fba71dd6ea4dbe9e82 +Author: Ludovic Marcotte +Date: Mon Aug 3 12:48:29 2015 -0400 + + (fix) added bg icon + +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox +M UI/Templates/UIxAclEditor.wox + +commit b6ea1de4c060ecc9e7ed923f6cc6928c37cbd34d +Author: Ludovic Marcotte +Date: Mon Aug 3 12:43:21 2015 -0400 + + (fix) improved message editor + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit 21f214659e277d99712bc51b0b409dc228ed105d +Author: Francis Lachapelle +Date: Mon Aug 3 12:16:16 2015 -0400 + + (fix) Some compilation warnings + +M SoObjects/Mailer/SOGoDraftObject.m +M SoObjects/Mailer/SOGoMailFolder.h +M SoObjects/Mailer/SOGoMailFolder.m +M SoObjects/Mailer/SOGoMailObject.m +M SoObjects/SOGo/SOGoUserManager.m + +commit 82720d341ca202e0d0289c04f89bb3bd5431a8ee +Author: Francis Lachapelle +Date: Mon Aug 3 12:03:56 2015 -0400 + + (fix) Some compilation warnings + +M UI/Contacts/UIxContactView.m +M UI/MailerUI/UIxMailActions.m +M UI/MailerUI/UIxMailMainFrame.m +M UI/MailerUI/UIxMailUserRightsEditor.h + +commit a330ff732017444c2481fe26ef1fcf663e053082 +Author: Francis Lachapelle +Date: Mon Aug 3 11:53:54 2015 -0400 + + (js) Move Settings to a value in Common ng module + + Also removed explicit settings and defaults that were imported in + various app modules. We now always use the Preferences ng service. + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Common/Acl.service.js +M UI/WebServerResources/js/Common/Alarm.service.js +M UI/WebServerResources/js/Common/Common.app.js +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Common/navController.js +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Preferences.app.js +M UI/WebServerResources/js/Preferences/Preferences.service.js +M UI/WebServerResources/js/Scheduler/Calendar.service.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 4cf82bd41ca195b3fca2d398946b99927e75ba72 +Author: Luc Charland +Date: Mon Aug 3 10:56:24 2015 -0400 + + removed trailing space to strings + +M UI/MailerUI/Arabic.lproj/Localizable.strings +M UI/MailerUI/Basque.lproj/Localizable.strings +M UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailerUI/Catalan.lproj/Localizable.strings +M UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MailerUI/Czech.lproj/Localizable.strings +M UI/MailerUI/Danish.lproj/Localizable.strings +M UI/MailerUI/Dutch.lproj/Localizable.strings +M UI/MailerUI/English.lproj/Localizable.strings +M UI/MailerUI/Finnish.lproj/Localizable.strings +M UI/MailerUI/French.lproj/Localizable.strings +M UI/MailerUI/German.lproj/Localizable.strings +M UI/MailerUI/Hungarian.lproj/Localizable.strings +M UI/MailerUI/Icelandic.lproj/Localizable.strings +M UI/MailerUI/Italian.lproj/Localizable.strings +M UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MailerUI/Polish.lproj/Localizable.strings +M UI/MailerUI/Russian.lproj/Localizable.strings +M UI/MailerUI/Slovak.lproj/Localizable.strings +M UI/MailerUI/Slovenian.lproj/Localizable.strings +M UI/MailerUI/SpanishArgentina.lproj/Localizable.strings +M UI/MailerUI/SpanishSpain.lproj/Localizable.strings +M UI/MailerUI/Swedish.lproj/Localizable.strings +M UI/MailerUI/Ukrainian.lproj/Localizable.strings +M UI/MailerUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Danish.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 9f202cfcdc984a2fcf8a1c4781f7280d27915b6a +Author: Luc Charland +Date: Mon Aug 3 10:24:15 2015 -0400 + + cleaned up a few comments + +M Scripts/verify_translations.py + +commit 6835cd5319d608a3cb7ab8e1246938fae45a670b +Author: Luc Charland +Date: Mon Aug 3 09:51:31 2015 -0400 + + removed double Name translation in 5 languages + +M UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings +M UI/Scheduler/Czech.lproj/Localizable.strings +M UI/Scheduler/Russian.lproj/Localizable.strings +M UI/Scheduler/Slovak.lproj/Localizable.strings +M UI/Scheduler/Ukrainian.lproj/Localizable.strings + +commit 31bc88d9d3c6d0fd446c744018aa5848ac423c36 +Author: Ludovic Marcotte +Date: Mon Aug 3 09:18:20 2015 -0400 + + Updated NEWS file regarding PR93 + + Conflicts: + + NEWS + +M NEWS + +commit f515106bcc2e4f80dc000f46a574ef0920b9a8bb +Author: Ludovic Marcotte +Date: Mon Aug 3 09:16:55 2015 -0400 + + (fix) added patch from PR93 + +M OpenChange/MAPIApplication.h +M OpenChange/MAPIApplication.m +M OpenChange/MAPIStoreCalendarFolder.m +M OpenChange/MAPIStoreCalendarMessage.m +M OpenChange/MAPIStoreContactsFolder.m +M OpenChange/MAPIStoreContext.m +M OpenChange/MAPIStoreDBFolder.m +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreGCSBaseContext.m +M OpenChange/MAPIStoreMailContext.m +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMailMessage.m +M OpenChange/MAPIStoreMailVolatileMessage.m +M OpenChange/MAPIStoreSOGo.m +M OpenChange/MAPIStoreTasksFolder.m +M OpenChange/MAPIStoreUserContext.h +M OpenChange/MAPIStoreUserContext.m +M SoObjects/Mailer/SOGoMailFolder.m +M SoObjects/SOGo/SOGoUserManager.m + +commit ec1420c19b3748345a1edda617988ed6d06ecbb6 +Author: Ludovic Marcotte +Date: Sun Aug 2 13:25:38 2015 -0400 + + (feat) now use mdDialog for message composition + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit f44af10cddb8cca5b565b8a7e63f75c998b2c5bc +Author: Ludovic Marcotte +Date: Fri Jul 31 15:40:00 2015 -0400 + + (feat) integrated the color picker in the pref module + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit e25305980f161b731c3d399c91a74118dfaa57b2 +Author: Ludovic Marcotte +Date: Fri Jul 31 14:54:55 2015 -0400 + + (fix) improved the account delegation dialog + +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox + +commit 0c7bdac0915e7d451fee606ec1a7a630f23bae21 +Author: Ludovic Marcotte +Date: Fri Jul 31 14:31:38 2015 -0400 + + (fix) refactored code and we now return the unseenCount when fetching uids + +M SoObjects/Mailer/SOGoMailFolder.h +M SoObjects/Mailer/SOGoMailFolder.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/UIxMailMainFrame.m +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 2f8f8c78f78ee2581bb994f98bc2daddfbe9d508 +Author: Luc Charland +Date: Fri Jul 31 13:54:03 2015 -0400 + + Removing colons + +M Scripts/verify_translations.py +M SoObjects/Appointments/Arabic.lproj/Localizable.strings +M SoObjects/Appointments/Basque.lproj/Localizable.strings +M SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +M SoObjects/Appointments/Catalan.lproj/Localizable.strings +M SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings +M SoObjects/Appointments/Czech.lproj/Localizable.strings +M SoObjects/Appointments/Danish.lproj/Localizable.strings +M SoObjects/Appointments/Dutch.lproj/Localizable.strings +M SoObjects/Appointments/English.lproj/Localizable.strings +M SoObjects/Appointments/Finnish.lproj/Localizable.strings +M SoObjects/Appointments/French.lproj/Localizable.strings +M SoObjects/Appointments/German.lproj/Localizable.strings +M SoObjects/Appointments/Hungarian.lproj/Localizable.strings +M SoObjects/Appointments/Icelandic.lproj/Localizable.strings +M SoObjects/Appointments/Italian.lproj/Localizable.strings +M SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings +M SoObjects/Appointments/NorwegianNynorsk.lproj/Localizable.strings +M SoObjects/Appointments/Polish.lproj/Localizable.strings +M SoObjects/Appointments/Russian.lproj/Localizable.strings +M SoObjects/Appointments/Slovak.lproj/Localizable.strings +M SoObjects/Appointments/Slovenian.lproj/Localizable.strings +M SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings +M SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings +M SoObjects/Appointments/Swedish.lproj/Localizable.strings +M SoObjects/Appointments/Ukrainian.lproj/Localizable.strings +M SoObjects/Appointments/Welsh.lproj/Localizable.strings +M UI/Contacts/Arabic.lproj/Localizable.strings +M UI/Contacts/Basque.lproj/Localizable.strings +M UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +M UI/Contacts/Catalan.lproj/Localizable.strings +M UI/Contacts/ChineseTaiwan.lproj/Localizable.strings +M UI/Contacts/Czech.lproj/Localizable.strings +M UI/Contacts/Danish.lproj/Localizable.strings +M UI/Contacts/Dutch.lproj/Localizable.strings +M UI/Contacts/English.lproj/Localizable.strings +M UI/Contacts/Finnish.lproj/Localizable.strings +M UI/Contacts/French.lproj/Localizable.strings +M UI/Contacts/German.lproj/Localizable.strings +M UI/Contacts/Hungarian.lproj/Localizable.strings +M UI/Contacts/Icelandic.lproj/Localizable.strings +M UI/Contacts/Italian.lproj/Localizable.strings +M UI/Contacts/NorwegianBokmal.lproj/Localizable.strings +M UI/Contacts/NorwegianNynorsk.lproj/Localizable.strings +M UI/Contacts/Polish.lproj/Localizable.strings +M UI/Contacts/Russian.lproj/Localizable.strings +M UI/Contacts/Slovak.lproj/Localizable.strings +M UI/Contacts/Slovenian.lproj/Localizable.strings +M UI/Contacts/SpanishArgentina.lproj/Localizable.strings +M UI/Contacts/SpanishSpain.lproj/Localizable.strings +M UI/Contacts/Swedish.lproj/Localizable.strings +M UI/Contacts/Ukrainian.lproj/Localizable.strings +M UI/Contacts/Welsh.lproj/Localizable.strings +M UI/MailerUI/Arabic.lproj/Localizable.strings +M UI/MailerUI/Basque.lproj/Localizable.strings +M UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailerUI/Catalan.lproj/Localizable.strings +M UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MailerUI/Czech.lproj/Localizable.strings +M UI/MailerUI/Danish.lproj/Localizable.strings +M UI/MailerUI/Dutch.lproj/Localizable.strings +M UI/MailerUI/English.lproj/Localizable.strings +M UI/MailerUI/Finnish.lproj/Localizable.strings +M UI/MailerUI/French.lproj/Localizable.strings +M UI/MailerUI/German.lproj/Localizable.strings +M UI/MailerUI/Hungarian.lproj/Localizable.strings +M UI/MailerUI/Icelandic.lproj/Localizable.strings +M UI/MailerUI/Italian.lproj/Localizable.strings +M UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MailerUI/Polish.lproj/Localizable.strings +M UI/MailerUI/Russian.lproj/Localizable.strings +M UI/MailerUI/Slovak.lproj/Localizable.strings +M UI/MailerUI/Slovenian.lproj/Localizable.strings +M UI/MailerUI/SpanishArgentina.lproj/Localizable.strings +M UI/MailerUI/SpanishSpain.lproj/Localizable.strings +M UI/MailerUI/Swedish.lproj/Localizable.strings +M UI/MailerUI/Ukrainian.lproj/Localizable.strings +M UI/MailerUI/Welsh.lproj/Localizable.strings +M UI/MainUI/Arabic.lproj/Localizable.strings +M UI/MainUI/Basque.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MainUI/Catalan.lproj/Localizable.strings +M UI/MainUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MainUI/Czech.lproj/Localizable.strings +M UI/MainUI/Danish.lproj/Localizable.strings +M UI/MainUI/Dutch.lproj/Localizable.strings +M UI/MainUI/English.lproj/Localizable.strings +M UI/MainUI/Finnish.lproj/Localizable.strings +M UI/MainUI/French.lproj/Localizable.strings +M UI/MainUI/German.lproj/Localizable.strings +M UI/MainUI/Hungarian.lproj/Localizable.strings +M UI/MainUI/Icelandic.lproj/Localizable.strings +M UI/MainUI/Italian.lproj/Localizable.strings +M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MainUI/Polish.lproj/Localizable.strings +M UI/MainUI/Russian.lproj/Localizable.strings +M UI/MainUI/Slovak.lproj/Localizable.strings +M UI/MainUI/Slovenian.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishSpain.lproj/Localizable.strings +M UI/MainUI/Swedish.lproj/Localizable.strings +M UI/MainUI/Ukrainian.lproj/Localizable.strings +M UI/MainUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Danish.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings +M UI/Scheduler/Arabic.lproj/Localizable.strings +M UI/Scheduler/Basque.lproj/Localizable.strings +M UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +M UI/Scheduler/Catalan.lproj/Localizable.strings +M UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings +M UI/Scheduler/Czech.lproj/Localizable.strings +M UI/Scheduler/Danish.lproj/Localizable.strings +M UI/Scheduler/Dutch.lproj/Localizable.strings +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/Finnish.lproj/Localizable.strings +M UI/Scheduler/French.lproj/Localizable.strings +M UI/Scheduler/German.lproj/Localizable.strings +M UI/Scheduler/Hungarian.lproj/Localizable.strings +M UI/Scheduler/Icelandic.lproj/Localizable.strings +M UI/Scheduler/Italian.lproj/Localizable.strings +M UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings +M UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings +M UI/Scheduler/Polish.lproj/Localizable.strings +M UI/Scheduler/Russian.lproj/Localizable.strings +M UI/Scheduler/Slovak.lproj/Localizable.strings +M UI/Scheduler/Slovenian.lproj/Localizable.strings +M UI/Scheduler/SpanishArgentina.lproj/Localizable.strings +M UI/Scheduler/SpanishSpain.lproj/Localizable.strings +M UI/Scheduler/Swedish.lproj/Localizable.strings +M UI/Scheduler/Ukrainian.lproj/Localizable.strings +M UI/Scheduler/Welsh.lproj/Localizable.strings +M UI/Templates/Appointments/SOGoAptMailReceipt.wox +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/ContactsUI/UIxListEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailSearch.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditor.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/Templates/SchedulerUI/UIxCalFilterPanel.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalViewPrint.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxComponentEditor.wox +M UI/Templates/SchedulerUI/UIxTaskEditor.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox +M UI/WebServerResources/angular-material + +commit 90b7ce7ec301120979e64a48aaa0ac0c6f704553 +Author: Luc Charland +Date: Thu Jul 30 10:37:36 2015 -0400 + + fixed Appointments path + +M Scripts/verify_translations.py + +commit 6ecea9d70267ab54b29e8bb3b1deee44d0b8b908 +Author: Luc Charland +Date: Thu Jul 30 10:26:43 2015 -0400 + + cleaned up a few comments + +M Scripts/verify_translations.py + +commit a54b8780a82db6c7401b558ee28972414907e218 +Author: Luc Charland +Date: Thu Jul 30 10:07:18 2015 -0400 + + added first draft of verify_translation + +A Scripts/verify_translations.py + +commit 40d269c504309ab9e9108a799663266f8355fcbe +Author: Ludovic Marcotte +Date: Fri Jul 31 13:32:14 2015 -0400 + + (feat) unseen count support folder all accounts/mailboxes + +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailMainFrame.m +M UI/MailerUI/product.plist +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 1d52be415fc33a33b00da92a3ce698e164aae15f +Author: Francis Lachapelle +Date: Fri Jul 31 11:18:29 2015 -0400 + + (html) Improve Calendar properties dialog + +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit 3b9a989abd0cbf4b164192eac17e87d5b967f70b +Author: Francis Lachapelle +Date: Fri Jul 31 11:11:55 2015 -0400 + + (js) New color picker directive + +M UI/WebServerResources/js/Common/Common.app.js +A UI/WebServerResources/js/Common/sgColorPicker.directive.js +M UI/WebServerResources/scss/components/gridList/gridList.scss + +commit a728616bca03eda490a4b0713297cdf18dffe597 +Author: Ludovic Marcotte +Date: Fri Jul 31 09:05:56 2015 -0400 + + (fix) comment typo + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit 65b83820200c186869db49e9faca68705386c5a4 +Author: Ludovic Marcotte +Date: Thu Jul 30 19:47:53 2015 -0400 + + (fix) move refresh timeout to service classes and enabled repeating timers + +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit 85f4efab46904fa23bf1e46205e31630b25837c1 +Author: Ludovic Marcotte +Date: Thu Jul 30 14:51:14 2015 -0400 + + (fix) refactored to code + +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit af7fb1c6eec50f841e02e8ac8a1e090d777167b1 +Author: Ludovic Marcotte +Date: Thu Jul 30 13:25:50 2015 -0400 + + (fix) modified the template so it shares the same l&f as the contacts one + +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit a52d42f6b274cd0c008bdb58be74124157c83130 +Author: Ludovic Marcotte +Date: Thu Jul 30 13:06:28 2015 -0400 + + (feat) manual+auto refresh support for addressbooks/mailboxes + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit 1f8edbdd1f32f68d9e42c5e720100545171067e9 +Author: Francis Lachapelle +Date: Thu Jul 30 12:05:33 2015 -0400 + + (js) Respect SOGoCalendarDefaultReminder in editor + +M SOPE/NGCards/iCalTrigger.m +M UI/Scheduler/UIxReminderEditor.m +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit b61eb00b99b1fe299040fbba8bd1cd121a6e33e4 +Author: Francis Lachapelle +Date: Thu Jul 30 11:55:02 2015 -0400 + + (js) Reload lists when (en|dis)abling a calendar + + Only the displayed list was refresh. Now we invalidate the hidden list. + +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 449093c3f0e84ba8dd15c5a7eed47086c844bd32 +Author: Francis Lachapelle +Date: Thu Jul 30 11:51:02 2015 -0400 + + (fix) Calendar destination of new task + + Also removed the possibility to use the "moveToCalendar" parameter. We + should eventually create UIxTaskActions.m as we have + UIxAppointmentActions.m for this kind of actions. + +M UI/Scheduler/UIxTaskEditor.m + +commit 0fc7c969247abe4d44772a222fe60cb9d78f4973 +Author: Ludovic Marcotte +Date: Wed Jul 29 19:10:03 2015 -0400 + + (fix) use proper values for short/long date formats + +M SoObjects/SOGo/SOGoDefaults.plist +M UI/PreferencesUI/UIxPreferences.m + +commit b73450e992e7fe4463b150d310040863e446ea3c +Author: Francis Lachapelle +Date: Wed Jul 29 16:45:16 2015 -0400 + + (fix) Label color of pseudo-input + + It now matches the one of ng-material. + +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss + +commit 8e0038715243e7543c3c1608f513698af86551fe +Author: Francis Lachapelle +Date: Wed Jul 29 16:44:18 2015 -0400 + + (fix) CSS padding style of toolbar + +M UI/WebServerResources/scss/components/toolbar/toolbar.scss + +commit b6a5eb0b600886cce5a58e6e143b1441f57ddc77 +Author: Francis Lachapelle +Date: Wed Jul 29 16:43:10 2015 -0400 + + (fix) Disable frequency when editing an occurrence + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox + +commit d7b7824aad4f4f87f5811bf43431224c9d3e49fb +Author: Francis Lachapelle +Date: Wed Jul 29 16:23:41 2015 -0400 + + Improve display of attendees in event viewer + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit 3e6c50b7dc2fb192868ee117a05483b35a8ee84c +Author: Francis Lachapelle +Date: Wed Jul 29 15:53:55 2015 -0400 + + (cleanup) Remove ionic templates + +D UI/Templates/Themes/mobile/CommonUI/UIxPageFrame.wox +D UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +D UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +D UI/Templates/Themes/mobile/MainUI/SOGoRootPage.wox + +commit 9291dc29b64936b761c96a59abce9bfcf71dcd86 +Author: Ludovic Marcotte +Date: Wed Jul 29 15:51:52 2015 -0400 + + Removed old file + +D ChangeLog.skyrix + +commit f5927944fa422b6ee7e4a174f51a858e2cb5eebf +Author: Francis Lachapelle +Date: Wed Jul 29 15:48:29 2015 -0400 + + (fix) Missing header file import + +M UI/MailPartViewers/UIxMailPartMessageViewer.m + +commit 16885f4ebfd4e40e602e5a712b4bf65491852094 +Author: Ludovic Marcotte +Date: Wed Jul 29 15:37:55 2015 -0400 + + (fix) properly handle subparts compilation for message/rfc822 message parts + +M UI/MailPartViewers/UIxMailPartMessageViewer.m +M UI/Templates/MailPartViewers/UIxMailPartMessageViewer.wox +M UI/WebServerResources/js/Mailer/Message.service.js + +commit d3a233b222185f74a1d31ad9a0c0e18177141d5d +Author: Francis Lachapelle +Date: Wed Jul 29 15:16:43 2015 -0400 + + (js) Improve Angular modules initialization + +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit 7e10cff395c4a95c6aa634e87401678cd7f58b71 +Author: Francis Lachapelle +Date: Wed Jul 29 11:47:01 2015 -0400 + + (js) Restore user's last Calendar view + + Also reviewed the handling of Angular modules dependencies. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Common/Common.app.js +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/js/Scheduler/Calendar.service.js +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 762f3059148c5742076f6301793c55e9f8b5a0ee +Author: Francis Lachapelle +Date: Wed Jul 29 10:11:28 2015 -0400 + + (cleanup) No longer used JavasScript + +D UI/WebServerResources/js/Common/ui-desktop.js +D UI/WebServerResources/js/Common/ui-mobile.js +D UI/WebServerResources/js/mobile/ContactsUI.js +D UI/WebServerResources/js/mobile/MailerUI.js +D UI/WebServerResources/js/mobile/SOGoRootPage.js +D UI/WebServerResources/md-colors/README.md +D UI/WebServerResources/md-colors/colors.js +D UI/WebServerResources/md-colors/index.html +D UI/WebServerResources/md-colors/script.js + +commit e208ee3fdef30b13adb28cf3915a7809975df0c9 +Author: Francis Lachapelle +Date: Tue Jul 28 20:45:46 2015 -0400 + + (feat) Open events from day and week views + +M UI/Scheduler/UIxCalListingActions.m +M UI/Templates/SchedulerUI/UIxCalDayTable.wox +M UI/WebServerResources/js/Scheduler/sgCalendarDayBlock.directive.js +M UI/WebServerResources/js/Scheduler/sgCalendarDayTable.directive.js + +commit 571be37c1d50c83974e0e94921c12e7e7e8fc962 +Author: Francis Lachapelle +Date: Tue Jul 28 15:53:48 2015 -0400 + + (scss) Indentation + +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit 433983e7c46e7e6a65a52ec680c20fea07d2513a +Author: Francis Lachapelle +Date: Tue Jul 28 14:37:49 2015 -0400 + + (fix) DI annotation of sgIMAP controller + +M UI/WebServerResources/js/Mailer/sgIMIP.directive.js + +commit d7aae0e667badfe158f73529756e60755e90d372 +Author: Francis Lachapelle +Date: Tue Jul 28 14:21:19 2015 -0400 + + (fix) _.allKeys doesn't exist in lodash + +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit e87a6de46b682b920a09f8540592ff6fc1549918 +Author: Francis Lachapelle +Date: Tue Jul 28 14:16:56 2015 -0400 + + (html) Remove previous "hack" for ng-material + + The md-menu positioned as a secondary action in a list can now be + properly hidden. ng-material is just getting better :) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 13a779019b5f45dbbdedcf28f1882b0bf43460e1 +Author: Francis Lachapelle +Date: Tue Jul 28 14:13:48 2015 -0400 + + (html) Add toolbar to dialog boxes + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox +M UI/Templates/UIxAclEditor.wox + +commit 17432deaa78d482dba0a8ef201fe9de646fe065d +Author: Ludovic Marcotte +Date: Tue Jul 28 13:05:05 2015 -0400 + + (fix) reset alarm after popping it + +M UI/WebServerResources/js/Common/Alarm.service.js + +commit 7365f77dd5336d41ba9aff35fd1cf8d14bf482fe +Author: Ludovic Marcotte +Date: Tue Jul 28 11:54:49 2015 -0400 + + (feat) new Alarm service + alarms support in all modules + +M UI/Scheduler/UIxReminderEditor.h +M UI/Scheduler/UIxReminderEditor.m +A UI/WebServerResources/js/Common/Alarm.service.js +M UI/WebServerResources/js/Common/navController.js +M UI/WebServerResources/js/Scheduler/ComponentController.js +M UI/WebServerResources/scss/styles.scss + +commit e8dcc6df374ab43ab4687c85d2d3d687c79e24cd +Author: Francis Lachapelle +Date: Tue Jul 28 10:53:29 2015 -0400 + + (js) New common ACL Controller + +M UI/Templates/UIxAclEditor.wox +A UI/WebServerResources/js/Common/AclController.js +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Mailer/MailboxesController.js +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit a8765eb41bc68c26034986f24c9621dbfc14b2c5 +Author: Francis Lachapelle +Date: Mon Jul 27 20:43:43 2015 -0400 + + (fix) Autocompletion in mail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit c700608f0f7a0bf4b234e9e528335606b6bda3d6 +Author: Francis Lachapelle +Date: Mon Jul 27 20:11:57 2015 -0400 + + (fix) Sidenav list items display of Preferences + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 86a0032cc1284321269e356d9c8b8f614b80a888 +Author: Francis Lachapelle +Date: Mon Jul 27 16:02:05 2015 -0400 + + Handle the edition of recurring event occurrences + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxCalListingActions.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/WebServerResources/js/Scheduler/Calendar.service.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit 049c1385d68cafebea177f7d4814a76c1a788518 +Author: Francis Lachapelle +Date: Mon Jul 27 13:50:14 2015 -0400 + + (fix) Event propagation when saving component + +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit a168d0227d51eeccf970fff0a6b3ed1c58c4b623 +Author: Francis Lachapelle +Date: Mon Jul 27 13:27:12 2015 -0400 + + (js) Use lodash and remove old dependencies + + Replaced underscore by lodash + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit 40dd3e587517fb3f512e9dc06992657ed308d88a +Author: Ludovic Marcotte +Date: Mon Jul 27 12:47:40 2015 -0400 + + (fix) reworked c_ prefixes on givenname,cn,sn,o and component. + + This makes it easier to map to the quick table and avoid + fields duplications. + +M SoObjects/Contacts/SOGoContactGCSFolder.m +M SoObjects/Contacts/SOGoContactSourceFolder.m +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxContactView.m +M UI/Contacts/UIxContactsListActions.m +M UI/Contacts/UIxListEditor.m +M UI/Contacts/UIxListView.m +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/Card.service.js + +commit dc9a0896e598c7bf8a4d82ec0ecff68c035601ec +Author: Francis Lachapelle +Date: Fri Jul 24 16:14:53 2015 -0400 + + (js) Fix possible errors (help from jsjint) + +M UI/WebServerResources/js/Common/Acl.service.js +M UI/WebServerResources/js/Common/Authentication.service.js +M UI/WebServerResources/js/Common/Dialog.service.js +M UI/WebServerResources/js/Common/Gravatar.service.js +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Common/sgFocus.service.js +M UI/WebServerResources/js/Common/sgFolderStylesheet.directive.js +M UI/WebServerResources/js/Common/sgSearch.directive.js +M UI/WebServerResources/js/Common/sgSubscribe.directive.js +M UI/WebServerResources/js/Common/sgToggleGrid.directive.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Contacts/CardController.js +M UI/WebServerResources/js/Contacts/sgAddress.directive.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js +M UI/WebServerResources/js/Mailer/sgIMIP.directive.js +M UI/WebServerResources/js/Preferences/PreferencesController.js +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/js/Scheduler/Calendar.service.js +M UI/WebServerResources/js/Scheduler/CalendarsController.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit e064dc4a46408a0ae1ad14bdef149b7b605e216a +Author: Francis Lachapelle +Date: Fri Jul 24 15:45:19 2015 -0400 + + (js) Add support for local URL in sgAvatarImage + + Directive was previously named sgGravatarImage. + + The local URL will be used before falling back to Gravatar. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/Templates/SchedulerUI/UIxAttendeesEditor.wox +A UI/WebServerResources/js/Common/sgAvatarImage.directive.js +D UI/WebServerResources/js/Common/sgGravatarImage.directive.js + +commit 843a689094b84892b03c25a2bb3f1f441eba84e3 +Author: Francis Lachapelle +Date: Fri Jul 24 15:22:35 2015 -0400 + + (js) Enable jshint and uglify + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/package.json + +commit f09c06f8c4bcb1af0f9a239ffa1e48e6f108fb2e +Author: Ludovic Marcotte +Date: Fri Jul 24 15:35:29 2015 -0400 + + (feat) show folders stats + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit c365d646a29ec89c4340e713fe4f7c6c1a1ead35 +Author: Ludovic Marcotte +Date: Fri Jul 24 14:40:07 2015 -0400 + + (feat) ability to set folders as drafts/trash/sent + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit cbbb3dd9d43d91ab13214e2ced580071901abe99 +Author: Ludovic Marcotte +Date: Fri Jul 24 11:21:04 2015 -0400 + + (feat) show error message (like submission max) when sending mails + +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit c5a35a64a22c5f5c79914079d5d1ccf5c9df7974 +Author: Ludovic Marcotte +Date: Fri Jul 24 11:19:57 2015 -0400 + + (fix) SOGoMaximumMessageSubmissionCount should be independant from SOGoMaximumRecipientCount + +M UI/MailerUI/UIxMailEditor.m + +commit a03715f74a60dbf700fc0820471f5d103e613015 +Author: Ludovic Marcotte +Date: Fri Jul 24 10:21:33 2015 -0400 + + (fix) show proper icon for shared mailboxes + +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 51b8ce740003a2f6003db00f62a5a4932f7c3516 +Author: Francis Lachapelle +Date: Thu Jul 23 15:32:56 2015 -0400 + + (doc) Improve documentation of angular filters + +M UI/WebServerResources/js/Common/loc.filter.js +M UI/WebServerResources/js/Common/range.filter.js + +commit 2981b0af00e127eb608f1fb4611e1548546ed956 +Author: Francis Lachapelle +Date: Thu Jul 23 15:22:50 2015 -0400 + + (js) New 'range' filter for angular + +A UI/WebServerResources/js/Common/range.filter.js + +commit 194c5635b50486d17eb5763723bb4d6753cce754 +Author: Ludovic Marcotte +Date: Thu Jul 23 11:51:36 2015 -0400 + + Updates for the release + +M ChangeLog +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS +M Version + +commit 73d62800e8cff16fe84e28833b3e828486980171 Author: Francis Lachapelle Date: Thu Jul 23 11:49:07 2015 -0400 @@ -7,77 +2961,7 @@ Date: Thu Jul 23 11:49:07 2015 -0400 M UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings M UI/MailerUI/SpanishArgentina.lproj/Localizable.strings -commit dec152e8e57ccec8b2177f4e9ffb345ec7081cf4 -Author: Francis Lachapelle -Date: Thu Jul 23 11:47:53 2015 -0400 - - Update CKEditor to version 4.5.1 - -M NEWS -M UI/WebServerResources/ckeditor/LICENSE.md -M UI/WebServerResources/ckeditor/build-config.js -M UI/WebServerResources/ckeditor/ckeditor.js -M UI/WebServerResources/ckeditor/contents.css -M UI/WebServerResources/ckeditor/lang/ar.js -M UI/WebServerResources/ckeditor/lang/ca.js -M UI/WebServerResources/ckeditor/lang/cs.js -M UI/WebServerResources/ckeditor/lang/cy.js -M UI/WebServerResources/ckeditor/lang/da.js -M UI/WebServerResources/ckeditor/lang/de.js -M UI/WebServerResources/ckeditor/lang/en.js -M UI/WebServerResources/ckeditor/lang/es.js -A UI/WebServerResources/ckeditor/lang/eu.js -M UI/WebServerResources/ckeditor/lang/fi.js -M UI/WebServerResources/ckeditor/lang/fr.js -M UI/WebServerResources/ckeditor/lang/hu.js -M UI/WebServerResources/ckeditor/lang/is.js -M UI/WebServerResources/ckeditor/lang/it.js -M UI/WebServerResources/ckeditor/lang/nb.js -M UI/WebServerResources/ckeditor/lang/nl.js -M UI/WebServerResources/ckeditor/lang/no.js -M UI/WebServerResources/ckeditor/lang/pl.js -M UI/WebServerResources/ckeditor/lang/pt-br.js -M UI/WebServerResources/ckeditor/lang/ru.js -M UI/WebServerResources/ckeditor/lang/sk.js -A UI/WebServerResources/ckeditor/lang/sl.js -M UI/WebServerResources/ckeditor/lang/sv.js -M UI/WebServerResources/ckeditor/lang/uk.js -A UI/WebServerResources/ckeditor/lang/zh.js -M UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js -M UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js -M UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.js -M UI/WebServerResources/ckeditor/plugins/dialog/dialogDefinition.js -M UI/WebServerResources/ckeditor/plugins/div/dialogs/div.js -M UI/WebServerResources/ckeditor/plugins/icons.png -M UI/WebServerResources/ckeditor/plugins/icons_hidpi.png -M UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js -M UI/WebServerResources/ckeditor/plugins/link/dialogs/anchor.js -M UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js -M UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js -M UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js -M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/ciframe.html -M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmpFrameset.html -M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.css -M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.js -M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc_ie.js -M UI/WebServerResources/ckeditor/skins/moono/dialog.css -M UI/WebServerResources/ckeditor/skins/moono/dialog_ie.css -M UI/WebServerResources/ckeditor/skins/moono/dialog_ie7.css -M UI/WebServerResources/ckeditor/skins/moono/dialog_ie8.css -M UI/WebServerResources/ckeditor/skins/moono/dialog_iequirks.css -M UI/WebServerResources/ckeditor/skins/moono/editor.css -M UI/WebServerResources/ckeditor/skins/moono/editor_gecko.css -M UI/WebServerResources/ckeditor/skins/moono/editor_ie.css -M UI/WebServerResources/ckeditor/skins/moono/editor_ie7.css -M UI/WebServerResources/ckeditor/skins/moono/editor_ie8.css -M UI/WebServerResources/ckeditor/skins/moono/editor_iequirks.css -M UI/WebServerResources/ckeditor/skins/moono/icons.png -M UI/WebServerResources/ckeditor/skins/moono/icons_hidpi.png -A UI/WebServerResources/ckeditor/skins/moono/images/spinner.gif -M UI/WebServerResources/ckeditor/skins/moono/readme.md -M UI/WebServerResources/ckeditor/styles.js - -commit 4922e6004d52ae0ccf99ac4f141d6d6f6db41cbe +commit c5834e2f89977cf4173d229853d4a3f30336348d Author: Francis Lachapelle Date: Thu Jul 23 11:13:26 2015 -0400 @@ -89,7 +2973,7 @@ A UI/Templates/SOGoACLBasqueRemovalAdvisory.wox A UI/Templates/SOGoFolderBasqueAdditionAdvisory.wox A UI/Templates/SOGoFolderBasqueRemovalAdvisory.wox -commit b91972d1dc178a66144d371f121e211d46b2f1a3 +commit ab28476e7e32da7b9bead47260d562fd0f7deab5 Author: Francis Lachapelle Date: Thu Jul 23 11:12:16 2015 -0400 @@ -97,7 +2981,7 @@ Date: Thu Jul 23 11:12:16 2015 -0400 A UI/Templates/SOGoACLSolvenianModificationAdvisory.wox -commit 5c3cdda186dff8c39fb3a13de4b51d79efc23cc3 +commit 538e6fa4b1937e45078c4c5a0ca4e0ecfb60e2d9 Author: Francis Lachapelle Date: Thu Jul 23 11:09:04 2015 -0400 @@ -193,15 +3077,7 @@ A UI/Templates/SOGoACLChineseTaiwanRemovalAdvisory.wox A UI/Templates/SOGoFolderChineseTaiwanAdditionAdvisory.wox A UI/Templates/SOGoFolderChineseTaiwanRemovalAdvisory.wox -commit 4b19e64071a3c8173a63714c633e9a94b76fd7e5 -Author: Ludovic Marcotte -Date: Thu Jul 23 10:22:36 2015 -0400 - - (fix) fallback to utf-8/latin1 in rare decoding error cases - this is ugly - -M UI/MailPartViewers/UIxMailPartHTMLViewer.m - -commit b6dee056ca98131fb36abff11cf0850e7b8de921 +commit c3aa601f3c5353c9acc3109916195984b7580c19 Author: Francis Lachapelle Date: Thu Jul 23 08:46:08 2015 -0400 @@ -209,11 +3085,15 @@ Date: Thu Jul 23 08:46:08 2015 -0400 M SoObjects/Appointments/iCalPerson+SOGo.m -commit 6830d6d930b1b07e1732e7108b11f78ce4e40f7c +commit 613f05ac021329c7ff838305d2f49a2f79c30819 Author: Francis Lachapelle Date: Wed Jul 22 16:45:42 2015 -0400 Calendar module optimizations in multidomain setup + + Conflicts: + NEWS + UI/Common/UIxUserRightsEditor.m M NEWS M SoObjects/Appointments/SOGoAppointmentObject.m @@ -225,7 +3105,7 @@ M UI/Common/UIxUserRightsEditor.m M UI/MailPartViewers/UIxMailPartICalActions.m M UI/Scheduler/UIxAppointmentEditor.m -commit 366ad44cd168b0e81f842a1edf65ca1e0e27f061 +commit 8f497785019bfb1672af7a81b52b9b903ad8b46c Author: Francis Lachapelle Date: Wed Jul 22 16:42:06 2015 -0400 @@ -234,7 +3114,7 @@ Date: Wed Jul 22 16:42:06 2015 -0400 M SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod M SoObjects/Mailer/SOGoMailEnglishForward.wo/SOGoMailEnglishForward.wod -commit 9430f40101036134eb9386f87472abe2727ae323 +commit f0b88811d640084d4dcb43aa64840f4e0f27913a Author: Francis Lachapelle Date: Wed Jul 22 16:41:37 2015 -0400 @@ -322,16 +3202,49 @@ A UI/Templates/SOGoACLSlovenianRemovalAdvisory.wox A UI/Templates/SOGoFolderSlovenianAdditionAdvisory.wox A UI/Templates/SOGoFolderSlovenianRemovalAdvisory.wox -commit b7c2d8ae9509033a0cd13838324964193f9b11bf +commit c1d744e47a7f05b80b3c6936f5a66eca613679ea +Author: Francis Lachapelle +Date: Thu Jul 23 11:59:15 2015 -0400 + + (js) Reset "selectedCard" when cancelling new card + +M UI/WebServerResources/js/Contacts/CardController.js + +commit 12875539bbbd94987fbf4f37beea9f3e3a5c94a8 Author: Ludovic Marcotte -Date: Wed Jul 22 14:49:09 2015 -0400 +Date: Thu Jul 23 10:22:36 2015 -0400 - (fix) we now respect the cr/lf in event's description (#3228) + (fix) fallback to utf-8/latin1 in rare decoding error cases - this is ugly -M NEWS -M UI/WebServerResources/UIxCalViewPrint.js +M UI/MailPartViewers/UIxMailPartHTMLViewer.m -commit f03e7a66043342880ce8f8b019893a6a636694b2 +commit a8dd698425db662757cc9de1957424081f9f6a58 +Author: Ludovic Marcotte +Date: Thu Jul 23 10:54:46 2015 -0400 + + (feat) added "select all" capability, just an idea + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit f8b6864553ca25e3a96a7f88d40727fb20b5f46d +Author: Francis Lachapelle +Date: Wed Jul 22 17:27:46 2015 -0400 + + (js) Remove Mailbox dependency in Preferences + +M UI/WebServerResources/js/Preferences/Preferences.service.js +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 01f213e65e6888a97c7bd35a3815e28c2c906e9a +Author: Francis Lachapelle +Date: Wed Jul 22 12:10:25 2015 -0400 + + (fix) Main toolbar of contacts module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 22ead81c48fd5240098e47acc93239e7cec2b660 Author: Ludovic Marcotte Date: Wed Jul 22 11:54:50 2015 -0400 @@ -339,7 +3252,17 @@ Date: Wed Jul 22 11:54:50 2015 -0400 M Documentation/SOGoInstallationGuide.asciidoc -commit 4e7a3ce5fac99efd712168986016295e8e47629a +commit a7afcbf4a06a08b625aa959463176053c3d57da7 +Author: Francis Lachapelle +Date: Wed Jul 22 11:28:08 2015 -0400 + + (js) Use user's settings when sorting messages + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit a8ab01a5eb59758c742a46b17c058902605abacb Author: Ludovic Marcotte Date: Wed Jul 22 10:26:09 2015 -0400 @@ -349,7 +3272,7 @@ M ActiveSync/SOGoActiveSyncDispatcher.m M ActiveSync/SOGoMailObject+ActiveSync.m M NEWS -commit 61c542cb959611e90b25565cbc20006ad76215a4 +commit 731264d9dc1007cf2925dcaa5ea59df929295e97 Author: Ludovic Marcotte Date: Wed Jul 22 10:12:47 2015 -0400 @@ -357,7 +3280,7 @@ Date: Wed Jul 22 10:12:47 2015 -0400 M SoObjects/SOGo/SQLSource.m -commit d2640e1501708fcf38f8887e26b14378aae73690 +commit 046c4db2e81e7e634020d3adcd354a2a2e343d02 Author: Ludovic Marcotte Date: Wed Jul 22 09:59:36 2015 -0400 @@ -366,7 +3289,20 @@ Date: Wed Jul 22 09:59:36 2015 -0400 M ActiveSync/SOGoMailObject+ActiveSync.m M NEWS -commit 20b91cc7bff3f5cafe0b77a7b3612332285f356f +commit ac2164963338e4f2d70bcb209373d19d163f3218 +Author: Ludovic Marcotte +Date: Mon Jun 22 09:19:54 2015 -0400 + + (feat) added support for DeletesAsMoves over EAS + + Conflicts: + + ActiveSync/SOGoActiveSyncDispatcher+Sync.m + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit efd182f1456055df11c65bc323f17966e5512c6f Author: Ludovic Marcotte Date: Wed Jul 22 09:46:06 2015 -0400 @@ -375,7 +3311,7 @@ Date: Wed Jul 22 09:46:06 2015 -0400 M ActiveSync/SOGoActiveSyncDispatcher+Sync.m M NEWS -commit b05f7a5bebffd414a51c45b1776ff3f53b7d5f7a +commit b6c6e09a5a6066723da8cf4a82978cdea94b04d2 Author: Ludovic Marcotte Date: Wed Jul 22 09:25:29 2015 -0400 @@ -383,131 +3319,962 @@ Date: Wed Jul 22 09:25:29 2015 -0400 M ActiveSync/SOGoActiveSyncDispatcher.m -commit 3a61b7bae49dc750ab20001dbe9ce12de654d382 +commit 83a8f388ce48a4e37378f4be3270c55dba43b2ae Author: Ludovic Marcotte Date: Wed Jul 22 09:15:34 2015 -0400 Android EAS Lollipop fixes (#3268 and #3269) + + Conflicts: + + NEWS M ActiveSync/SOGoActiveSyncDispatcher.m M NEWS -commit 7c6c78d13b890a086eb1a9bef92f947f4aaa073a +commit 86504929893dc5bebf921afff96d8e0a1bd02d34 Author: Ludovic Marcotte -Date: Sun Jul 19 13:37:08 2015 -0400 +Date: Wed Jul 22 09:05:17 2015 -0400 - Updated NEWS file regarding PR from Zentyal folks - -M NEWS - -commit 936c38c43e8c39fa5ad2e00c66456493e2a4f032 -Author: Julio García -Date: Tue Jul 7 14:25:17 2015 +0200 - - Remove not needed block in SoObjects/SOGo/SOGoUserManager.m - -M SoObjects/SOGo/SOGoUserManager.m - -commit 62b16f4ef35202cbaf37a43f54e589bd051f902d -Author: Enrique J. Hernández Blasco -Date: Mon Jun 29 23:50:55 2015 +0200 - - oc: Check PidTagObjectType before dereferencing on ModifyRecipients - - This is crashing when the PidTagObjectType property is set for - some recipient and not for others. - - If the property is missing, then no object type for the recipient - is assumed. + Applied PR90 as a patch due to too-many merge conflicts when cherry-picking +M ActiveSync/SOGoActiveSyncDispatcher.m M OpenChange/MAPIStoreMessage.m +M SoObjects/Appointments/SOGoAppointmentObject.m +M SoObjects/SOGo/BSONCodec.m +M SoObjects/SOGo/LDAPSource.m +M SoObjects/SOGo/SOGoSession.m +M SoObjects/SOGo/SOGoUserManager.m +M Tools/GNUmakefile +A Tools/SOGoToolCreateFolder.m +A Tools/SOGoToolRestore.h +M Tools/SOGoToolRestore.m -commit b86b1afdb9a838cb4e13c99f44849652927058ec +commit cc03430ac699668ef6cc6f32bc02f2758e92882d +Author: Francis Lachapelle +Date: Tue Jul 21 15:37:22 2015 -0400 + + (fix) Don't hide "new" button on small screens + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 9c464c15adf7171e5299c06beb712d99bad0a32b +Author: Francis Lachapelle +Date: Tue Jul 21 15:36:03 2015 -0400 + + (fix) Show/hide completed tasks in list + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 82ed44ee318a98ca3b1e1fc3c6d1f55c1fc5d3b8 +Author: Ludovic Marcotte +Date: Tue Jul 21 15:48:31 2015 -0400 + + (fix) added more proper menu activation for the mailer + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js + +commit d7c008f2d9a526eeb0210e216af0be1bdc45f1e5 +Author: Ludovic Marcotte +Date: Tue Jul 21 15:21:57 2015 -0400 + + (feat) timezones are now using md-autocomplete + +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit ea68715f59f533f18ea7c342825c3036f1c0667e +Author: Ludovic Marcotte +Date: Tue Jul 21 11:19:47 2015 -0400 + + (feat) support for drafts autosaving + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit 601ed94d7724cc0bee53a25e7134bf06557f4691 +Author: Francis Lachapelle +Date: Tue Jul 21 10:15:02 2015 -0400 + + Update product.plist for new component templates + +M UI/Scheduler/product.plist + +commit bee36814e514354a749b104e13e87b3cf3919a69 +Author: Ludovic Marcotte +Date: Tue Jul 21 09:28:54 2015 -0400 + + (feat) added many missing actions on mail folders + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit a75524af9f671ef92316c8e6b4a229d5fc1c78d8 +Author: Francis Lachapelle +Date: Tue Jul 21 08:26:50 2015 -0400 + + Review task/event viewer/editor + + Components will now appear in dialogs instead of a right sidenav. + + This commit also introduces read-only viewers for tasks and events. + +M UI/Scheduler/UIxCalMainView.m +M UI/Scheduler/UIxTaskEditor.m +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +A UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxReminderEditor.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +A UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/ComponentController.js +M UI/WebServerResources/scss/components/chips/chips.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit 5eeb473fe8ec1ec3985b6ef5ceafcc53972bba71 +Author: Ludovic Marcotte +Date: Mon Jul 20 16:44:26 2015 -0400 + + (feat) initial sort/search feature for mails + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js + +commit dfb750caf441d4c45368cc83be7394760e17aeb1 +Author: Francis Lachapelle +Date: Mon Jul 20 15:32:57 2015 -0400 + + (fix) Resolve addressbook before rendering view + +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit cdd449fec9f384f0d6f5fefc63302161080695b2 +Author: Ludovic Marcotte +Date: Mon Jul 20 15:03:29 2015 -0400 + + (feat) search capabilities in the addressbook module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit 7c2cb259a2fea6e2d18610fb6b7568c96acde9eb +Author: Ludovic Marcotte +Date: Mon Jul 20 14:24:36 2015 -0400 + + (feat) sorting capabilities in the addressbook module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit e7a73413d57243c738614e53fd1d29c6b2a8f9fd +Author: Ludovic Marcotte +Date: Sun Jul 19 08:39:56 2015 -0400 + + (fix) SOGo adjustment regarding https://github.com/angular/material/commit/dbafaa14473b41e262d55f8f6d06f818f4d88654 + +M UI/WebServerResources/scss/core/variables.scss + +commit 4c51d4702f0e381fb8928df819aee16679e34a6c +Author: Francis Lachapelle +Date: Thu Jul 16 16:29:54 2015 -0400 + + (fix) List members auto-completion + +M UI/WebServerResources/js/Contacts/CardController.js + +commit 191a1afe23612196c2744c60dd725581f2bcf742 +Author: Francis Lachapelle +Date: Thu Jul 16 16:29:00 2015 -0400 + + (fix) Filtering components lists + +M UI/WebServerResources/js/Scheduler/CalendarListController.js + +commit 8c8070ff16a17f4151808dab945994df0dd42599 +Author: Francis Lachapelle +Date: Thu Jul 16 16:26:09 2015 -0400 + + (fix) Respect order of cards list + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit ee0e45cad628210d5cecd32b3883fc991483f041 +Author: Francis Lachapelle +Date: Thu Jul 16 11:21:55 2015 -0400 + + (js) Respect user's default classification + +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit d58030a475bda06e001809e95f93b1ef74134312 +Author: Francis Lachapelle +Date: Wed Jul 15 16:30:19 2015 -0400 + + (css) Cleanup and fixes for latest md changes + +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/input/input.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/LoginUI.scss + +commit d1e1d11e4aeb4b1e3d40ec0f98655a878873bca7 +Author: Francis Lachapelle +Date: Wed Jul 15 15:27:51 2015 -0400 + + (html) Move close button of card & msg viewer + + The close button is only displayed on small devices (show-sm). + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit f09f1a42826a4c4d52756acf6cfd79ab6730aa85 +Author: Francis Lachapelle +Date: Wed Jul 15 15:20:08 2015 -0400 + + (fix) Respect order in list of cards + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit 25f364991ebbef964d2889f44a81c6de083bec52 +Author: Francis Lachapelle +Date: Wed Jul 15 15:15:17 2015 -0400 + + (fix) Creation of card/list in Contacts module + +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBookController.js + +commit 730b803ad6bab70dec9a5fd79f8cfe3485545420 +Author: Francis Lachapelle +Date: Wed Jul 15 13:44:17 2015 -0400 + + (js) Replace vs-repeat by md-virtual-repeat + + There're some issues with mdVirtualRepeat that required some changes to + our app: + + 1. Having multiple directives with md-virtual-repeat doesn't work well. + That why I added a dedicated div for the md-virtual-repeat directive. + 2. ui-sref-active doesn't work well for child nodes of the + md-virtual-repeat element. The class was applied repetitively to a + visible child. I now save which message or card is selected and use the + ng-class directive to highlight the selected list item. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MailboxesController.js +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +A UI/WebServerResources/scss/components/virtualRepeat/_extends.scss +A UI/WebServerResources/scss/components/virtualRepeat/virtualRepeat.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/_view.scss + +commit dbb8acca9af5f191f48f8eedce68cca64f3a386b +Author: Francis Lachapelle +Date: Tue Jul 14 16:12:07 2015 -0400 + + (js) Expose 'activeUser' through navController + +M UI/WebServerResources/js/Common/navController.js + +commit aee229e7002019fed3c354cb3a1297e2df41df3d +Author: Francis Lachapelle +Date: Mon Jul 13 15:22:58 2015 -0400 + + (js) Make use of 'controllerAs' in Mailer module + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MailboxesController.js +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js + +commit 7c6716784e9b64237c8fb2c4d153ebb0979cd52e +Author: Francis Lachapelle +Date: Thu Jul 9 16:35:19 2015 -0400 + + (feat) Events/tasks sorting in Calendar module + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/UIxCalListingActions.m +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 9a3aeb000447b57cf5c1be536fb968046fc57f45 +Author: Francis Lachapelle +Date: Thu Jul 9 16:18:03 2015 -0400 + + (fix) Tasks list sorting + +M UI/Scheduler/NSArray+Scheduler.h +M UI/Scheduler/NSArray+Scheduler.m +M UI/Scheduler/UIxCalListingActions.m + +commit 6f6ec58a09274c06100d29cfe6cf10b9b9c0aaa3 +Author: Ludovic Marcotte +Date: Thu Jul 9 16:08:14 2015 -0400 + + (html) wrap checkbox inside md-button + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 88860e2e3873da663f255c7b3181de20acbaa43a +Author: Ludovic Marcotte +Date: Wed Jul 8 21:27:24 2015 -0400 + + (fix) don't show "end repeat" for non-repetitive events/tasks + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox + +commit 5bbb768fe87af0f8cef2444ba59e212a5996e44c +Author: Francis Lachapelle +Date: Wed Jul 8 21:16:33 2015 -0400 + + (html) Improve event editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxRecurrenceEditor.wox +M UI/Templates/SchedulerUI/UIxReminderEditor.wox + +commit 396bc3b0f6d639ac65cf0e36984db2658b069847 +Author: Francis Lachapelle +Date: Wed Jul 8 21:14:25 2015 -0400 + + (css) Lower icon button width to 36px + +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/core/variables.scss + +commit 164654f784776f92e09280254e635318cba2e4ee +Author: Francis Lachapelle +Date: Wed Jul 8 21:08:51 2015 -0400 + + (css) Icon modifiers (rotation) for animation + +M UI/WebServerResources/scss/components/icon/icon.scss + +commit 9514103031d9d9e1efb0c7681394c1354d1c3e91 +Author: Francis Lachapelle +Date: Wed Jul 8 14:46:07 2015 -0400 + + (js) Improve search toolbar in Calendar module + + - new distinct search toolbar + - restored filtering options + - honor user's settings + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/js/Scheduler/CalendarListController.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss + +commit 4d4458a183a0397a85a1f7c5213cba6ae782f81b +Author: Francis Lachapelle +Date: Wed Jul 8 14:34:43 2015 -0400 + + (js) Set focus to title field in component editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox + +commit 5a2eb67cb7ce4a11178c88872a44f78a3f2af210 +Author: Francis Lachapelle +Date: Wed Jul 8 14:31:25 2015 -0400 + + (fix) Alignment in bottomSheet + +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss + +commit 9bdc365bf0d70d1fa4604e547afa9eba9de88600 +Author: Francis Lachapelle +Date: Wed Jul 8 14:18:13 2015 -0400 + + (js) Allow cancelling of sgSearch + +M UI/WebServerResources/js/Common/sgSearch.directive.js + +commit 066bdc5f3fe6e843e80f60b1492851a4d1816fab +Author: Francis Lachapelle +Date: Wed Jul 8 14:15:39 2015 -0400 + + (js) New 'ready' method for Preferences service + + This method returns a promise that succeeds when the user's defaults and + settings have been received from the server. + +M UI/WebServerResources/js/Preferences.app.js +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit 396892b0e104468c9b0fe107b7b1c3a901f30a34 +Author: Francis Lachapelle +Date: Tue Jul 7 16:39:28 2015 -0400 + + (js) Simplify PreferencesController + +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit dd5b3258644ebc025afa16b1f147d0a83506fd30 +Author: Francis Lachapelle +Date: Tue Jul 7 16:34:58 2015 -0400 + + (js) Simplify promises handling in User.$filter + +M UI/WebServerResources/js/Common/User.service.js + +commit fe20cc220f9b45311ed7a729dce810b70bbc5b8c +Author: Francis Lachapelle +Date: Tue Jul 7 16:27:01 2015 -0400 + + (js) Improve sgSearch directive + + The directive now relies on transclusion to compile its content. This + way, we don't limit the directives used inside the content. + +M UI/WebServerResources/js/Common/sgSearch.directive.js + +commit 02112dea8acccf3c9072c42184b9c011d25cbc8d +Author: Ludovic Marcotte +Date: Wed Jul 8 13:19:16 2015 -0400 + + (feat) can now send out MDN responses + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/Message.service.js + +commit f369eabd060a838b0172e9f8fefd02c0e04c89ce +Author: Ludovic Marcotte +Date: Tue Jul 7 09:50:44 2015 -0400 + + (fix) arial labels + icon classes + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 4ab2c57903689b72e971ac02ff66fb63b8f38c30 +Author: Ludovic Marcotte +Date: Tue Jul 7 08:35:53 2015 -0400 + + (feat) handle priority and return receipt in mail editor (needs layout work) + +M SoObjects/Mailer/SOGoDraftObject.m +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 9015f82413bc9a624e5731bbff52e99dd4e2e09a +Author: Francis Lachapelle +Date: Mon Jul 6 15:16:49 2015 -0400 + + (html) Improve events/tasks lists + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit 44b8dab9c47439b040c8ba55920ce8a4c8e36e7f +Author: Francis Lachapelle +Date: Mon Jul 6 11:14:46 2015 -0400 + + (css) Left-align list items in sidenav + +M UI/WebServerResources/scss/components/list/list.scss + +commit 9814a8cd0ec1c8fa555223390f19f3a0f89fb793 +Author: Francis Lachapelle +Date: Mon Jul 6 11:11:38 2015 -0400 + + (css) No bg-color change in :hover of bottom sheet + +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit ecce179a2f5066c466c3190d7d3e29dff4962c24 +Author: Francis Lachapelle +Date: Mon Jul 6 11:07:28 2015 -0400 + + (css) Allow .sg-child-level-[1-12] everywhere + +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit cf0aded1a401809e0108b4ca7e2d829057dbfbe6 +Author: Ludovic Marcotte +Date: Mon Jul 6 11:05:19 2015 -0400 + + (feat) show the 'right' folder icons + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit a49687fe411402ba93ff2a4f39d62927e4476869 +Author: Ludovic Marcotte +Date: Sat Jul 4 20:14:32 2015 -0400 + + (fix) make use of floating labels + +M UI/Templates/SchedulerUI/UIxCalUserRightsEditor.wox + +commit 3bfc47d105137c06d91c4c4413b5a03ca1d6e75a +Author: Ludovic Marcotte +Date: Sat Jul 4 07:51:20 2015 -0400 + + (fix) fixed icons and controller regarding mailbox delegates + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 01750fa98e7deb14f4325d735277646095a6dbf8 +Author: Ludovic Marcotte +Date: Sat Jul 4 07:36:15 2015 -0400 + + (fix) small syntax error + +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit b948384ec9a5a8d463c3f8ea204b6adef9402ba5 +Author: Francis Lachapelle +Date: Fri Jul 3 21:45:59 2015 -0400 + + (js) Preload ACL users in Calendar module + +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit 1c34e71cdca9a769bbfd8c8c26d174f428b3eb08 +Author: Francis Lachapelle +Date: Fri Jul 3 21:44:28 2015 -0400 + + (js) Remove unused dependency on $q in controllers + +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 2337d4057f530512fb348bd1ed8fe8e2c6452f78 +Author: Francis Lachapelle +Date: Fri Jul 3 21:40:37 2015 -0400 + + Integrate md-icon using the Material Icons font + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox +M UI/Templates/MailPartViewers/UIxMailPartLinkViewer.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxCalDayView.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalMonthView.wox +M UI/Templates/SchedulerUI/UIxCalWeekView.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/Templates/UIxAclEditor.wox +M UI/Templates/UIxPageFrame.wox +M UI/Templates/UIxSidenavToolbarTemplate.wox +M UI/Templates/UIxTopnavToolbarTemplate.wox +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/icon/_extends.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit b39dedd2d228cc7f36962c8e6dd1b9c60a064a49 +Author: Francis Lachapelle +Date: Fri Jul 3 21:38:37 2015 -0400 + + Add attachUrls to task editor + +M UI/Scheduler/UIxTaskEditor.m + +commit 05d59df68bb163193320a75a3a629c7f64188fe7 +Author: Ludovic Marcotte +Date: Fri Jul 3 20:40:06 2015 -0400 + + (feat) added mailbox delegation support + +M SoObjects/SOGo/SOGoUser.m +M UI/MailerUI/UIxMailUserDelegationEditor.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox +M UI/WebServerResources/js/Mailer/Account.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 9225f2b9083685cc69cd3fa7f2b8c12d7a375a06 +Author: Ludovic Marcotte +Date: Fri Jul 3 20:07:17 2015 -0400 + + (fix) layout improvements when text is folding + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit e4e18dea5e1698fd84875ff8b70b0a32f99292cc +Author: Francis Lachapelle +Date: Fri Jul 3 11:28:21 2015 -0400 + + (js) Rename variable in scope of recurrence editor + +M UI/Templates/SchedulerUI/UIxRecurrenceEditor.wox + +commit b0d8148ca691cec1d8d11ba50bdf6b436af0a2cb +Author: Francis Lachapelle +Date: Fri Jul 3 10:34:48 2015 -0400 + + (font) Add official Material Design Icons font + +M .gitignore +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf +A UI/WebServerResources/fonts/MaterialIcons-Regular.eot +A UI/WebServerResources/fonts/MaterialIcons-Regular.ttf +A UI/WebServerResources/fonts/MaterialIcons-Regular.woff +A UI/WebServerResources/fonts/MaterialIcons-Regular.woff2 +D UI/WebServerResources/fonts/Ubuntu-C.ttf + +commit 52253d8c101ef5215b81909da864ac51e139a842 +Author: Ludovic Marcotte +Date: Fri Jul 3 15:17:02 2015 -0400 + + (fix) fixed path handling + +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 94a34f41b87beef6255d0f3649becae3db852ea8 +Author: Ludovic Marcotte +Date: Fri Jul 3 14:46:25 2015 -0400 + + (fix) some layout improvements + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit d1636314f1ec0c6d7efb61641bf3dd2f51bd1675 +Author: Ludovic Marcotte +Date: Fri Jul 3 11:29:40 2015 -0400 + + (fix) first big pass at floating label support in all md-selects + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 1ae7cddf09adf220b170b569050200697e11ea65 +Author: Ludovic Marcotte +Date: Fri Jul 3 10:22:48 2015 -0400 + + Silenced NSLog calls + +M UI/Common/UIxPageFrame.m + +commit 5ef2db59f79fd7a1c5592ac5cde653a9afd5318d +Author: Ludovic Marcotte +Date: Thu Jul 2 16:11:11 2015 -0400 + + (fix) a bit more error handling + +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 1a78882c51c43b54ed41ff2720ba838578163d25 +Author: Ludovic Marcotte +Date: Thu Jul 2 13:20:13 2015 -0400 + + (fix) floating label for select on the login page + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit 6471524627a53c5d608294a63fc0438c43253b53 +Author: Ludovic Marcotte +Date: Thu Jul 2 10:54:33 2015 -0400 + + (fix) also use floating label for mail composer + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit bc9e1f9558a18b7b7933d5d799c55e8ea037f0a0 +Author: Ludovic Marcotte +Date: Thu Jul 2 10:45:13 2015 -0400 + + (fix) use md-select floating labels + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox + +commit a408fdff52c4751eb4d847e0d8c2879418e11dcf +Author: Francis Lachapelle +Date: Wed Jul 1 15:21:22 2015 -0400 + + (js) Minor JavaScript improvements + +M UI/WebServerResources/js/Common/sgSearch.directive.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit cc7eeca2c4961f782423c8ec61935488873c88e7 +Author: Francis Lachapelle +Date: Wed Jul 1 15:17:55 2015 -0400 + + (js) Improve calendar lists controller + + - preload both lists (events & tasks) + - don't reload list when switching tab + +M UI/WebServerResources/js/Scheduler/CalendarListController.js + +commit 35ff82710ab07c5900aef73d0cca56b4870ce599 +Author: Francis Lachapelle +Date: Wed Jul 1 14:34:35 2015 -0400 + + Handle attach URLs in appointment editor + +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m +M UI/Scheduler/UIxTaskEditor.m +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit ba5f6410edbd7c64566445f538bae894d50d2b17 +Author: Francis Lachapelle +Date: Wed Jul 1 14:11:53 2015 -0400 + + Return recurrence rule only if frequency is known + +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m + +commit 763ce37f8cc7ff98b4cdacd79c51759e4d948f95 +Author: Francis Lachapelle +Date: Wed Jul 1 14:09:12 2015 -0400 + + Allow multiple "attach" values in iCalEntityObject + +M SOPE/NGCards/iCalEntityObject.h +M SOPE/NGCards/iCalEntityObject.m + +commit f449f0456b1a9f254bf0d66a21795eca9cf76744 +Author: Ludovic Marcotte +Date: Tue Jun 30 17:13:55 2015 -0400 + + (feat) can now copy mails + +M UI/MailerUI/UIxMailFolderActions.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 06cb06fce62fdf3af0517be0e220fcf861f938f9 +Author: Francis Lachapelle +Date: Mon Jun 29 21:03:52 2015 -0400 + + New UIxTaskEditorTemplate class + +M UI/Scheduler/UIxCalMainView.m + +commit 647f052486a452a636db09245b5907e315732425 Author: Ludovic Marcotte Date: Mon Jun 29 13:49:41 2015 -0400 Fix for dfecce738187a57da17e4792d0daa5cc3fc147d2 + + Conflicts: + + ActiveSync/SOGoActiveSyncDispatcher+Sync.m M ActiveSync/SOGoActiveSyncDispatcher+Sync.m -commit dc2cc14d25857200aae9ac583532255e9ee031eb -Author: Julio García -Date: Fri Jun 26 09:35:47 2015 +0200 - - Revert "Revert "(fix) more fixes and clarifications on the mutli-domain settings"" - - This reverts commit 3dd8bddc0e0e5f8cab3507e36e37f643ea70bea6. - -M Documentation/SOGoInstallationGuide.asciidoc -M SoObjects/SOGo/SOGoUser.m -M SoObjects/SOGo/SOGoUserManager.m - -commit 3f1a43cc13b223d94a987bbe2a7d00f2f3a7a2c4 -Author: Julio García -Date: Fri Jun 26 09:35:37 2015 +0200 - - Revert "Revert "(fix) more multi-domain fixes and cleanups"" - - This reverts commit 90e11d76f61dd8855f7c6ddb267feb39bf26bc52. - -M SoObjects/SOGo/SOGoUser.m -M SoObjects/SOGo/SOGoUserManager.m - -commit 67d0d9586986337d5e73769df5e5484d47d6e182 -Author: Julio García -Date: Fri Jun 26 09:35:26 2015 +0200 - - Revert "Revert "Fixed mess regarding uid/realUID"" - - This reverts commit 96d88de564f36e45bf9d82258c1378b881532b7f. - -M SoObjects/SOGo/SOGoUser.m - -commit d16bf7c1a793396534fa6824dec5b0cf51395350 -Author: Francis Lachapelle -Date: Wed Jun 24 07:48:01 2015 -0400 - - (fix) Tasks list display in Calendar module - - Fixes #3267 - -M NEWS -M UI/WebServerResources/SchedulerUI.js - -commit b5270999070251be966fd226bf38b8f595982944 -Author: Francis Lachapelle -Date: Tue Jun 23 09:23:29 2015 -0400 - - (fix) Events list display in Calendar module - - Fixes #3261 - -M NEWS -M UI/WebServerResources/SchedulerUI.js - -commit 72aab7f83f03468a412c9f933059394829a45fa5 -Author: Javier Amor García -Date: Thu Jun 18 18:19:02 2015 +0200 - - ActiveSync: can be controlled by module constraint - - Added 'ActiveSync' module constraint. If constraint is not - honored the ActiveSync request returns a forbidden (403). - -M ActiveSync/SOGoActiveSyncDispatcher.m -M SoObjects/SOGo/LDAPSource.m -M SoObjects/SOGo/SOGoUserManager.m - -commit dfecce738187a57da17e4792d0daa5cc3fc147d2 +commit 013e316e7d2c285c188b0a7bbc182b636bcae647 Author: Ludovic Marcotte -Date: Mon Jun 22 09:19:54 2015 -0400 +Date: Mon Jun 29 09:22:12 2015 -0400 - (feat) added support for DeletesAsMoves over EAS + re-enabled forwardConstraints code -M ActiveSync/SOGoActiveSyncDispatcher+Sync.m -M NEWS +M UI/PreferencesUI/UIxPreferences.m -commit 82798ccb99b66c1a9d7da80e83c4fd40db63cb5c +commit 33345ed1f03fff9ff9533e7994dee7f0d2ca0896 +Author: Ludovic Marcotte +Date: Fri Jun 26 13:13:25 2015 -0400 + + (feat) new mailbox sharing capabilities and mailbox menu + +M UI/MailerUI/UIxMailUserRightsEditor.m +M UI/MailerUI/product.plist +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailUserRightsEditor.wox +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxesController.js + +commit 0b5146655d46f2b2d9a5ca562646892161a058cc +Author: Ludovic Marcotte +Date: Fri Jun 26 13:01:32 2015 -0400 + + (fix) do now show the subscribe options for non-GCS folders + +M UI/Common/UIxAclEditor.m +M UI/Templates/UIxAclEditor.wox + +commit d674b33a209206c4a596861a6c75c01d23ddd5b5 +Author: Francis Lachapelle +Date: Thu Jun 25 11:31:53 2015 -0400 + + (css) Review cards display in sharing dialog box + +M UI/WebServerResources/scss/components/card/card.scss + +commit c524782395cf8dd3bd2e6ad3f0eda1ad5415d583 +Author: Francis Lachapelle +Date: Thu Jun 25 11:30:44 2015 -0400 + + Initial task editor + +M UI/Scheduler/UIxTaskEditor.m +M UI/Scheduler/product.plist +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAttendeesEditor.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxReminderEditor.wox +A UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox +M UI/WebServerResources/js/Scheduler.app.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit c144f736dc5a64d2abda1c6988590bdd189b24ad +Author: Francis Lachapelle +Date: Thu Jun 25 11:23:18 2015 -0400 + + Improve JSON API documentation + +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxTaskEditor.m + +commit f4a8638fb4c277237347fe9da3412851c4ef44cd +Author: Francis Lachapelle +Date: Thu Jun 25 11:21:24 2015 -0400 + + (json) Add c_iscycle and c_nextalarm in tasks list + +M UI/Scheduler/UIxCalListingActions.m + +commit 69424be245a4c479d477044f6464208638c3b1a2 +Author: Francis Lachapelle +Date: Thu Jun 25 11:17:53 2015 -0400 + + Return attributes of iCalEntity if non-empty + + Only include classification and status if theyr are not empty. + +M SoObjects/Appointments/iCalEntityObject+SOGo.m + +commit c3d364558ed0894445b8f784f211bc186f5b64bf +Author: Francis Lachapelle +Date: Tue Jun 23 11:23:51 2015 -0400 + + (html) Remove line under categories in card view + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit aa6741ee4b85c5063ef07924f96748e304636ee3 +Author: Francis Lachapelle +Date: Tue Jun 23 11:22:35 2015 -0400 + + Move categories to top in contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit 412dca053a3b42383564335ae59323909584f7df +Author: Francis Lachapelle +Date: Tue Jun 23 11:21:50 2015 -0400 + + (css) Fix for md-cards in ACL editor + +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/scss/components/card/card.scss + +commit b41828a7f13f23ef6169435fce3a7972d6e6981b +Author: Francis Lachapelle +Date: Mon Jun 22 15:48:52 2015 -0400 + + (html,js) Add reminder/alarm to event editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxReminderEditor.wox +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit bb8c32a77ed4008d32eaf5106d1af4389ff5baa7 +Author: Francis Lachapelle +Date: Mon Jun 22 10:03:41 2015 -0400 + + (html) Minor improvement to preferences module + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 1a5763d46883187e64b4e1285110fbee77e2795c +Author: Francis Lachapelle +Date: Mon Jun 22 10:02:53 2015 -0400 + + (css) Remove reference to unused font + +M UI/WebServerResources/scss/core/typography.scss + +commit 8402152a592ce44f4be00ea0b1a6419eb156d2b9 +Author: Francis Lachapelle +Date: Mon Jun 22 09:20:35 2015 -0400 + + Load alarm from UIxComponentEditor + + The alarm attributes are now loaded from UIxComponentEditor and not + iCalEntityObject so we can determine if the component's owner is part of + the alarm's attendees. + +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m + +commit d89f02ff53945ae7ce36364900e85404921e2ccd Author: Francis Lachapelle Date: Fri Jun 19 22:08:08 2015 -0400 @@ -519,7 +4286,46 @@ Date: Fri Jun 19 22:08:08 2015 -0400 M SoObjects/Appointments/iCalAlarm+SOGo.h M SoObjects/Appointments/iCalAlarm+SOGo.m -commit 3809c002ede0c7aebe1cc0b846362418b87b2a48 +commit 94cded35d2d98956db04efbd0d86a9368a649c4b +Author: Francis Lachapelle +Date: Fri Jun 19 14:52:00 2015 -0400 + + Revert "(fix) Adjust md-tabs for latest material" + + This reverts commit 6041a9c00906565fbb3d8e5fae00235356f6a5f6. + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit ba4520da51a384118dd9333b543cff316235754d +Author: Francis Lachapelle +Date: Fri Jun 19 13:48:37 2015 -0400 + + Use node-sass 3.x + +M UI/WebServerResources/package.json + +commit 92c4ee50fafe0479da4f3cf581c9de3ba102ea56 +Author: Francis Lachapelle +Date: Fri Jun 19 13:46:14 2015 -0400 + + (css) Remove reference to uninstalled font + +M UI/WebServerResources/scss/core/typography.scss + +commit 4249d6cc5b5f3f60ca420c463dee0c0e1c4c0333 +Author: Francis Lachapelle +Date: Fri Jun 19 13:43:18 2015 -0400 + + Don't use md iconic font v2.0.0 (yet) + + We need to evaluate the pros and cons of moving to font ligatures now + available with Angular Material + (https://material.angularjs.org/latest/#/api/material.components.icon/directive/mdIcon). + +M UI/WebServerResources/bower.json + +commit e65ff2105ea6a0329f8b428bc1367a6aefa95d39 Author: Ludovic Marcotte Date: Wed Jun 17 15:57:16 2015 -0400 @@ -529,7 +4335,7 @@ Date: Wed Jun 17 15:57:16 2015 -0400 M SoObjects/Mailer/SOGoMailObject.m -commit d9b4abc2f1f6f959432f4501d0937a7019c123f2 +commit e5c4907abac6a2d5100415d20fc3b2dc7229ee35 Author: Ludovic Marcotte Date: Wed Jun 17 08:46:09 2015 -0400 @@ -537,6 +4343,9036 @@ Date: Wed Jun 17 08:46:09 2015 -0400 M ActiveSync/NSString+ActiveSync.m +commit a49032a6bd9b49bfecc610c68d8fdc5fc3871251 +Author: Ludovic Marcotte +Date: Mon Jun 15 12:03:38 2015 -0400 + + (fix) show only the URL of web calendars, when asked + +M UI/Scheduler/UIxCalendarFolderLinksTemplate.m +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit f7f83ae1c700761b00848fb795ddb1773a84c679 +Author: Francis Lachapelle +Date: Mon Jun 15 11:35:20 2015 -0400 + + (css) Review cards display in sharing dialog box + +M UI/WebServerResources/scss/components/card/card.scss + +commit 6b31e3d3b91dc1877ff6f0eeb7cb179477d40b92 +Author: Francis Lachapelle +Date: Mon Jun 15 11:34:48 2015 -0400 + + (fix) Remove useless ng-show directive (Contacts) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 0ed67f13559114dc13a904cfcbd05eec3506b26d +Author: Francis Lachapelle +Date: Mon Jun 15 11:33:21 2015 -0400 + + (doc) Improve Angular services documentation + +M UI/WebServerResources/js/Scheduler/Calendar.service.js + +commit abe8f8f93ca1b5631e9d47b927d6396b72b36248 +Author: Francis Lachapelle +Date: Mon Jun 15 11:32:09 2015 -0400 + + (doc) Improve JSON API documentation + +M UI/MailerUI/UIxMailFolderActions.m + +commit 6041a9c00906565fbb3d8e5fae00235356f6a5f6 +Author: Francis Lachapelle +Date: Mon Jun 15 11:25:32 2015 -0400 + + (fix) Adjust md-tabs for latest material directive + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit da95a810d45d2d77e4c99ef3003b6d6161e659ff +Author: Francis Lachapelle +Date: Mon Jun 15 10:59:57 2015 -0400 + + (fix) Avoid triggering checkbox with md-menu + + When clicking on the "more" secondary button of a calendar, trick the + md-list directive to consider the 'md-secondary' class of the md-menu so + the click doesn't trigger the checkbox of the list item. + +M UI/Templates/SchedulerUI/UIxCalMainView.wox + +commit f1fc78c71b927f319c6058a32e40ada1dba76dc6 +Author: Ludovic Marcotte +Date: Mon Jun 15 10:10:58 2015 -0400 + + (fix) invalid scope for notification prefs + +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox + +commit d41458dfdc38a0d5a77f11baf9adb78b3f7a7114 +Author: Ludovic Marcotte +Date: Mon Jun 15 10:07:56 2015 -0400 + + (fix) hide the dialog after save + +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit 406e9a3df266baccbe032d8ce937b21e574f0a5b +Author: Ludovic Marcotte +Date: Mon Jun 15 10:05:39 2015 -0400 + + (fix) dropped old calendar sync/tag properties + +M SoObjects/Appointments/SOGoAppointmentFolder.h +M SoObjects/Appointments/SOGoAppointmentFolder.m +M UI/Scheduler/UIxCalendarProperties.h +M UI/Scheduler/UIxCalendarProperties.m +M UI/Scheduler/UIxCalendarSelector.m + +commit b4f9b9095dfc00ad8266cb9ef943c3a5dd392f55 +Author: Ludovic Marcotte +Date: Mon Jun 15 09:53:10 2015 -0400 + + (feat) first pass at the calendar properties dialog + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit e18b61f18063d23e9c3dc971729a541ce57fdfa6 +Author: Francis Lachapelle +Date: Mon Jun 15 09:19:21 2015 -0400 + + Improve API documentation /Calendar/calendarslist + +M UI/Scheduler/UIxCalendarSelector.m + +commit af6e20d6270e9a9c79e305fb76b6d1abb42259f6 +Author: Francis Lachapelle +Date: Fri Jun 12 16:12:14 2015 -0400 + + (fix) Restore methods in UIxCalUserRightsEditor + +M UI/Scheduler/UIxCalUserRightsEditor.h +M UI/Scheduler/UIxCalUserRightsEditor.m + +commit 8100dfa79757304900e7fb63eb49a25f3d899eb4 +Author: Francis Lachapelle +Date: Fri Jun 12 15:58:44 2015 -0400 + + Update {variables,content}.scss for latest md + +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/core/variables.scss + +commit 4514d7ce320e0feb75b2950a187a724d5b3ecca7 +Author: Ludovic Marcotte +Date: Fri Jun 12 15:26:22 2015 -0400 + + (fix) md-content -> md-dialog-content in templates + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit 0612c3dff14c93c66feb1c9927e98622d02e0eeb +Author: Ludovic Marcotte +Date: Fri Jun 12 14:44:33 2015 -0400 + + Fixed templates + +M UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +M UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox + +commit ee9e559765c0f825a2bb20ca2f358eb03b207f39 +Author: Ludovic Marcotte +Date: Fri Jun 12 13:34:08 2015 -0400 + + (feat) links to calendars + +M UI/Scheduler/GNUmakefile +A UI/Scheduler/UIxCalendarFolderLinksTemplate.h +A UI/Scheduler/UIxCalendarFolderLinksTemplate.m +M UI/Scheduler/product.plist +M UI/Templates/SchedulerUI/UIxCalMainView.wox +A UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox +M UI/WebServerResources/js/Scheduler/CalendarsController.js + +commit a89b116940f200f4b4e7006a5168ceea5eccdf6b +Author: Ludovic Marcotte +Date: Fri Jun 12 11:21:02 2015 -0400 + + (feat) allow showing links to address books + +M UI/Contacts/GNUmakefile +A UI/Contacts/UIxContactFolderLinksTemplate.h +A UI/Contacts/UIxContactFolderLinksTemplate.m +D UI/Contacts/UIxContactFolderProperties.h +D UI/Contacts/UIxContactFolderProperties.m +M UI/Contacts/product.plist +A UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox +D UI/Templates/ContactsUI/UIxContactFolderProperties.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBooksController.js + +commit 942c97294225c5845fb5555ccc9d4caa8b2dcbcd +Author: Ludovic Marcotte +Date: Fri Jun 12 08:55:28 2015 -0400 + + (feat) re-enabled export cards feature + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 20914a88129fc8ec6ee8a611d77211fe48ac5a78 +Author: Francis Lachapelle +Date: Fri Jun 12 14:12:51 2015 -0400 + + Improve and fix SASS preprocessing + +M UI/WebServerResources/GNUmakefile +M UI/WebServerResources/Gruntfile.js + +commit b85b2ed4166c908ce108c2171625a61db80b2d3c +Author: Francis Lachapelle +Date: Fri Jun 12 12:26:17 2015 -0400 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 3a1c1226bc321c38fb6f2dd9463d73514662a2e8 +Author: Ludovic Marcotte +Date: Thu Jun 11 14:32:07 2015 -0400 + + (feat) added menu in list of address books + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 6d12c2a2c8c19435713e6b24d16512c6b6cec4f1 +Author: Ludovic Marcotte +Date: Thu Jun 11 14:09:07 2015 -0400 + + (feat) enabled menu and fabdial support + +A UI/WebServerResources/scss/components/fabSpeedDial/_extends.scss +A UI/WebServerResources/scss/components/fabSpeedDial/fabSpeedDial.scss +A UI/WebServerResources/scss/components/menu/_extends.scss +A UI/WebServerResources/scss/components/menu/menu.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 23d7c06829427cea352c47a2acb5bc053b25d06f +Author: Ludovic Marcotte +Date: Mon Jun 8 15:49:27 2015 -0400 + + (feat) improved the attachments handling code for the message editor + +M UI/MailerUI/UIxMailEditor.m +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/MessageEditorController.js +M UI/WebServerResources/scss/styles.scss + +commit 290264262ce1df29758a2993a7f9b3e4d63f477f +Author: Francis Lachapelle +Date: Fri Jun 5 16:20:57 2015 -0400 + + (js) Improve autocomplete of attendees editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js + +commit a95ed0f8e65de928fc880301994528b8640f3bd8 +Author: Francis Lachapelle +Date: Thu Jun 4 16:08:45 2015 -0400 + + Initial ng/md version of the attendees editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAttendeesEditor.wox +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit a2383db454e89a2c333ee0f0614087dadeea5fa5 +Author: Francis Lachapelle +Date: Thu Jun 4 14:48:52 2015 -0400 + + (js) Improve recurrence editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxRecurrenceEditor.wox +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit 1d1f7445cb4a84648cf3d4323d84fdca35808d6a +Author: Francis Lachapelle +Date: Thu Jun 4 14:39:53 2015 -0400 + + (html) Remove upper div from image part viewer + +M UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox + +commit b469045de84b48bd832545ebb875ce53c1fa1e03 +Author: Francis Lachapelle +Date: Thu Jun 4 14:37:33 2015 -0400 + + (js) Simplify Dialog service + +M UI/WebServerResources/js/Common/Dialog.service.js + +commit a1c493358f8beb4aaea4e3c158572bc831294f42 +Author: Francis Lachapelle +Date: Thu Jun 4 14:36:58 2015 -0400 + + Improve API documentation for appointment editor + +M UI/Scheduler/UIxAppointmentEditor.m + +commit 4cece88a428da4847de824495c07373c5157ee74 +Author: Francis Lachapelle +Date: Thu Jun 4 13:31:06 2015 -0400 + + JSONinfy [SOGoUserHomePage readFreeBusyAction] + +M UI/MainUI/SOGoUserHomePage.m + +commit 8124faa6d4c0f014c0ee349547ee43067d841d39 +Author: Ludovic Marcotte +Date: Wed Jun 3 19:42:30 2015 -0400 + + (feat) "Materialization" of the IMIP handling template + +M UI/MailPartViewers/UIxMailPartICalActions.m +M UI/MailPartViewers/UIxMailPartICalViewer.h +M UI/MailPartViewers/UIxMailPartICalViewer.m +M UI/MailPartViewers/UIxMailPartViewer.m +M UI/MailPartViewers/product.plist +M UI/Templates/Appointments/SOGoAptMailDeletion.wox +M UI/Templates/Appointments/SOGoAptMailInvitation.wox +M UI/Templates/Appointments/SOGoAptMailUpdate.wox +M UI/Templates/MailPartViewers/UIxMailPartICalViewer.wox +M UI/WebServerResources/js/Mailer/Message.service.js +A UI/WebServerResources/js/Mailer/sgIMIP.directive.js +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit fb992db5ad3fc5927eea5fb3681784f6d73d2433 +Author: Francis Lachapelle +Date: Tue Jun 2 11:14:03 2015 -0400 + + Improve ACL editor (Scheduler & Contacts) + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m +M UI/Scheduler/UIxCalUserRightsEditor.h +M UI/Scheduler/UIxCalUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox +M UI/Templates/SchedulerUI/UIxCalUserRightsEditor.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Scheduler/CalendarsController.js +M UI/WebServerResources/scss/components/card/card.scss + +commit e385bf34d5ac7568fcb381e549f58e82964a7eef +Author: Luc Charland +Date: Mon Jun 1 10:52:32 2015 -0400 + + added simple event testing json->dav + +M Tests/Integration/carddav.py +M Tests/Integration/test-carddav.py + +commit 4f754994392326cd0c9fc43ff7d9e00e9c3296c3 +Author: Ludovic Marcotte +Date: Fri May 29 10:49:40 2015 -0400 + + (fix) Materalized link and image templates + +M UI/MailPartViewers/UIxMailPartImageViewer.m +M UI/MailPartViewers/UIxMailPartViewer.m +M UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox +M UI/Templates/MailPartViewers/UIxMailPartLinkViewer.wox +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 34140e77fc653e8b2e95de4267e0b01a079cfb5a +Author: Francis Lachapelle +Date: Thu May 28 14:20:25 2015 -0400 + + (html) Improve ACL editor + +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/scss/components/card/card.scss + +commit 04b992e1f130f8f9cc7bd61830fe4cbfa2c827de +Author: Francis Lachapelle +Date: Thu May 28 13:48:45 2015 -0400 + + (js) Make use of 'controllerAs' in Contacts module + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Contacts/CardController.js + +commit 11cf483e2cc1abfa46f7fb316d498ded05a21bdd +Author: Francis Lachapelle +Date: Thu May 28 10:56:27 2015 -0400 + + (js) Set height/width of gravatar's image + +M UI/WebServerResources/js/Common/sgGravatarImage.directive.js + +commit 6a835c745fed26510d22917d505d775ceddc11ed +Author: Francis Lachapelle +Date: Thu May 28 10:46:14 2015 -0400 + + (js) Fix resource URL of Acl service + +M UI/WebServerResources/js/Common/Acl.service.js + +commit af353fb73f54bbcb63401eac761e7ca9168ca2df +Author: Francis Lachapelle +Date: Wed May 27 15:06:42 2015 -0400 + + (js) Improve contact chips in card list editor + + Exclude list members from auto-completion results. + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Contacts/CardController.js + +commit d159e12b3f963099652eaa15d100adb9c7c56259 +Author: Francis Lachapelle +Date: Wed May 27 14:59:49 2015 -0400 + + (js) Improve contact chips in Preferences module + + Exclude users already in the prevent invitations whitelist. + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit 28477e97090027bbfb8b3fd89cbb3ba9e70fe58c +Author: Francis Lachapelle +Date: Wed May 27 09:49:13 2015 -0400 + + Add apidoc.json + +A apidoc.json + +commit 9a3f4080c094434b5915e818cdc4538117c6321c +Author: Luc Charland +Date: Mon May 25 12:29:13 2015 -0400 + + test adding single and multiple phones with JSON and getting it with DAV + +A Tests/Integration/carddav.py +A Tests/Integration/test-carddav.py + +commit cdd52a0b37d9cd93edac50564240df17a91eb8b6 +Author: Francis Lachapelle +Date: Thu May 21 09:43:34 2015 -0400 + + (css) Cleanup card.scss + +M UI/WebServerResources/scss/components/card/card.scss + +commit e226a32413820b94986b6f224709a9a98f344ade +Author: Francis Lachapelle +Date: Wed May 20 14:46:12 2015 -0400 + + Improve login page + + Used ngCloak directive to display the form only once AngularJS/Angular + Material is loaded and all components initialized. + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/Main.app.js +M UI/WebServerResources/scss/components/button/button.scss +A UI/WebServerResources/scss/core/angular.scss +M UI/WebServerResources/scss/styles.scss + +commit 1f83680e125bb4a6134230b56ba0ebf71faa16eb +Author: Francis Lachapelle +Date: Wed May 20 12:15:31 2015 -0400 + + Add aria attributes in Preferences module + +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/UIxPreferences.h +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit d5f4da39342de874cace9124f18707492d00f543 +Author: Francis Lachapelle +Date: Wed May 20 11:59:26 2015 -0400 + + (fix) Don't return duplicated timezones + +M SOPE/NGCards/iCalTimeZone.m + +commit dc91be3c0d3e68cc1bd140ba76f9df3f6483c1c5 +Author: Francis Lachapelle +Date: Wed May 20 11:11:01 2015 -0400 + + Initial recurrence editor for appointments + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/Scheduler/UIxCalMainView.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m +M UI/Scheduler/UIxRecurrenceEditor.m +M UI/Templates/SchedulerUI/UIxRecurrenceEditor.wox +M UI/WebServerResources/js/Scheduler/Component.service.js +M UI/WebServerResources/js/Scheduler/ComponentController.js +M UI/WebServerResources/scss/components/content/content.scss +A UI/WebServerResources/scss/components/input/_extends.scss +M UI/WebServerResources/scss/components/input/input.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss +M UI/WebServerResources/scss/components/select/select.scss + +commit 7e96f3780908767bdbbf2862d27c670870968e74 +Author: Francis Lachapelle +Date: Wed May 20 11:05:42 2015 -0400 + + (wox) Add classification to event editor + +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox + +commit 0ac27aab50c688e84e0473af0e30fa28daa3e74d +Author: Francis Lachapelle +Date: Wed May 20 10:27:53 2015 -0400 + + (js) Improve coding style of Card.service.js + +M UI/WebServerResources/js/Contacts/Card.service.js + +commit 3350e2fa12a1e148adb8adc135e71b10d5b19382 +Author: Francis Lachapelle +Date: Wed May 20 09:38:30 2015 -0400 + + (fix) Syntax of word "occurrence" + +M SOPE/NGCards/iCalByDayMask.h +M SOPE/NGCards/iCalByDayMask.m +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m + +commit e4e5106f97bf7c2195b543620b46c604ee40cf91 +Author: Francis Lachapelle +Date: Wed May 20 09:31:53 2015 -0400 + + Set editor mode of Sass files + +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/_utils.scss +M UI/WebServerResources/scss/components/backdrop/backdrop.scss +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/components/checkbox/checkbox.scss +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/dialog/dialog.scss +M UI/WebServerResources/scss/components/divider/divider.scss +M UI/WebServerResources/scss/components/progressCircular/progressCircular.scss +M UI/WebServerResources/scss/components/progressLinear/progressLinear.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/_functions.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/core/base_styles/_functions.scss +M UI/WebServerResources/scss/core/base_styles/_mixins.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/reset.scss +M UI/WebServerResources/scss/core/structure.scss +M UI/WebServerResources/scss/core/typography.scss +M UI/WebServerResources/scss/views/LoginUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit ed7f979635e89145ec87517fde36d28e4e81bf78 +Author: Francis Lachapelle +Date: Wed May 20 09:29:39 2015 -0400 + + (js) Fix dependency injection in Dialog service + +M UI/WebServerResources/js/Common/Dialog.service.js + +commit 46bfe6befbd9065285c21c37cdc987fcbeedc1b9 +Author: Francis Lachapelle +Date: Tue May 19 16:50:26 2015 -0400 + + (fix) Resolve component data completely + +M UI/WebServerResources/js/Scheduler.app.js + +commit 22db83503668c29c2117ca8fdf820e8c3e056eb7 +Author: Francis Lachapelle +Date: Tue May 19 16:07:57 2015 -0400 + + Compress production version of CSS + +M UI/WebServerResources/Gruntfile.js + +commit f6f704ddd81dbbdf92f7cb993c564d35d75dbf43 +Author: Francis Lachapelle +Date: Tue May 19 16:05:11 2015 -0400 + + (js) New sgToggleGrid directive + + This directive allows to transform the tiles of a md-grid-list to toggle + buttons. + +A UI/WebServerResources/js/Common/sgToggleGrid.directive.js +M UI/WebServerResources/scss/components/gridList/gridList.scss + +commit 9222bf80ef2ad9b62faa3c01c1b8f45d4d43621b +Author: Francis Lachapelle +Date: Tue May 19 14:50:26 2015 -0400 + + (js) Fix mdContactChips in preferencs module + + By keeping the same array reference throughout the auto-completion, we + fix the ng-click on a list item. It also avoids constant redraws of the + list. + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/User.service.js + +commit b017cb1711f66d3f0e4cabe7fe54675936649578 +Author: Francis Lachapelle +Date: Tue May 19 11:36:42 2015 -0400 + + Update variables.scss for latest md version + +M UI/WebServerResources/scss/core/variables.scss + +commit 9db7d3b85dccbb68546f670a53620be3dd8bd8f7 +Author: Francis Lachapelle +Date: Tue May 19 11:32:12 2015 -0400 + + (fix) Show/save whitelisted users for invitations + +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit 18cf3d5f9c5ca9e8d40cd90b86c567f92bf413b0 +Author: Francis Lachapelle +Date: Tue May 19 10:55:40 2015 -0400 + + (wox) Improve layout of Preferences module + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 8e286b5d1544dbaf5b9e0cbfd3a863a295d72bbe +Author: Francis Lachapelle +Date: Fri May 15 09:12:28 2015 -0400 + + (css) Drop unused "theme" Sass files + + Only the original ng-material theme files are used in the build process + of ng-material (using gulp). + +D UI/WebServerResources/scss/components/backdrop/backdrop-theme.scss +D UI/WebServerResources/scss/components/bottomSheet/bottomSheet-theme.scss +D UI/WebServerResources/scss/components/button/button-theme.scss +D UI/WebServerResources/scss/components/card/card-theme.scss +D UI/WebServerResources/scss/components/checkbox/checkbox-theme.scss +D UI/WebServerResources/scss/components/content/content-theme.scss +D UI/WebServerResources/scss/components/dialog/dialog-theme.scss +D UI/WebServerResources/scss/components/divider/divider-theme.scss +D UI/WebServerResources/scss/components/input/input-theme.scss +D UI/WebServerResources/scss/components/progressCircular/progressCircular-theme.scss +D UI/WebServerResources/scss/components/progressLinear/progressLinear-theme.scss +D UI/WebServerResources/scss/components/pseudo-input/pseudo-input-theme.scss +D UI/WebServerResources/scss/components/radioButton/radio-button-theme.scss +D UI/WebServerResources/scss/components/sidenav/sidenav-theme.scss +D UI/WebServerResources/scss/components/slider/slider-theme.scss +D UI/WebServerResources/scss/components/subheader/subheader-theme.scss +D UI/WebServerResources/scss/components/switch/switch-theme.scss +D UI/WebServerResources/scss/components/tabs/tabs-theme.scss +D UI/WebServerResources/scss/components/toast/toast-theme.scss +D UI/WebServerResources/scss/components/toolbar/toolbar-theme.scss +D UI/WebServerResources/scss/components/tooltip/tooltip-theme.scss + +commit ec2b52bf7b98e38af150cc2385cfe93f6631c13a +Author: Francis Lachapelle +Date: Thu May 14 11:36:21 2015 -0400 + + (fix) Save event to a different calendar + +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxComponentEditor.m +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/WebServerResources/js/Scheduler/Component.service.js + +commit ac705547e8f2e225dfe64a74511d217efc8bae5c +Author: Francis Lachapelle +Date: Wed May 13 15:25:42 2015 -0400 + + (js) Colorize the bg of calendars checkboxes + + The background color was affecting only checked checkboxes. Now the + color is applied even for uncheck checkboxes. + +M UI/WebServerResources/js/Common/sgFolderStylesheet.directive.js + +commit a9ad21b395e701e53ad9d6471b08292234c5dfc1 +Author: Francis Lachapelle +Date: Wed May 13 15:20:22 2015 -0400 + + (js) Improve handling of message flags + + We now call the model's methods from the template. Uncluttered the + message controller. Fixed the synchronization of the flags with the + messages list. + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Mailer/Message.service.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/scss/components/icon/icon.scss + +commit ec123b451256d59ec0f4d1127df8465d5d16eda2 +Author: Francis Lachapelle +Date: Wed May 13 11:49:15 2015 -0400 + + Improve tags chips of message viewer + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/chips/chips.scss + +commit f27544c72cb115b83b19690752e1cc5ecdd95585 +Author: Francis Lachapelle +Date: Wed May 13 10:36:34 2015 -0400 + + (js) New sgCompile directive to render mail parts + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +A UI/WebServerResources/js/Common/sgCompile.directive.js +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 9ed65e34adccc34caaa1cee374a2de8554723945 +Author: Francis Lachapelle +Date: Tue May 12 22:37:58 2015 -0400 + + JSONify mail parts + +M UI/MailPartViewers/UIxMailPartAlternativeViewer.m +M UI/MailPartViewers/UIxMailPartMixedViewer.h +M UI/MailPartViewers/UIxMailPartMixedViewer.m +M UI/MailPartViewers/UIxMailPartSignedViewer.m +M UI/MailPartViewers/UIxMailPartViewer.h +M UI/MailPartViewers/UIxMailPartViewer.m +M UI/MailerUI/UIxMailView.m +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 6cd02043afe8a7dcfed7666383527fe68b53fecb +Author: Ludovic Marcotte +Date: Sat May 9 14:37:40 2015 -0400 + + (feat) can now batch delete messages + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer/Mailbox.service.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/js/Mailer/MailboxesController.js +M UI/WebServerResources/js/Mailer/Message.service.js + +commit 0edc2c12170cc600a4bb7568cf4b884257e24501 +Author: Ludovic Marcotte +Date: Fri May 8 20:35:23 2015 -0400 + + Added email button for selected contacts (to be implemented) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 2fa0e91ca7c9c4d56cd598247ad45b49f5087f09 +Author: Francis Lachapelle +Date: Fri May 8 16:42:46 2015 -0400 + + (js) AddressBook service: Improve documentation + +M UI/WebServerResources/js/Contacts/AddressBook.service.js + +commit b37892e033377c3d0c96fb6432838bf4b9bddc84 +Author: Francis Lachapelle +Date: Fri May 8 16:40:39 2015 -0400 + + (js) Card service: Improve initialization + +M UI/WebServerResources/js/Contacts/Card.service.js + +commit 2b6d9db83a0186681d38d05f068c2baebcf57b05 +Author: Francis Lachapelle +Date: Fri May 8 16:32:26 2015 -0400 + + API documentation for batchDelete + + Also return a proper JSON-payload in case of an error + +M UI/Common/UIxFolderActions.m + +commit 7d54bd5e8603543480d87b37c80ac18f6fdfa02d +Author: Ludovic Marcotte +Date: Fri May 8 15:47:09 2015 -0400 + + Initial work for muliple selections + new toolbar with ops + +M UI/Common/UIxFolderActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/Card.service.js +M UI/WebServerResources/js/Mailer/MessageController.js +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/views/LoginUI.scss + +commit 499e66ffe950cd6b0dcce6446ebbdf5e38d5fc03 +Author: Francis Lachapelle +Date: Fri May 8 12:06:52 2015 -0400 + + (css) Improve contacts and messages lists + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Mailer/MailboxController.js +M UI/WebServerResources/scss/_shame.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/core/typography.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 395f3585ca9590f94c02f2f1ea8e7696f5f864d4 +Author: Francis Lachapelle +Date: Thu May 7 15:18:19 2015 -0400 + + (js) Improve user search in AddressBook ACL editor + +M UI/WebServerResources/js/Contacts/AddressBooksController.js + +commit 9f9cd68997698cfa7751366925ecc7328d9b522b +Author: Francis Lachapelle +Date: Thu May 7 15:15:20 2015 -0400 + + (fix) Partial fix for md-contact-chips + + Those fixes resolve the JavaScript errors, but the behavior is wrong; + the displayed results are delayed with respect to the search string. + md-contact-chips is expected to change (for the best) soon. + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Contacts/CardController.js +M UI/WebServerResources/js/Preferences/PreferencesController.js + +commit ab38134ba9eaa12bbc84d3452ac368fe9b28a6c0 +Author: Francis Lachapelle +Date: Thu May 7 10:04:50 2015 -0400 + + Improve user search auto-completion + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Contacts/AddressBooksController.js +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit a52e6604c1a8682fbb4cd21abeca4e81f246fffc +Author: Francis Lachapelle +Date: Thu May 7 10:03:30 2015 -0400 + + Improve contact list auto-completion + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/js/Contacts/Card.service.js + +commit b65573472e0451a7e441bc099593a5ff689a3b70 +Author: Francis Lachapelle +Date: Thu May 7 09:49:48 2015 -0400 + + Don't use node-sass 3.0.0, yet + +M UI/WebServerResources/package.json + +commit 160055a874d12e694349d3504e978c0a51b16de5 +Author: Francis Lachapelle +Date: Thu May 7 09:48:29 2015 -0400 + + Remove unused CSS files + +D UI/WebServerResources/css/ContactsUI.css +D UI/WebServerResources/css/MailerUI.css +D UI/WebServerResources/css/angular-material.css +D UI/WebServerResources/css/angular-material.min.css +D UI/WebServerResources/css/app.css +D UI/WebServerResources/css/blue-grey-theme.css +D UI/WebServerResources/css/default-theme.css +D UI/WebServerResources/css/mobile.css +D UI/WebServerResources/css/ng-tags-input.bootstrap.css +D UI/WebServerResources/css/ng-tags-input.bootstrap.min.css +D UI/WebServerResources/css/ng-tags-input.css +D UI/WebServerResources/css/ng-tags-input.min.css +D UI/WebServerResources/css/themes/amber-theme.css +D UI/WebServerResources/css/themes/blue-theme.css +D UI/WebServerResources/css/themes/brown-theme.css +D UI/WebServerResources/css/themes/cyan-theme.css +D UI/WebServerResources/css/themes/deep-orange-theme.css +D UI/WebServerResources/css/themes/deep-purple-theme.css +D UI/WebServerResources/css/themes/green-theme.css +D UI/WebServerResources/css/themes/grey-theme.css +D UI/WebServerResources/css/themes/indigo-theme.css +D UI/WebServerResources/css/themes/light-blue-dark-theme.css +D UI/WebServerResources/css/themes/light-green-theme.css +D UI/WebServerResources/css/themes/lime-theme.css +D UI/WebServerResources/css/themes/orange-theme.css +D UI/WebServerResources/css/themes/pink-theme.css +D UI/WebServerResources/css/themes/purple-theme.css +D UI/WebServerResources/css/themes/red-theme.css +D UI/WebServerResources/css/themes/teal-theme.css +D UI/WebServerResources/css/themes/yellow-theme.css +D UI/WebServerResources/css/ubuntu.css + +commit 2d46f4fd3389b82b802ceb0ef3a55adb23d6000c +Author: Francis Lachapelle +Date: Wed May 6 17:46:58 2015 -0400 + + (js) Improve Contacts controllers + +M UI/WebServerResources/js/Contacts/AddressBookController.js +M UI/WebServerResources/js/Contacts/CardController.js + +commit 0eb2ecd2f24ee0694795014532096609679f2dc6 +Author: Francis Lachapelle +Date: Wed May 6 17:45:28 2015 -0400 + + (js) Improve Gravatar support + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +A UI/WebServerResources/js/Common/Gravatar.service.js +M UI/WebServerResources/js/Common/User.service.js +M UI/WebServerResources/js/Common/sgGravatarImage.directive.js +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/Contacts/AddressBook.service.js +M UI/WebServerResources/js/Contacts/Card.service.js + +commit 856809426628d846dc15026716b13886b94e69a6 +Author: Francis Lachapelle +Date: Wed May 6 16:15:03 2015 -0400 + + (wox) Improve mobile display of Contacts + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 5e2bdcd2bad04fa2ab2d68cfbfee1ed01b4beba6 +Author: Ludovic Marcotte +Date: Wed May 6 16:11:51 2015 -0400 + + (fix) pimped the login form and added SOGoLoginDomains support + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit 2095df7865d0cd8ad20190b1da5966df56c01dc2 +Author: Francis Lachapelle +Date: Wed May 6 12:12:58 2015 -0400 + + Update .gitignore + +M .gitignore + +commit 618d3d9cc0e8a525b54da3b5ad64e8d2762ebcaa +Author: Francis Lachapelle +Date: Wed May 6 12:12:27 2015 -0400 + + (js) Fix dependency injections + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/Authentication.service.js +M UI/WebServerResources/js/Common/Common.app.js +M UI/WebServerResources/js/Common/sgSubscribe.directive.js +M UI/WebServerResources/js/Contacts.app.js +M UI/WebServerResources/js/Mailer.app.js +M UI/WebServerResources/js/Preferences/Preferences.service.js + +commit 874e393948e67a90947a8a1c93d87d2f1361a8f2 +Author: Francis Lachapelle +Date: Wed May 6 12:06:14 2015 -0400 + + (js) New file structure for login page (RootPage) + +M UI/Templates/MainUI/SOGoRootPage.wox +A UI/WebServerResources/js/Main.app.js +D UI/WebServerResources/js/SOGoRootPage.js +M UI/WebServerResources/scss/styles.scss + +commit d056f5581ae638b599e3c7faf3402b3c67ca81dd +Author: Ludovic Marcotte +Date: Wed May 6 09:46:37 2015 -0400 + + (fix) do not autocapitalize the username field + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit a8f52b30b8dea5efa47d346322dd8c1e0ada58fe +Author: Ludovic Marcotte +Date: Wed May 6 09:02:44 2015 -0400 + + (fix) adjusted the template after refactoring + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 1dc5f0d4127d60b324606e2ac0dbc3ac1d6ca1e4 +Author: Francis Lachapelle +Date: Tue May 5 22:06:13 2015 -0400 + + (js) New file structure for Angular modules + + JavaScript files are now merged by the 'js' Grunt task. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalUserRightsEditor.wox +M UI/Templates/UIxAclEditor.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +D UI/WebServerResources/js/Appointments/calendar-model.js +D UI/WebServerResources/js/Appointments/component-model.js +A UI/WebServerResources/js/Common/Acl.service.js +A UI/WebServerResources/js/Common/Authentication.service.js +A UI/WebServerResources/js/Common/Common.app.js +A UI/WebServerResources/js/Common/Dialog.service.js +A UI/WebServerResources/js/Common/Resource.service.js +D UI/WebServerResources/js/Common/SOGoAuthentication.js +A UI/WebServerResources/js/Common/User.service.js +D UI/WebServerResources/js/Common/acl-model.js +A UI/WebServerResources/js/Common/decodeUri.filter.js +A UI/WebServerResources/js/Common/encodeUri.filter.js +A UI/WebServerResources/js/Common/loc.filter.js +A UI/WebServerResources/js/Common/navController.js +D UI/WebServerResources/js/Common/resource.js +A UI/WebServerResources/js/Common/sgEnter.directive.js +A UI/WebServerResources/js/Common/sgEscape.directive.js +A UI/WebServerResources/js/Common/sgFocus.directive.js +A UI/WebServerResources/js/Common/sgFocus.service.js +A UI/WebServerResources/js/Common/sgFolderStylesheet.directive.js +A UI/WebServerResources/js/Common/sgGravatarImage.directive.js +A UI/WebServerResources/js/Common/sgSearch.directive.js +A UI/WebServerResources/js/Common/sgSubscribe.directive.js +M UI/WebServerResources/js/Common/ui-desktop.js +D UI/WebServerResources/js/Common/ui.js +D UI/WebServerResources/js/Common/user-model.js +A UI/WebServerResources/js/Contacts.app.js +A UI/WebServerResources/js/Contacts/AddressBook.service.js +A UI/WebServerResources/js/Contacts/AddressBookController.js +A UI/WebServerResources/js/Contacts/AddressBooksController.js +A UI/WebServerResources/js/Contacts/Card.service.js +A UI/WebServerResources/js/Contacts/CardController.js +D UI/WebServerResources/js/Contacts/addressbook-model.js +D UI/WebServerResources/js/Contacts/card-model.js +A UI/WebServerResources/js/Contacts/sgAddress.directive.js +D UI/WebServerResources/js/ContactsUI.js +A UI/WebServerResources/js/Mailer.app.js +A UI/WebServerResources/js/Mailer/Account.service.js +A UI/WebServerResources/js/Mailer/Mailbox.service.js +A UI/WebServerResources/js/Mailer/MailboxController.js +A UI/WebServerResources/js/Mailer/MailboxesController.js +A UI/WebServerResources/js/Mailer/Message.service.js +A UI/WebServerResources/js/Mailer/MessageController.js +A UI/WebServerResources/js/Mailer/MessageEditorController.js +D UI/WebServerResources/js/Mailer/account-model.js +D UI/WebServerResources/js/Mailer/mailbox-model.js +D UI/WebServerResources/js/Mailer/message-model.js +D UI/WebServerResources/js/MailerUI.js +A UI/WebServerResources/js/Preferences.app.js +A UI/WebServerResources/js/Preferences/AccountDialogController.js +A UI/WebServerResources/js/Preferences/FiltersDialogController.js +A UI/WebServerResources/js/Preferences/Preferences.service.js +A UI/WebServerResources/js/Preferences/PreferencesController.js +D UI/WebServerResources/js/Preferences/preferences-model.js +D UI/WebServerResources/js/PreferencesUI.js +A UI/WebServerResources/js/Scheduler.app.js +A UI/WebServerResources/js/Scheduler/Calendar.service.js +A UI/WebServerResources/js/Scheduler/CalendarController.js +A UI/WebServerResources/js/Scheduler/CalendarListController.js +A UI/WebServerResources/js/Scheduler/CalendarsController.js +A UI/WebServerResources/js/Scheduler/Component.service.js +A UI/WebServerResources/js/Scheduler/ComponentController.js +A UI/WebServerResources/js/Scheduler/sgCalendarDayBlock.directive.js +A UI/WebServerResources/js/Scheduler/sgCalendarDayTable.directive.js +A UI/WebServerResources/js/Scheduler/sgCalendarMonthDay.directive.js +A UI/WebServerResources/js/Scheduler/sgCalendarMonthEvent.directive.js +D UI/WebServerResources/js/SchedulerUI.js +M UI/WebServerResources/package.json + +commit b1ff1d436534f0bd99882a2c313c119c9b5ff869 +Author: Ludovic Marcotte +Date: Tue May 5 16:11:40 2015 -0400 + + (fix) many UI improvements in the pref panel + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 7e82ece74cc40721807a5c872cb8fdb6332fb3be +Author: Ludovic Marcotte +Date: Tue May 5 15:42:09 2015 -0400 + + (fix) hide the detail view when we have nothing to show + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/MailerUI.js + +commit a5cf7659ebae7bcc4c5fa0fe07b8f1d4020e05c8 +Author: Francis Lachapelle +Date: Tue May 5 15:22:52 2015 -0400 + + (js) Fix Message service initialization + +M UI/WebServerResources/js/Mailer/message-model.js + +commit 43b6006a860ea16c15b4b54c3c9d2c4f321b49e5 +Author: Luc Charland +Date: Tue May 5 15:13:04 2015 -0400 + + removed the unneeded sleep + +M Tests/Integration/webdavlib.py + +commit 7eb58db949b6ce59d96610c285fe15fa7aa3e334 +Author: Ludovic Marcotte +Date: Tue May 5 13:06:31 2015 -0400 + + (fix) also remove the Draft flag + +M UI/MailerUI/UIxMailListActions.m + +commit 12c820783608b8a9a9e0d8ba5ad4beb3d6d4ab73 +Author: Ludovic Marcotte +Date: Tue May 5 13:03:59 2015 -0400 + + (feat) flag/unflag messages + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit b16c17457e25e9ea367bfcf15ea6251b4879b078 +Author: Ludovic Marcotte +Date: Tue May 5 12:04:41 2015 -0400 + + (fix) disabled the toggles for priority/return receipt for now + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 2d22c56efe95dfcc4be644faefbf3db13a2bd7d1 +Author: Ludovic Marcotte +Date: Tue May 5 09:49:40 2015 -0400 + + (feat) added replied/forwarded message status support + pimped UI a bit + +M UI/MailerUI/UIxMailListActions.m +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit 8a74c9f9e0a4302403b7d17dd2762d64278fcae0 +Author: Ludovic Marcotte +Date: Tue May 5 09:03:52 2015 -0400 + + (fix) recipients handling was broken since moving to chips + +M UI/WebServerResources/js/Mailer/message-model.js + +commit c09e76f2d1c0bf84635ca072d7d1a5127e713c34 +Author: Ludovic Marcotte +Date: Mon May 4 16:39:45 2015 -0400 + + (feat) handle show cc/bcc/attachments in mail composition + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/MailerUI.js + +commit 4fa33c0bc2179bd36d671001ec37e0261b5e62ba +Author: Luc Charland +Date: Mon May 4 13:48:55 2015 -0400 + + All tests now pass in version 3 + +M Tests/Integration/preferences.py +M Tests/Integration/test-preferences.py +M Tests/Integration/test-sieve.py +M UI/PreferencesUI/UIxPreferences.m + +commit b0318ca7b65f54936f3b86c1c6c84dd649600931 +Author: Ludovic Marcotte +Date: Mon May 4 13:56:29 2015 -0400 + + (feat) chips for mail labels + +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/UIxMailMainFrame.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 8e0230488fa6de448ba4493bb6d6aac600bf7562 +Author: Francis Lachapelle +Date: Mon May 4 13:36:04 2015 -0400 + + (css) Remove Compass dependency + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/package.json +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/styles.scss + +commit b20707d0ed3d8d6c594911e8bbd9a760a3abc938 +Author: Francis Lachapelle +Date: Mon May 4 12:07:15 2015 -0400 + + (css) Add rem function from ng's variables.scss + +M UI/WebServerResources/scss/core/variables.scss + +commit cc7c7f7dc7229dc8dfdbed90f31004d45339b686 +Author: Ludovic Marcotte +Date: Mon May 4 08:52:54 2015 -0400 + + Fixed wrong subheader name + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit 8b483136d0de0792380c59bd409e2fa88de46a21 +Author: Francis Lachapelle +Date: Fri May 1 13:56:43 2015 -0400 + + Fix compilation warning in UIxJSONPreferences.m + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit 2888034ea610a71acd11d890b3e6141f24e60ab3 +Author: Francis Lachapelle +Date: Fri May 1 12:19:33 2015 -0400 + + (js) Create new appointment from Calendar module + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Appointments/component-model.js +M UI/WebServerResources/js/SchedulerUI.js + +commit 520103cffef8c8c1313320473303a4f553de0b3d +Author: Francis Lachapelle +Date: Fri May 1 12:12:42 2015 -0400 + + (js) Extend String with method 'capitalize' + +M UI/WebServerResources/js/Common/utils.js + +commit 12d5b576245d02455dd3f1114ba7c63b83a759d3 +Author: Francis Lachapelle +Date: Fri May 1 09:56:30 2015 -0400 + + (js) Handle web calendars in Calendar model + +M UI/WebServerResources/js/Appointments/calendar-model.js + +commit 523532b153d24aecbd740957855402068c657905 +Author: Francis Lachapelle +Date: Fri May 1 09:54:49 2015 -0400 + + (js) Resource.post: argument 'id' is optional + +M UI/WebServerResources/js/Common/resource.js + +commit fc3c362515176715b32801263ee03a0728f3ea49 +Author: Francis Lachapelle +Date: Fri May 1 09:52:48 2015 -0400 + + (css) Grow width of message viewer + +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 0c213c9e661bc4b71bed3ce2bdb145439eb8fe08 +Author: Francis Lachapelle +Date: Fri May 1 09:51:30 2015 -0400 + + (js) Improve code of Calendar module + + Integrated usage of 'controllerAs'. + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/SchedulerUI.js + +commit 494e2be680e4c2fff1a4eb697cbc5e8f974c6683 +Author: Francis Lachapelle +Date: Fri May 1 09:41:17 2015 -0400 + + (js) Save addressbook search string + + This allow to show the email address that matches the search string (if + it does) + +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js + +commit d9184d2363b94ec006bd8aa56cefdd8924775083 +Author: Francis Lachapelle +Date: Fri May 1 09:38:55 2015 -0400 + + Format HTML + remove fab button from mail viewer + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit d9b67a85f24c2b420f0fda5e2445091863568fa8 +Author: Francis Lachapelle +Date: Fri May 1 09:08:07 2015 -0400 + + Return the proper HTTP code when saving an event + +M UI/Scheduler/UIxAppointmentEditor.m + +commit e59a4b4246c363a4b8b78b27d98eaad0825f2ebb +Author: Francis Lachapelle +Date: Thu Apr 30 22:12:46 2015 -0400 + + Use of Dialog.prompt service in Contacts module + +M UI/WebServerResources/js/ContactsUI.js + +commit 666d36736fec095e330020a91057ec2179b6dee3 +Author: Francis Lachapelle +Date: Thu Apr 30 22:12:08 2015 -0400 + + Fix/improve search filter of Contacts module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 33b035b36098af941162355787d85f76d88c69a0 +Author: Francis Lachapelle +Date: Thu Apr 30 16:27:40 2015 -0400 + + LDIF to vCard: Handle multiple emails & phones + +M SoObjects/Contacts/NGVCard+SOGo.m +M SoObjects/Contacts/SOGoContactLDIFEntry.m +M SoObjects/Contacts/SOGoContactSourceFolder.m + +commit 41bc68946d140e4b8362662de34ded4ea9177798 +Author: Ludovic Marcotte +Date: Thu Apr 30 13:58:26 2015 -0400 + + Improved the UI of the bottom sheet content + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/scss/components/list/list.scss + +commit f515543e335cd6b98b99c258773c5e15d68fd0a9 +Author: Ludovic Marcotte +Date: Thu Apr 30 11:19:30 2015 -0400 + + (fix) many adjustments regarding auxiliary accounts + +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/WebServerResources/js/PreferencesUI.js + +commit 6d64242382a128595e5eea6abf21f56352f41503 +Author: Francis Lachapelle +Date: Thu Apr 30 10:31:49 2015 -0400 + + (fix) Restore radio-button.scss + +M UI/WebServerResources/scss/styles.scss + +commit d3916e6e5e6c26a07190df34e8049a0460b845b5 +Author: Francis Lachapelle +Date: Wed Apr 29 22:56:04 2015 -0400 + + Improve API documentation + +M UI/Common/UIxParentFolderActions.m +M UI/Scheduler/UIxCalFolderActions.m +M UI/Scheduler/UIxCalMainActions.m + +commit f2833a278102a1c8771631f5f25e3393cb640cfd +Author: Francis Lachapelle +Date: Wed Apr 29 16:43:11 2015 -0400 + + JSONify [UIxCalMainActions addWebCalendarAction] + +M UI/Scheduler/UIxCalMainActions.m + +commit 9e8d991099d2b9e12c594d8d712f6fd0c29b283f +Author: Francis Lachapelle +Date: Wed Apr 29 16:42:10 2015 -0400 + + Display relative dates in Calendar module + +M UI/Scheduler/UIxCalListingActions.h +M UI/Scheduler/UIxCalListingActions.m + +commit 1e3cb575678aac5a9918829574e5a0a2681e53bc +Author: Ludovic Marcotte +Date: Wed Apr 29 14:45:22 2015 -0400 + + (fix) removal of mail account + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit bc67ffe20db51688e42ef1d7ea0a23fd1f5f76aa +Author: Ludovic Marcotte +Date: Wed Apr 29 14:40:18 2015 -0400 + + (feat) Gravatar support for mail/contacts + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Common/ui-desktop.js + +commit d0ee85e77ad048a34f6faee4de814df3a2b57e2b +Author: Francis Lachapelle +Date: Wed Apr 29 14:37:04 2015 -0400 + + Add button to create new mailbox from account root + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/MailerUI.js + +commit b390a4b117a6539760d56815d46f9ca9f8dbd127 +Author: Francis Lachapelle +Date: Wed Apr 29 14:18:51 2015 -0400 + + (css) Enlarge width of "detail" view + +M UI/WebServerResources/scss/views/_view.scss + +commit bb05ce89c9ac407d4d2d7cef1c91551e7129b942 +Author: Francis Lachapelle +Date: Wed Apr 29 14:17:51 2015 -0400 + + (js) Improve Dialog service + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 16b75b1debe93be4c7d7d142aae2009c4134a605 +Author: Francis Lachapelle +Date: Wed Apr 29 11:23:21 2015 -0400 + + Improve lists in sidenav + + - the ripple effect is now visible when clicking on list items; + - the fab icon has been moved over the items list; + - colorized the checkboxes of the calendars list. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Appointments/calendar-model.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit 4dbd796fd5eddef90a591b3e9d1ff0b0247f58c3 +Author: Ludovic Marcotte +Date: Tue Apr 28 15:25:59 2015 -0400 + + Added color "avatar" for mail labels + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/PreferencesUI.js + +commit affa6ba65610bde6c440dacddb1ec88ad009fc10 +Author: Ludovic Marcotte +Date: Tue Apr 28 15:22:20 2015 -0400 + + (fix) new calendar category now showing color too + +M UI/WebServerResources/js/PreferencesUI.js + +commit 8074e67b84377ba294ec1781ea628534a78d944b +Author: Ludovic Marcotte +Date: Tue Apr 28 15:15:42 2015 -0400 + + (fix) default calendar category colors + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit d43d31d1440b899fa6537dd21c792001042f7b3a +Author: Ludovic Marcotte +Date: Tue Apr 28 15:01:35 2015 -0400 + + (fix) correctly initialize arrays + +M UI/WebServerResources/js/PreferencesUI.js + +commit 966a088a0f8f1af3cbb5650b23bbd2e564764032 +Author: Ludovic Marcotte +Date: Tue Apr 28 14:01:44 2015 -0400 + + (fix) correctly initialize the PreventInvitationsWhitelist array + +M UI/WebServerResources/js/Preferences/preferences-model.js + +commit ebf4c1a9c7745030b47a4f2311e7a2d50544ef19 +Author: Ludovic Marcotte +Date: Tue Apr 28 13:56:50 2015 -0400 + + (fix) also handle forwardAddress + +M UI/WebServerResources/js/Preferences/preferences-model.js + +commit dd13abd70145cc72fbaaed6fbeb33ee681993c19 +Author: Ludovic Marcotte +Date: Tue Apr 28 13:40:27 2015 -0400 + + Fixed pref module + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit aa4dc45aa7e02e579d2eb732ab13f0702f4743ad +Author: Ludovic Marcotte +Date: Tue Apr 28 11:51:39 2015 -0400 + + fix over previous commit + +M UI/PreferencesUI/UIxPreferences.m + +commit e1d8854d104a171e3a1eac701cc967b31bb0f941 +Author: Ludovic Marcotte +Date: Tue Apr 28 11:19:37 2015 -0400 + + (fix) correctly generate the Sieve script + +M UI/PreferencesUI/UIxPreferences.m + +commit 243726f0962b705f9874c2ea76eb6a8981fbbc7e +Author: Luc Charland +Date: Tue Apr 28 11:02:43 2015 -0400 + + Changed preferences to use JSON for v3 + +M Tests/Integration/preferences.py +M Tests/Integration/test-preferences.py +M Tests/Integration/test-prevent-invitations.py +M Tests/Integration/test-sieve.py + +commit f49610f058ddc20b9531b0a0289f7976e4ce3c3e +Author: Ludovic Marcotte +Date: Mon Apr 27 13:33:26 2015 -0400 + + (fix) renamed md-content -> md-dialog-content regarding changes in angular-material + +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/SchedulerUI.js + +commit a166d1b4cfbe0ef227fce6a98e3224d5429fc93f +Author: Ludovic Marcotte +Date: Mon Apr 27 13:18:05 2015 -0400 + + Using chips for adding/viewing contact categories + +M UI/Contacts/UIxContactView.m +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit 8557b2a1613b564f981b0851b2c3d32a87e2cc68 +Author: Francis Lachapelle +Date: Mon Apr 27 11:24:58 2015 -0400 + + (fix) Reset button of contact and event editors + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox + +commit d77f75da49f3fc6bf454261ecd14604a7c6e41d2 +Author: Francis Lachapelle +Date: Mon Apr 27 10:23:31 2015 -0400 + + (fix) Save card in Contacts module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 0f1b0bfbbeedaf9ba8944f5fe52cf8b53543c960 +Author: Ludovic Marcotte +Date: Fri Apr 24 19:44:34 2015 -0400 + + Fixed ui routing for card editor + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 91c92e3a11c280d5fd200a0ef31ebb12f52eece2 +Author: Ludovic Marcotte +Date: Fri Apr 24 19:20:32 2015 -0400 + + added new calendar feature + +M UI/WebServerResources/js/SchedulerUI.js + +commit 1f5248371c0367f66139b23f9cdee3980bf43088 +Author: Ludovic Marcotte +Date: Fri Apr 24 18:55:23 2015 -0400 + + Disabled unuseful md-select for now + +M UI/Templates/UIxSidenavToolbarTemplate.wox + +commit dbf614a2dc70d4581780562b839e7d26af1e05df +Author: Ludovic Marcotte +Date: Fri Apr 24 17:41:05 2015 -0400 + + Re-enabled textures + +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss + +commit c957b4b45fec36e361d18cb56273ce966e632861 +Author: Francis Lachapelle +Date: Fri Apr 24 16:48:41 2015 -0400 + + Initial component editor in Scheduler module + +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxCalMainView.m +M UI/Scheduler/product.plist +A UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/Appointments/component-model.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/SchedulerUI.js +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit feee156c0a171d1cc22db6263aa4e3028c0deb2e +Author: Ludovic Marcotte +Date: Fri Apr 24 16:07:48 2015 -0400 + + Added calendar sharing capability + +M UI/Scheduler/UIxCalUserRightsEditor.m +M UI/Scheduler/product.plist +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalUserRightsEditor.wox +M UI/WebServerResources/angular-material +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/SchedulerUI.js +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss + +commit 0d62ec0bead8f6eec5636532e518de31da4607d0 +Author: Francis Lachapelle +Date: Fri Apr 24 15:08:55 2015 -0400 + + (js) Split Calendars list by type + + The list of calendars is now splitted by type: personal calendars and + other's calendars (subscriptions). + + The constructor of the Calendar model has been improved. + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Appointments/calendar-model.js +M UI/WebServerResources/js/SchedulerUI.js + +commit 550fc09ee4227f89e74e6a0c6f8f93e25a96cd05 +Author: Francis Lachapelle +Date: Fri Apr 24 14:25:04 2015 -0400 + + Add attribute isReadOnly to event/task JSON view + +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m +M UI/Scheduler/UIxTaskEditor.m + +commit 5e3b3e698711159baf68476de3e8954d69042a28 +Author: Ludovic Marcotte +Date: Fri Apr 24 11:53:08 2015 -0400 + + Added ACL sharing capabilities for address books + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 77269e5cd645e8a9f284186783838222f04ec6d8 +Author: Ludovic Marcotte +Date: Fri Apr 24 11:44:33 2015 -0400 + + Used the avatar for consistency with other dialogs + +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox + +commit 8c9a074688efbd6d90aa64a3b2af0395dbc934e2 +Author: Francis Lachapelle +Date: Fri Apr 24 08:53:28 2015 -0400 + + (css) Add sticky component for subheaders + +M UI/WebServerResources/scss/styles.scss + +commit 5247200bf0054c1dedbc764582802988c69ab95e +Author: Francis Lachapelle +Date: Fri Apr 24 08:52:20 2015 -0400 + + (css) Improve lists and subheaders components + +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/views/ContactsUI.scss + +commit 96ebc32d8aa072b032ae51ace6a36135ae9b9793 +Author: Francis Lachapelle +Date: Fri Apr 24 08:45:39 2015 -0400 + + Split AddressBooks list by type + + The list of addressbook books is now splitted by type: personal + addressbooks, other's addressbooks (subscriptions) and global + addressbooks (from sogo.conf, per domain). + + The main ui-view has been splitted and therefore an additional + controller has been created. + + The constructor of the AddressBook model has been improved. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit 19c12add73b6af2e92403d8720f2274c48a814b7 +Author: Ludovic Marcotte +Date: Thu Apr 23 14:41:32 2015 -0400 + + Added the capability to create address books + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/ContactsUI.js + +commit ecf30daaf30c4e09ad9a61437e5a958b098319d7 +Author: Ludovic Marcotte +Date: Thu Apr 23 11:24:49 2015 -0400 + + Removed useless file + +D UI/WebServerResources/js/Common/notes + +commit 47e7201eb6e45e4ade66a85ef73b7f1d1e0b833c +Author: Ludovic Marcotte +Date: Thu Apr 23 11:02:11 2015 -0400 + + added list avatar, make use of it + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit 174accdb23cd7332aa9836f93064b6346a306041 +Author: Ludovic Marcotte +Date: Thu Apr 23 09:47:51 2015 -0400 + + Display category color + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/PreferencesUI.js + +commit 62468d21ef37285f9cf1adf7653f0da768539025 +Author: Francis Lachapelle +Date: Wed Apr 22 22:49:44 2015 -0400 + + Improve template for sgSubscribe directive + +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit 9571befbfd593b273ff3742b209d0f0f2e63ee96 +Author: Ludovic Marcotte +Date: Wed Apr 22 16:10:02 2015 -0400 + + Added logoff feature + +M UI/Templates/UIxPageFrame.wox + +commit 36189e420316638f88644172f229d121a48b8fe3 +Author: Ludovic Marcotte +Date: Wed Apr 22 15:55:52 2015 -0400 + + Added calendar subscription + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/SchedulerUI.js + +commit 428f2586c70f78ff807a9f0b6a07f8b977e9348b +Author: Ludovic Marcotte +Date: Wed Apr 22 15:41:50 2015 -0400 + + Added addressbook subscription support + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 5ea57f195b4d3933b30bc0b60ec21830d672c18c +Author: Ludovic Marcotte +Date: Wed Apr 22 10:01:31 2015 -0400 + + Allow creation or list/contact + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit 11179cf27db52cd10aa21fc1f0ebb5cfb7a99201 +Author: Ludovic Marcotte +Date: Tue Apr 21 14:24:19 2015 -0400 + + Use a label instead of subheader, it's more sexy + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 2ff613148364d10c2c32017eb21a09b16aff7497 +Author: Ludovic Marcotte +Date: Tue Apr 21 14:19:43 2015 -0400 + + Added list editor/viewer, fixed contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/card-model.js + +commit 7b874d08d44c1c34e328081011615490c4dbd394 +Author: Francis Lachapelle +Date: Tue Apr 21 13:40:39 2015 -0400 + + Improve sidenav lists + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit 3858911007f85703ea9ef1d870421c25e0482158 +Author: Luc Charland +Date: Tue Apr 21 09:59:50 2015 -0400 + + Changed login from urlencoded to json + +M Tests/Integration/sogoLogin.py + +commit a25a01495fd6b237e2241e3d4292b3017998df17 +Author: Ludovic Marcotte +Date: Mon Apr 20 17:28:43 2015 -0400 + + Added chips for prevent invitations + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Preferences/preferences-model.js +M UI/WebServerResources/js/PreferencesUI.js + +commit 781d55cc378512734228f1d24f81469344f7135e +Author: Francis Lachapelle +Date: Mon Apr 20 16:11:10 2015 -0400 + + Force colors of sgFolderStylesheet + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 5d5d8bc201dd25a6bc6a00a32f7207a018b00c03 +Author: Francis Lachapelle +Date: Mon Apr 20 13:27:03 2015 -0400 + + (html) Fix list of messages of selected mailbox + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit 0cdd19e3aa1dacfc5af94a1f92b9dc25a9576c57 +Author: Luc Charland +Date: Mon Apr 20 13:17:20 2015 -0400 + + fixed a missing semi-colon + +M UI/MainUI/product.plist + +commit 0f21c02a5ff9a1cec66d9c7292feef98831f5f2c +Author: Francis Lachapelle +Date: Mon Apr 20 12:21:00 2015 -0400 + + (html) Fix template of sgFolderTree directive + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit ecad0c367f6f95ee00001d880ac58a86190bd096 +Author: Francis Lachapelle +Date: Mon Apr 20 12:08:20 2015 -0400 + + (html) Fix list of messages of selected mailbox + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit eeca191103967558cfd622371d722d273bad2f20 +Author: Francis Lachapelle +Date: Mon Apr 20 12:04:07 2015 -0400 + + (css) Cleanup sidenav component + + Remove duplicated definitions from angular material source and prepare + for right sidenav. + +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit 3f27e5b7750a4c1f8b3fd6a2a630424571514fea +Author: Francis Lachapelle +Date: Mon Apr 20 11:56:30 2015 -0400 + + (css) Dirty fix for vs-repeat damages + +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss + +commit 991351999e14f304dd9f9b6cd448a147d9694003 +Author: Ludovic Marcotte +Date: Sun Apr 19 08:26:27 2015 -0400 + + Removed unused statement + +M UI/WebServerResources/js/Common/user-model.js + +commit c76bca3f68d58658e4d02d90477bbbacc43a5cac +Author: Ludovic Marcotte +Date: Sun Apr 19 08:15:04 2015 -0400 + + arial label + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit 0529de2c1cc8e6df8ca3dd8081950a535a217a74 +Author: Ludovic Marcotte +Date: Sun Apr 19 08:13:55 2015 -0400 + + Removed useless stuff + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox + +commit b141031ccd67a9cb4bb591e056d0951fc3930720 +Author: Francis Lachapelle +Date: Sat Apr 18 08:50:06 2015 -0400 + + Initialize arrays of new message instance + +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/message-model.js + +commit 69716321656de259a01266bedd42f88ec1eaa69f +Author: Francis Lachapelle +Date: Sat Apr 18 01:23:56 2015 -0400 + + (scss) Remove deprecated textfield component + +D UI/WebServerResources/scss/components/textField/_extends.scss +D UI/WebServerResources/scss/components/textField/textField-theme.scss +D UI/WebServerResources/scss/components/textField/textField.scss +M UI/WebServerResources/scss/styles.scss + +commit b9eb0f9a6962d0c8aad12ee8b5d99b822e2be65d +Author: Francis Lachapelle +Date: Sat Apr 18 01:21:52 2015 -0400 + + (scss) Integrate md-chips + +A UI/WebServerResources/scss/components/chips/_extends.scss +A UI/WebServerResources/scss/components/chips/chips.scss +M UI/WebServerResources/scss/styles.scss + +commit 0924b5154e9cc2c8094ff5fa048a67d031c6055b +Author: Francis Lachapelle +Date: Sat Apr 18 01:19:35 2015 -0400 + + Replace ngTagsInput by md-chips + md-autocomplete + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/MailerUI.js +D UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/styles.scss + +commit 14597f8f163583959844b06a5f261b08af1c5af4 +Author: Benoit Favreault +Date: Wed Apr 15 16:24:23 2015 -0400 + + Update angular-material to commit 96559458633f90dafd543d3a88f9a2165fd76ac3 + +M UI/WebServerResources/angular-material + +commit fc69d6b1d41a7d288585fd4ef8a50dc8dcecc781 +Author: Benoit Favreault +Date: Tue Apr 14 22:19:51 2015 -0400 + + Change paper palette defaults hues + Fix mobile show-hide + +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/core/layout.scss + +commit 321cfb846786efc8c3000cbbf426545511dddc8a +Author: Benoit Favreault +Date: Tue Apr 14 20:46:41 2015 -0400 + + Update angular-material to commit 77504e9ff178abf02c0886d7f6cfad7d68239fca + +M UI/WebServerResources/angular-material + +commit da9dbd8ad59446423d08052b11e9e5a56ed7a9e3 +Author: Francis Lachapelle +Date: Mon Apr 13 10:24:08 2015 -0400 + + (fix) Restore checkbox.scss + +M UI/WebServerResources/scss/styles.scss + +commit 4626039e5c195fafdab3e25fb7306f6270765fc4 +Author: Francis Lachapelle +Date: Mon Apr 13 09:47:33 2015 -0400 + + (fix) JavaScript errors on Mail preferences tab + +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 41f598c9ed73ba8146dfadb3148a6da3abe53a8b +Author: Benoit Favreault +Date: Fri Apr 10 16:22:50 2015 -0400 + + Reset SchdulerUI.scss to [6ee715d] + +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit f080536b3f11517193d4d084763b98fd119c9d91 +Author: Benoit Favreault +Date: Fri Apr 10 16:10:57 2015 -0400 + + Resolve conflict + +M UI/WebServerResources/scss/views/SchedulerUI.scss +D UI/WebServerResources/scss/views/SchedulerUI.scss.orig + +commit af57fa84e4cb47c8c301170515ec90b090a3bc00 +Author: Benoit Favreault +Date: Fri Apr 10 15:48:23 2015 -0400 + + Update angular-material [commit 42db19dd5571eb88ba8d2a9667d183d9f3d61da7] + +M UI/WebServerResources/angular-material + +commit 46a262acfa15cfa9ffe2d0780d1ca300c394b65b +Author: Benoit Favreault +Date: Fri Apr 10 15:37:00 2015 -0400 + + Cleaning unused scss files + +M UI/WebServerResources/package.json +D UI/WebServerResources/scss/components/_pages/_page-resources.scss +D UI/WebServerResources/scss/components/_pages/_styleguide.scss +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/_utils.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/backdrop/backdrop.scss +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet-theme.scss +D UI/WebServerResources/scss/components/bottombar/_extends.scss +D UI/WebServerResources/scss/components/bottombar/_mixins.scss +D UI/WebServerResources/scss/components/bottombar/bottombar-theme.scss +D UI/WebServerResources/scss/components/bottombar/bottombar.scss +D UI/WebServerResources/scss/components/bottombar/test.scss +D UI/WebServerResources/scss/components/button/_button.scss +A UI/WebServerResources/scss/components/button/button.scss +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/components/checkbox/checkbox.scss +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/dialog/dialog.scss +M UI/WebServerResources/scss/components/divider/divider.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/input/input.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/components/progressCircular/progressCircular.scss +M UI/WebServerResources/scss/components/progressLinear/progressLinear.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/_functions.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/core/base_styles/_functions.scss +M UI/WebServerResources/scss/core/base_styles/_mixins.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/core/reset.scss +M UI/WebServerResources/scss/core/structure.scss +M UI/WebServerResources/scss/core/typography.scss +M UI/WebServerResources/scss/core/variables.scss +D UI/WebServerResources/scss/modules/_article-nav.scss +D UI/WebServerResources/scss/modules/_articles-section.scss +D UI/WebServerResources/scss/modules/_did-you-know.scss +D UI/WebServerResources/scss/modules/_editorial-header.scss +D UI/WebServerResources/scss/modules/_featured-section.scss +D UI/WebServerResources/scss/modules/_featured-spotlight.scss +D UI/WebServerResources/scss/modules/_guides-section.scss +D UI/WebServerResources/scss/modules/_highlight.scss +D UI/WebServerResources/scss/modules/_in-this-guide.scss +D UI/WebServerResources/scss/modules/_next-lessons.scss +D UI/WebServerResources/scss/modules/_page-header.scss +D UI/WebServerResources/scss/modules/_quote.scss +D UI/WebServerResources/scss/modules/_related-guides.scss +D UI/WebServerResources/scss/modules/_related-items.scss +D UI/WebServerResources/scss/modules/_summary-header.scss +D UI/WebServerResources/scss/modules/_toc.scss +M UI/WebServerResources/scss/styles.scss +D UI/WebServerResources/scss/themes/color-palette.scss +D UI/WebServerResources/scss/vendors/_compass.scss +D UI/WebServerResources/scss/vendors/compass/_configuration.scss +D UI/WebServerResources/scss/vendors/compass/_css3.scss +D UI/WebServerResources/scss/vendors/compass/_layout.scss +D UI/WebServerResources/scss/vendors/compass/_reset-legacy.scss +D UI/WebServerResources/scss/vendors/compass/_reset.scss +D UI/WebServerResources/scss/vendors/compass/_support.scss +D UI/WebServerResources/scss/vendors/compass/_typography.scss +D UI/WebServerResources/scss/vendors/compass/_utilities.scss +D UI/WebServerResources/scss/vendors/compass/css3/_animation.scss +D UI/WebServerResources/scss/vendors/compass/css3/_appearance.scss +D UI/WebServerResources/scss/vendors/compass/css3/_background-clip.scss +D UI/WebServerResources/scss/vendors/compass/css3/_background-origin.scss +D UI/WebServerResources/scss/vendors/compass/css3/_background-size.scss +D UI/WebServerResources/scss/vendors/compass/css3/_border-radius.scss +D UI/WebServerResources/scss/vendors/compass/css3/_box-shadow.scss +D UI/WebServerResources/scss/vendors/compass/css3/_box-sizing.scss +D UI/WebServerResources/scss/vendors/compass/css3/_box.scss +D UI/WebServerResources/scss/vendors/compass/css3/_columns.scss +D UI/WebServerResources/scss/vendors/compass/css3/_deprecated-support.scss +D UI/WebServerResources/scss/vendors/compass/css3/_filter.scss +D UI/WebServerResources/scss/vendors/compass/css3/_flexbox.scss +D UI/WebServerResources/scss/vendors/compass/css3/_font-face.scss +D UI/WebServerResources/scss/vendors/compass/css3/_hyphenation.scss +D UI/WebServerResources/scss/vendors/compass/css3/_images.scss +D UI/WebServerResources/scss/vendors/compass/css3/_inline-block.scss +D UI/WebServerResources/scss/vendors/compass/css3/_opacity.scss +D UI/WebServerResources/scss/vendors/compass/css3/_pie.scss +D UI/WebServerResources/scss/vendors/compass/css3/_regions.scss +D UI/WebServerResources/scss/vendors/compass/css3/_selection.scss +D UI/WebServerResources/scss/vendors/compass/css3/_shared.scss +D UI/WebServerResources/scss/vendors/compass/css3/_text-shadow.scss +D UI/WebServerResources/scss/vendors/compass/css3/_transform.scss +D UI/WebServerResources/scss/vendors/compass/css3/_transition.scss +D UI/WebServerResources/scss/vendors/compass/css3/_user-interface.scss +D UI/WebServerResources/scss/vendors/compass/layout/_grid-background.scss +D UI/WebServerResources/scss/vendors/compass/layout/_sticky-footer.scss +D UI/WebServerResources/scss/vendors/compass/layout/_stretching.scss +D UI/WebServerResources/scss/vendors/compass/reset/_utilities-legacy.scss +D UI/WebServerResources/scss/vendors/compass/reset/_utilities.scss +D UI/WebServerResources/scss/vendors/compass/typography/_links.scss +D UI/WebServerResources/scss/vendors/compass/typography/_lists.scss +D UI/WebServerResources/scss/vendors/compass/typography/_text.scss +D UI/WebServerResources/scss/vendors/compass/typography/_units.scss +D UI/WebServerResources/scss/vendors/compass/typography/_vertical_rhythm.scss +D UI/WebServerResources/scss/vendors/compass/typography/links/_hover-link.scss +D UI/WebServerResources/scss/vendors/compass/typography/links/_link-colors.scss +D UI/WebServerResources/scss/vendors/compass/typography/links/_unstyled-link.scss +D UI/WebServerResources/scss/vendors/compass/typography/lists/_bullets.scss +D UI/WebServerResources/scss/vendors/compass/typography/lists/_horizontal-list.scss +D UI/WebServerResources/scss/vendors/compass/typography/lists/_inline-block-list.scss +D UI/WebServerResources/scss/vendors/compass/typography/lists/_inline-list.scss +D UI/WebServerResources/scss/vendors/compass/typography/text/_ellipsis.scss +D UI/WebServerResources/scss/vendors/compass/typography/text/_force-wrap.scss +D UI/WebServerResources/scss/vendors/compass/typography/text/_nowrap.scss +D UI/WebServerResources/scss/vendors/compass/typography/text/_replacement.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_color.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_general.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_links.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_lists.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_print.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_sass.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_sprites.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_tables.scss +D UI/WebServerResources/scss/vendors/compass/utilities/_text.scss +D UI/WebServerResources/scss/vendors/compass/utilities/color/_brightness.scss +D UI/WebServerResources/scss/vendors/compass/utilities/color/_contrast.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_clearfix.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_float.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_hacks.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_min.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_reset.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_tabs.scss +D UI/WebServerResources/scss/vendors/compass/utilities/general/_tag-cloud.scss +D UI/WebServerResources/scss/vendors/compass/utilities/links/_hover-link.scss +D UI/WebServerResources/scss/vendors/compass/utilities/links/_link-colors.scss +D UI/WebServerResources/scss/vendors/compass/utilities/links/_unstyled-link.scss +D UI/WebServerResources/scss/vendors/compass/utilities/lists/_bullets.scss +D UI/WebServerResources/scss/vendors/compass/utilities/lists/_horizontal-list.scss +D UI/WebServerResources/scss/vendors/compass/utilities/lists/_inline-block-list.scss +D UI/WebServerResources/scss/vendors/compass/utilities/lists/_inline-list.scss +D UI/WebServerResources/scss/vendors/compass/utilities/sass/_lists.scss +D UI/WebServerResources/scss/vendors/compass/utilities/sass/_maps.scss +D UI/WebServerResources/scss/vendors/compass/utilities/sprites/_base.scss +D UI/WebServerResources/scss/vendors/compass/utilities/sprites/_sprite-img.scss +D UI/WebServerResources/scss/vendors/compass/utilities/tables/_alternating-rows-and-columns.scss +D UI/WebServerResources/scss/vendors/compass/utilities/tables/_borders.scss +D UI/WebServerResources/scss/vendors/compass/utilities/tables/_scaffolding.scss +D UI/WebServerResources/scss/vendors/compass/utilities/text/_ellipsis.scss +D UI/WebServerResources/scss/vendors/compass/utilities/text/_nowrap.scss +D UI/WebServerResources/scss/vendors/compass/utilities/text/_replacement.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/LoginUI.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss +M UI/WebServerResources/scss/views/SchedulerUI.scss +A UI/WebServerResources/scss/views/SchedulerUI.scss.orig +M UI/WebServerResources/scss/views/_view.scss + +commit a276ac366edff92cf84cc5bcb25fd789dc4adf0f +Author: Francis Lachapelle +Date: Fri Apr 10 12:36:18 2015 -0400 + + Set width/position of events blocks and add colors + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 82d1d5e7013f2e58a9e0fe0d1145b9cc5cfdf227 +Author: Francis Lachapelle +Date: Fri Apr 10 12:32:51 2015 -0400 + + Review calendar views templates + + Changed month view to a md-grid-list. + Added some colors. + +M UI/Templates/SchedulerUI/UIxCalDayTable.wox +M UI/Templates/SchedulerUI/UIxCalMonthView.wox +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit 305c13d7201b7c4e9d86648cdf8a880132c0b3f0 +Author: Francis Lachapelle +Date: Fri Apr 10 12:22:24 2015 -0400 + + Add common template UIxTopnavToolbarTemplate.wox + +M UI/Common/UIxPageFrame.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +A UI/Templates/UIxTopnavToolbarTemplate.wox + +commit 0de02262d02c2f75f3b20082cfff11508ec70b1e +Author: Ludovic Marcotte +Date: Fri Apr 10 11:42:37 2015 -0400 + + (fix) make sure we can always add filters + +M UI/WebServerResources/js/PreferencesUI.js + +commit d5810542148c9ce4c2e743786b91b7f793c7c7f2 +Author: Ludovic Marcotte +Date: Fri Apr 10 09:44:30 2015 -0400 + + (fix) fixed default values for many prefs + +M SoObjects/SOGo/SOGoDefaults.plist +M SoObjects/SOGo/SOGoUserProfile.h +M SoObjects/SOGo/SOGoUserProfile.m +M UI/Common/WODirectAction+SOGo.h +M UI/Common/WODirectAction+SOGo.m +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Preferences/preferences-model.js + +commit e8acb225e47ee10e2f001f1575248b0e522dadc6 +Author: Francis Lachapelle +Date: Thu Apr 9 15:17:06 2015 -0400 + + Add md-grid-list and md-autocomplete components + +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +A UI/WebServerResources/scss/components/autocomplete/_extends.scss +A UI/WebServerResources/scss/components/autocomplete/autocomplete.scss +A UI/WebServerResources/scss/components/gridList/_extends.scss +A UI/WebServerResources/scss/components/gridList/gridList.scss +M UI/WebServerResources/scss/styles.scss + +commit 6e36154b1b94ae5133132d7647544c89121363cb +Author: Ludovic Marcotte +Date: Thu Apr 9 14:46:54 2015 -0400 + + (fix) retagged properly for latest angular-material changes + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 8f47e62dd296c877a16e360abe4a3570cc9de273 +Author: Francis Lachapelle +Date: Wed Apr 8 16:01:52 2015 -0400 + + Calendar module: add month view + +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalMonthView.wox +M UI/WebServerResources/js/Appointments/component-model.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/SchedulerUI.js + +commit a2c469d46a151917d9f19280e3f390f74c5270c6 +Author: Ludovic Marcotte +Date: Wed Apr 8 14:19:31 2015 -0400 + + (fix) correctly handle PreventInvitationsWhitelist + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit 6f59955340a34863576fca2e851d2df4b5aca200 +Author: Ludovic Marcotte +Date: Wed Apr 8 13:33:54 2015 -0400 + + (fix) sanitize autoReplyEmailAddresses + +M UI/PreferencesUI/UIxPreferences.m + +commit 70e5b1d4aa5e35ba9d34519ba747acf7895ef565 +Author: Ludovic Marcotte +Date: Tue Apr 7 16:49:24 2015 -0400 + + (fix) pref template now looks like others + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit f2623471491a4069417518c1e03c5d9f565a9d74 +Author: Ludovic Marcotte +Date: Tue Apr 7 16:32:51 2015 -0400 + + (fix) more defaults values in the prefs + +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 7168779684bee99bea441dcbc5820ef042cebb14 +Author: Ludovic Marcotte +Date: Tue Apr 7 14:18:02 2015 -0400 + + (feat) added password change support + +M UI/MainUI/SOGoRootPage.m +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/SOGoAuthentication.js +M UI/WebServerResources/js/PreferencesUI.js + +commit d21715d8f1186e80fb55276b09c64f84b92f76f5 +Author: Ludovic Marcotte +Date: Tue Apr 7 09:01:33 2015 -0400 + + (fix) right localized string + one for account locked + +M UI/WebServerResources/js/Common/SOGoAuthentication.js + +commit 1fe5e392543f219d309273aa865a5ececc6d6a9a +Author: Ludovic Marcotte +Date: Mon Apr 6 10:55:42 2015 -0400 + + Default value for short date format + +M UI/PreferencesUI/UIxJSONPreferences.m + +commit 023362797b9fd9287824baf318f27095ce882d99 +Author: Ludovic Marcotte +Date: Mon Apr 6 08:51:16 2015 -0400 + + Icons and flexbox additions to the guide + +M Documentation/SOGoDevelopersGuide.asciidoc + +commit 772a6826551f1e0b36b3c9fa90f7824d93f72a3a +Author: Ludovic Marcotte +Date: Fri Apr 3 17:37:46 2015 -0400 + + (fix) correctly localize mail labels from common bundle + +M SoObjects/Mailer/SOGoMailLabel.h +M SoObjects/Mailer/SOGoMailLabel.m +M UI/Common/WODirectAction+SOGo.h +M UI/Common/WODirectAction+SOGo.m +M UI/PreferencesUI/UIxJSONPreferences.m + +commit 4252b66b6e56bb55f77fff308c70f80d1ecfddc1 +Author: Francis Lachapelle +Date: Fri Apr 3 11:41:11 2015 -0400 + + Initial SOGo developer's guide + +A Documentation/SOGoDevelopersGuide.asciidoc + +commit 91acb9d0c56536170d1c6bb73d2d0b89bb8fba63 +Author: Francis Lachapelle +Date: Fri Apr 3 11:34:05 2015 -0400 + + Integrate UIxSidenavToolbarTemplate in all modules + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/UIxSidenavToolbarTemplate.wox + +commit 171b5085abf294813e142d2d0c667175516664ca +Author: Francis Lachapelle +Date: Thu Apr 2 16:13:02 2015 -0400 + + Fix GNUmakefile for latest underscore package + +M UI/WebServerResources/GNUmakefile + +commit c38a23d9b1dd18b0b133fee6946884c7c29a615f +Author: Benoit Favreault +Date: Thu Apr 2 10:07:57 2015 -0400 + + Hot-fix for build problem + +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss + +commit 92ecdd52adc4e4c645f04fef5ef85d4c847ed8eb +Author: Benoit Favreault +Date: Thu Apr 2 09:51:48 2015 -0400 + + Hot-fix for build problem (commit/74dda0206595acb1c48f7d328fd96b64025542bb) + +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/core/reset.scss + +commit 8b093f900184754a7f231d5db388969b2e9ed92e +Author: Ludovic Marcotte +Date: Thu Apr 2 06:47:32 2015 -0400 + + (fix) broken template, additional closing tag + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox + +commit 5797e70358d1a7eafcfd259ce6e194780b4e4cda +Author: Benoit Favreault +Date: Thu Apr 2 02:58:37 2015 -0400 + + Made bottom sheet opaque + +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss + +commit a75719e1515d78d671cc702ac04f10ab43cbc76e +Author: Benoit Favreault +Date: Thu Apr 2 02:53:21 2015 -0400 + + Fix fab-button positionning + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/views/_view.scss + +commit a5c9f41375e547a9b4dd02f14ae4f0dbfcd6f9ee +Author: Benoit Favreault +Date: Thu Apr 2 00:59:06 2015 -0400 + + Fixed "fantom account" + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/core/typography.scss + +commit 00d2154c0e8d1ab6326329f8490a7e8317eddd75 +Author: Benoit Favreault +Date: Wed Apr 1 22:12:07 2015 -0400 + + fix card background color (angular-material regression) + Change views container justification + hide sg-menu components + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/card/card.scss + +commit 0fc027e5e922b5b5d59ae39c06f76ef5a9d108f6 +Author: Francis Lachapelle +Date: Wed Apr 1 20:20:22 2015 -0400 + + Set the doctype to HTML5 + +M UI/Common/UIxPageFrame.m + +commit 5f7abec980a1c5d62a7eaa35c8a9ec441de029fb +Author: Francis Lachapelle +Date: Wed Apr 1 20:19:52 2015 -0400 + + Gruntfile.js: add postcss:dist to build task + +M UI/WebServerResources/Gruntfile.js + +commit 6c4a82571ce54207973855c9a19244d9590ad415 +Author: Francis Lachapelle +Date: Wed Apr 1 11:18:19 2015 -0400 + + Calendar module: add day view + +M UI/Templates/SchedulerUI/UIxCalDayView.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/WebServerResources/js/Appointments/component-model.js +M UI/WebServerResources/js/SchedulerUI.js +M UI/WebServerResources/scss/views/SchedulerUI.scss + +commit 7ef01304ee326dd64e812eaec8b528bead6720c9 +Author: Francis Lachapelle +Date: Wed Apr 1 09:52:16 2015 -0400 + + Add debounce to sgSearch Angular directive + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 8d66f62cad73bf6095e9ea585d913a45ace4cb07 +Author: Francis Lachapelle +Date: Wed Apr 1 08:51:48 2015 -0400 + + [fix] JS syntax error on login page + +M UI/SOGoUI/UIxComponent.m + +commit eaeae77be4f1ebd5cae5027ce37e8d8a764f4373 +Author: Benoit Favreault +Date: Tue Mar 31 18:33:14 2015 -0400 + + Fix (tried to) regressions introduced by angular-material update + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 1477bd6eae6c3247180cb198465e860fe4895a11 +Author: Benoit Favreault +Date: Tue Mar 31 13:17:37 2015 -0400 + + Regression fixes + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/sidenav/_extends.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/core/structure.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit fe8c1b927cd1599513cfe7ccfe331f917be77b9e +Author: Benoit Favreault +Date: Tue Mar 31 10:50:05 2015 -0400 + + Fix mobile transitions (sort of) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/styles.scss + +commit a554158686054fa7e5457e5a5a75c1b9b9c493eb +Author: Benoit Favreault +Date: Tue Mar 31 10:50:05 2015 -0400 + + Fix mobile transitions (sort of) + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/icon/_extends.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/views/_view.scss + +commit f6cb8f226ab23ba16b9690e6e564598de2920259 +Author: Benoit Favreault +Date: Sun Mar 29 23:22:12 2015 -0400 + + Edit scss-lint to prevent false positive warnings + +M UI/WebServerResources/scss/.scss-lint.yml + +commit 5224a7b3041c763c619547306d395038da7aab2b +Author: Benoit Favreault +Date: Sun Mar 29 23:21:14 2015 -0400 + + Fix fab-button positioning (still some strange corner-cases from md sources) + +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/views/_view.scss + +commit b5bea16abb5a124f042bc86cd5628da11d08aea7 +Author: Benoit Favreault +Date: Sun Mar 29 06:16:32 2015 -0400 + + Add sassyJSON library + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/package.json +M UI/WebServerResources/scss/styles.scss + +commit 3441a66040ddf1a15b27a183d4bebc6a222ca767 +Author: Benoit Favreault +Date: Sat Mar 28 01:24:31 2015 -0400 + + Add paper texture to toolbar and sidenav + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +A UI/WebServerResources/img/cardboard-transp.png +A UI/WebServerResources/img/felt-transp.png +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/_view.scss + +commit e69c47854ad95812c038ed086c5392f354dff17e +Author: Benoit Favreault +Date: Fri Mar 27 21:13:39 2015 -0400 + + Fine-tune layout + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 2c8d1b5db772105795ce1b5501514f6e06ed3f8a +Author: Benoit Favreault +Date: Fri Mar 27 17:08:53 2015 -0400 + + Alternate mobile transitions + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 2446677172d1f5019d85c988a0f1da3e12a99cd1 +Author: Francis Lachapelle +Date: Tue Mar 31 10:55:13 2015 -0400 + + [fix] Add definition of UIxSidenavToolbarTemplate + +M UI/Common/UIxPageFrame.m + +commit abe9a85c4fcb0019abab7f92a988fe31fa0a7159 +Author: Francis Lachapelle +Date: Mon Mar 30 21:20:35 2015 -0400 + + SOGo.SchedulerUI AngularJS module + +A UI/WebServerResources/js/SchedulerUI.js + +commit a57bf56165fbf0b6cb372ae8e3be3bbb6cb1e69c +Author: Francis Lachapelle +Date: Mon Mar 30 21:18:09 2015 -0400 + + [fix] Possible exception in UIxCalendarSelector.m + +M UI/Scheduler/UIxCalendarSelector.m + +commit 9a1c2b6a114dee0f594dc10f29ba408283a6b653 +Author: Francis Lachapelle +Date: Mon Mar 30 17:38:41 2015 -0400 + + New ng directives for Calendar module + + - sgCalendarDayTable + - sgCalendarDayBlock + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 4b47e5de83163e9c9bf38b7d2e20c1859c54d210 +Author: Francis Lachapelle +Date: Mon Mar 30 15:11:20 2015 -0400 + + Calendar module: initial AngularJS-based templates + +M UI/Templates/SchedulerUI/UIxCalDayTable.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalWeekView.wox +M UI/Templates/SchedulerUI/UIxCalendarSelector.wox +A UI/Templates/UIxSidenavToolbarTemplate.wox +M UI/WebServerResources/scss/components/checkbox/checkbox.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +A UI/WebServerResources/scss/views/SchedulerUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 22c9b61246e05b518089dbb6e116104038747802 +Author: Francis Lachapelle +Date: Mon Mar 30 14:16:17 2015 -0400 + + Extend String and Date native JS objects + +M UI/WebServerResources/js/Common/utils.js + +commit e9db6cda614c7569dcbab07553902d0d02a621f8 +Author: Francis Lachapelle +Date: Mon Mar 30 14:14:13 2015 -0400 + + UIxCalListingActions: improve style and syntax + +M UI/Scheduler/UIxCalListingActions.m + +commit 44c49abbecbe18e17471c9d6e5c4e0141e23a4b1 +Author: Francis Lachapelle +Date: Mon Mar 30 14:03:28 2015 -0400 + + Calendar list: use 'name' instead of 'displayName' + +M UI/Scheduler/UIxCalendarSelector.m + +commit 8b6a3d0e3fa3adc96d72406f952b24f581909260 +Author: Francis Lachapelle +Date: Mon Mar 30 13:52:26 2015 -0400 + + Initial JavaScript models for calendar module + +A UI/WebServerResources/js/Appointments/calendar-model.js +A UI/WebServerResources/js/Appointments/component-model.js + +commit d72f83ee957560775db3d5925492918ab0bd429f +Author: Francis Lachapelle +Date: Mon Mar 30 13:33:53 2015 -0400 + + Save calendar: use 'name' instead of 'displayName' + +M UI/Scheduler/UIxCalendarProperties.m + +commit ba35bc801f0f925143311a3ec30bb534a5744079 +Author: Benoit Favreault +Date: Fri Mar 27 21:35:30 2015 -0400 + + Add a grunt task target postcss:dev (no minification) + +M UI/WebServerResources/Gruntfile.js + +commit 10a017503e7d42afb59965bd9b0b592403df1ebb +Author: Ludovic Marcotte +Date: Fri Mar 27 19:03:58 2015 -0400 + + Now enforce SOGoMailCustomFromEnabled + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/PreferencesUI.js + +commit bb1977fa931e4444d795485ed3161a6b3514792d +Author: Ludovic Marcotte +Date: Fri Mar 27 15:33:58 2015 -0400 + + Wiped unused scss file + +D UI/WebServerResources/scss/PreferencesUI.scss + +commit cf4593917f23ef5ae9155e144802b8dcafea550f +Author: Ludovic Marcotte +Date: Fri Mar 27 15:33:44 2015 -0400 + + More form validation + +M UI/PreferencesUI/UIxAccountEditor.m +M UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/WebServerResources/js/PreferencesUI.js + +commit ae2990d8d67da0e9c555c56b4d4cf0936ab87d89 +Author: Francis Lachapelle +Date: Fri Mar 27 10:27:06 2015 -0400 + + Review core scss following ng-material changes + +M UI/WebServerResources/angular-material +A UI/WebServerResources/scss/core/typography.scss +D UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 05e58b30cca6d58c86f0893f2b1d061b449a585b +Author: Benoit Favreault +Date: Thu Mar 26 14:39:44 2015 -0400 + + Replace mobile detail-view transitions + Minor adjustments to layout + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/css/ng-tags-input.bootstrap.css +M UI/WebServerResources/css/ng-tags-input.bootstrap.min.css +M UI/WebServerResources/css/ng-tags-input.css +M UI/WebServerResources/css/ng-tags-input.min.css +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 2bc44dec9b6fc150eefa4a40f303af4121e4a0a1 +Author: Ludovic Marcotte +Date: Thu Mar 26 13:37:44 2015 -0400 + + Improved preferences module (save/load, checks on enabled modules, etc.) + +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 48b74b0f6b56bd0ab8eb6c4722f2fe47b5c27f46 +Author: Benoit Favreault +Date: Thu Mar 26 09:58:09 2015 -0400 + + Add responsiveness (First draft) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/.scss-lint.yml +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 516e5fd303c5f8d9823706f49ab774daeb6939a4 +Author: Francis Lachapelle +Date: Thu Mar 26 08:52:48 2015 -0400 + + Add current date in top bar + +M SoObjects/SOGo/SOGoUser.h +M SoObjects/SOGo/SOGoUser.m +M UI/MainUI/SOGoUserHomePage.m +M UI/MainUI/product.plist +M UI/SOGoUI/UIxComponent.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js + +commit 0241cacbf9c047afb4e091ce8d641db2eef9208a +Author: Ludovic Marcotte +Date: Thu Mar 26 08:50:30 2015 -0400 + + Added some data validation + +M UI/Templates/PreferencesUI/UIxAccountEditor.wox + +commit 78da72f3cb5db3879ae6ebf35d0eb0d0dc03ac6e +Author: Benoit Favreault +Date: Wed Mar 25 17:00:53 2015 -0400 + + Replace specific list-view by generic (class-based) view + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 660af9abfd2a6a3bfe9d657c72a433cadc7b58b0 +Author: Benoit Favreault +Date: Wed Mar 25 16:50:36 2015 -0400 + + Amend previous: + Add a view-detail class (for more generic use) + Fix the regression (scroll) problem on contact editor + +M UI/WebServerResources/scss/views/ContactsUI.scss + +commit b4f2b470dcd713341668abc306d375678ee1be4a +Author: Benoit Favreault +Date: Wed Mar 25 16:46:55 2015 -0400 + + Add a scss-lint config file + +A UI/WebServerResources/scss/.scss-lint.yml + +commit f99dae331d820e184cb6c13cac473243ef64faf2 +Author: Benoit Favreault +Date: Wed Mar 25 16:46:06 2015 -0400 + + Add a view-detail class (for more generic use) + Fix the regression (scroll) problem on contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 655fe5f731dc16cccb56f78817e78821e7950d2f +Author: Benoit Favreault +Date: Wed Mar 25 14:38:23 2015 -0400 + + Fix regression on Contact editor + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 72968f2e6e2580395af7fee08720c5ee3295c392 +Author: Francis Lachapelle +Date: Tue Mar 24 10:28:01 2015 -0400 + + Indentation of Gruntfile.js + +M UI/WebServerResources/Gruntfile.js + +commit 0f2e3df16439ef8bb3e1c4ef2ef3ee6c525f82af +Author: Ludovic Marcotte +Date: Tue Mar 24 10:44:50 2015 -0400 + + More cleanups, defaults values for mail/contact/calendar labels and data validation + +M SoObjects/Mailer/SOGoMailLabel.h +M SoObjects/Mailer/SOGoMailLabel.m +M SoObjects/SOGo/SOGoSQLUserProfile.h +M SoObjects/SOGo/SOGoSQLUserProfile.m +M SoObjects/SOGo/SOGoUserDefaults.h +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/PreferencesUI/UIxPreferences.m + +commit 818af41ea61fc429df169987bf7f7dd4caa625d5 +Author: Benoit Favreault +Date: Tue Mar 24 04:04:59 2015 -0400 + + Add breakpoints management librairies + Add grunt-contrib-compass (required) + Edit gruntfile.js (add compass tasks) + + --don't forget to update bower components + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/package.json +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 6153e88f62a62e988ff38fb008b6dbae625d7d65 +Author: Benoit Favreault +Date: Mon Mar 23 10:53:17 2015 -0400 + + Add animation params + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 6636fe3625f1547f643851e6d2c32dc63100d599 +Author: Ludovic Marcotte +Date: Sun Mar 22 08:00:21 2015 -0400 + + Disabled lots of unused code (to be removed) in v3/prefs + +M UI/PreferencesUI/UIxPreferences.h +M UI/PreferencesUI/UIxPreferences.m + +commit 96d2a4cea8b40255b86905ad8188a3b8bd7042fd +Author: Ludovic Marcotte +Date: Sat Mar 21 15:34:18 2015 -0400 + + Preferences saving support + +M SoObjects/SOGo/SOGoDefaultsSource.h +M SoObjects/SOGo/SOGoDefaultsSource.m +M SoObjects/SOGo/SOGoUserDefaults.m +M UI/PreferencesUI/UIxPreferences.h +M UI/PreferencesUI/UIxPreferences.m +M UI/WebServerResources/js/Preferences/preferences-model.js + +commit 2edfd1863b8ab1ca456bb99be6a147fa2694ba0d +Author: Francis Lachapelle +Date: Fri Mar 20 13:30:46 2015 -0400 + + Addressbook module: improve routing views handling + +M UI/WebServerResources/js/ContactsUI.js + +commit 766c421b53369b39a3cc5efefd094d886d07dd23 +Author: Benoit Favreault +Date: Fri Mar 20 11:20:39 2015 -0400 + + Remove margin from date in msg list + +M UI/WebServerResources/scss/views/MailerUI.scss + +commit f909fe657fa6412a669a85ca0efb3bd7cc9549bd +Author: Francis Lachapelle +Date: Fri Mar 20 13:05:53 2015 -0400 + + Webmail: fix cancel button of message editor + +M UI/WebServerResources/js/MailerUI.js + +commit 885140c92a305fd0402eb654837342f6f74d4df3 +Author: Francis Lachapelle +Date: Fri Mar 20 12:47:58 2015 -0400 + + Addressbook module: fix edit button + +M UI/WebServerResources/js/ContactsUI.js + +commit 6bf22795f36ccc639c217e457e72fdfb87d3a71c +Author: Francis Lachapelle +Date: Fri Mar 20 11:32:56 2015 -0400 + + Improve bower.json + +M UI/WebServerResources/bower.json + +commit 386426478705b6a2db7371d0cd3df8908ae653fb +Author: Francis Lachapelle +Date: Fri Mar 20 11:31:50 2015 -0400 + + JS Card model: initialize birthday as Date object + +M UI/WebServerResources/js/Contacts/card-model.js + +commit a3aaf36477fc07b2f7fa638cf94e314ba9e0e794 +Author: Francis Lachapelle +Date: Fri Mar 20 11:31:08 2015 -0400 + + Contact editor: remove extra bottom padding + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit 4f6babcdccb0dbc8ac099f71705365259f46f4bf +Author: Francis Lachapelle +Date: Fri Mar 20 11:16:24 2015 -0400 + + Add cancel button to Webmail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/MailerUI.js + +commit 56763e1aca2505e5b15daee7904cdd7376ba8d75 +Author: Ludovic Marcotte +Date: Fri Mar 20 10:35:15 2015 -0400 + + Removed dead code, support for adding calendar categories, disabled unused tab + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/angular-material +M UI/WebServerResources/js/PreferencesUI.js + +commit a7875219770cb055527626a5f4292a88e5ddffd2 +Author: Francis Lachapelle +Date: Thu Mar 19 14:18:41 2015 -0400 + + Restore md-button in sgSearch directive + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit ca1831271b6f52e16e4b22cd0924437b8c6d7d82 +Author: Benoit Favreault +Date: Thu Mar 19 05:45:42 2015 -0400 + + Make iconButton round to display a more elegant ripple-effect + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss + +commit d6a294b89fb49a443c24ef00ae9e2553185b6727 +Author: Benoit Favreault +Date: Thu Mar 19 03:40:46 2015 -0400 + + Fix breakpoints in scss and js (in await for a more elegant solution) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Common/ui.js +D UI/WebServerResources/scss/app.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 6b1fe301a652cacf0b5bef0b708177c5886b4421 +Author: Francis Lachapelle +Date: Thu Mar 19 10:30:18 2015 -0400 + + Fix mail search criteria + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit 8d003a7c35c7b1794b13f76c838bf923f4b1fe8c +Author: Francis Lachapelle +Date: Wed Mar 18 15:00:46 2015 -0400 + + Return used space of quota as a number in JSON + +M SoObjects/Mailer/SOGoMailAccount.m + +commit db9e3a54018c6e9ea9864eeb1f629e1e43507442 +Author: Francis Lachapelle +Date: Wed Mar 18 14:59:06 2015 -0400 + + Use sgSearch directive in Webmail module + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 01d4134a23b55262ad92ded9a1e2587c07b86ab4 +Author: Francis Lachapelle +Date: Wed Mar 18 14:19:17 2015 -0400 + + Use sgSearch directive in addressbook module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit 44164c0f43ae6981edac06ecd2963756d9568842 +Author: Francis Lachapelle +Date: Wed Mar 18 14:03:55 2015 -0400 + + Improve and document Webmail search options + +M UI/MailerUI/UIxMailListActions.m + +commit 68eec08de6246c08540a47aeb6ff9541a44e6c81 +Author: Francis Lachapelle +Date: Wed Mar 18 13:55:36 2015 -0400 + + New sgSearch Angular directive + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 0e3cbe8c985892e2e98f5b0cd4bf00b30f37d724 +Author: Francis Lachapelle +Date: Wed Mar 18 13:41:14 2015 -0400 + + Improve "load images" button from Webmail + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 4ab4ac0f11c2affd6b9f52c8141f8a21e174c399 +Author: Benoit Favreault +Date: Tue Mar 17 01:21:41 2015 -0400 + + Fix card.view template to prevent useless element () injection + +M UI/WebServerResources/js/ContactsUI.js + +commit 8cebc00f7a41e4b7a4701432ec84da0ad19cf0cd +Author: Benoit Favreault +Date: Mon Mar 16 22:00:45 2015 -0400 + + Polish UI (Contact and Mail) + - Unifiy & simplify markup + - Add visual consistency + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit 01f1cbbd753fb3984ee116ed8a78ed4110a1f3da +Author: Benoit Favreault +Date: Mon Mar 16 20:18:16 2015 -0400 + + Fix minor deprecations in Preferences template + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 6a304b3e07a54326d06ba349604507197666bb84 +Author: Benoit Favreault +Date: Mon Mar 16 17:43:58 2015 -0400 + + Fix sidenav icon-button + +M UI/WebServerResources/scss/components/button/_button.scss + +commit 5b674abcf1133cb5321603424edc261b29725c25 +Author: Ludovic Marcotte +Date: Mon Mar 16 11:53:50 2015 -0400 + + Fixed preferences module wrt recent changes + +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit e756053f8b9091c65e68f7697ce8a34c24af016f +Author: Benoit Favreault +Date: Fri Mar 13 20:35:27 2015 -0400 + + Replace bottom-bar by bottom-sheet + Adjust sidenav layout + Unify background colors + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit 69d0a3ad57177e790ecd5343d4bdbbe91d7c146f +Author: Benoit Favreault +Date: Fri Mar 13 13:37:32 2015 -0400 + + Minor adjustment to toolbar date + +M UI/WebServerResources/scss/core/typography/typography.scss + +commit a57713523b7ad6adfc340fba55f84f8c0d7d868f +Author: Benoit Favreault +Date: Fri Mar 13 02:10:31 2015 -0400 + + Finish the toolbars + Add an app button on sidenav + Add a logout select on sidenav + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography/typography.scss + +commit 9fc713dc5ffc20f07ea930f4316892d39e8dda97 +Author: Benoit Favreault +Date: Thu Mar 12 22:08:06 2015 -0400 + + Create a 'css' grunt task (sass + postcss) + +M UI/WebServerResources/Gruntfile.js + +commit 31bb97aaecd1aaee374c57e8a065736c6d4b016d +Author: Benoit Favreault +Date: Thu Mar 12 21:38:31 2015 -0400 + + Update angular-material [dc2d204] master + +M UI/WebServerResources/angular-material + +commit 1d8dbbfe2ce99a99fc9c03e2d42c30c3f210f04f +Author: Francis Lachapelle +Date: Mon Mar 9 16:22:32 2015 -0400 + + Restore compose mail button + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit fc72d3b12a663ae24c00ed5325f4e66022b43b05 +Author: Francis Lachapelle +Date: Mon Mar 9 16:21:31 2015 -0400 + + Cleanup references to ZURB Foundation + +M UI/Templates/UIxPageFrame.wox +D UI/WebServerResources/js/Common/ui-common.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/MailerUI.js + +commit bdbbc5be47fc8492bd0c8a32f8771fec77ffa657 +Author: iRouge +Date: Sun Mar 8 17:42:38 2015 -0400 + + Fix login window according to specs + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/scss/views/LoginUI.scss + +commit f1cdb3a472a379edd0aebe739693613cd064ffff +Author: Francis Lachapelle +Date: Mon Mar 9 14:09:26 2015 -0400 + + Cleanup dead code from js/Common/ui.js + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Common/ui.js + +commit fdb4cd71eba080d69729890e0c1a45c40ab1a5dd +Author: iRouge +Date: Sun Mar 8 17:09:20 2015 -0400 + + Fix sidenav toolbar (logo and buttons) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss + +commit 90cd79a21bda88599dde2f55d5bf6676bde2f9a3 +Author: iRouge +Date: Sat Mar 7 22:37:21 2015 -0500 + + Adjust Contact view (center card in right container) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/views/ContactsUI.scss + +commit 90c359779e150d7d256d3b74a5957844b1727734 +Author: iRouge +Date: Wed Mar 4 21:02:06 2015 -0500 + + Fix Contact editor layout + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit 0cd4688e640a464e7986e76687ee1e77a54e598d +Author: iRouge +Date: Wed Mar 4 13:23:22 2015 -0500 + + Update material-angular (release 0.8.3) + +M UI/WebServerResources/angular-material + +commit 9c42350caa34bc0a44f71a26e2d046a37eca2fe0 +Author: iRouge +Date: Tue Mar 3 23:47:41 2015 -0500 + + Add aria-label to iconButtons + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit 1ac49415d17018ff1182fc0ef12f1ca9c07aed5d +Author: iRouge +Date: Tue Mar 3 23:31:39 2015 -0500 + + Remove (useless) "close" button on sidenav + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit bed46ba2eb2fa34ff5ede7f35d459cf472947e4e +Author: iRouge +Date: Tue Mar 3 23:26:57 2015 -0500 + + Correct sources to prevent angular.js deprecation Warning + Correct scss to prevent 404 server response + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/core/typography/typography.scss + +commit 02cdc869be711f7b2df907ab97efc349434a8f73 +Author: iRouge +Date: Tue Mar 3 18:40:48 2015 -0500 + + Apply iconButton to Contact and Mail + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss + +commit 4264d054ca94968cbb320aa64b040e6ad75782cd +Author: iRouge +Date: Tue Mar 3 13:33:22 2015 -0500 + + Create Sass component: iconButton + +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss + +commit b6f83f327520198d211b0b5e37f71ca4db8d8f5b +Author: iRouge +Date: Tue Mar 3 13:30:52 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 1fc846bf5c6d62a2f819fc38b2fed139c7cf635c +Author: iRouge +Date: Mon Mar 2 17:05:39 2015 -0500 + + Update angular-material + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/angular-material +M UI/WebServerResources/scss/core/typography/typography.scss + +commit 2d2edabb188cc1b3c2cd27e3718c504e74c6f47d +Author: iRouge +Date: Fri Feb 27 16:37:20 2015 -0500 + + Add action "create new contact" to button + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit dcfa43ab287b7735cc914ed01376b6695086e5b6 +Author: iRouge +Date: Fri Feb 27 16:14:15 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit b0d7fff56ae1cd157e4d8c36e0b2ea7e5b3f0da9 +Author: iRouge +Date: Fri Feb 27 16:11:59 2015 -0500 + + Add Selected-state to lists elements (Contacts and Messages) -- Amend previous + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit be4d56b7e19c3bb7a872f48ff82daa0537c2fc43 +Author: iRouge +Date: Fri Feb 27 15:26:18 2015 -0500 + + Add Selected-state to lists elements (Contacts and Messages) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit fefd4fc7c75fb946f6b09ff51b659cbc43806de4 +Author: Francis Lachapelle +Date: Fri Feb 27 08:17:17 2015 -0500 + + Fix md-select + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit 855acccd6d6ac6c732c88ad2e120bc7452b9e47f +Author: iRouge +Date: Thu Feb 26 22:34:19 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 80d6c0226a65841ce304c822d26aec576e578b39 +Author: iRouge +Date: Thu Feb 26 22:32:22 2015 -0500 + + Adjust UI for Contact, Contact editor, Messages and Message editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 15dab4dfe5b502adfce167f146c77672303d1cb6 +Author: Francis Lachapelle +Date: Thu Feb 26 13:52:11 2015 -0500 + + Add placeholder to type selects of contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit dbb08a762a9d92e703c925038d4e4505d70dcc36 +Author: Francis Lachapelle +Date: Thu Feb 26 11:37:46 2015 -0500 + + Fix "add" buttons of contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit af144585a567cb994323c0c71996cf68dae465fe +Author: Francis Lachapelle +Date: Thu Feb 26 11:27:36 2015 -0500 + + Cleanup formatting of attributes in HTML templates + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/UIxPageFrame.wox + +commit 6a25ccfe964bb0b9384dd26cb906726f05450a35 +Author: Francis Lachapelle +Date: Thu Feb 26 10:58:17 2015 -0500 + + Remove data- prefix in attributes of HTML tags + +M UI/Templates/AdministrationUI/UIxAdministrationFilterPanel.wox +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/ContactsUI/UIxContactsFilterPanel.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailFilterPanel.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailUserRightsEditor.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/Templates/SchedulerUI/UIxCalDayTable.wox +M UI/Templates/SchedulerUI/UIxCalFilterPanel.wox +M UI/Templates/SchedulerUI/UIxCalMainView.wox +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox +M UI/Templates/SchedulerUI/UIxCalendarSelector.wox +M UI/Templates/SchedulerUI/UIxDatePicker.wox +M UI/Templates/Themes/mobile/CommonUI/UIxPageFrame.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +M UI/Templates/Themes/mobile/MainUI/SOGoRootPage.wox +M UI/Templates/UIxAclEditor.wox +M UI/Templates/UIxPageFrame.wox + +commit dd84782427fad5f6b080caf381899dd351282156 +Author: Francis Lachapelle +Date: Thu Feb 26 10:45:56 2015 -0500 + + Cleanup .gitignore + +M .gitignore + +commit 012d953d65945f393a2fd2c1f5561b00cac8959b +Author: iRouge +Date: Thu Feb 26 00:39:18 2015 -0500 + + Add an input-container to search field in Contact toolbar + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss + +commit 5819cc75d3c35f176528d6bb7f1bb776f93bdb4f +Author: iRouge +Date: Wed Feb 25 23:44:22 2015 -0500 + + Style Contact Editor UI: Ready to test + Some functional bugs remaining + +M .gitignore +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/scss/components/select/select.scss + +commit 5c3f0138f55fb5403a2e09f7d99914a52d29ab38 +Author: Ludovic Marcotte +Date: Wed Feb 25 17:21:07 2015 -0500 + + First pass at the v3 pref module + + The UI needs to be styled. We also need to properly load "default" + values from the system/domain/user defaults and save them correctly + too. + +M UI/Common/UIxPageFrame.m +M UI/PreferencesUI/GNUmakefile +A UI/PreferencesUI/UIxAccountEditor.m +M UI/PreferencesUI/UIxFilterEditor.m +M UI/PreferencesUI/UIxJSONPreferences.h +M UI/PreferencesUI/UIxJSONPreferences.m +M UI/PreferencesUI/UIxPreferences.m +M UI/PreferencesUI/product.plist +A UI/Templates/PreferencesUI/UIxAccountEditor.wox +M UI/Templates/PreferencesUI/UIxFilterEditor.wox +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/js/Mailer/mailbox-model.js +A UI/WebServerResources/js/Preferences/preferences-model.js +A UI/WebServerResources/js/PreferencesUI.js +A UI/WebServerResources/scss/PreferencesUI.scss + +commit 575676deb862f952c404a6351617feac8e336cbc +Author: Francis Lachapelle +Date: Wed Feb 25 15:57:49 2015 -0500 + + Add search field in AddressBook module + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 4b9eb44790c26c9c42f0411552e861bc7770d76d +Author: Francis Lachapelle +Date: Wed Feb 25 15:06:14 2015 -0500 + + Initial integration of md-select in contact editor + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit dc538f969e8ab75db118a10d5d43279d2da41447 +Author: Francis Lachapelle +Date: Wed Feb 25 14:02:52 2015 -0500 + + Cleanup dependencies in bower.json + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit e32f6d3086d4542883d5f2d7537e17df5742595b +Author: iRouge +Date: Wed Feb 25 13:57:07 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 4bce4ff988d72b5e68f5863ee41c814aefa35a68 +Author: Francis Lachapelle +Date: Wed Feb 25 12:54:02 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit fe071a5435a2500a7a162538d38d818578e98b01 +Author: iRouge +Date: Tue Feb 24 23:02:13 2015 -0500 + + Style contact editor (email addresses with select) + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit 6b58f3a08090eb570a6c2ed87cce6149313b7fe6 +Author: iRouge +Date: Tue Feb 24 19:40:57 2015 -0500 + + Style contact editor (model for add and remove) + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss +M UI/WebServerResources/scss/core/layout.scss + +commit 1d61e33a51872b1dbecf98d5795d8c8b9b3187f8 +Author: iRouge +Date: Tue Feb 24 11:30:17 2015 -0500 + + Update angular-material (select are fixed !) + +M UI/WebServerResources/angular-material + +commit 79dc49b905b5a8c15c00e3a52564d47e6dcb078d +Author: iRouge +Date: Tue Feb 24 00:00:59 2015 -0500 + + Style contact editor layout (needs more work) + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss + +commit b81f98236cbc35fdf173d972c8d61c20ea32ade8 +Author: iRouge +Date: Mon Feb 23 21:33:47 2015 -0500 + + Style contact-view layout + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/divider/divider.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography/typography.scss + +commit b7adf2814d80abd7e18ddca98ddc5d18aa7a29ec +Author: iRouge +Date: Mon Feb 23 16:54:06 2015 -0500 + + Refactor: + - use lowercase and hyphen name for new component according to Sass Guidelines + - change every uses by hand (thanks to my stupid IDE WebStorm) + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss + +commit 5980f8e90ec61755df240ed9247074779cb77d7f +Author: iRouge +Date: Mon Feb 23 16:37:05 2015 -0500 + + Create new Sass component: pseudo-input + +M .gitignore +A UI/WebServerResources/scss/components/pseudo-input/pseudo-input-theme.scss +A UI/WebServerResources/scss/components/pseudo-input/pseudo-input.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit cfed9c205860b92f7d388658aad2e7d8202127d2 +Author: iRouge +Date: Mon Feb 23 12:30:48 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 16440998dee56baf396098c86df846ccc58087a5 +Author: iRouge +Date: Mon Feb 23 12:26:39 2015 -0500 + + Fix Messages editor: + - textarea field + - labels and placeholders color + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit 1264dbad73710aca23d031dec94e0e7e52ec3f30 +Author: iRouge +Date: Sun Feb 22 16:50:03 2015 -0500 + + Skin Contact editor according to Material Design specs (still buggy) + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/scss/views/ContactsUI.scss + +commit 3fb8a42856915c9a424b4b3a4ccdd7ee1c51c417 +Author: iRouge +Date: Sun Feb 22 16:48:27 2015 -0500 + + Fix login layout ;-) (md-select are still buggy) + +M UI/Templates/MainUI/SOGoRootPage.wox +A UI/WebServerResources/scss/views/LoginUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 4a4658e29d87c03008d29b50c5f426a41c3792af +Author: Francis Lachapelle +Date: Fri Feb 20 13:51:46 2015 -0500 + + Add missing npm modules for grunt postcss + +M UI/WebServerResources/package.json + +commit 7ff934a5cbf142f444c880dab36de4e67938dc64 +Author: Francis Lachapelle +Date: Fri Feb 20 13:50:47 2015 -0500 + + Remove dependency of hammer.js + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js + +commit 6d4147fa34b4da7dd5712b4dc95f4a13443a8879 +Author: Ludovic Marcotte +Date: Thu Feb 19 23:41:11 2015 -0500 + + fixed templates + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit b2c71ceae93a3629def688166dce1d0cd22b0406 +Author: iRouge +Date: Thu Feb 19 23:17:50 2015 -0500 + + Add box-shadow to Mail editor + +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit 4185cc37feffcf7c4e7268cf0d63bf759638857e +Author: iRouge +Date: Thu Feb 19 22:05:53 2015 -0500 + + Style the plain-text Mail editor + Style Contacts + Style Contact editor (buggy) + Change postcss config + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/card/card.scss +M UI/WebServerResources/scss/components/input/input.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/views/ContactsUI.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 79a0a3684ce7a23849a3853d767f53e6f83c5907 +Author: Ludovic Marcotte +Date: Thu Feb 19 18:49:13 2015 -0500 + + Use md-select on the root page + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit dcd6c5fd5a9138d0c0c1cbbc63fe7611f44c791a +Author: Benoit Favreault +Date: Thu Feb 19 15:23:42 2015 -0500 + + Add autoprefixer and its dependancies (fix the buggy flex boxes in Safari and some older browsers) + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/package.json + +commit cc24b9b59956df81a34f96bcba4a62c4719acbe8 +Author: Francis Lachapelle +Date: Thu Feb 19 14:47:33 2015 -0500 + + Add md-select SASS component + +A UI/WebServerResources/scss/components/select/_extends.scss +A UI/WebServerResources/scss/components/select/select.scss +M UI/WebServerResources/scss/styles.scss + +commit 1569306ea04596bac77e574e3e138f53e7bed6b9 +Author: Francis Lachapelle +Date: Thu Feb 19 14:15:14 2015 -0500 + + Update angular-material subrepo + +M UI/WebServerResources/angular-material + +commit a1f0c9fd6e6db0947da981a85045a0726ff86d23 +Author: iRouge +Date: Thu Feb 19 08:57:15 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit da22cd854b718f98917996a52dcb92faf89e9f11 +Author: Francis Lachapelle +Date: Wed Feb 18 21:39:18 2015 -0500 + + Fix compilation of UIxTaskEditor.m + +M UI/Scheduler/UIxTaskEditor.m + +commit 94105e937a2c7371116b0bdaf111b669d3802c40 +Author: Francis Lachapelle +Date: Wed Feb 18 16:44:09 2015 -0500 + + Improve JSON getter/setter for todos + +M SOPE/NGCards/iCalToDo.h +M SOPE/NGCards/iCalToDo.m +M SoObjects/Appointments/iCalToDo+SOGo.m +M UI/Scheduler/UIxTaskEditor.h +M UI/Scheduler/UIxTaskEditor.m + +commit f47a22068f53f801ccefdb06ee6e565bb7a69236 +Author: Francis Lachapelle +Date: Wed Feb 18 16:36:37 2015 -0500 + + JSON: fix handling of dates of all-day events + +M SoObjects/Appointments/iCalEvent+SOGo.m +M UI/Scheduler/UIxAppointmentEditor.m + +commit 177c933af4ae532ba0ec6a74bb67bc934a22804f +Author: Francis Lachapelle +Date: Wed Feb 18 14:55:21 2015 -0500 + + Lowercase the status property of vEvent & vToDo + +M SoObjects/Appointments/iCalEntityObject+SOGo.m + +commit bbc5a2a0481c4fa985fd7090c11af7f398c08dc7 +Author: Francis Lachapelle +Date: Wed Feb 18 14:52:22 2015 -0500 + + Fix compilation warning of SOGoAppointmentObject.m + +M SoObjects/Appointments/SOGoAppointmentObject.m + +commit 48ffe8fb7ee6a8ab458c39b378082bbf3c3508ad +Author: Ludovic Marcotte +Date: Wed Feb 18 14:52:57 2015 -0500 + + Minor improvement to the template + +M UI/Templates/MainUI/SOGoRootPage.wox + +commit e3d4a7a373b7e6fd242c88c468e2939a16591a78 +Author: Ludovic Marcotte +Date: Wed Feb 18 14:42:27 2015 -0500 + + Deleted old CSS + +D UI/WebServerResources/css/SOGoRootPage.css + +commit 4ddf92aadb9ee2616d3e391557ef4eb076d63160 +Author: Francis Lachapelle +Date: Tue Feb 17 16:09:16 2015 -0500 + + JSON: Return ISO8601 dates in calendar components + +M SoObjects/Appointments/iCalEntityObject+SOGo.h +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M SoObjects/Appointments/iCalEvent+SOGo.m +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +M UI/Scheduler/UIxAppointmentEditor.m + +commit e226825bdea9d698752305b371daa1a4ebba66aa +Author: Francis Lachapelle +Date: Tue Feb 17 16:05:50 2015 -0500 + + Add [NSCalendarDate+SOGo iso8601DateString] + +M SoObjects/SOGo/NSCalendarDate+SOGo.h +M SoObjects/SOGo/NSCalendarDate+SOGo.m + +commit d8a816a3351c73dd7b12ddf44327b00cd2af7fe6 +Author: iRouge +Date: Mon Feb 16 02:15:01 2015 -0500 + + Add toolbars Icons (several bugs, some remaining) + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit b9e7e243445f94ed75ece2aa016838f3812679b4 +Author: Ludovic Marcotte +Date: Fri Feb 13 14:30:24 2015 -0500 + + Fixed remember login option + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/SOGoRootPage.js + +commit 23ce8904a958a9d209484bad3575977d2a90fd4b +Author: Francis Lachapelle +Date: Fri Feb 13 12:00:10 2015 -0500 + + Restore color transistion in sidenav.scss + +M UI/WebServerResources/scss/components/sidenav/sidenav.scss + +commit d1271799f4ec19d5d5953c2ebe8efa8e4048d3b3 +Author: Francis Lachapelle +Date: Fri Feb 13 11:57:19 2015 -0500 + + Update angular-material version in bower.json + +M UI/WebServerResources/bower.json + +commit e5726d2840c5699d48184e5695f962fce6d02f48 +Author: Ludovic Marcotte +Date: Fri Feb 13 09:14:10 2015 -0500 + + WiP - some improvements to the login form + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/SOGoRootPage.js + +commit fcd5abfafc0e748c0e5a5afc7a7d51f1fca61209 +Author: iRouge +Date: Thu Feb 12 16:08:15 2015 -0500 + + Update angular-material version 0.8.0-rc1 + +M UI/WebServerResources/angular-material + +commit 67c62fe85caa569a57099f1e0e84891540af2171 +Author: Francis Lachapelle +Date: Thu Feb 12 15:08:59 2015 -0500 + + Fix compilation of UIxComponentEditor.m + +M UI/Scheduler/UIxComponentEditor.m + +commit f9271b747c5f6150d1f490f45483e4c48d55e41e +Author: Francis Lachapelle +Date: Thu Feb 12 15:01:26 2015 -0500 + + Initial JSON actions to get/set an event + +M SoObjects/Appointments/iCalEntityObject+SOGo.h +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M SoObjects/Appointments/iCalEvent+SOGo.h +M SoObjects/Appointments/iCalEvent+SOGo.m +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +M SoObjects/Contacts/SOGoContactSourceFolder.m +M UI/Scheduler/UIxAppointmentEditor.h +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m + +commit f694f5763843f5e0c1426c5b9dfb60c2c3abf66c +Author: iRouge +Date: Thu Feb 12 12:37:05 2015 -0500 + + Minor tweaks to Mailer UI + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 522108bdd33a4e8e84c6028d149063bee1b7380f +Author: iRouge +Date: Thu Feb 12 04:20:42 2015 -0500 + + [Amend previous commit]Styled ngTags for Mail editor and propose a chip-like version of tags + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 780d757d6b9e1827879974f541901e2a9a693027 +Author: iRouge +Date: Thu Feb 12 03:55:46 2015 -0500 + + Styled ngTags for Mail editor and propose a chip-like version of tags + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/MessageEditorUI.scss + +commit df8b4e302f3e5771e88d2a1971b4bb866a88b5c4 +Author: iRouge +Date: Thu Feb 12 00:00:13 2015 -0500 + + Styled ngTags but no hasFocus state + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +A UI/WebServerResources/scss/components/ngTags/ng-tags-input.scss +M UI/WebServerResources/scss/styles.scss + +commit 1bb66bbf7d847be3486713fa328f7f4a53c14eab +Author: iRouge +Date: Wed Feb 11 21:54:06 2015 -0500 + + Skin the Mail editor except ng-tags + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/scss/core/typography/typography.scss +A UI/WebServerResources/scss/views/MessageEditorUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit a1299fea9702d719b20d3ca48877e6cc0cfe6319 +Author: iRouge +Date: Wed Feb 11 20:59:46 2015 -0500 + + Skin the Mail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 221e49a5d1f585f33415b2ba53bc806b5a20e3f2 +Author: Francis Lachapelle +Date: Tue Feb 10 21:15:56 2015 -0500 + + Improve [iCalTrigger asDictionary] + +M SOPE/NGCards/iCalTrigger.m +M SoObjects/Appointments/iCalEntityObject+SOGo.h + +commit d123b2d5d4d902e0cd7aa9102d460ae6f278c369 +Author: iRouge +Date: Wed Feb 11 04:47:08 2015 -0500 + + Change PseudoField-label font-weight + +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 4f2fc5c99e08e9e014f4a8095be56adda8065759 +Author: iRouge +Date: Wed Feb 11 04:04:09 2015 -0500 + + Fixed the message headers design (markup and scss) + Create a "PseudoField" component that mimics Material Design input fields + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +D UI/WebServerResources/css/styles.css +D UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit e429dc3ff1a20b4c73a41a1e9ca095b75e4763c6 +Author: Francis Lachapelle +Date: Tue Feb 10 16:07:22 2015 -0500 + + Add [iCalByDayMask initWithDaysAndOccurences:] + +M SOPE/NGCards/iCalByDayMask.h +M SOPE/NGCards/iCalByDayMask.m + +commit 9e7a051d25a3137a71820a1df835a87cd73c860e +Author: iRouge +Date: Tue Feb 10 15:29:45 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 75f38173c5925965e35591904565d7ffa42306b0 +Author: iRouge +Date: Tue Feb 10 03:17:10 2015 -0500 + + Adjust Messages header view + Add ngMaterial directives tomessage composer + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/angular-material +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 4cd6ffcaec882b911be2e6af806972418848cea7 +Author: Francis Lachapelle +Date: Mon Feb 9 09:48:58 2015 -0500 + + Messages list: add ng directives to icons + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox + +commit 12807457d40b5532413427ce6a23c70bea194f45 +Author: iRouge +Date: Sun Feb 8 19:35:21 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit aefb27fc5c59e1c77542a3b3335d0afea447fc2c +Author: Ludovic Marcotte +Date: Fri Feb 6 15:35:51 2015 -0500 + + Initial (and fugly) materialization of the login page + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/SOGoRootPage.js + +commit cd32bcf961956c9a62de7b0315c91947b75e56ed +Author: iRouge +Date: Fri Feb 6 09:37:00 2015 -0500 + + Fine-tune presentation of Mailer UI + - Colors + - Icons + - Dimmensions + - Typography + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/scss/_shame.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/button/_button.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/_functions.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 16f275af5252040fe6a1d95b34537e1e33f28a16 +Author: iRouge +Date: Thu Feb 5 21:10:45 2015 -0500 + + Add SOGo logo + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/img/sogo-compact.svg +A UI/WebServerResources/img/sogo-full.svg +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss + +commit 419f1bd698d909ef4970582c8c38af86c94860d3 +Author: iRouge +Date: Thu Feb 5 19:41:07 2015 -0500 + + Adjust containers width according to Google's specs + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/components/toolbar/_extends.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/views/MailerUI.scss + +commit e00416e1b8a8f271e682307574349cc77ccec510 +Author: iRouge +Date: Thu Feb 5 19:16:49 2015 -0500 + + Apply colours to components + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/components/content/content.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/core/_functions.scss +M UI/WebServerResources/scss/core/base_styles/_base_style.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit daaa4284cbb5be965adcd36b48c54c3fb172dbdc +Author: iRouge +Date: Thu Feb 5 15:53:20 2015 -0500 + + Add Sass version of SOGo's palettes, mixin to generate theme-class and a getter function for convenient access to colours trough any scss + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/_palette.scss +M UI/WebServerResources/scss/styles.scss + +commit 33e70cd3f3ba6809e878b2c2d33ac66545d3cc0c +Author: Francis Lachapelle +Date: Thu Feb 5 08:43:06 2015 -0500 + + Remove dependancy to angular-material.css + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/scss/styles.scss + +commit 44e56c92d0bf16efe1fe35eccf1b89427128ebac +Author: iRouge +Date: Wed Feb 4 16:44:42 2015 -0500 + + Update Angular-Material to 0.7.1 : HEAD origin/master origin/HEAD master + +M UI/WebServerResources/angular-material + +commit 6404536d196df61f9e94e493f6b0c7e34b114af5 +Author: iRouge +Date: Wed Feb 4 09:46:58 2015 -0500 + + Add md-colors module + +A UI/.gitignore +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js +A UI/WebServerResources/md-colors/README.md +A UI/WebServerResources/md-colors/colors.js +A UI/WebServerResources/md-colors/index.html +A UI/WebServerResources/md-colors/script.js + +commit e7b7e9cefed4419a89d2d4d0205912c214ed2645 +Author: iRouge +Date: Tue Feb 3 21:22:12 2015 -0500 + + Adjust z-indexes and box-shadows + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/_shame.scss +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/list/list.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/components/toolbar/_extends.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/styles.scss + +commit 174b6f365b0cc6c62b475fdcf82f2afad5603516 +Author: iRouge +Date: Tue Feb 3 16:03:36 2015 -0500 + + Typograpy : Messages list subheader + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 08a76aef973c11d565fac53c4b9c9d3c0b2cfb3d +Author: iRouge +Date: Tue Feb 3 13:34:44 2015 -0500 + + Adapt markup to typographic styles + - Mail Messages List + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/scss/_devtools.scss +A UI/WebServerResources/scss/components/list/_extends.scss +M UI/WebServerResources/scss/components/list/list.scss + +commit bd61c354f0653061ef7f106d96fe50ac23a9d57a +Author: Francis Lachapelle +Date: Tue Feb 3 11:37:51 2015 -0500 + + Fix references to font files in typography.scss + +M UI/WebServerResources/scss/core/typography/typography.scss + +commit 13144aad3b2faf6b9a4d4e765f1d5590bcc3058e +Author: Francis Lachapelle +Date: Tue Feb 3 11:30:17 2015 -0500 + + Preparation for build of a unique CSS + +A UI/WebServerResources/scss/components/bottomSheet/_extends.scss +M UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss + +commit b163e5956302f10ff249c7974871deed76f158cd +Author: iRouge +Date: Tue Feb 3 11:22:50 2015 -0500 + + Adjust typography for autoSrollList + +M .gitignore +M UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss + +commit 09fa2be5bd7252ce44290f7ffb1d11a80530cfd2 +Author: iRouge +Date: Tue Feb 3 10:52:27 2015 -0500 + + Typography auto-scroll List + +A UI/WebServerResources/scss/components/autoScrollList/_extends.scss +A UI/WebServerResources/scss/components/autoScrollList/_functions.scss +A UI/WebServerResources/scss/components/autoScrollList/autoScrollList.scss +A UI/WebServerResources/scss/components/button/_functions.scss +M UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/styles.scss + +commit 36c931b596b613917dbb41cdc64e045c94446cc2 +Author: Francis Lachapelle +Date: Tue Feb 3 10:17:15 2015 -0500 + + Preparation for build of a unique CSS + +M UI/WebServerResources/scss/components/backdrop/backdrop.scss +A UI/WebServerResources/scss/components/card/_extends.scss +M UI/WebServerResources/scss/components/card/card.scss +A UI/WebServerResources/scss/components/checkbox/_extends.scss +M UI/WebServerResources/scss/components/checkbox/checkbox.scss +A UI/WebServerResources/scss/components/content/_extends.scss +M UI/WebServerResources/scss/components/content/content.scss +A UI/WebServerResources/scss/components/dialog/_extends.scss +M UI/WebServerResources/scss/components/dialog/dialog.scss +A UI/WebServerResources/scss/components/divider/_extends.scss +M UI/WebServerResources/scss/components/divider/divider.scss +M UI/WebServerResources/scss/components/icon/_extends.scss +A UI/WebServerResources/scss/components/progressCircular/_extends.scss +M UI/WebServerResources/scss/components/progressCircular/progressCircular.scss +A UI/WebServerResources/scss/components/progressLinear/_extends.scss +M UI/WebServerResources/scss/components/progressLinear/progressLinear.scss +A UI/WebServerResources/scss/components/radioButton/_extends.scss +M UI/WebServerResources/scss/components/radioButton/radio-button.scss +A UI/WebServerResources/scss/components/sidenav/_extends.scss +M UI/WebServerResources/scss/components/sidenav/sidenav.scss +A UI/WebServerResources/scss/components/slider/_extends.scss +M UI/WebServerResources/scss/components/slider/slider.scss +A UI/WebServerResources/scss/components/sticky/_extends.scss +M UI/WebServerResources/scss/components/sticky/sticky.scss +A UI/WebServerResources/scss/components/subheader/_extends.scss +M UI/WebServerResources/scss/components/subheader/subheader.scss +A UI/WebServerResources/scss/components/switch/_extends.scss +M UI/WebServerResources/scss/components/switch/switch.scss +A UI/WebServerResources/scss/components/tabs/_extends.scss +M UI/WebServerResources/scss/components/tabs/tabs.scss +A UI/WebServerResources/scss/components/textField/_extends.scss +M UI/WebServerResources/scss/components/textField/textField.scss +A UI/WebServerResources/scss/components/toast/_extends.scss +M UI/WebServerResources/scss/components/toast/toast.scss +A UI/WebServerResources/scss/components/toolbar/_extends.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +A UI/WebServerResources/scss/components/tooltip/_extends.scss +M UI/WebServerResources/scss/components/tooltip/tooltip.scss +A UI/WebServerResources/scss/components/whiteframe/_extends.scss +M UI/WebServerResources/scss/components/whiteframe/whiteframe.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss + +commit 6040838396bb0e7b435c8131b5fdbdd9eb0d5dc6 +Author: Francis Lachapelle +Date: Tue Feb 3 08:56:19 2015 -0500 + + Don't use bower package of the font Fira + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit 1a81abebaa254106a32b02183603e05f508f92e7 +Author: Francis Lachapelle +Date: Tue Feb 3 08:55:17 2015 -0500 + + Remove unused files from scss directory + +D UI/WebServerResources/scss/components/backdrop/backdrop.js +D UI/WebServerResources/scss/components/bottomSheet/bottomSheet.js +D UI/WebServerResources/scss/components/bottomSheet/bottomSheet.spec.js +D UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/bottom-sheet-grid-template.html +D UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/bottom-sheet-list-template.html +D UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/button/button.js +D UI/WebServerResources/scss/components/button/button.spec.js +D UI/WebServerResources/scss/components/button/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/button/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/button/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/card/card.js +D UI/WebServerResources/scss/components/card/card.spec.js +D UI/WebServerResources/scss/components/card/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/card/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/card/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/checkbox/checkbox.js +D UI/WebServerResources/scss/components/checkbox/checkbox.spec.js +D UI/WebServerResources/scss/components/checkbox/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/checkbox/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/checkbox/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/content/content.js +D UI/WebServerResources/scss/components/content/content.spec.js +D UI/WebServerResources/scss/components/content/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/content/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/dialog/demoBasicUsage/dialog1.tmpl.html +D UI/WebServerResources/scss/components/dialog/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/dialog/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/dialog/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/dialog/dialog.js +D UI/WebServerResources/scss/components/dialog/dialog.spec.js +D UI/WebServerResources/scss/components/divider/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/divider/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/divider/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/divider/divider.js +D UI/WebServerResources/scss/components/input/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/input/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/input/input.js +D UI/WebServerResources/scss/components/input/input.spec.js +D UI/WebServerResources/scss/components/list/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/list/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/list/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/list/list.js +D UI/WebServerResources/scss/components/list/list.spec.js +D UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/progressCircular/progressCircular.js +D UI/WebServerResources/scss/components/progressCircular/progressCircular.spec.js +D UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/progressLinear/progressLinear.js +D UI/WebServerResources/scss/components/progressLinear/progressLinear.spec.js +D UI/WebServerResources/scss/components/radioButton/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/radioButton/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/radioButton/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/radioButton/radioButton.js +D UI/WebServerResources/scss/components/radioButton/radioButton.spec.js +D UI/WebServerResources/scss/components/sidenav/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/sidenav/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/sidenav/sidenav.js +D UI/WebServerResources/scss/components/sidenav/sidenav.spec.js +D UI/WebServerResources/scss/components/slider/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/slider/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/slider/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/slider/slider.js +D UI/WebServerResources/scss/components/slider/slider.spec.js +D UI/WebServerResources/scss/components/sticky/sticky.js +D UI/WebServerResources/scss/components/sticky/sticky.spec.js +D UI/WebServerResources/scss/components/subheader/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/subheader/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/subheader/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/subheader/subheader.js +D UI/WebServerResources/scss/components/subheader/subheader.spec.js +D UI/WebServerResources/scss/components/swipe/swipe.js +D UI/WebServerResources/scss/components/switch/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/switch/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/switch/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/switch/switch.js +D UI/WebServerResources/scss/components/switch/switch.spec.js +D UI/WebServerResources/scss/components/tabs/demoDynamicTabs/index.html +D UI/WebServerResources/scss/components/tabs/demoDynamicTabs/script.js +D UI/WebServerResources/scss/components/tabs/demoDynamicTabs/style.css +D UI/WebServerResources/scss/components/tabs/demoStaticTabs/index.html +D UI/WebServerResources/scss/components/tabs/demoStaticTabs/script.js +D UI/WebServerResources/scss/components/tabs/demoStaticTabs/style.css +D UI/WebServerResources/scss/components/tabs/js/inkBarDirective.js +D UI/WebServerResources/scss/components/tabs/js/paginationDirective.js +D UI/WebServerResources/scss/components/tabs/js/tabItemController.js +D UI/WebServerResources/scss/components/tabs/js/tabItemDirective.js +D UI/WebServerResources/scss/components/tabs/js/tabsController.js +D UI/WebServerResources/scss/components/tabs/js/tabsDirective.js +D UI/WebServerResources/scss/components/tabs/tabs.js +D UI/WebServerResources/scss/components/tabs/tabs.spec.js +D UI/WebServerResources/scss/components/textField/textField.js +D UI/WebServerResources/scss/components/textField/textField.spec.js +D UI/WebServerResources/scss/components/toast/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/toast/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/toast/demoBasicUsage/toast-template.html +D UI/WebServerResources/scss/components/toast/toast.js +D UI/WebServerResources/scss/components/toast/toast.spec.js +D UI/WebServerResources/scss/components/toolbar/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/toolbar/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/toolbar/demoScrollShrink/index.html +D UI/WebServerResources/scss/components/toolbar/demoScrollShrink/script.js +D UI/WebServerResources/scss/components/toolbar/demoScrollShrink/style.css +D UI/WebServerResources/scss/components/toolbar/toolbar.js +D UI/WebServerResources/scss/components/toolbar/toolbar.spec.js +D UI/WebServerResources/scss/components/tooltip/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/tooltip/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/tooltip/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/tooltip/tooltip.js +D UI/WebServerResources/scss/components/tooltip/tooltip.spec.js +D UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/index.html +D UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/script.js +D UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/style.css +D UI/WebServerResources/scss/components/whiteframe/whiteframe.js +D UI/WebServerResources/scss/elements/_manifest.scss +D UI/WebServerResources/scss/grid/_manifest.scss +D UI/WebServerResources/scss/test.js +D UI/WebServerResources/scss/ui_patterns/_manifest.scss + +commit a191c7a3828540f79959d5cb6a01b899b1edd42a +Author: iRouge +Date: Mon Feb 2 23:47:08 2015 -0500 + + Typography : Google Material Design standard styles + - Layout is broken + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/scss/core/typography/typography.scss + +commit 907df8143619c91efbe77d9fdc7420d256361f24 +Author: iRouge +Date: Mon Feb 2 22:55:06 2015 -0500 + + Typography-2 + +A UI/WebServerResources/fonts/FiraMono-Bold.eot +A UI/WebServerResources/fonts/FiraMono-Bold.ttf +A UI/WebServerResources/fonts/FiraMono-Bold.woff +A UI/WebServerResources/fonts/FiraMono-Medium.eot +A UI/WebServerResources/fonts/FiraMono-Medium.ttf +A UI/WebServerResources/fonts/FiraMono-Medium.woff +A UI/WebServerResources/fonts/FiraMono-Regular.eot +A UI/WebServerResources/fonts/FiraMono-Regular.ttf +A UI/WebServerResources/fonts/FiraMono-Regular.woff +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf +M UI/WebServerResources/scss/core/structure.scss +A UI/WebServerResources/scss/core/typography/typography.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 8f01b0c7390ea0e142de8fdcd60f0985650734e6 +Author: iRouge +Date: Mon Feb 2 16:11:47 2015 -0500 + + Add Fira Sans to font folder + +A UI/WebServerResources/fonts/FiraSans-Bold.eot +A UI/WebServerResources/fonts/FiraSans-Bold.ttf +A UI/WebServerResources/fonts/FiraSans-Bold.woff +A UI/WebServerResources/fonts/FiraSans-BoldItalic.eot +A UI/WebServerResources/fonts/FiraSans-BoldItalic.ttf +A UI/WebServerResources/fonts/FiraSans-BoldItalic.woff +A UI/WebServerResources/fonts/FiraSans-Book.eot +A UI/WebServerResources/fonts/FiraSans-Book.ttf +A UI/WebServerResources/fonts/FiraSans-Book.woff +A UI/WebServerResources/fonts/FiraSans-BookItalic.eot +A UI/WebServerResources/fonts/FiraSans-BookItalic.ttf +A UI/WebServerResources/fonts/FiraSans-BookItalic.woff +A UI/WebServerResources/fonts/FiraSans-Eight.eot +A UI/WebServerResources/fonts/FiraSans-Eight.ttf +A UI/WebServerResources/fonts/FiraSans-Eight.woff +A UI/WebServerResources/fonts/FiraSans-EightItalic.eot +A UI/WebServerResources/fonts/FiraSans-EightItalic.ttf +A UI/WebServerResources/fonts/FiraSans-EightItalic.woff +A UI/WebServerResources/fonts/FiraSans-ExtraBold.eot +A UI/WebServerResources/fonts/FiraSans-ExtraBold.ttf +A UI/WebServerResources/fonts/FiraSans-ExtraBold.woff +A UI/WebServerResources/fonts/FiraSans-ExtraBoldItalic.eot +A UI/WebServerResources/fonts/FiraSans-ExtraBoldItalic.ttf +A UI/WebServerResources/fonts/FiraSans-ExtraBoldItalic.woff +A UI/WebServerResources/fonts/FiraSans-ExtraLight.eot +A UI/WebServerResources/fonts/FiraSans-ExtraLight.ttf +A UI/WebServerResources/fonts/FiraSans-ExtraLight.woff +A UI/WebServerResources/fonts/FiraSans-ExtraLightItalic.eot +A UI/WebServerResources/fonts/FiraSans-ExtraLightItalic.ttf +A UI/WebServerResources/fonts/FiraSans-ExtraLightItalic.woff +A UI/WebServerResources/fonts/FiraSans-Four.eot +A UI/WebServerResources/fonts/FiraSans-Four.ttf +A UI/WebServerResources/fonts/FiraSans-Four.woff +A UI/WebServerResources/fonts/FiraSans-FourItalic.eot +A UI/WebServerResources/fonts/FiraSans-FourItalic.ttf +A UI/WebServerResources/fonts/FiraSans-FourItalic.woff +A UI/WebServerResources/fonts/FiraSans-Hair.eot +A UI/WebServerResources/fonts/FiraSans-Hair.ttf +A UI/WebServerResources/fonts/FiraSans-Hair.woff +A UI/WebServerResources/fonts/FiraSans-HairItalic.eot +A UI/WebServerResources/fonts/FiraSans-HairItalic.ttf +A UI/WebServerResources/fonts/FiraSans-HairItalic.woff +A UI/WebServerResources/fonts/FiraSans-Heavy.eot +A UI/WebServerResources/fonts/FiraSans-Heavy.ttf +A UI/WebServerResources/fonts/FiraSans-Heavy.woff +A UI/WebServerResources/fonts/FiraSans-HeavyItalic.eot +A UI/WebServerResources/fonts/FiraSans-HeavyItalic.ttf +A UI/WebServerResources/fonts/FiraSans-HeavyItalic.woff +A UI/WebServerResources/fonts/FiraSans-Italic.eot +A UI/WebServerResources/fonts/FiraSans-Italic.ttf +A UI/WebServerResources/fonts/FiraSans-Italic.woff +A UI/WebServerResources/fonts/FiraSans-Light.eot +A UI/WebServerResources/fonts/FiraSans-Light.ttf +A UI/WebServerResources/fonts/FiraSans-Light.woff +A UI/WebServerResources/fonts/FiraSans-LightItalic.eot +A UI/WebServerResources/fonts/FiraSans-LightItalic.ttf +A UI/WebServerResources/fonts/FiraSans-LightItalic.woff +A UI/WebServerResources/fonts/FiraSans-Medium.eot +A UI/WebServerResources/fonts/FiraSans-Medium.ttf +A UI/WebServerResources/fonts/FiraSans-Medium.woff +A UI/WebServerResources/fonts/FiraSans-MediumItalic.eot +A UI/WebServerResources/fonts/FiraSans-MediumItalic.ttf +A UI/WebServerResources/fonts/FiraSans-MediumItalic.woff +A UI/WebServerResources/fonts/FiraSans-Regular.eot +A UI/WebServerResources/fonts/FiraSans-Regular.ttf +A UI/WebServerResources/fonts/FiraSans-Regular.woff +A UI/WebServerResources/fonts/FiraSans-SemiBold.eot +A UI/WebServerResources/fonts/FiraSans-SemiBold.ttf +A UI/WebServerResources/fonts/FiraSans-SemiBold.woff +A UI/WebServerResources/fonts/FiraSans-SemiBoldItalic.eot +A UI/WebServerResources/fonts/FiraSans-SemiBoldItalic.ttf +A UI/WebServerResources/fonts/FiraSans-SemiBoldItalic.woff +A UI/WebServerResources/fonts/FiraSans-Thin.eot +A UI/WebServerResources/fonts/FiraSans-Thin.ttf +A UI/WebServerResources/fonts/FiraSans-Thin.woff +A UI/WebServerResources/fonts/FiraSans-ThinItalic.eot +A UI/WebServerResources/fonts/FiraSans-ThinItalic.ttf +A UI/WebServerResources/fonts/FiraSans-ThinItalic.woff +A UI/WebServerResources/fonts/FiraSans-Two.eot +A UI/WebServerResources/fonts/FiraSans-Two.ttf +A UI/WebServerResources/fonts/FiraSans-Two.woff +A UI/WebServerResources/fonts/FiraSans-TwoItalic.eot +A UI/WebServerResources/fonts/FiraSans-TwoItalic.ttf +A UI/WebServerResources/fonts/FiraSans-TwoItalic.woff +A UI/WebServerResources/fonts/FiraSans-Ultra.eot +A UI/WebServerResources/fonts/FiraSans-Ultra.ttf +A UI/WebServerResources/fonts/FiraSans-Ultra.woff +A UI/WebServerResources/fonts/FiraSans-UltraItalic.eot +A UI/WebServerResources/fonts/FiraSans-UltraItalic.ttf +A UI/WebServerResources/fonts/FiraSans-UltraItalic.woff +A UI/WebServerResources/fonts/FiraSans-UltraLight.eot +A UI/WebServerResources/fonts/FiraSans-UltraLight.ttf +A UI/WebServerResources/fonts/FiraSans-UltraLight.woff +A UI/WebServerResources/fonts/FiraSans-UltraLightItalic.eot +A UI/WebServerResources/fonts/FiraSans-UltraLightItalic.ttf +A UI/WebServerResources/fonts/FiraSans-UltraLightItalic.woff +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.svg +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.woff +D UI/WebServerResources/fonts/ionicons.eot +D UI/WebServerResources/fonts/ionicons.svg +D UI/WebServerResources/fonts/ionicons.ttf +D UI/WebServerResources/fonts/ionicons.woff +M UI/WebServerResources/scss/core/structure.scss + +commit 8c974e6c1aa92d7d80122c783f4507376aba3a46 +Author: Francis Lachapelle +Date: Mon Feb 2 16:02:58 2015 -0500 + + Add Fira font + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit e73ed8ae4411ffc03f0ed0aa26d60cedfe263abb +Author: iRouge +Date: Mon Feb 2 15:42:37 2015 -0500 + + Add bower sass-cache to gitignore + +M .gitignore + +commit f59b078faaaad9e480e301f8f05ffe4f4d5b7225 +Author: iRouge +Date: Mon Feb 2 15:35:17 2015 -0500 + + Typography 2 + +M .gitignore +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.svg +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.woff +A UI/WebServerResources/fonts/ionicons.eot +A UI/WebServerResources/fonts/ionicons.svg +A UI/WebServerResources/fonts/ionicons.ttf +A UI/WebServerResources/fonts/ionicons.woff + +commit 6319b6f5319e898fe6badb16ec4243c799da876b +Author: iRouge +Date: Mon Feb 2 15:24:50 2015 -0500 + + Typography + +A UI/WebServerResources/scss/components/backdrop/_extends.scss +M UI/WebServerResources/scss/core/structure.scss + +commit 9671fbf5061b2e0bf10c37ce42b23632cd4f3e3a +Author: Francis Lachapelle +Date: Mon Feb 2 15:11:29 2015 -0500 + + Remove .sass-cache directory + +D UI/WebServerResources/.sass-cache/0621d77d016ffda45ce319aaf6c8acb3e5fd2456/toolbar.scssc +D UI/WebServerResources/.sass-cache/08d04022c27b2dc89d5eb42232d425f33335c733/MailerUI.scssc +D UI/WebServerResources/.sass-cache/08d04022c27b2dc89d5eb42232d425f33335c733/_view.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/_functions.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/layout.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/mixins.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/reset.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/structure.scssc +D UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/variables.scssc +D UI/WebServerResources/.sass-cache/1369551ff4e7216eab7e3e275a48c008d1596ccb/button.scssc +D UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_constants.scssc +D UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_cross_browser_support.scssc +D UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_display.scssc +D UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_gradient_support.scssc +D UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_lists.scssc +D UI/WebServerResources/.sass-cache/290c6726ec86fa7ca5fc60378b55f9789dd815dd/divider.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_border.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_core.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_icons.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_mixins.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_pulled.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_rotated.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_sizes.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_spinned.scssc +D UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_variables.scssc +D UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_ellipsis.scssc +D UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_force-wrap.scssc +D UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_nowrap.scssc +D UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_replacement.scssc +D UI/WebServerResources/.sass-cache/3bef4cb0646effa81931578fccc01cf496c06fa6/_extends.scssc +D UI/WebServerResources/.sass-cache/3bef4cb0646effa81931578fccc01cf496c06fa6/backdrop.scssc +D UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_color.scssc +D UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_general.scssc +D UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_sprites.scssc +D UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_tables.scssc +D UI/WebServerResources/.sass-cache/455e6d8108504eacf98607848cb2fab417ced312/_base.scssc +D UI/WebServerResources/.sass-cache/455e6d8108504eacf98607848cb2fab417ced312/_sprite-img.scssc +D UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/_devtools.scssc +D UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/_shame.scssc +D UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/styles.scssc +D UI/WebServerResources/.sass-cache/5c1393d3ae682e72e0cbbf966bb674f59452487d/_extends.scssc +D UI/WebServerResources/.sass-cache/5c1393d3ae682e72e0cbbf966bb674f59452487d/icon.scssc +D UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_links.scssc +D UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_lists.scssc +D UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_text.scssc +D UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_vertical_rhythm.scssc +D UI/WebServerResources/.sass-cache/5f0c755c2ea0c21ac71396d4a99ba7e8a588771a/backdrop.scssc +D UI/WebServerResources/.sass-cache/6e823f81de8dfe823170198830d8af330e579635/color-palette.scssc +D UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_css3.scssc +D UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_functions.scssc +D UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_support.scssc +D UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_typography.scssc +D UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_utilities.scssc +D UI/WebServerResources/.sass-cache/736edc5b14be1a715ddad0a388256afe743c5588/list.scssc +D UI/WebServerResources/.sass-cache/73a261245d2328475510118d1ec4c6acf3eadc0a/_base_style.scssc +D UI/WebServerResources/.sass-cache/7c69eee964659a009b127ade8f9187015bec3a01/_button.scssc +D UI/WebServerResources/.sass-cache/7c69eee964659a009b127ade8f9187015bec3a01/_extends.scssc +D UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_bullets.scssc +D UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_horizontal-list.scssc +D UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_inline-block-list.scssc +D UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_inline-list.scssc +D UI/WebServerResources/.sass-cache/a004f0befa53f4c6d2eb159efa6c868b185821ab/_contrast.scssc +D UI/WebServerResources/.sass-cache/b52457aa3cbcb979be34bc5c603334e6353f4f9e/_utilities.scssc +D UI/WebServerResources/.sass-cache/c79c69a6cca5a99b379b12af104d23ab6925623b/input.scssc +D UI/WebServerResources/.sass-cache/d11266f9a8e3e765fb35484839cae8e838bfd7f4/_compass.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_actions.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_alert.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_audio-video.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_communication.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_content.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_device.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_editor.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_file.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_hardware.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_image.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_maps.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_navigation.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_notification.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_social.scssc +D UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_toggle.scssc +D UI/WebServerResources/.sass-cache/df960fa564fd5f6057dbe6083c1c75144da7d0b3/_grid-background.scssc +D UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_hover-link.scssc +D UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_link-colors.scssc +D UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_unstyled-link.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_appearance.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-clip.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-origin.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-size.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_border-radius.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box-shadow.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box-sizing.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_columns.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_filter.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_font-face.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_hyphenation.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_images.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_inline-block.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_opacity.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_regions.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_shared.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_text-shadow.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_transform.scssc +D UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_transition.scssc +D UI/WebServerResources/.sass-cache/fa7e7b295653bd48251a576b9782581f5e96fd52/layout.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_clearfix.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_float.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_hacks.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_min.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_reset.scssc +D UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_tag-cloud.scssc +D UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_alternating-rows-and-columns.scssc +D UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_borders.scssc +D UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_scaffolding.scssc +D UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/_extends.scssc +D UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/_mixins.scssc +D UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/bottombar-theme.scssc +D UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/bottombar.scssc + +commit 670d2bc382cc1cb2387341c0a4c7fafdfaa82136 +Author: iRouge +Date: Mon Feb 2 14:43:53 2015 -0500 + + Generate basic font-size according to Google Material design specs + +A UI/WebServerResources/.sass-cache/0621d77d016ffda45ce319aaf6c8acb3e5fd2456/toolbar.scssc +A UI/WebServerResources/.sass-cache/08d04022c27b2dc89d5eb42232d425f33335c733/MailerUI.scssc +A UI/WebServerResources/.sass-cache/08d04022c27b2dc89d5eb42232d425f33335c733/_view.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/_functions.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/layout.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/mixins.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/reset.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/structure.scssc +A UI/WebServerResources/.sass-cache/121dd71fcdc816c7a8afabbaaf564d95c06ed77a/variables.scssc +A UI/WebServerResources/.sass-cache/1369551ff4e7216eab7e3e275a48c008d1596ccb/button.scssc +A UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_constants.scssc +A UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_cross_browser_support.scssc +A UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_display.scssc +A UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_gradient_support.scssc +A UI/WebServerResources/.sass-cache/24c830e606ed419e590f6fd98b1362d628c479e4/_lists.scssc +A UI/WebServerResources/.sass-cache/290c6726ec86fa7ca5fc60378b55f9789dd815dd/divider.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_border.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_core.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_icons.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_mixins.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_pulled.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_rotated.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_sizes.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_spinned.scssc +A UI/WebServerResources/.sass-cache/335dd608accbd708f8c0c0876606f1b620f02115/_variables.scssc +A UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_ellipsis.scssc +A UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_force-wrap.scssc +A UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_nowrap.scssc +A UI/WebServerResources/.sass-cache/3b4e97448379eff5d8d1caac5bf5dd394921dcab/_replacement.scssc +A UI/WebServerResources/.sass-cache/3bef4cb0646effa81931578fccc01cf496c06fa6/_extends.scssc +A UI/WebServerResources/.sass-cache/3bef4cb0646effa81931578fccc01cf496c06fa6/backdrop.scssc +A UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_color.scssc +A UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_general.scssc +A UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_sprites.scssc +A UI/WebServerResources/.sass-cache/40f4e04cdcd7241d59e3890d5f415336c0acadce/_tables.scssc +A UI/WebServerResources/.sass-cache/455e6d8108504eacf98607848cb2fab417ced312/_base.scssc +A UI/WebServerResources/.sass-cache/455e6d8108504eacf98607848cb2fab417ced312/_sprite-img.scssc +A UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/_devtools.scssc +A UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/_shame.scssc +A UI/WebServerResources/.sass-cache/477d50df11c4c9be7e570a4a7f26c98a82613f2b/styles.scssc +A UI/WebServerResources/.sass-cache/5c1393d3ae682e72e0cbbf966bb674f59452487d/_extends.scssc +A UI/WebServerResources/.sass-cache/5c1393d3ae682e72e0cbbf966bb674f59452487d/icon.scssc +A UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_links.scssc +A UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_lists.scssc +A UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_text.scssc +A UI/WebServerResources/.sass-cache/5cc88903bdb43d7fea8d97529f5020c78340fa79/_vertical_rhythm.scssc +A UI/WebServerResources/.sass-cache/5f0c755c2ea0c21ac71396d4a99ba7e8a588771a/backdrop.scssc +A UI/WebServerResources/.sass-cache/6e823f81de8dfe823170198830d8af330e579635/color-palette.scssc +A UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_css3.scssc +A UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_functions.scssc +A UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_support.scssc +A UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_typography.scssc +A UI/WebServerResources/.sass-cache/6f7a67bc7edc739ed82c250cc67d5b071558f551/_utilities.scssc +A UI/WebServerResources/.sass-cache/736edc5b14be1a715ddad0a388256afe743c5588/list.scssc +A UI/WebServerResources/.sass-cache/73a261245d2328475510118d1ec4c6acf3eadc0a/_base_style.scssc +A UI/WebServerResources/.sass-cache/7c69eee964659a009b127ade8f9187015bec3a01/_button.scssc +A UI/WebServerResources/.sass-cache/7c69eee964659a009b127ade8f9187015bec3a01/_extends.scssc +A UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_bullets.scssc +A UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_horizontal-list.scssc +A UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_inline-block-list.scssc +A UI/WebServerResources/.sass-cache/8651d2a864964fc04fa3e3c35bc26fd87d3aec33/_inline-list.scssc +A UI/WebServerResources/.sass-cache/a004f0befa53f4c6d2eb159efa6c868b185821ab/_contrast.scssc +A UI/WebServerResources/.sass-cache/b52457aa3cbcb979be34bc5c603334e6353f4f9e/_utilities.scssc +A UI/WebServerResources/.sass-cache/c79c69a6cca5a99b379b12af104d23ab6925623b/input.scssc +A UI/WebServerResources/.sass-cache/d11266f9a8e3e765fb35484839cae8e838bfd7f4/_compass.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_actions.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_alert.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_audio-video.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_communication.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_content.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_device.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_editor.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_file.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_hardware.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_image.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_maps.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_navigation.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_notification.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_social.scssc +A UI/WebServerResources/.sass-cache/df29187505b5a91225043d7487efed3df3207f17/_toggle.scssc +A UI/WebServerResources/.sass-cache/df960fa564fd5f6057dbe6083c1c75144da7d0b3/_grid-background.scssc +A UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_hover-link.scssc +A UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_link-colors.scssc +A UI/WebServerResources/.sass-cache/e5825be0018e5098691dd12d3de1491d95f907b1/_unstyled-link.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_appearance.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-clip.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-origin.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_background-size.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_border-radius.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box-shadow.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box-sizing.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_box.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_columns.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_filter.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_font-face.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_hyphenation.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_images.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_inline-block.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_opacity.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_regions.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_shared.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_text-shadow.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_transform.scssc +A UI/WebServerResources/.sass-cache/e7167ca9e0b7fd50b29e4b84215a88512abae188/_transition.scssc +A UI/WebServerResources/.sass-cache/fa7e7b295653bd48251a576b9782581f5e96fd52/layout.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_clearfix.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_float.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_hacks.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_min.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_reset.scssc +A UI/WebServerResources/.sass-cache/fa82154cdd5f726da8c4b38c822b43df3319d11b/_tag-cloud.scssc +A UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_alternating-rows-and-columns.scssc +A UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_borders.scssc +A UI/WebServerResources/.sass-cache/fc6d08d8f5d547e12050c6decdf8d2910af45156/_scaffolding.scssc +A UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/_extends.scssc +A UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/_mixins.scssc +A UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/bottombar-theme.scssc +A UI/WebServerResources/.sass-cache/ffe659a643287127d2646202841ecf19a3f314fa/bottombar.scssc +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/core/_functions.scss +M UI/WebServerResources/scss/core/structure.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 6f6338bb6473f825565b6046a30877a285f8a769 +Author: Francis Lachapelle +Date: Mon Feb 2 09:53:42 2015 -0500 + + Fix font file name in SASS + +M UI/WebServerResources/scss/components/icon/icon.scss + +commit 1528b32cc77cef33f1951e45034b3f676a476282 +Author: iRouge +Date: Mon Feb 2 09:39:53 2015 -0500 + + Update fontes icônes + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/components/bottombar/_extends.scss +A UI/WebServerResources/scss/components/bottombar/test.scss +A UI/WebServerResources/scss/components/button/_button.scss +A UI/WebServerResources/scss/components/button/_extends.scss +D UI/WebServerResources/scss/components/button/button.scss +A UI/WebServerResources/scss/test.js + +commit e1b155b455709e4a882dfd4496d87659ebdbd53c +Author: Francis Lachapelle +Date: Mon Feb 2 09:22:39 2015 -0500 + + Remove fonts managed by bower & grunt + +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +D UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf + +commit 72ae466541335ee5ba35b7d87da9696cf07d35ce +Author: iRouge +Date: Sun Feb 1 18:09:48 2015 -0500 + + Embedded Icon font source has base64 data URI in CSS + +M UI/Templates/UIxPageFrame.wox +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.eot +A UI/WebServerResources/fonts/Material-Design-Iconic-Font.ttf +D UI/WebServerResources/fonts/_ubuntu.scss +D UI/WebServerResources/fonts/icomoon.eot +D UI/WebServerResources/fonts/icomoon.svg +D UI/WebServerResources/fonts/icomoon.ttf +D UI/WebServerResources/fonts/icomoon.woff +D UI/WebServerResources/fonts/ionicons.eot +D UI/WebServerResources/fonts/ionicons.svg +D UI/WebServerResources/fonts/ionicons.ttf +D UI/WebServerResources/fonts/ionicons.woff +D UI/WebServerResources/fonts/ubuntu-b.eot +D UI/WebServerResources/fonts/ubuntu-b.svg +D UI/WebServerResources/fonts/ubuntu-b.ttf +D UI/WebServerResources/fonts/ubuntu-b.woff +D UI/WebServerResources/fonts/ubuntu-b.woff2 +D UI/WebServerResources/fonts/ubuntu-bi.eot +D UI/WebServerResources/fonts/ubuntu-bi.svg +D UI/WebServerResources/fonts/ubuntu-bi.woff +D UI/WebServerResources/fonts/ubuntu-bi.woff2 +D UI/WebServerResources/fonts/ubuntu-l.eot +D UI/WebServerResources/fonts/ubuntu-l.svg +D UI/WebServerResources/fonts/ubuntu-l.woff +D UI/WebServerResources/fonts/ubuntu-l.woff2 +D UI/WebServerResources/fonts/ubuntu-li.eot +D UI/WebServerResources/fonts/ubuntu-li.svg +D UI/WebServerResources/fonts/ubuntu-li.woff +D UI/WebServerResources/fonts/ubuntu-li.woff2 +D UI/WebServerResources/fonts/ubuntu-m.eot +D UI/WebServerResources/fonts/ubuntu-m.svg +D UI/WebServerResources/fonts/ubuntu-m.woff +D UI/WebServerResources/fonts/ubuntu-m.woff2 +D UI/WebServerResources/fonts/ubuntu-mi.eot +D UI/WebServerResources/fonts/ubuntu-mi.svg +D UI/WebServerResources/fonts/ubuntu-mi.woff +D UI/WebServerResources/fonts/ubuntu-mi.woff2 +D UI/WebServerResources/fonts/ubuntu-r.eot +D UI/WebServerResources/fonts/ubuntu-r.svg +D UI/WebServerResources/fonts/ubuntu-r.woff +D UI/WebServerResources/fonts/ubuntu-r.woff2 +D UI/WebServerResources/fonts/ubuntu-ri.eot +D UI/WebServerResources/fonts/ubuntu-ri.svg +D UI/WebServerResources/fonts/ubuntu-ri.woff +D UI/WebServerResources/fonts/ubuntu-ri.woff2 +M UI/WebServerResources/scss/components/icon/_extends.scss +M UI/WebServerResources/scss/components/icon/icon.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss + +commit 5cc14bb729733aa729f3ac1484d7aa281880eff7 +Author: Francis Lachapelle +Date: Fri Jan 30 16:31:08 2015 -0500 + + Remove reference to bower_components in CSS + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/scss/components/icon/_extends.scss + +commit 79a5d61efb60a1eb80453270c456fdad11c01c41 +Author: Francis Lachapelle +Date: Fri Jan 30 14:54:55 2015 -0500 + + Improve sgFolderTree + + Replaced the A link by a button and renamed the childLevel# CSS class by + a more appropriate sg-child-level-# class. + +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/scss/views/MailerUI.scss + +commit c664648eb64f2f2fbb05dfd4839b46a57c58c0d8 +Author: Francis Lachapelle +Date: Fri Jan 30 14:48:45 2015 -0500 + + Fix processing of SCSS with Grunt + + We now use the Ruby implementation of SASS (grunt-contrib-sass) since + libsass is not compatible with Compass. + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/package.json + +commit df6d95772119f653d0b9c67516e7d77723cf3fda +Author: Francis Lachapelle +Date: Fri Jan 30 13:50:26 2015 -0500 + + Fix mailbox rename operation + +M UI/MailerUI/product.plist +M UI/WebServerResources/js/Mailer/mailbox-model.js + +commit ee9ef2f0e4ac1b6d48873c198fda891a4ee5cda9 +Author: Francis Lachapelle +Date: Thu Jan 29 15:37:32 2015 -0500 + + Remove unused SASS files + +D UI/WebServerResources/scss/components/_components/_articles-list.scss +D UI/WebServerResources/scss/components/_components/_breadcrumb.scss +D UI/WebServerResources/scss/components/_components/_button.scss +D UI/WebServerResources/scss/components/_components/_column-list.scss +D UI/WebServerResources/scss/components/_components/_grid.scss +D UI/WebServerResources/scss/components/_components/_guides-list.scss +D UI/WebServerResources/scss/components/_components/_icon-circle.scss +D UI/WebServerResources/scss/components/_components/_icons.scss +D UI/WebServerResources/scss/components/_components/_link.scss +D UI/WebServerResources/scss/components/_components/_list.scss +D UI/WebServerResources/scss/components/_components/_media.scss +D UI/WebServerResources/scss/components/_components/_subsection-title.scss +D UI/WebServerResources/scss/components/_components/_table.scss +D UI/WebServerResources/scss/components/_components/_typography.scss + +commit 383ccdbc826d9657a41d3dc2ad03dacea708c7df +Author: Francis Lachapelle +Date: Thu Jan 29 11:32:35 2015 -0500 + + Add CSS animation to mailboxes tree + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/views/MailerUI.scss + +commit 225d039f89182d95c098004df1acbaab63bf6ab3 +Author: Francis Lachapelle +Date: Thu Jan 29 11:09:31 2015 -0500 + + Improve sgFolderTree directive (mailboxes tree) + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/scss/views/MailerUI.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 7f74d5a3d988bf5f16eddc555844403469235e82 +Author: Francis Lachapelle +Date: Thu Jan 29 10:55:47 2015 -0500 + + New sgEnter Angular directive + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 862068eeb547a554837e21b00b07d73a8ac6febc +Author: Francis Lachapelle +Date: Wed Jan 28 10:05:18 2015 -0500 + + Improve JSON getters for events + +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M SoObjects/Appointments/iCalEvent+SOGo.m +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +M UI/Scheduler/UIxAppointmentEditor.m + +commit 56607a1baf0c71eb152277275ffd90671d15b92d +Author: iRouge +Date: Wed Jan 28 03:24:53 2015 -0500 + + Refactor contact editor form element templates markup and style + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/js/Common/notes +M UI/WebServerResources/scss/components/input/input.scss +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss +M UI/WebServerResources/scss/styles.scss + +commit 750a41f19af4378a200776caac30d8c8df10cc06 +Author: iRouge +Date: Tue Jan 27 21:47:49 2015 -0500 + + CSS files for convenience + +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map + +commit 6651b02ba2e798719d1a66ab597fc33d5678fde1 +Author: iRouge +Date: Tue Jan 27 21:45:56 2015 -0500 + + Replace valueless attributes by classes + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/scss/core/layout.scss + +commit 3054c04261e52707ffe1e470071a0d22134101d7 +Author: iRouge +Date: Tue Jan 27 20:57:24 2015 -0500 + + Add a utility to replace attributes without values by classes + +M UI/WebServerResources/scss/core/layout.scss +M UI/WebServerResources/scss/core/mixins.scss + +commit 04132023e6192625d52f3e2b72f9819f6de5e68f +Author: iRouge +Date: Tue Jan 27 19:05:35 2015 -0500 + + Clean-up markup in templates + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox + +commit 60bd406eac5bf04b9a13a8f710db8e11045c34ca +Author: iRouge +Date: Tue Jan 27 15:50:19 2015 -0500 + + Add import to bower_components ngMaterial + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js + +commit 7dc7662adf47f712a7b50c5a7a4cfeed1a776388 +Author: iRouge +Date: Tue Jan 27 15:48:26 2015 -0500 + + Fix a broken tag in UIxPageEditorTemplate + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit 047138984a9ae72c562551542c67fd295bbb720c +Author: iRouge +Date: Tue Jan 27 00:58:54 2015 -0500 + + Fix an update version issue + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/Common/ui.js + +commit 1a7bfee6b61a3428c4150abf8ff212681a981403 +Author: iRouge +Date: Mon Jan 26 23:33:47 2015 -0500 + + define base theme : add palette definitions to module initialization + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/scss/components/bottombar/_extends.scss +M UI/WebServerResources/scss/components/bottombar/bottombar-theme.scss +M UI/WebServerResources/scss/components/bottombar/bottombar.scss +M UI/WebServerResources/scss/core/structure.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/themes/color-palette.scss + +commit ee4c1c0706976f5ae95a92468217ca99eda743ce +Author: iRouge +Date: Mon Jan 26 22:01:24 2015 -0500 + + define theme + +M UI/WebServerResources/js/Common/ui.js + +commit eea5cf8d0bb859be680baac096c934a9e08323a2 +Author: iRouge +Date: Mon Jan 26 18:38:36 2015 -0500 + + Edit gitignore to ignore built API doc + +M .gitignore + +commit 67076cdffbc1bc02ba71856318700fac67beaec0 +Author: iRouge +Date: Mon Jan 26 18:33:27 2015 -0500 + + Update angular-material + +M UI/WebServerResources/angular-material + +commit 80785304f16270ae4bc2f08c56b30ed54eaae9c0 +Author: Francis Lachapelle +Date: Mon Jan 26 15:45:42 2015 -0500 + + JSONify [UIxCalendarProperties saveAction] + +M SoObjects/Appointments/SOGoAppointmentFolder.h +M SoObjects/Appointments/SOGoAppointmentFolder.m +M UI/Scheduler/UIxCalendarProperties.h +M UI/Scheduler/UIxCalendarProperties.m +M UI/Scheduler/product.plist + +commit c934b3d9c0322affdb8764bd4fcafd3b03b351b8 +Author: Francis Lachapelle +Date: Mon Jan 26 15:42:10 2015 -0500 + + Improve API doc of UIxContactEditor + +M UI/Contacts/UIxContactEditor.m + +commit 794c1999bcede997f9960a35a25166104d0b8109 +Author: Francis Lachapelle +Date: Mon Jan 26 15:38:41 2015 -0500 + + Add bower package "material-design-iconic-font" + + We actually don't use "material-design-fonticons" + +M UI/WebServerResources/bower.json + +commit aaed279c503a1a8953d0b9743d2e012405f8d9e1 +Author: Francis Lachapelle +Date: Mon Jan 26 15:36:55 2015 -0500 + + Extend JSON response of calendar properties + +M UI/Scheduler/UIxCalendarSelector.m + +commit bd6a430d3ab3a8cda39d297f1fa569c6937e8115 +Author: Francis Lachapelle +Date: Mon Jan 26 11:13:46 2015 -0500 + + Add bower package "material-design-fonticons" + +M UI/WebServerResources/bower.json + +commit 746afe0f60930b434ffed132d3ee8683dd8c980e +Author: iRouge +Date: Mon Jan 26 03:57:02 2015 -0500 + + Add scss devtools + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/scss/_devtools.scss +M UI/WebServerResources/scss/_shame.scss +M UI/WebServerResources/scss/styles.scss + +commit 1b807bd6f30a48382d2a9c3c293ebb14296d4ad6 +Author: iRouge +Date: Mon Jan 26 02:42:01 2015 -0500 + + Icons to the message-template toolbar + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox + +commit 6e26040e19e8f715d92cded69b53640fa1a4182e +Author: iRouge +Date: Mon Jan 26 02:41:04 2015 -0500 + + Icon component (zavoloklom.github.io/material-design-iconic-font/index.html) + +A UI/WebServerResources/scss/components/icon/_extends.scss +D UI/WebServerResources/scss/components/icon/icon.js +M UI/WebServerResources/scss/components/icon/icon.scss +D UI/WebServerResources/scss/components/icon/icon.spec.js +M UI/WebServerResources/scss/styles.scss + +commit 6fde77ac3f81a2d11f7982b22d8b8b8336a3bc44 +Author: iRouge +Date: Mon Jan 26 00:13:09 2015 -0500 + + Bottombar visibility + +M UI/Templates/UIxPageFrame.wox + +commit 296e8f09e5a8a6755243d2451a05c104cc458ca6 +Author: iRouge +Date: Sun Jan 25 22:33:00 2015 -0500 + + Reformat code (indent) + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/Templates/UIxPageFrame.wox + +commit 3b43cabc687f61c6c7fc2f5083b93b806a66d840 +Author: iRouge +Date: Sun Jan 25 21:30:27 2015 -0500 + + Revert [a5ba017bc3] (Regression fix) + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/scss/views/_view.scss + +commit cc34d56a0e0b39fee7d6da1303d9f7584606f04d +Author: Francis Lachapelle +Date: Thu Jan 22 20:55:11 2015 -0500 + + FIx compilation of UIxMailUserRightsEditor.m + +M UI/MailerUI/UIxMailUserRightsEditor.m + +commit 6080e800d7661b914316bb1212f9f622d44e2a78 +Author: Francis Lachapelle +Date: Thu Jan 22 20:54:40 2015 -0500 + + Improve API documentation + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m + +commit f2587aa385de97b7273fd8fb8209b99d14a38cdc +Author: Francis Lachapelle +Date: Thu Jan 22 12:12:51 2015 -0500 + + JSON-based getter operations for Calendar module + +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxCalListingActions.m +M UI/Scheduler/UIxCalendarSelector.m +M UI/Scheduler/UIxTaskEditor.m + +commit cf8c4c482d7311076c4ee673e266a7790af47fd5 +Author: Francis Lachapelle +Date: Thu Jan 22 10:52:02 2015 -0500 + + Add static method in iCalPerson for partstate + +M SOPE/NGCards/iCalPerson.h +M SOPE/NGCards/iCalPerson.m + +commit 8986a18dacc28b539580f782db10ea0ed9572b75 +Author: Francis Lachapelle +Date: Thu Jan 22 09:21:21 2015 -0500 + + Review mail user rights editor + +M UI/MailerUI/UIxMailUserRightsEditor.m +M UI/Templates/MailerUI/UIxMailUserRightsEditor.wox + +commit 9829cd40275ba3cddee4b4431d4fd6175a28a887 +Author: Francis Lachapelle +Date: Thu Jan 22 09:20:18 2015 -0500 + + Minor improvements to Contacts user rights editor + +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox + +commit 2e2da46d844d342ac7be84c85775106df593de33 +Author: Francis Lachapelle +Date: Thu Jan 22 09:17:41 2015 -0500 + + JSON-based Contacts list: don't escape HTML + + HTML is now sanitized on the client-side by AngularJS. + +M UI/Contacts/UIxContactsListActions.m + +commit 37e91733ca4c11d5e5a1d4f44605018c21592601 +Author: Francis Lachapelle +Date: Thu Jan 22 09:15:44 2015 -0500 + + Improve API documentation + +M UI/Common/UIxFolderActions.m +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxContactView.m + +commit c29719f49ddc8a9286c48b795f45296e7b91ad37 +Author: Francis Lachapelle +Date: Thu Jan 22 06:50:31 2015 -0500 + + Remove newAction from UIx{Appointment,Task}Editor + + We now rely on [UIxFolderActions newguidAction] + +M UI/Common/UIxFolderActions.m +M UI/Scheduler/UIxAppointmentEditor.m +M UI/Scheduler/UIxTaskEditor.m +M UI/Scheduler/product.plist + +commit a5a2028da7bbdecab9b6ccf8d640d72606f93637 +Author: iRouge +Date: Wed Jan 21 18:38:07 2015 -0500 + + Contact Form + +M UI/Templates/ContactsUI/UIxContactEditorTemplate.wox + +commit b8ad85b2e2cc7ad44f6f87d2641bf62274035f9c +Author: Francis Lachapelle +Date: Wed Jan 21 16:40:26 2015 -0500 + + Rename ng-templates to match names of .wox files + +M UI/Common/UIxUserRightsEditor.m +M UI/Common/product.plist +M UI/Contacts/product.plist +M UI/MailerUI/product.plist +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactsUserRightsEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/MailerUI.js + +commit 50b45678e355531f2ed4ff0df25f8b40f1a186d9 +Author: iRouge +Date: Wed Jan 21 16:35:23 2015 -0500 + + Regression fix + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/scss/views/_view.scss + +commit bcce9ac76ab4e556ec55cb39cc26f4648abe4e57 +Author: iRouge +Date: Wed Jan 21 16:18:09 2015 -0500 + + Report body inline style in Sass + Create bottombar component + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +M UI/WebServerResources/scss/components/bottombar/_extends.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 137e8e7290e61f5b45193f8cfc24eca585dd2c5c +Author: Francis Lachapelle +Date: Wed Jan 21 14:46:36 2015 -0500 + + Add [iCal(Repeatable)EntityObject attribtues] + + Those methods are used to get the common attributes of a iCalendar + component (vEvent or vTodo). + +M SoObjects/Appointments/iCalEntityObject+SOGo.h +M SoObjects/Appointments/iCalEntityObject+SOGo.m +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.h +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m + +commit a22195beec138797d07747cbe2ad51b72c67bb33 +Author: Francis Lachapelle +Date: Wed Jan 21 14:18:38 2015 -0500 + + Add method [iCalTrigger asDictionary] + + This method is used to get a JSON representation of an alarm trigger. + +M SOPE/NGCards/iCalTrigger.h +M SOPE/NGCards/iCalTrigger.m + +commit 99af190e293ffab25052483146960aaf1fd1836d +Author: Francis Lachapelle +Date: Wed Jan 21 13:52:25 2015 -0500 + + Remove used .ttf font files + +D UI/WebServerResources/fonts/Ubuntu-BI.ttf +D UI/WebServerResources/fonts/Ubuntu-L.ttf +D UI/WebServerResources/fonts/Ubuntu-LI.ttf +D UI/WebServerResources/fonts/Ubuntu-M.ttf +D UI/WebServerResources/fonts/Ubuntu-MI.ttf +D UI/WebServerResources/fonts/Ubuntu-R.ttf +D UI/WebServerResources/fonts/Ubuntu-RI.ttf +D UI/WebServerResources/fonts/ubuntu-bi.ttf +D UI/WebServerResources/fonts/ubuntu-l.ttf +D UI/WebServerResources/fonts/ubuntu-li.ttf +D UI/WebServerResources/fonts/ubuntu-m.ttf +D UI/WebServerResources/fonts/ubuntu-mi.ttf +D UI/WebServerResources/fonts/ubuntu-r.ttf +D UI/WebServerResources/fonts/ubuntu-ri.ttf + +commit 01736318d83145d9dc6422b230801d62e728822d +Author: Francis Lachapelle +Date: Wed Jan 21 13:41:20 2015 -0500 + + Expose [iCalRecurrenceRule frequencyForValue:] + + This method was missing from its header file. + +M SOPE/NGCards/iCalRecurrenceRule.h + +commit f0108a5069dd65d730127f150a8c6fbed55d800a +Author: Francis Lachapelle +Date: Wed Jan 21 13:38:13 2015 -0500 + + Add method [iCalByDayMask asRuleArray] + + This method is used to get a JSON representation of a BYDAY attribute of + a recurrence rule. + +M SOPE/NGCards/iCalByDayMask.h +M SOPE/NGCards/iCalByDayMask.m + +commit f4f53ec21e03a0f71bb565eac1499c6841e941f9 +Author: iRouge +Date: Wed Jan 21 13:16:33 2015 -0500 + + Report body inline style in Sass + Create bottombar component + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/css/styles.css +M UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/scss/components/bottombar/_extends.scss +A UI/WebServerResources/scss/components/bottombar/_mixins.scss +A UI/WebServerResources/scss/components/bottombar/bottombar-theme.scss +A UI/WebServerResources/scss/components/bottombar/bottombar.scss +M UI/WebServerResources/scss/components/toolbar/toolbar.scss +D UI/WebServerResources/scss/core/_base_styles/_base_style.scss +D UI/WebServerResources/scss/core/_base_styles/_extends.scss +D UI/WebServerResources/scss/core/_base_styles/_functions.scss +D UI/WebServerResources/scss/core/_base_styles/_mixins.scss +A UI/WebServerResources/scss/core/base_styles/_base_style.scss +A UI/WebServerResources/scss/core/base_styles/_extends.scss +A UI/WebServerResources/scss/core/base_styles/_functions.scss +A UI/WebServerResources/scss/core/base_styles/_mixins.scss +M UI/WebServerResources/scss/grid/_manifest.scss +M UI/WebServerResources/scss/styles.scss + +commit 8e76c699dd2d2c33d9f9228126875b90fe2a5b96 +Author: iRouge +Date: Wed Jan 21 11:23:25 2015 -0500 + + Restructure Sass files and folders for proper application Sass development + +A UI/WebServerResources/css/styles.css +A UI/WebServerResources/css/styles.css.map +A UI/WebServerResources/fonts/_ubuntu.scss +A UI/WebServerResources/scss/core/reset.scss + +commit 256d5e1bac2b5914a26f469cb10a56cf6aa2f989 +Author: iRouge +Date: Wed Jan 21 11:20:59 2015 -0500 + + Restructure Sass files and folders for proper application Sass development + +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/bower.json +D UI/WebServerResources/css/components.css +D UI/WebServerResources/css/components.css.map +M UI/WebServerResources/scss/_shame.scss +M UI/WebServerResources/scss/core/variables.scss +M UI/WebServerResources/scss/styles.scss +M UI/WebServerResources/scss/views/_view.scss + +commit 5217c0ac6489fc0dd07e42ed0849a763a312c8b4 +Author: iRouge +Date: Wed Jan 21 11:18:53 2015 -0500 + + Restructure Sass files and folders for proper application Sass development + +D UI/WebServerResources/scss/ContactsUI.scss +D UI/WebServerResources/scss/MailerUI.scss +D UI/WebServerResources/scss/SOGoRootPage.scss +D UI/WebServerResources/scss/_functions.scss +A UI/WebServerResources/scss/_shame.scss +D UI/WebServerResources/scss/components.css.map +D UI/WebServerResources/scss/components.scss +D UI/WebServerResources/scss/components/_modules/_article-nav.scss +D UI/WebServerResources/scss/components/_modules/_articles-section.scss +D UI/WebServerResources/scss/components/_modules/_did-you-know.scss +D UI/WebServerResources/scss/components/_modules/_editorial-header.scss +D UI/WebServerResources/scss/components/_modules/_featured-section.scss +D UI/WebServerResources/scss/components/_modules/_featured-spotlight.scss +D UI/WebServerResources/scss/components/_modules/_guides-section.scss +D UI/WebServerResources/scss/components/_modules/_highlight.scss +D UI/WebServerResources/scss/components/_modules/_in-this-guide.scss +D UI/WebServerResources/scss/components/_modules/_next-lessons.scss +D UI/WebServerResources/scss/components/_modules/_page-header.scss +D UI/WebServerResources/scss/components/_modules/_quote.scss +D UI/WebServerResources/scss/components/_modules/_related-guides.scss +D UI/WebServerResources/scss/components/_modules/_related-items.scss +D UI/WebServerResources/scss/components/_modules/_summary-header.scss +D UI/WebServerResources/scss/components/_modules/_toc.scss +A UI/WebServerResources/scss/components/backdrop/backdrop-theme.scss +A UI/WebServerResources/scss/components/backdrop/backdrop.js +A UI/WebServerResources/scss/components/backdrop/backdrop.scss +A UI/WebServerResources/scss/components/bottomSheet/bottomSheet-theme.scss +A UI/WebServerResources/scss/components/bottomSheet/bottomSheet.js +A UI/WebServerResources/scss/components/bottomSheet/bottomSheet.scss +A UI/WebServerResources/scss/components/bottomSheet/bottomSheet.spec.js +A UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/bottom-sheet-grid-template.html +A UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/bottom-sheet-list-template.html +A UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/bottomSheet/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/button/button-theme.scss +A UI/WebServerResources/scss/components/button/button.js +A UI/WebServerResources/scss/components/button/button.scss +A UI/WebServerResources/scss/components/button/button.spec.js +A UI/WebServerResources/scss/components/button/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/button/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/button/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/card/card-theme.scss +A UI/WebServerResources/scss/components/card/card.js +A UI/WebServerResources/scss/components/card/card.scss +A UI/WebServerResources/scss/components/card/card.spec.js +A UI/WebServerResources/scss/components/card/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/card/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/card/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/checkbox/checkbox-theme.scss +A UI/WebServerResources/scss/components/checkbox/checkbox.js +A UI/WebServerResources/scss/components/checkbox/checkbox.scss +A UI/WebServerResources/scss/components/checkbox/checkbox.spec.js +A UI/WebServerResources/scss/components/checkbox/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/checkbox/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/checkbox/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/content/content-theme.scss +A UI/WebServerResources/scss/components/content/content.js +A UI/WebServerResources/scss/components/content/content.scss +A UI/WebServerResources/scss/components/content/content.spec.js +A UI/WebServerResources/scss/components/content/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/content/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/dialog/demoBasicUsage/dialog1.tmpl.html +A UI/WebServerResources/scss/components/dialog/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/dialog/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/dialog/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/dialog/dialog-theme.scss +A UI/WebServerResources/scss/components/dialog/dialog.js +A UI/WebServerResources/scss/components/dialog/dialog.scss +A UI/WebServerResources/scss/components/dialog/dialog.spec.js +A UI/WebServerResources/scss/components/divider/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/divider/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/divider/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/divider/divider-theme.scss +A UI/WebServerResources/scss/components/divider/divider.js +A UI/WebServerResources/scss/components/divider/divider.scss +A UI/WebServerResources/scss/components/icon/icon.js +A UI/WebServerResources/scss/components/icon/icon.scss +A UI/WebServerResources/scss/components/icon/icon.spec.js +A UI/WebServerResources/scss/components/input/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/input/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/input/input-theme.scss +A UI/WebServerResources/scss/components/input/input.js +A UI/WebServerResources/scss/components/input/input.scss +A UI/WebServerResources/scss/components/input/input.spec.js +A UI/WebServerResources/scss/components/list/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/list/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/list/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/list/list.js +A UI/WebServerResources/scss/components/list/list.scss +A UI/WebServerResources/scss/components/list/list.spec.js +A UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/progressCircular/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/progressCircular/progressCircular-theme.scss +A UI/WebServerResources/scss/components/progressCircular/progressCircular.js +A UI/WebServerResources/scss/components/progressCircular/progressCircular.scss +A UI/WebServerResources/scss/components/progressCircular/progressCircular.spec.js +A UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/progressLinear/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/progressLinear/progressLinear-theme.scss +A UI/WebServerResources/scss/components/progressLinear/progressLinear.js +A UI/WebServerResources/scss/components/progressLinear/progressLinear.scss +A UI/WebServerResources/scss/components/progressLinear/progressLinear.spec.js +A UI/WebServerResources/scss/components/radioButton/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/radioButton/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/radioButton/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/radioButton/radio-button-theme.scss +A UI/WebServerResources/scss/components/radioButton/radio-button.scss +A UI/WebServerResources/scss/components/radioButton/radioButton.js +A UI/WebServerResources/scss/components/radioButton/radioButton.spec.js +A UI/WebServerResources/scss/components/sidenav/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/sidenav/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/sidenav/sidenav-theme.scss +A UI/WebServerResources/scss/components/sidenav/sidenav.js +A UI/WebServerResources/scss/components/sidenav/sidenav.scss +A UI/WebServerResources/scss/components/sidenav/sidenav.spec.js +A UI/WebServerResources/scss/components/slider/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/slider/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/slider/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/slider/slider-theme.scss +A UI/WebServerResources/scss/components/slider/slider.js +A UI/WebServerResources/scss/components/slider/slider.scss +A UI/WebServerResources/scss/components/slider/slider.spec.js +A UI/WebServerResources/scss/components/sticky/sticky.js +A UI/WebServerResources/scss/components/sticky/sticky.scss +A UI/WebServerResources/scss/components/sticky/sticky.spec.js +A UI/WebServerResources/scss/components/subheader/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/subheader/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/subheader/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/subheader/subheader-theme.scss +A UI/WebServerResources/scss/components/subheader/subheader.js +A UI/WebServerResources/scss/components/subheader/subheader.scss +A UI/WebServerResources/scss/components/subheader/subheader.spec.js +A UI/WebServerResources/scss/components/swipe/swipe.js +A UI/WebServerResources/scss/components/switch/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/switch/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/switch/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/switch/switch-theme.scss +A UI/WebServerResources/scss/components/switch/switch.js +A UI/WebServerResources/scss/components/switch/switch.scss +A UI/WebServerResources/scss/components/switch/switch.spec.js +A UI/WebServerResources/scss/components/tabs/demoDynamicTabs/index.html +A UI/WebServerResources/scss/components/tabs/demoDynamicTabs/script.js +A UI/WebServerResources/scss/components/tabs/demoDynamicTabs/style.css +A UI/WebServerResources/scss/components/tabs/demoStaticTabs/index.html +A UI/WebServerResources/scss/components/tabs/demoStaticTabs/script.js +A UI/WebServerResources/scss/components/tabs/demoStaticTabs/style.css +A UI/WebServerResources/scss/components/tabs/js/inkBarDirective.js +A UI/WebServerResources/scss/components/tabs/js/paginationDirective.js +A UI/WebServerResources/scss/components/tabs/js/tabItemController.js +A UI/WebServerResources/scss/components/tabs/js/tabItemDirective.js +A UI/WebServerResources/scss/components/tabs/js/tabsController.js +A UI/WebServerResources/scss/components/tabs/js/tabsDirective.js +A UI/WebServerResources/scss/components/tabs/tabs-theme.scss +A UI/WebServerResources/scss/components/tabs/tabs.js +A UI/WebServerResources/scss/components/tabs/tabs.scss +A UI/WebServerResources/scss/components/tabs/tabs.spec.js +A UI/WebServerResources/scss/components/textField/textField-theme.scss +A UI/WebServerResources/scss/components/textField/textField.js +A UI/WebServerResources/scss/components/textField/textField.scss +A UI/WebServerResources/scss/components/textField/textField.spec.js +A UI/WebServerResources/scss/components/toast/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/toast/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/toast/demoBasicUsage/toast-template.html +A UI/WebServerResources/scss/components/toast/toast-theme.scss +A UI/WebServerResources/scss/components/toast/toast.js +A UI/WebServerResources/scss/components/toast/toast.scss +A UI/WebServerResources/scss/components/toast/toast.spec.js +A UI/WebServerResources/scss/components/toolbar/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/toolbar/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/toolbar/demoScrollShrink/index.html +A UI/WebServerResources/scss/components/toolbar/demoScrollShrink/script.js +A UI/WebServerResources/scss/components/toolbar/demoScrollShrink/style.css +A UI/WebServerResources/scss/components/toolbar/toolbar-theme.scss +A UI/WebServerResources/scss/components/toolbar/toolbar.js +A UI/WebServerResources/scss/components/toolbar/toolbar.scss +A UI/WebServerResources/scss/components/toolbar/toolbar.spec.js +A UI/WebServerResources/scss/components/tooltip/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/tooltip/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/tooltip/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/tooltip/tooltip-theme.scss +A UI/WebServerResources/scss/components/tooltip/tooltip.js +A UI/WebServerResources/scss/components/tooltip/tooltip.scss +A UI/WebServerResources/scss/components/tooltip/tooltip.spec.js +A UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/index.html +A UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/script.js +A UI/WebServerResources/scss/components/whiteframe/demoBasicUsage/style.css +A UI/WebServerResources/scss/components/whiteframe/whiteframe.js +A UI/WebServerResources/scss/components/whiteframe/whiteframe.scss +A UI/WebServerResources/scss/core/_base_styles/_base_style.scss +A UI/WebServerResources/scss/core/_base_styles/_extends.scss +A UI/WebServerResources/scss/core/_base_styles/_functions.scss +A UI/WebServerResources/scss/core/_base_styles/_mixins.scss +A UI/WebServerResources/scss/core/_functions.scss +A UI/WebServerResources/scss/core/layout.scss +A UI/WebServerResources/scss/core/mixins.scss +A UI/WebServerResources/scss/core/structure.scss +A UI/WebServerResources/scss/core/variables.scss +A UI/WebServerResources/scss/elements/_manifest.scss +A UI/WebServerResources/scss/grid/_manifest.scss +D UI/WebServerResources/scss/mobile.scss +A UI/WebServerResources/scss/modules/_article-nav.scss +A UI/WebServerResources/scss/modules/_articles-section.scss +A UI/WebServerResources/scss/modules/_did-you-know.scss +A UI/WebServerResources/scss/modules/_editorial-header.scss +A UI/WebServerResources/scss/modules/_featured-section.scss +A UI/WebServerResources/scss/modules/_featured-spotlight.scss +A UI/WebServerResources/scss/modules/_guides-section.scss +A UI/WebServerResources/scss/modules/_highlight.scss +A UI/WebServerResources/scss/modules/_in-this-guide.scss +A UI/WebServerResources/scss/modules/_next-lessons.scss +A UI/WebServerResources/scss/modules/_page-header.scss +A UI/WebServerResources/scss/modules/_quote.scss +A UI/WebServerResources/scss/modules/_related-guides.scss +A UI/WebServerResources/scss/modules/_related-items.scss +A UI/WebServerResources/scss/modules/_summary-header.scss +A UI/WebServerResources/scss/modules/_toc.scss +D UI/WebServerResources/scss/reset.css +A UI/WebServerResources/scss/styles.scss +A UI/WebServerResources/scss/themes/color-palette.scss +A UI/WebServerResources/scss/ui_patterns/_manifest.scss +D UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop.js +D UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop.scss +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.js +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.scss +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/bottom-sheet-grid-template.html +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/bottom-sheet-list-template.html +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/button/button-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/button/button.js +D UI/WebServerResources/scss/vendors/angular-material/components/button/button.scss +D UI/WebServerResources/scss/vendors/angular-material/components/button/button.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/card/card-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/card/card.js +D UI/WebServerResources/scss/vendors/angular-material/components/card/card.scss +D UI/WebServerResources/scss/vendors/angular-material/components/card/card.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.js +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.scss +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/content/content-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/content/content.js +D UI/WebServerResources/scss/vendors/angular-material/components/content/content.scss +D UI/WebServerResources/scss/vendors/angular-material/components/content/content.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/content/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/content/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/dialog1.tmpl.html +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.js +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.scss +D UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/divider/divider-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/divider/divider.js +D UI/WebServerResources/scss/vendors/angular-material/components/divider/divider.scss +D UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.js +D UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.scss +D UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/input/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/input/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/input/input-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/input/input.js +D UI/WebServerResources/scss/vendors/angular-material/components/input/input.scss +D UI/WebServerResources/scss/vendors/angular-material/components/input/input.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/list/list.js +D UI/WebServerResources/scss/vendors/angular-material/components/list/list.scss +D UI/WebServerResources/scss/vendors/angular-material/components/list/list.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.scss +D UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.js +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.scss +D UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radio-button-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radio-button.scss +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radioButton.js +D UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radioButton.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.js +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.scss +D UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/slider/slider-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.js +D UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.scss +D UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.js +D UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.scss +D UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.js +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.scss +D UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/swipe/swipe.js +D UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/switch/switch-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.js +D UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.scss +D UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/inkBarDirective.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/paginationDirective.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabItemController.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabItemDirective.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabsController.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabsDirective.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.js +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.scss +D UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/textField/textField-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.js +D UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.scss +D UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/toast-template.html +D UI/WebServerResources/scss/vendors/angular-material/components/toast/toast-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.js +D UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.scss +D UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.js +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.scss +D UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip-theme.scss +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.js +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.scss +D UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.spec.js +D UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/index.html +D UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/script.js +D UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/style.css +D UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/whiteframe.js +D UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/whiteframe.scss +D UI/WebServerResources/scss/vendors/angular-material/core/style/color-palette.scss +D UI/WebServerResources/scss/vendors/angular-material/core/style/layout.scss +D UI/WebServerResources/scss/vendors/angular-material/core/style/mixins.scss +D UI/WebServerResources/scss/vendors/angular-material/core/style/structure.scss +D UI/WebServerResources/scss/vendors/angular-material/core/style/variables.scss +A UI/WebServerResources/scss/views/ContactsUI.scss +A UI/WebServerResources/scss/views/MailerUI.scss +A UI/WebServerResources/scss/views/_view.scss + +commit a87bbc2de58d889417ed6b30eece291a087bd4ae +Author: Francis Lachapelle +Date: Fri Jan 16 23:31:55 2015 -0500 + + Enable toggleCtrl in Webmail + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit d3f0abf3ef5cb4b055b68790525575c1241434ef +Author: Francis Lachapelle +Date: Fri Jan 16 23:30:47 2015 -0500 + + Simplify links to modules in UIxPageFrame.wox + +M UI/Templates/UIxPageFrame.wox + +commit 9b73d4e9a5af36fd41e3009e6eca9e92b2d561ed +Author: Francis Lachapelle +Date: Fri Jan 16 23:29:33 2015 -0500 + + Add user identification in sgSettings constant + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/MailerUI.js + +commit 4f632174ce5f5c401e406ec472b8cdcefa7d39de +Author: Francis Lachapelle +Date: Fri Jan 16 23:26:59 2015 -0500 + + Initial integration of ngMaterial in Contacts + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 263ff962a14c99b607d5cf3228ce73a883beb177 +Author: Francis Lachapelle +Date: Fri Jan 16 23:23:53 2015 -0500 + + Update .gitignore + +M .gitignore + +commit b9414a77ab2741a71c313cf6a29604ed41f29516 +Author: Francis Lachapelle +Date: Fri Jan 16 23:22:59 2015 -0500 + + Move md theming config to ui.js (SOGo.UI) + +M UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/js/MailerUI.js + +commit f180617a3f1b04f72114567874f02e07867a3e2e +Author: iRouge +Date: Fri Jan 16 21:17:16 2015 -0500 + + Update Angular-material + +M UI/WebServerResources/angular-material + +commit 5919580b5d3ad91173baea4b60c41633699ae0f5 +Author: iRouge +Date: Fri Jan 16 09:33:46 2015 -0500 + + MODULE-TYPO + - Ajustements, message-view + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/css/components.css +M UI/WebServerResources/css/components.css.map +M UI/WebServerResources/scss/components.scss +M UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.scss +M UI/WebServerResources/scss/vendors/angular-material/core/style/structure.scss + +commit 25213605bb41b9b245cbaa0da81b8b9a9775ed74 +Author: iRouge +Date: Fri Jan 16 07:52:29 2015 -0500 + + MODULE-TYPO + - Sass set-up + - md-list + - md-theming (install) + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +A UI/WebServerResources/css/components.css +A UI/WebServerResources/css/components.css.map +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/scss/ContactsUI.scss +M UI/WebServerResources/scss/MailerUI.scss +M UI/WebServerResources/scss/SOGoRootPage.scss +A UI/WebServerResources/scss/_functions.scss +D UI/WebServerResources/scss/_settings.scss +A UI/WebServerResources/scss/components.css.map +A UI/WebServerResources/scss/components.scss +A UI/WebServerResources/scss/components/_components/_articles-list.scss +A UI/WebServerResources/scss/components/_components/_breadcrumb.scss +A UI/WebServerResources/scss/components/_components/_button.scss +A UI/WebServerResources/scss/components/_components/_column-list.scss +A UI/WebServerResources/scss/components/_components/_grid.scss +A UI/WebServerResources/scss/components/_components/_guides-list.scss +A UI/WebServerResources/scss/components/_components/_icon-circle.scss +A UI/WebServerResources/scss/components/_components/_icons.scss +A UI/WebServerResources/scss/components/_components/_link.scss +A UI/WebServerResources/scss/components/_components/_list.scss +A UI/WebServerResources/scss/components/_components/_media.scss +A UI/WebServerResources/scss/components/_components/_subsection-title.scss +A UI/WebServerResources/scss/components/_components/_table.scss +A UI/WebServerResources/scss/components/_components/_typography.scss +A UI/WebServerResources/scss/components/_modules/_article-nav.scss +A UI/WebServerResources/scss/components/_modules/_articles-section.scss +A UI/WebServerResources/scss/components/_modules/_did-you-know.scss +A UI/WebServerResources/scss/components/_modules/_editorial-header.scss +A UI/WebServerResources/scss/components/_modules/_featured-section.scss +A UI/WebServerResources/scss/components/_modules/_featured-spotlight.scss +A UI/WebServerResources/scss/components/_modules/_guides-section.scss +A UI/WebServerResources/scss/components/_modules/_highlight.scss +A UI/WebServerResources/scss/components/_modules/_in-this-guide.scss +A UI/WebServerResources/scss/components/_modules/_next-lessons.scss +A UI/WebServerResources/scss/components/_modules/_page-header.scss +A UI/WebServerResources/scss/components/_modules/_quote.scss +A UI/WebServerResources/scss/components/_modules/_related-guides.scss +A UI/WebServerResources/scss/components/_modules/_related-items.scss +A UI/WebServerResources/scss/components/_modules/_summary-header.scss +A UI/WebServerResources/scss/components/_modules/_toc.scss +A UI/WebServerResources/scss/components/_pages/_page-resources.scss +A UI/WebServerResources/scss/components/_pages/_styleguide.scss +A UI/WebServerResources/scss/components/_palette.scss +A UI/WebServerResources/scss/components/_utils.scss +A UI/WebServerResources/scss/reset.css +A UI/WebServerResources/scss/vendors/_compass.scss +A UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop.js +A UI/WebServerResources/scss/vendors/angular-material/components/backdrop/backdrop.scss +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.js +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.scss +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/bottomSheet.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/bottom-sheet-grid-template.html +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/bottom-sheet-list-template.html +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/bottomSheet/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/button/button-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/button/button.js +A UI/WebServerResources/scss/vendors/angular-material/components/button/button.scss +A UI/WebServerResources/scss/vendors/angular-material/components/button/button.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/button/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/card/card-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/card/card.js +A UI/WebServerResources/scss/vendors/angular-material/components/card/card.scss +A UI/WebServerResources/scss/vendors/angular-material/components/card/card.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/card/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.js +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.scss +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/checkbox.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/checkbox/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/content/content-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/content/content.js +A UI/WebServerResources/scss/vendors/angular-material/components/content/content.scss +A UI/WebServerResources/scss/vendors/angular-material/components/content/content.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/content/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/content/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/dialog1.tmpl.html +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.js +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.scss +A UI/WebServerResources/scss/vendors/angular-material/components/dialog/dialog.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/divider/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/divider/divider-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/divider/divider.js +A UI/WebServerResources/scss/vendors/angular-material/components/divider/divider.scss +A UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.js +A UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.scss +A UI/WebServerResources/scss/vendors/angular-material/components/icon/icon.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/input/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/input/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/input/input-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/input/input.js +A UI/WebServerResources/scss/vendors/angular-material/components/input/input.scss +A UI/WebServerResources/scss/vendors/angular-material/components/input/input.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/list/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/list/list.js +A UI/WebServerResources/scss/vendors/angular-material/components/list/list.scss +A UI/WebServerResources/scss/vendors/angular-material/components/list/list.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.scss +A UI/WebServerResources/scss/vendors/angular-material/components/progressCircular/progressCircular.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.js +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.scss +A UI/WebServerResources/scss/vendors/angular-material/components/progressLinear/progressLinear.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radio-button-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radio-button.scss +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radioButton.js +A UI/WebServerResources/scss/vendors/angular-material/components/radioButton/radioButton.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.js +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.scss +A UI/WebServerResources/scss/vendors/angular-material/components/sidenav/sidenav.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/slider/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/slider/slider-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.js +A UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.scss +A UI/WebServerResources/scss/vendors/angular-material/components/slider/slider.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.js +A UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.scss +A UI/WebServerResources/scss/vendors/angular-material/components/sticky/sticky.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.js +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.scss +A UI/WebServerResources/scss/vendors/angular-material/components/subheader/subheader.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/swipe/swipe.js +A UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/switch/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/switch/switch-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.js +A UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.scss +A UI/WebServerResources/scss/vendors/angular-material/components/switch/switch.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoDynamicTabs/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/demoStaticTabs/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/inkBarDirective.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/paginationDirective.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabItemController.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabItemDirective.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabsController.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/js/tabsDirective.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.js +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.scss +A UI/WebServerResources/scss/vendors/angular-material/components/tabs/tabs.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/textField/textField-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.js +A UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.scss +A UI/WebServerResources/scss/vendors/angular-material/components/textField/textField.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/toast/demoBasicUsage/toast-template.html +A UI/WebServerResources/scss/vendors/angular-material/components/toast/toast-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.js +A UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.scss +A UI/WebServerResources/scss/vendors/angular-material/components/toast/toast.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/demoScrollShrink/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.js +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.scss +A UI/WebServerResources/scss/vendors/angular-material/components/toolbar/toolbar.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip-theme.scss +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.js +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.scss +A UI/WebServerResources/scss/vendors/angular-material/components/tooltip/tooltip.spec.js +A UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/index.html +A UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/script.js +A UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/demoBasicUsage/style.css +A UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/whiteframe.js +A UI/WebServerResources/scss/vendors/angular-material/components/whiteframe/whiteframe.scss +A UI/WebServerResources/scss/vendors/angular-material/core/style/color-palette.scss +A UI/WebServerResources/scss/vendors/angular-material/core/style/layout.scss +A UI/WebServerResources/scss/vendors/angular-material/core/style/mixins.scss +A UI/WebServerResources/scss/vendors/angular-material/core/style/structure.scss +A UI/WebServerResources/scss/vendors/angular-material/core/style/variables.scss +A UI/WebServerResources/scss/vendors/compass/_configuration.scss +A UI/WebServerResources/scss/vendors/compass/_css3.scss +A UI/WebServerResources/scss/vendors/compass/_layout.scss +A UI/WebServerResources/scss/vendors/compass/_reset-legacy.scss +A UI/WebServerResources/scss/vendors/compass/_reset.scss +A UI/WebServerResources/scss/vendors/compass/_support.scss +A UI/WebServerResources/scss/vendors/compass/_typography.scss +A UI/WebServerResources/scss/vendors/compass/_utilities.scss +A UI/WebServerResources/scss/vendors/compass/css3/_animation.scss +A UI/WebServerResources/scss/vendors/compass/css3/_appearance.scss +A UI/WebServerResources/scss/vendors/compass/css3/_background-clip.scss +A UI/WebServerResources/scss/vendors/compass/css3/_background-origin.scss +A UI/WebServerResources/scss/vendors/compass/css3/_background-size.scss +A UI/WebServerResources/scss/vendors/compass/css3/_border-radius.scss +A UI/WebServerResources/scss/vendors/compass/css3/_box-shadow.scss +A UI/WebServerResources/scss/vendors/compass/css3/_box-sizing.scss +A UI/WebServerResources/scss/vendors/compass/css3/_box.scss +A UI/WebServerResources/scss/vendors/compass/css3/_columns.scss +A UI/WebServerResources/scss/vendors/compass/css3/_deprecated-support.scss +A UI/WebServerResources/scss/vendors/compass/css3/_filter.scss +A UI/WebServerResources/scss/vendors/compass/css3/_flexbox.scss +A UI/WebServerResources/scss/vendors/compass/css3/_font-face.scss +A UI/WebServerResources/scss/vendors/compass/css3/_hyphenation.scss +A UI/WebServerResources/scss/vendors/compass/css3/_images.scss +A UI/WebServerResources/scss/vendors/compass/css3/_inline-block.scss +A UI/WebServerResources/scss/vendors/compass/css3/_opacity.scss +A UI/WebServerResources/scss/vendors/compass/css3/_pie.scss +A UI/WebServerResources/scss/vendors/compass/css3/_regions.scss +A UI/WebServerResources/scss/vendors/compass/css3/_selection.scss +A UI/WebServerResources/scss/vendors/compass/css3/_shared.scss +A UI/WebServerResources/scss/vendors/compass/css3/_text-shadow.scss +A UI/WebServerResources/scss/vendors/compass/css3/_transform.scss +A UI/WebServerResources/scss/vendors/compass/css3/_transition.scss +A UI/WebServerResources/scss/vendors/compass/css3/_user-interface.scss +A UI/WebServerResources/scss/vendors/compass/layout/_grid-background.scss +A UI/WebServerResources/scss/vendors/compass/layout/_sticky-footer.scss +A UI/WebServerResources/scss/vendors/compass/layout/_stretching.scss +A UI/WebServerResources/scss/vendors/compass/reset/_utilities-legacy.scss +A UI/WebServerResources/scss/vendors/compass/reset/_utilities.scss +A UI/WebServerResources/scss/vendors/compass/typography/_links.scss +A UI/WebServerResources/scss/vendors/compass/typography/_lists.scss +A UI/WebServerResources/scss/vendors/compass/typography/_text.scss +A UI/WebServerResources/scss/vendors/compass/typography/_units.scss +A UI/WebServerResources/scss/vendors/compass/typography/_vertical_rhythm.scss +A UI/WebServerResources/scss/vendors/compass/typography/links/_hover-link.scss +A UI/WebServerResources/scss/vendors/compass/typography/links/_link-colors.scss +A UI/WebServerResources/scss/vendors/compass/typography/links/_unstyled-link.scss +A UI/WebServerResources/scss/vendors/compass/typography/lists/_bullets.scss +A UI/WebServerResources/scss/vendors/compass/typography/lists/_horizontal-list.scss +A UI/WebServerResources/scss/vendors/compass/typography/lists/_inline-block-list.scss +A UI/WebServerResources/scss/vendors/compass/typography/lists/_inline-list.scss +A UI/WebServerResources/scss/vendors/compass/typography/text/_ellipsis.scss +A UI/WebServerResources/scss/vendors/compass/typography/text/_force-wrap.scss +A UI/WebServerResources/scss/vendors/compass/typography/text/_nowrap.scss +A UI/WebServerResources/scss/vendors/compass/typography/text/_replacement.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_color.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_general.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_links.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_lists.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_print.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_sass.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_sprites.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_tables.scss +A UI/WebServerResources/scss/vendors/compass/utilities/_text.scss +A UI/WebServerResources/scss/vendors/compass/utilities/color/_brightness.scss +A UI/WebServerResources/scss/vendors/compass/utilities/color/_contrast.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_clearfix.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_float.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_hacks.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_min.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_reset.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_tabs.scss +A UI/WebServerResources/scss/vendors/compass/utilities/general/_tag-cloud.scss +A UI/WebServerResources/scss/vendors/compass/utilities/links/_hover-link.scss +A UI/WebServerResources/scss/vendors/compass/utilities/links/_link-colors.scss +A UI/WebServerResources/scss/vendors/compass/utilities/links/_unstyled-link.scss +A UI/WebServerResources/scss/vendors/compass/utilities/lists/_bullets.scss +A UI/WebServerResources/scss/vendors/compass/utilities/lists/_horizontal-list.scss +A UI/WebServerResources/scss/vendors/compass/utilities/lists/_inline-block-list.scss +A UI/WebServerResources/scss/vendors/compass/utilities/lists/_inline-list.scss +A UI/WebServerResources/scss/vendors/compass/utilities/sass/_lists.scss +A UI/WebServerResources/scss/vendors/compass/utilities/sass/_maps.scss +A UI/WebServerResources/scss/vendors/compass/utilities/sprites/_base.scss +A UI/WebServerResources/scss/vendors/compass/utilities/sprites/_sprite-img.scss +A UI/WebServerResources/scss/vendors/compass/utilities/tables/_alternating-rows-and-columns.scss +A UI/WebServerResources/scss/vendors/compass/utilities/tables/_borders.scss +A UI/WebServerResources/scss/vendors/compass/utilities/tables/_scaffolding.scss +A UI/WebServerResources/scss/vendors/compass/utilities/text/_ellipsis.scss +A UI/WebServerResources/scss/vendors/compass/utilities/text/_nowrap.scss +A UI/WebServerResources/scss/vendors/compass/utilities/text/_replacement.scss + +commit c7309d7dc8e3f4146a4567c38d1792d278441651 +Author: iRouge +Date: Wed Jan 14 11:36:10 2015 -0500 + + Views tweaking and todos + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit 7e2c60e495bc57be741f9a240815064726206e9d +Author: iRouge +Date: Wed Jan 14 03:13:24 2015 -0500 + + Should had been include with preceeding + +M UI/Templates/UIxPageFrame.wox + +commit a98320783f1f09632fc5a03901cfd76ccda4fc5e +Author: iRouge +Date: Wed Jan 14 03:11:47 2015 -0500 + + Fought with ms-layouts (and they won) + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit c196e11fdea4d1997c1c86b10c357d248e093b8d +Author: iRouge +Date: Tue Jan 13 22:49:03 2015 -0500 + + Correct Bottom-Bar Buttons url + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/UIxPageFrame.wox + +commit 414f0fbb26d561bad14c854743cc3cd030c85398 +Author: iRouge +Date: Tue Jan 13 16:24:42 2015 -0500 + + Rows adjustments + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox + +commit 8286fb68a4da78ffd01fb6f7ad7da85cf52f4e50 +Author: Francis Lachapelle +Date: Tue Jan 13 11:30:23 2015 -0500 + + Improve JSON API documentation + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxFolderActions.m +M UI/Common/UIxObjectActions.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MainUI/SOGoUserHomePage.m +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/user-model.js + +commit 64615ea6faa65c849c6e59350df79be771cb57fe +Author: Francis Lachapelle +Date: Mon Jan 12 21:54:35 2015 -0500 + + Update .gitignore + +M .gitignore + +commit aa64e86a43d2085b32acd22ec3a608255f36a2f8 +Author: iRouge +Date: Mon Jan 12 15:20:10 2015 -0500 + + Theme css & fonts + +A UI/WebServerResources/css/ContactsUI.css +A UI/WebServerResources/css/MailerUI.css +A UI/WebServerResources/css/SOGoRootPage.css +A UI/WebServerResources/css/angular-material.css +A UI/WebServerResources/css/angular-material.min.css +A UI/WebServerResources/css/app.css +A UI/WebServerResources/css/blue-grey-theme.css +A UI/WebServerResources/css/default-theme.css +A UI/WebServerResources/css/mobile.css +A UI/WebServerResources/css/ng-tags-input.bootstrap.css +A UI/WebServerResources/css/ng-tags-input.bootstrap.min.css +A UI/WebServerResources/css/ng-tags-input.css +A UI/WebServerResources/css/ng-tags-input.min.css +A UI/WebServerResources/css/themes/amber-theme.css +A UI/WebServerResources/css/themes/blue-theme.css +A UI/WebServerResources/css/themes/brown-theme.css +A UI/WebServerResources/css/themes/cyan-theme.css +A UI/WebServerResources/css/themes/deep-orange-theme.css +A UI/WebServerResources/css/themes/deep-purple-theme.css +A UI/WebServerResources/css/themes/green-theme.css +A UI/WebServerResources/css/themes/grey-theme.css +A UI/WebServerResources/css/themes/indigo-theme.css +A UI/WebServerResources/css/themes/light-blue-dark-theme.css +A UI/WebServerResources/css/themes/light-green-theme.css +A UI/WebServerResources/css/themes/lime-theme.css +A UI/WebServerResources/css/themes/orange-theme.css +A UI/WebServerResources/css/themes/pink-theme.css +A UI/WebServerResources/css/themes/purple-theme.css +A UI/WebServerResources/css/themes/red-theme.css +A UI/WebServerResources/css/themes/teal-theme.css +A UI/WebServerResources/css/themes/yellow-theme.css +A UI/WebServerResources/css/ubuntu.css +A UI/WebServerResources/fonts/Ubuntu-BI.ttf +A UI/WebServerResources/fonts/Ubuntu-C.ttf +A UI/WebServerResources/fonts/Ubuntu-L.ttf +A UI/WebServerResources/fonts/Ubuntu-LI.ttf +A UI/WebServerResources/fonts/Ubuntu-M.ttf +A UI/WebServerResources/fonts/Ubuntu-MI.ttf +A UI/WebServerResources/fonts/Ubuntu-R.ttf +A UI/WebServerResources/fonts/Ubuntu-RI.ttf +A UI/WebServerResources/fonts/ionicons.eot +A UI/WebServerResources/fonts/ionicons.svg +A UI/WebServerResources/fonts/ionicons.ttf +A UI/WebServerResources/fonts/ionicons.woff +A UI/WebServerResources/fonts/ubuntu-b.eot +A UI/WebServerResources/fonts/ubuntu-b.svg +A UI/WebServerResources/fonts/ubuntu-b.ttf +A UI/WebServerResources/fonts/ubuntu-b.woff +A UI/WebServerResources/fonts/ubuntu-b.woff2 +A UI/WebServerResources/fonts/ubuntu-bi.eot +A UI/WebServerResources/fonts/ubuntu-bi.svg +A UI/WebServerResources/fonts/ubuntu-bi.ttf +A UI/WebServerResources/fonts/ubuntu-bi.woff +A UI/WebServerResources/fonts/ubuntu-bi.woff2 +A UI/WebServerResources/fonts/ubuntu-l.eot +A UI/WebServerResources/fonts/ubuntu-l.svg +A UI/WebServerResources/fonts/ubuntu-l.ttf +A UI/WebServerResources/fonts/ubuntu-l.woff +A UI/WebServerResources/fonts/ubuntu-l.woff2 +A UI/WebServerResources/fonts/ubuntu-li.eot +A UI/WebServerResources/fonts/ubuntu-li.svg +A UI/WebServerResources/fonts/ubuntu-li.ttf +A UI/WebServerResources/fonts/ubuntu-li.woff +A UI/WebServerResources/fonts/ubuntu-li.woff2 +A UI/WebServerResources/fonts/ubuntu-m.eot +A UI/WebServerResources/fonts/ubuntu-m.svg +A UI/WebServerResources/fonts/ubuntu-m.ttf +A UI/WebServerResources/fonts/ubuntu-m.woff +A UI/WebServerResources/fonts/ubuntu-m.woff2 +A UI/WebServerResources/fonts/ubuntu-mi.eot +A UI/WebServerResources/fonts/ubuntu-mi.svg +A UI/WebServerResources/fonts/ubuntu-mi.ttf +A UI/WebServerResources/fonts/ubuntu-mi.woff +A UI/WebServerResources/fonts/ubuntu-mi.woff2 +A UI/WebServerResources/fonts/ubuntu-r.eot +A UI/WebServerResources/fonts/ubuntu-r.svg +A UI/WebServerResources/fonts/ubuntu-r.ttf +A UI/WebServerResources/fonts/ubuntu-r.woff +A UI/WebServerResources/fonts/ubuntu-r.woff2 +A UI/WebServerResources/fonts/ubuntu-ri.eot +A UI/WebServerResources/fonts/ubuntu-ri.svg +A UI/WebServerResources/fonts/ubuntu-ri.ttf +A UI/WebServerResources/fonts/ubuntu-ri.woff +A UI/WebServerResources/fonts/ubuntu-ri.woff2 + +commit 2cd39205322269db699a3cf78f1791803c7299bd +Author: Francis Lachapelle +Date: Mon Jan 12 15:00:08 2015 -0500 + + Add angular-material as a git module + +A .gitmodules +A UI/WebServerResources/angular-material + +commit 23bd56a8543ce2f348c93a078df325a17b954178 +Author: Benoit Favreault +Date: Mon Jan 12 14:41:09 2015 -0500 + + Edit gitignore (add .idea) + +M .gitignore + +commit 307d38c13d6d5dfd73e5fc6a36c67b51f7fb5c5d +Author: Francis Lachapelle +Date: Mon Jan 12 11:06:47 2015 -0500 + + Populate bottom navigation bar + +M UI/Templates/UIxPageFrame.wox + +commit f1490e7b9273843be2e2411e35c09e92fe800ca9 +Author: Francis Lachapelle +Date: Fri Jan 9 15:58:11 2015 -0500 + + Initial integration of ngMaterial in Webmail + +M UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/Common/ui-desktop.js +A UI/WebServerResources/js/Common/ui.js +M UI/WebServerResources/js/MailerUI.js + +commit 8148209fc883ef4eab298af188201dae17313132 +Author: Francis Lachapelle +Date: Fri Jan 9 07:14:13 2015 -0500 + + Improve instanciation of Resource in Card model + +M UI/WebServerResources/js/Contacts/card-model.js + +commit f3597616ea0c4fed61e8e0fd67138df6393cb933 +Author: Francis Lachapelle +Date: Thu Jan 8 16:12:29 2015 -0500 + + Minor improvements to SOGo.ContactsUI ng module + +M UI/WebServerResources/js/ContactsUI.js + +commit 34d7a3bf528dfa2255e247e1af5b10047bc20ed2 +Author: Francis Lachapelle +Date: Thu Jan 8 16:11:07 2015 -0500 + + Improve error handling in JavaScript promises + +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Contacts/addressbook-model.js + +commit 1a1d51f4271423f645b5d1ea3452e8e80bf73fd4 +Author: Francis Lachapelle +Date: Thu Jan 8 16:09:19 2015 -0500 + + Contacts module: optimize ng-repeat directives + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 0d9c78c60bdbe34ba6464f76147ccf6f8181c120 +Author: Francis Lachapelle +Date: Thu Jan 8 16:08:26 2015 -0500 + + Contacts module: add tooltips to icon buttons + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit 2644dc930517df9f2a09a9a66507c0503b6d510f +Author: Francis Lachapelle +Date: Thu Jan 8 11:52:10 2015 -0500 + + Webmail: add possibility to rename a mailbox + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/MailerUI.js + +commit c00e09f40bad7862f345b8529794aea5a30c8fa0 +Author: Francis Lachapelle +Date: Thu Jan 8 11:31:24 2015 -0500 + + JSONify [UIxMailFolderActions renameFolderAction] + + This commit also introduces an initial effort to have a documentation + for the JSON-based Web API following the apiDoc format + (http://apidocjs.com/). + +M UI/MailerUI/UIxMailFolderActions.m + +commit 3526cadc96b561fe10495dff4f57250716b018bd +Author: Francis Lachapelle +Date: Tue Jan 6 15:41:20 2015 -0500 + + Webmail: add "load images" button to mail viewer + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit c514cb64bc55d6048743691a3ab8d207adce692f +Author: Francis Lachapelle +Date: Tue Jan 6 12:09:14 2015 -0500 + + Webmail: Add forward button to messages + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 225c998a9791352e00648f39078bdab85f0a86d9 +Author: Francis Lachapelle +Date: Tue Jan 6 12:04:20 2015 -0500 + + Add CC field to mail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox + +commit 90f07c28f91f6795deb68a58f450c44c58931c7b +Author: Francis Lachapelle +Date: Tue Jan 6 12:03:39 2015 -0500 + + JSONify [UIxMailActions forwardAction] + +M UI/MailerUI/UIxMailActions.m + +commit ad012cfd60486476730b1bbe1adfc9e17b4d2283 +Author: Francis Lachapelle +Date: Tue Jan 6 11:59:35 2015 -0500 + + Save message to IMAP server before saving plist + + By first appending the message to the mailbox, we obtain the IMAP ID and + save it to the local plist. Having the message ID, we can delete it when + saving/appending a new version of the draft to the mailbox. + +M SoObjects/Mailer/SOGoDraftObject.m + +commit 5bbdecbec25af6b2c6ce59dec16755c1968ae167 +Author: Francis Lachapelle +Date: Mon Jan 5 22:34:12 2015 -0500 + + Webmail: add reply button + +M UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 9065a8038a4ebe114e7b97199601132f3016a1a0 +Author: Francis Lachapelle +Date: Mon Jan 5 22:29:00 2015 -0500 + + JSONify [UIxMailActions replyToAll:] + +M UI/MailerUI/UIxMailActions.m + +commit 8c2bcc92b5dc82bcd705b5e7572e8389dc604bc9 +Author: Francis Lachapelle +Date: Fri Dec 19 07:56:43 2014 -0500 + + Update JavaScript dependencies + + Upgrading to AngularJS 1.3. + +M UI/WebServerResources/bower.json + +commit bc86ff1e0415554efa82f701101c540c417d28ce +Author: Francis Lachapelle +Date: Thu Dec 18 16:30:59 2014 -0500 + + Fix position of new or renamed addressbook + +M UI/WebServerResources/js/Contacts/addressbook-model.js + +commit 4248cbcb16d3dceaa389d38037036c77d247eba1 +Author: Francis Lachapelle +Date: Thu Dec 18 16:30:17 2014 -0500 + + Webmail: new option to create subfolder + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/mailbox-model.js + +commit 2d076358d3a286226046d5b2182a9444c3da7e27 +Author: Francis Lachapelle +Date: Thu Dec 18 15:22:29 2014 -0500 + + Improve Mail module + + - JSONinfied mail folder create and delete actions + - restored sgFolderTree directive + - extended folder types with "shared" and "otherUsers" + - added mailbox creation at the account level + +M SoObjects/Mailer/SOGoMailAccount.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/scss/MailerUI.scss + +commit 2d026b5ca5e692a917057aba9bd85faac9a77fb8 +Author: Francis Lachapelle +Date: Thu Dec 18 13:50:32 2014 -0500 + + JSONify [UIxMailFolderActions createFolderAction] + +M UI/MailerUI/UIxMailFolderActions.h +M UI/MailerUI/UIxMailFolderActions.m + +commit b5528820117649c874c35628d4b860079a0bbb59 +Author: Francis Lachapelle +Date: Wed Dec 17 15:04:19 2014 -0500 + + Fix template reference when creating new card + +M UI/WebServerResources/js/ContactsUI.js + +commit de273973b4a701fa6cc88a1b9ab1cb285e14b717 +Author: Francis Lachapelle +Date: Wed Dec 17 14:58:20 2014 -0500 + + Add wox templates to Mail and Contacts modules + +M UI/Contacts/UIxContactFoldersView.m +M UI/Contacts/product.plist +M UI/MailerUI/UIxMailMainFrame.m +M UI/MailerUI/product.plist +A UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +A UI/Templates/ContactsUI/UIxContactViewTemplate.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +A UI/Templates/MailerUI/UIxMailFolderTemplate.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +A UI/Templates/MailerUI/UIxMailViewTemplate.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 3aec2828b4dc67956096b73dbfd8b24f4adc7665 +Author: Francis Lachapelle +Date: Wed Dec 17 14:08:43 2014 -0500 + + Improve JavaScript of Mail module + + - activated file uploader of mail editor + - renamed method $update to $reload + - automatically mark messages as read + - use ui-sref-active from ui-router instead of ng-class + +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/js/mobile/MailerUI.js +M UI/WebServerResources/scss/MailerUI.scss + +commit 533d7110c7e7a735a2dced117e093d4a5e6df688 +Author: Francis Lachapelle +Date: Tue Dec 16 15:47:34 2014 -0500 + + Improve webmail editor + + - Fixed handling of saving drafts + - Fixed handling of message type (HTML/plain) + - Added primitive handling of attachments + +M UI/MailerUI/UIxMailAccountActions.m +M UI/MailerUI/UIxMailEditor.m +M UI/MailerUI/UIxMailView.m +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/Mailer/message-model.js + +commit 32196b56db70e6eff7745e6e311c2623a9fba6c7 +Author: Francis Lachapelle +Date: Tue Dec 16 14:26:31 2014 -0500 + + Fix short formatting of cards for mail editor + +M UI/WebServerResources/js/Contacts/card-model.js + +commit 5db79ce218f6e95d7ba9b79fe1d983c5c6551b58 +Author: Francis Lachapelle +Date: Tue Dec 16 11:47:10 2014 -0500 + + Mail draft: use JSON in edit action + +M UI/MailerUI/UIxMailActions.m + +commit 9e97c11401bf87e2a699385d40a795ca583e59d5 +Author: Francis Lachapelle +Date: Tue Dec 16 11:45:40 2014 -0500 + + Don't store draft on disk when not required + +M SoObjects/Mailer/SOGoDraftObject.m + +commit af096919648193aa99f0085e2bacfdbec645dcb6 +Author: Francis Lachapelle +Date: Fri Dec 12 13:39:02 2014 -0500 + + Auto-completion of mail addresses in mail editor + +M UI/MailerUI/English.lproj/Localizable.strings +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/MailerUI.js + +commit fe41798b1943e3d913122021c84034b2e6ce934e +Author: Francis Lachapelle +Date: Thu Dec 11 21:52:46 2014 -0500 + + Fix handling of recipient addresses in mail editor + +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js + +commit 09d469927ffe9f3dbbac16733cee88e3ae3efe03 +Author: Francis Lachapelle +Date: Thu Dec 11 21:11:20 2014 -0500 + + Add tags input to edit mail recipients + +M UI/MailerUI/UIxMailEditor.m +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/MailerUI.js + +commit e01e0adac87645ee50f04cc9bd8bf3f365b0d8ce +Author: Francis Lachapelle +Date: Thu Dec 11 14:48:32 2014 -0500 + + Fix mailto links in mail viewer + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit fb636895732849ed679e1e91b363935029ecff28 +Author: Francis Lachapelle +Date: Thu Dec 11 11:24:22 2014 -0500 + + Initial mail editor + +M UI/MailerUI/UIxMailAccountActions.m +M UI/MailerUI/UIxMailEditor.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailView.m +M UI/MailerUI/product.plist +M UI/Templates/MailerUI/UIxMailEditor.wox +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js +A UI/WebServerResources/js/vendor/ckeditor/ck.js +M UI/WebServerResources/scss/MailerUI.scss + +commit 74177e4d042fb1ff935e118b2a41bab87d15cf91 +Author: Francis Lachapelle +Date: Thu Dec 11 09:15:33 2014 -0500 + + Change key for envelope addresses metadata + +M UI/MailerUI/UIxEnvelopeAddressFormatter.m +M UI/WebServerResources/js/Mailer/message-model.js + +commit ac06a4d4ce513aec609ce7a50c3de8f4532c2936 +Author: Francis Lachapelle +Date: Thu Dec 11 08:23:15 2014 -0500 + + Fix detection of mailbox type + +M SoObjects/Mailer/SOGoMailAccount.m + +commit fd40cb71ac6eab9b6b900e1b09d164ccb51084e1 +Author: Francis Lachapelle +Date: Fri Dec 5 23:14:47 2014 -0500 + + Fix premature nil in JSON dict of UIxMailView.m + +M UI/MailerUI/UIxMailView.m + +commit df019f515f459c76856a555bec77025726a934eb +Author: Francis Lachapelle +Date: Fri Dec 5 22:49:08 2014 -0500 + + Webmail: normalize format of addresses in JSON + +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/UIxMailView.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/scss/MailerUI.scss + +commit 5a106e1613f392baf2589d8048ae43a5718353b2 +Author: Francis Lachapelle +Date: Fri Dec 5 22:05:52 2014 -0500 + + Address formatter returns metadata as a dictionary + +M UI/MailerUI/UIxEnvelopeAddressFormatter.m +M UI/MailerUI/UIxMailFormatter.h + +commit 6d899008caecfa37ddd6ee4e0b267520854cb5e3 +Author: Francis Lachapelle +Date: Fri Dec 5 21:56:54 2014 -0500 + + Improve SOGoDraftObject to avoid crash when saving + +M SoObjects/Mailer/SOGoDraftObject.m + +commit ee1f56ad2730cc1b00625cfaff17dcbcbec7a444 +Author: Francis Lachapelle +Date: Tue Dec 2 09:45:01 2014 -0500 + + Improve sgFolderTree directive for mobile + +M UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Common/ui-mobile.js +M UI/WebServerResources/js/mobile/MailerUI.js + +commit 61e25184fca1ce0f2f5d6c0c066b71c2d56d19e9 +Author: Ludovic Marcotte +Date: Sun Nov 30 08:50:26 2014 -0500 + + Added Delete and Export features for mailboxes. Initial work for the mobile version. + +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/account-model.js +M UI/WebServerResources/js/Mailer/mailbox-model.js +M UI/WebServerResources/js/MailerUI.js +M UI/WebServerResources/js/mobile/MailerUI.js +M UI/WebServerResources/scss/MailerUI.scss + +commit 4e9a187c854eea67b1f448f60c7638019e178dec +Author: Francis Lachapelle +Date: Fri Nov 28 11:20:49 2014 -0500 + + Fix resolution of mailboxes with a special purpose + +M SoObjects/Mailer/SOGoMailAccount.m + +commit 60ae5f0eb22b2cc4bab82dfd27ebfea7a287d11f +Author: Francis Lachapelle +Date: Thu Nov 27 15:20:02 2014 -0500 + + Improve CSS of AddressBook module + +M UI/WebServerResources/scss/ContactsUI.scss + +commit 28f7811e86b3d8dcb17431c6fa8032879e1a37ab +Author: Francis Lachapelle +Date: Thu Nov 27 15:09:12 2014 -0500 + + Improve CSS of AddressBook module + +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 876b21437f361f32edca011fff3f81eef96f789f +Author: Francis Lachapelle +Date: Thu Nov 27 09:24:26 2014 -0500 + + Fix JavaScript of login page of mobile version + +M UI/WebServerResources/js/mobile/SOGoRootPage.js + +commit 1ca1a8c249177f1f9bb7718491fafcc5a07d55bd +Author: Francis Lachapelle +Date: Thu Nov 27 08:58:33 2014 -0500 + + Add mobile version to webmail and improvements + +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/UIxMailView.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +A UI/Templates/Themes/mobile/MailerUI/UIxMailMainFrame.wox +M UI/WebServerResources/js/Mailer/message-model.js +M UI/WebServerResources/js/MailerUI.js +A UI/WebServerResources/js/mobile/MailerUI.js +M UI/WebServerResources/scss/MailerUI.scss +M UI/WebServerResources/scss/mobile.scss + +commit cdd113169953203696c14fa79b85f3fc89ddcf6b +Author: Francis Lachapelle +Date: Tue Nov 25 22:34:09 2014 -0500 + + Add sgFocus directive + factory + +M UI/WebServerResources/js/MailerUI.js + +commit 6ce64828e8c3a303a37af576b4cc02254e397801 +Author: Francis Lachapelle +Date: Tue Nov 25 22:31:52 2014 -0500 + + AngularJS module SOGo.MailerUI + +A UI/WebServerResources/js/MailerUI.js + +commit 1fc15061ed7ea509d044d8c959544a740a7bc23b +Author: Francis Lachapelle +Date: Tue Nov 25 16:35:01 2014 -0500 + + Webmail: Use a relative date in messages list + +M UI/MailerUI/English.lproj/Localizable.strings +M UI/MailerUI/UIxMailListActions.h +M UI/MailerUI/UIxMailListActions.m + +commit 0ee725b94552ef19207cca16203956ef67b799c2 +Author: Francis Lachapelle +Date: Tue Nov 25 16:13:53 2014 -0500 + + Contacts JS models: improve documentation + +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js + +commit 2f17e94fef3c2f2ca98a27abd0b99e17e024686e +Author: Francis Lachapelle +Date: Tue Nov 25 16:09:55 2014 -0500 + + Initial AngularJS version of Webmail (desktop) + +M SoObjects/SOGo/SOGoUser.m +M UI/Templates/MailerUI/UIxMailMainFrame.wox +M UI/Templates/UIxAclEditor.wox +M UI/Templates/UIxPageFrame.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/ui-common.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Common/utils.js +A UI/WebServerResources/js/Mailer/account-model.js +A UI/WebServerResources/js/Mailer/mailbox-model.js +A UI/WebServerResources/js/Mailer/message-model.js +A UI/WebServerResources/scss/MailerUI.scss + +commit 1c9da902d3d8a56abb1123b0b2c935d28efe3406 +Author: Francis Lachapelle +Date: Tue Nov 25 09:57:08 2014 -0500 + + Add JSON payload to webmail "headers" action + +M UI/MailerUI/UIxMailListActions.m + +commit 7e11806bf924b0d2e0683442b39c8a2abd6ca5d2 +Author: Ludovic Marcotte +Date: Tue Nov 25 09:36:24 2014 -0500 + + We can now show links to the address book + +M UI/Contacts/UIxContactFoldersView.m +M UI/Contacts/UIxContactsListActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit f2efd3fb492ca039392f4f5de14a7dbfcfbc3e8a +Author: Francis Lachapelle +Date: Mon Nov 24 13:26:48 2014 -0500 + + Add new AngularJS modules + + - external module for recursion + - external module for virtual scrolling + - internal module for common UI services + +M UI/Templates/UIxPageFrame.wox + +commit 54444ddf3ba0fcd2134741a84053bb2bba38951e +Author: Francis Lachapelle +Date: Mon Nov 24 13:25:56 2014 -0500 + + AngularJS SOGo.UICommon module + +A UI/WebServerResources/js/Common/ui-common.js + +commit a64a8172beeb3ed085e8599503a68c8d0e7631d7 +Author: Francis Lachapelle +Date: Sun Nov 23 01:20:27 2014 -0500 + + Webmail: include all accounts metadata + +M UI/MailerUI/UIxMailMainFrame.m + +commit 3b4731d6b72356b1bb1d6cb00cf1b9dccfeaca9c +Author: Francis Lachapelle +Date: Sun Nov 23 01:17:51 2014 -0500 + + Add virtual scrolling AngularJS module + + Integrated virtual scrolling in contacts. + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/ContactsUI.js + +commit 2cb5aecdcb49fe7bc1e43f41db0ad0fb1e880f03 +Author: Francis Lachapelle +Date: Sun Nov 23 01:09:04 2014 -0500 + + Add sgFolderTree directive + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/ui-mobile.js + +commit 277bdd2b1c8b1c2b082716b3a0cd138c6f9254f9 +Author: Francis Lachapelle +Date: Fri Nov 21 15:50:01 2014 -0500 + + Mailer: replace HTML view by JSON object + +M UI/MailerUI/UIxMailView.m +M UI/Templates/MailerUI/UIxMailView.wox + +commit bd9da51e8351b6d7f23077875978971935a6b112 +Author: Francis Lachapelle +Date: Fri Nov 21 15:44:19 2014 -0500 + + Mailer: remove HTML from list of messages in JSON + +M UI/MailerUI/UIxMailListActions.h +M UI/MailerUI/UIxMailListActions.m +M UI/MailerUI/product.plist + +commit e5ce053a62a617f9c2e4fa1120d4c447a53deccc +Author: Francis Lachapelle +Date: Fri Nov 14 15:21:59 2014 -0500 + + Convert allFoldersMetadata to a tree structure + + When parsing the mailboxes list, we now generated a hierarchical + structure of the metadata. Each mailbox (a dictionary) can now have a + 'children' key that is an array of mailboxes. + +M SoObjects/Mailer/SOGoMailAccount.m + +commit ec5607963556c2d868e05a6e61200f79abd315e8 +Author: Francis Lachapelle +Date: Fri Nov 14 15:20:18 2014 -0500 + + Address Book module: Fix selection of card + +M UI/WebServerResources/js/ContactsUI.js + +commit 78a349fecd5c38671cc213c3157d6941a30c6b1f +Author: Francis Lachapelle +Date: Fri Nov 14 15:18:20 2014 -0500 + + Improve CSS of addressbooks list + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/scss/ContactsUI.scss + +commit 8c7846a1fa5011d9d791a843559620afcebb61e4 +Author: Francis Lachapelle +Date: Fri Nov 14 14:50:13 2014 -0500 + + Propagate theme in modules relative URLs + +M UI/SOGoUI/UIxComponent.m + +commit 2af7e85f8159b2a211874542ceb8a9bee1d4620f +Author: Francis Lachapelle +Date: Fri Nov 14 14:46:55 2014 -0500 + + Move SOGoContactGCSFolder->save to SOGoGCSFolder + +M UI/Common/product.plist +M UI/Contacts/product.plist + +commit 441834edbf9c185885952280cedc51cc929ffc9a +Author: Francis Lachapelle +Date: Fri Nov 14 14:30:09 2014 -0500 + + Mobile version: move ng template 'menu' + + The 'menu.html' AngularJS template is moved to UIxPageFrame.wox to be + used by all modules. + +M UI/Templates/Themes/mobile/CommonUI/UIxPageFrame.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox + +commit 28f9963f8750c8d0abf934b11ee05a5e8261130d +Author: Ludovic Marcotte +Date: Fri Nov 14 13:29:51 2014 -0500 + + Adjusted the minimum version of Foundation + +M UI/WebServerResources/bower.json + +commit e96449675995a1dc2401a86f1e8daf687b44ac88 +Author: Ludovic Marcotte +Date: Fri Nov 14 10:33:47 2014 -0500 + + Revert "Added required patch for previous commit" + + This reverts commit 18a363a07b233be8c757c312c3c51f630635cc13. + +M SoObjects/SOGo/SOGoGCSFolder.m + +commit ca14a0d4b3fbf95fee8c8b213219b69ed92877df +Author: Francis Lachapelle +Date: Wed Nov 12 10:44:43 2014 -0500 + + Improve folder subscription widget + +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 989cb0bca202280edfc4e51b9a82b819c49d3a00 +Author: Francis Lachapelle +Date: Tue Nov 11 11:27:37 2014 -0500 + + Fix overflow of subscriptions dropdown + +M UI/WebServerResources/scss/ContactsUI.scss + +commit 25b0d872c0f6d4fced7a38cc477d50fbf434e0b9 +Author: Francis Lachapelle +Date: Tue Nov 11 11:14:55 2014 -0500 + + Add addressbook subscriptions widget + +M UI/Contacts/product.plist +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/ContactsUI/UIxContactsUserFolders.wox +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 4016fdd4301a8487f72983f9ed993f468d9ad3f1 +Author: Francis Lachapelle +Date: Tue Nov 11 10:18:45 2014 -0500 + + New AngularJS directives + + sgDropdownContentToggle, sgUserTypeahead, sgSubscribe + +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 55f0d5a959977b4b129ae52676f56ff5704c2cdb +Author: Francis Lachapelle +Date: Mon Nov 10 16:42:19 2014 -0500 + + Add verification of parameter for "foldersSearch" + +M UI/MainUI/SOGoUserHomePage.m + +commit 6395d7cd6a53392ec2b14f7863a43f0f82171fb6 +Author: Francis Lachapelle +Date: Mon Nov 10 15:17:36 2014 -0500 + + New Resource.prototype.userResource function + +M UI/WebServerResources/js/Common/resource.js + +commit 7812e3757d3682ed7170cc9546f01c352421e8bf +Author: Francis Lachapelle +Date: Mon Nov 10 15:08:23 2014 -0500 + + Return properties of folder upon subscribe (JSON) + +M UI/Common/UIxFolderActions.m +M UI/Common/product.plist + +commit 93540b4fc6493be576cb082fee3e150a9974d5ac +Author: Francis Lachapelle +Date: Tue Nov 4 16:00:11 2014 -0500 + + Improve ACL editor template + +M UI/Templates/UIxAclEditor.wox + +commit c063832d0dacb016ef7ee97e4f4b206942aa7acd +Author: Francis Lachapelle +Date: Mon Nov 3 15:58:54 2014 -0500 + + Move ACL editor into a separate template + + The user rights remain dynamic, based on the object type (addressbook vs + mailbox vs calendar). + +M UI/Common/product.plist +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/UIxAclEditor.wox +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit 97ce3e6b726e46462979b5f49f4d696d215eaeb3 +Author: Francis Lachapelle +Date: Mon Nov 3 12:19:35 2014 -0500 + + Multiple improvements regarding ACLs + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss +M UI/WebServerResources/scss/mobile.scss + +commit bd39312b19eb37d2e362a43b90aa6d6f3705138e +Author: Francis Lachapelle +Date: Fri Oct 31 12:59:43 2014 -0400 + + Fix compilation warnings regarding ACLs + + Also change the data structure of the JSON returned by [UIxAclEditor + aclsAction]. The user's displayName has been removed and replace by the + "cn" and "c_email" attributes. This will probably affect the Thunderbird + extensions. + +M UI/Common/UIxAclEditor.h +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.h +M UI/Common/UIxUserRightsEditor.m +M UI/Contacts/UIxContactsUserRightsEditor.h +M UI/Contacts/UIxContactsUserRightsEditor.m + +commit 22faf5c28521d93b95d8094de7d5ce50ca06d9d3 +Author: Alexandre Cloutier +Date: Tue Oct 21 14:44:48 2014 -0400 + + refactor codes and applied comments + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit c82143fd2eef2f2f521372aba278add8aff0a4e5 +Author: Alexandre Cloutier +Date: Fri Oct 17 11:01:56 2014 -0400 + + Refactor acl object and applied comments + +M UI/MainUI/SOGoUserHomePage.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss +M UI/WebServerResources/scss/_settings.scss + +commit 9b026ebbcd26d7fa792b507ec7339906f6a655de +Author: Alexandre Cloutier +Date: Wed Oct 15 14:37:15 2014 -0400 + + Contacts - export addressBook + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 4e8d3ce900b664c2f50c21fccef932446f3fb03e +Author: Alexandre Cloutier +Date: Wed Oct 8 15:14:15 2014 -0400 + + add dialog window for public and allusers access + +M UI/WebServerResources/GNUmakefile +M UI/WebServerResources/js/ContactsUI.js + +commit df3ad5445cb9a0f4929a94383f2b1c9c30a4af99 +Author: Alexandre Cloutier +Date: Wed Oct 8 14:23:51 2014 -0400 + + Modification for ContactsUserRightsEditor + +M UI/Common/UIxAclEditor.m +M UI/Contacts/UIxContactsUserRightsEditor.m + +commit 9113ca54f761d1e97efefc6beb9429042bc6a6b1 +Author: Alexandre Cloutier +Date: Wed Oct 8 14:08:54 2014 -0400 + + Created user-modal.js, code refactoring + + Conflicts: + + UI/Common/UIxAclEditor.m + UI/Common/UIxUserRightsEditor.m + UI/Common/product.plist + UI/Contacts/UIxContactsUserRightsEditor.m + UI/Templates/ContactsUI/UIxContactFoldersView.wox + UI/WebServerResources/js/Common/resource.js + UI/WebServerResources/js/ContactsUI.js + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m +M UI/Common/product.plist +M UI/Contacts/UIxContactsUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit f3c26671af06b7fcfdd13d7ad8e0cc7c38553675 +Author: Alexandre Cloutier +Date: Wed Oct 8 13:44:37 2014 -0400 + + GUI for mobile version of AclUsers + + Conflicts: + + UI/Common/UIxAclEditor.m + UI/Common/UIxUserRightsEditor.m + UI/WebServerResources/js/Common/acl-model.js + +M UI/Common/UIxAclEditor.h +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m +M UI/MainUI/SOGoUserHomePage.m +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +A UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit e4b1c0d5b976fe93ef22c430d43554151c620e64 +Author: Francis Lachapelle +Date: Fri Oct 24 23:46:58 2014 -0400 + + Fix buttons in card editor + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/scss/ContactsUI.scss + +commit 3364263247081e743cf316c2c67f201d382e3fb5 +Author: Francis Lachapelle +Date: Fri Oct 24 22:00:27 2014 -0400 + + Improve handling of contact lists + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 61c48d37e4fb1c4d61ca76fc63d719b1d28a0dba +Author: Francis Lachapelle +Date: Fri Oct 24 16:44:57 2014 -0400 + + Fix creation of new contacts when editing a list + +M UI/Contacts/UIxListEditor.m + +commit 5b83b0c7b684b0fcdede253835bfc258c91849da +Author: Alexandre Cloutier +Date: Mon Oct 20 13:52:35 2014 -0400 + + Enable search by fullname and email + +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +A UI/WebServerResources/js/Common/user-model.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/mobile.scss + +commit 7e43b13f2103e51d1940717a160989f8bb61db87 +Author: Alexandre Cloutier +Date: Thu Oct 16 13:27:59 2014 -0400 + + GUI contact list creation + +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/mobile.scss + +commit 57791e384b7fb67c73b0098c1a8c7706aa38e5e7 +Author: Francis Lachapelle +Date: Wed Oct 8 10:37:26 2014 -0400 + + Revert "Creation of aclUsers window" + + This reverts commit ee5ef02f50d5f759f2ff985530bf8d78ca781aed. + +M UI/Common/UIxUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/ContactsUI.js + +commit 63b20c4ba2adf740a5dc29f78d4d0f74f3610c2f +Author: Francis Lachapelle +Date: Wed Oct 8 10:36:46 2014 -0400 + + Revert "rebase modification" + + This reverts commit 45c5bbd36a7a357dcb212c4d20dc09925df9e547. + +M UI/Common/UIxUserRightsEditor.m +M UI/WebServerResources/GNUmakefile + +commit e11eea7548423b3835a18b41158f9f01b555e717 +Author: Francis Lachapelle +Date: Wed Oct 8 10:35:50 2014 -0400 + + Revert "file lost through rebasing" + + This reverts commit a952402c39147ea95707f0c1d325ee4b3c0ba1a5. + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m +M UI/Common/product.plist +M UI/Contacts/UIxContactsUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +D UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit f7df4c1fa0c3d8971569d3f0204f5c7edcec67e2 +Author: Francis Lachapelle +Date: Tue Oct 7 14:54:12 2014 -0400 + + Allow reverting edition of addressbook name w/ESC + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/ContactsUI.js + +commit 4457997276643761bb67226250d2c1c49bb793a5 +Author: Francis Lachapelle +Date: Tue Oct 7 14:39:13 2014 -0400 + + AngularJS sgEscape directive for SOGo.UIDesktop + +M UI/WebServerResources/js/Common/ui-desktop.js + +commit 16628ab104c6ca2b4f2aba3c2bc782d0490c91c5 +Author: Francis Lachapelle +Date: Wed Oct 1 16:10:53 2014 -0400 + + Fix installation of ionic JS in Gruntfile.js + +M UI/WebServerResources/Gruntfile.js + +commit 56b765c6a52eaef13838c48c2de92a32edf8e2f1 +Author: Alexandre Cloutier +Date: Wed Oct 1 14:31:38 2014 -0400 + + delete unused .png + +D UI/WebServerResources/error.png +D UI/WebServerResources/notice.png +D UI/WebServerResources/success.png +D UI/WebServerResources/warning.png + +commit 3bf1224c9be908099ef9cfa35f862eb206e99542 +Author: Alexandre Cloutier +Date: Wed Oct 1 14:27:58 2014 -0400 + + file lost through rebasing + +M UI/Common/UIxAclEditor.m +M UI/Common/UIxUserRightsEditor.m +M UI/Common/product.plist +M UI/Contacts/UIxContactsUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +A UI/WebServerResources/js/Common/acl-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit edbd661104cb1e76815b70fb2feb30c78f8841fe +Author: Alexandre Cloutier +Date: Tue Sep 30 17:21:05 2014 -0400 + + rebase modification + +M UI/Common/UIxUserRightsEditor.m +M UI/WebServerResources/GNUmakefile + +commit 8ef222ab442af71b88f3ac7555bb4e5af29c878f +Author: Alexandre Cloutier +Date: Tue Sep 30 15:17:44 2014 -0400 + + Creation of aclUsers window + +M UI/Common/UIxUserRightsEditor.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/ContactsUI.js + +commit 654c8d26b72f10027a1cce2b7f0c8c1de8d1b0c9 +Author: Francis Lachapelle +Date: Mon Sep 29 12:12:28 2014 -0400 + + Contact editor: fix cancel and reset buttons + +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit 31ea7a5ab5f2f599b1e678cca44662904fc2292e +Author: Francis Lachapelle +Date: Mon Sep 29 11:06:46 2014 -0400 + + Improve contact module models + + - Fixed reset behavior + - Created an abstract state for the card viewer and editor + - Moved the card instance from the $rootScope.addressbook to the $scope + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit 342441ecf819f53c81e6a2ceb2b9658cf212637a +Author: Francis Lachapelle +Date: Wed Sep 24 16:06:12 2014 -0400 + + Improve JavaScript coding style + + To comitted code now passes the Airbnb pattern using jscs + +M UI/WebServerResources/js/Common/SOGoAuthentication.js +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/ui-mobile.js +M UI/WebServerResources/js/Common/utils.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/SOGoRootPage.js + +commit df37fd8b92c4d447ea8dd848d4c7ab030571be6f +Author: Francis Lachapelle +Date: Tue Sep 23 11:52:47 2014 -0400 + + AddressBook JS model: rename $all to $findAll + +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit 32d732caf01afcb99cc954287c0253ffacc41e68 +Author: Francis Lachapelle +Date: Tue Sep 23 09:47:24 2014 -0400 + + Update GNUmakefile for WebServerResources + +M UI/WebServerResources/GNUmakefile + +commit 3e2173db7abe79ce298e3ce59db2f1dc2826e31e +Author: Francis Lachapelle +Date: Thu Sep 18 20:46:52 2014 -0400 + + Improve JavaScript coding style + + To comitted code now passes the Airbnb pattern using jscs + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit 17ee62f4de7a70ba87820d8ac2a19631c71c8a91 +Author: Francis Lachapelle +Date: Wed Sep 17 16:28:40 2014 -0400 + + Improve usage of ui.router with "resolve" + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/ContactsUI.js + +commit f363257e516d925dfe423547e8038a72216192b1 +Author: Francis Lachapelle +Date: Wed Sep 17 15:47:00 2014 -0400 + + Use angularModule variable in mobile templates + +M UI/Templates/Themes/mobile/CommonUI/UIxPageFrame.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox + +commit 865bf096f51dc76cae4fb2d7847d9ef26e0e2c27 +Author: Francis Lachapelle +Date: Wed Sep 17 15:45:31 2014 -0400 + + Don't add an empty category to a contact + +M UI/Contacts/UIxContactEditor.m + +commit c4802df0242712555e6c38cba863c5ebfb75d249 +Author: Francis Lachapelle +Date: Tue Sep 16 10:25:46 2014 -0400 + + Remove debugging output + +M UI/Contacts/UIxContactView.m + +commit 130194a7401ed875f9c658063f6925cb5b89f2f7 +Author: Francis Lachapelle +Date: Mon Sep 15 10:13:02 2014 -0400 + + Update GNUmakefile for WebServerResources + +M UI/WebServerResources/GNUmakefile +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit 21f63c15fccebc889eda8c9c7a942170f6ecade1 +Author: Francis Lachapelle +Date: Fri Sep 12 10:17:48 2014 -0400 + + Cleanup of Web server resources + +D UI/WebServerResources/UIxCalViewPrint.css +D UI/WebServerResources/UIxCalViewPrint.js +D UI/WebServerResources/UIxContactFolderProperties.css +D UI/WebServerResources/UIxContactFolderProperties.js +D UI/WebServerResources/UIxMailSearch.css +D UI/WebServerResources/UIxMailSearch.js +D UI/WebServerResources/event7.png +D UI/WebServerResources/task.png + +commit bb9e8c03481e4109586ac95d26bdc3870fb2b825 +Author: Francis Lachapelle +Date: Thu Sep 11 16:11:26 2014 -0400 + + Remove trailing slash from template theme name + +M SoObjects/SOGo/WOContext+SOGo.m + +commit 16cd231ce34a152181cd0439a0d3fab6f5f6677c +Author: Francis Lachapelle +Date: Wed Sep 10 16:25:46 2014 -0400 + + New .button.outline CSS style + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/scss/ContactsUI.scss + +commit 20497e49e3f38a8e872036e1344d28b77e71df95 +Author: Francis Lachapelle +Date: Wed Sep 10 16:20:52 2014 -0400 + + Add creation & deletion of addressbooks + +M UI/Common/UIxObjectActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/ui-mobile.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js + +commit b97bf2b25fbc8614ac73cb95470da9b6fac61a76 +Author: Francis Lachapelle +Date: Fri Sep 5 22:34:25 2014 -0400 + + JSON'ed [UIxParentFolderActions createFolder] + +M UI/Common/UIxParentFolderActions.m + +commit 4f7a5d6ef5771a9109a17c77ab17a7037a6a58b9 +Author: Francis Lachapelle +Date: Fri Sep 5 15:23:35 2014 -0400 + + Rename ng module SOGo.RootPage to SOGo.MainUI + +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/SOGoRootPage.js + +commit f321abc63ae7d01e6391d2b1c4020e018cdeb4d8 +Author: Francis Lachapelle +Date: Fri Sep 5 15:12:05 2014 -0400 + + Desktop list editor, mobile contact editor + +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxContactsListActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/ui-desktop.js +M UI/WebServerResources/js/Common/ui-mobile.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/scss/mobile.scss + +commit 4b0ef6086ab9ee3c06e31c76138fe9d36cbe6dac +Author: Francis Lachapelle +Date: Wed Sep 3 15:58:18 2014 -0400 + + Cleanup contact and list viewers + +M UI/Contacts/UIxContactView.m +M UI/Contacts/UIxListView.m + +commit b57a8163fe91d159e6d2b820534650c60faa31fd +Author: Francis Lachapelle +Date: Wed Sep 3 14:27:01 2014 -0400 + + Add link to switch to mobile version + +M UI/Templates/UIxPageFrame.wox + +commit 86a6f5c67b3eaabb6c0204a05c1186d5df582974 +Author: Francis Lachapelle +Date: Wed Sep 3 14:25:45 2014 -0400 + + Add Angular module assignation in page frame + +M UI/Common/UIxPageFrame.m +M UI/Templates/UIxPageFrame.wox + +commit e40b42c213aa1895b698a99b07dbeefb53aebcbf +Author: Francis Lachapelle +Date: Wed Sep 3 14:19:46 2014 -0400 + + Move setAttributes from NGVCard to UIx*Editors + +M SoObjects/Contacts/NGVCard+SOGo.h +M SoObjects/Contacts/NGVCard+SOGo.m +M SoObjects/Contacts/SOGoContactGCSEntry.m +M SoObjects/Contacts/SOGoContactGCSFolder.m +M SoObjects/Contacts/SOGoContactObject.h +M SoObjects/Contacts/SOGoContactSourceFolder.m +M UI/Contacts/UIxContactEditor.h +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxListEditor.h +M UI/Contacts/UIxListEditor.m + +commit 2f6bc1c4ffc824abe815db281b1e01674f151b80 +Author: Francis Lachapelle +Date: Wed Sep 3 11:42:16 2014 -0400 + + Update .gitignore + +M .gitignore + +commit 958f0b4958d879a496ea6f571a1d2700c678927b +Author: Francis Lachapelle +Date: Wed Aug 20 15:49:44 2014 -0400 + + Contacts: Add possibility to add/delete objects + +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/WebServerResources/js/Common/resource.js +M UI/WebServerResources/js/Contacts/addressbook-model.js +M UI/WebServerResources/js/Contacts/card-model.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/scss/ContactsUI.scss + +commit 0c720bb9026da90177ad8a09f0707361d621d9d3 +Author: Francis Lachapelle +Date: Wed Aug 20 15:32:16 2014 -0400 + + New ng-module for common desktop widgets + +M UI/Templates/UIxPageFrame.wox +A UI/WebServerResources/js/Common/ui-desktop.js + +commit 34b3f2ac0cf855915bb0d0ee4170d9c507212beb +Author: Francis Lachapelle +Date: Wed Aug 20 15:30:59 2014 -0400 + + Improve build scripts of Web frontend + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/bower.json + +commit ef4de28ed461bc70fbbceb19900631eacc0d5546 +Author: Francis Lachapelle +Date: Wed Aug 20 15:26:49 2014 -0400 + + ContactView: lowercase the card tag + +M UI/Contacts/UIxContactView.m + +commit c98d580b2940527768c666c37266e0ef8bf33355 +Author: Francis Lachapelle +Date: Wed Aug 20 15:25:42 2014 -0400 + + Return contact UID when saving contact + +M UI/Contacts/UIxContactEditor.m + +commit a2460f93684adfa1ed92f015dcdd9b0b51c43cad +Author: Francis Lachapelle +Date: Wed Aug 20 15:18:35 2014 -0400 + + Add "newguid" action accessible from any folder + +M UI/Common/UIxFolderActions.h +M UI/Common/UIxFolderActions.m +M UI/Common/product.plist + +commit c0eac044374f205f80cb29e4daad0394384f1e1e +Author: Francis Lachapelle +Date: Wed Aug 20 15:14:40 2014 -0400 + + Adapt SOGoContactGCSFolder contact representation + + To match [UIxContactViewer dataAction]. + +M SoObjects/Contacts/SOGoContactGCSFolder.m + +commit 7f9be26541bbf0d10292205b3fe1fdb14ef7412f +Author: Francis Lachapelle +Date: Thu Aug 14 14:50:03 2014 -0400 + + Improve localization func to support placeholders + +M UI/WebServerResources/js/Common/utils.js + +commit c8ea3da5bc4613b557bf716281e7f7e8307a5b45 +Author: Francis Lachapelle +Date: Wed Aug 13 16:11:28 2014 -0400 + + Improve detection of theme-specific JavaScript + +M UI/Common/UIxPageFrame.m +M UI/Templates/Themes/mobile/MainUI/SOGoRootPage.wox +M UI/WebServerResources/js/mobile/SOGoRootPage.js + +commit a70287870b205b630a6f6a619d8672bcee53b9af +Author: Francis Lachapelle +Date: Wed Aug 13 15:56:29 2014 -0400 + + Improve build scripts of Web frontend + +M UI/WebServerResources/Gruntfile.js +M UI/WebServerResources/package.json + +commit e4ec5313db773f7e01b5912f18eafb1188d4abe0 +Author: Francis Lachapelle +Date: Mon Aug 11 20:34:47 2014 -0400 + + Improve grunt tasks to copy fonts files + +M UI/WebServerResources/Gruntfile.js + +commit a07d918fbfb6043ed489b7e2070d64426d3ddc25 +Author: Francis Lachapelle +Date: Mon Aug 11 11:17:16 2014 -0400 + + Add category to CardElement + + New method to return a JSON representation of the element. + +A SoObjects/SOGo/CardElement+SOGo.h +A SoObjects/SOGo/CardElement+SOGo.m +M SoObjects/SOGo/GNUmakefile + +commit 8da98367dbc47e9f82841454195b5493b5cd9b71 +Author: Francis Lachapelle +Date: Mon Aug 11 10:10:59 2014 -0400 + + Fix path to ionic scss files + +M UI/WebServerResources/scss/mobile.scss + +commit af5489bf579a9a36fb2f33bd2385a41ced3e6d41 +Author: Francis Lachapelle +Date: Mon Aug 11 10:10:25 2014 -0400 + + Fix redirection URLs in JavaScript + +M UI/WebServerResources/js/Common/SOGoAuthentication.js +M UI/WebServerResources/js/ContactsUI.js +M UI/WebServerResources/js/mobile/ContactsUI.js +M UI/WebServerResources/js/mobile/SOGoRootPage.js + +commit 54103124e8d5b6136964ffa59edbaf7edd464014 +Author: Francis Lachapelle +Date: Thu Aug 7 11:58:51 2014 -0400 + + Restore/move missing images + +A UI/WebServerResources/img/inverse.png +A UI/WebServerResources/img/sogo-logo.png +A UI/WebServerResources/img/sogo.ico + +commit 459c040d8ae33ea890df597d3818ce8a6221339a +Author: Francis Lachapelle +Date: Wed Aug 6 16:11:39 2014 -0400 + + Initial mobile theme using ionic + +A UI/Templates/Themes/mobile/CommonUI/UIxPageFrame.wox +A UI/Templates/Themes/mobile/ContactsUI/UIxContactFoldersView.wox +A UI/Templates/Themes/mobile/MainUI/SOGoRootPage.wox +A UI/WebServerResources/js/Common/ui-mobile.js +A UI/WebServerResources/js/mobile/ContactsUI.js +A UI/WebServerResources/js/mobile/SOGoRootPage.js +A UI/WebServerResources/scss/mobile.scss + +commit f248f81583044d03b9689ad32224d1a20502b4f4 +Author: Francis Lachapelle +Date: Wed Aug 6 16:06:58 2014 -0400 + + Improve template of Contacts module + +M UI/Contacts/UIxContactView.m +M UI/Contacts/UIxContactsListActions.m +M UI/Templates/ContactsUI/UIxContactFoldersView.wox + +commit a6d8dcc5b66135496fe4d3e82828fa0ada620d80 +Author: Francis Lachapelle +Date: Wed Aug 6 16:05:52 2014 -0400 + + Common JavaScript utlity functions + +M UI/Templates/UIxPageFrame.wox +A UI/WebServerResources/js/Common/resource.js +A UI/WebServerResources/js/Common/utils.js + +commit b4d6667f88db6a4f0261d14fb7f661400e3207b0 +Author: Francis Lachapelle +Date: Wed Aug 6 16:03:30 2014 -0400 + + Remove duplicated method + +M UI/Common/UIxFolderActions.m +M UI/Contacts/UIxContactFolderActions.m +M UI/Contacts/product.plist + +commit 77b80e27c64c4c31cde80a1f3fbb55d5669de045 +Author: Francis Lachapelle +Date: Wed Aug 6 16:01:05 2014 -0400 + + Add support for themes + +M SoObjects/SOGo/WOContext+SOGo.m +M UI/Common/UIxPageFrame.m +M UI/Common/UIxToolbar.m +M UI/SOGoUI/UIxComponent.h +M UI/SOGoUI/UIxComponent.m + +commit 16d04e998f721ea8177714b4eae64e128d11c8c7 +Author: Francis Lachapelle +Date: Wed Aug 6 15:52:43 2014 -0400 + + Improve Sass of SOGoRootPage & Contacts modules + +M UI/WebServerResources/scss/ContactsUI.scss +M UI/WebServerResources/scss/SOGoRootPage.scss + +commit d52d7582ca7d04f77b7be108b246cc4fa2e48aeb +Author: Francis Lachapelle +Date: Wed Aug 6 15:43:03 2014 -0400 + + Improve build scripts of Web frontend + +M UI/WebServerResources/GNUmakefile +M UI/WebServerResources/Gruntfile.js +A UI/WebServerResources/bower.json +M UI/WebServerResources/package.json + +commit e817a3b3d0abb550d83fb4db34bb0bffa8cf3d61 +Author: Francis Lachapelle +Date: Wed Aug 6 15:26:52 2014 -0400 + + Improve JavaScript of SOGoRootPage module + +M UI/Templates/MainUI/SOGoRootPage.wox +A UI/WebServerResources/js/Common/SOGoAuthentication.js +M UI/WebServerResources/js/SOGoRootPage.js + +commit 2d6f8e4ea6eba1dec0c48220497a95220027a393 +Author: Francis Lachapelle +Date: Wed Aug 6 15:14:05 2014 -0400 + + Improve JavaScript for Contacts module + +M UI/WebServerResources/js/Contacts/addressbook-model.js +A UI/WebServerResources/js/Contacts/card-model.js +D UI/WebServerResources/js/Contacts/contact-model.js +M UI/WebServerResources/js/ContactsUI.js +D UI/WebServerResources/js/SOGo.js +D UI/WebServerResources/js/app.js + +commit fbe412db080cde0b4ca385775ebb0723aed72ffd +Author: Francis Lachapelle +Date: Thu Jun 19 15:54:12 2014 -0400 + + Allow js/img/css subfolders in WebServerResources + +M UI/Common/UIxPageFrame.m + +commit 24f01e72c2bb6dbff4b851ef3950d3647398c831 +Author: Francis Lachapelle +Date: Thu Jun 19 15:53:43 2014 -0400 + + JSON-based operations for root page + +M UI/MainUI/SOGoRootPage.m + +commit 6970acfaa4d1179b2ce02b85186b92a6cd2c64d3 +Author: Francis Lachapelle +Date: Thu Jun 19 15:52:57 2014 -0400 + + AngularJS-based templates + +M UI/Templates/ContactsUI/UIxContactEditor.wox +M UI/Templates/ContactsUI/UIxContactFoldersView.wox +M UI/Templates/MainUI/SOGoRootPage.wox +M UI/Templates/UIxPageFrame.wox + +commit 0a49031b01864530165af12fc3668c3d8819283d +Author: Francis Lachapelle +Date: Thu Jun 19 15:51:57 2014 -0400 + + JSON-based operations on contacts + +M SoObjects/Contacts/NGVCard+SOGo.h +M SoObjects/Contacts/NGVCard+SOGo.m +M SoObjects/Contacts/SOGoContactGCSEntry.m +M SoObjects/Contacts/SOGoContactObject.h +M UI/Contacts/UIxContactEditor.m +M UI/Contacts/UIxContactFolderActions.m +M UI/Contacts/UIxContactFoldersView.h +M UI/Contacts/UIxContactFoldersView.m +M UI/Contacts/UIxContactView.h +M UI/Contacts/UIxContactView.m +M UI/Contacts/UIxContactsListActions.m +M UI/Contacts/UIxListView.m +M UI/Contacts/product.plist + +commit 29e147ee867adb700b52de86e7bcad8f6669e4ff +Author: Francis Lachapelle +Date: Thu Jun 19 15:50:29 2014 -0400 + + Initial Sass and JavaScript files + +A UI/WebServerResources/Gruntfile.js +A UI/WebServerResources/js/ContactsUI.js +A UI/WebServerResources/js/SOGo.js +A UI/WebServerResources/js/SOGoRootPage.js +A UI/WebServerResources/js/app.js +A UI/WebServerResources/package.json +A UI/WebServerResources/scss/ContactsUI.scss +A UI/WebServerResources/scss/SOGoRootPage.scss +A UI/WebServerResources/scss/_settings.scss +A UI/WebServerResources/scss/app.scss + +commit c21ec86365f45b193f95140479bb163872447d00 +Author: Francis Lachapelle +Date: Thu Jun 19 15:48:31 2014 -0400 + + Icons font + +A UI/WebServerResources/css/icons.css +A UI/WebServerResources/fonts/icomoon.eot +A UI/WebServerResources/fonts/icomoon.svg +A UI/WebServerResources/fonts/icomoon.ttf +A UI/WebServerResources/fonts/icomoon.woff + +commit 825c45f87220f19600376748e884065c30d00563 +Author: Francis Lachapelle +Date: Thu Jun 19 15:47:33 2014 -0400 + + Initial JavaScript models for addressbooks module + +A UI/WebServerResources/js/Contacts/addressbook-model.js +A UI/WebServerResources/js/Contacts/contact-model.js + +commit 3ad4352ffe6f9f2c431ae4c945549040e588d03d +Author: Francis Lachapelle +Date: Tue Jun 17 15:01:31 2014 -0400 + + Initial cleanup of Web server resources + +D UI/WebServerResources/AdministrationUI.css +D UI/WebServerResources/AdministrationUI.js +D UI/WebServerResources/COPYING-thunderbird.txt +D UI/WebServerResources/ContactsUI.css +D UI/WebServerResources/ContactsUI.js +D UI/WebServerResources/HTMLElement.js +D UI/WebServerResources/HTMLInputElement.js +D UI/WebServerResources/HTMLTableElement.js +D UI/WebServerResources/JavascriptAPIExtensions.js +D UI/WebServerResources/LICENSE-thunderbird.txt +D UI/WebServerResources/MailerUI.css +D UI/WebServerResources/MailerUI.js +D UI/WebServerResources/MailerUIdTree.js +D UI/WebServerResources/PasswordPolicy.js +D UI/WebServerResources/RowEditionController.js +D UI/WebServerResources/SOGoAutoCompletion.js +D UI/WebServerResources/SOGoDataTable.js +D UI/WebServerResources/SOGoDragHandles.js +D UI/WebServerResources/SOGoMailDataSource.js +D UI/WebServerResources/SOGoResizableTable.js +D UI/WebServerResources/SOGoRootPage.css +D UI/WebServerResources/SOGoRootPage.js +D UI/WebServerResources/SOGoTabsController.js +D UI/WebServerResources/SOGoTimePicker.css +D UI/WebServerResources/SOGoTimePicker.js +D UI/WebServerResources/SchedulerUI.css +D UI/WebServerResources/SchedulerUI.js +D UI/WebServerResources/SchedulerUIDnD.js +D UI/WebServerResources/Search-bar.png +D UI/WebServerResources/UIxAclEditor.css +D UI/WebServerResources/UIxAclEditor.js +D UI/WebServerResources/UIxAppointmentEditor.css +D UI/WebServerResources/UIxAppointmentEditor.js +D UI/WebServerResources/UIxAttendeesEditor.css +D UI/WebServerResources/UIxAttendeesEditor.js +D UI/WebServerResources/UIxCalUserRightsEditor.css +D UI/WebServerResources/UIxCalUserRightsEditor.js +D UI/WebServerResources/UIxCalendarProperties.css +D UI/WebServerResources/UIxCalendarProperties.js +D UI/WebServerResources/UIxColorPicker.js +D UI/WebServerResources/UIxComponentEditor.css +D UI/WebServerResources/UIxComponentEditor.js +D UI/WebServerResources/UIxContactEditor.css +D UI/WebServerResources/UIxContactEditor.js +D UI/WebServerResources/UIxContactsUserFolders.css +D UI/WebServerResources/UIxContactsUserFolders.js +D UI/WebServerResources/UIxContactsUserRightsEditor.css +D UI/WebServerResources/UIxContactsUserRightsEditor.js +D UI/WebServerResources/UIxFilterEditor.css +D UI/WebServerResources/UIxFilterEditor.js +D UI/WebServerResources/UIxListEditor.css +D UI/WebServerResources/UIxListEditor.js +D UI/WebServerResources/UIxMailEditor.css +D UI/WebServerResources/UIxMailEditor.js +D UI/WebServerResources/UIxMailPartExternalHTMLViewer.css +D UI/WebServerResources/UIxMailPopupView.js +D UI/WebServerResources/UIxMailToSelection.js +D UI/WebServerResources/UIxMailUserDelegationEditor.css +D UI/WebServerResources/UIxMailUserDelegationEditor.js +D UI/WebServerResources/UIxMailUserRightsEditor.css +D UI/WebServerResources/UIxMailUserRightsEditor.js +D UI/WebServerResources/UIxMailView.js +D UI/WebServerResources/UIxOccurenceDialog.css +D UI/WebServerResources/UIxOccurenceDialog.js +D UI/WebServerResources/UIxPreferences.css +D UI/WebServerResources/UIxPreferences.js +D UI/WebServerResources/UIxRecurrenceEditor.css +D UI/WebServerResources/UIxRecurrenceEditor.js +D UI/WebServerResources/UIxReminderEditor.css +D UI/WebServerResources/UIxReminderEditor.js +D UI/WebServerResources/UIxTaskEditor.css +D UI/WebServerResources/UIxTaskEditor.js +D UI/WebServerResources/XMLHttpRequest.js +D UI/WebServerResources/abcard-anonymous.png +D UI/WebServerResources/abcard-anyone.png +D UI/WebServerResources/abcard.png +D UI/WebServerResources/ablist.png +D UI/WebServerResources/account-settings.png +D UI/WebServerResources/add-addressbook.png +D UI/WebServerResources/add-calendar.png +D UI/WebServerResources/add-contact.gif +D UI/WebServerResources/add-icon.png +D UI/WebServerResources/add-user-addressbook.png +D UI/WebServerResources/add-user-calendar.png +D UI/WebServerResources/add-web-calendar.png +D UI/WebServerResources/addrbook.png +D UI/WebServerResources/alarm.png +D UI/WebServerResources/arrow-down.png +D UI/WebServerResources/arrow-dwn-sharp.gif +D UI/WebServerResources/arrow-left.png +D UI/WebServerResources/arrow-right.png +D UI/WebServerResources/arrow-up.png +D UI/WebServerResources/attachment.gif +D UI/WebServerResources/attachment.png +D UI/WebServerResources/attendee-partstats.png +D UI/WebServerResources/attendee-roles.png +D UI/WebServerResources/browser_chrome.gif +D UI/WebServerResources/browser_firefox.gif +D UI/WebServerResources/browser_ie.gif +D UI/WebServerResources/browser_safari.gif +D UI/WebServerResources/btn_a_bg.png +D UI/WebServerResources/btn_span_bg.png +D UI/WebServerResources/busy.gif +D UI/WebServerResources/calendar-folder-16x16.png +D UI/WebServerResources/calendar-reload.png +D UI/WebServerResources/choose-date.png +D UI/WebServerResources/ckeditor/LICENSE.md +D UI/WebServerResources/ckeditor/build-config.js +D UI/WebServerResources/ckeditor/ckeditor.js +D UI/WebServerResources/ckeditor/config.js +D UI/WebServerResources/ckeditor/contents.css +D UI/WebServerResources/ckeditor/lang/ar.js +D UI/WebServerResources/ckeditor/lang/ca.js +D UI/WebServerResources/ckeditor/lang/cs.js +D UI/WebServerResources/ckeditor/lang/cy.js +D UI/WebServerResources/ckeditor/lang/da.js +D UI/WebServerResources/ckeditor/lang/de.js +D UI/WebServerResources/ckeditor/lang/en.js +D UI/WebServerResources/ckeditor/lang/es.js +D UI/WebServerResources/ckeditor/lang/fi.js +D UI/WebServerResources/ckeditor/lang/fr.js +D UI/WebServerResources/ckeditor/lang/hu.js +D UI/WebServerResources/ckeditor/lang/is.js +D UI/WebServerResources/ckeditor/lang/it.js +D UI/WebServerResources/ckeditor/lang/nb.js +D UI/WebServerResources/ckeditor/lang/nl.js +D UI/WebServerResources/ckeditor/lang/no.js +D UI/WebServerResources/ckeditor/lang/pl.js +D UI/WebServerResources/ckeditor/lang/pt-br.js +D UI/WebServerResources/ckeditor/lang/ru.js +D UI/WebServerResources/ckeditor/lang/sk.js +D UI/WebServerResources/ckeditor/lang/sv.js +D UI/WebServerResources/ckeditor/lang/uk.js +D UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js +D UI/WebServerResources/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png +D UI/WebServerResources/ckeditor/plugins/about/dialogs/logo_ckeditor.png +D UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js +D UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.js +D UI/WebServerResources/ckeditor/plugins/dialog/dialogDefinition.js +D UI/WebServerResources/ckeditor/plugins/div/dialogs/div.js +D UI/WebServerResources/ckeditor/plugins/icons.png +D UI/WebServerResources/ckeditor/plugins/icons_hidpi.png +D UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js +D UI/WebServerResources/ckeditor/plugins/image/images/noimage.png +D UI/WebServerResources/ckeditor/plugins/link/dialogs/anchor.js +D UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js +D UI/WebServerResources/ckeditor/plugins/link/images/anchor.png +D UI/WebServerResources/ckeditor/plugins/link/images/hidpi/anchor.png +D UI/WebServerResources/ckeditor/plugins/scayt/LICENSE.md +D UI/WebServerResources/ckeditor/plugins/scayt/dialogs/options.js +D UI/WebServerResources/ckeditor/plugins/scayt/dialogs/toolbar.css +D UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js +D UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js +D UI/WebServerResources/ckeditor/plugins/wsc/LICENSE.md +D UI/WebServerResources/ckeditor/plugins/wsc/dialogs/ciframe.html +D UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +D UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.css +D UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.js +D UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc_ie.js +D UI/WebServerResources/ckeditor/skins/moono/dialog.css +D UI/WebServerResources/ckeditor/skins/moono/dialog_ie.css +D UI/WebServerResources/ckeditor/skins/moono/dialog_ie7.css +D UI/WebServerResources/ckeditor/skins/moono/dialog_ie8.css +D UI/WebServerResources/ckeditor/skins/moono/dialog_iequirks.css +D UI/WebServerResources/ckeditor/skins/moono/editor.css +D UI/WebServerResources/ckeditor/skins/moono/editor_gecko.css +D UI/WebServerResources/ckeditor/skins/moono/editor_ie.css +D UI/WebServerResources/ckeditor/skins/moono/editor_ie7.css +D UI/WebServerResources/ckeditor/skins/moono/editor_ie8.css +D UI/WebServerResources/ckeditor/skins/moono/editor_iequirks.css +D UI/WebServerResources/ckeditor/skins/moono/icons.png +D UI/WebServerResources/ckeditor/skins/moono/icons_hidpi.png +D UI/WebServerResources/ckeditor/skins/moono/images/arrow.png +D UI/WebServerResources/ckeditor/skins/moono/images/close.png +D UI/WebServerResources/ckeditor/skins/moono/images/hidpi/close.png +D UI/WebServerResources/ckeditor/skins/moono/images/hidpi/lock-open.png +D UI/WebServerResources/ckeditor/skins/moono/images/hidpi/lock.png +D UI/WebServerResources/ckeditor/skins/moono/images/hidpi/refresh.png +D UI/WebServerResources/ckeditor/skins/moono/images/lock-open.png +D UI/WebServerResources/ckeditor/skins/moono/images/lock.png +D UI/WebServerResources/ckeditor/skins/moono/images/refresh.png +D UI/WebServerResources/ckeditor/skins/moono/readme.md +D UI/WebServerResources/ckeditor/styles.js +D UI/WebServerResources/collapse.png +D UI/WebServerResources/confidential.png +D UI/WebServerResources/create-account.png +D UI/WebServerResources/datepicker.css +D UI/WebServerResources/datepicker.js +D UI/WebServerResources/day-view-multicolumn.png +D UI/WebServerResources/day-view.png +D UI/WebServerResources/dialog-left.png +D UI/WebServerResources/dialog-right.png +D UI/WebServerResources/dialog-top.png +D UI/WebServerResources/dot.png +D UI/WebServerResources/down-icon.png +D UI/WebServerResources/dragdot.png +D UI/WebServerResources/dtree.css +D UI/WebServerResources/dtree.js +D UI/WebServerResources/edit.png +D UI/WebServerResources/empty.gif +D UI/WebServerResources/event-gradient.png +D UI/WebServerResources/event-grippy-bottom.png +D UI/WebServerResources/event-grippy-top.png +D UI/WebServerResources/event-grippy-vertical.png +D UI/WebServerResources/first.gif +D UI/WebServerResources/flag-col.png +D UI/WebServerResources/flag.png +D UI/WebServerResources/generic.css +D UI/WebServerResources/generic.js +D UI/WebServerResources/goto-today.png +D UI/WebServerResources/green_corner.gif +D UI/WebServerResources/icon-deleted.png +D UI/WebServerResources/icon-forwarded-replied.png +D UI/WebServerResources/icon-forwarded.png +D UI/WebServerResources/icon-new.png +D UI/WebServerResources/icon-replied.png +D UI/WebServerResources/iefixes.css +D UI/WebServerResources/important.png +D UI/WebServerResources/input_bg.gif +D UI/WebServerResources/inverse.png +D UI/WebServerResources/jquery-ui.js +D UI/WebServerResources/jquery.fileupload.css +D UI/WebServerResources/jquery.fileupload.js +D UI/WebServerResources/jquery.iframe-transport.js +D UI/WebServerResources/jquery.js +A UI/WebServerResources/js/vendor/ckeditor/LICENSE.md +A UI/WebServerResources/js/vendor/ckeditor/build-config.js +A UI/WebServerResources/js/vendor/ckeditor/ckeditor.js +A UI/WebServerResources/js/vendor/ckeditor/config.js +A UI/WebServerResources/js/vendor/ckeditor/contents.css +A UI/WebServerResources/js/vendor/ckeditor/lang/ar.js +A UI/WebServerResources/js/vendor/ckeditor/lang/ca.js +A UI/WebServerResources/js/vendor/ckeditor/lang/cs.js +A UI/WebServerResources/js/vendor/ckeditor/lang/cy.js +A UI/WebServerResources/js/vendor/ckeditor/lang/da.js +A UI/WebServerResources/js/vendor/ckeditor/lang/de.js +A UI/WebServerResources/js/vendor/ckeditor/lang/en.js +A UI/WebServerResources/js/vendor/ckeditor/lang/es.js +A UI/WebServerResources/js/vendor/ckeditor/lang/fi.js +A UI/WebServerResources/js/vendor/ckeditor/lang/fr.js +A UI/WebServerResources/js/vendor/ckeditor/lang/hu.js +A UI/WebServerResources/js/vendor/ckeditor/lang/is.js +A UI/WebServerResources/js/vendor/ckeditor/lang/it.js +A UI/WebServerResources/js/vendor/ckeditor/lang/nb.js +A UI/WebServerResources/js/vendor/ckeditor/lang/nl.js +A UI/WebServerResources/js/vendor/ckeditor/lang/no.js +A UI/WebServerResources/js/vendor/ckeditor/lang/pl.js +A UI/WebServerResources/js/vendor/ckeditor/lang/pt-br.js +A UI/WebServerResources/js/vendor/ckeditor/lang/ru.js +A UI/WebServerResources/js/vendor/ckeditor/lang/sk.js +A UI/WebServerResources/js/vendor/ckeditor/lang/sv.js +A UI/WebServerResources/js/vendor/ckeditor/lang/uk.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/about/dialogs/about.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/about/dialogs/logo_ckeditor.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/clipboard/dialogs/paste.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/colordialog/dialogs/colordialog.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/dialog/dialogDefinition.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/div/dialogs/div.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/fakeobjects/images/spacer.gif +A UI/WebServerResources/js/vendor/ckeditor/plugins/icons.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/icons_hidpi.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/image/dialogs/image.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/image/images/noimage.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/link/dialogs/anchor.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/link/dialogs/link.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/link/images/anchor.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/link/images/hidpi/anchor.png +A UI/WebServerResources/js/vendor/ckeditor/plugins/scayt/LICENSE.md +A UI/WebServerResources/js/vendor/ckeditor/plugins/scayt/dialogs/options.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/scayt/dialogs/toolbar.css +A UI/WebServerResources/js/vendor/ckeditor/plugins/table/dialogs/table.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/tabletools/dialogs/tableCell.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/LICENSE.md +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/dialogs/ciframe.html +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/dialogs/wsc.css +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/dialogs/wsc.js +A UI/WebServerResources/js/vendor/ckeditor/plugins/wsc/dialogs/wsc_ie.js +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog_ie.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog_ie7.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog_ie8.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog_iequirks.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/dialog_opera.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor_gecko.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor_ie.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor_ie7.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor_ie8.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/editor_iequirks.css +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/icons.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/icons_hidpi.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/arrow.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/close.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/hidpi/close.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/hidpi/lock-open.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/hidpi/lock.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/hidpi/refresh.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/lock-open.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/lock.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/images/refresh.png +A UI/WebServerResources/js/vendor/ckeditor/skins/moono/readme.md +A UI/WebServerResources/js/vendor/ckeditor/styles.js +D UI/WebServerResources/js_color_picker_v2.js +D UI/WebServerResources/last.gif +D UI/WebServerResources/layout2or3_xlib.js +D UI/WebServerResources/layout2or3_xlib.txt +D UI/WebServerResources/lori_32x32.png +D UI/WebServerResources/manage-filters.png +D UI/WebServerResources/manage-imap.png +D UI/WebServerResources/menu-check-hover.gif +D UI/WebServerResources/menu-check.gif +D UI/WebServerResources/menu-nocheck.gif +D UI/WebServerResources/message-copy.gif +D UI/WebServerResources/message.gif +D UI/WebServerResources/mime-application-certificate.png +D UI/WebServerResources/mime-application-magicpoint.png +D UI/WebServerResources/mime-application-msword.png +D UI/WebServerResources/mime-application-ogg.png +D UI/WebServerResources/mime-application-pdf.png +D UI/WebServerResources/mime-application-postscript.png +D UI/WebServerResources/mime-application-rtf.png +D UI/WebServerResources/mime-application-vnd.lotus-1-2-3.png +D UI/WebServerResources/mime-application-vnd.ms-excel.png +D UI/WebServerResources/mime-application-vnd.ms-powerpoint.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.graphics.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.image.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.presentation.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.spreadsheet.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.text-web.png +D UI/WebServerResources/mime-application-vnd.oasis.opendocument.text.png +D UI/WebServerResources/mime-application-vnd.rn-realmedia-secure.png +D UI/WebServerResources/mime-application-vnd.rn-realmedia-vbr.png +D UI/WebServerResources/mime-application-vnd.rn-realmedia.png +D UI/WebServerResources/mime-application-vnd.stardivision.calc.png +D UI/WebServerResources/mime-application-vnd.stardivision.impress.png +D UI/WebServerResources/mime-application-vnd.stardivision.writer.png +D UI/WebServerResources/mime-application-vnd.sun.xml.calc.png +D UI/WebServerResources/mime-application-vnd.sun.xml.draw.png +D UI/WebServerResources/mime-application-vnd.sun.xml.impress.png +D UI/WebServerResources/mime-application-vnd.sun.xml.writer.png +D UI/WebServerResources/mime-application-wordperfect.png +D UI/WebServerResources/mime-application-x-7z-compressed.png +D UI/WebServerResources/mime-application-x-abiword.png +D UI/WebServerResources/mime-application-x-applix-spreadsheet.png +D UI/WebServerResources/mime-application-x-applix-word.png +D UI/WebServerResources/mime-application-x-archive.png +D UI/WebServerResources/mime-application-x-arj.png +D UI/WebServerResources/mime-application-x-bzip-compressed-tar.png +D UI/WebServerResources/mime-application-x-bzip.png +D UI/WebServerResources/mime-application-x-cd-image.png +D UI/WebServerResources/mime-application-x-compress.png +D UI/WebServerResources/mime-application-x-compressed-tar.png +D UI/WebServerResources/mime-application-x-cpio-compressed.png +D UI/WebServerResources/mime-application-x-cpio.png +D UI/WebServerResources/mime-application-x-deb.png +D UI/WebServerResources/mime-application-x-dvi.png +D UI/WebServerResources/mime-application-x-executable.png +D UI/WebServerResources/mime-application-x-font-afm.png +D UI/WebServerResources/mime-application-x-font-bdf.png +D UI/WebServerResources/mime-application-x-font-linux-psf.png +D UI/WebServerResources/mime-application-x-font-pcf.png +D UI/WebServerResources/mime-application-x-font-sunos-news.png +D UI/WebServerResources/mime-application-x-font-ttf.png +D UI/WebServerResources/mime-application-x-gnumeric.png +D UI/WebServerResources/mime-application-x-gzip.png +D UI/WebServerResources/mime-application-x-gzpostscript.png +D UI/WebServerResources/mime-application-x-jar.png +D UI/WebServerResources/mime-application-x-killustrator.png +D UI/WebServerResources/mime-application-x-kpresenter.png +D UI/WebServerResources/mime-application-x-kspread.png +D UI/WebServerResources/mime-application-x-kword.png +D UI/WebServerResources/mime-application-x-lha.png +D UI/WebServerResources/mime-application-x-lhz.png +D UI/WebServerResources/mime-application-x-lzma-compressed-tar.png +D UI/WebServerResources/mime-application-x-lzma.png +D UI/WebServerResources/mime-application-x-ms-dos-executable.png +D UI/WebServerResources/mime-application-x-perl.png +D UI/WebServerResources/mime-application-x-php.png +D UI/WebServerResources/mime-application-x-python-bytecode.png +D UI/WebServerResources/mime-application-x-rar.png +D UI/WebServerResources/mime-application-x-rpm.png +D UI/WebServerResources/mime-application-x-scribus.png +D UI/WebServerResources/mime-application-x-shellscript.png +D UI/WebServerResources/mime-application-x-shockwave-flash.png +D UI/WebServerResources/mime-application-x-stuffit.png +D UI/WebServerResources/mime-application-x-tar.png +D UI/WebServerResources/mime-application-x-tarz.png +D UI/WebServerResources/mime-application-x-tex.png +D UI/WebServerResources/mime-application-xhtml+xml.png +D UI/WebServerResources/mime-application-zip.png +D UI/WebServerResources/mime-ascii.png +D UI/WebServerResources/mime-audio-x-generic.png +D UI/WebServerResources/mime-audio.png +D UI/WebServerResources/mime-binary.png +D UI/WebServerResources/mime-contents2.png +D UI/WebServerResources/mime-deb.png +D UI/WebServerResources/mime-document.png +D UI/WebServerResources/mime-empty.png +D UI/WebServerResources/mime-exec.png +D UI/WebServerResources/mime-folder_tar.png +D UI/WebServerResources/mime-font-x-generic.png +D UI/WebServerResources/mime-font.png +D UI/WebServerResources/mime-font_bitmap.png +D UI/WebServerResources/mime-font_truetype.png +D UI/WebServerResources/mime-font_type1.png +D UI/WebServerResources/mime-gnome-fs-executable.png +D UI/WebServerResources/mime-gnome-fs-regular.png +D UI/WebServerResources/mime-gnome-package.png +D UI/WebServerResources/mime-gtk-file.png +D UI/WebServerResources/mime-html.png +D UI/WebServerResources/mime-image-pdf.png +D UI/WebServerResources/mime-image-x-generic.png +D UI/WebServerResources/mime-image.png +D UI/WebServerResources/mime-kpresenter_kpr.png +D UI/WebServerResources/mime-mime_ascii.png +D UI/WebServerResources/mime-misc.png +D UI/WebServerResources/mime-package-x-generic.png +D UI/WebServerResources/mime-package.png +D UI/WebServerResources/mime-package_editors.png +D UI/WebServerResources/mime-package_wordprocessing.png +D UI/WebServerResources/mime-plan.png +D UI/WebServerResources/mime-rpm.png +D UI/WebServerResources/mime-shellscript.png +D UI/WebServerResources/mime-sound.png +D UI/WebServerResources/mime-spreadsheet.png +D UI/WebServerResources/mime-stock_addressbook.png +D UI/WebServerResources/mime-stock_calendar.png +D UI/WebServerResources/mime-stock_certificate.png +D UI/WebServerResources/mime-stock_script.png +D UI/WebServerResources/mime-tar.png +D UI/WebServerResources/mime-template_source.png +D UI/WebServerResources/mime-text-html.png +D UI/WebServerResources/mime-text-plain.png +D UI/WebServerResources/mime-text-vnd.wap.wml.png +D UI/WebServerResources/mime-text-x-csh.png +D UI/WebServerResources/mime-text-x-generic-template.png +D UI/WebServerResources/mime-text-x-generic.png +D UI/WebServerResources/mime-text-x-preview.png +D UI/WebServerResources/mime-text-x-python.png +D UI/WebServerResources/mime-text-x-script.png +D UI/WebServerResources/mime-text-x-sh.png +D UI/WebServerResources/mime-text-x-vcalendar.png +D UI/WebServerResources/mime-text-x-vcard.png +D UI/WebServerResources/mime-text-x-zsh.png +D UI/WebServerResources/mime-text.png +D UI/WebServerResources/mime-tgz.png +D UI/WebServerResources/mime-txt.png +D UI/WebServerResources/mime-txt2.png +D UI/WebServerResources/mime-unknown.png +D UI/WebServerResources/mime-vcalendar.png +D UI/WebServerResources/mime-vcard.png +D UI/WebServerResources/mime-video-x-generic.png +D UI/WebServerResources/mime-video.png +D UI/WebServerResources/mime-wordprocessing.png +D UI/WebServerResources/mime-www.png +D UI/WebServerResources/mime-x-font-afm.png +D UI/WebServerResources/mime-x-office-address-book.png +D UI/WebServerResources/mime-x-office-calendar.png +D UI/WebServerResources/mime-x-office-document.png +D UI/WebServerResources/mime-x-office-drawing.png +D UI/WebServerResources/mime-x-office-presentation.png +D UI/WebServerResources/mime-x-office-spreadsheet.png +D UI/WebServerResources/mime-zip.png +D UI/WebServerResources/minus.png +D UI/WebServerResources/month-view.png +D UI/WebServerResources/new-card.png +D UI/WebServerResources/new-event.png +D UI/WebServerResources/new-list.png +D UI/WebServerResources/new-task.png +D UI/WebServerResources/next.gif +D UI/WebServerResources/offline-settings.png +D UI/WebServerResources/options.png +D UI/WebServerResources/plus.png +D UI/WebServerResources/previous.gif +D UI/WebServerResources/private.png +D UI/WebServerResources/properties.png +D UI/WebServerResources/prototype.js +D UI/WebServerResources/quota-level-alert.png +D UI/WebServerResources/quota-level-ok.png +D UI/WebServerResources/quota-level-warn.png +D UI/WebServerResources/quota-level.png +D UI/WebServerResources/read-messages.png +D UI/WebServerResources/remote-addrbook.png +D UI/WebServerResources/remove-addressbook.png +D UI/WebServerResources/remove-calendar.png +D UI/WebServerResources/remove-contact.gif +D UI/WebServerResources/remove-icon.png +D UI/WebServerResources/search-messages.png +D UI/WebServerResources/signature-not-ok.png +D UI/WebServerResources/signature-ok.png +D UI/WebServerResources/slider_handle.gif +D UI/WebServerResources/smalltoolbarbtn_a_bg.png +D UI/WebServerResources/smalltoolbarbtn_span_bg.png +D UI/WebServerResources/sogo-logo.png +D UI/WebServerResources/sogo.ico +D UI/WebServerResources/status.vacation-msg.png +D UI/WebServerResources/submenu-active.gif +D UI/WebServerResources/submenu-disabled.gif +D UI/WebServerResources/submenu.gif +D UI/WebServerResources/tab_a_active_bg.png +D UI/WebServerResources/tab_a_inactive_bg.png +D UI/WebServerResources/tab_left_active.gif +D UI/WebServerResources/tab_left_inactive.gif +D UI/WebServerResources/tab_right_active.gif +D UI/WebServerResources/tab_right_inactive.gif +D UI/WebServerResources/tab_span_active_bg.png +D UI/WebServerResources/tab_span_inactive_bg.png +D UI/WebServerResources/tablekit-sogo.js +D UI/WebServerResources/tablekit-trueresize.js +D UI/WebServerResources/tablekit.js +D UI/WebServerResources/tb-ab-properties-flat-24x24.png +D UI/WebServerResources/tb-compose-attach-flat-24x24.png +D UI/WebServerResources/tb-compose-contacts-flat-24x24.png +D UI/WebServerResources/tb-compose-save-flat-24x24.png +D UI/WebServerResources/tb-compose-security-flat-24x24.png +D UI/WebServerResources/tb-compose-send-flat-24x24.png +D UI/WebServerResources/tb-mail-addressbook-flat-16x16.png +D UI/WebServerResources/tb-mail-addressbook-flat-24x24.png +D UI/WebServerResources/tb-mail-delete-flat-24x24.png +D UI/WebServerResources/tb-mail-file-flat-24x24.png +D UI/WebServerResources/tb-mail-forward-flat-24x24.png +D UI/WebServerResources/tb-mail-getmail-flat-24x24.png +D UI/WebServerResources/tb-mail-junk-flat-24x24.png +D UI/WebServerResources/tb-mail-print-flat-24x24.png +D UI/WebServerResources/tb-mail-reply-flat-24x24.png +D UI/WebServerResources/tb-mail-replyall-flat-24x24.png +D UI/WebServerResources/tb-mail-stop-flat-24x24.png +D UI/WebServerResources/tb-mail-write-flat-24x24.png +D UI/WebServerResources/tbtv_account_17x17.png +D UI/WebServerResources/tbtv_corner_17x22.png +D UI/WebServerResources/tbtv_corner_minus_17x22.png +D UI/WebServerResources/tbtv_corner_plus_17x22.png +D UI/WebServerResources/tbtv_drafts_17x17.png +D UI/WebServerResources/tbtv_inbox_17x17.png +D UI/WebServerResources/tbtv_junction_17x22.png +D UI/WebServerResources/tbtv_leaf_corner_17x17.png +D UI/WebServerResources/tbtv_line_17x22.png +D UI/WebServerResources/tbtv_minus_17x22.png +D UI/WebServerResources/tbtv_plus_17x22.png +D UI/WebServerResources/tbtv_sent_17x17.png +D UI/WebServerResources/tbtv_trash_17x17.png +D UI/WebServerResources/tentative.png +D UI/WebServerResources/thead_bg.png +D UI/WebServerResources/title_attachment_14x14.png +D UI/WebServerResources/title_read_14x14.png +D UI/WebServerResources/title_sortdown_12x12.png +D UI/WebServerResources/title_sortup_12x12.png +D UI/WebServerResources/toolbarbtn_a_bg.png +D UI/WebServerResources/toolbarbtn_span_bg.png +D UI/WebServerResources/unread.png +D UI/WebServerResources/up-icon.png +D UI/WebServerResources/upload_document.png +D UI/WebServerResources/week-view.png +D UI/WebServerResources/write-message.png +D UI/WebServerResources/write.png + +commit a45dc9688575939bdec0f62ad9b1b5a6eb0bc1bd +Author: Alexandre Cloutier +Date: Mon Sep 8 12:39:55 2014 -0400 + + applied comments + +M UI/WebServerResources/MailerUI.js + +commit b041ec6e652f1411e91a7a9be89167a227ab5d78 +Author: Alexandre Cloutier +Date: Fri Jun 27 17:00:32 2014 -0400 + + activeTasks updates dynamically + +M UI/WebServerResources/SchedulerUI.js + +commit 257d731e04999e10a5e15a416ce191449d7e27c7 +Author: Alexandre Cloutier +Date: Wed Jun 25 17:39:48 2014 -0400 + + multiColumns print view + bugFixes + +M UI/Scheduler/English.lproj/Localizable.strings +M UI/WebServerResources/SchedulerUI.js +M UI/WebServerResources/UIxCalViewPrint.css +M UI/WebServerResources/UIxCalViewPrint.js + +commit 720a946d391858c39142e0422aeb602a5275699e +Author: Alexandre Cloutier +Date: Fri Jun 20 13:16:55 2014 -0400 + + The multiColumns view + +M UI/Scheduler/UIxCalDayTable.m +M UI/Scheduler/UIxCalListingActions.m +M UI/WebServerResources/SchedulerUI.css +M UI/WebServerResources/SchedulerUI.js + commit 5ad36626406e55e82867351c9775a357748e2b28 Author: Ludovic Marcotte Date: Thu Jun 11 13:32:57 2015 -0400 @@ -856,19 +13692,6 @@ Date: Tue Jun 2 12:57:37 2015 -0400 M ActiveSync/NSData+ActiveSync.m M NEWS -commit 7540cc3e33ba47ec8ca56271db7ae22a2e3d8588 -Author: Javier Amor García -Date: Tue Mar 3 17:03:29 2015 +0100 - - oc: can use client data to get recipient address - - Before this change, the recipient address was only extracted from the sogo - user object. This made mail to groups undeliverable. - Now if we do not have mail addresses from user object, - we try to use parameters from the client call. - -M OpenChange/MAPIStoreMessage.m - commit 18a0422367b442790d205c3bd5ed8b9ef8f4d9a0 Author: Ludovic Marcotte Date: Tue Jun 2 09:03:34 2015 -0400 @@ -913,60 +13736,6 @@ D Scripts/sql-update-2.1.17_to_2.3.0.sh A Scripts/sql-update-2.2.17_to_2.3.0-mysql.sh A Scripts/sql-update-2.2.17_to_2.3.0.sh -commit d92b0341fbd5aa8f7b711a4cec9198dc34ca899c -Author: Jesús García Sáez -Date: Thu May 28 17:28:52 2015 +0200 - - sogo-tool restore works in multidomain environments - - c_uid is not unique globally when multidomain is enabled - -M Tools/SOGoToolRestore.m - -commit 5e84f2817f8ac3e24ad1a9d6c8085fe4d48c44cb -Author: Javier Amor García -Date: Wed May 27 16:41:22 2015 +0200 - - sogo-tool: Added create-folder command - -M Tools/GNUmakefile -A Tools/SOGoToolCreateFolder.m -A Tools/SOGoToolRestore.h -M Tools/SOGoToolRestore.m - -commit 96d88de564f36e45bf9d82258c1378b881532b7f -Author: Julio García -Date: Tue Jun 2 12:24:56 2015 +0200 - - Revert "Fixed mess regarding uid/realUID" - - This reverts commit 4f303f8aa26046ecae916c457839d84622b260bb. - -M SoObjects/SOGo/SOGoUser.m - -commit 90e11d76f61dd8855f7c6ddb267feb39bf26bc52 -Author: Julio García -Date: Tue Jun 2 12:24:44 2015 +0200 - - Revert "(fix) more multi-domain fixes and cleanups" - - This reverts commit ed42d1e26b047e9d074a46a1a60c13a65e2d39de. - -M SoObjects/SOGo/SOGoUser.m -M SoObjects/SOGo/SOGoUserManager.m - -commit 3dd8bddc0e0e5f8cab3507e36e37f643ea70bea6 -Author: Julio García -Date: Tue Jun 2 12:24:32 2015 +0200 - - Revert "(fix) more fixes and clarifications on the mutli-domain settings" - - This reverts commit d07df554f3d43078dedd74cefe7a63049992c67f. - -M Documentation/SOGoInstallationGuide.asciidoc -M SoObjects/SOGo/SOGoUser.m -M SoObjects/SOGo/SOGoUserManager.m - commit 617e6f6454439cde3a41126de35ed47e02815cec Author: Francis Lachapelle Date: Mon Jun 1 11:56:52 2015 -0400 @@ -983,19 +13752,6 @@ Date: Mon Jun 1 11:20:32 2015 -0400 M NEWS -commit 1ec53a063c72ba23f9b8481b49c5d987bd64d134 -Author: Juan Vallés -Date: Thu May 28 14:47:07 2015 +0200 - - oc-calendar: Improve check for appointment updates - - The UID was being used to check if the changes in an appointment had been made by - its organiser. In this case, the UID is the user name, without taking the domain into account. - The `owner` variable, however, is a full email address, so the comparison was never successful. This - caused the update notification mail not to be sent. - -M SoObjects/Appointments/SOGoAppointmentObject.m - commit 289100beff160072d12afd74e8aaa4d116a0be03 Author: Ludovic Marcotte Date: Mon Jun 1 08:36:02 2015 -0400 @@ -1040,16 +13796,6 @@ Date: Thu May 28 08:30:30 2015 -0400 M Documentation/SOGoInstallationGuide.asciidoc -commit 76f80c507cf0c3438346bc551458d5a7971d28fc -Author: Jesús García Sáez -Date: Thu May 28 12:35:18 2015 +0200 - - safe decoding of secured value - - This was crashing with invalid value (shorter than it should be or nil value) - -M SoObjects/SOGo/SOGoSession.m - commit 2fd0beeaca85e615d8af693f8bc3eb0b3828bd40 Author: Ludovic Marcotte Date: Wed May 27 15:52:44 2015 -0400 @@ -1082,32 +13828,6 @@ Date: Tue May 26 22:50:28 2015 +0200 M Scripts/sogo-systemd-redhat -commit b04b66fd797b4333792554dcad9fee135e8da0a7 -Author: Enrique J. Hernández Blasco -Date: Tue May 26 21:42:57 2015 +0200 - - Use UTC offset to encode NSCalendarDate in BSON - - Using name abbreviation in Objective-C is discouraged - as it stated in the following link: - - https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/index.html#//apple_ref/occ/clm/NSTimeZone/timeZoneWithAbbreviation: - - Indeed, the GNUStep library is generating the name - abbreviation using the system tzdata information - but parsing this data using GNUStep resources making - changes like this: - - http://mm.icann.org/pipermail/tz-announce/2014-August/000023.html - - Not working until GNUStep reaches these tzdata changes. - - Using the UTC offset we are losing the position in planet - Earth but it could be considered valid looking at other - bson implementations. - -M SoObjects/SOGo/BSONCodec.m - commit ce3d55d2cc9ddafe2e76c0200c3a1a9dd74266ef Author: Ludovic Marcotte Date: Tue May 26 11:08:30 2015 -0400 @@ -1142,28 +13862,6 @@ M Documentation/SOGoInstallationGuide.asciidoc M SoObjects/SOGo/SOGoUser.m M SoObjects/SOGo/SOGoUserManager.m -commit 7dc333e79013cccc730284151acfe575a2e73af6 -Author: Jesús García Sáez -Date: Wed May 20 15:24:00 2015 +0200 - - Fix warning distinct Objective-C type - - failedCount is a NSDictionary *, not NSMutableDictionary * - -M SoObjects/SOGo/SOGoUserManager.m - -commit cc62576fef5e64fe2fce97937fc5e64fa574413b -Author: Jesús García Sáez -Date: Wed May 20 12:31:25 2015 +0200 - - Avoid cache entries with uid@domain@domain prefix - - Depend of the current workflow these paths are reached with - username as uid and sometimes as uid@domain. So in multidomain - environments only append @domain when needed. - -M SoObjects/SOGo/SOGoUserManager.m - commit 772c3b3115d596d28f2e86e0ee75328f583374f0 Author: Ludovic Marcotte Date: Mon May 25 10:43:42 2015 -0400 @@ -1221,18 +13919,6 @@ Date: Fri May 22 13:47:48 2015 -0400 M SoObjects/SOGo/SOGoUserManager.m -commit 725dea5f6f6f1547cbf6f4e740683e424f3f8fb6 -Author: Javier Amor García -Date: Mon May 18 14:43:11 2015 +0200 - - Show 'complexity password' error instead of a generic error - - There is not discrimination between complexity and - length errors because LDAP does not - return different error codes for each case. - -M SoObjects/SOGo/LDAPSource.m - commit 1e0473f1e51bc1ae5e6b1a7e75a04f2849f6494b Author: Francis Lachapelle Date: Fri May 22 07:58:26 2015 -0400 @@ -1303,43 +13989,6 @@ Date: Thu May 21 21:35:13 2015 -0400 M UI/WebServerResources/SOGoTimePicker.js -commit 76dd53b4619c833ade32a54b0cdcdd545a0d36e6 -Author: Jesús García Sáez -Date: Wed May 20 12:30:05 2015 +0200 - - Fix conflicts with externalLoginWithEmail + DomainBasedUid - - On multidomain environment (SOGoEnableDomainBasedUID) with email for imap - authentication (SOGoForceExternalLoginWithEmail) we need to use uid@domain - instead of just uid in method getEmailForUID - -M SoObjects/SOGo/SOGoUserManager.m - -commit 020c8959258928a1e99ec4dafb2e1dedf8eeb9b2 -Author: Jesús García Sáez -Date: Wed May 20 11:44:06 2015 +0200 - - Avoid uid+attributes entries on shared cache - - In multidomain environments this will produce that info@domain1.com - can read info@domain2.com emails when info@domain2.com log in after - info@domain1.com is already logged in. - - If multidomain is not enabled, this action is not needed because - uid+attributes has been already saved on shared cache - -M SoObjects/SOGo/SOGoUserManager.m - -commit f4963df50f9aca4ebf7dc49b54d6de5159eaa347 -Author: Ludovic Marcotte -Date: Tue May 19 13:48:59 2015 -0400 - - (fix) avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES - -M SoObjects/SOGo/SOGoUserFolder.m -M SoObjects/SOGo/SOGoUserManager.m -M UI/MainUI/SOGoRootPage.m - commit e40be922048b284597fb6711da60ad89e155acee Author: Ludovic Marcotte Date: Thu May 21 08:48:45 2015 -0400 @@ -1372,21 +14021,6 @@ Date: Wed May 20 13:51:16 2015 -0400 M UI/WebServerResources/AdministrationUI.js -commit 7160d94e91142412ab7a8252effbd3b8764ad70e -Author: Jesús García Sáez -Date: Wed May 20 18:32:44 2015 +0200 - - Set domain before fetching auth sources - - In multidomain environment right now we are trying to authenticate against - all sources defined in sogo.conf because the domain is not set at this point. - - In sogo.conf we have to specify the domain a source is useful for, so with this - patch instead of 'n' tries of authentication we will perform only 1 (in a scenario - where we have 1 source per domain, and we have 'n' domains). - -M SoObjects/SOGo/SOGoUserManager.m - commit 416711ea43af4fe1c7095111ef6beef5fb577432 Author: Ludovic Marcotte Date: Tue May 19 13:48:59 2015 -0400 @@ -15015,6 +27649,26 @@ M UI/WebServerResources/ckeditor/lang/uk.js A UI/WebServerResources/ckeditor/plugins/wsc/dialogs/tmp.html M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.js +commit 2d5f2d88fa1ca7c49e55fabb42fb5e382bfdfe99 +Author: Pablo Carranza +Date: Tue Nov 5 22:32:35 2013 -0600 + + Revert "Started Ubuntu w/PostgreSQL tutorial" + + This reverts commit 51d23729763cfa3d4d67f41fb154a7130ea1025d. + +D tutorials/ubuntu_postgresql.md + +commit eb5ca2cba6d0eb41b3e917b9b455d4431add3498 +Author: Pablo Carranza +Date: Tue Nov 5 22:31:54 2013 -0600 + + Revert "Update ubuntu_postgresql.md" + + This reverts commit 92d68de332290863570e0661abdf03d348a07755. + +M tutorials/ubuntu_postgresql.md + commit 47c4ad5807fb1f982035c4dcdd9a400289afa143 Author: Ludovic Marcotte Date: Tue Oct 29 20:58:26 2013 -0400 @@ -15074,6 +27728,54 @@ M SoObjects/Mailer/GNUmakefile M SoObjects/Mailer/NSString+Mail.h M SoObjects/Mailer/NSString+Mail.m +commit 54cd55ebefec9b4a404312e3b6d4910f2024c747 +Author: Pablo Carranza +Date: Sat Oct 19 13:15:13 2013 -0500 + + Update README.md + +M README.md + +commit 5f4ab6eaaff9f7248d9561b019b12cd61d407428 +Author: Pablo Carranza +Date: Sat Oct 19 13:11:36 2013 -0500 + + Update README.md + +M README.md + +commit 1d8e6b6295b75493c839b8330acb19448a9ed7cd +Author: Pablo Carranza +Date: Sat Oct 19 13:03:40 2013 -0500 + + Update README.md + +M README.md + +commit aa791b257116d1adf03257c4e9f5848a9e6b130c +Author: Pablo Carranza +Date: Sat Oct 19 12:42:31 2013 -0500 + + Create README.md + +A README.md + +commit 92d68de332290863570e0661abdf03d348a07755 +Author: Pablo Carranza +Date: Sat Oct 19 12:25:19 2013 -0500 + + Update ubuntu_postgresql.md + +M tutorials/ubuntu_postgresql.md + +commit 51d23729763cfa3d4d67f41fb154a7130ea1025d +Author: Pablo Carranza +Date: Sat Oct 19 12:17:39 2013 -0500 + + Started Ubuntu w/PostgreSQL tutorial + +A tutorials/ubuntu_postgresql.md + commit 656869a4a2e0572f9f4179707d3863860fa38632 Author: Ludovic Marcotte Date: Fri Oct 18 13:16:30 2013 -0400 diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index de828a6d7..6851dad81 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -170,7 +170,7 @@ supported by SOGo: * Red Hat Enterprise Linux (RHEL) Server 5, 6 and 7 * Community ENTerprise Operating System (CentOS) 5, 6 and 7 * Debian GNU/Linux 6.0 (Squeeze) to 8.0 (Jessie) -* Ubuntu 10.04 (Lucid) to 14.04 (Trusty) +* Ubuntu 12.04 (Precise) to 14.04 (Trusty) Make sure the required components are started automatically at boot time and that they are running before proceeding with the SOGo configuration. diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index ac4679a07..77917839c 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -233,6 +233,7 @@ Installation This section will guide you through the installation of the native Microsoft Outlook compatibility layer SOGo offers. +//// Red Hat Enterprise Linux v6 x86_64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -316,7 +317,7 @@ from this guide. On Ubuntu 12.04, the Samba init scripts need to be modified to disable the upstart check. For more details, refer to: https://wiki.samba.org/index.php/Samba4/InitScript - +//// Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -387,7 +388,7 @@ Run the following commands as root:  ---- samba-tool domain provision --realm=example.com \ - --domain=OPENCHANGE \ + --domain=EXAMPLE \ --adminpass='%1OpenChange' \ --server-role='domain controller' @@ -395,7 +396,7 @@ samba-tool user setexpiry administrator --noexpiry ---- You might consider changing the realm and domain used, to suit your -enviroment. +environment. You might also have to remove `/etc/samba/smb.conf` prior running this command. @@ -441,7 +442,7 @@ Your Samba 4 configuration file should look like this: OpenChange Configuration ~~~~~~~~~~~~~~~~~~~~~~~~ -OpenChange 2.2 stores its metadata in MySQL so you need to have it installed. +Since v2.2, OpenChange stores its metadata in MySQL so you need to have it installed. First, create the OpenChange MySQL user: @@ -512,9 +513,11 @@ mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/op mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange ---- +//// On RHEL, make sure SELinux is disabled: setenforce 0 +//// Next, you can start Samba using the usual command: @@ -545,9 +548,11 @@ This service runs as a WSGI application under apache (mod_wsgi). While HTTPS is not required to access this service, it is strongly recommended. +//// On RHEL-based distributions, the apache configuration required by these services can be found in `/etc/httpd/conf.d/ocsmanager.conf` and `/etc/httpd/conf.d/rpcproxy.conf`. +//// For Debian-based distributions, these files can be found in `/etc/apache2/conf.d/` or `/etc/apache2/conf-available`. @@ -563,8 +568,10 @@ The OCS Manager and RPC Proxy configuration module can be enabled using: a2enconf ocsmanager a2enconf rpcproxy +//// On RHEL-based distributions, make sure the `LoadModule` directive is uncommented in `/etc/httpd/conf.d/wsgi.conf`. +//// The _reqtimeout_ apache module is known to cause problems when using the default configuration shipped with Debian-based systems. On such @@ -580,10 +587,12 @@ To avoid this problem, use a much higher timeout or disable the module: a2dismod reqtimeout You should now restart the Apache service and make sure it will start on -boot. On RHEL-based distributions, do: +boot. +//// +On RHEL-based distributions, do: chkconfig httpd on && /etc/init.d/httpd restart - +//// On Debian-based distributions, do: update-rc.d apache2 defaults && /etc/init.d/apache2 restart @@ -809,11 +818,10 @@ can be ignored for now. This feature is currently not supported. remove any data associated with the user from the SOGo server and recreate a Microsoft Outlook profile. To remove any data associated to a user, use -the `openchange_user_cleanup` script distributed with SOGo. The script -can be found in `/usr/share/doc/sogo/` (`/usr/share/sogo-VERSION/` on -RHEL). +the `openchange_user_cleanup` script distributed with OpenChange. The script +can be found in `/usr/share/openchange/`. To reset a user, run the script as root: -`python openchange_user_cleanup username`. See the usage output for additional options. +`openchange_user_cleanup username`. See the usage output for additional options. * The "Out of Office Assistant" will not currently work. This feature has not been implemented. * Creating folders below INBOX (when not normally permitted by the IMAP diff --git a/Main/SOGo+DAV.m b/Main/SOGo+DAV.m index 256abdba9..994e742e6 100644 --- a/Main/SOGo+DAV.m +++ b/Main/SOGo+DAV.m @@ -267,7 +267,7 @@ NSObject *list; NSObject *valueNode; NSArray *elements; - NSString *property, *match; + NSString *property=nil, *match=nil; list = [searchElement getElementsByTagName: @"prop"]; if ([list length]) diff --git a/NEWS b/NEWS index 4ddf40757..190c1da46 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,88 @@ -2.3.x (2015-MM-DD) +2.3.4 (YYYY-MM-DD) ------------------ +New features + - Initial support for EAS calendar exceptions + +Enhancements + - limit the maximum width of toolbar buttons + + +Bug fixes + - JavaScript exception when printing events from calendars with no assigned color (#3203) + - EAS fix for wrong charset being used (#3392) + - EAS fix on qp-encoded subjects (#3390) + - correctly handle all-day event exceptions when the master event changes + - prevent characters in calendar component UID causing issues during import process + +2.3.3a (2015-11-18) +------------------- + +Bug fixes + - expanded mail folders list is not saved (#3386) + - cleanup translations + +2.3.3 (2015-11-11) +------------------ + +New features + - initial S/MIME support for EAS (#3327) + - now possible to choose which folders to sync over EAS + +Enhancements + - we no longer always entirely rewrite messages for Outlook 2013 when using EAS + - support for ghosted elements on contacts over EAS + - added Macedonian (mk_MK) translation - thanks to Miroslav Jovanovic + - added Portuguese (pt) translation - thanks to Eduardo Crispim + +Bug fixes + - numerous EAS fixes when connections are dropped before the EAS client receives the response (#3058, #2849) + - correctly handle the References header over EAS (#3365) + - make sure English is always used when generating Date headers using EAS (#3356) + - don't escape quoted strings during versit generation + - we now return all cards when we receive an empty addressbook-query REPORT + - avoid crash when replying to a mail with no recipients (#3359) + - inline images sent from SOGo webmail are not displayed in Mozilla Thunderbird (#3271) + - prevent postal address showing on single line over EAS (#2614) + - display missing events when printing working hours only + - fix corner case making server crash when syncing hard deleted messages when clear offline items was set up (Zentyal) + - avoid infinite Outlook client loops trying to set read flag when it is already set (Zentyal) + - avoid crashing when calendar metadata is missing in the cache (Zentyal) + - fix recurrence pattern event corner case created by Mozilla Thunderbird which made server crash (Zentyal) + - fix corner case that removes attachments on sending messages from Outlook (Zentyal) + - freebusy on web interface works again in multidomain environments (Zentyal) + - fix double creation of folders in Outlook when the folder name starts with a digit (Zentyal) + - avoid crashing Outlook after setting a custom view in a calendar folder (Zentyal) + - handle emails having an attachment as their content + - fixed JavaScript syntax error in attendees editor + - fixed wrong comparison of meta vs. META tag in HTML mails + - fixed popup menu position when moved to the left (#3381) + - fixed dialog position when at the bottom of the window (#2646, #3378) + - fixed addressbrook-only source entires having a c_uid set + +2.3.2 (2015-09-16) +------------------ + +Enhancements + - improved EAS speed and memory usage, avoiding many IMAP LIST commands (#3294) + - improved EAS speed during initial syncing of large mailboxes (#3293) + - updated CKEditor to version 4.5.3 + Bug fixes - fixed display of whitelisted attendees in Preferences window on Firefox (#3285) - - Non-latin subfolder names are displayed correctly on Outlook (Zentyal) - - Fixed several sync issues on environments with multiple users (Zentyal) - - Folders from other users will no longer appear on your Outlook (Zentyal) - - Use right auth in multidomain environments in contacts and calendar from Outlook (Zentyal) - - Session fix when SOGoEnableDomainBasedUID is enabled but logins are domain-less + - non-latin subfolder names are displayed correctly on Outlook (Zentyal) + - fixed several sync issues on environments with multiple users (Zentyal) + - folders from other users will no longer appear on your Outlook (Zentyal) + - use right auth in multidomain environments in contacts and calendar from Outlook (Zentyal) + - session fix when SOGoEnableDomainBasedUID is enabled but logins are domain-less + - less sync issues when setting read flag (Zentyal) + - attachments with non-latin filenames sent by Outlook are now received (Zentyal) + - support attachments from more mail clients (Zentyal) + - avoid conflicting message on saving a draft mail (Zentyal) + - less conflicting messages in Outlook while moving messages between folders (Zentyal) + - start/end shifting by 1 hour due to timezone change on last Sunday of October 2015 (#3344) + - fixed localization of calendar categories with empty profile (#3295) + - fixed options availability in contextual menu of Contacts module (#3342) 2.3.1 (2015-07-23) ------------------ @@ -20,6 +95,7 @@ Enhancements - added create-folder subcommand to sogo-tool to create contact and calendar folders - group mail addresses can be used as recipient in Outlook - added 'ActiveSync' module constraints + - updated CKEditor to version 4.5.1 - added Slovenian translation - thanks to Jens Riecken - added Chinese (Taiwan) translation diff --git a/OpenChange/MAPIStoreAuthenticator.h b/OpenChange/MAPIStoreAuthenticator.h index fc41d25d1..ce88a60be 100644 --- a/OpenChange/MAPIStoreAuthenticator.h +++ b/OpenChange/MAPIStoreAuthenticator.h @@ -46,6 +46,9 @@ forURL: (NSURL *) server forceRenew: (BOOL) renew; +- (NSString *) passwordInContext: (WOContext *) context; + + @end #endif /* MAPISTOREAUTHENTICATOR_H */ diff --git a/OpenChange/MAPIStoreAuthenticator.m b/OpenChange/MAPIStoreAuthenticator.m index c3174a615..41e4ed081 100644 --- a/OpenChange/MAPIStoreAuthenticator.m +++ b/OpenChange/MAPIStoreAuthenticator.m @@ -72,4 +72,8 @@ return imapPassword; } +- (NSString *) passwordInContext: (WOContext *) context +{ + return password; +} @end diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 79a11e58b..7f025e400 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -671,7 +671,7 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return newAttachment; } -- (int) setReadFlag: (uint8_t) flag +- (enum mapistore_error) setReadFlag: (uint8_t) flag { return MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreDBMessage.m b/OpenChange/MAPIStoreDBMessage.m index 077f2c708..bb5acbb57 100644 --- a/OpenChange/MAPIStoreDBMessage.m +++ b/OpenChange/MAPIStoreDBMessage.m @@ -22,6 +22,7 @@ #import #import +#import #import #import #import @@ -34,6 +35,7 @@ #import "MAPIStoreDBFolder.h" #import "MAPIStoreDBMessage.h" #import "MAPIStoreTypes.h" +#import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" @@ -43,16 +45,28 @@ @implementation MAPIStoreDBMessage -+ (int) getAvailableProperties: (struct SPropTagArray **) propertiesP - inMemCtx: (TALLOC_CTX *) memCtx ++ (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { struct SPropTagArray *properties; NSUInteger count; - enum MAPITAGS faiProperties[] = { 0x68350102, 0x683c0102, 0x683e0102, - 0x683f0102, 0x68410003, 0x68420102, - 0x68450102, 0x68460003, - // PR_VD_NAME_W, PR_VD_FLAGS, PR_VD_VERSION, PR_VIEW_CLSID - 0x7006001F, 0x70030003, 0x70070003, 0x68330048 }; + + enum MAPITAGS faiProperties[] = { + 0x68330048, /* PR_VIEW_CLSID */ + 0x68350102, /* PR_VIEW_STATE */ + 0x683c0102, + 0x683d0040, + 0x683e0102, + 0x683f0102, /* PR_VIEW_VIEWTYPE_KEY */ + 0x68410003, + 0x68420102, + 0x68450102, + 0x68460003, + 0x7006001F, /* PR_VD_NAME_W */ + 0x70030003, /* PR_VD_FLAGS */ + 0x70070003 /* PR_VD_VERSION */ + }; + size_t faiSize = sizeof(faiProperties) / sizeof(enum MAPITAGS); properties = talloc_zero (memCtx, struct SPropTagArray); @@ -74,6 +88,13 @@ return MAPISTORE_SUCCESS; } +- (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self class] getAvailableProperties: propertiesP + inMemCtx: memCtx]; +} + - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { @@ -104,6 +125,105 @@ return objectVersion; } +- (void) _updatePredecessorChangeList +{ + BOOL updated; + enum mapistore_error rc; + NSData *currentChangeList, *changeKey; + NSMutableArray *changeKeys; + NSMutableData *newChangeList; + NSUInteger count, len; + struct SizedXid *changes; + struct SPropValue property; + struct SRow aRow; + struct XID *currentChangeKey; + TALLOC_CTX *localMemCtx; + uint32_t nChanges; + + localMemCtx = talloc_new (NULL); + if (!localMemCtx) + { + [self errorWithFormat: @"No more memory"]; + return; + } + + changeKey = [self getReplicaKeyFromGlobCnt: [self objectVersion]]; + + currentChangeList = [properties objectForKey: MAPIPropertyKey (PidTagPredecessorChangeList)]; + if (!currentChangeList) + { + /* Create a new PredecessorChangeList */ + len = [changeKey length]; + newChangeList = [NSMutableData dataWithCapacity: len + 1]; + [newChangeList appendUInt8: len]; + [newChangeList appendData: changeKey]; + } + else + { + /* Update current predecessor change list with new change key */ + changes = [currentChangeList asSizedXidArrayInMemCtx: localMemCtx + with: &nChanges]; + + updated = NO; + currentChangeKey = [changeKey asXIDInMemCtx: localMemCtx]; + for (count = 0; count < nChanges && !updated; count++) + { + if (GUID_equal(&changes[count].XID.NameSpaceGuid, ¤tChangeKey->NameSpaceGuid)) + { + NSData *globCnt, *oldGlobCnt; + oldGlobCnt = [NSData dataWithBytes: changes[count].XID.LocalId.data length: changes[count].XID.LocalId.length]; + globCnt = [NSData dataWithBytes: currentChangeKey->LocalId.data length: currentChangeKey->LocalId.length]; + if ([globCnt compare: oldGlobCnt] == NSOrderedDescending) + { + if ([globCnt length] != [oldGlobCnt length]) + { + [self errorWithFormat: @"Cannot compare globcnt with different length: %@ and %@", globCnt, oldGlobCnt]; + abort(); + } + memcpy (changes[count].XID.LocalId.data, currentChangeKey->LocalId.data, currentChangeKey->LocalId.length); + updated = YES; + } + } + } + + /* Serialise it */ + changeKeys = [NSMutableArray array]; + + if (!updated) + [changeKeys addObject: changeKey]; + + for (count = 0; count < nChanges; count++) + { + changeKey = [NSData dataWithXID: &changes[count].XID]; + [changeKeys addObject: changeKey]; + } + + [changeKeys sortUsingFunction: MAPIChangeKeyGUIDCompare context: localMemCtx]; + + newChangeList = [NSMutableData data]; + len = [changeKeys count]; + for (count = 0; count < len; count++) + { + changeKey = [changeKeys objectAtIndex: count]; + [newChangeList appendUInt8: [changeKey length]]; + [newChangeList appendData: changeKey]; + } + } + + if ([newChangeList length] > 0) + { + property.ulPropTag = PidTagPredecessorChangeList; + property.value.bin = *[newChangeList asBinaryInMemCtx: localMemCtx]; + aRow.cValues = 1; + aRow.lpProps = &property; + rc = [self addPropertiesFromRow: &aRow]; + if (rc != MAPISTORE_SUCCESS) + [self errorWithFormat: @"Impossible to add a new predecessor change list: %d", rc]; + } + + talloc_free (localMemCtx); +} + // // FIXME: how this can happen? // @@ -166,6 +286,9 @@ [properties setObject: [NSNumber numberWithUnsignedLongLong: newVersion] forKey: @"version"]; + /* Update PredecessorChangeList accordingly */ + [self _updatePredecessorChangeList]; + [self logWithFormat: @"%d props in dict", [properties count]]; [sogoObject save]; @@ -209,4 +332,36 @@ return [sogoObject lastModified]; } +- (enum mapistore_error) setReadFlag: (uint8_t) flag +{ + /* Modify PidTagMessageFlags from SetMessageReadFlag and + SyncImportReadStateChanges ROPs */ + NSNumber *flags; + uint32_t newFlag; + + flags = [properties objectForKey: MAPIPropertyKey (PR_MESSAGE_FLAGS)]; + if (flags) + { + newFlag = [flags unsignedLongValue]; + if (flag & SUPPRESS_RECEIPT) + newFlag |= MSGFLAG_READ; + if (flag & CLEAR_RN_PENDING) + newFlag &= ~MSGFLAG_RN_PENDING; + if (flag & CLEAR_READ_FLAG) + newFlag &= ~MSGFLAG_READ; + if (flag & CLEAR_NRN_PENDING) + newFlag &= ~MSGFLAG_NRN_PENDING; + } + else + { + newFlag = MSGFLAG_READ; + if (flag & CLEAR_READ_FLAG) + newFlag = 0x0; + } + [properties setObject: [NSNumber numberWithUnsignedLong: newFlag] + forKey: MAPIPropertyKey (PR_MESSAGE_FLAGS)]; + + return MAPISTORE_SUCCESS; +} + @end diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index b16e4b91f..3f3bfb204 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -121,6 +121,7 @@ fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists wantCopy: (uint8_t) want_copy inMemCtx: (TALLOC_CTX *) memCtx; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 7ca80e749..735c04cd6 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -642,6 +642,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe fromFolder: (MAPIStoreFolder *) sourceFolder withMID: (uint64_t) targetMid andChangeKey: (struct Binary_r *) targetChangeKey + andPredecessorChangeList: (struct Binary_r *) targetPredecessorChangeList wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx { @@ -669,15 +670,18 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe [sourceMsg copyToMessage: destMsg inMemCtx: memCtx]; - if (targetChangeKey) + if (targetPredecessorChangeList) { - property.ulPropTag = PidTagChangeKey; - property.value.bin = *targetChangeKey; + property.ulPropTag = PidTagPredecessorChangeList; + property.value.bin = *targetPredecessorChangeList; aRow.cValues = 1; aRow.lpProps = &property; rc = [destMsg addPropertiesFromRow: &aRow]; if (rc != MAPISTORE_SUCCESS) - goto end; + { + [self errorWithFormat: @"Cannot add PredecessorChangeList on move"]; + goto end; + } } [destMsg save: memCtx]; if (!wantCopy) @@ -696,6 +700,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx { @@ -705,7 +710,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSString *oldMessageURL; MAPIStoreMapping *mapping; SOGoUser *ownerUser; - struct Binary_r *targetChangeKey; + struct Binary_r *targetChangeKey, *targetPredecessorChangeList; //TALLOC_CTX *memCtx; //memCtx = talloc_zero (NULL, TALLOC_CTX); @@ -726,14 +731,21 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if (oldMessageURL) { [oldMessageURLs addObject: oldMessageURL]; - if (targetChangeKeys) - targetChangeKey = targetChangeKeys[count]; + if (targetChangeKeys && targetPredecessorChangeList) + { + targetChangeKey = targetChangeKeys[count]; + targetPredecessorChangeList = targetPredecessorChangeLists[count]; + } else - targetChangeKey = NULL; + { + targetChangeKey = NULL; + targetPredecessorChangeList = NULL; + } rc = [self _moveCopyMessageWithMID: srcMids[count] fromFolder: sourceFolder withMID: targetMids[count] andChangeKey: targetChangeKey + andPredecessorChangeList: targetPredecessorChangeList wantCopy: wantCopy inMemCtx: memCtx]; } diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index d4e3660f1..de2b9692b 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -41,8 +41,10 @@ /* synchronisation */ - (BOOL) synchroniseCache; +- (BOOL) synchroniseCacheFor: (NSString *) nameInContainer; - (void) updateVersionsForMessageWithKey: (NSString *) messageKey - withChangeKey: (NSData *) newChangeKey; + withChangeKey: (NSData *) oldChangeKey + andPredecessorChangeList: (NSData *) pcl; - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSString *) changeNumber; - (NSString *) changeNumberForMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index ce4bb870f..2dacdb4cf 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -75,6 +75,7 @@ static Class NSNumberK; [SOGoMAPIDBMessage objectWithName: @"versions.plist" inContainer: dbFolder]); [versionsMessage setObjectType: MAPIInternalCacheObject]; + [versionsMessage reloadIfNeeded]; } - (void) dealloc @@ -261,7 +262,6 @@ static Class NSNumberK; */ - (void) _setChangeKey: (NSData *) changeKey forMessageEntry: (NSMutableDictionary *) messageEntry - inChangeListOnly: (BOOL) inChangeListOnly { struct XID *xid; NSString *guid; @@ -270,19 +270,15 @@ static Class NSNumberK; NSMutableDictionary *changeList; xid = [changeKey asXIDInMemCtx: NULL]; - guid = [NSString stringWithGUID: &xid->GUID]; - globCnt = [NSData dataWithBytes: xid->Data length: xid->Size]; + guid = [NSString stringWithGUID: &xid->NameSpaceGuid]; + globCnt = [NSData dataWithBytes: xid->LocalId.data length: xid->LocalId.length]; talloc_free (xid); - if (!inChangeListOnly) - { - /* 1. set change key association */ - changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: - guid, @"GUID", - globCnt, @"LocalId", - nil]; - [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; - } + /* 1. set change key association */ + changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: guid, @"GUID", + globCnt, @"LocalId", + nil]; + [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; /* 2. append/update predecessor change list */ changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; @@ -296,6 +292,77 @@ static Class NSNumberK; [changeList setObject: globCnt forKey: guid]; } +- (void) _updatePredecessorChangeList: (NSData *) predecessorChangeList + forMessageEntry: (NSMutableDictionary *) messageEntry + withOldChangeKey: (NSData *) oldChangeKey +{ + NSData *globCnt, *oldGlobCnt; + NSDictionary *changeKeyDict; + NSString *guid; + NSMutableDictionary *changeList; + struct SizedXid *sizedXIDList; + struct XID xid, *givenChangeKey; + TALLOC_CTX *localMemCtx; + uint32_t i, length; + + localMemCtx = talloc_new (NULL); + if (!localMemCtx) + { + [self errorWithFormat: @"No more memory"]; + return; + } + + if (predecessorChangeList) + { + sizedXIDList = [predecessorChangeList asSizedXidArrayInMemCtx: localMemCtx with: &length]; + + changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; + if (!changeList) + { + changeList = [NSMutableDictionary new]; + [messageEntry setObject: changeList + forKey: @"PredecessorChangeList"]; + [changeList release]; + } + + if (sizedXIDList) { + for (i = 0; i < length; i++) + { + xid = sizedXIDList[i].XID; + guid = [NSString stringWithGUID: &xid.NameSpaceGuid]; + globCnt = [NSData dataWithBytes: xid.LocalId.data length: xid.LocalId.length]; + oldGlobCnt = [changeList objectForKey: guid]; + if (!oldGlobCnt || ([globCnt compare: oldGlobCnt] == NSOrderedDescending)) + [changeList setObject: globCnt forKey: guid]; + } + } + } + + if (oldChangeKey) + { + givenChangeKey = [oldChangeKey asXIDInMemCtx: localMemCtx]; + if (givenChangeKey) { + guid = [NSString stringWithGUID: &givenChangeKey->NameSpaceGuid]; + globCnt = [NSData dataWithBytes: givenChangeKey->LocalId.data length: givenChangeKey->LocalId.length]; + + changeKeyDict = [messageEntry objectForKey: @"ChangeKey"]; + if (!changeKeyDict || + ([guid isEqualToString: [changeKeyDict objectForKey: @"GUID"]] + && ([globCnt compare: [changeKeyDict objectForKey: @"LocalId"]] == NSOrderedDescending))) + { + /* The given change key is greater than current one stored in + metadata or it does not exist */ + [messageEntry setObject: [NSDictionary dictionaryWithObjectsAndKeys: guid, @"GUID", + globCnt, @"LocalId", + nil] + forKey: @"ChangeKey"]; + } + } + } + + talloc_free (localMemCtx); +} + - (EOQualifier *) componentQualifier { if (!componentQualifier) @@ -465,8 +532,7 @@ static Class NSNumberK; // A GLOBCNT structure is a 6-byte global namespace counter, // we strip the first 2 bytes. The first two bytes is the ReplicaId changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16]; - [self _setChangeKey: changeKey forMessageEntry: messageEntry - inChangeListOnly: NO]; + [self _setChangeKey: changeKey forMessageEntry: messageEntry]; } now = [NSCalendarDate date]; @@ -482,13 +548,123 @@ static Class NSNumberK; return rc; } +- (BOOL) synchroniseCacheFor: (NSString *) nameInContainer +{ + /* Try to synchronise old messages in versions.plist cache using an + specific c_name. It returns a boolean indicating if the + synchronisation was carried out succesfully. + + It should be used as last resort, keeping synchroniseCache as the + main sync entry point. */ + + uint64_t changeNumber; + NSString *changeNumberStr; + NSData *changeKey; + NSNumber *cLastModified, *cDeleted, *cVersion; + EOFetchSpecification *fs; + EOQualifier *searchQualifier, *fetchQualifier; + NSArray *fetchResults; + NSDictionary *result; + NSMutableDictionary *currentProperties, *messages, *mapping, *messageEntry; + GCSFolder *ocsFolder; + static NSArray *fields; + + [versionsMessage reloadIfNeeded]; + currentProperties = [versionsMessage properties]; + + messages = [currentProperties objectForKey: @"Messages"]; + if (!messages) + { + messages = [NSMutableDictionary new]; + [currentProperties setObject: messages forKey: @"Messages"]; + [messages release]; + } + + messageEntry = [messages objectForKey: nameInContainer]; + if (!messageEntry) + { + /* Fetch the message by its name */ + if (!fields) + fields = [[NSArray alloc] + initWithObjects: @"c_name", @"c_version", @"c_lastmodified", + @"c_deleted", nil]; + + searchQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_name" + operatorSelector: EOQualifierOperatorEqual + value: nameInContainer]; + fetchQualifier = [[EOAndQualifier alloc] + initWithQualifiers: searchQualifier, + [self contentComponentQualifier], + nil]; + [fetchQualifier autorelease]; + [searchQualifier release]; + + ocsFolder = [sogoObject ocsFolder]; + fs = [EOFetchSpecification + fetchSpecificationWithEntityName: [ocsFolder folderName] + qualifier: fetchQualifier + sortOrderings: nil]; + fetchResults = [ocsFolder fetchFields: fields + fetchSpecification: fs + ignoreDeleted: NO]; + + if ([fetchResults count] == 1) + { + result = [fetchResults objectAtIndex: 0]; + cLastModified = [result objectForKey: @"c_lastmodified"]; + cDeleted = [result objectForKey: @"c_deleted"]; + if ([cDeleted isKindOfClass: NSNumberK] && [cDeleted intValue]) + cVersion = [NSNumber numberWithInt: -1]; + else + cVersion = [result objectForKey: @"c_version"]; + + changeNumber = [[self context] getNewChangeNumber]; + changeNumberStr = [NSString stringWithUnsignedLongLong: changeNumber]; + + /* Create new message entry in Messages dict */ + messageEntry = [NSMutableDictionary new]; + [messages setObject: messageEntry forKey: nameInContainer]; + [messageEntry release]; + + /* Store cLastModified, cVersion and the change number */ + [messageEntry setObject: cLastModified forKey: @"c_lastmodified"]; + [messageEntry setObject: cVersion forKey: @"c_version"]; + [messageEntry setObject: changeNumberStr forKey: @"version"]; + + /* Store the change key */ + changeKey = [self getReplicaKeyFromGlobCnt: changeNumber >> 16]; + [self _setChangeKey: changeKey forMessageEntry: messageEntry]; + + /* Store the changeNumber -> cLastModified mapping */ + mapping = [currentProperties objectForKey: @"VersionMapping"]; + if (!mapping) + { + mapping = [NSMutableDictionary new]; + [currentProperties setObject: mapping forKey: @"VersionMapping"]; + [mapping release]; + } + [mapping setObject: cLastModified forKey: changeNumberStr]; + + /* Save the message */ + [versionsMessage save]; + return YES; + } + else + return NO; + } + + /* If message entry exists, then synchroniseCache did its job */ + return YES; +} + - (void) updateVersionsForMessageWithKey: (NSString *) messageKey - withChangeKey: (NSData *) newChangeKey + withChangeKey: (NSData *) oldChangeKey + andPredecessorChangeList: (NSData *) pcl { NSMutableDictionary *messages, *messageEntry; [self synchroniseCache]; - if (newChangeKey) + if (oldChangeKey || pcl) { messages = [[versionsMessage properties] objectForKey: @"Messages"]; messageEntry = [messages objectForKey: messageKey]; @@ -496,8 +672,8 @@ static Class NSNumberK; [NSException raise: @"MAPIStoreIOException" format: @"no version record found for message '%@'", messageKey]; - [self _setChangeKey: newChangeKey forMessageEntry: messageEntry - inChangeListOnly: YES]; + [self _updatePredecessorChangeList: pcl forMessageEntry: messageEntry + withOldChangeKey: oldChangeKey]; [versionsMessage save]; } } diff --git a/OpenChange/MAPIStoreGCSMessage.m b/OpenChange/MAPIStoreGCSMessage.m index 7ab05e5f1..2f7afeada 100644 --- a/OpenChange/MAPIStoreGCSMessage.m +++ b/OpenChange/MAPIStoreGCSMessage.m @@ -180,7 +180,8 @@ { uint64_t version = ULLONG_MAX; NSString *changeNumber; - + BOOL synced; + if (!isNew) { changeNumber = [(MAPIStoreGCSFolder *) container @@ -189,16 +190,28 @@ { [self warnWithFormat: @"attempting to get change number" @" by synchronising folder..."]; - [(MAPIStoreGCSFolder *) container synchroniseCache]; - changeNumber = [(MAPIStoreGCSFolder *) container - changeNumberForMessageWithKey: [self nameInContainer]]; - - if (changeNumber) - [self logWithFormat: @"got one"]; - else + synced = [(MAPIStoreGCSFolder *) container synchroniseCache]; + if (synced) { - [self errorWithFormat: @"still nothing. We crash!"]; - abort(); + changeNumber = [(MAPIStoreGCSFolder *) container + changeNumberForMessageWithKey: [self nameInContainer]]; + } + if (!changeNumber) + { + [self warnWithFormat: @"attempting to get change number" + @" by synchronising this specific message..."]; + synced = [(MAPIStoreGCSFolder *) container + synchroniseCacheFor: [self nameInContainer]]; + if (synced) + { + changeNumber = [(MAPIStoreGCSFolder *) container + changeNumberForMessageWithKey: [self nameInContainer]]; + } + if (!changeNumber) + { + [self errorWithFormat: @"still nothing. We crash!"]; + abort(); + } } } version = [changeNumber unsignedLongLongValue] >> 16; @@ -209,13 +222,16 @@ - (void) updateVersions { - NSData *newChangeKey; + /* Update ChangeKey and PredecessorChangeList on message's save */ + NSData *newChangeKey, *predecessorChangeList; newChangeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; + predecessorChangeList = [properties objectForKey: MAPIPropertyKey (PR_PREDECESSOR_CHANGE_LIST)]; [(MAPIStoreGCSFolder *) container - updateVersionsForMessageWithKey: [self nameInContainer] - withChangeKey: newChangeKey]; + updateVersionsForMessageWithKey: [self nameInContainer] + withChangeKey: newChangeKey + andPredecessorChangeList: predecessorChangeList]; } @end diff --git a/OpenChange/MAPIStoreMailAttachment.m b/OpenChange/MAPIStoreMailAttachment.m index 388ad924d..575808f39 100644 --- a/OpenChange/MAPIStoreMailAttachment.m +++ b/OpenChange/MAPIStoreMailAttachment.m @@ -30,6 +30,7 @@ #import #import #import +#import #import "MAPIStoreTypes.h" #import "MAPIStoreMailMessage.h" @@ -108,7 +109,7 @@ static char recordBytes[] = {0xd9, 0xd8, 0x11, 0xa3, 0xe2, 0x90, 0x18, 0x41, 0x9e, 0x04, 0x58, 0x46, 0x9d, 0x6d, 0x1b, 0x68}; - + *data = [[NSData dataWithBytes: recordBytes length: 16] asBinaryInMemCtx: memCtx]; @@ -117,19 +118,7 @@ - (NSString *) _fileName { - NSString *fileName; - NSDictionary *parameters; - - fileName = [[bodyInfo objectForKey: @"parameterList"] - objectForKey: @"name"]; - if (!fileName) - { - parameters = [[bodyInfo objectForKey: @"disposition"] - objectForKey: @"parameterList"]; - fileName = [parameters objectForKey: @"filename"]; - } - - return fileName; + return [bodyInfo filename]; } - (int) getPidTagAttachLongFilename: (void **) data @@ -178,7 +167,7 @@ - (int) getPidTagAttachContentId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx -{ +{ *data = [[bodyInfo objectForKey: @"bodyId"] asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 7ec79ad50..c1f39565f 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -160,23 +160,25 @@ MakeDisplayFolderName (NSString *folderName) for (count = 0; count < max; count++) { context = talloc_zero (memCtx, struct mapistore_contexts_list); - // secondaryFolders has the names (1) Imap4Encoded and (2) asCSSIdentifier - // e.g.: Probl&AOg-mes_SP_de_SP_synchronisation + // secondaryFolders has the names (1) Imap4Encoded ,(2) asCSSIdentifier and (3) "folder"-prefixed + // e.g.: folderProbl&AOg-mes_SP_de_SP_synchronisation currentName = [secondaryFolders objectAtIndex: count]; - // To get the real name we have to revert that (applying the decode functions) - // in reverse order + // To get the real name we have to revert that (applying the decode functions + // in reverse order) // e.g.: Problèmes de synchronisation - realName = [[currentName fromCSSIdentifier] - stringByDecodingImap4FolderName]; + realName = [[[currentName substringFromIndex: 6] + fromCSSIdentifier] + stringByDecodingImap4FolderName]; // And finally to represent that as URI we have to (1) asCSSIdentifier, - // (2) Imap4Encode and (3) AddPercentEscapes - // e.g.: Probl&AOg-mes_SP_de_SP_synchronisation + // (2) Imap4Encode (3) AddPercentEscapes and (4) add the "folder" prefix + // e.g.: folderProbl&AOg-mes_SP_de_SP_synchronisation // In the example there are no percent escapes added because is already ok stringData = [[[realName asCSSIdentifier] stringByEncodingImap4FolderName] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; + stringData = [NSString stringWithFormat: @"folder%@", stringData]; context->url = [[NSString stringWithFormat: @"%@%@", urlBase, stringData] asUnicodeInMemCtx: context]; - context->name = [[realName substringFromIndex: 6] asUnicodeInMemCtx: context]; + context->name = [realName asUnicodeInMemCtx: context]; context->main_folder = false; context->role = MAPISTORE_MAIL_ROLE; context->tag = "tag"; @@ -200,7 +202,7 @@ MakeDisplayFolderName (NSString *folderName) andTDBIndexing: NULL]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; folderName = [NSString stringWithFormat: @"folder%@", - [newFolderName asCSSIdentifier]]; + [[newFolderName stringByEncodingImap4FolderName] asCSSIdentifier]]; newFolder = [SOGoMailFolder objectWithName: folderName inContainer: accountFolder]; if ([newFolder create]) @@ -209,7 +211,7 @@ MakeDisplayFolderName (NSString *folderName) withString: @"%40"], [userName stringByReplacingOccurrencesOfString: @"@" withString: @"%40"], - [[folderName stringByEncodingImap4FolderName] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; + [folderName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; else mapistoreURI = nil; diff --git a/OpenChange/MAPIStoreMailFolder.h b/OpenChange/MAPIStoreMailFolder.h index c56e74862..717868efb 100644 --- a/OpenChange/MAPIStoreMailFolder.h +++ b/OpenChange/MAPIStoreMailFolder.h @@ -52,6 +52,8 @@ - (NSString *) changeNumberForMessageUID: (NSString *) messageUid; - (void) setChangeKey: (NSData *) changeKey forMessageWithKey: (NSString *) messageKey; +- (BOOL) updatePredecessorChangeListWith: (NSData *) changeKey + forMessageWithKey: (NSString *) messageKey; - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index d4defea1e..7c8e4f8ac 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -68,6 +68,8 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; +#include + #undef DEBUG #include #include @@ -109,6 +111,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; [SOGoMAPIDBMessage objectWithName: @"versions.plist" inContainer: dbFolder]); [versionsMessage setObjectType: MAPIInternalCacheObject]; + [versionsMessage reloadIfNeeded]; } - (BOOL) ensureFolderExists @@ -516,6 +519,44 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) return [modseq1 compare: modseq2]; } +- (void) _updatePredecessorChangeListWith: (NSData *) predecessorChangeList + forMessageEntry: (NSMutableDictionary *) messageEntry +{ + NSData *globCnt, *oldGlobCnt; + NSMutableDictionary *changeList; + NSString *guid; + struct SizedXid *sizedXIDList; + struct XID xid; + uint32_t i, length; + + sizedXIDList = [predecessorChangeList asSizedXidArrayInMemCtx: NULL with: &length]; + + changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; + if (!changeList) + { + changeList = [NSMutableDictionary new]; + [messageEntry setObject: changeList + forKey: @"PredecessorChangeList"]; + [changeList release]; + } + + if (sizedXIDList) { + for (i = 0; i < length; i++) + { + xid = sizedXIDList[i].XID; + guid = [NSString stringWithGUID: &xid.NameSpaceGuid]; + globCnt = [NSData dataWithBytes: xid.LocalId.data length: xid.LocalId.length]; + oldGlobCnt = [changeList objectForKey: guid]; + if (!oldGlobCnt || ([globCnt compare: oldGlobCnt] == NSOrderedDescending)) + [changeList setObject: globCnt forKey: guid]; + } + + talloc_free (sizedXIDList); + } + + [versionsMessage save]; +} + - (void) _setChangeKey: (NSData *) changeKey forMessageEntry: (NSMutableDictionary *) messageEntry { @@ -526,8 +567,8 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) NSMutableDictionary *changeList; xid = [changeKey asXIDInMemCtx: NULL]; - guid = [NSString stringWithGUID: &xid->GUID]; - globCnt = [NSData dataWithBytes: xid->Data length: xid->Size]; + guid = [NSString stringWithGUID: &xid->NameSpaceGuid]; + globCnt = [NSData dataWithBytes: xid->LocalId.data length: xid->LocalId.length]; talloc_free (xid); /* 1. set change key association */ @@ -553,8 +594,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { BOOL rc = YES; uint64_t newChangeNum; - NSNumber *ti, *modseq, *initialLastModseq, *lastModseq, - *nextModseq; + NSNumber *ti, *modseq, *lastModseq, *nextModseq; NSString *changeNumber, *uid, *messageKey; uint64_t lastModseqNbr; EOQualifier *searchQualifier; @@ -593,7 +633,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) } lastModseq = [currentProperties objectForKey: @"SyncLastModseq"]; - initialLastModseq = lastModseq; if (lastModseq) { lastModseqNbr = [lastModseq unsignedLongLongValue]; @@ -677,40 +716,37 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) } /* 2. we synchronise expunged UIDs */ - if (initialLastModseq) + fetchResults = [(SOGoMailFolder *) sogoObject + fetchUIDsOfVanishedItems: lastModseqNbr]; + + max = [fetchResults count]; + + changeNumber = nil; + for (count = 0; count < max; count++) { - fetchResults = [(SOGoMailFolder *) sogoObject - fetchUIDsOfVanishedItems: lastModseqNbr]; - - max = [fetchResults count]; - - changeNumber = nil; - for (count = 0; count < max; count++) + uid = [[fetchResults objectAtIndex: count] stringValue]; + if ([messages objectForKey: uid]) { - uid = [[fetchResults objectAtIndex: count] stringValue]; - if ([messages objectForKey: uid]) + if (!changeNumber) { - if (!changeNumber) - { - newChangeNum = [[self context] getNewChangeNumber]; - changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum]; - } - [messages removeObjectForKey: uid]; - [self logWithFormat: @"Removed message entry for UID %@", uid]; - } - else - { - [self logWithFormat:@"Message entry not found for UID %@", uid]; + newChangeNum = [[self context] getNewChangeNumber]; + changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum]; } + [messages removeObjectForKey: uid]; + [self logWithFormat: @"Removed message entry for UID %@", uid]; } - if (changeNumber) + else { - [currentProperties setObject: changeNumber - forKey: @"SyncLastDeleteChangeNumber"]; - [mapping setObject: lastModseq forKey: changeNumber]; - foundChange = YES; + [self logWithFormat:@"Message entry not found for UID %@", uid]; } } + if (changeNumber) + { + [currentProperties setObject: changeNumber + forKey: @"SyncLastDeleteChangeNumber"]; + [mapping setObject: lastModseq forKey: changeNumber]; + foundChange = YES; + } if (foundChange) { @@ -924,8 +960,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) return changeNumber; } -- (void) setChangeKey: (NSData *) changeKey - forMessageWithKey: (NSString *) messageKey +- (NSMutableDictionary *) _messageEntryFromMessageKey: (NSString *) messageKey { NSMutableDictionary *messages, *messageEntry; NSString *messageUid; @@ -936,7 +971,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) messageEntry = [messages objectForKey: messageUid]; if (!messageEntry) { - [self warnWithFormat: @"attempting to synchronise to set the change key for " + [self warnWithFormat: @"attempting to synchronise to get the message entry for " @"this message %@", messageKey]; synced = [self synchroniseCacheForUID: messageUid]; if (synced) @@ -947,11 +982,57 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) abort (); } } - [self _setChangeKey: changeKey forMessageEntry: messageEntry]; + + return messageEntry; +} + +- (void) setChangeKey: (NSData *) changeKey + forMessageWithKey: (NSString *) messageKey +{ + [self _setChangeKey: changeKey + forMessageEntry: [self _messageEntryFromMessageKey: messageKey]]; [versionsMessage save]; } +- (BOOL) updatePredecessorChangeListWith: (NSData *) changeKey + forMessageWithKey: (NSString *) messageKey +{ + /* Update predecessor change list property given the change key. It + returns if the change key has been added to the list or not */ + BOOL added = NO; + NSData *globCnt, *oldGlobCnt; + NSDictionary *messageEntry; + NSMutableDictionary *changeList; + NSString *guid; + struct XID *xid; + + xid = [changeKey asXIDInMemCtx: NULL]; + guid = [NSString stringWithGUID: &xid->NameSpaceGuid]; + globCnt = [NSData dataWithBytes: xid->LocalId.data length: xid->LocalId.length]; + talloc_free (xid); + + messageEntry = [self _messageEntryFromMessageKey: messageKey]; + if (messageEntry) + { + changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; + if (changeList) + { + oldGlobCnt = [changeList objectForKey: guid]; + if (!oldGlobCnt || ([globCnt compare: oldGlobCnt] == NSOrderedDescending)) + { + [changeList setObject: globCnt forKey: guid]; + [versionsMessage save]; + added = YES; + } + } + else + [self errorWithFormat: @"Missing predecessor change list to update"]; + } + + return added; +} + - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey { NSDictionary *messages, *changeKeyDict; @@ -1217,6 +1298,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) fromFolder: (MAPIStoreFolder *) sourceFolder withMIDs: (uint64_t *) targetMids andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists wantCopy: (uint8_t) wantCopy inMemCtx: (TALLOC_CTX *) memCtx @@ -1231,12 +1313,13 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) NSDictionary *result; NSUInteger count; NSArray *a; - NSData *changeKey; + NSData *changeList; if (![sourceFolder isKindOfClass: [MAPIStoreMailFolder class]]) return [super moveCopyMessagesWithMIDs: srcMids andCount: midCount fromFolder: sourceFolder withMIDs: targetMids andChangeKeys: targetChangeKeys + andPredecessorChangeLists: targetPredecessorChangeLists wantCopy: wantCopy inMemCtx: memCtx]; @@ -1325,11 +1408,11 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) [self synchroniseCache]; for (count = 0; count < midCount; count++) { - changeKey = [NSData dataWithBinary: targetChangeKeys[count]]; + changeList = [NSData dataWithBinary: targetPredecessorChangeLists[count]]; messageKey = [NSString stringWithFormat: @"%@.eml", [destUIDs objectAtIndex: count]]; - [self setChangeKey: changeKey - forMessageWithKey: messageKey]; + [self _updatePredecessorChangeListWith: changeList + forMessageEntry: [self _messageEntryFromMessageKey: messageKey]]; } } diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 37d4fc420..55ad92bd0 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -40,6 +40,7 @@ #import #import #import +#import #import "Codepages.h" #import "NSData+MAPIStore.h" @@ -196,7 +197,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) count1 = [keys indexOfObject: data1]; data2 = [entry2 objectForKey: @"mimeType"]; count2 = [keys indexOfObject: data2]; - + if (count1 == count2) { data1 = [entry1 objectForKey: @"key"]; @@ -529,7 +530,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) else stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; - + return MAPISTORE_SUCCESS; } @@ -624,7 +625,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) NSDictionary *coreInfos; NSArray *flags; unsigned int v = 0; - + coreInfos = [sogoObject fetchCoreInfos]; flags = [coreInfos objectForKey: @"flags"]; @@ -636,7 +637,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if ([[self attachmentKeys] count] > 0) v |= MSGFLAG_HASATTACH; - + *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; @@ -656,7 +657,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) v = 2; else v = 0; - + *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; @@ -668,15 +669,15 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) NSDictionary *coreInfos; NSArray *flags; unsigned int v; - + coreInfos = [sogoObject fetchCoreInfos]; - + flags = [coreInfos objectForKey: @"flags"]; if ([flags containsObject: @"flagged"]) v = 6; else v = 0; - + *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; @@ -755,7 +756,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if ([ngAddress isKindOfClass: [NGMailAddress class]]) { cn = [ngAddress displayName]; - + // If we don't have a displayName, we use the email address instead. This // avoid bug #2119 - where Outlook won't display anything in the "From" field, // nor in the recipient field if we reply to the email. @@ -809,7 +810,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) entryId = MAPIStoreExternalEntryId (cn, email); *data = [entryId asBinaryInMemCtx: memCtx]; - + rc = MAPISTORE_SUCCESS; } else @@ -966,15 +967,15 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) { uint32_t v; NSString *s; - + s = [[sogoObject mailHeaders] objectForKey: @"x-priority"]; v = 0x1; - + if ([s hasPrefix: @"1"]) v = 0x2; else if ([s hasPrefix: @"2"]) v = 0x2; else if ([s hasPrefix: @"4"]) v = 0x0; else if ([s hasPrefix: @"5"]) v = 0x0; - + *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; @@ -1163,14 +1164,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if (!headerSetup) [self _fetchHeaderData]; - + if ([headerMimeType isEqualToString: @"text/plain"]) format = EDITOR_FORMAT_PLAINTEXT; else if ([headerMimeType isEqualToString: @"text/html"]) format = EDITOR_FORMAT_HTML; else format = 0; /* EDITOR_FORMAT_DONTKNOW */ - + *data = MAPILongValue (memCtx, format); return MAPISTORE_SUCCESS; @@ -1517,7 +1518,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) p = 0; recipient->data = talloc_array (msgData, void *, msgData->columns->cValues); memset (recipient->data, 0, msgData->columns->cValues * sizeof (void *)); - + // PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE) recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER); p++; @@ -1525,7 +1526,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) // PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI) recipient->data[p] = MAPILongValue (msgData, 0); p++; - + // PR_7BIT_DISPLAY_NAME_UNICODE recipient->data[p] = [cn asUnicodeInMemCtx: msgData]; p++; @@ -1533,7 +1534,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) // PR_SMTP_ADDRESS_UNICODE recipient->data[p] = [email asUnicodeInMemCtx: msgData]; p++; - + // PR_SEND_INTERNET_ENCODING = 0x00060000 (plain text, see OXCMAIL) recipient->data[p] = MAPILongValue (msgData, 0x00060000); p++; @@ -1566,12 +1567,9 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) withPrefix: (NSString *) keyPrefix { NSArray *parts; - NSDictionary *parameters; NSUInteger count, max; - parameters = [[bodyInfo objectForKey: @"disposition"] - objectForKey: @"parameterList"]; - if ([[parameters objectForKey: @"filename"] length] > 0) + if ([[bodyInfo filename] length] > 0) { if ([keyPrefix length] == 0) keyPrefix = @"0"; @@ -1645,15 +1643,13 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return attachment; } -- (int) setReadFlag: (uint8_t) flag +- (enum mapistore_error) setReadFlag: (uint8_t) flag { - NSString *imapFlag = @"\\Seen"; - /* TODO: notifications should probably be emitted from here */ if (flag & CLEAR_READ_FLAG) - [sogoObject removeFlags: imapFlag]; + [properties setObject: [NSNumber numberWithBool: NO] forKey: @"read_flag_set"]; else - [sogoObject addFlags: imapFlag]; + [properties setObject: [NSNumber numberWithBool: YES] forKey: @"read_flag_set"]; return MAPISTORE_SUCCESS; } @@ -1694,9 +1690,12 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return nil; } -- (void) save: (TALLOC_CTX *) memCtx +- (void) save: (TALLOC_CTX *) memCtx { + BOOL modified = NO; + BOOL seen, storedSeenFlag; NSNumber *value; + NSString *imapFlag = @"\\Seen"; value = [properties objectForKey: MAPIPropertyKey (PR_FLAG_STATUS)]; if (value) @@ -1706,8 +1705,35 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) [sogoObject addFlags: @"\\Flagged"]; else /* 0: unflagged, 1: follow up complete */ [sogoObject removeFlags: @"\\Flagged"]; + + modified = YES; } + /* Manage seen flag on save */ + value = [properties objectForKey: @"read_flag_set"]; + if (value) + { + seen = [value boolValue]; + storedSeenFlag = [[[sogoObject fetchCoreInfos] objectForKey: @"flags"] containsObject: @"seen"]; + /* We modify the flags anyway to generate a new change number */ + if (seen) + { + if (storedSeenFlag) + [sogoObject removeFlags: imapFlag]; + [sogoObject addFlags: imapFlag]; + } + else + { + if (!storedSeenFlag) + [sogoObject addFlags: imapFlag]; + [sogoObject removeFlags: imapFlag]; + } + modified = YES; + } + + if (modified) + [(MAPIStoreMailFolder *)[self container] synchroniseCache]; + if (mailIsSharingObject) [[self _sharingObject] saveWithMessage: self andSOGoObject: sogoObject]; diff --git a/OpenChange/MAPIStoreMailMessageTable.m b/OpenChange/MAPIStoreMailMessageTable.m index c13605829..c71097d63 100644 --- a/OpenChange/MAPIStoreMailMessageTable.m +++ b/OpenChange/MAPIStoreMailMessageTable.m @@ -161,15 +161,30 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK; //[self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; //[self logWithFormat: @" modseq: %.16lx", [modseq unsignedLongLongValue]]; if (modseq) - modseq = [NSNumber numberWithUnsignedLongLong: - [modseq unsignedLongLongValue] + 1]; + { + if (res->relop == RELOP_GT) + modseq = [NSNumber numberWithUnsignedLongLong: + [modseq unsignedLongLongValue] + 1]; + + } else modseq = [NSNumber numberWithUnsignedLongLong: 0]; - *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"MODSEQ" - operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo - value: modseq]; - [*qualifier autorelease]; - rc = MAPIRestrictionStateNeedsEval; + + if (res->relop == RELOP_GT || res->relop == RELOP_GE) + { + *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"MODSEQ" + operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo + value: modseq]; + [*qualifier autorelease]; + rc = MAPIRestrictionStateNeedsEval; + } + else + { + /* Ignore other operations as IMAP only support MODSEQ >= X */ + [self warnWithFormat: @"Ignoring %@ as only supported operators are > and >=", + [self operatorFromRestrictionOperator: res->relop]]; + rc = MAPIRestrictionStateAlwaysTrue; + } } break; diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index f2581a54a..d6154c8e8 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -34,6 +34,7 @@ #import #import #import +#import #import #import #import @@ -166,9 +167,9 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; - (BOOL) hasContentId { - return ([properties - objectForKey: MAPIPropertyKey (PR_ATTACH_CONTENT_ID_UNICODE)] - != nil); + NSString *contentId = [properties + objectForKey: MAPIPropertyKey (PR_ATTACH_CONTENT_ID_UNICODE)]; + return contentId && [contentId length] > 0; } - (NGMimeBodyPart *) asMIMEBodyPart @@ -232,7 +233,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; [map addObject: contentDisposition forKey: @"content-disposition"]; contentId = [properties objectForKey: MAPIPropertyKey (PR_ATTACH_CONTENT_ID_UNICODE)]; - if (contentId) + if (contentId && [contentId length] > 0) [map setObject: [NSString stringWithFormat: @"<%@>", contentId] forKey: @"content-id"]; bodyPart = [NGMimeBodyPart bodyPartWithHeader: map]; @@ -285,7 +286,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; version = [properties objectForKey: @"version"]; return (version - ? exchange_globcnt ([version unsignedLongLongValue]) + ? [version unsignedLongLongValue] : ULLONG_MAX); } @@ -1110,7 +1111,8 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS - (void) save: (TALLOC_CTX *) memCtx { - NSString *folderName, *flag, *newIdString, *messageKey; + BOOL updatedMetadata; + NSString *folderName, *flag, *newIdString, *messageKey, *changeNumber; NSData *changeKey, *messageData; NGImap4Connection *connection; NGImap4Client *client; @@ -1146,21 +1148,33 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS [sogoObject setNameInContainer: messageKey]; [mapping registerURL: [self url] withID: mid]; - /* synchronise the cache and update the change key with the one provided - by the client. Before doing this, lets issue a unselect/select combo - because of timing issues with Dovecot in obtaining the latest modseq. - Sometimes, Dovecot doesn't return the newly appended UID if we do - a "UID SORT (DATE) UTF-8 (MODSEQ XYZ) (NOT DELETED)" command (where - XYZ is the HIGHESTMODSEQ+1) immediately after IMAP APPEND */ + /* synchronise the cache and update the predecessor change list + with the change key provided by the client. Before doing + this, lets issue a unselect/select combo because of timing + issues with Dovecot in obtaining the latest modseq. + Sometimes, Dovecot doesn't return the newly appended UID if + we do a "UID SORT (DATE) UTF-8 (MODSEQ XYZ) (NOT DELETED)" + command (where XYZ is the HIGHESTMODSEQ+1) immediately after + IMAP APPEND */ [client unselect]; [client select: folderName]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (changeKey) - [(MAPIStoreMailFolder *) container - setChangeKey: changeKey - forMessageWithKey: messageKey]; + { + updatedMetadata = [(MAPIStoreMailFolder *) container updatePredecessorChangeListWith: changeKey + forMessageWithKey: messageKey]; + if (!updatedMetadata) + [self warnWithFormat: @"Predecessor change list not updated with client data"]; + } + + /* Update version property (PR_CHANGE_KEY indeed) as it is + requested once it is saved */ + changeNumber = [(MAPIStoreMailFolder *) container changeNumberForMessageUID: newIdString]; + if (changeNumber) + [properties setObject: [NSNumber numberWithUnsignedLongLong: [changeNumber unsignedLongLongValue] >> 16] + forKey: @"version"]; } } diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index 6fa42218c..f914e543a 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -63,7 +63,7 @@ withAID: (uint32_t) aid; - (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr andRowCount: (uint32_t *) countPtr; -- (int) setReadFlag: (uint8_t) flag; +- (enum mapistore_error) setReadFlag: (uint8_t) flag; - (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx; - (NSArray *) activeContainerMessageTables; diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index b842b2d6c..e6bda4578 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -549,11 +549,12 @@ rtf2html (NSData *compressedRTF) } [self save: memCtx]; - /* We make sure that any change-related properties are removes from the + /* We make sure that any change-related properties are removed from the properties dictionary, to make sure that related methods will be invoked the next time they are requested. */ [properties removeObjectForKey: MAPIPropertyKey (PidTagChangeKey)]; [properties removeObjectForKey: MAPIPropertyKey (PidTagChangeNumber)]; + [properties removeObjectForKey: MAPIPropertyKey (PidTagPredecessorChangeList)]; if ([container isKindOfClass: MAPIStoreFolderK]) { @@ -918,7 +919,7 @@ rtf2html (NSData *compressedRTF) return [self getNo: data inMemCtx: memCtx];; } -- (int) setReadFlag: (uint8_t) flag +- (enum mapistore_error) setReadFlag: (uint8_t) flag { // [self subclassResponsibility: _cmd]; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index c11967a0e..9ccec826c 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -674,6 +674,7 @@ sogo_folder_move_copy_messages(void *folder_object, uint32_t mid_count, uint64_t *src_mids, uint64_t *t_mids, struct Binary_r **target_change_keys, + struct Binary_r **target_predecessor_change_lists, uint8_t want_copy) { MAPIStoreFolder *sourceFolder, *targetFolder; @@ -698,6 +699,7 @@ sogo_folder_move_copy_messages(void *folder_object, fromFolder: sourceFolder withMIDs: t_mids andChangeKeys: target_change_keys + andPredecessorChangeLists: target_predecessor_change_lists wantCopy: want_copy inMemCtx: mem_ctx]; TRYCATCH_END(pool) @@ -1118,7 +1120,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (message_object) { diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 20bf67f8b..12a348d4c 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -531,7 +531,7 @@ } [vToDo setTimeStampAsDate: now]; - [sogoObject saveComponent: vCalendar]; + [sogoObject saveCalendar: vCalendar]; [self updateVersions]; } diff --git a/OpenChange/NSData+MAPIStore.h b/OpenChange/NSData+MAPIStore.h index 5715b9128..13daa8aef 100644 --- a/OpenChange/NSData+MAPIStore.h +++ b/OpenChange/NSData+MAPIStore.h @@ -41,6 +41,8 @@ + (id) dataWithXID: (const struct XID *) xid; - (struct XID *) asXIDInMemCtx: (void *) memCtx; +- (struct SizedXid *) asSizedXidArrayInMemCtx: (void *) memCtx + with: (uint32_t *) length; + (id) dataWithChangeKeyGUID: (NSString *) guidString andCnt: (NSData *) globCnt; diff --git a/OpenChange/NSData+MAPIStore.m b/OpenChange/NSData+MAPIStore.m index 44b6dcf85..5a2afeb1d 100644 --- a/OpenChange/NSData+MAPIStore.m +++ b/OpenChange/NSData+MAPIStore.m @@ -22,6 +22,7 @@ #import +#import "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" #import "NSString+MAPIStore.h" @@ -29,6 +30,7 @@ #undef DEBUG #include +#include #include #include #include @@ -136,11 +138,11 @@ static void _fillFlatUIDWithGUID (struct FlatUID_r *flatUID, const struct GUID * NSMutableData *xidData; struct FlatUID_r flatUID; - _fillFlatUIDWithGUID (&flatUID, &xid->GUID); + _fillFlatUIDWithGUID (&flatUID, &xid->NameSpaceGuid); - xidData = [NSMutableData dataWithCapacity: 16 + xid->Size]; + xidData = [NSMutableData dataWithCapacity: 16 + xid->LocalId.length]; [xidData appendBytes: flatUID.ab length: 16]; - [xidData appendBytes: xid->Data length: xid->Size]; + [xidData appendBytes: xid->LocalId.data length: xid->LocalId.length]; return xidData; } @@ -156,12 +158,12 @@ static void _fillFlatUIDWithGUID (struct FlatUID_r *flatUID, const struct GUID * { xid = talloc_zero (memCtx, struct XID); - [self _extractGUID: &xid->GUID]; + [self _extractGUID: &xid->NameSpaceGuid]; - xid->Size = max - 16; + xid->LocalId.length = max - 16; bytes = (uint8_t *) [self bytes]; - xid->Data = talloc_memdup (xid, (bytes+16), xid->Size); + xid->LocalId.data = talloc_memdup (xid, (bytes+16), xid->LocalId.length); } else { @@ -172,6 +174,38 @@ static void _fillFlatUIDWithGUID (struct FlatUID_r *flatUID, const struct GUID * return xid; } +- (struct SizedXid *) asSizedXidArrayInMemCtx: (void *) memCtx + with: (uint32_t *) length +{ + struct Binary_r bin; + struct SizedXid *sizedXIDArray; + + bin.cb = [self length]; + bin.lpb = (uint8_t *)[self bytes]; + + sizedXIDArray = get_SizedXidArray(memCtx, &bin, length); + if (!sizedXIDArray) + { + NSLog (@"Impossible to parse SizedXID array"); + return NULL; + } + + return sizedXIDArray; +} + +- (NSComparisonResult) compare: (NSData *) otherGlobCnt +{ + uint64_t globCnt = 0, oGlobCnt = 0; + + if ([self length] > 0) + globCnt = *(uint64_t *) [self bytes]; + + if ([otherGlobCnt length] > 0) + oGlobCnt = *(uint64_t *) [otherGlobCnt bytes]; + + return MAPICNCompare (globCnt, oGlobCnt, NULL); +} + + (id) dataWithChangeKeyGUID: (NSString *) guidString andCnt: (NSData *) globCnt; { diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index d04d70446..360901e97 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -500,7 +500,7 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; ms = [NSMutableString stringWithCapacity: 256]; [ms appendFormat: @"<0x%p[%@]: ", self, NSStringFromClass ([self class])]; - [ms appendFormat: @" #adaptors=%d", [urlToAdaptor count]]; + [ms appendFormat: @" #adaptors=%d", (int)[urlToAdaptor count]]; [ms appendString: @">"]; return ms; diff --git a/SOPE/NGCards/CardElement.m b/SOPE/NGCards/CardElement.m index 00d7c7b35..ce410e1bc 100644 --- a/SOPE/NGCards/CardElement.m +++ b/SOPE/NGCards/CardElement.m @@ -414,7 +414,7 @@ if (group) [str appendFormat: @"%@ (group: %@)\n", tag, group]; else - [str appendFormat: @"%@\n", tag, group]; + [str appendFormat: @"%@\n", tag]; [str appendString: [self versitString]]; diff --git a/SOPE/NGCards/CardGroup.m b/SOPE/NGCards/CardGroup.m index b3c21e9d9..301cfb2b8 100644 --- a/SOPE/NGCards/CardGroup.m +++ b/SOPE/NGCards/CardGroup.m @@ -409,7 +409,7 @@ static NGCardsSaxHandler *sax = nil; max = [children count]; if (max > 0) { - [str appendFormat: @"\n %d children: {\n", [children count]]; + [str appendFormat: @"\n %d children: {\n", (int)[children count]]; for (count = 0; count < max; count++) [str appendFormat: @" %@\n", [[children objectAtIndex: count] description]]; diff --git a/SOPE/NGCards/NSCalendarDate+NGCards.m b/SOPE/NGCards/NSCalendarDate+NGCards.m index b34471695..f70a12f42 100644 --- a/SOPE/NGCards/NSCalendarDate+NGCards.m +++ b/SOPE/NGCards/NSCalendarDate+NGCards.m @@ -32,16 +32,16 @@ - (NSString *) iCalFormattedDateTimeString { return [NSString stringWithFormat: @"%.4d%.2d%.2dT%.2d%.2d%.2d", - [self yearOfCommonEra], [self monthOfYear], - [self dayOfMonth], [self hourOfDay], - [self minuteOfHour], [self secondOfMinute]]; + (int)[self yearOfCommonEra], (int)[self monthOfYear], + (int)[self dayOfMonth], (int)[self hourOfDay], + (int)[self minuteOfHour], (int)[self secondOfMinute]]; } - (NSString *) iCalFormattedDateString { return [NSString stringWithFormat: @"%.4d%.2d%.2d", - [self yearOfCommonEra], [self monthOfYear], - [self dayOfMonth]]; + (int)[self yearOfCommonEra], (int)[self monthOfYear], + (int)[self dayOfMonth]]; } @end diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 9e851ac2e..02c1c3d0b 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -158,16 +158,31 @@ NSMutableString *string; unsigned int len, i; unichar c; + BOOL isQuoted; len = [self length]; string = [NSMutableString stringWithCapacity: len * 1.5]; + isQuoted = NO; for (i = 0; i < len; i++) { c = [self characterAtIndex: i]; + if (isQuoted) + { + if (c == '"') + isQuoted = NO; + + [string appendFormat: @"%C", c]; + continue; + } + switch (c) { + case '"': + isQuoted = YES; + [string appendFormat: @"%C", c]; + break; case '\\': [string appendString: @"\\\\"]; break; diff --git a/SOPE/NGCards/iCalEntityObject.m b/SOPE/NGCards/iCalEntityObject.m index 5c5af1859..8d8b222db 100644 --- a/SOPE/NGCards/iCalEntityObject.m +++ b/SOPE/NGCards/iCalEntityObject.m @@ -27,6 +27,7 @@ #import "NSCalendarDate+NGCards.h" #import "iCalAlarm.h" +#import "iCalCalendar.h" #import "iCalDateTime.h" #import "iCalEntityObject.h" #import "iCalEvent.h" @@ -268,9 +269,12 @@ - (void) setRecurrenceId: (NSCalendarDate *) newRecId { iCalDateTime* recurrenceId; + BOOL isMasterAllDay; + + isMasterAllDay = [[[[self parent] events] objectAtIndex: 0] isAllDay]; recurrenceId = (iCalDateTime *) [self uniqueChildWithTag: @"recurrence-id"]; - if ([self isKindOfClass: [iCalEvent class]] && [(iCalEvent *)self isAllDay]) + if ([self isKindOfClass: [iCalEvent class]] && isMasterAllDay) [recurrenceId setDate: newRecId]; else [recurrenceId setDateTime: newRecId]; diff --git a/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m b/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m index 3b6577ee8..0694cc6c2 100644 --- a/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m @@ -348,7 +348,7 @@ static inline unsigned iCalDoWForNSDoW (int dow) if ([byDayMask occursOnDay: currentWeekDay]) { if ([bySetPos containsObject: - [NSString stringWithFormat: @"%d", currentPos]]) + [NSString stringWithFormat: @"%d", (int)currentPos]]) monthDays[monthDay+1] = YES; currentPos++; } @@ -362,7 +362,7 @@ static inline unsigned iCalDoWForNSDoW (int dow) if ([byDayMask occursOnDay: currentWeekDay]) { if ([bySetPos containsObject: - [NSString stringWithFormat: @"%d", currentPos]]) + [NSString stringWithFormat: @"%d", (int)currentPos]]) monthDays[monthDay] = YES; currentPos--; } diff --git a/SOPE/NGCards/iCalPerson.m b/SOPE/NGCards/iCalPerson.m index 7904fd0f8..97a1bf527 100644 --- a/SOPE/NGCards/iCalPerson.m +++ b/SOPE/NGCards/iCalPerson.m @@ -267,7 +267,7 @@ - (BOOL)isEqual:(id)_other { if(_other == nil) return NO; - if([_other class] != self->isa) + if([_other class] != object_getClass(self)) return NO; if([_other hash] != [self hash]) return NO; diff --git a/SOPE/NGCards/iCalRecurrenceRule.m b/SOPE/NGCards/iCalRecurrenceRule.m index 5e99429e7..6ec05fadc 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.m +++ b/SOPE/NGCards/iCalRecurrenceRule.m @@ -309,10 +309,10 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", else if ([frequency isEqualToString:@"SECONDLY"]) freq = iCalRecurrenceFrequenceSecondly; else - freq = NSNotFound; + freq = (iCalRecurrenceFrequency) NSNotFound; } else - freq = NSNotFound; + freq = (iCalRecurrenceFrequency) NSNotFound; return freq; } diff --git a/SOPE/NGCards/iCalTimeZonePeriod.m b/SOPE/NGCards/iCalTimeZonePeriod.m index 1326b329f..be0d53da3 100644 --- a/SOPE/NGCards/iCalTimeZonePeriod.m +++ b/SOPE/NGCards/iCalTimeZonePeriod.m @@ -161,8 +161,11 @@ minute: [tzStart minuteOfHour] second: 0 timeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; - tmpDate = [tmpDate addYear: 0 month: ((pos > 0) ? 0 : 1) - day: 0 hour: 0 minute: 0 + tmpDate = [tmpDate addYear: 0 + month: ((pos > 0) ? 0 : 1) + day: 0 + hour: 0 + minute: 0 second: 0]; /* If the day of the time change is "-XSU", we need to determine whether the @@ -197,12 +200,41 @@ END:STANDARD END:VTIMEZONE - The time changes occure on a Sunday, but in March, the 1st is a Sunday itself and in November + The time changes occur on a Sunday, but in March, the 1st is a Sunday itself and in November the 1st is also a Sunday. If we don't decrement "pos" by one, tmpDate (which is set to March or November 1st because of "day: 1" will have 14 more days added for March and 7 more days added for November - which will effectively shift the time change by a whole week. + + In Europe/Berlin, we have a different use-case for November. In 2015, November 1st is a Sunday. + The time change in November must occur on October 25th but since tmpDate will be November 1st, + so a Sunday, dateDayOfWeek will be 0 and dayOfWeek will also be 0 we would decrement tmpDate by 14 days, + which is incorrect because it would shift the timezone change one week earlier. We take care about this + one with check if pos is greater or equal than 0 and if so, we don't decrement it. + + BEGIN:VCALENDAR + PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN + VERSION:2.0 + BEGIN:VTIMEZONE + TZID:Europe/Berlin + X-LIC-LOCATION:Europe/Berlin + BEGIN:DAYLIGHT + TZOFFSETFROM:+0100 + TZOFFSETTO:+0200 + TZNAME:CEST + DTSTART:19700329T020000 + RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU + END:DAYLIGHT + BEGIN:STANDARD + TZOFFSETFROM:+0200 + TZOFFSETTO:+0100 + TZNAME:CET + DTSTART:19701025T030000 + RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU + END:STANDARD + END:VTIMEZONE + END:VCALENDAR */ - if (dayOfWeek == dateDayOfWeek) + if (dayOfWeek == dateDayOfWeek && pos >= 0) pos--; offset = (dayOfWeek - dateDayOfWeek) + (pos * 7); diff --git a/SOPE/NGCards/iCalTrigger.m b/SOPE/NGCards/iCalTrigger.m index 4a5c79dc3..d40c518b5 100644 --- a/SOPE/NGCards/iCalTrigger.m +++ b/SOPE/NGCards/iCalTrigger.m @@ -57,7 +57,7 @@ - (NSDictionary *) asDictionary { NSDictionary *data; - NSString *duration, *relation, *reference, *quantity, *unit; + NSString *duration, *relation, *reference, *quantity=@"", *unit=@""; NSUInteger i; unichar c; diff --git a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m index d9b906c8e..0e56a2d51 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +++ b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m @@ -1045,7 +1045,7 @@ static NSCharacterSet *whitespaceCharSet = nil; if (debugOn) { NSLog(@"%s: trying to decode data (0x%p,len=%d) ...", - __PRETTY_FUNCTION__, _data, [_data length]); + __PRETTY_FUNCTION__, _data, (int)[_data length]); } if ((len = [_data length]) == 0) @@ -1164,7 +1164,7 @@ static NSCharacterSet *whitespaceCharSet = nil; if (debugOn) { NSLog(@"%s: trying to parse string (0x%p,len=%d) ...", - __PRETTY_FUNCTION__, _source, [_source length]); + __PRETTY_FUNCTION__, _source, (int)[_source length]); } if (!_sysId) _sysId = @""; [self _parseString: _source]; diff --git a/Scripts/openchange_user_cleanup b/Scripts/openchange_user_cleanup deleted file mode 100755 index e67289480..000000000 --- a/Scripts/openchange_user_cleanup +++ /dev/null @@ -1,309 +0,0 @@ -#!/usr/bin/env python - -import getopt -import imaplib -import ldb -import plistlib -import os -import re -import shutil -import subprocess -import sys -from samba.param import LoadParm - -imaphost = '127.0.0.1' -imapport = 143 - -samba_lp = LoadParm() -sambaprivate = samba_lp.get("private dir") -mapistorefolder = samba_lp.private_path("mapistore") -sogoSysDefaultsFile = "/etc/sogo/sogo.conf" -sogoUserDefaultsFile = os.path.expanduser("~sogo/GNUstep/Defaults/.GNUstepDefaults") - -# - takes a username and optionally its password -# - removes the entry in samba's ldap tree via ldbedit (NOTYET) -# - remove the user's directory under mapistore/ and mapistore/SOGo -# - cleanup Junk Folders and Sync Issues imap folders -# - Delete the sogo_cache_folder_ table for the username. - -def usage(): - print """ -%s [-i imaphost] ] [-p imapport] [-s sambaprivate] username [password] - -i imaphost IMAP host to connect to [%s] - -p imappost IMAP port to use [%d] - -s sambaprivate samba private directory [%s] -""" % (os.path.basename(sys.argv[0]), imaphost, imapport, sambaprivate) - -def main(): - global sambaprivate - global mapistorefolder - global imaphost - global imapport - try: - opts, args = getopt.getopt(sys.argv[1:], "i:p:s:") - except getopt.GetoptError, err: - print str(err) - usage() - sys.exit(2) - - for o, a in opts: - if o == "-i": - imaphost = a - elif o == "-p": - imapport = a - elif o == "-s": - sambaprivate = a - mapistorefolder = "%s/mapistore" % (sambaprivate) - else: - assert False, "unhandled option" - - argslen = len(args) - if (argslen == 2): - username = args[0] - userpass = args[1] - elif (argslen == 1): - username = args[0] - userpass = username - print "Using username as password" - else: - usage() - print "Specify a user (and optionally the password)" - sys.exit(2) - - # cleanup starts here - try: - imapCleanup(imaphost, imapport, username, userpass) - except Exception as e: - print "Error during imapCleanup, continuing: %s" % str(e) - - try: - mapistoreCleanup(mapistorefolder, username) - except (shutil.Error, OSError) as e: - print "Error during mapistoreCleanup, continuing: %s" % str(e) - - try: - ldbCleanup(sambaprivate, username) - except ldb.LdbError as e: - print "Error during ldbCleanup, continuing: %s" % str(e) - - try: - sqlCleanup(username) - except Exception as e: - print "Error during sqlCleanup, continuing: %s" % str(e) - -def getsep(client): - seq = None - (code, data) = client.list("", "") - if code == "OK" and data is not None: - # yes this is ugly but it works on cyrus and dovecot. - # (\\Noinferiors \\HasNoChildren) "/" INBOX - m = re.search(".*\s+[\"\']?(.)[\"\']?\s+[\"\']?.*[\"\']?$", data[0]) - sep = m.group(1) - return sep - -def extractmb(si): - inparen = False - inquote = False - part = [] - parts = [] - - for char in si: - if inparen: - if char == ")": - inparen = False - parts.append("".join(part)) - else: - part.append(char) - elif inquote: - if char == "\"": - inquote = False - parts.append("".join(part)) - else: - part.append(char) - else: - if char == "(": - inparen = True - elif char == "\"": - inquote = True - elif char == " ": - part = [] - else: - part.append(char) - - return parts[-1] - -def cleanupmb(mb, sep, client): - (code, data) = client.list("%s%s" % (mb, sep), "%") - if code == "OK": - for si in data: - if si is not None: - submb = extractmb(si) - cleanupmb(submb, sep, client) - else: - raise Exception, "Failure while cleaning up '%s'" % mb - client.unsubscribe(mb) - (code, data) = client.delete(mb) - if code == "OK": - print "mailbox '%s' deleted" % mb - else: - print "mailbox '%s' coult NOT be deleted (code = '%s')" % (mb, code) - -def imapCleanup(imaphost, imapport, username, userpass): - print "Starting IMAP cleanup" - client = imaplib.IMAP4(imaphost, imapport) - (code, data) = client.login(username, userpass) - if code != "OK": - raise Exception, "Login failure" - - print "Logged in as '%s'" % username - - sep = getsep(client) - if not sep: - client.logout() - return - - for foldername in ("Sync Issues", "Junk E-mail", - "INBOX%sSync Issues" % sep, "INBOX%sJunk E-mail" % sep, - "Probl&AOg-mes de synchronisation"): - (code, data) = client.list(foldername, "%") - if code == "OK": - for si in data: - if si is not None: - mb = extractmb(si) - cleanupmb(mb, sep, client) - client.logout() - -def mapistoreCleanup(mapistorefolder, username): - print "Starting MAPIstore cleanup" - - # delete the user's folder under the mapistore and under mapistore/SOGo - mapistoreUserDir = "%s/%s" % (mapistorefolder, username) - for dirpath, dirnames, filenames in os.walk(mapistoreUserDir): - for f in filenames: - if f != "password": - os.unlink("%s/%s" % (dirpath,f)) - break #one level only - - shutil.rmtree("%s/SOGo/%s" % (mapistorefolder, username), ignore_errors=True) - -def ldbCleanup(sambaprivate, username): - conn = ldb.Ldb("%s/openchange.ldb" % (sambaprivate)) - # find the DN of the user - entries = conn.search(None, expression="(cn=%s)" % (username), scope=ldb.SCOPE_SUBTREE) - if not entries: - print "cn = %s not found in openchange.ldb" %(username) - return - - for entry in entries: - # search again, but with the user's DN as a base - subentries = conn.search(entry.dn.extended_str(), expression="(distinguishedName=*)", scope=ldb.SCOPE_SUBTREE) - for subentry in subentries: - print "Deleting %s" % (subentry.dn) - conn.delete(subentry.dn) - -def mysqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, username): - try: - import MySQLdb - except ImportError: - msg ="""The python 'MySQLdb' module is not available -On Debian based distro, install it using 'apt-get install python-mysqlbd' -On RHEL, install it using 'yum install MySQL-python'""" - raise Exception(msg) - - conn = MySQLdb.connect(host=dbhost, port=int(dbport), user=dbuser, passwd=dbpass, db=dbname) - c=conn.cursor() - tablename="sogo_cache_folder_%s" % (username) - c.execute("TRUNCATE TABLE %s" % tablename) - print "Table %s emptied" % tablename - - -def postgresqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, username): - try: - import pg - except ImportError: - msg ="""The python 'pg' module is not available -On Debian based distro, install it using 'apt-get install python-pygresql' -On RHEL, install it using 'yum install python-pgsql'""" - raise Exception(msg) - - conn = pg.connect(host=dbhost, port=int(dbport), user=dbuser, passwd=dbpass, dbname=dbname) - tablename = "sogo_cache_folder_%s" % username - conn.query("DELETE FROM %s" % tablename) - print "Table '%s' emptied" % tablename - -def getOCSFolderInfoURL(): - global sogoSysDefaultsFile, sogoUserDefaultsFile - - OCSFolderInfoURL = "" - - # read defaults from defaults files - # order is important, user defaults must have precedence - for f in [sogoSysDefaultsFile, sogoUserDefaultsFile]: - if os.path.exists(f): - # FIXME: this is ugly, we should have a python plist parser - # plistlib only supports XML plists. - # the following magic replaces this shell pipeline: - # sogo-tool dump-defaults -f %s | awk -F\\" '/ OCSFolderInfoURL =/ {print $2}' - p1 = subprocess.Popen(["sogo-tool", "dump-defaults", "-f", f], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["awk", "-F\"", "/ OCSFolderInfoURL =/ {print $2}"], stdin=p1.stdout, stdout=subprocess.PIPE) - p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. - tmp = p2.communicate()[0] - - if tmp: OCSFolderInfoURL = tmp - - return OCSFolderInfoURL - -def asCSSIdentifier(inputString): - cssEscapingCharMap = {"_" : "_U_", - "." : "_D_", - "#" : "_H_", - "@" : "_A_", - "*" : "_S_", - ":" : "_C_", - "," : "_CO_", - " " : "_SP_", - "'" : "_SQ_", - "&" : "_AM_", - "+" : "_P_"} - - newChars = [] - - for c in inputString: - if c in cssEscapingCharMap: - newChars.append(cssEscapingCharMap[c]) - else: - newChars.append(c) - - return "".join(newChars) - -def sqlCleanup(username): - print "Starting SQL cleanup" - OCSFolderInfoURL = getOCSFolderInfoURL() - if OCSFolderInfoURL is None: - raise Exception("Couldn't fetch OCSFolderInfoURL or it is not set. the sogo_cache_folder_%s table should be truncated manually" % (username)) - - # postgresql://sogo:sogo@127.0.0.1:5432/sogo/sogo_folder_info - m = re.search("(.+)://(.+):(.+)@(.+):(\d+)/(.+)/(.+)", OCSFolderInfoURL) - - if not m: - raise Exception("Unable to parse OCSFolderInfoURL: %s" % OCSFolderInfoURL) - - proto = m.group(1) - dbuser = m.group(2) - dbpass = m.group(3) - dbhost = m.group(4) - dbport = m.group(5) - dbname = m.group(6) - # 7 is folderinfo table - - encodedUserName = asCSSIdentifier(username) - - if (proto == "postgresql"): - postgresqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, encodedUserName) - elif (proto == "mysql"): - mysqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, encodedUserName) - else: - raise Exception("Unknown sql proto: %s" % (proto)) - -if __name__ == "__main__": - main() diff --git a/Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh b/Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.16_to_1.3.17-mysql.sh b/Scripts/sql-update-1.3.16_to_1.3.17-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh b/Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.3_to_1.3.4.sh b/Scripts/sql-update-1.3.3_to_1.3.4.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-20080303.sh b/Scripts/sql-update-20080303.sh old mode 100644 new mode 100755 diff --git a/SoObjects/Appointments/MSExchangeFreeBusy.m b/SoObjects/Appointments/MSExchangeFreeBusy.m index 57ae29e5d..de55e534f 100644 --- a/SoObjects/Appointments/MSExchangeFreeBusy.m +++ b/SoObjects/Appointments/MSExchangeFreeBusy.m @@ -344,7 +344,7 @@ size_t curl_body_function_freebusy(void *ptr, size_t size, size_t nmemb, void *i NSMutableString *s; s = [NSMutableString stringWithCapacity: 64]; - [s appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])]; + [s appendFormat:@"<0x%08X[%@]:", (unsigned int)self, NSStringFromClass([self class])]; if (freeBusyViewType) [s appendFormat:@" freeBusyViewType='%@'", freeBusyViewType]; if (mergedFreeBusy) diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 4c47df631..32ceb0fee 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -84,7 +84,7 @@ #import "SOGoAppointmentFolders.h" #import "SOGoFreeBusyObject.h" #import "SOGoTaskObject.h" -#import "SOGoWebAppointmentFolder.h"; +#import "SOGoWebAppointmentFolder.h" #import "SOGoAppointmentFolder.h" @@ -1013,7 +1013,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir { if ([dateRange containsDate: [component startDate]]) { - // We must pass nill to :container here in order to avoid re-entrancy issues. + // We must pass nil to :container here in order to avoid re-entrancy issues. newRecord = [self _fixupRecord: [component quickRecordFromContent: nil container: nil]]; [ma replaceObjectAtIndex: recordIndex withObject: newRecord]; } @@ -1030,15 +1030,20 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir { // The recurrence id of the exception is outside the date range; // simply add the exception to the records array. - // We must pass nill to :container here in order to avoid re-entrancy issues. + // We must pass nil to :container here in order to avoid re-entrancy issues. newRecord = [self _fixupRecord: [component quickRecordFromContent: nil container: nil]]; - newRecordRange = [NGCalendarDateRange - calendarDateRangeWithStartDate: [newRecord objectForKey: @"startDate"] - endDate: [newRecord objectForKey: @"endDate"]]; - if ([dateRange doesIntersectWithDateRange: newRecordRange]) + if ([newRecord objectForKey: @"startDate"] && [newRecord objectForKey: @"endDate"]) { + newRecordRange = [NGCalendarDateRange + calendarDateRangeWithStartDate: [newRecord objectForKey: @"startDate"] + endDate: [newRecord objectForKey: @"endDate"]]; + if ([dateRange doesIntersectWithDateRange: newRecordRange]) [ma addObject: newRecord]; - else + else + newRecord = nil; + } else { + [self warnWithFormat: @"Recurrence %@ without dtstart or dtend. Ignoring", recurrenceId]; newRecord = nil; + } } if (newRecord) @@ -2337,7 +2342,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir request = [context request]; if (!([request isIPhone] || [request isICal4])) { - gdRT = [self groupDavResourceType]; + gdRT = (NSArray *) [self groupDavResourceType]; gdVEventCol = [NSArray arrayWithObjects: [gdRT objectAtIndex: 0], XMLNS_GROUPDAV, nil]; [colType addObject: gdVEventCol]; @@ -2988,7 +2993,10 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir theUser = [SOGoUser userWithLogin: theUID]; aParent = [theUser calendarsFolderInContext: context]; - + + if ([aParent isKindOfClass: [NSException class]]) + return nil; + aFolders = [aParent subFolders]; e = [aFolders objectEnumerator]; while ((aFolder = [e nextObject])) @@ -3152,19 +3160,29 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir NSMutableString *content; NSString *uid; - // We first look if there's an event with the same UID in our calendar. If not, - // let's reuse what is in the event, otherwise generate a new GUID and use it. + // We first look if the event has any / or + in its UID. If that's the case + // we generate a new UID based on a GUID uid = [event uid]; - object = [self lookupName: uid - inContext: context - acquire: NO]; - - if (object && ![object isKindOfClass: [NSException class]]) + if ([uid rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: @"+/"]].location != NSNotFound) { uid = [self globallyUniqueObjectId]; [event setUid: uid]; } + else + { + // We also look if there's an event with the same UID in our calendar. If not, + // let's reuse what is in the event, otherwise generate a new GUID and use it. + object = [self lookupName: uid + inContext: context + acquire: NO]; + + if (object && ![object isKindOfClass: [NSException class]]) + { + uid = [self globallyUniqueObjectId]; + [event setUid: uid]; + } + } object = [SOGoAppointmentObject objectWithName: uid inContainer: self]; diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index e807b6bee..4bf315e71 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -46,6 +46,7 @@ #import #import #import +#import #import #import @@ -748,11 +749,14 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent { e = [events objectAtIndex: i]; if ([e recurrenceId]) - for (j = 0; j < [theAttendees count]; j++) - if (shouldAdd) + for (j = 0; j < [theAttendees count]; j++) { + if (shouldAdd) { [e addToAttendees: [theAttendees objectAtIndex: j]]; - else + } + else { [e removeFromAttendees: [theAttendees objectAtIndex: j]]; + } + } } } @@ -1038,7 +1042,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; /* we handle the addition/deletion of delegate users */ addDelegate = NO; @@ -1076,7 +1080,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; } } if (addDelegate) @@ -1233,7 +1237,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; } [self sendEMailUsingTemplateNamed: @"Deletion" @@ -1992,7 +1996,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([container resourceNameForEventUID: eventUID]) { return [NSException exceptionWithHTTPStatus: 403 - reason: [NSString stringWithFormat: @"Event UID already in use. (%s)", eventUID]]; + reason: [NSString stringWithFormat: @"Event UID already in use. (%@)", eventUID]]; } // diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index ce600715b..762139774 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -140,6 +140,14 @@ return aclManager; } +- (NSException *) changeParticipationStatus: (NSString *) newPartStat + withDelegate: (iCalPerson *) delegate + alarm: (iCalAlarm *) alarm +{ + // Required for protocol + return nil; +} + - (id) init { if ((self = [super init])) @@ -171,7 +179,7 @@ - (Class *) parsingClass { - return [iCalCalendar class]; + return (Class *)[iCalCalendar class]; } - (NSString *) davContentType diff --git a/SoObjects/Appointments/iCalAlarm+SOGo.m b/SoObjects/Appointments/iCalAlarm+SOGo.m index cb1cc57c0..4f98fc5eb 100644 --- a/SoObjects/Appointments/iCalAlarm+SOGo.m +++ b/SoObjects/Appointments/iCalAlarm+SOGo.m @@ -102,9 +102,9 @@ } if ([reminderReference caseInsensitiveCompare: @"BEFORE"] == NSOrderedSame) - aValue = [NSString stringWithString: @"-P"]; + aValue = (NSString *) @"-P"; else - aValue = [NSString stringWithString: @"P"]; + aValue = (NSString *) @"P"; if ([reminderUnit caseInsensitiveCompare: @"MINUTES"] == NSOrderedSame || [reminderUnit caseInsensitiveCompare: @"HOURS"] == NSOrderedSame) diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index 75ce514f5..c9512a044 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -267,7 +267,7 @@ - (NSTimeInterval) occurenceInterval { - return [[self endDate] timeIntervalSinceDate: [self startDate]]; + return (NSTimeInterval) [[self endDate] timeIntervalSinceDate: [self startDate]]; } /** @@ -328,30 +328,10 @@ */ - (NSDictionary *) attributesInContext: (WOContext *) context { - BOOL isAllDay; - NSCalendarDate *eventStartDate, *eventEndDate; NSMutableDictionary *data; - NSTimeZone *timeZone; - SOGoUserDefaults *ud; - - isAllDay = [self isAllDay]; - ud = [[context activeUser] userDefaults]; - timeZone = [ud timeZone]; - eventStartDate = [self startDate]; - eventEndDate = [self endDate]; - - if (!isAllDay) - { - [eventStartDate setTimeZone: timeZone]; - [eventEndDate setTimeZone: timeZone]; - } data = [NSMutableDictionary dictionaryWithDictionary: [super attributesInContext: context]]; - [data setObject: [eventStartDate iso8601DateString] forKey: @"startDate"]; - [data setObject: [eventEndDate iso8601DateString] forKey: @"endDate"]; - - [data setObject: [NSNumber numberWithBool: isAllDay] forKey: @"isAllDay"]; [data setObject: [NSNumber numberWithBool: ![self isOpaque]] forKey: @"isTransparent"]; return data; @@ -383,18 +363,10 @@ if ([o isKindOfClass: [NSString class]] && [o length]) aptStartDate = [self dateFromString: o inContext: context]; - o = [data objectForKey: @"startTime"]; - if ([o isKindOfClass: [NSString class]] && [o length]) - [self adjustDate: &aptStartDate withTimeString: o inContext: context]; - o = [data objectForKey: @"endDate"]; if ([o isKindOfClass: [NSString class]] && [o length]) aptEndDate = [self dateFromString: o inContext: context]; - o = [data objectForKey: @"endTime"]; - if ([o isKindOfClass: [NSString class]] && [o length]) - [self adjustDate: &aptEndDate withTimeString: o inContext: context]; - o = [data objectForKey: @"isTransparent"]; if ([o isKindOfClass: [NSNumber class]]) [self setTransparency: ([o boolValue]? @"TRANSPARENT" : @"OPAQUE")]; @@ -418,6 +390,14 @@ } else { + o = [data objectForKey: @"startTime"]; + if ([o isKindOfClass: [NSString class]] && [o length]) + [self adjustDate: &aptStartDate withTimeString: o inContext: context]; + + o = [data objectForKey: @"endTime"]; + if ([o isKindOfClass: [NSString class]] && [o length]) + [self adjustDate: &aptEndDate withTimeString: o inContext: context]; + [self setStartDate: aptStartDate]; [self setEndDate: aptEndDate]; } diff --git a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m index 79f56e0be..c09ddfc65 100644 --- a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +++ b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m @@ -44,6 +44,7 @@ #import #import "iCalRepeatableEntityObject+SOGo.h" +#import "iCalCalendar+SOGo.h" @implementation iCalRepeatableEntityObject (SOGoExtensions) @@ -162,7 +163,7 @@ rule = [iCalRecurrenceRule new]; [rule setInterval: @"1"]; - frequency = NSNotFound; + frequency = (int)NSNotFound; o = [repeat objectForKey: @"frequency"]; if ([o isKindOfClass: [NSString class]]) { diff --git a/SoObjects/Appointments/iCalToDo+SOGo.m b/SoObjects/Appointments/iCalToDo+SOGo.m index dd7a38363..585f26fe0 100644 --- a/SoObjects/Appointments/iCalToDo+SOGo.m +++ b/SoObjects/Appointments/iCalToDo+SOGo.m @@ -214,7 +214,7 @@ { percent = [o intValue]; if (percent >= 0 && percent <= 100) - [self setPercentComplete: [NSString stringWithFormat: @"%i", percent]]; + [self setPercentComplete: [NSString stringWithFormat: @"%i", (int)percent]]; } else [self setPercentComplete: @""]; diff --git a/SoObjects/Contacts/NGVCard+SOGo.m b/SoObjects/Contacts/NGVCard+SOGo.m index 19c5d9084..72c580d2d 100644 --- a/SoObjects/Contacts/NGVCard+SOGo.m +++ b/SoObjects/Contacts/NGVCard+SOGo.m @@ -327,7 +327,7 @@ convention: if (year && month && day) [self setBday: [NSString stringWithFormat: @"%.4d-%.2d-%.2d", - year, month, day]]; + (int)year, (int)month, (int)day]]; else [self setBday: @""]; @@ -644,11 +644,11 @@ convention: birthDay = [[self bday] asCalendarDate]; if (birthDay) { - stringValue = [NSString stringWithFormat: @"%.4d", [birthDay yearOfCommonEra]]; + stringValue = [NSString stringWithFormat: @"%.4d", (int)[birthDay yearOfCommonEra]]; [self _setValue: @"birthyear" to: stringValue inLDIFRecord: ldifRecord]; - stringValue = [NSString stringWithFormat: @"%.2d", [birthDay monthOfYear]]; + stringValue = [NSString stringWithFormat: @"%.2d", (int)[birthDay monthOfYear]]; [self _setValue: @"birthmonth" to: stringValue inLDIFRecord: ldifRecord]; - stringValue = [NSString stringWithFormat: @"%.2d", [birthDay dayOfMonth]]; + stringValue = [NSString stringWithFormat: @"%.2d", (int)[birthDay dayOfMonth]]; [self _setValue: @"birthday" to: stringValue inLDIFRecord: ldifRecord]; } [self _setValue: @"description" to: [self note] inLDIFRecord: ldifRecord]; diff --git a/SoObjects/Contacts/SOGoContactEntryPhoto.m b/SoObjects/Contacts/SOGoContactEntryPhoto.m index 0cbf83cf6..6ae248e08 100644 --- a/SoObjects/Contacts/SOGoContactEntryPhoto.m +++ b/SoObjects/Contacts/SOGoContactEntryPhoto.m @@ -59,7 +59,7 @@ [response setHeader: [self davContentType] forKey: @"content-type"]; [response setHeader: [NSString stringWithFormat:@" %d", - [data length]] + (int)[data length]] forKey: @"content-length"]; [response setContent: data]; } diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index b0428f7f4..e7984b172 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -268,9 +268,9 @@ Class SOGoContactSourceFolderK; SOGoUser *currentUser; id source; - if ([sourceID isEqualToString: @"personal"]) - result = [NSException exceptionWithHTTPStatus: 403 - reason: (@"folder '%@' cannot be deleted", sourceID)]; + if ([sourceID isEqualToString: @"personal"]){ + result = [NSException exceptionWithHTTPStatus: 403 reason: [NSString stringWithFormat: (@"folder '%@' cannot be deleted"), sourceID]]; + } else { result = nil; diff --git a/SoObjects/Contacts/SOGoContactGCSEntry.m b/SoObjects/Contacts/SOGoContactGCSEntry.m index 4b5d5bd21..dfaa66426 100644 --- a/SoObjects/Contacts/SOGoContactGCSEntry.m +++ b/SoObjects/Contacts/SOGoContactGCSEntry.m @@ -50,7 +50,7 @@ - (Class *) parsingClass { - return [NGVCard class]; + return (Class *)[NGVCard class]; } /* content */ diff --git a/SoObjects/Contacts/SOGoContactGCSList.m b/SoObjects/Contacts/SOGoContactGCSList.m index 61e68bf85..ad1b3277b 100644 --- a/SoObjects/Contacts/SOGoContactGCSList.m +++ b/SoObjects/Contacts/SOGoContactGCSList.m @@ -45,7 +45,7 @@ - (Class *) parsingClass { - return [NGVList class]; + return (Class *)[NGVList class]; } diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index a52ec20b9..abf71093e 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -47,7 +47,9 @@ #import #import #import +#import #import +#import #import #import @@ -94,7 +96,7 @@ { if (![newDisplayName length]) newDisplayName = newName; - ASSIGN (displayName, newDisplayName); + ASSIGN (displayName, (NSMutableString *)newDisplayName); } return self; @@ -248,6 +250,13 @@ data = @""; [newRecord setObject: data forKey: @"c_cn"]; + if ([[SOGoSystemDefaults sharedSystemDefaults] enableDomainBasedUID]) + { + data = [oldRecord objectForKey: @"c_domain"]; + if (data) + [newRecord setObject: data forKey: @"c_domain"]; + } + // mail => emails[] data = [oldRecord objectForKey: @"c_emails"]; if (data) @@ -697,7 +706,7 @@ BOOL otherIsPersonal; otherIsPersonal = ([otherFolder isKindOfClass: [SOGoContactGCSFolder class]] - || ([otherFolder isKindOfClass: isa] && [otherFolder isPersonalSource])); + || ([otherFolder isKindOfClass: object_getClass(self)] && [otherFolder isPersonalSource])); if (isPersonalSource) { diff --git a/SoObjects/Contacts/SOGoFolder+CardDAV.h b/SoObjects/Contacts/SOGoFolder+CardDAV.h index 2e0e88b0f..4ab4278ce 100644 --- a/SoObjects/Contacts/SOGoFolder+CardDAV.h +++ b/SoObjects/Contacts/SOGoFolder+CardDAV.h @@ -1,8 +1,6 @@ /* NSObject+CardDAV.h - this file is part of SOGo * - * Copyright (C) 2007 Inverse inc. - * - * Author: Ludovic Marcotte + * Copyright (C) 2007-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/SoObjects/Contacts/SOGoFolder+CardDAV.m b/SoObjects/Contacts/SOGoFolder+CardDAV.m index 2644e228f..3c9130670 100644 --- a/SoObjects/Contacts/SOGoFolder+CardDAV.m +++ b/SoObjects/Contacts/SOGoFolder+CardDAV.m @@ -1,8 +1,6 @@ /* NSObject+CardDAV.m - this file is part of SOGo * - * Copyright (C) 2007-2011 Inverse inc. - * - * Author: Ludovic Marcotte + * Copyright (C) 2007-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -187,6 +185,10 @@ [filters addObject: filter]; } + // If no filters are provided, we return everything. + if (![filters count]) + [filters addObject: [NSDictionary dictionaryWithObject: @"." forKey: @"mail"]]; + return filters; } diff --git a/SoObjects/Mailer/NSDictionary+Mail.m b/SoObjects/Mailer/NSDictionary+Mail.m index 74311f292..177ad38ac 100644 --- a/SoObjects/Mailer/NSDictionary+Mail.m +++ b/SoObjects/Mailer/NSDictionary+Mail.m @@ -20,6 +20,7 @@ #import #import +#import #import "NSDictionary+Mail.h" diff --git a/SoObjects/Mailer/NSString+Mail.m b/SoObjects/Mailer/NSString+Mail.m index 1efdcb62f..f0e19046a 100644 --- a/SoObjects/Mailer/NSString+Mail.m +++ b/SoObjects/Mailer/NSString+Mail.m @@ -533,7 +533,7 @@ messageID = [NSMutableString string]; [messageID appendFormat: @"<%@", [SOGoObject globallyUniqueObjectId]]; pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; - [messageID appendFormat: @"@%u>", [pGUID hash]]; + [messageID appendFormat: @"@%u>", (unsigned int)[pGUID hash]]; return [messageID lowercaseString]; } diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index a3a06e557..410e8004c 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -181,6 +181,7 @@ static NSString *headerKeys[] = {@"subject", @"to", @"cc", @"bcc", static NGMimeType *MultiMixedType = nil; static NGMimeType *MultiAlternativeType = nil; +static NGMimeType *MultiRelatedType = nil; static NSString *userAgent = nil; + (void) initialize @@ -191,6 +192,9 @@ static NSString *userAgent = nil; MultiAlternativeType = [NGMimeType mimeType: @"multipart" subType: @"alternative"]; [MultiAlternativeType retain]; + MultiRelatedType = [NGMimeType mimeType: @"multipart" subType: @"related"]; + [MultiRelatedType retain]; + userAgent = [NSString stringWithFormat: @"SOGoMail %@", SOGoVersion]; [userAgent retain]; @@ -700,7 +704,8 @@ static NSString *userAgent = nil; for (count = max - 1; count >= 0; count--) { currentAddress = [addresses objectAtIndex: count]; - if ([currentRecipient + if (![currentAddress baseEMail] || + [currentRecipient caseInsensitiveCompare: [currentAddress baseEMail]] == NSOrderedSame) { @@ -1676,16 +1681,20 @@ static NSString *userAgent = nil; NGMimeMessage *message; NGMutableHashMap *map; NSString *newText; + BOOL has_inline_images; message = nil; - + has_inline_images = NO; bodyParts = [NSMutableArray array]; if (_extractImages) { newText = [text htmlByExtractingImages: bodyParts]; if ([bodyParts count]) - [self setText: newText]; + { + [self setText: newText]; + has_inline_images = YES; + } } map = [self mimeHeaderMapWithHeaders: _headers @@ -1702,10 +1711,20 @@ static NSString *userAgent = nil; /* no attachments */ message = [self mimeMessageForContentWithHeaderMap: map]; else - /* attachments, create multipart/mixed */ - message = [self mimeMultiPartMessageWithHeaderMap: map - andBodyParts: bodyParts]; - //[self debugWithFormat: @"message: %@", message]; + { + // attachments, create multipart/mixed or multipart/related if + // we have inline image to avoid Thunderbird bug #61815 (https://bugzilla.mozilla.org/show_bug.cgi?id=61815) + if (has_inline_images) + { + [map removeAllObjectsForKey: @"content-type"]; + [map addObject: MultiRelatedType forKey: @"content-type"]; + } + + message = [self mimeMultiPartMessageWithHeaderMap: map + andBodyParts: bodyParts]; + + //[self debugWithFormat: @"message: %@", message]; + } } return message; diff --git a/SoObjects/Mailer/SOGoMailAccount.m b/SoObjects/Mailer/SOGoMailAccount.m index 6216ee2c7..286d695c4 100644 --- a/SoObjects/Mailer/SOGoMailAccount.m +++ b/SoObjects/Mailer/SOGoMailAccount.m @@ -206,8 +206,8 @@ static NSString *inboxFolderName = @"INBOX"; [folders removeObjectsInArray: nss]; } - return [[folders stringsWithFormat: @"folder%@"] - resultsOfSelector: @selector (asCSSIdentifier)]; + return [[folders resultsOfSelector: @selector (asCSSIdentifier)] + stringsWithFormat: @"folder%@"]; } - (NSArray *) toManyRelationshipKeys diff --git a/SoObjects/Mailer/SOGoMailBaseObject.m b/SoObjects/Mailer/SOGoMailBaseObject.m index 863491e2e..4948abe7e 100644 --- a/SoObjects/Mailer/SOGoMailBaseObject.m +++ b/SoObjects/Mailer/SOGoMailBaseObject.m @@ -32,9 +32,11 @@ #import #import #import +#import #import #import +#import #import "SOGoMailAccount.h" #import "SOGoMailManager.h" diff --git a/SoObjects/Mailer/SOGoMailBodyPart.m b/SoObjects/Mailer/SOGoMailBodyPart.m index 2fb075f4c..71d2dd385 100644 --- a/SoObjects/Mailer/SOGoMailBodyPart.m +++ b/SoObjects/Mailer/SOGoMailBodyPart.m @@ -396,7 +396,7 @@ static BOOL debugOn = NO; mimeType = @"application/octet-stream"; [response setHeader: mimeType forKey: @"content-type"]; - [response setHeader: [NSString stringWithFormat:@"%d", [data length]] + [response setHeader: [NSString stringWithFormat:@"%d", (int)[data length]] forKey: @"content-length"]; if (asAttachment) diff --git a/SoObjects/Mailer/SOGoMailFolder.h b/SoObjects/Mailer/SOGoMailFolder.h index 1b3843795..431a58eb7 100644 --- a/SoObjects/Mailer/SOGoMailFolder.h +++ b/SoObjects/Mailer/SOGoMailFolder.h @@ -97,10 +97,10 @@ - (NSString *) davCollectionTag; -- (NSArray *) syncTokenFieldsWithProperties: (NSArray *) theProperties - matchingSyncToken: (NSString *) theSyncToken - fromDate: (NSCalendarDate *) theStartDate; - +- (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties + matchingSyncToken: (NSString *) syncToken + fromDate: (NSCalendarDate *) theStartDate + initialLoad: (BOOL) initialLoadInProgress; /* flags */ - (NSException *) addFlagsToAllMessages: (id) _f; diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index d402a3248..f9ba2f3c2 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -199,9 +199,9 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { NSArray *subfolders; - subfolders = [[self subfolders] stringsWithFormat: @"folder%@"]; + subfolders = [[self subfolders] resultsOfSelector: @selector (asCSSIdentifier)]; - return [subfolders resultsOfSelector: @selector (asCSSIdentifier)]; + return [subfolders stringsWithFormat: @"folder%@"]; } - (NSArray *) subfolders @@ -634,7 +634,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) inContext: (id) localContext { NSArray *folders; - NSString *currentFolderName, *currentAccountName; + NSString *currentFolderName, *currentAccountName, *destinationAccountName; NSMutableString *imapDestinationFolder; NGImap4Client *client; id result; @@ -642,24 +642,24 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) #warning this code will fail on implementation using something else than '/' as delimiter imapDestinationFolder = [NSMutableString string]; - folders = [[destinationFolder componentsSeparatedByString: @"/"] - resultsOfSelector: @selector (fromCSSIdentifier)]; + folders = [destinationFolder componentsSeparatedByString: @"/"]; max = [folders count]; if (max > 1) { currentAccountName = [[self mailAccountFolder] nameInContainer]; client = [[self imap4Connection] client]; [imap4 selectFolder: [self imap4URL]]; + destinationAccountName = [[folders objectAtIndex: 1] fromCSSIdentifier]; for (count = 2; count < max; count++) { - currentFolderName = [[folders objectAtIndex: count] substringFromIndex: 6]; + currentFolderName = [[[folders objectAtIndex: count] substringFromIndex: 6] fromCSSIdentifier]; [imapDestinationFolder appendFormat: @"/%@", currentFolderName]; } if (client) { - if ([[folders objectAtIndex: 1] isEqualToString: currentAccountName]) + if ([destinationAccountName isEqualToString: currentAccountName]) { // We make sure the destination IMAP folder exist, if not, we create it. result = [[client status: imapDestinationFolder @@ -688,7 +688,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) userFolder = [[context activeUser] homeFolderInContext: context]; accounts = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; - account = [accounts lookupName: [folders objectAtIndex: 1] inContext: localContext acquire: NO]; + account = [accounts lookupName: destinationAccountName inContext: localContext acquire: NO]; if ([account isKindOfClass: [NSException class]]) { @@ -1674,7 +1674,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) sortOrderings = [NSMutableArray array]; - if ([self _sortElementIsAscending: sortElement]) + if ([self _sortElementIsAscending: (NGDOMNodeWithChildren *)sortElement]) sortOrderingOrder = EOCompareAscending; else sortOrderingOrder = EOCompareDescending; @@ -2106,7 +2106,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) // * 5 FETCH (UID 559 MODSEQ (17)) // * 6 FETCH (UID 560 MODSEQ (18)) // * 7 FETCH (UID 561 MODSEQ (19)) - +// // // fetchUIDsOfVanishedItems .. // @@ -2119,6 +2119,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) - (NSArray *) syncTokenFieldsWithProperties: (NSArray *) theProperties matchingSyncToken: (NSString *) theSyncToken fromDate: (NSCalendarDate *) theStartDate + initialLoad: (BOOL) initialLoadInProgress { EOQualifier *searchQualifier; NSMutableArray *allTokens; @@ -2195,6 +2196,9 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) for (i = 0; i < [fetchResults count]; i++) { + if ([[[fetchResults objectAtIndex: i] objectForKey: @"flags"] containsObject: @"deleted"] && initialLoadInProgress) + continue; + d = [NSDictionary dictionaryWithObject: ([[[fetchResults objectAtIndex: i] objectForKey: @"flags"] containsObject: @"deleted"]) ? [NSNull null] : [[fetchResults objectAtIndex: i] objectForKey: @"modseq"] forKey: [[[fetchResults objectAtIndex: i] objectForKey: @"uid"] stringValue]]; [allTokens addObject: d]; @@ -2205,7 +2209,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) if (highestmodseq == 0) highestmodseq = 1; - if (highestmodseq > 0) + if (highestmodseq > 0 && !initialLoadInProgress) { id uid; diff --git a/SoObjects/Mailer/SOGoMailForward.m b/SoObjects/Mailer/SOGoMailForward.m index 3450539d5..eab520cb8 100644 --- a/SoObjects/Mailer/SOGoMailForward.m +++ b/SoObjects/Mailer/SOGoMailForward.m @@ -73,10 +73,10 @@ - (NSString *) newLine { - NSString *rc = [NSString stringWithString: @" "]; + NSString *rc = @" "; if (htmlComposition) - rc = [NSString stringWithString: @"
"]; + rc = @"
"; return rc; } diff --git a/SoObjects/Mailer/SOGoMailLabel.m b/SoObjects/Mailer/SOGoMailLabel.m index 1c66786f6..553a0395f 100644 --- a/SoObjects/Mailer/SOGoMailLabel.m +++ b/SoObjects/Mailer/SOGoMailLabel.m @@ -74,7 +74,7 @@ int i; allLabels = [NSMutableArray array]; - allKeys = [[theDefaults allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare:)]; + allKeys = (NSMutableArray *)[[theDefaults allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare:)]; for (i = 0; i < [allKeys count]; i++) { diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index 3975dd82c..045de4149 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -389,6 +389,13 @@ static BOOL debugSoParts = NO; [[[info valueForKey: @"subtype"] lowercaseString] isEqualToString: @"calendar"]) return info; + // deal with mails that contain only an attachment, for example: + // application/pkcs7-mime + // application/pdf + // etc. + if ([[[info valueForKey: @"type"] lowercaseString] isEqualToString: @"application"]) + return info; + /* For each path component, eg 1,1,3 @@ -775,9 +782,14 @@ static BOOL debugSoParts = NO; [mimeType hasPrefix: @"audio/"] || [mimeType hasPrefix: @"image/"] || [mimeType hasPrefix: @"video/"]) + { filename = [NSString stringWithFormat: @"unknown_%@", path]; - else if ([mimeType isEqualToString: @"message/rfc822"]) - filename = [NSString stringWithFormat: @"email_%@.eml", path]; + } + else + { + if ([mimeType isEqualToString: @"message/rfc822"]) + filename = [NSString stringWithFormat: @"email_%@.eml", path]; + } } if (filename) @@ -810,7 +822,7 @@ static BOOL debugSoParts = NO; NSMutableDictionary *currentPart; NSString *newPath; NSArray *subparts; - NSString *type; + NSString *type, *subtype; NSUInteger i; type = [[part objectForKey: @"type"] lowercaseString]; @@ -821,19 +833,27 @@ static BOOL debugSoParts = NO; { currentPart = [subparts objectAtIndex: i-1]; if (path) - newPath = [NSString stringWithFormat: @"%@.%d", path, i]; + newPath = [NSString stringWithFormat: @"%@.%d", path, (int)i]; else - newPath = [NSString stringWithFormat: @"%d", i]; + newPath = [NSString stringWithFormat: @"%d", (int)i]; [self _fetchFileAttachmentKeysInPart: currentPart intoArray: keys withPath: newPath - andPrefix: [NSString stringWithFormat: @"%@/%i", prefix, i]]; + andPrefix: [NSString stringWithFormat: @"%@/%i", prefix, (int)i]]; } } else { if (!path) - path = @"1"; + { + path = @"1"; + + // We set the path to 0 in case of a smime mail if not provided. + subtype = [[part objectForKey: @"subtype"] lowercaseString]; + if ([subtype isEqualToString: @"pkcs7-mime"]) + path = @"0"; + } + [self _fetchFileAttachmentKey: part intoArray: keys withPath: path @@ -1027,6 +1047,14 @@ static BOOL debugSoParts = NO; return obj; } } + // Handles cases where the email is itself an attachment, so its Content-Type + // is application/*, image/* etc. + else if ([_key isEqualToString: @"asAttachment"] && + (obj = [self lookupImap4BodyPartKey: @"0" inContext:_ctx]) != nil) + { + [obj setAsAttachment]; + return obj; + } /* return 404 to stop acquisition */ return [NSException exceptionWithHTTPStatus:404 /* Not Found */ diff --git a/SoObjects/SOGo/BSONCodec.m b/SoObjects/SOGo/BSONCodec.m index ce4c01e24..0e68f966c 100644 --- a/SoObjects/SOGo/BSONCodec.m +++ b/SoObjects/SOGo/BSONCodec.m @@ -310,7 +310,7 @@ static NSDictionary *BSONTypes() case 'q': return 0x12; default: - [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; + [NSException raise: NSInvalidArgumentException format: @"%@::%@ - invalid encoding type '%c'", [self class], NSStringFromSelector(_cmd), encoding]; } return 0; } @@ -385,7 +385,7 @@ static NSDictionary *BSONTypes() } - [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; + [NSException raise: NSInvalidArgumentException format: @"%@::%@ - invalid encoding type '%c'", [self class], NSStringFromSelector(_cmd), encoding]; return nil; } diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index d537c6aec..55115efdd 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -1703,7 +1703,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection, hostname: hostname port: [NSString stringWithFormat: @"%d", port] encryption: encryption - bindAsCurrentUser: NO]; + bindAsCurrentUser: [NSString stringWithFormat: @"%d", NO]]; [ab setBaseDN: [entry dn] IDField: @"cn" CNField: @"displayName" diff --git a/SoObjects/SOGo/NSArray+Utilities.h b/SoObjects/SOGo/NSArray+Utilities.h index d5ee37c8f..43986bf9e 100644 --- a/SoObjects/SOGo/NSArray+Utilities.h +++ b/SoObjects/SOGo/NSArray+Utilities.h @@ -1,8 +1,6 @@ /* NSArray+Utilities.h - this file is part of SOGo * - * Copyright (C) 2006 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/SoObjects/SOGo/NSArray+Utilities.m b/SoObjects/SOGo/NSArray+Utilities.m index 6f2a56449..e82e3cf28 100644 --- a/SoObjects/SOGo/NSArray+Utilities.m +++ b/SoObjects/SOGo/NSArray+Utilities.m @@ -1,8 +1,6 @@ /* NSArray+Utilities.m - this file is part of SOGo * - * Copyright (C) 2006-2011 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/SoObjects/SOGo/NSCalendarDate+SOGo.m b/SoObjects/SOGo/NSCalendarDate+SOGo.m index 2d496a2cc..6511e48d6 100644 --- a/SoObjects/SOGo/NSCalendarDate+SOGo.m +++ b/SoObjects/SOGo/NSCalendarDate+SOGo.m @@ -90,9 +90,9 @@ static NSString *rfc822Months[] = {@"", @"Jan", @"Feb", @"Mar", @"Apr", NSString *str; str = [NSString stringWithFormat: @"%.4d%.2d%.2d", - [self yearOfCommonEra], - [self monthOfYear], - [self dayOfMonth]]; + (int)[self yearOfCommonEra], + (int)[self monthOfYear], + (int)[self dayOfMonth]]; return str; } @@ -109,9 +109,9 @@ static NSString *rfc822Months[] = {@"", @"Jan", @"Feb", @"Mar", @"Apr", return [NSString stringWithFormat: @"%@, %.2d %@ %d %.2d:%.2d:%.2d %+.4d", - rfc822Days[[self dayOfWeek]], [self dayOfMonth], - rfc822Months[[self monthOfYear]], [self yearOfCommonEra], - [self hourOfDay], [self minuteOfHour], [self secondOfMinute], + rfc822Days[[self dayOfWeek]], (int)[self dayOfMonth], + rfc822Months[[self monthOfYear]], (int)[self yearOfCommonEra], + (int)[self hourOfDay], (int)[self minuteOfHour], (int)[self secondOfMinute], timeZoneShift]; } diff --git a/SoObjects/SOGo/NSData+Crypto.m b/SoObjects/SOGo/NSData+Crypto.m index 5e2f3640a..5c0a03a06 100644 --- a/SoObjects/SOGo/NSData+Crypto.m +++ b/SoObjects/SOGo/NSData+Crypto.m @@ -23,7 +23,7 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __OpenBSD__ +#if !defined(__OpenBSD__) && !defined(__FreeBSD__) #include #endif diff --git a/SoObjects/SOGo/NSDictionary+DAV.m b/SoObjects/SOGo/NSDictionary+DAV.m index 722e20511..a2d52e71e 100644 --- a/SoObjects/SOGo/NSDictionary+DAV.m +++ b/SoObjects/SOGo/NSDictionary+DAV.m @@ -46,7 +46,7 @@ { NSString *newTag; - newTag = [NSString stringWithFormat: @"n%d", [namespaces count]]; + newTag = [NSString stringWithFormat: @"n%d", (int)[namespaces count]]; [namespaces setObject: newTag forKey: newNS]; return newTag; diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index d7d85e5f5..6dbcb9689 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -309,7 +309,7 @@ static int cssEscapingCount; c == 0xD || (c >= 0x20 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || - (c >= 0x10000 && c <= 0x10FFFF)) + (c >= (unichar)0x10000 && c <= (unichar)0x10FFFF)) { *(start+j) = c; j++; @@ -373,6 +373,7 @@ static int cssEscapingCount; - (NSString *) asCSSIdentifier { + NSCharacterSet *numericSet; NSMutableString *cssIdentifier; unichar currentChar; int count, max, idx; @@ -381,10 +382,12 @@ static int cssEscapingCount; [self _setupCSSEscaping]; cssIdentifier = [NSMutableString string]; + numericSet = [NSCharacterSet decimalDigitCharacterSet]; max = [self length]; + if (max > 0) { - if (isdigit([self characterAtIndex: 0])) + if ([numericSet characterIsMember: [self characterAtIndex: 0]]) // A CSS identifier can't start with a digit; we add an underscore [cssIdentifier appendString: @"_"]; for (count = 0; count < max; count++) @@ -415,6 +418,7 @@ static int cssEscapingCount; - (NSString *) fromCSSIdentifier { + NSCharacterSet *numericSet; NSMutableString *newString; NSString *currentString; int count, length, max, idx; @@ -423,12 +427,14 @@ static int cssEscapingCount; if (!cssEscapingStrings) [self _setupCSSEscaping]; + numericSet = [NSCharacterSet decimalDigitCharacterSet]; newString = [NSMutableString string]; max = [self length]; count = 0; + if (max > 0 && [self characterAtIndex: 0] == '_' - && isdigit([self characterAtIndex: 1])) + && [numericSet characterIsMember: [self characterAtIndex: 1]]) { /* If the identifier starts with an underscore followed by a digit, we remove the underscore */ diff --git a/SoObjects/SOGo/SOGoCache.h b/SoObjects/SOGo/SOGoCache.h index 69ef6f942..12e665ea7 100644 --- a/SoObjects/SOGo/SOGoCache.h +++ b/SoObjects/SOGo/SOGoCache.h @@ -21,6 +21,7 @@ #ifndef SOGOCACHE_H #define SOGOCACHE_H +#import #import #include diff --git a/SoObjects/SOGo/SOGoCacheGCSFolder.h b/SoObjects/SOGo/SOGoCacheGCSFolder.h index 3495dc0d6..c51dd598f 100644 --- a/SoObjects/SOGo/SOGoCacheGCSFolder.h +++ b/SoObjects/SOGo/SOGoCacheGCSFolder.h @@ -40,6 +40,8 @@ - (NSMutableString *) pathForChild: (NSString *) childName; +- (void) addUserInAcls: (NSString *) user; + - (NSArray *) toOneRelationshipKeys; - (NSArray *) toManyRelationshipKeys; diff --git a/SoObjects/SOGo/SOGoCacheGCSFolder.m b/SoObjects/SOGo/SOGoCacheGCSFolder.m index b29287fcb..2e483bc32 100644 --- a/SoObjects/SOGo/SOGoCacheGCSFolder.m +++ b/SoObjects/SOGo/SOGoCacheGCSFolder.m @@ -364,7 +364,7 @@ Class SOGoCacheGCSObjectK = Nil; if (record) { if ([[record objectForKey: @"c_type"] intValue] == MAPIFolderCacheObject) - objectClass = isa; + objectClass = object_getClass(self); else objectClass = SOGoCacheGCSObjectK; diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.h b/SoObjects/SOGo/SOGoCacheGCSObject.h index b456c1775..a2ffe5bf0 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.h +++ b/SoObjects/SOGo/SOGoCacheGCSObject.h @@ -55,6 +55,9 @@ typedef enum { - (void) reloadIfNeeded; - (void) save; +- (NSException *) destroy; + ++ (id) objectWithName: (NSString *) key inContainer: (id) theContainer useCache: (BOOL) useCache; /* accessors */ - (NSMutableString *) path; /* full filename */ diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.m b/SoObjects/SOGo/SOGoCacheGCSObject.m index a2251173a..a6a5c52a3 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.m +++ b/SoObjects/SOGo/SOGoCacheGCSObject.m @@ -87,7 +87,7 @@ static EOAttribute *textColumn = nil; { tableUrl = nil; initialized = NO; - objectType = -1; + objectType = (SOGoCacheObjectType) -1; deleted = NO; version = 0; } @@ -103,11 +103,22 @@ static EOAttribute *textColumn = nil; } + (id) objectWithName: (NSString *) key inContainer: (id) theContainer +{ + return [self objectWithName: key + inContainer: theContainer + useCache: YES]; +} + ++ (id) objectWithName: (NSString *) key inContainer: (id) theContainer useCache: (BOOL) useCache { SOGoCache *cache; id o; cache = [SOGoCache sharedCache]; + + if (!useCache) + [cache unregisterObjectWithName: key inContainer: theContainer]; + o = [cache objectNamed: key inContainer: theContainer]; if (!o) @@ -383,7 +394,7 @@ static EOAttribute *textColumn = nil; @"SELECT * FROM %@ WHERE c_path = %@", tableName, pathValue]; if (startVersion > -1) - [sql appendFormat: @" AND c_version > %d", startVersion]; + [sql appendFormat: @" AND c_version > %d", (int)startVersion]; /* execution */ records = [self performSQLQuery: sql]; @@ -411,15 +422,13 @@ static EOAttribute *textColumn = nil; tableName = [self tableName]; adaptor = [self tableChannelAdaptor]; - pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@", deviceId] - forAttribute: textColumn]; /* query */ sql = [NSMutableString stringWithFormat: @"SELECT * FROM %@ WHERE c_type = %d AND c_deleted <> 1", tableName, objectType]; if (startVersion > -1) - [sql appendFormat: @" AND c_version > %d", startVersion]; + [sql appendFormat: @" AND c_version > %d", (int)startVersion]; if (deviceId) { pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@%", deviceId] @@ -546,7 +555,7 @@ static EOAttribute *textColumn = nil; lastModifiedValue = (NSInteger) [lastModified timeIntervalSince1970]; - if (objectType == -1) + if (objectType == (SOGoCacheObjectType) -1) [NSException raise: @"SOGoCacheIOException" format: @"object type has not been set for object '%@'", self]; @@ -576,7 +585,7 @@ static EOAttribute *textColumn = nil; @")"), tableName, pathValue, parentPathValue, objectType, - creationDateValue, lastModifiedValue, + (int)creationDateValue, (int)lastModifiedValue, propsValue]; isNew = NO; } @@ -590,7 +599,7 @@ static EOAttribute *textColumn = nil; @" c_version = %d, c_content = %@" @" WHERE c_path = %@"), tableName, - lastModifiedValue, deletedValue, version, propsValue, + (int)lastModifiedValue, (int)deletedValue, (int)version, propsValue, pathValue]; } diff --git a/SoObjects/SOGo/SOGoCacheObject.h b/SoObjects/SOGo/SOGoCacheObject.h index d8b01c468..0d0a78492 100644 --- a/SoObjects/SOGo/SOGoCacheObject.h +++ b/SoObjects/SOGo/SOGoCacheObject.h @@ -42,8 +42,6 @@ - (NSCalendarDate *) creationDate; - (NSCalendarDate *) lastModified; -- (NSException *) destroy; - @end #endif /* SOGOCACHEOBJECT_H */ diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index 088fe522e..2092deacc 100644 --- a/SoObjects/SOGo/SOGoContentObject.m +++ b/SoObjects/SOGo/SOGoContentObject.m @@ -94,7 +94,7 @@ { [self subclassResponsibility: _cmd]; - return nil; + return (Class *) nil; } - (void) _setRecord: (NSDictionary *) objectRecord @@ -254,6 +254,9 @@ - (NSException *) moveToFolder: (SOGoGCSFolder *) newFolder { [self subclassResponsibility: _cmd]; + + // TODO: Add exception handling code and return it + return (NSException *) nil; } - (NSException *) delete @@ -345,7 +348,7 @@ /* attempt a save */ - error = [self saveComponent: [[self parsingClass] parseSingleFromSource: [rq contentAsString]] + error = [self saveComponent: [(id)[self parsingClass] parseSingleFromSource: [rq contentAsString]] baseVersion: baseVersion]; if (error) response = (WOResponse *) error; @@ -410,7 +413,7 @@ else length = 0; - return [NSString stringWithFormat: @"%u", length]; + return [NSString stringWithFormat: @"%u", (unsigned int)length]; } - (NSException *) davMoveToTargetObject: (id) _target diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index 24f91bcf4..3a2a2a726 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -58,6 +58,7 @@ SOGoMailDomain = "localhost"; SOGoSelectedAddressBook = "collected"; SOGoRefreshViewCheck = "manually"; + SOGoAlternateAvatar = "none"; SOGoMailMessageForwarding = "inline"; SOGoMailReplyPlacement = "below"; SOGoMailSignaturePlacement = "below"; diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index b089c258a..ac9d019c8 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -107,7 +107,7 @@ - (void) setDisplayName: (NSString *) newDisplayName { - ASSIGN (displayName, newDisplayName); + ASSIGN (displayName, (NSMutableString *)newDisplayName); } - (NSString *) displayName diff --git a/SoObjects/SOGo/SOGoGCSFolder.h b/SoObjects/SOGo/SOGoGCSFolder.h index 9b8de6b35..6a3f56fa7 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.h +++ b/SoObjects/SOGo/SOGoGCSFolder.h @@ -77,6 +77,9 @@ - (id) folderPropertyValueInCategory: (NSString *) theKey forUser: (SOGoUser *) theUser; +- (BOOL) synchronize; +- (void) setSynchronize: (BOOL) new; + /* lower level fetches */ - (void) deleteEntriesWithIds: (NSArray *) ids; @@ -128,8 +131,8 @@ - (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties matchingSyncToken: (NSString *) syncToken - fromDate: (NSCalendarDate *) theStartDate; - + fromDate: (NSCalendarDate *) theStartDate + initialLoad: (BOOL) initialLoadInProgress; /* multiget helper */ - (WOResponse *) performMultigetInContext: (WOContext *) queryContext diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index a17d27c4d..adbcb348e 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -301,6 +301,29 @@ static NSArray *childRecordFields = nil; return name; } +- (BOOL) synchronize +{ + NSNumber *synchronize; + + synchronize = [self folderPropertyValueInCategory: @"FolderSynchronize"]; + + return [synchronize boolValue]; +} + +- (void) setSynchronize: (BOOL) new +{ + NSNumber *synchronize; + + if (new) + synchronize = [NSNumber numberWithBool: YES]; + else + synchronize = nil; + + [self setFolderPropertyValue: synchronize + inCategory: @"FolderSynchronize"]; +} + + /* This method fetches the display name defined by the owner, but is also the fallback when a subscriber has not redefined the display name yet in their environment. */ @@ -376,12 +399,12 @@ static NSArray *childRecordFields = nil; if (!displayName) { if (activeUserIsOwner) - displayName = [self _displayNameFromOwner]; + displayName = (NSMutableString *)[self _displayNameFromOwner]; else { - displayName = [self _displayNameFromSubscriber]; + displayName = (NSMutableString *)[self _displayNameFromSubscriber]; if (!displayName) - displayName = [self _displayNameFromOwner]; + displayName = (NSMutableString *)[self _displayNameFromOwner]; } [displayName retain]; } @@ -829,7 +852,7 @@ static NSArray *childRecordFields = nil; { currentID = [ids objectAtIndex: count]; names = [[currentID componentsSeparatedByString: @"/"] objectEnumerator]; - deleteObject = self; + deleteObject = (SOGoContentObject *)self; while ((currentName = [names nextObject])) { deleteObject = [deleteObject lookupName: currentName @@ -1151,6 +1174,7 @@ static NSArray *childRecordFields = nil; - (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties matchingSyncToken: (NSString *) syncToken fromDate: (NSCalendarDate *) theStartDate + initialLoad: (BOOL) initialLoadInProgress { /* TODO: - validation: @@ -1200,13 +1224,17 @@ static NSArray *childRecordFields = nil; mRecords = [NSMutableArray arrayWithArray: [self _fetchFields: fields withQualifier: qualifier ignoreDeleted: YES]]; - qualifier = [EOQualifier qualifierWithQualifierFormat: - @"c_lastmodified > %d and c_deleted == 1", - syncTokenInt]; - fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_deleted", nil]; - [mRecords addObjectsFromArray: [self _fetchFields: fields - withQualifier: qualifier - ignoreDeleted: NO]]; + if (!initialLoadInProgress) + { + qualifier = [EOQualifier qualifierWithQualifierFormat: + @"c_lastmodified > %d and c_deleted == 1", + syncTokenInt]; + fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_lastmodified", @"c_deleted", nil]; + [mRecords addObjectsFromArray: [self _fetchFields: fields + withQualifier: qualifier + ignoreDeleted: NO]]; + } + records = mRecords; } else @@ -1499,7 +1527,9 @@ static NSArray *childRecordFields = nil; properties = [self parseDAVRequestedProperties: propElement]; records = [self syncTokenFieldsWithProperties: properties matchingSyncToken: syncToken - fromDate: nil]; + fromDate: nil + initialLoad: NO]; + [self _appendComponentProperties: [properties allKeys] fromRecords: records matchingSyncToken: [syncToken intValue] diff --git a/SoObjects/SOGo/SOGoGroup.m b/SoObjects/SOGo/SOGoGroup.m index cacdd7770..c72095fb6 100644 --- a/SoObjects/SOGo/SOGoGroup.m +++ b/SoObjects/SOGo/SOGoGroup.m @@ -135,7 +135,7 @@ { NSArray *allSources; NGLdapEntry *entry; - NSObject *source; + NSObject *source; id o; NSEnumerator *gclasses; NSString *gclass; @@ -154,7 +154,7 @@ for (i = 0; i < [allSources count]; i++) { - source = [[SOGoUserManager sharedUserManager] sourceWithID: [allSources objectAtIndex: i]]; + source = (NSObject *) [[SOGoUserManager sharedUserManager] sourceWithID: [allSources objectAtIndex: i]]; // Our different sources might not all implements groups support if ([source respondsToSelector: theSelector]) diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index 3f3afcb9b..c54c0b76c 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -1066,7 +1066,7 @@ [_ms appendFormat:@" name=%@", nameInContainer]; if (container) [_ms appendFormat:@" container=0x%08X/%@", - container, [container valueForKey:@"nameInContainer"]]; + (unsigned int)container, [container valueForKey:@"nameInContainer"]]; } - (NSString *) description @@ -1074,7 +1074,7 @@ NSMutableString *ms; ms = [NSMutableString stringWithCapacity:64]; - [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])]; + [ms appendFormat:@"<0x%08X[%@]:", (unsigned int) self, NSStringFromClass([self class])]; [self appendAttributesToDescription:ms]; [ms appendString:@">"]; @@ -1084,7 +1084,7 @@ - (NSString *) loggingPrefix { return [NSString stringWithFormat:@"<0x%08X[%@]:%@>", - self, NSStringFromClass([self class]), + (unsigned int) self, NSStringFromClass([self class]), [self nameInContainer]]; } diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index 501f90f9f..eb454dc97 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -433,7 +433,7 @@ static SoSecurityManager *sm = nil; error = [self appendPersonalSources]; if (!error) if ([self respondsToSelector:@selector(appendCollectedSources)]) - error = [self appendCollectedSources]; + error = [self performSelector:@selector(appendCollectedSources)]; if (!error) error = [self appendSystemSources]; // TODO : Not really a testcase, see function if (error) diff --git a/SoObjects/SOGo/SOGoUserDefaults.h b/SoObjects/SOGo/SOGoUserDefaults.h index 465aca2f8..ca84a661f 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.h +++ b/SoObjects/SOGo/SOGoUserDefaults.h @@ -120,6 +120,9 @@ extern NSString *SOGoWeekStartFirstFullWeek; - (void) setRefreshViewCheck: (NSString *) newValue; - (NSString *) refreshViewCheck; +- (void) setAlternateAvatar: (NSString *) newValue; +- (NSString *) alternateAvatar; + - (void) setMailComposeMessageType: (NSString *) newValue; - (NSString *) mailComposeMessageType; diff --git a/SoObjects/SOGo/SOGoUserDefaults.m b/SoObjects/SOGo/SOGoUserDefaults.m index c0062ac18..100de9c95 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.m +++ b/SoObjects/SOGo/SOGoUserDefaults.m @@ -498,6 +498,16 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; return [self stringForKey: @"SOGoRefreshViewCheck"]; } +- (void) setAlternateAvatar: (NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoAlternateAvatar"]; +} + +- (NSString *) alternateAvatar +{ + return [self stringForKey: @"SOGoAlternateAvatar"]; +} + - (void) setMailComposeMessageType: (NSString *) newValue { [self setObject: newValue forKey: @"SOGoMailComposeMessageType"]; diff --git a/SoObjects/SOGo/SQLSource.m b/SoObjects/SOGo/SQLSource.m index aa881b9d3..2e117f54d 100644 --- a/SoObjects/SOGo/SQLSource.m +++ b/SoObjects/SOGo/SQLSource.m @@ -880,7 +880,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -893,7 +893,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -906,7 +906,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -932,7 +932,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -947,7 +947,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -961,7 +961,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason diff --git a/SoObjects/SOGo/WORequest+SOGo.m b/SoObjects/SOGo/WORequest+SOGo.m index f528343dd..d7c750b65 100644 --- a/SoObjects/SOGo/WORequest+SOGo.m +++ b/SoObjects/SOGo/WORequest+SOGo.m @@ -180,14 +180,21 @@ cc = [self clientCapabilities]; b = ( - [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound - && [[cc userAgent] rangeOfString: @"Darwin"].location != NSNotFound - || ( - [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound - || [[cc userAgent] rangeOfString: @"Mac OS X"].location != NSNotFound - ) - && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound - ); + ( + [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"Darwin"].location != NSNotFound + ) + || + ( + [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound + ) + || + ( + [[cc userAgent] rangeOfString: @"Mac OS X"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound + ) + ); return b; } diff --git a/Tests/Integration/carddav.py b/Tests/Integration/carddav.py index 68a859723..c9385cb17 100644 --- a/Tests/Integration/carddav.py +++ b/Tests/Integration/carddav.py @@ -70,7 +70,11 @@ class Carddav: if not self.cards: url = "/SOGo/so/%s/Contacts/personal/view" % (self.login) content = self._get(url) - self.cards = content['cards'] + #print "\nCONTENT:", content + if 'cards' in content: + self.cards = content['cards'] + else: + self.cards = [] return self.cards def get_cards(self, pattern): diff --git a/Tests/Integration/preferences.py b/Tests/Integration/preferences.py index 9620b271a..ea3e7b10b 100644 --- a/Tests/Integration/preferences.py +++ b/Tests/Integration/preferences.py @@ -89,9 +89,9 @@ class preferences: get = HTTPPreferencesGET(url) get.cookie = self.cookie self.client.execute(get) - if DEBUG: print "LUC (url):", url - if DEBUG: print "LUC (status):", get.response["status"] - if DEBUG: print "LUC (body):", get.response['body'] + if DEBUG: print "DEBUG (url):", url + if DEBUG: print "DEBUG (status):", get.response["status"] + if DEBUG: print "DEBUG (body):", get.response['body'] content = simplejson.loads(get.response['body']) result = None try: @@ -117,7 +117,7 @@ class preferences: # Get the right sub-dict and change the key/value subdict = self.find_key(self.preferences, preference) if not subdict: - print "LUC(nosubdict):", preference, self.preferences + raise AttributeError("ERROR(nosubdict): looking for %s in: %s" %(preference, str(self.preferences))) subdict[preference] = value def set(self, preference, value=None): diff --git a/Tests/Integration/test-carddav.py b/Tests/Integration/test-carddav.py index a7bf65c2f..0d642d683 100755 --- a/Tests/Integration/test-carddav.py +++ b/Tests/Integration/test-carddav.py @@ -85,6 +85,13 @@ class JsonDavPhoneTests(unittest.TestCase): self.allphones = list(self.newphone) self.allphones.extend(self.newphones_difftype) self.allphones.extend(self.newphones_sametype) + #- In case there are no cards for this user + try: + self._get_card() + except IndexError: + path = 'Contacts/personal' + (card, path, gid) = self._create_new_card(path) + self._save_card(card) def tearDown(self): self._connect_as_user() @@ -102,6 +109,23 @@ class JsonDavPhoneTests(unittest.TestCase): def _connect_as_user(self, newuser=username, newpassword=password): self.dv = carddav.Carddav(newuser, newpassword) + def _create_new_card(self, path): + gid = self.dv.newguid(path) + card = {'c_categories': None, + 'c_cn': 'John Doe', + 'c_component': 'vcard', + 'c_givenname': 'John Doe', + 'c_mail': 'johndoe@nothere.com', + 'c_name': gid, + 'c_o': '', + 'c_screenname': '', + 'c_sn': '', + 'c_telephonenumber': '123.456.7890', + 'emails': [{'type': 'pref', 'value': 'johndoe@nothere.com'}], + 'phones': [{'type': 'home', 'value': '111.222.3333'}], + 'id': gid} + return (card, path, gid) + def _get_card(self, name="John Doe"): tmp_card = self.dv.get_cards(name)[0] self.card = self.dv.get_card(tmp_card['c_name']) @@ -149,8 +173,8 @@ class JsonDavPhoneTests(unittest.TestCase): def testMultipleDifferentPhones(self): self._testMultiplePhones(self.newphones_difftype) - #def testMultipleSameTypePhones(self): - # self._testMultiplePhones(self.newphones_sametype) + def testMultipleSameTypePhones(self): + self._testMultiplePhones(self.newphones_sametype) if __name__ == "__main__": sogotests.runTests() diff --git a/Tests/Integration/test-prevent-invitations.py b/Tests/Integration/test-prevent-invitations.py index 0ed60f589..c359d5369 100755 --- a/Tests/Integration/test-prevent-invitations.py +++ b/Tests/Integration/test-prevent-invitations.py @@ -28,12 +28,14 @@ class preventInvitationsTest(unittest.TestCase): self.caldav = CalDAVSchedulingTest(self) cal = self.prefs.get("Calendar") if "PreventInvitationsWhitelist" not in cal: - #print "LUC (cal):", cal cal["PreventInvitationsWhitelist"] = None self.prefs.set("PreventInvitationsWhitelist", None) + if "PreventInvitations" not in cal: + cal["PreventInvitations"] = 0 + self.prefs.set("PreventInvitations", 0) def tearDown(self): - self.prefs.set("autoReplyText", "") + #self.prefs.set("autoReplyText", "") self.prefs.set('PreventInvitations', 0) self.prefs.set("PreventInvitationsWhitelist", None) #- Manual Cleanup, not called because classs is not derived from unittest diff --git a/Tests/Unit/GNUmakefile b/Tests/Unit/GNUmakefile index bcfd13850..b3b666270 100644 --- a/Tests/Unit/GNUmakefile +++ b/Tests/Unit/GNUmakefile @@ -22,10 +22,13 @@ $(TEST_TOOL)_OBJC_FILES += \ TestSBJsonParser.m \ \ TestNGMimeAddressHeaderFieldGenerator.m \ + TestNGMimeMessageGenerator.m \ + \ TestNSData+Crypto.m \ TestNSString+Crypto.m \ TestNSString+URLEscaping.m \ - TestNSString+Utilities.m + TestNSString+Utilities.m \ + TestNGMailAddressParser.m TEST_TOOL_NAME = $(TEST_TOOL) diff --git a/Tests/Unit/SOGoTest.h b/Tests/Unit/SOGoTest.h index 927cc27a9..ed49be707 100644 --- a/Tests/Unit/SOGoTest.h +++ b/Tests/Unit/SOGoTest.h @@ -25,6 +25,8 @@ #import #import +#import +#import #import @class NSArray; @@ -52,6 +54,8 @@ - (BOOL) run; +- (NSString*) stringFromDiffBetween: (NSString*) str1 + and: (NSString*) str2; @end #define test(c) { \ diff --git a/Tests/Unit/SOGoTest.m b/Tests/Unit/SOGoTest.m index 1d548543e..48dafb17c 100644 --- a/Tests/Unit/SOGoTest.m +++ b/Tests/Unit/SOGoTest.m @@ -185,4 +185,79 @@ static NSString *SOGoTestAssertException = @"SOGoTestAssertException"; return YES; } +/* Helper function for diffForString:andString */ +NSString *_stringForCharacterAtIndex(NSUInteger index, NSString *str, NSUInteger length) +{ + NSString *chrStr; + unichar chr; + if (index < length) + { + chr = [str characterAtIndex: index]; + if (isprint(chr)) + { + chrStr = [NSString stringWithFormat: @"%c", chr]; + } + else + { + if (chr == 10) + chrStr = @"[NL]"; + else if (chr == 0) + chrStr = @"[\0]"; + else + chrStr = [NSString stringWithFormat: @"[NP: %u]", chr]; + } + } + else + { + chrStr = @"[none]"; + } + + return chrStr; +} + +/* + Returns a string with a very verbose diff of the two strings. + In case the strings are equal it returns an empty string. + Example output for the strings 'flower' and 'flotera': + +0 |f| +1 |l| +2 |o| +3 |w|t|<-- +4 |e| +5 |r| +6 |[none]|a|<-- + +*/ +- (NSString*) stringFromDiffBetween: (NSString*) str1 + and: (NSString*) str2 +{ + BOOL differencesFound = NO; + NSString *finalSTR = @""; + NSUInteger i, length1, length2; + NSString *sc1, *sc2; + + length1 = [str1 length]; + length2 = [str2 length]; + for (i = 0; i < length1 || i < length2; i++) + { + sc1 = _stringForCharacterAtIndex(i, str1, length1); + sc2 = _stringForCharacterAtIndex(i, str2, length2); + + if ([sc1 isEqualToString: sc2]) + finalSTR = [finalSTR stringByAppendingFormat: @"%lu |%@|\n", i, sc1]; + else + { + finalSTR = [finalSTR stringByAppendingFormat: @"%lu |%@|%@|<--\n", i, sc1, sc2]; + differencesFound = YES; + } + } + + if (!differencesFound) + return @""; + + return finalSTR; +} + + @end diff --git a/Tests/Unit/TestNGMailAddressParser.m b/Tests/Unit/TestNGMailAddressParser.m new file mode 100644 index 000000000..11c8e05d6 --- /dev/null +++ b/Tests/Unit/TestNGMailAddressParser.m @@ -0,0 +1,129 @@ +/* TestNGMailAddressParser.m - this file is part of SOGo + * + * Copyright (C) 2015 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import + +#import "SOGoTest.h" + +@interface TestNGMailAddressParser : SOGoTest +@end + +@implementation TestNGMailAddressParser + +/* important: this file must be encoded in iso-8859-1, due to issues with the + objc compiler */ +- (void) test_singleEmailParsing_value_ +{ + NSArray *rawAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"", // email between brackets + @"\"\" ", // doubled +// @"\"johndown@inverse.ca\" ", // with and without br. + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword + @"John Down \"Bla Bla\" ", // partly quoted + @"John Down ", // full name + email + @"John, Down ", // full name with comma + email + @"john", // name only, no domain + nil ]; + NSArray *expectedAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"johndown@test.com", // email between brackets + @"johndown@test.com", // doubled +// @"\"johndown@inverse.ca\" ", // with and without br. + @"johndown@test.com", // accented full name + @"johndown@test.com", // accented + // and multiword + + /* NOTE: the following are wrong but tolerated for now */ + @"johndown@test.com", // partly quoted + @"johndown@test.com", // full name + email + @"johndown@test.com", // full name with comma + email + @"john", // name only, no domain + nil ]; + NSString *rawAddress, *currentExp, *result, *error; + NGMailAddressParser *parser; + NGMailAddress *parsedRecipient; + + int count = 0; + for (count = 0; count < [rawAddresses count]; count++) + { + rawAddress = [rawAddresses objectAtIndex:count]; + currentExp = [expectedAddresses objectAtIndex:count]; + parser = [NGMailAddressParser mailAddressParserWithString: rawAddress]; + parsedRecipient = [parser parse]; + result = [parsedRecipient address]; + error = [NSString + stringWithFormat: @"received '%@' instead of '%@' for '%@'", + result, currentExp, rawAddress]; + testWithMessage([result isEqualToString: currentExp], error); + } +} + +- (void) test_multipleEmailParsing_value_ +{ + NSArray *rawAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"test1a@test.com, test1b@here.now", + @"\"johndown@inverse.ca\" ", // with and without br. + @"John One , John Two ", // TWO full names + email + @"Three, John , Four, John ", // TWO full names with comma + email + @"john, down", // Two partial names + @"Three A , Three B , Three C ", // Three mails + nil ]; + NSArray *expectedAddresses = [NSArray arrayWithObjects: + [NSArray arrayWithObjects: @"johndown@test.com", nil], // email alone + [NSArray arrayWithObjects: @"test1a@test.com", @"test1b@here.now", nil], // test1 a/b + [NSArray arrayWithObjects: @"johndown@test.com", nil], // with and without br. + [NSArray arrayWithObjects: @"test2a@test.com", @"test2b@here.now", nil], // test2 a/b + [NSArray arrayWithObjects: @"test3a@test.com", @"test3b@here.now", nil], // test3 a/b + [NSArray arrayWithObjects: @"john", @"down", nil], + [NSArray arrayWithObjects: @"threea@test.com", @"threeb@test.com", @"threec@test.com", nil], // test a/b/c + nil ]; + NSString *currentRaw, *currentExp, *result, *error; + NGMailAddressParser *parser = nil; + NSArray *parsedRecipients = nil; + NSArray *expectedRecipients = nil; + NGMailAddress *parsedRecipient = nil; + + int count = 0; + for (count = 0; count < [rawAddresses count]; count++) + { + currentRaw = [rawAddresses objectAtIndex: count]; + expectedRecipients = [expectedAddresses objectAtIndex: count]; + parser = [NGMailAddressParser mailAddressParserWithString: currentRaw]; + parsedRecipients = [parser parseAddressList]; + int innercount; + for (innercount = 0; innercount < [parsedRecipients count]; innercount++) + { + parsedRecipient = [parsedRecipients objectAtIndex:innercount]; + result = [parsedRecipient address]; + currentExp = [expectedRecipients objectAtIndex:innercount]; + error = [NSString + stringWithFormat: @"received '%@' instead of '%@' for '%@'", + result, currentExp, currentRaw]; + testWithMessage([result isEqualToString: currentExp], error); + } + + } +} +@end + diff --git a/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m b/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m index 3a5fe5fdf..ef34ae149 100644 --- a/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m +++ b/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m @@ -39,8 +39,8 @@ @"", // email between brackets @"\"\" ", // doubled @"\"wolfgang@inverse.ca\" ", // with and without br. - @"Àñinéoblabla ", // accented full name - @"Àñinéoblabla Bla Blé ", // accented and multiword + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword @"Wolfgang Sourdeau \"Bla Bla\" ", // partly quoted @"Wolfgang Sourdeau ", // full name + email nil }; @@ -50,8 +50,7 @@ @"\"\" ", // doubled @"\"wolfgang@inverse.ca\" ", // with and without br. @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name - @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented - // and multiword + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword /* NOTE: the following are wrong but tolerated for now */ @"Wolfgang Sourdeau \"Bla Bla\" ", // partly quoted diff --git a/Tests/Unit/TestNGMimeMessageGenerator.m b/Tests/Unit/TestNGMimeMessageGenerator.m new file mode 100644 index 000000000..f440bda97 --- /dev/null +++ b/Tests/Unit/TestNGMimeMessageGenerator.m @@ -0,0 +1,134 @@ +/* TestNGMimeMessageGenerator.m - this file is part of SOGo + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import "SOGoTest.h" +#import + +@interface TestNGMimeMessageGenerator : SOGoTest +@end + +@implementation TestNGMimeMessageGenerator + +- (void) test_generateDataForHeaderField_value +{ + NGMimeMessageGenerator *generator; + NSArray *cases = [NSArray arrayWithObjects: + [NSArray arrayWithObjects: @"Message-ID", @"", @"", nil], + [NSArray arrayWithObjects: @"Content-Type", + @"text/plain; charset=utf-8; format=flowed", + @"text/plain; charset=utf-8; format=flowed", + nil], + [NSArray arrayWithObjects: @"X-FullHeaderOneHebrewOneLatin", + @"×¢s", + @"=?utf-8?q?=D7=A2s?=", + nil], + [NSArray arrayWithObjects: @"X-FullHeaderOneLatineOneHebrew", + @"s×¢", + @"=?utf-8?q?s=D7=A2?=", + nil], + [NSArray arrayWithObjects: @"X-FullHeaderOneCharacterHebrew", + @"×¢", + @"=?utf-8?q?=D7=A2?=", + nil], + [NSArray arrayWithObjects: @"X-FullHeaderOneCharacterRussian", + @"Б", + @"=?utf-8?q?=D0=91?=", + nil], + + [NSArray arrayWithObjects: @"X-FullHeaderParameter", + @"parameter=×¢", + @"parameter==?utf-8?q?=D7=A2?=", + nil], + [NSArray arrayWithObjects: @"X-MixedHeaderParameters", + @"plain; parameter=×¢; parameter-plain; parameter2=ea", + @"plain;\n parameter==?utf-8?q?=D7=A2?=;\n parameter-plain; parameter2=ea", + nil], + [NSArray arrayWithObjects: @"X-MixedHeaderAndNoParameter", + @"plain; parameter=×¢; parameter-plain; ×¢", + @"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n =?utf-8?q?=D7=A2?=", + nil], + + [NSArray arrayWithObjects: @"X-MixedHeaderAndTwoParameter", + @"plain; parameter=×¢; parameter-plain; z=×¢", + @"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n z==?utf-8?q?=D7=A2?=", + nil], + [NSArray arrayWithObjects: @"X-MixedHeaderExtrablanks", + @"plain; parameter=×¢; parameter 2spaces; parameter2=ea", + @"plain;\n \\ parameter==?utf-8?q?=D7=A2?=;\n parameter 2spaces; parameter2=ea", + nil], + [NSArray arrayWithObjects: @"X-Encoded-Unbalanced-Paramter-Quote", + @"text/plain; name=\"×¢", + @"text/plain;\n name==?utf-8?q?=22=D7=A2?=", + nil], + [NSArray arrayWithObjects: @"content-type", + @"text/plain; name=\"ÐБВГДЕÐЖЗИЙ, КЛМÐОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"", + @"text/plain;\n name=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", + nil], + [NSArray arrayWithObjects: @"content-disposition", + @"attachment; filename=\"ÐБВГДЕÐЖЗИЙ, КЛМÐОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"", + @"attachment;\n filename=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", + nil], + [NSArray arrayWithObjects: @"content-length", @"2912", @"2912", nil], + [NSArray arrayWithObjects: @"content-transfer-encoding", @"quoted-printable", @"quoted-printable", nil], + nil + ]; + NSEnumerator *enumerator; + NSArray *testCase; + + [NGMimeMessageGenerator initialize]; + generator = [[NGMimeMessageGenerator alloc] init]; + [generator autorelease]; + + enumerator = [cases objectEnumerator]; + while ((testCase = [enumerator nextObject]) != nil) + { + NSData *result; + NSMutableData *resultWithNulByte; + NSString *header = [testCase objectAtIndex: 0]; + NSData *headerData = [testCase objectAtIndex: 1]; + NSString *expected = [testCase objectAtIndex: 2]; + result = [generator generateDataForHeaderField: header + value: headerData]; + if (result == nil) + result = [@"[nil]" dataUsingEncoding: NSUTF8StringEncoding]; + + resultWithNulByte = [result mutableCopy]; + [resultWithNulByte appendBytes: "\0" length: 1]; + NSString *resultString = [NSString stringWithCString:[resultWithNulByte bytes]]; + + + BOOL testResult = [resultString isEqualToString: expected]; + + NSString *diff = [self stringFromDiffBetween: [NSString stringWithString: resultString] + and: [NSString stringWithString: expected]]; + NSString *testErrorMsg = [NSString + stringWithFormat: @">> For %@ header received:\n%@[END]\n>> instead of:\n%@[END]\n>> for:\n%@\n>> diff:\n%@\n>> lengthReceived: %lu lengthExpected: %lu", + header, + resultString, + expected, + headerData, + diff, + [resultString length], + [expected length] + ]; + + testWithMessage(testResult, testErrorMsg); + } +} + +@end diff --git a/Tests/Unit/TestNSString+URLEscaping.m b/Tests/Unit/TestNSString+URLEscaping.m index b0a1fce12..b6116cda2 100644 --- a/Tests/Unit/TestNSString+URLEscaping.m +++ b/Tests/Unit/TestNSString+URLEscaping.m @@ -35,7 +35,7 @@ { const char *inStrings[] = { "éléphant", "2Å¡", "sogo+test", NULL }; const char **inString; - NSString *outStrings[] = { @"%C3%A9l%C3%A9phant", @"2%C5%A1", @"sogo+test" }; + NSString *outStrings[] = { @"%C3%A9l%C3%A9phant", @"2%C5%A1", @"sogo%2Btest" }; NSString **outString; NSString *result, *error; diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m index 92ddf02bb..e09dce49f 100644 --- a/Tests/Unit/TestVersit.m +++ b/Tests/Unit/TestVersit.m @@ -34,6 +34,10 @@ - (void) test_rendering { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-string-compare" + CardElement *element; CardVersitRenderer *renderer; NSString *result; @@ -137,10 +141,17 @@ testEquals(result, @"ELEM:NONEMPTY=coucou\r\n"); /** tests about parameters handling could be nice */ + +#pragma clang diagnostic pop + } - (void) test_parsing { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-string-compare" + CardGroup *group; CardElement *element; NSString *versit; @@ -201,6 +212,9 @@ element = [group firstChildWithTag: @"element"]; testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1, with comma"); + +#pragma clang diagnostic pop + } @end diff --git a/Tests/Unit/TestiCalRecurrenceCalculator.m b/Tests/Unit/TestiCalRecurrenceCalculator.m index dcd9529d9..ae1d34f3d 100644 --- a/Tests/Unit/TestiCalRecurrenceCalculator.m +++ b/Tests/Unit/TestiCalRecurrenceCalculator.m @@ -107,7 +107,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; @@ -211,7 +211,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; @@ -376,7 +376,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; diff --git a/Tests/Unit/TestiCalTimeZonePeriod.m b/Tests/Unit/TestiCalTimeZonePeriod.m index 02325e9bc..b6eb1b1b7 100644 --- a/Tests/Unit/TestiCalTimeZonePeriod.m +++ b/Tests/Unit/TestiCalTimeZonePeriod.m @@ -80,8 +80,8 @@ testWithMessage ((NSInteger) [testDate timeIntervalSince1970] == occurrenceSeconds[count], ([NSString stringWithFormat: - @"test %d: seconds do not match:" - @" delta = %d", count, delta])); + @"test %ld: seconds do not match:" + @" delta = %ld", count, delta])); } } diff --git a/Tools/SOGoEAlarmsNotifier.m b/Tools/SOGoEAlarmsNotifier.m index ad8cc8f7a..382e25675 100644 --- a/Tools/SOGoEAlarmsNotifier.m +++ b/Tools/SOGoEAlarmsNotifier.m @@ -81,8 +81,8 @@ timestamp = (int) [[NSDate date] timeIntervalSince1970]; pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; - messageID = [NSString stringWithFormat: @"<%0X-%0X-%0X-%0X@%u>", - pid, timestamp, sequence, random(), [pGUID hash]]; + messageID = [NSString stringWithFormat: @"<%0X-%0X-%0X-%0X@%lu>", + pid, timestamp, sequence, (unsigned int)random(), [pGUID hash]]; return [messageID lowercaseString]; } diff --git a/Tools/SOGoSockDOperation.m b/Tools/SOGoSockDOperation.m index c3604b865..56cae6b35 100644 --- a/Tools/SOGoSockDOperation.m +++ b/Tools/SOGoSockDOperation.m @@ -145,7 +145,7 @@ Class SOGoContactSourceFolderKlass = Nil; [self _appendEntry: [resultEntries objectAtIndex: count] toResult: result]; - [result appendFormat: @"RESULT\ncode: %", resultCode]; + [result appendFormat: @"RESULT\ncode: %d", resultCode]; [responseSocket safeWriteData: [result dataUsingEncoding: NSASCIIStringEncoding]]; } diff --git a/Tools/SOGoToolCreateFolder.m b/Tools/SOGoToolCreateFolder.m index 423ec7266..2eba46e8b 100644 --- a/Tools/SOGoToolCreateFolder.m +++ b/Tools/SOGoToolCreateFolder.m @@ -97,7 +97,7 @@ rc = [self createFolder: folder withFM: fm]; if (!rc) { - NSLog (@"Create directory failed at path %s", folder); + NSLog (@"Create directory failed at path %@", folder); return NO; } diff --git a/Tools/SOGoToolExpireUserSessions.m b/Tools/SOGoToolExpireUserSessions.m index 98d40470e..dbe78d6d9 100644 --- a/Tools/SOGoToolExpireUserSessions.m +++ b/Tools/SOGoToolExpireUserSessions.m @@ -143,7 +143,7 @@ else { if (verbose) - NSLog(@"No session to remove", sessionsToDelete); + NSLog(@"No session to remove"); } [cm releaseChannel: channel]; diff --git a/Tools/SOGoToolManageEAS.m b/Tools/SOGoToolManageEAS.m index 0e01da733..115f49eb6 100644 --- a/Tools/SOGoToolManageEAS.m +++ b/Tools/SOGoToolManageEAS.m @@ -227,7 +227,7 @@ typedef enum NSMutableString *sql; - sql = [NSMutableString stringWithFormat: @"DELETE FROM %@" @" WHERE c_path like '/%@%'", [oc tableName], deviceId]; + sql = [NSMutableString stringWithFormat: @"DELETE FROM %@ WHERE c_path like '/%@'", [oc tableName], deviceId]; [oc performBatchSQLQueries: [NSArray arrayWithObject: sql]]; rc = YES; diff --git a/Tools/SOGoToolRemove.m b/Tools/SOGoToolRemove.m index 77af43cf2..34ef10bad 100644 --- a/Tools/SOGoToolRemove.m +++ b/Tools/SOGoToolRemove.m @@ -116,13 +116,19 @@ static NSURL *tableURL = nil; - (void) _removeUserFolders: (NSString *) userId { NSArray *folderPaths; + NSString *path; int count, max; folderPaths = [self _userFolderPaths: userId]; max = [folderPaths count]; if (max > 0) for (count = 0; count < max; count++) - [fm deleteFolderAtPath: [folderPaths objectAtIndex: count]]; + { + path = [folderPaths objectAtIndex: count]; + [fm deleteFolderAtPath: path]; + if (verbose) + NSLog (@"Deleting %@", path); + } else NSLog (@"No folder returned for user '%@'", userId); } @@ -144,6 +150,8 @@ static NSURL *tableURL = nil; userId]; if ([fc evaluateExpressionX: sql]) NSLog (@"Unable to delete the preference record for '%@'", userId); + else if (verbose) + NSLog (@"Removed preference record for '%@'", userId); [cm releaseChannel: fc]; } } diff --git a/Tools/SOGoToolRemoveDoubles.m b/Tools/SOGoToolRemoveDoubles.m index c26254a6a..4d6a36115 100644 --- a/Tools/SOGoToolRemoveDoubles.m +++ b/Tools/SOGoToolRemoveDoubles.m @@ -175,7 +175,7 @@ now = [NSCalendarDate date]; delSql = [NSString stringWithFormat: @"UPDATE %@" - @" SET c_deleted = 1, c_lastmodified = %d," + @" SET c_deleted = 1, c_lastmodified = %lu," @" c_content = ''" @" WHERE c_name = '%@'", tableName, diff --git a/Tools/SOGoToolRenameUser.m b/Tools/SOGoToolRenameUser.m index 937424d76..cf260134e 100644 --- a/Tools/SOGoToolRenameUser.m +++ b/Tools/SOGoToolRenameUser.m @@ -148,7 +148,7 @@ if (sqlError) { [ac rollbackTransaction]; - NSLog([sqlError reason]); + NSLog(@"%@", [sqlError reason]); } else rc = [ac commitTransaction]; @@ -201,7 +201,7 @@ if (sqlError) { [ac rollbackTransaction]; - NSLog([sqlError reason]); + NSLog(@"%@", [sqlError reason]); } else rc = [ac commitTransaction]; diff --git a/Tools/SOGoToolRestore.m b/Tools/SOGoToolRestore.m index 712c680ba..5f1527cc8 100644 --- a/Tools/SOGoToolRestore.m +++ b/Tools/SOGoToolRestore.m @@ -574,6 +574,7 @@ NSLog (@" %@ (%@)", folderKey, [currentFolder objectForKey: @"displayname"]); } + rc = YES; } else { diff --git a/Tools/SOGoToolUserPreferences.m b/Tools/SOGoToolUserPreferences.m index 4f981cb4f..8d144fcb7 100644 --- a/Tools/SOGoToolUserPreferences.m +++ b/Tools/SOGoToolUserPreferences.m @@ -115,7 +115,7 @@ typedef enum [theKey caseInsensitiveCompare: @"Vacation"] == NSOrderedSame) { /* credentials file handling */ - NSString *credsFilename, *authname, *authpwd; + NSString *credsFilename=nil, *authname=nil, *authpwd=nil; SOGoCredentialsFile *cf; credsFilename = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"]; diff --git a/Tools/sogo-tool.m b/Tools/sogo-tool.m index bc4755416..85c87d528 100644 --- a/Tools/sogo-tool.m +++ b/Tools/sogo-tool.m @@ -149,7 +149,7 @@ command, [currentTool objectAtIndex: 1]]; } - NSLog (helpString); + NSLog (@"%@", helpString); } - (void) registerTools diff --git a/UI/AdministrationUI/English.lproj/Localizable.strings b/UI/AdministrationUI/English.lproj/Localizable.strings index d0d37f15b..bcc006c50 100644 --- a/UI/AdministrationUI/English.lproj/Localizable.strings +++ b/UI/AdministrationUI/English.lproj/Localizable.strings @@ -15,3 +15,12 @@ "ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; "Name or Email" = "Name or Email"; + +/* Rights module: initial search message */ +"Start a search to edit the rights" = "Start a search to edit the rights"; + +/* Rights module: Empty search result */ +"No matching user" = "No matching user"; + +/* Rights module: no selection */ +"No resource selected" = "No resource selected"; diff --git a/UI/AdministrationUI/GNUmakefile b/UI/AdministrationUI/GNUmakefile index 450973525..1034a8b17 100644 --- a/UI/AdministrationUI/GNUmakefile +++ b/UI/AdministrationUI/GNUmakefile @@ -12,6 +12,7 @@ AdministrationUI_OBJC_FILES = \ AdministrationUIProduct.m \ \ UIxAdministration.m \ + UIxAdministrationAclEditor.m \ UIxAdministrationFilterPanel.m AdministrationUI_RESOURCE_FILES += \ diff --git a/UI/AdministrationUI/UIxAdministration.m b/UI/AdministrationUI/UIxAdministration.m index e1fa48499..ba396a882 100644 --- a/UI/AdministrationUI/UIxAdministration.m +++ b/UI/AdministrationUI/UIxAdministration.m @@ -46,6 +46,11 @@ [super dealloc]; } +- (NSString *) modulePath +{ + return @"Administration"; +} + - (BOOL) shouldTakeValuesFromRequest: (WORequest *) request inContext: (WOContext*) context { diff --git a/UI/AdministrationUI/UIxAdministrationAclEditor.h b/UI/AdministrationUI/UIxAdministrationAclEditor.h new file mode 100644 index 000000000..08d24d431 --- /dev/null +++ b/UI/AdministrationUI/UIxAdministrationAclEditor.h @@ -0,0 +1,48 @@ +/* UIxAdministrationAclEditor.h - this file is part of SOGo + * + * Copyright (C) 2006-2014 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef UIXACLEDITOR_H +#define UIXACLEDITOR_H + +#import + +@interface UIxAdministrationAclEditor : UIxComponent +{ + BOOL prepared; + BOOL publishInFreeBusy; + NSArray *aclUsers; + NSArray *savedUIDs; + NSMutableDictionary *users; + NSString *currentUser; + NSString *defaultUserID; +} + +- (NSArray *) aclsForObject; +- (void) setCurrentUser: (NSString *) newCurrentUser; +- (NSString *) currentUser; +- (NSString *) currentUserClass; +- (NSDictionary *) currentUserInfos; +- (NSString *) currentUserDisplayName; +- (BOOL) currentUserIsSubscribed; +- (BOOL) isPublicAccessEnabled; + +@end + +#endif /* UIXACLEDITOR_H */ diff --git a/UI/AdministrationUI/UIxAdministrationAclEditor.m b/UI/AdministrationUI/UIxAdministrationAclEditor.m new file mode 100644 index 000000000..9370aa34a --- /dev/null +++ b/UI/AdministrationUI/UIxAdministrationAclEditor.m @@ -0,0 +1,279 @@ +/* UIxAdministrationAclEditor.m - this file is part of SOGo + * + * Copyright (C) 2006-2015 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import +#import +#import +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#import "UIxAdministrationAclEditor.h" + +@implementation UIxAdministrationAclEditor + +- (id) init +{ + if ((self = [super init])) + { + aclUsers = nil; + prepared = NO; + publishInFreeBusy = NO; + users = [NSMutableDictionary new]; + currentUser = nil; + defaultUserID = nil; + savedUIDs = nil; + } + + return self; +} + +- (void) dealloc +{ + [savedUIDs release]; + [users release]; + [currentUser release]; + [defaultUserID release]; + [super dealloc]; +} + +- (NSArray *) aclsForObject +{ + if (!aclUsers) + aclUsers = [[self clientObject] aclUsers]; + + return aclUsers; +} + +- (NSString *) defaultUserID +{ + if (!defaultUserID) + ASSIGN (defaultUserID, [[self clientObject] defaultUserID]); + + return defaultUserID; +} + +- (BOOL) canSubscribeUsers +{ + return [[self clientObject] + respondsToSelector: @selector (subscribeUserOrGroup:reallyDo:response:)]; +} + +/** + * @api {get} /so/:username/:folderPath/acls List users with rights + * @apiVersion 1.0.0 + * @apiName GetAcls + * @apiGroup Common + * @apiExample {curl} Example usage: + * curl -i http://localhost/SOGo/so/sogo1/Calendar/personal/acls + * + * @apiSuccess (Success 200) {Object[]} users List of users with ACL for the folder + * @apiSuccess (Success 200) {String} users.uid User ID + * @apiSuccess (Success 200) {String} users.userClass Either 'normal-user', 'normal-group' or 'public-access' + * @apiSuccess (Success 200) {Number} users.isSubscribed 1 if the user is subscribed to the folder + * @apiSuccess (Success 200) {String} [users.cn] User fullname + * @apiSuccess (Success 200) {String} [users.c_email] User main email address + */ +- (id ) aclsAction +{ + NSString *currentUID, *ownerLogin, *info; + NSDictionary *currentUserInfos; + NSMutableDictionary *userData; + id result; + NSEnumerator *aclsEnum; + + if (!prepared) + { + ownerLogin = [[self clientObject] ownerInContext: context]; + if (!defaultUserID) + ASSIGN (defaultUserID, [[self clientObject] defaultUserID]); + + aclsEnum = [[self aclsForObject] objectEnumerator]; + while ((currentUID = [aclsEnum nextObject])) + { + if (!([currentUID isEqualToString: ownerLogin] + || [currentUID isEqualToString: defaultUserID] + || [currentUID isEqualToString: @"anonymous"])) + { + // Set the current user in order to get information associated with it + [self setCurrentUser: currentUID]; + + // Build the object associated to the current UID + currentUserInfos = [self currentUserInfos]; + userData = [NSMutableDictionary dictionaryWithObjectsAndKeys: + currentUser, @"uid", + [self currentUserClass], @"userClass", + [NSNumber numberWithBool: [self currentUserIsSubscribed]], @"isSubscribed", + nil]; + if ((info = [currentUserInfos objectForKey: @"cn"]) && [info length]) + [userData setObject: info forKey: @"cn"]; + if ((info = [currentUserInfos objectForKey: @"c_email"]) && [info length]) + [userData setObject: info forKey: @"c_email"]; + [users setObject: userData forKey: currentUID]; + } + } + + // Add the 'Any authenticated' user + if ([self canSubscribeUsers]) + { + userData = [NSDictionary dictionaryWithObjectsAndKeys: + @"", @"uid", + [self labelForKey: @"Any Authenticated User"], @"cn", + @"public-user", @"userClass", + nil]; + [users setObject: userData forKey: @""]; + } + + if ([self canSubscribeUsers] && [self isPublicAccessEnabled]) + { + // Add the 'public access' user + userData = [NSDictionary dictionaryWithObjectsAndKeys: + @"anonymous", @"uid", + [self labelForKey: @"Public Access"], @"cn", + @"public-user", @"userClass", + nil]; + [users setObject: userData forKey: @"anonymous"]; + } + + prepared = YES; + } + + result = [self responseWithStatus: 200 + andJSONRepresentation: [NSDictionary dictionaryWithObject: users forKey: @"users"]]; + + return result; +} + +- (void) setCurrentUser: (NSString *) newCurrentUser +{ + ASSIGN (currentUser, newCurrentUser); +} + +- (NSString *) currentUser +{ + return ([currentUser hasPrefix: @"@"] + ? [currentUser substringFromIndex: 1] + : currentUser); +} + +- (NSString *) currentUserClass +{ + return ([currentUser hasPrefix: @"@"] + ? @"normal-group" + : @"normal-user"); +} + +- (NSString *) currentUserDisplayName +{ + NSDictionary *infos; + NSString *uid; + SOGoUserManager *um; + + um = [SOGoUserManager sharedUserManager]; + uid = [self currentUser]; + infos = [um contactInfosForUserWithUIDorEmail: uid inDomain: [[context activeUser] domain]]; + if (infos) + { + return [NSString stringWithFormat: @"%@ <%@>", + [infos objectForKey: @"cn"], + [infos objectForKey: @"c_email"]]; + } + else + return uid; +} + +- (NSDictionary *) currentUserInfos +{ + SOGoUserManager *um; + + um = [SOGoUserManager sharedUserManager]; + + return [um contactInfosForUserWithUIDorEmail: [self currentUser]]; +} + +- (BOOL) currentUserIsSubscribed +{ + SOGoGCSFolder *folder; + + folder = [self clientObject]; + + return ([folder respondsToSelector: @selector (userIsSubscriber:)] + && [folder userIsSubscriber: currentUser]); +} + +- (void) setUserUIDS: (NSString *) retainedUsers +{ + if ([retainedUsers length] > 0) + { + savedUIDs = [retainedUsers componentsSeparatedByString: @","]; + [savedUIDs retain]; + } + else + savedUIDs = [NSArray new]; +} + +- (NSString *) folderID +{ + return [[self clientObject] nameInContainer]; +} + +- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request + inContext: (WOContext *) context +{ + return ([[request method] isEqualToString: @"POST"]); +} + +- (id ) saveAclsAction +{ + NSEnumerator *aclsEnum; + SOGoObject *clientObject; + NSString *currentUID, *ownerLogin; + + clientObject = [self clientObject]; + ownerLogin = [clientObject ownerInContext: context]; + aclsEnum = [[self aclsForObject] objectEnumerator]; + while ((currentUID = [[aclsEnum nextObject] objectForKey: @"c_uid"])) + if ([currentUID isEqualToString: ownerLogin] + || [savedUIDs containsObject: currentUID]) + [users removeObjectForKey: currentUID]; + [clientObject removeAclsForUsers: [users allKeys]]; + + return [self jsCloseWithRefreshMethod: nil]; +} + +- (BOOL) isPublicAccessEnabled +{ + return [[SOGoSystemDefaults sharedSystemDefaults] enablePublicAccess]; +} + +@end diff --git a/UI/AdministrationUI/product.plist b/UI/AdministrationUI/product.plist index bfb7ae21c..28dd5ed15 100644 --- a/UI/AdministrationUI/product.plist +++ b/UI/AdministrationUI/product.plist @@ -15,6 +15,10 @@ protectedBy = "View"; pageName = "UIxAdministration"; }; + UIxAdministrationAclEditor = { + protectedBy = "View"; + pageName = "UIxAdministrationAclEditor"; + }; }; }; }; diff --git a/UI/Common/UIxPageFrame.m b/UI/Common/UIxPageFrame.m index 1867b88c6..0f8a8cb0c 100644 --- a/UI/Common/UIxPageFrame.m +++ b/UI/Common/UIxPageFrame.m @@ -249,14 +249,7 @@ - (NSString *) commonLocalizableStrings { - NSString *rc; - - if (isPopup) - rc = @""; - else - rc = [NSString stringWithFormat: @"var clabels = %@;", [self _stringsForFramework: nil]]; - - return rc; + return [NSString stringWithFormat: @"var clabels = %@;", [self _stringsForFramework: nil]]; } - (NSString *) productLocalizableStrings diff --git a/UI/Common/UIxToolbar.m b/UI/Common/UIxToolbar.m index b5b925e17..e3ce52a20 100644 --- a/UI/Common/UIxToolbar.m +++ b/UI/Common/UIxToolbar.m @@ -167,7 +167,7 @@ [self errorWithFormat: @"not toolbar configuration found on SoObject: %@ (%@)", [self clientObject], [[self clientObject] soClass]]; - toolbarConfig = [[NSNull null] retain]; + toolbarConfig = (NSArray *)[[NSNull null] retain]; return nil; } diff --git a/UI/Common/WODirectAction+SOGo.m b/UI/Common/WODirectAction+SOGo.m index 9b9675d3a..12dc4d019 100644 --- a/UI/Common/WODirectAction+SOGo.m +++ b/UI/Common/WODirectAction+SOGo.m @@ -20,6 +20,7 @@ #import #import +#import #import #import @@ -31,6 +32,8 @@ #import #import +#import + #import "WODirectAction+SOGo.h" static SoProduct *commonProduct = nil; diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index 4d1b431e7..39a90387d 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -44,6 +44,27 @@ "Copy To" = "Copy To"; "Add to:" = "Add to:"; +/* Subheader of empty addressbook */ +"No contact" = "No contact"; + +/* Subheader of system addressbook */ +"Start a search to browse this address book" = "Start a search to browse this address book"; + +/* Number of contacts in addressbook; string is prefixed by number */ +"contacts" = "contacts"; + +/* No contact matching search criteria */ +"No matching contact" = "No matching contact"; + +/* Number of contacts matching search criteria; string is prefixed by number */ +"matching contacts" = "matching contacts"; + +/* Number of selected contacts in list */ +"selected" = "selected"; + +/* Empty right pane */ +"No contact selected" = "No contact selected"; + /* Tooltips */ "Create a new address book card" = "Create a new address book card"; diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index 1a378c4f1..9e72fff80 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -23,7 +23,8 @@ ContactsUI_OBJC_FILES = \ UIxContactsListActions.m \ UIxContactFoldersView.m \ UIxContactFolderActions.m \ - UIxContactFolderLinksTemplate.m + UIxContactFolderLinksTemplate.m \ + UIxContactFolderProperties.m ContactsUI_RESOURCE_FILES += \ product.plist \ diff --git a/UI/Contacts/UIxContactActions.m b/UI/Contacts/UIxContactActions.m index b1d9e1269..9706e402c 100644 --- a/UI/Contacts/UIxContactActions.m +++ b/UI/Contacts/UIxContactActions.m @@ -141,7 +141,7 @@ content = [NSMutableString string]; response = [context response]; - [content appendFormat: [[self clientObject] contentAsString]]; + [content appendFormat: @"%@", [[self clientObject] contentAsString]]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: content]; diff --git a/UI/Contacts/UIxContactEditor.m b/UI/Contacts/UIxContactEditor.m index 72f702ff8..e01d6ca39 100644 --- a/UI/Contacts/UIxContactEditor.m +++ b/UI/Contacts/UIxContactEditor.m @@ -349,7 +349,7 @@ static Class SOGoContactGCSEntryK = Nil; NSMutableArray *units, *categories; NSCalendarDate *date; id o; - unsigned int i, year, month, day; + unsigned int i, year, month, day, seconds; [card setNWithFamily: [attributes objectForKey: @"c_sn"] given: [attributes objectForKey: @"c_givenname"] @@ -357,8 +357,14 @@ static Class SOGoContactGCSEntryK = Nil; [card setNickname: [attributes objectForKey: @"nickname"]]; [card setFn: [attributes objectForKey: @"c_cn"]]; [card setTitle: [attributes objectForKey: @"title"]]; + [card setRole: [attributes objectForKey: @"role"]]; - unsigned int seconds = [[NSString stringWithFormat: @"%@", [attributes objectForKey: @"birthday"]] intValue]; + if ([attributes objectForKey: @"c_screenname"]) + [[card uniqueChildWithTag: @"x-aim"] + setSingleValue: [attributes objectForKey: @"c_screenname"] + forKey: @""]; + + seconds = [[NSString stringWithFormat: @"%@", [attributes objectForKey: @"birthday"]] intValue]; if (seconds > 0) { date = [NSCalendarDate dateWithTimeIntervalSince1970: seconds]; @@ -519,6 +525,7 @@ static Class SOGoContactGCSEntryK = Nil; * @apiParam {String} nickname Nickname * @apiParam {String} c_sn Lastname * @apiParam {String} c_cn Fullname + * @apiParam {String} c_screenname Screen Name (X-AIM for now) * @apiParam {String} tz Timezone * @apiParam {String} note Note * @apiParam {String[]} allCategories All available categories diff --git a/UI/Contacts/UIxContactFolderActions.m b/UI/Contacts/UIxContactFolderActions.m index 017bd0049..770312d45 100644 --- a/UI/Contacts/UIxContactFolderActions.m +++ b/UI/Contacts/UIxContactFolderActions.m @@ -28,10 +28,14 @@ #import #import #import +#define COMPILING_NGOBJWEB 1 /* we want httpRequest for parsing multi-part + form data */ #import +#undef COMPILING_NGOBJWEB #import #import #import +#import #import #import @@ -81,9 +85,9 @@ inContext: [self context] acquire: NO]; if ([currentChild respondsToSelector: @selector (vCard)]) - [content appendFormat: [[currentChild ldifRecord] ldifRecordAsString]]; + [content appendFormat: @"%@", [[currentChild ldifRecord] ldifRecordAsString]]; else if ([currentChild respondsToSelector: @selector (vList)]) - [content appendFormat: [[currentChild vList] ldifString]]; + [content appendFormat: @"%@", [[currentChild vList] ldifString]]; [content appendString: @"\n"]; } diff --git a/UI/Contacts/UIxContactFolderProperties.h b/UI/Contacts/UIxContactFolderProperties.h new file mode 100644 index 000000000..882c77cde --- /dev/null +++ b/UI/Contacts/UIxContactFolderProperties.h @@ -0,0 +1,32 @@ +/* UIxContactFolderProperties.m - this file is part of SOGo + * + * Copyright (C) 2015 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import + +@class NSString; + +@class SOGoContactGCSFolder; + +@interface UIxContactFolderProperties : UIxComponent +{ + SOGoContactGCSFolder *addressbook; +} + +@end diff --git a/UI/Contacts/UIxContactFolderProperties.m b/UI/Contacts/UIxContactFolderProperties.m new file mode 100644 index 000000000..102446485 --- /dev/null +++ b/UI/Contacts/UIxContactFolderProperties.m @@ -0,0 +1,84 @@ +/* UIxContactFolderProperties.m - this file is part of SOGo + * + * Copyright (C) 2015 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import +#import +#import + +#import + +#import +#import +#import +#import + +#import + +#import "UIxContactFolderProperties.h" + +@implementation UIxContactFolderProperties + +- (id) init +{ + if ((self = [super init])) + { + addressbook = [self clientObject]; + } + + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +/** + * @api {post} /so/:username/Contacts/:addressbookId/save Save addressbook + * @apiDescription Save an addressbook's properties. + * @apiVersion 1.0.0 + * @apiName PostSaveProperties + * @apiGroup AddressBook + * + * @apiParam {String} name Human readable name + * @apiParam {Number} synchronize 1 if we enable EAS synchronization for this addressbook + */ +- (WOResponse *) savePropertiesAction +{ + WORequest *request; + NSDictionary *params; + id o, values; + + request = [context request]; + params = [[request contentAsString] objectFromJSONString]; + + o = [params objectForKey: @"name"]; + if ([o isKindOfClass: [NSString class]]) + [addressbook renameTo: o]; + + o = [params objectForKey: @"synchronize"]; + if ([o isKindOfClass: [NSNumber class]]) + [addressbook setSynchronize: [o boolValue]]; + + return [self responseWith204]; +} + +@end diff --git a/UI/Contacts/UIxContactFoldersView.m b/UI/Contacts/UIxContactFoldersView.m index e6b929bf5..111af01b6 100644 --- a/UI/Contacts/UIxContactFoldersView.m +++ b/UI/Contacts/UIxContactFoldersView.m @@ -71,6 +71,11 @@ Class SOGoContactSourceFolderK, SOGoGCSFolderK; return self; } +- (NSString *) modulePath +{ + return @"Contacts"; +} + - (void) _setupContext { SOGoUser *activeUser; @@ -291,7 +296,7 @@ Class SOGoContactSourceFolderK, SOGoGCSFolderK; NSDictionary *folderAttrs; id currentFolder; - BOOL objectCreator, objectEditor, objectEraser; + BOOL objectCreator, objectEditor, objectEraser, synchronize; int max, i; userLogin = [[context activeUser] login]; @@ -328,11 +333,20 @@ Class SOGoContactSourceFolderK, SOGoGCSFolderK; [NSNumber numberWithBool: objectEditor], @"objectEditor", [NSNumber numberWithBool: objectEraser], @"objectEraser", nil]; + if ([currentFolder isKindOfClass: SOGoGCSFolderK]) + synchronize = [currentFolder synchronize]; + else + synchronize = NO; + + if ([[currentFolder nameInContainer] isEqualToString: @"personal"]) + synchronize = YES; + // NOTE: keep urls as the last key/value here, to avoid chopping the dictionary // if it is not a GCS folder folderAttrs = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"%@", [currentFolder nameInContainer]], @"id", [currentFolder displayName], @"name", + [NSNumber numberWithBool: synchronize], @"synchronize", owner, @"owner", [NSNumber numberWithBool: [currentFolder isKindOfClass: SOGoGCSFolderK]], @"isEditable", [NSNumber numberWithBool: [currentFolder isKindOfClass: SOGoContactSourceFolderK] diff --git a/UI/Contacts/UIxContactView.h b/UI/Contacts/UIxContactView.h index d5a9732c5..abffaa1ed 100644 --- a/UI/Contacts/UIxContactView.h +++ b/UI/Contacts/UIxContactView.h @@ -1,18 +1,18 @@ /* - Copyright (C) 2004 SKYRIX Software AG + Copyright (C) 2005-2015 Inverse inc. - This file is part of OpenGroupware.org. - - OGo is free software; you can redistribute it and/or modify it under + This file is part of SOGo. + + SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - - OGo is distributed in the hope that it will be useful, but WITHOUT ANY + + SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA @@ -35,7 +35,7 @@ NSMutableArray *photosURL; } -- (NSString *) fullName; +//- (NSString *) fullName; - (NSArray *) orgUnits; - (NSString *) photoURL; diff --git a/UI/Contacts/UIxContactView.m b/UI/Contacts/UIxContactView.m index eb77e7ded..ac61300c3 100644 --- a/UI/Contacts/UIxContactView.m +++ b/UI/Contacts/UIxContactView.m @@ -1,5 +1,4 @@ /* - Copyright (C) 2004 SKYRIX Software AG Copyright (C) 2005-2015 Inverse inc. This file is part of SOGo. @@ -69,70 +68,70 @@ /* accessors */ -- (NSString *) _cardStringWithLabel: (NSString *) label - value: (NSString *) value - byEscapingHTMLString: (BOOL) escapeHTML - asLinkScheme: (NSString *) scheme - withLinkAttributes: (NSString *) attrs -{ - NSMutableString *cardString; +// - (NSString *) _cardStringWithLabel: (NSString *) label +// value: (NSString *) value +// byEscapingHTMLString: (BOOL) escapeHTML +// asLinkScheme: (NSString *) scheme +// withLinkAttributes: (NSString *) attrs +// { +// NSMutableString *cardString; - cardString = [NSMutableString stringWithCapacity: 80]; - value = [value stringByReplacingString: @"\r" withString: @""]; - if ([value length] > 0) - { - if (escapeHTML) - value = [value stringByEscapingHTMLString]; - if ([scheme length] > 0) - value = [NSString stringWithFormat: @"%@", scheme, value, attrs, value]; +// cardString = [NSMutableString stringWithCapacity: 80]; +// value = [value stringByReplacingString: @"\r" withString: @""]; +// if ([value length] > 0) +// { +// if (escapeHTML) +// value = [value stringByEscapingHTMLString]; +// if ([scheme length] > 0) +// value = [NSString stringWithFormat: @"%@", scheme, value, attrs, value]; - if (label) - [cardString appendFormat: @"
%@
%@
\n", - [self labelForKey: label], value]; - else - [cardString appendFormat: @"
%@
\n", value]; - } +// if (label) +// [cardString appendFormat: @"
%@
%@
\n", +// [self labelForKey: label], value]; +// else +// [cardString appendFormat: @"
%@
\n", value]; +// } - return cardString; -} +// return cardString; +// } -- (NSString *) _cardStringWithLabel: (NSString *) label - value: (NSString *) value -{ - return [self _cardStringWithLabel: label - value: value - byEscapingHTMLString: YES - asLinkScheme: nil - withLinkAttributes: nil]; -} +// - (NSString *) _cardStringWithLabel: (NSString *) label +// value: (NSString *) value +// { +// return [self _cardStringWithLabel: label +// value: value +// byEscapingHTMLString: YES +// asLinkScheme: nil +// withLinkAttributes: nil]; +// } -- (NSString *) _cardStringWithLabel: (NSString *) label - value: (NSString *) value - asLinkScheme: (NSString *) scheme -{ - return [self _cardStringWithLabel: label - value: value - byEscapingHTMLString: YES - asLinkScheme: scheme - withLinkAttributes: nil]; -} +// - (NSString *) _cardStringWithLabel: (NSString *) label +// value: (NSString *) value +// asLinkScheme: (NSString *) scheme +// { +// return [self _cardStringWithLabel: label +// value: value +// byEscapingHTMLString: YES +// asLinkScheme: scheme +// withLinkAttributes: nil]; +// } -- (NSString *) displayName -{ - return [self _cardStringWithLabel: @"Display Name:" - value: [card fn]]; -} +// - (NSString *) displayName +// { +// return [self _cardStringWithLabel: @"Display Name:" +// value: [card fn]]; +// } -- (NSString *) nickName -{ - return [self _cardStringWithLabel: @"Nickname:" - value: [card nickname]]; -} +// - (NSString *) nickName +// { +// return [self _cardStringWithLabel: @"Nickname:" +// value: [card nickname]]; +// } -- (NSString *) fullName -{ - return [card fullName]; -} +// - (NSString *) fullName +// { +// return [card fullName]; +// } - (NSArray *) _languageContactsCategories { @@ -173,345 +172,345 @@ return cats; } -- (NSString *) primaryEmail -{ - NSString *email, *fn, *attrs; +// - (NSString *) primaryEmail +// { +// NSString *email, *fn, *attrs; - email = [card preferredEMail]; - if ([email length] > 0) - { - fn = [card fn]; - if ([fn length] > 0) - attrs = [NSString stringWithFormat: @"%@ <%@>", fn, email]; - else - attrs = email; - attrs = [attrs stringByReplacingString: @"'" withString: @"\\'"]; - attrs = [attrs stringByReplacingString: @"\"" withString: @"\\\""]; - attrs = [NSString stringWithFormat: @"onclick=\"return openMailTo('%@');\"", attrs]; - } - else - { - attrs = nil; - } +// email = [card preferredEMail]; +// if ([email length] > 0) +// { +// fn = [card fn]; +// if ([fn length] > 0) +// attrs = [NSString stringWithFormat: @"%@ <%@>", fn, email]; +// else +// attrs = email; +// attrs = [attrs stringByReplacingString: @"'" withString: @"\\'"]; +// attrs = [attrs stringByReplacingString: @"\"" withString: @"\\\""]; +// attrs = [NSString stringWithFormat: @"onclick=\"return openMailTo('%@');\"", attrs]; +// } +// else +// { +// attrs = nil; +// } - return [self _cardStringWithLabel: @"Email:" - value: email - byEscapingHTMLString: YES - asLinkScheme: @"mailto:" - withLinkAttributes: attrs]; -} +// return [self _cardStringWithLabel: @"Email:" +// value: email +// byEscapingHTMLString: YES +// asLinkScheme: @"mailto:" +// withLinkAttributes: attrs]; +// } -- (NSArray *) secondaryEmails -{ - NSMutableArray *secondaryEmails; - NSString *email, *fn, *attrs; - NSArray *emails; +// - (NSArray *) secondaryEmails +// { +// NSMutableArray *secondaryEmails; +// NSString *email, *fn, *attrs; +// NSArray *emails; - emails = [card secondaryEmails]; - secondaryEmails = [NSMutableArray array]; - attrs = nil; +// emails = [card secondaryEmails]; +// secondaryEmails = [NSMutableArray array]; +// attrs = nil; - // We might not have a preferred item but rather something like this: - // EMAIL;TYPE=work:dd@ee.com - // EMAIL;TYPE=home:ff@gg.com - // - // or: - // - // EMAIL;TYPE=INTERNET:a@a.com - // EMAIL;TYPE=INTERNET,HOME:b@b.com - // - // In this case, we always return the entry NOT matching the primaryEmail - if ([emails count] > 0) - { - int i; +// // We might not have a preferred item but rather something like this: +// // EMAIL;TYPE=work:dd@ee.com +// // EMAIL;TYPE=home:ff@gg.com +// // +// // or: +// // +// // EMAIL;TYPE=INTERNET:a@a.com +// // EMAIL;TYPE=INTERNET,HOME:b@b.com +// // +// // In this case, we always return the entry NOT matching the primaryEmail +// if ([emails count] > 0) +// { +// int i; - for (i = 0; i < [emails count]; i++) - { - email = [[emails objectAtIndex: i] flattenedValuesForKey: @""]; - if ([email length]) - { - fn = [card fn]; - if ([fn length]) - attrs = [NSString stringWithFormat: @"%@ <%@>", fn, email]; - else - attrs = email; - attrs = [attrs stringByReplacingString: @"'" withString: @"\\'"]; - attrs = [attrs stringByReplacingString: @"\"" withString: @"\\\""]; - attrs = [NSString stringWithFormat: @"onclick=\"return openMailTo('%@');\"", attrs]; +// for (i = 0; i < [emails count]; i++) +// { +// email = [[emails objectAtIndex: i] flattenedValuesForKey: @""]; +// if ([email length]) +// { +// fn = [card fn]; +// if ([fn length]) +// attrs = [NSString stringWithFormat: @"%@ <%@>", fn, email]; +// else +// attrs = email; +// attrs = [attrs stringByReplacingString: @"'" withString: @"\\'"]; +// attrs = [attrs stringByReplacingString: @"\"" withString: @"\\\""]; +// attrs = [NSString stringWithFormat: @"onclick=\"return openMailTo('%@');\"", attrs]; - [secondaryEmails addObject: [self _cardStringWithLabel: nil - value: email - byEscapingHTMLString: YES - asLinkScheme: @"mailto:" - withLinkAttributes: attrs]]; - } - } - } - else - { - [secondaryEmails addObject: [self _cardStringWithLabel: nil - value: nil]]; - } +// [secondaryEmails addObject: [self _cardStringWithLabel: nil +// value: email +// byEscapingHTMLString: YES +// asLinkScheme: @"mailto:" +// withLinkAttributes: attrs]]; +// } +// } +// } +// else +// { +// [secondaryEmails addObject: [self _cardStringWithLabel: nil +// value: nil]]; +// } - return secondaryEmails; -} +// return secondaryEmails; +// } -- (NSString *) screenName -{ - NSString *screenName; +// - (NSString *) screenName +// { +// NSString *screenName; - screenName = [[card uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]; +// screenName = [[card uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]; - return [self _cardStringWithLabel: @"Screen Name:" - value: screenName - asLinkScheme: @"aim:goim?screenname="]; -} +// return [self _cardStringWithLabel: @"Screen Name:" +// value: screenName +// asLinkScheme: @"aim:goim?screenname="]; +// } -- (NSString *) preferredTel -{ - return [self _cardStringWithLabel: @"Phone Number:" - value: [card preferredTel] asLinkScheme: @"tel:"]; -} +// - (NSString *) preferredTel +// { +// return [self _cardStringWithLabel: @"Phone Number:" +// value: [card preferredTel] asLinkScheme: @"tel:"]; +// } -- (NSString *) preferredAddress -{ - return @""; -} +// - (NSString *) preferredAddress +// { +// return @""; +// } -- (BOOL) hasTelephones -{ - if (!phones) - phones = [card childrenWithTag: @"tel"]; +// - (BOOL) hasTelephones +// { +// if (!phones) +// phones = [card childrenWithTag: @"tel"]; - return ([phones count] > 0); -} +// return ([phones count] > 0); +// } -- (NSString *) workPhone -{ - // We do this (exclude FAX) in order to avoid setting the WORK number as the FAX - // one if we do see the FAX field BEFORE the WORK number. - return [self _cardStringWithLabel: @"Work:" value: [card workPhone] asLinkScheme: @"tel:"]; -} +// - (NSString *) workPhone +// { +// // We do this (exclude FAX) in order to avoid setting the WORK number as the FAX +// // one if we do see the FAX field BEFORE the WORK number. +// return [self _cardStringWithLabel: @"Work:" value: [card workPhone] asLinkScheme: @"tel:"]; +// } -- (NSString *) homePhone -{ - return [self _cardStringWithLabel: @"Home:" value: [card homePhone] asLinkScheme: @"tel:"]; -} +// - (NSString *) homePhone +// { +// return [self _cardStringWithLabel: @"Home:" value: [card homePhone] asLinkScheme: @"tel:"]; +// } -- (NSString *) fax -{ - return [self _cardStringWithLabel: @"Fax:" value: [card fax] asLinkScheme: @"tel:"]; -} +// - (NSString *) fax +// { +// return [self _cardStringWithLabel: @"Fax:" value: [card fax] asLinkScheme: @"tel:"]; +// } -- (NSString *) mobile -{ - return [self _cardStringWithLabel: @"Mobile:" value: [card mobile] asLinkScheme: @"tel:"]; -} +// - (NSString *) mobile +// { +// return [self _cardStringWithLabel: @"Mobile:" value: [card mobile] asLinkScheme: @"tel:"]; +// } -- (NSString *) pager -{ - return [self _cardStringWithLabel: @"Pager:" value: [card pager] asLinkScheme: @"tel:"]; -} +// - (NSString *) pager +// { +// return [self _cardStringWithLabel: @"Pager:" value: [card pager] asLinkScheme: @"tel:"]; +// } -- (BOOL) hasHomeInfos -{ - BOOL result; - NSArray *elements; +// - (BOOL) hasHomeInfos +// { +// BOOL result; +// NSArray *elements; - elements = [card childrenWithTag: @"adr" - andAttribute: @"type" - havingValue: @"home"]; - if ([elements count] > 0) - { - result = YES; - homeAdr = [elements objectAtIndex: 0]; - } - else - result = ([[card childrenWithTag: @"url" - andAttribute: @"type" - havingValue: @"home"] count] > 0); +// elements = [card childrenWithTag: @"adr" +// andAttribute: @"type" +// havingValue: @"home"]; +// if ([elements count] > 0) +// { +// result = YES; +// homeAdr = [elements objectAtIndex: 0]; +// } +// else +// result = ([[card childrenWithTag: @"url" +// andAttribute: @"type" +// havingValue: @"home"] count] > 0); - return result; -} +// return result; +// } -- (NSString *) homePobox -{ - return [self _cardStringWithLabel: nil - value: [homeAdr flattenedValueAtIndex: 0 - forKey: @""]]; -} +// - (NSString *) homePobox +// { +// return [self _cardStringWithLabel: nil +// value: [homeAdr flattenedValueAtIndex: 0 +// forKey: @""]]; +// } -- (NSString *) homeExtendedAddress -{ - return [self _cardStringWithLabel: nil - value: [homeAdr flattenedValueAtIndex: 1 - forKey: @""]]; -} +// - (NSString *) homeExtendedAddress +// { +// return [self _cardStringWithLabel: nil +// value: [homeAdr flattenedValueAtIndex: 1 +// forKey: @""]]; +// } -- (NSString *) homeStreetAddress -{ - return [self _cardStringWithLabel: nil - value: [homeAdr flattenedValueAtIndex: 2 - forKey: @""]]; -} +// - (NSString *) homeStreetAddress +// { +// return [self _cardStringWithLabel: nil +// value: [homeAdr flattenedValueAtIndex: 2 +// forKey: @""]]; +// } -- (NSString *) homeCityAndProv -{ - NSString *city, *prov; - NSMutableString *data; +// - (NSString *) homeCityAndProv +// { +// NSString *city, *prov; +// NSMutableString *data; - city = [homeAdr flattenedValueAtIndex: 3 forKey: @""]; - prov = [homeAdr flattenedValueAtIndex: 4 forKey: @""]; +// city = [homeAdr flattenedValueAtIndex: 3 forKey: @""]; +// prov = [homeAdr flattenedValueAtIndex: 4 forKey: @""]; - data = [NSMutableString string]; - [data appendString: city]; - if ([city length] > 0 && [prov length] > 0) - [data appendString: @", "]; - [data appendString: prov]; +// data = [NSMutableString string]; +// [data appendString: city]; +// if ([city length] > 0 && [prov length] > 0) +// [data appendString: @", "]; +// [data appendString: prov]; - return [self _cardStringWithLabel: nil value: data]; -} +// return [self _cardStringWithLabel: nil value: data]; +// } -- (NSString *) homePostalCodeAndCountry -{ - NSString *postalCode, *country; - NSMutableString *data; +// - (NSString *) homePostalCodeAndCountry +// { +// NSString *postalCode, *country; +// NSMutableString *data; - postalCode = [homeAdr flattenedValueAtIndex: 5 forKey: @""]; - country = [homeAdr flattenedValueAtIndex: 6 forKey: @""]; +// postalCode = [homeAdr flattenedValueAtIndex: 5 forKey: @""]; +// country = [homeAdr flattenedValueAtIndex: 6 forKey: @""]; - data = [NSMutableString string]; - [data appendString: postalCode]; - if ([postalCode length] > 0 && [country length] > 0) - [data appendFormat: @", ", country]; - [data appendString: country]; +// data = [NSMutableString string]; +// [data appendString: postalCode]; +// if ([postalCode length] > 0 && [country length] > 0) +// [data appendFormat: @", "]; +// [data appendString: country]; - return [self _cardStringWithLabel: nil value: data]; -} +// return [self _cardStringWithLabel: nil value: data]; +// } -- (NSString *) _formattedURL: (NSString *) url -{ - NSRange schemaR; - NSString *schema, *data; +// - (NSString *) _formattedURL: (NSString *) url +// { +// NSRange schemaR; +// NSString *schema, *data; - if ([url length] > 0) - { - schemaR = [url rangeOfString: @"://"]; - if (schemaR.length > 0) - { - schema = [url substringToIndex: schemaR.location + schemaR.length]; - data = [url substringFromIndex: schemaR.location + schemaR.length]; - } - else - { - schema = @"http://"; - data = url; - } - } - else - { - schema = nil; - data = nil; - } +// if ([url length] > 0) +// { +// schemaR = [url rangeOfString: @"://"]; +// if (schemaR.length > 0) +// { +// schema = [url substringToIndex: schemaR.location + schemaR.length]; +// data = [url substringFromIndex: schemaR.location + schemaR.length]; +// } +// else +// { +// schema = @"http://"; +// data = url; +// } +// } +// else +// { +// schema = nil; +// data = nil; +// } - return [self _cardStringWithLabel: nil - value: data - byEscapingHTMLString: YES - asLinkScheme: schema - withLinkAttributes: @"target=\"_blank\""]; -} +// return [self _cardStringWithLabel: nil +// value: data +// byEscapingHTMLString: YES +// asLinkScheme: schema +// withLinkAttributes: @"target=\"_blank\""]; +// } -- (NSString *) _urlOfType: (NSString *) aType -{ - NSArray *elements; - NSString *url; +// - (NSString *) _urlOfType: (NSString *) aType +// { +// NSArray *elements; +// NSString *url; - elements = [card childrenWithTag: @"url" - andAttribute: @"type" - havingValue: aType]; - if ([elements count] > 0) - url = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; - else - url = nil; +// elements = [card childrenWithTag: @"url" +// andAttribute: @"type" +// havingValue: aType]; +// if ([elements count] > 0) +// url = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; +// else +// url = nil; - return [self _formattedURL: url]; -} +// return [self _formattedURL: url]; +// } -- (NSString *) homeUrl -{ - NSString *s; +// - (NSString *) homeUrl +// { +// NSString *s; - s = [self _urlOfType: @"home"]; +// s = [self _urlOfType: @"home"]; - if (!s || [s length] == 0) - { - NSArray *elements; - NSString *workURL; - int i; +// if (!s || [s length] == 0) +// { +// NSArray *elements; +// NSString *workURL; +// int i; - elements = [card childrenWithTag: @"url" - andAttribute: @"type" - havingValue: @"work"]; - workURL = nil; +// elements = [card childrenWithTag: @"url" +// andAttribute: @"type" +// havingValue: @"work"]; +// workURL = nil; - if ([elements count] > 0) - workURL = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; +// if ([elements count] > 0) +// workURL = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; - elements = [card childrenWithTag: @"url"]; +// elements = [card childrenWithTag: @"url"]; - if (workURL && [elements count] > 1) - { - for (i = 0; i < [elements count]; i++) - { - if ([[[elements objectAtIndex: i] flattenedValuesForKey: @""] - caseInsensitiveCompare: workURL] != NSOrderedSame) - { - s = [[elements objectAtIndex: i] flattenedValuesForKey: @""]; - break; - } - } +// if (workURL && [elements count] > 1) +// { +// for (i = 0; i < [elements count]; i++) +// { +// if ([[[elements objectAtIndex: i] flattenedValuesForKey: @""] +// caseInsensitiveCompare: workURL] != NSOrderedSame) +// { +// s = [[elements objectAtIndex: i] flattenedValuesForKey: @""]; +// break; +// } +// } - } - else if (!workURL && [elements count] > 0) - { - s = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; - } +// } +// else if (!workURL && [elements count] > 0) +// { +// s = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; +// } - if (s && [s length] > 0) - s = [self _formattedURL: s]; - } +// if (s && [s length] > 0) +// s = [self _formattedURL: s]; +// } - return s; -} +// return s; +// } -- (BOOL) hasWorkInfos -{ - BOOL result; - NSArray *elements; +// - (BOOL) hasWorkInfos +// { +// BOOL result; +// NSArray *elements; - elements = [card childrenWithTag: @"adr" - andAttribute: @"type" - havingValue: @"work"]; - if ([elements count] > 0) - { - result = YES; - workAdr = [elements objectAtIndex: 0]; - } - else - result = (([[card childrenWithTag: @"url" - andAttribute: @"type" - havingValue: @"work"] count] > 0) - || [[card childrenWithTag: @"org"] count] > 0); +// elements = [card childrenWithTag: @"adr" +// andAttribute: @"type" +// havingValue: @"work"]; +// if ([elements count] > 0) +// { +// result = YES; +// workAdr = [elements objectAtIndex: 0]; +// } +// else +// result = (([[card childrenWithTag: @"url" +// andAttribute: @"type" +// havingValue: @"work"] count] > 0) +// || [[card childrenWithTag: @"org"] count] > 0); - return result; -} +// return result; +// } -- (NSString *) workTitle -{ - return [self _cardStringWithLabel: nil value: [card title]]; -} +// - (NSString *) workTitle +// { +// return [self _cardStringWithLabel: nil value: [card title]]; +// } - (NSArray *) orgUnits { @@ -608,65 +607,65 @@ return addresses; } -- (NSString *) workService -{ - NSMutableArray *orgServices; - NSArray *values; - CardElement *org; - NSString *service, *services; - NSUInteger count, max; +// - (NSString *) workService +// { +// NSMutableArray *orgServices; +// NSArray *values; +// CardElement *org; +// NSString *service, *services; +// NSUInteger count, max; - org = [card org]; - values = [org valuesForKey: @""]; - max = [values count]; - if (max > 1) - { - orgServices = [NSMutableArray arrayWithCapacity: max]; - for (count = 1; count < max; count++) - { - service = [org flattenedValueAtIndex: count forKey: @""]; - if ([service length] > 0) - [orgServices addObject: service]; - } +// org = [card org]; +// values = [org valuesForKey: @""]; +// max = [values count]; +// if (max > 1) +// { +// orgServices = [NSMutableArray arrayWithCapacity: max]; +// for (count = 1; count < max; count++) +// { +// service = [org flattenedValueAtIndex: count forKey: @""]; +// if ([service length] > 0) +// [orgServices addObject: service]; +// } - services = [orgServices componentsJoinedByString: @", "]; - } - else - services = nil; +// services = [orgServices componentsJoinedByString: @", "]; +// } +// else +// services = nil; - return [self _cardStringWithLabel: nil value: services]; -} +// return [self _cardStringWithLabel: nil value: services]; +// } -- (NSString *) workUrl -{ - return [self _urlOfType: @"work"]; -} +// - (NSString *) workUrl +// { +// return [self _urlOfType: @"work"]; +// } -- (BOOL) hasOtherInfos -{ - return ([[card note] length] > 0 - || [[card bday] length] > 0 - || [[card tz] length] > 0); -} +// - (BOOL) hasOtherInfos +// { +// return ([[card note] length] > 0 +// || [[card bday] length] > 0 +// || [[card tz] length] > 0); +// } -- (NSString *) bday -{ - SOGoDateFormatter *dateFormatter; - NSCalendarDate *date; - NSString *bday; +// - (NSString *) bday +// { +// SOGoDateFormatter *dateFormatter; +// NSCalendarDate *date; +// NSString *bday; - date = [card birthday]; - bday = nil; +// date = [card birthday]; +// bday = nil; - if (date) - { - dateFormatter = [[[self context] activeUser] dateFormatterInContext: context]; - bday = [dateFormatter formattedDate: date]; - } +// if (date) +// { +// dateFormatter = [[[self context] activeUser] dateFormatterInContext: context]; +// bday = [dateFormatter formattedDate: date]; +// } - return bday; - //return [self _cardStringWithLabel: @"Birthday:" value: bday]; -} +// return bday; +// //return [self _cardStringWithLabel: @"Birthday:" value: bday]; +// } // - (NSString *) tz // { @@ -693,29 +692,29 @@ /* hrefs */ -- (NSString *) completeHrefForMethod: (NSString *) _method - withParameter: (NSString *) _param - forKey: (NSString *) _key -{ - NSString *href; +// - (NSString *) completeHrefForMethod: (NSString *) _method +// withParameter: (NSString *) _param +// forKey: (NSString *) _key +// { +// NSString *href; - [self setQueryParameter:_param forKey:_key]; - href = [self completeHrefForMethod:[self ownMethodName]]; - [self setQueryParameter:nil forKey:_key]; +// [self setQueryParameter:_param forKey:_key]; +// href = [self completeHrefForMethod:[self ownMethodName]]; +// [self setQueryParameter:nil forKey:_key]; - return href; -} +// return href; +// } -- (NSString *)attributesTabLink { - return [self completeHrefForMethod:[self ownMethodName] - withParameter:@"attributes" - forKey:@"tab"]; -} -- (NSString *)debugTabLink { - return [self completeHrefForMethod:[self ownMethodName] - withParameter:@"debug" - forKey:@"tab"]; -} +// - (NSString *)attributesTabLink { +// return [self completeHrefForMethod:[self ownMethodName] +// withParameter:@"attributes" +// forKey:@"tab"]; +// } +// - (NSString *)debugTabLink { +// return [self completeHrefForMethod:[self ownMethodName] +// withParameter:@"debug" +// forKey:@"tab"]; +// } /* action */ @@ -751,6 +750,7 @@ * @apiSuccess (Success 200) {String} [nickname] Nickname * @apiSuccess (Success 200) {String} [c_sn] Lastname * @apiSuccess (Success 200) {String} [c_fn] Fullname + * @apiSuccess (Success 200) {String} [c_screenname] Screen Name (X-AIM for now) * @apiSuccess (Success 200) {String} [tz] Timezone * @apiSuccess (Success 200) {String} [note] Note * @apiSuccess (Success 200) {String[]} allCategories All available categories @@ -812,6 +812,10 @@ if ([firstName length] > 0) [data setObject: firstName forKey: @"c_givenname"]; } + + o = [[card uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]; + if ([o length]) [data setObject: o forKey: @"c_screenname"]; + o = [card nickname]; if (o) [data setObject: o forKey: @"nickname"]; o = [card title]; diff --git a/UI/Contacts/product.plist b/UI/Contacts/product.plist index d78e3749e..158e24815 100644 --- a/UI/Contacts/product.plist +++ b/UI/Contacts/product.plist @@ -136,6 +136,15 @@ protectedBy = "View"; pageName = "UIxContactFolderLinksTemplate"; }; + properties = { + protectedBy = "Access Contents Information"; + pageName = "UIxContactFolderProperties"; + }; + save = { + protectedBy = "Access Contents Information"; + pageName = "UIxContactFolderProperties"; + actionName = "saveProperties"; + }; }; }; @@ -157,11 +166,6 @@ pageName = "UIxContactEditor"; actionName = "new"; }; - save = { - protectedBy = "Change Permissions"; - actionClass = "UIxFolderActions"; - actionName = "renameFolder"; - }; mailer-contacts = { protectedBy = ""; pageName = "UIxContactFoldersView"; diff --git a/UI/MailPartViewers/UIxMailPartHTMLViewer.m b/UI/MailPartViewers/UIxMailPartHTMLViewer.m index f1ead5ffd..e472e735a 100644 --- a/UI/MailPartViewers/UIxMailPartHTMLViewer.m +++ b/UI/MailPartViewers/UIxMailPartHTMLViewer.m @@ -161,10 +161,10 @@ static NSData* _sanitizeContent(NSData *theData) if (i < len-5) { if ((*bytes == '<') && - (*(bytes+1) == 'm' || *(bytes+2) == 'M') && - (*(bytes+2) == 'e' || *(bytes+3) == 'E') && - (*(bytes+3) == 't' || *(bytes+4) == 'T') && - (*(bytes+4) == 'a' || *(bytes+5) == 'A') && + (*(bytes+1) == 'm' || *(bytes+1) == 'M') && + (*(bytes+2) == 'e' || *(bytes+2) == 'E') && + (*(bytes+3) == 't' || *(bytes+3) == 'T') && + (*(bytes+4) == 'a' || *(bytes+4) == 'A') && (*(bytes+5) == ' ')) in_meta = YES; } @@ -551,9 +551,9 @@ static NSData* _sanitizeContent(NSData *theData) else skipAttribute = YES; } - else if ([name isEqualToString: @"background"] || + else if (([name isEqualToString: @"background"] || ([name isEqualToString: @"data"] - || [name isEqualToString: @"classid"]) + || [name isEqualToString: @"classid"])) && [lowerName isEqualToString: @"object"]) { value = [_attributes valueAtIndex: count]; @@ -741,7 +741,7 @@ static NSData* _sanitizeContent(NSData *theData) /* SaxLexicalHandler */ - (void) comment: (unichar *) _chars - length: (NSUInteger) _len + length: (int) _len { showWhoWeAre(); if (inStyle) @@ -807,7 +807,7 @@ static NSData* _sanitizeContent(NSData *theData) } [dump appendFormat: @"--- end ---\n"]; - NSLog(dump); + NSLog(@"%@", dump); [dump release]; } diff --git a/UI/MailPartViewers/UIxMailPartICalActions.m b/UI/MailPartViewers/UIxMailPartICalActions.m index edcccf310..564c8700f 100644 --- a/UI/MailPartViewers/UIxMailPartICalActions.m +++ b/UI/MailPartViewers/UIxMailPartICalActions.m @@ -46,6 +46,7 @@ #import #import #import +#import #import #import "UIxMailPartICalActions.h" diff --git a/UI/MailPartViewers/UIxMailPartMessageViewer.m b/UI/MailPartViewers/UIxMailPartMessageViewer.m index 67052555d..dfb5bb3eb 100644 --- a/UI/MailPartViewers/UIxMailPartMessageViewer.m +++ b/UI/MailPartViewers/UIxMailPartMessageViewer.m @@ -228,7 +228,7 @@ info = [parts objectAtIndex: i]; viewer = [[[self context] mailRenderingContext] viewerForBodyInfo: info]; [viewer setBodyInfo: info]; - [viewer setPartPath: [[self contentPartPath] arrayByAddingObject: [NSString stringWithFormat: @"%d", i+1]]]; + [viewer setPartPath: [[self contentPartPath] arrayByAddingObject: [NSString stringWithFormat: @"%d", (int)i+1]]]; [renderedParts addObject: [viewer renderedPart]]; } } diff --git a/UI/MailPartViewers/UIxMailPartMixedViewer.h b/UI/MailPartViewers/UIxMailPartMixedViewer.h index 3c49cd64c..a450bbd8f 100644 --- a/UI/MailPartViewers/UIxMailPartMixedViewer.h +++ b/UI/MailPartViewers/UIxMailPartMixedViewer.h @@ -33,7 +33,7 @@ - (void) setChildInfo: (id) _info; - (id) childInfo; -- (void) setChildIndex: (unsigned int) _index; +- (void) setChildIndex: (NSUInteger) _index; - (id) childPartPath; diff --git a/UI/MailPartViewers/UIxMailPartMixedViewer.m b/UI/MailPartViewers/UIxMailPartMixedViewer.m index 6a36c2457..5bd0073d3 100644 --- a/UI/MailPartViewers/UIxMailPartMixedViewer.m +++ b/UI/MailPartViewers/UIxMailPartMixedViewer.m @@ -61,7 +61,7 @@ return [NSString stringWithFormat: @"%u", (unsigned int) ([self childIndex] + 1)]; char buf[8]; - sprintf(buf, "%d", [self childIndex] + 1); + sprintf(buf, "%d", (int)[self childIndex] + 1); return [NSString stringWithCString:buf]; } @@ -87,6 +87,7 @@ id info, viewer; NSArray *parts; NSMutableArray *renderedParts; + NSString *contentType; NSUInteger i, max; parts = [[self bodyInfo] objectForKey: @"parts"]; @@ -102,9 +103,13 @@ [viewer setPartPath: [self childPartPath]]; [renderedParts addObject: [viewer renderedPart]]; } + contentType = [NSString stringWithFormat: @"%@/%@", + [[self bodyInfo] objectForKey: @"type"], + [[self bodyInfo] objectForKey: @"subtype"]]; return [NSDictionary dictionaryWithObjectsAndKeys: [self className], @"type", + contentType, @"contentType", renderedParts, @"content", nil]; } diff --git a/UI/MailPartViewers/UIxMailPartTextViewer.h b/UI/MailPartViewers/UIxMailPartTextViewer.h index dda31d780..8a99ed462 100644 --- a/UI/MailPartViewers/UIxMailPartTextViewer.h +++ b/UI/MailPartViewers/UIxMailPartTextViewer.h @@ -1,8 +1,6 @@ /* UIxMailPartTextViewer.h - this file is part of $PROJECT_NAME_HERE$ * - * Copyright (C) 2006 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/MailPartViewers/UIxMailPartTextViewer.m b/UI/MailPartViewers/UIxMailPartTextViewer.m index eb978d4cc..e5f84d379 100644 --- a/UI/MailPartViewers/UIxMailPartTextViewer.m +++ b/UI/MailPartViewers/UIxMailPartTextViewer.m @@ -1,23 +1,22 @@ -/* - Copyright (C) 2004-2005 SKYRIX Software AG - - This file is part of OpenGroupware.org. - - OGo is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - OGo is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with OGo; see the file COPYING. If not, write to the - Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. -*/ +/* UIxMailPartTextViewer.m - this file is part of $PROJECT_NAME_HERE$ + * + * Copyright (C) 2006-2015 Inverse inc. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ /* UIxMailPartTextViewer diff --git a/UI/MailPartViewers/UIxMailPartViewer.m b/UI/MailPartViewers/UIxMailPartViewer.m index 8721e47ef..816627d19 100644 --- a/UI/MailPartViewers/UIxMailPartViewer.m +++ b/UI/MailPartViewers/UIxMailPartViewer.m @@ -287,7 +287,7 @@ if ([filename length]) // We replace any slash by a dash since Apache won't allow encoded slashes by default. // See http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes - filename = [filename stringByReplacingString: @"/" withString: @"-"]; + filename = (NSMutableString *)[filename stringByReplacingString: @"/" withString: @"-"]; else [filename appendFormat: @"%@-%@", [self labelForKey: @"Untitled"], diff --git a/UI/MailerUI/English.lproj/Localizable.strings b/UI/MailerUI/English.lproj/Localizable.strings index d35038fdb..451016b53 100644 --- a/UI/MailerUI/English.lproj/Localizable.strings +++ b/UI/MailerUI/English.lproj/Localizable.strings @@ -65,6 +65,9 @@ "Account: " = "Account: "; "Shared Account: " = "Shared Account: "; +/* Empty right pane */ +"No message selected" = "No message selected"; + /* acls */ "Access rights to" = "Access rights to"; "For user" = "For user"; @@ -228,6 +231,9 @@ "Delete Message" = "Delete Message"; "Delete Selected Messages" = "Delete Selected Messages"; +/* Number of selected messages in list */ +"selected" = "selected"; + "This Folder" = "This Folder"; /* Label popup menu */ diff --git a/UI/MailerUI/UIxMailEditor.m b/UI/MailerUI/UIxMailEditor.m index 41e5761b1..b87cfedfa 100644 --- a/UI/MailerUI/UIxMailEditor.m +++ b/UI/MailerUI/UIxMailEditor.m @@ -639,6 +639,7 @@ static NSArray *infoKeys = nil; co = [self clientObject]; [co fetchInfo]; + [co setIsHTML: isHTML]; if ([[mimeType type] isEqualToString: @"multipart"]) { @@ -648,7 +649,6 @@ static NSArray *infoKeys = nil; { info = [self infoFromRequest]; [co setHeaders: info]; - [co setIsHTML: isHTML]; [co setText: (isHTML ? [NSString stringWithFormat: @"%@", text] : text)];; error = [co storeInfo]; } diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index c07c834c4..9ed02d74a 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -156,7 +156,7 @@ } else { - newKeyForMsgUIDs = [[NSString stringWithFormat:@"/%@/folder%@", currentAccount, newFolderName] asCSSIdentifier]; + newKeyForMsgUIDs = [NSString stringWithFormat:@"/%@/folder%@", [currentAccount asCSSIdentifier], [newFolderName asCSSIdentifier]]; error = [co renameTo: newFolderName]; if (error) { @@ -451,7 +451,7 @@ NSMutableDictionary *moduleSettings, *threadsCollapsed; NSMutableArray *mailboxThreadsCollapsed; NSString *destinationFolder; - SOGoUserSettings *us; + SOGoUserSettings *us=nil; WOResponse *response; NSDictionary *data; SOGoMailFolder *co; @@ -739,6 +739,7 @@ NSDictionary *content, *result; BOOL addOrRemove; NGImap4Client *client; + id flag; int i; @@ -751,7 +752,13 @@ // We unescape our flags for (i = [flags count]-1; i >= 0; i--) - [flags replaceObjectAtIndex: i withObject: [[flags objectAtIndex: i] fromCSSIdentifier]]; + { + flag = [flags objectAtIndex: i]; + if ([flag isKindOfClass: [NSString class]]) + [flags replaceObjectAtIndex: i withObject: [flag fromCSSIdentifier]]; + else + [flags removeObjectAtIndex: i]; + } co = [self clientObject]; client = [[co imap4Connection] client]; diff --git a/UI/MailerUI/UIxMailListActions.m b/UI/MailerUI/UIxMailListActions.m index 4427b008d..e385e544c 100644 --- a/UI/MailerUI/UIxMailListActions.m +++ b/UI/MailerUI/UIxMailListActions.m @@ -164,13 +164,15 @@ // // Sometimes, the MUAs don't send over the string in () so we ignore it. // -- (NSString *) messagePriority +- (NSDictionary *) messagePriority { - NSString *result; + NSUInteger priority; + NSString *description; NSData *data; data = [message objectForKey: @"header"]; - result = @""; + priority = 3; + description = [self labelForKey: @"normal" inContext: context]; if (data) { @@ -191,15 +193,34 @@ s = [[s substringFromIndex: r.location+1] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if ([s hasPrefix: @"1"]) result = [self labelForKey: @"highest" inContext: context]; - else if ([s hasPrefix: @"2"]) result = [self labelForKey: @"high" inContext: context]; - else if ([s hasPrefix: @"4"]) result = [self labelForKey: @"low" inContext: context]; - else if ([s hasPrefix: @"5"]) result = [self labelForKey: @"lowest" inContext: context]; + if ([s hasPrefix: @"1"]) + { + priority = 1; + description = [self labelForKey: @"highest" inContext: context]; + } + else if ([s hasPrefix: @"2"]) + { + priority = 2; + description = [self labelForKey: @"high" inContext: context]; + } + else if ([s hasPrefix: @"4"]) + { + priority = 4; + description = [self labelForKey: @"low" inContext: context]; + } + else if ([s hasPrefix: @"5"]) + { + priority = 5; + description = [self labelForKey: @"lowest" inContext: context]; + } } } } - return result; + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt: priority], @"level", + description, @"name", + nil]; } - (NSString *) messageSubject @@ -623,11 +644,12 @@ - (NSDictionary *) getUIDsInFolder: (SOGoMailFolder *) folder withHeaders: (BOOL) includeHeaders { - NSMutableDictionary *data; NSArray *uids, *threadedUids, *headers; - NSRange r; + NSMutableDictionary *data; SOGoMailAccount *account; id quota; + + NSRange r; int count; data = [NSMutableDictionary dictionary]; @@ -645,10 +667,14 @@ if (includeHeaders) { // Also retrieve the first headers, up to 'headersPrefetchMaxSize' - count = [[uids flattenedArray] count]; - if (count > headersPrefetchMaxSize) count = headersPrefetchMaxSize; + NSArray *a; + + a = [uids flattenedArray]; + count = [a count]; + if (count > headersPrefetchMaxSize) + count = headersPrefetchMaxSize; r = NSMakeRange(0, count); - headers = [self getHeadersForUIDs: [[uids flattenedArray] subarrayWithRange: r] + headers = [self getHeadersForUIDs: [a subarrayWithRange: r] inFolder: folder]; [data setObject: headers forKey: @"headers"]; @@ -717,6 +743,8 @@ * @apiSuccess (Success 200) {String} headers.From.email Sender's email address * @apiSuccess (Success 200) {Number} headers.isRead 1 if message is read * @apiSuccess (Success 200) {String} headers.Priority Priority + * @apiSuccess (Success 200) {String} headers.Priority.level Priority number + * @apiSuccess (Success 200) {String} headers.Priority.name Priority description * @apiSuccess (Success 200) {String} headers.RelativeDate Message date relative to now * @apiSuccess (Success 200) {String} headers.Size Formatted message size * @apiSuccess (Success 200) {String[]} headers.Flags Flags, such as "answered" and "seen" @@ -745,7 +773,6 @@ noHeaders = [[[requestContent objectForKey: @"sortingAttributes"] objectForKey:@"noHeaders"] boolValue]; data = [self getUIDsInFolder: folder withHeaders: !noHeaders]; - [response appendContentString: [data jsonRepresentation]]; return response; @@ -879,7 +906,7 @@ data = [NSDictionary dictionaryWithObjectsAndKeys: @"No UID specified", @"error", nil]; return [self responseWithStatus: 404 /* Not Found */ - andString: [data jsonRepresentation]]; + andString: [data jsonRepresentation]]; } uids = [data objectForKey: @"uids"]; diff --git a/UI/MailerUI/UIxMailMainFrame.m b/UI/MailerUI/UIxMailMainFrame.m index 621ca4983..99ce6edc7 100644 --- a/UI/MailerUI/UIxMailMainFrame.m +++ b/UI/MailerUI/UIxMailMainFrame.m @@ -87,6 +87,11 @@ [super dealloc]; } +- (NSString *) modulePath +{ + return @"Mail"; +} + - (void) _setupContext { SOGoUser *activeUser; @@ -118,6 +123,18 @@ return [accounts jsonRepresentation]; } +- (WOResponse *) mailAccountsAction +{ + WOResponse *response; + NSString *s; + + s = [self mailAccounts]; + response = [self responseWithStatus: 200 + andString: s]; + + return response; +} + - (NSString *) userNames { NSArray *accounts, *userNames; @@ -311,12 +328,17 @@ - (WOResponse *) getFoldersStateAction { - NSString *expandedFolders; + id o; + NSArray *expandedFolders; [self _setupContext]; - expandedFolders = [moduleSettings objectForKey: @"ExpandedFolders"]; + o = [moduleSettings objectForKey: @"ExpandedFolders"]; + if ([o isKindOfClass: [NSString class]]) + expandedFolders = [o componentsSeparatedByString: @","]; + else + expandedFolders = o; - return [self responseWithStatus: 200 andString: expandedFolders]; + return [self responseWithStatus: 200 andJSONRepresentation: expandedFolders]; } - (NSString *) verticalDragHandleStyle @@ -374,14 +396,14 @@ - (WOResponse *) saveFoldersStateAction { WORequest *request; - NSString *expandedFolders; + NSArray *expandedFolders; [self _setupContext]; request = [context request]; - expandedFolders = [request formValueForKey: @"expandedFolders"]; + expandedFolders = [[request contentAsString] objectFromJSONString]; [moduleSettings setObject: expandedFolders - forKey: @"ExpandedFolders"]; + forKey: @"ExpandedFolders"]; [us synchronize]; @@ -603,7 +625,7 @@ - (NSString *) columnsDisplayCount { - return [NSString stringWithFormat: @"%d", [[self columnsDisplayOrder] count]]; + return [NSString stringWithFormat: @"%d", (int)[[self columnsDisplayOrder] count]]; } - (void) setCurrentColumn: (NSDictionary *) newCurrentColumn @@ -709,8 +731,8 @@ for (k = 0; k < [pathComponents count]; k++) { - component = [NSString stringWithFormat: @"folder%@", [pathComponents objectAtIndex: k]]; - [path appendString: [component asCSSIdentifier]]; + component = [[pathComponents objectAtIndex: k] asCSSIdentifier]; + [path appendString: [NSString stringWithFormat: @"folder%@", component]]; if (k < [pathComponents count] - 1) [path appendString: @"/"]; } diff --git a/UI/MailerUI/UIxMailView.m b/UI/MailerUI/UIxMailView.m index ba297b53c..47347969e 100644 --- a/UI/MailerUI/UIxMailView.m +++ b/UI/MailerUI/UIxMailView.m @@ -57,6 +57,7 @@ #import #import // cyclic #import +#import #import "WOContext+UIxMailer.h" #import "UIxMailFormatter.h" @@ -229,7 +230,7 @@ static NSString *mailETag = nil; - (id ) defaultAction { - id response; + WOResponse *response; NSString *s; NSMutableDictionary *data; NSArray *addresses; diff --git a/UI/MailerUI/product.plist b/UI/MailerUI/product.plist index 24ab2aacb..412850d6b 100644 --- a/UI/MailerUI/product.plist +++ b/UI/MailerUI/product.plist @@ -342,10 +342,19 @@ actionClass = "UIxMailMainFrame"; actionName = "unseenCount"; }; + mailAccounts = { + protectedBy = "View"; + actionClass = "UIxMailMainFrame"; + actionName = "mailAccounts"; + }; // viewerTemplate = { // protectedBy = "View"; // pageName = "UIxMailViewTemplate"; // }; + UIxMailPopupView = { + protectedBy = "View"; + pageName = "UIxMailPopupView"; + }; UIxMailEditor = { protectedBy = "View"; pageName = "UIxMailEditor"; diff --git a/UI/MainUI/SOGoMicrosoftActiveSyncActions.m b/UI/MainUI/SOGoMicrosoftActiveSyncActions.m index c487d5cce..ea9566dee 100644 --- a/UI/MainUI/SOGoMicrosoftActiveSyncActions.m +++ b/UI/MainUI/SOGoMicrosoftActiveSyncActions.m @@ -30,6 +30,9 @@ #import #import +#import +#import + @interface SOGoMicrosoftActiveSyncActions : WODirectAction @end @@ -47,7 +50,7 @@ id dispatcher; Class clazz; - request = [context request]; + request = (WORequest *)[context request]; response = [self responseWithStatus: 200]; bundle = [NSBundle bundleForClass: NSClassFromString(@"ActiveSyncProduct")]; diff --git a/UI/MainUI/SOGoUserHomePage.m b/UI/MainUI/SOGoUserHomePage.m index fb770a23f..99dd80a91 100644 --- a/UI/MainUI/SOGoUserHomePage.m +++ b/UI/MainUI/SOGoUserHomePage.m @@ -193,7 +193,7 @@ timeZone: [currentStartDate timeZone]]; // Increment counters for quarters of first hour - hourKey = [NSString stringWithFormat: @"%u", [currentDate hourOfDay]]; + hourKey = [NSString stringWithFormat: @"%u", (unsigned int)[currentDate hourOfDay]]; hourData = [dayData objectForKey: hourKey]; if (!hourData) { @@ -224,7 +224,7 @@ while ([currentDate compare: currentEndDate] == NSOrderedAscending && [currentEndDate timeIntervalSinceDate: currentDate] >= 3600) // 1 hour { - hourKey = [NSString stringWithFormat: @"%u", [currentDate hourOfDay]]; + hourKey = [NSString stringWithFormat: @"%u", (unsigned int)[currentDate hourOfDay]]; hourData = [dayData objectForKey: hourKey]; if (!hourData) { @@ -251,7 +251,7 @@ // Increment counters for quarters of last hour if ([currentEndDate timeIntervalSinceDate: currentDate] > 0) { - hourKey = [NSString stringWithFormat: @"%u", [currentDate hourOfDay]]; + hourKey = [NSString stringWithFormat: @"%u", (unsigned int)[currentDate hourOfDay]]; hourData = [dayData objectForKey: hourKey]; if (!hourData) { @@ -636,7 +636,7 @@ * @apiExample {curl} Example usage: * curl -i http://localhost/SOGo/so/sogo1/foldersSearch?type=contact * - * @apiParam {String} type Either 'calendar' or 'contact' + * @apiParam {String} type Either 'calendar' or 'contact'. If nothing is specifed, its both. * * @apiSuccess (Success 200) {Object[]} folders List of matching folders * @apiSuccess (Success 200) {String} folders.name Path of folder @@ -648,27 +648,31 @@ - (id ) foldersSearchAction { NSString *folderType; - NSArray *folders; + NSMutableArray *folders; NSDictionary *message; id result; SOGoUserFolder *userFolder; folderType = [self queryParameterForKey: @"type"]; + folders = [NSMutableArray array]; + userFolder = [self clientObject]; + if ([folderType length]) { - userFolder = [self clientObject]; - folders = [userFolder foldersOfType: folderType - forUID: [userFolder ownerInContext: context]]; - result = [self _foldersResponseForResults: folders]; + [folders addObjectsFromArray: [userFolder foldersOfType: folderType + forUID: [userFolder ownerInContext: context]]]; } else { - message = [NSDictionary dictionaryWithObject: [self labelForKey: @"Missing type parameter"] - forKey: @"error"]; - result = [self responseWithStatus: 400 andJSONRepresentation: message]; + [folders addObjectsFromArray: [userFolder foldersOfType: @"calendar" + forUID: [userFolder ownerInContext: context]]]; + [folders addObjectsFromArray: [userFolder foldersOfType: @"contact" + forUID: [userFolder ownerInContext: context]]]; } + result = [self _foldersResponseForResults: folders]; + return result; } diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index af865affe..6e39affc0 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -203,7 +203,7 @@ /* Event+task categories */ "category_none" = "Nenhum"; -"calendar_category_labels" = "Aniversário,Negócios,Ligações,Concorrência,Cliente,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Meeting,Problemas,Miscelânea,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; +"calendar_category_labels" = "Celebração Anual,Aniversário,Negócios,Ligações,Clientes,Concorrência,Comprador,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Reunião,Problemas,Miscelânea,Pessoal,Projetos,Feriado,Posição,Fornecedores,Viagem,Férias"; /* Default module */ "Calendar" = "Calendário"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 1a240b62a..3128f31bc 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -24,10 +24,10 @@ /* vacation (auto-reply) */ "Enable vacation auto reply" = "Enable vacation auto reply"; -"Auto reply message" ="Auto reply message"; -"Email addresses (separated by commas)" ="Email addresses (separated by commas)"; +"Auto reply message" = "Auto reply message"; +"Email addresses (separated by commas)" = "Email addresses (separated by commas)"; "Add default email addresses" = "Add default email addresses"; -"Days between responses" ="Days between responses"; +"Days between responses" = "Days between responses"; "Do not send responses to mailing lists" = "Do not send responses to mailing lists"; "Disable auto reply on" = "Disable auto reply on"; "Always send vacation message response" = "Always send vacation message response"; @@ -47,10 +47,10 @@ /* d & t */ -"Current Time Zone" ="Current Time Zone"; -"Short Date Format" ="Short Date Format"; -"Long Date Format" ="Long Date Format"; -"Time Format" ="Time Format"; +"Current Time Zone" = "Current Time Zone"; +"Short Date Format" = "Short Date Format"; +"Long Date Format" = "Long Date Format"; +"Time Format" = "Time Format"; "default" = "Default"; "Default Module" = "Default Module"; @@ -98,15 +98,15 @@ "timeFmt_4" = ""; /* calendar */ -"Week begins on" ="Week begins on"; -"Day start time" ="Day start time"; -"Day end time" ="Day end time"; +"Week begins on" = "Week begins on"; +"Day start time" = "Day start time"; +"Day end time" = "Day end time"; "Day start time must be prior to day end time." = "Day start time must be prior to day end time."; "Show time as busy outside working hours" = "Show time as busy outside working hours"; -"First week of year" ="First week of year"; +"First week of year" = "First week of year"; "Enable reminders for Calendar items" = "Enable reminders for Calendar items"; "Play a sound when a reminder comes due" = "Play a sound when a reminder comes due"; -"Default reminder" ="Default reminder"; +"Default reminder" = "Default reminder"; "firstWeekOfYear_January1" = "Starts on january 1"; "firstWeekOfYear_First4DayWeek" = "First 4-day week"; @@ -117,7 +117,7 @@ "Contacts Names" = "Contacts Names"; /* Default Calendar */ -"Default calendar" ="Default calendar"; +"Default calendar" = "Default calendar"; "selectedCalendar" = "Selected calendar"; "personalCalendar" = "Personal calendar"; "firstCalendar" = "First enabled calendar"; @@ -200,8 +200,8 @@ "Change" = "Change"; /* Event+task classifications */ -"Default events classification" ="Default events classification"; -"Default tasks classification" ="Default tasks classification"; +"Default events classification" = "Default events classification"; +"Default tasks classification" = "Default tasks classification"; "PUBLIC_item" = "Public"; "CONFIDENTIAL_item" = "Confidential"; "PRIVATE_item" = "Private"; @@ -222,9 +222,11 @@ "Mail" = "Mail"; "Last" = "Last used"; "Default Module " = "Default Module"; -"SOGo Version" ="SOGo Version"; +"SOGo Version" = "SOGo Version"; -"Language" ="Language"; +/* Confirmation asked when changing the language */ +"Save preferences and reload page now?" = "Save preferences and reload page now?"; +"Language" = "Language"; "choose" = "Choose ..."; "Arabic" = "العربية"; "Basque" = "Euskara"; @@ -253,7 +255,7 @@ "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; -"Refresh View" ="Refresh View"; +"Refresh View" = "Refresh View"; "refreshview_manually" = "Manually"; "refreshview_every_minute" = "Every minute"; "refreshview_every_2_minutes" = "Every 2 minutes"; @@ -320,6 +322,9 @@ "matches regex" = "matches regex"; "does not match regex" = "does not match regex"; +/* Placeholder for the value field of a condition */ +"Value" = "Value"; + "Seen" = "Seen"; "Deleted" = "Deleted"; "Answered" = "Answered"; @@ -357,3 +362,10 @@ "SSL" = "SSL"; "TLS" = "TLS"; +/* Avatars */ +"Alternate Avatar" = "Alternate Avatar"; +"none" = "None"; +"identicon" = "Ident Icon"; +"monsterid" = "Monster"; +"wavatar" = "Wavatar"; +"retro" = "Retro"; diff --git a/UI/PreferencesUI/UIxJSONPreferences.m b/UI/PreferencesUI/UIxJSONPreferences.m index fcd76b039..8a7dd9418 100644 --- a/UI/PreferencesUI/UIxJSONPreferences.m +++ b/UI/PreferencesUI/UIxJSONPreferences.m @@ -32,6 +32,7 @@ #import #import #import +#import #import #import @@ -95,6 +96,9 @@ static SoProduct *preferencesProduct = nil; if (![[defaults source] objectForKey: @"SOGoRefreshViewCheck"]) [[defaults source] setObject: [defaults refreshViewCheck] forKey: @"SOGoRefreshViewCheck"]; + if (![[defaults source] objectForKey: @"SOGoAlternateAvatar"]) + [[defaults source] setObject: [defaults alternateAvatar] forKey: @"SOGoAlternateAvatar"]; + // // Default Calendar preferences // diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 1d478f652..2213dd9a6 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -169,6 +169,11 @@ static NSArray *reminderValues = nil; [super dealloc]; } +- (NSString *) modulePath +{ + return @"Preferences"; +} + // - (void) setHasChanged: (BOOL) newHasChanged // { // hasChanged = newHasChanged; @@ -1375,6 +1380,18 @@ static NSArray *reminderValues = nil; return [self labelForKey: item]; } +- (NSArray *) alternateAvatar +{ + // See: https://en.gravatar.com/site/implement/images/ + return [NSArray arrayWithObjects: @"none", @"identicon", @"monsterid", @"wavatar", @"retro", nil]; +} + +- (NSString *) itemAlternateAvatarText +{ + return [self labelForKey: item]; +} + + // - (NSString *) userDefaultModule // { // NSString *userDefaultModule; @@ -1466,15 +1483,15 @@ static NSArray *reminderValues = nil; // if ([account updateFilters]) // // If Sieve is not enabled, the SOGoSieveManager will immediatly return a positive answer // // See [SOGoSieveManager updateFiltersForAccount:withUsername:andPassword:] -// results = [self responseWithStatus: 200 +// results = (id )[self responseWithStatus: 200 // andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; // else -// results = [self responseWithStatus: 502 +// results = (id )[self responseWithStatus: 502 // andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; // } // else -// results = [self responseWithStatus: 503 +// results = (id )[self responseWithStatus: 503 // andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; // } // else @@ -2086,6 +2103,10 @@ static NSArray *reminderValues = nil; // We convert our object into a mutable one v = [[v mutableCopy] autorelease]; + if ([[v objectForKey: @"SOGoLoginModule"] isEqualToString: @"Last"]) + [v setObject: [NSNumber numberWithBool: YES] forKey: @"SOGoRememberLastModule"]; + else + [v setObject: [NSNumber numberWithBool: NO] forKey: @"SOGoRememberLastModule"]; // We remove short/long date formats if they are default ones if ([[v objectForKey: @"SOGoShortDateFormat"] isEqualToString: @"default"]) @@ -2158,12 +2179,12 @@ static NSArray *reminderValues = nil; if (![account updateFilters]) { - results = [self responseWithStatus: 502 + results = (id ) [self responseWithStatus: 502 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; } } else - results = [self responseWithStatus: 503 + results = (id ) [self responseWithStatus: 503 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; } } @@ -2175,7 +2196,7 @@ static NSArray *reminderValues = nil; } if (!results) - results = [self responseWithStatus: 200]; + results = (id ) [self responseWithStatus: 200]; return results; } diff --git a/UI/SOGoUI/SOGoAptFormatter.m b/UI/SOGoUI/SOGoAptFormatter.m index dbd49401d..163606d42 100644 --- a/UI/SOGoUI/SOGoAptFormatter.m +++ b/UI/SOGoUI/SOGoAptFormatter.m @@ -155,14 +155,14 @@ */ [_buf appendFormat:@"%02i:%02i", - [_date hourOfDay], - [_date minuteOfHour]]; + (int)[_date hourOfDay], + (int)[_date minuteOfHour]]; if (_refDate && ![_date isDateOnSameDay:_refDate]) { [_buf appendFormat:@" (%02i-%02i", - [_date monthOfYear], - [_date dayOfMonth]]; + (int)[_date monthOfYear], + (int)[_date dayOfMonth]]; if ([_date yearOfCommonEra] != [_refDate yearOfCommonEra]) - [_buf appendFormat:@"-%04i", [_date yearOfCommonEra]]; + [_buf appendFormat:@"-%04i", (int)[_date yearOfCommonEra]]; [_buf appendString:@")"]; } } diff --git a/UI/SOGoUI/UIxComponent.m b/UI/SOGoUI/UIxComponent.m index 7fbccaa24..0dad42a3d 100644 --- a/UI/SOGoUI/UIxComponent.m +++ b/UI/SOGoUI/UIxComponent.m @@ -360,40 +360,19 @@ static SoProduct *commonProduct = nil; - (NSString *) modulePath { - SOGoObject *currentClient, *parent; - BOOL found; - NSString *hostLessURL; - Class objectClass, userFolderClass; -// , groupFolderClass - - currentClient = [self clientObject]; - if (currentClient - && [currentClient isKindOfClass: [SOGoObject class]]) + if ([[self parent] respondsToSelector: @selector(modulePath)]) { -// groupFolderClass = [SOGoCustomGroupFolder class]; - userFolderClass = [SOGoUserFolder class]; + NSString *baseURL; - objectClass = [currentClient class]; -// found = (objectClass == groupFolderClass || objectClass == userFolderClass); - found = (objectClass == userFolderClass); - while (!found && currentClient) - { - parent = [currentClient container]; - objectClass = [parent class]; - if (// objectClass == groupFolderClass -// || - objectClass == userFolderClass) - found = YES; - else - currentClient = parent; - } + baseURL = [[self clientObject] baseURLInContext: context]; + + if ([baseURL hasSuffix: [NSString stringWithFormat: @"%@/", [[self parent] modulePath]]]) + return baseURL; + + return [NSString stringWithFormat: @"%@%@", baseURL, [[self parent] modulePath]]; } - else - currentClient = [WOApplication application]; - - hostLessURL = [[currentClient baseURLInContext: context] hostlessURL]; - return [hostLessURL substringToIndex: [hostLessURL length] - 1]; + return @"SOGo"; } - (NSString *) ownPath diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index c05bf90db..b00baca34 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -446,6 +446,9 @@ validate_endbeforestart = "The end date that you entered occurs before the st "Month View" = "Month View"; "Reload" = "Reload"; +/* Number of selected components in events or tasks list */ +"selected" = "selected"; + "eventPartStatModificationError" = "Your participation status could not be modified."; /* menu */ diff --git a/UI/Scheduler/SpanishSpain.lproj/Localizable.strings b/UI/Scheduler/SpanishSpain.lproj/Localizable.strings index 99397e321..aed9f2908 100644 --- a/UI/Scheduler/SpanishSpain.lproj/Localizable.strings +++ b/UI/Scheduler/SpanishSpain.lproj/Localizable.strings @@ -231,7 +231,7 @@ /* Searching */ -"view_all" = "Todos los eventos"; +"view_all" = "Todos"; "view_today" = "Hoy"; "view_next7" = "Próximos 7 días"; "view_next14" = "Próximos 14 días"; diff --git a/UI/Scheduler/UIxAppointmentActions.m b/UI/Scheduler/UIxAppointmentActions.m index 7c7dc045f..9044c4f01 100644 --- a/UI/Scheduler/UIxAppointmentActions.m +++ b/UI/Scheduler/UIxAppointmentActions.m @@ -38,6 +38,7 @@ #import #import +#import #import #import #import @@ -59,23 +60,25 @@ SoSecurityManager *sm; iCalEvent *event; NSCalendarDate *start, *newStart, *end, *newEnd; + NSDictionary *params; NSTimeInterval newDuration; SOGoUserDefaults *ud; - NSString *daysDelta, *startDelta, *durationDelta, *destionationCalendar; + NSNumber *daysDelta, *startDelta, *durationDelta; + NSString *destionationCalendar; NSTimeZone *tz; NSException *ex; SOGoAppointmentFolder *targetCalendar, *sourceCalendar; SOGoAppointmentFolders *folders; rq = [context request]; + params = [[rq contentAsString] objectFromJSONString]; - daysDelta = [rq formValueForKey: @"days"]; - startDelta = [rq formValueForKey: @"start"]; - durationDelta = [rq formValueForKey: @"duration"]; - destionationCalendar = [rq formValueForKey: @"destination"]; + daysDelta = [params objectForKey: @"days"]; + startDelta = [params objectForKey: @"start"]; + durationDelta = [params objectForKey: @"duration"]; + destionationCalendar = [params objectForKey: @"destination"]; - if ([daysDelta length] > 0 - || [startDelta length] > 0 || [durationDelta length] > 0) + if (daysDelta || startDelta || durationDelta) { co = [self clientObject]; event = (iCalEvent *) [[self clientObject] occurence]; @@ -119,7 +122,7 @@ [event setLastModified: [NSCalendarDate calendarDate]]; ex = [co saveComponent: event]; // This condition will be executed only if the event is moved from a calendar to another. If destionationCalendar == 0; there is no calendar change - if (![destionationCalendar isEqualToString:@"0"]) + if ([destionationCalendar length] > 0) { folders = [[self->context activeUser] calendarsFolderInContext: self->context]; sourceCalendar = [co container]; @@ -151,9 +154,8 @@ response = [self responseWith204]; } else - response - = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 - reason: @"missing 'days', 'start' and/or 'duration' parameters"]; + response = (WOResponse *) [NSException exceptionWithHTTPStatus: 400 + reason: @"missing 'days', 'start' and/or 'duration' parameters"]; return response; } diff --git a/UI/Scheduler/UIxAppointmentEditor.m b/UI/Scheduler/UIxAppointmentEditor.m index d65839803..be5aa1ddc 100644 --- a/UI/Scheduler/UIxAppointmentEditor.m +++ b/UI/Scheduler/UIxAppointmentEditor.m @@ -595,12 +595,12 @@ * @apiSuccess (Success 200) {Boolean} alarm.attendees Alert attendees by email if true and action is email * @apiSuccess (Success 200) {Boolean} alarm.organizer Alert organizer by email if true and action is email * - * @apiSuccess {_} ... _From [iCalEvent+SOGo attributes]_ + * @apiSuccess {_} ... _From [iCalEvent+SOGo attributesInContext:]_ * * @apiSuccess (Success 200) {Number} isAllDay 1 if event is all-day * @apiSuccess (Success 200) {Number} isTransparent 1 if the event is not opaque * - * @apiSuccess {_} .... _From [iCalEntityObject+SOGo attributes]_ + * @apiSuccess {_} .... _From [iCalEntityObject+SOGo attributesInContext:]_ * * @apiSuccess (Success 200) {Number} sendAppointmentNotifications 1 if notifications must be sent * @apiSuccess (Success 200) {String} component "vevent" @@ -626,7 +626,7 @@ * @apiSuccess (Success 200) {String} [attendees.delegatedTo] User that the original request was delegated to * @apiSuccess (Success 200) {String} [attendees.delegatedFrom] User the request was delegated from * - * @apiSuccess {_} ..... _From [iCalRepeatableEntityObject+SOGo attributes]_ + * @apiSuccess {_} ..... _From [iCalRepeatableEntityObject+SOGo attributesInContext:]_ * * @apiSuccess (Success 200) {Object} [repeat] Recurrence rule definition * @apiSuccess (Success 200) {String} repeat.frequency Either daily, (every weekday), weekly, (bi-weekly), monthly, or yearly @@ -652,7 +652,8 @@ iCalEvent *event; BOOL resetAlarm; - unsigned int snoozeAlarm; + NSInteger offset; + NSUInteger snoozeAlarm; event = [self event]; co = [self clientObject]; @@ -662,12 +663,23 @@ timeZone = [ud timeZone]; eventStartDate = [event startDate]; eventEndDate = [event endDate]; - if (!isAllDay) + + if (isAllDay) { - [eventStartDate setTimeZone: timeZone]; - [eventEndDate setTimeZone: timeZone]; + eventEndDate = [eventEndDate dateByAddingYears: 0 months: 0 days: -1]; + + // Convert the dates to the user's timezone + offset = [timeZone secondsFromGMTForDate: eventStartDate]; + eventStartDate = [eventStartDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 + seconds:-offset]; + offset = [timeZone secondsFromGMTForDate: eventEndDate]; + eventEndDate = [eventEndDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 + seconds:-offset]; } + [eventStartDate setTimeZone: timeZone]; + [eventEndDate setTimeZone: timeZone]; + // resetAlarm=yes is set only when we are about to show the alarm popup in the Web // interface of SOGo. See generic.js for details. snoozeAlarm=X is called when the // user clicks on "Snooze for" X minutes, when the popup is being displayed. @@ -704,8 +716,11 @@ data = [NSMutableDictionary dictionaryWithObjectsAndKeys: [componentCalendar nameInContainer], @"pid", [componentCalendar displayName], @"calendar", + [NSNumber numberWithBool: isAllDay], @"isAllDay", [NSNumber numberWithBool: [self isReadOnly]], @"isReadOnly", [NSNumber numberWithBool: [self userHasRSVP]], @"userHasRSVP", + [eventStartDate iso8601DateString], @"startDate", + [eventEndDate iso8601DateString], @"endDate", [dateFormatter formattedDate: eventStartDate], @"localizedStartDate", [dateFormatter formattedDate: eventEndDate], @"localizedEndDate", [self alarm], @"alarm", diff --git a/UI/Scheduler/UIxCalDateSelector.m b/UI/Scheduler/UIxCalDateSelector.m index 2b2559fe3..a9bb518f3 100644 --- a/UI/Scheduler/UIxCalDateSelector.m +++ b/UI/Scheduler/UIxCalDateSelector.m @@ -117,7 +117,7 @@ date = [self startDate]; - return [NSString stringWithFormat: @"%.2d", [date monthOfYear]]; + return [NSString stringWithFormat: @"%.2d", (int)[date monthOfYear]]; } - (NSString *) headerMonthString @@ -136,7 +136,7 @@ date = [self startDate]; - return [NSString stringWithFormat: @"%d", [date yearOfCommonEra]]; + return [NSString stringWithFormat: @"%d", (int)[date yearOfCommonEra]]; } - (NSString *) localizedDayOfWeekName diff --git a/UI/Scheduler/UIxCalDayTable.h b/UI/Scheduler/UIxCalDayTable.h index 57d91e846..ceaed3b56 100644 --- a/UI/Scheduler/UIxCalDayTable.h +++ b/UI/Scheduler/UIxCalDayTable.h @@ -39,7 +39,8 @@ NSArray *weekDays; NSString *currentView, *timeFormat, *currentTableHour; NSCalendarDate *startDate, *currentTableDay; - NSMutableArray *daysToDisplay, *calendarsToDisplay, *currentCalendar, *hoursToDisplay; + NSMutableArray *daysToDisplay, *calendarsToDisplay, *hoursToDisplay; + NSMutableDictionary *currentCalendar; unsigned int numberOfDays; } @@ -55,7 +56,7 @@ - (NSArray *) calendarsToDisplay; - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay; - (NSCalendarDate *) currentTableDay; -- (NSMutableArray *) currentCalendar; +- (NSMutableDictionary *) currentCalendar; @end diff --git a/UI/Scheduler/UIxCalDayTable.m b/UI/Scheduler/UIxCalDayTable.m index a3c13fc2f..b601134d2 100644 --- a/UI/Scheduler/UIxCalDayTable.m +++ b/UI/Scheduler/UIxCalDayTable.m @@ -37,6 +37,9 @@ #import #import +#import +#import + #import "UIxCalDayTable.h" @class SOGoAppointment; @@ -184,14 +187,13 @@ { if (!calendarsToDisplay) { - int max=0, i; NSArray *folders; SOGoAppointmentFolders *co; SOGoAppointmentFolder *folder; NSMutableDictionary *calendar; unsigned int count, foldersCount; NSString *folderName, *fDisplayName; - NSNumber *isActive; + BOOL isActive; co = [self clientObject]; folders = [co subFolders]; @@ -200,8 +202,8 @@ for (count = 0; count < foldersCount; count++) { folder = [folders objectAtIndex: count]; - isActive = [NSNumber numberWithBool: [folder isActive]]; - if ([isActive intValue] != 0) { + isActive = [folder isActive]; + if (isActive != NO) { calendar = [NSMutableDictionary dictionary]; folderName = [folder nameInContainer]; fDisplayName = [folder displayName]; @@ -214,7 +216,7 @@ [calendar setObject: fDisplayName forKey: @"displayName"]; [calendar setObject: folderName forKey: @"folder"]; [calendar setObject: [folder calendarColor] forKey: @"color"]; - [calendar setObject: isActive forKey: @"active"]; + [calendar setObject: [NSNumber numberWithBool:isActive] forKey: @"active"]; [calendar setObject: [folder ownerInContext: context] forKey: @"owner"]; [calendarsToDisplay addObject: calendar]; @@ -235,12 +237,12 @@ return currentTableDay; } -- (void) setCurrentCalendar: (NSMutableArray *) aCalendar +- (void) setCurrentCalendar: (NSMutableDictionary *) aCalendar { ASSIGN(currentCalendar, aCalendar); } -- (NSMutableArray *) currentCalendar +- (NSMutableDictionary *) currentCalendar { return currentCalendar; } @@ -282,9 +284,9 @@ return [daysToDisplay indexOfObject: currentTableDay]; } -- (NSString *) currentAppointmentHour +- (NSNumber *) currentAppointmentHour { - return [NSString stringWithFormat: @"%.2d00", [currentTableHour intValue]]; + return [NSNumber numberWithInt: [currentTableHour intValue]]; } - (NSString *) labelForDay @@ -292,6 +294,39 @@ return [weekDays objectAtIndex: [currentTableDay dayOfWeek]]; } +- (NSString *) labelForMonth +{ + NSCalendarDate *nextDay; + NSString *calendarFormat; + BOOL isLastOrFirstDay; + + isLastOrFirstDay = NO; + calendarFormat = @"%b"; + + if ([currentView hasSuffix: @"dayview"]) + { + isLastOrFirstDay = YES; + calendarFormat = @"%B"; + } + else + { + if ([currentTableDay dayOfMonth] == 1) + { + isLastOrFirstDay = YES; + } + else if ([currentTableDay dayOfMonth] > 27) + { + nextDay = [currentTableDay dateByAddingYears: 0 + months: 0 + days: 1]; + if ([nextDay dayOfMonth] == 1) + isLastOrFirstDay = YES; + } + } + + return isLastOrFirstDay? [currentTableDay descriptionWithCalendarFormat: calendarFormat locale: locale] : nil; +} + - (NSString *) labelForDate { return [dateFormatter shortFormattedDate: currentTableDay]; @@ -397,18 +432,23 @@ numberOfDays]; } -- (NSString *) daysViewClasses -{ - NSString *daysView; +// - (NSString *) daysViewClasses +// { +// NSString *daysView; - if ([currentView isEqualToString:@"multicolumndayview"]) - daysView = @"daysView daysViewForMultipleDays"; +// if ([currentView isEqualToString:@"multicolumndayview"]) +// daysView = @"daysView daysViewForMultipleDays"; - else - daysView = [NSString stringWithFormat: @"daysView daysViewFor%dDays", numberOfDays]; +// else +// daysView = [NSString stringWithFormat: @"daysView daysViewFor%dDays", numberOfDays]; - return daysView; -} +// return daysView; +//} + +// - (NSString *) daysViewHeaderClasses +// { +// return [NSString stringWithFormat: @"%@ daysHeader", [self daysViewClasses]]; +// } - (NSString *) dayClasses { @@ -416,22 +456,18 @@ unsigned int currentDayNbr, realDayOfWeek; classes = [NSMutableString string]; - if ([currentView isEqualToString:@"multicolumndayview"]) - [classes appendFormat:@"day dayColumn"]; - else { - currentDayNbr = [daysToDisplay indexOfObject: currentTableDay]; - realDayOfWeek = [currentTableDay dayOfWeek]; + currentDayNbr = [daysToDisplay indexOfObject: currentTableDay]; + realDayOfWeek = [currentTableDay dayOfWeek]; - [classes appendFormat: @"day day%d", currentDayNbr]; + [classes appendFormat: @"day day%d", currentDayNbr]; - if (numberOfDays > 1) + if (numberOfDays > 1) { if (realDayOfWeek == 0 || realDayOfWeek == 6) [classes appendString: @" weekEndDay"]; if ([currentTableDay isToday]) [classes appendString: @" dayOfToday"]; } - } return classes; } @@ -468,4 +504,9 @@ return NO; } +- (BOOL) isWeekView +{ + return [currentView isEqualToString:@"weekview"]; +} + @end diff --git a/UI/Scheduler/UIxCalDayView.m b/UI/Scheduler/UIxCalDayView.m index 8dca83462..8f2644370 100644 --- a/UI/Scheduler/UIxCalDayView.m +++ b/UI/Scheduler/UIxCalDayView.m @@ -164,7 +164,7 @@ date = [self selectedDate]; hmString = [NSString stringWithFormat:@"%.2d%.2d", - [date hourOfDay], [date minuteOfHour]]; + (int)[date hourOfDay], (int)[date minuteOfHour]]; qp = [[self queryParameters] mutableCopy]; [self setSelectedDateQueryParameter:date inDictionary:qp]; [qp setObject: hmString forKey:@"hm"]; diff --git a/UI/Scheduler/UIxCalFolderActions.m b/UI/Scheduler/UIxCalFolderActions.m index f108961bd..f8ee346c0 100644 --- a/UI/Scheduler/UIxCalFolderActions.m +++ b/UI/Scheduler/UIxCalFolderActions.m @@ -72,18 +72,14 @@ rc = [NSMutableDictionary dictionary]; request = [context request]; folder = [self clientObject]; - data = [request formValueForKey: @"calendarFile"]; - if ([data respondsToSelector: @selector(isEqualToString:)]) - fileContent = (NSString *) data; - else - { - fileContent = [[NSString alloc] initWithData: (NSData *) data - encoding: NSUTF8StringEncoding]; - if (fileContent == nil) - fileContent = [[NSString alloc] initWithData: (NSData *) data - encoding: NSISOLatin1StringEncoding]; - [fileContent autorelease]; - } + data = [[[[[request httpRequest] body] parts] lastObject] body]; + + fileContent = [[NSString alloc] initWithData: (NSData *) data + encoding: NSUTF8StringEncoding]; + if (fileContent == nil) + fileContent = [[NSString alloc] initWithData: (NSData *) data + encoding: NSISOLatin1StringEncoding]; + [fileContent autorelease]; if (fileContent && [fileContent length] && [fileContent hasPrefix: @"BEGIN:"]) diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index fdf1f01c4..7674f3a71 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -328,16 +328,24 @@ static NSArray *tasksFields = nil; iCalPersonPartStat stat; NSUInteger count, max; - if ([[theRecord objectForKey: @"c_partmails"] length] > 0 && - [[theRecord objectForKey: @"c_partstates"] length] > 0) + states = nil; + + if ([[theRecord objectForKey: @"c_partmails"] length] > 0) { mails = [[theRecord objectForKey: @"c_partmails"] componentsSeparatedByString: @"\n"]; - states = [[theRecord objectForKey: @"c_partstates"] componentsSeparatedByString: @"\n"]; + + // We add some robustness here, in case the quick table had c_partmails defined but + // no corresponding c_partstates entries. This can happen if folks toy around the database + // or if Funambol was used in the past, with a broken connector. + if ([[theRecord objectForKey: @"c_partstates"] length] > 0) + states = [[theRecord objectForKey: @"c_partstates"] componentsSeparatedByString: @"\n"]; + max = [mails count]; statesDescription = [NSMutableArray arrayWithCapacity: max]; + for (count = 0; count < max; count++) { - stat = [[states objectAtIndex: count] intValue]; + stat = (states ? [[states objectAtIndex: count] intValue] : 0); [statesDescription addObject: [[iCalPerson descriptionForParticipationStatus: stat] lowercaseString]]; } @@ -356,10 +364,10 @@ static NSArray *tasksFields = nil; NSMutableDictionary *newInfo; NSMutableArray *infos, *quickInfos, *allInfos, *quickInfosName; NSNull *marker; - NSString *owner, *role, *calendarName, *iCalString, *recurrenceTime; + NSString *owner, *role, *calendarName, *iCalString, *recurrenceTime, *categories; NSRange match; iCalCalendar *calendar; - iCalObject *master; + iCalEntityObject *master; SOGoAppointmentFolder *currentFolder; SOGoAppointmentFolders *clientObject; SOGoUser *ownerUser; @@ -392,7 +400,7 @@ static NSArray *tasksFields = nil; else if ([criteria isEqualToString:@"entireContent"]) { // First search : Through the quick table inside the location, category and title columns - quickInfos = [currentFolder fetchCoreInfosFrom: startDate + quickInfos = (NSMutableArray *)[currentFolder fetchCoreInfosFrom: startDate to: endDate title: value component: component @@ -408,14 +416,14 @@ static NSArray *tasksFields = nil; } // Second research : Every objects except for those already in the quickInfos array - allInfos = [currentFolder fetchCoreInfosFrom: startDate + allInfos = (NSMutableArray *)[currentFolder fetchCoreInfosFrom: startDate to: endDate title: nil component: component]; if (quickInfosFlag == YES) { for (i = ([allInfos count] - 1); i >= 0 ; i--) { - if([quickInfosName containsObject:[[allInfos objectAtIndex:i] objectForKey:@"c_name"]]) + if ([quickInfosName containsObject:[[allInfos objectAtIndex:i] objectForKey:@"c_name"]]) [allInfos removeObjectAtIndex:i]; } } @@ -425,7 +433,7 @@ static NSArray *tasksFields = nil; { iCalString = [[allInfos objectAtIndex:i] objectForKey:@"c_content"]; calendar = [iCalCalendar parseSingleFromSource: iCalString]; - master = [calendar firstChildWithTag:component]; + master = (iCalEntityObject *)[calendar firstChildWithTag:component]; if (master) { if ([[master comment] length] > 0) { @@ -463,10 +471,10 @@ static NSArray *tasksFields = nil; role = [currentFolder roleForComponentsWithAccessClass: [[newInfo objectForKey: @"c_classification"] intValue] forUser : userLogin]; - if ([role isEqualToString: @"ComponentViewer"]) - [newInfo setObject: [NSNumber numberWithInt: 1] forKey: @"viewable"]; - else + if ([role isEqualToString: @"ComponentDAndTViewer"]) [newInfo setObject: [NSNumber numberWithInt: 0] forKey: @"viewable"]; + else + [newInfo setObject: [NSNumber numberWithInt: 1] forKey: @"viewable"]; } } @@ -514,6 +522,11 @@ static NSArray *tasksFields = nil; [newInfo setObject: calendarName forKey: @"calendarName"]; + // Split comma-delimited categories + categories = [newInfo objectForKey: @"c_category"]; + if ([categories length]) + [newInfo setObject: [categories componentsSeparatedByString: @","] forKey: @"c_category"]; + // Fix empty title if (![[newInfo objectForKey: @"c_title"] length]) [self _fixComponentTitle: newInfo withType: component]; @@ -892,10 +905,10 @@ static inline iCalPersonPartStat _userStateInEvent (NSArray *event) states = [event objectAtIndex: eventPartStatesIndex]; count = 0; max = [participants count]; + user = [SOGoUser userWithLogin: [event objectAtIndex: eventOwnerIndex] + roles: nil]; while (state == iCalPersonPartStatOther && count < max) { - user = [SOGoUser userWithLogin: [event objectAtIndex: eventOwnerIndex] - roles: nil]; if ([user hasEmail: [participants objectAtIndex: count]]) state = [[states objectAtIndex: count] intValue]; else @@ -933,7 +946,7 @@ static inline iCalPersonPartStat _userStateInEvent (NSArray *event) eventStart = eventEnd; eventEnd = swap; [self warnWithFormat: @"event '%@' has end < start: %d < %d", - [event objectAtIndex: eventNameIndex], eventEnd, eventStart]; + [event objectAtIndex: eventNameIndex], eventEnd, eventStart]; } startSecs = (unsigned int) [startDate timeIntervalSince1970]; @@ -986,21 +999,21 @@ static inline iCalPersonPartStat _userStateInEvent (NSArray *event) currentDay = [blocks objectAtIndex: offset]; } - computedEventEnd = eventEnd; + computedEventEnd = eventEnd; - // We add 5 mins to the end date of an event if the end date - // is equal or smaller than the event's start date. - if (eventEnd <= currentStart) + // We add 5 mins to the end date of an event if the end date + // is equal or smaller than the event's start date. + if (eventEnd <= currentStart) computedEventEnd = currentStart + (5*60); - eventBlock = [self _eventBlockWithStart: currentStart + eventBlock = [self _eventBlockWithStart: currentStart end: computedEventEnd number: number onDay: currentDayStart recurrenceTime: recurrenceTime userState: userState]; - [currentDay addObject: eventBlock]; - } + [currentDay addObject: eventBlock]; + } } } } @@ -1217,7 +1230,7 @@ _computeBlocksPosition (NSArray *blocks) SOGoAppointmentFolder *folder; NSMutableArray *selectedCalendars; NSArray *folders; - NSString *fUID; + NSString *fUID, *fName; NSNumber *isActive; unsigned int count, foldersCount; @@ -1231,7 +1244,11 @@ _computeBlocksPosition (NSArray *blocks) isActive = [NSNumber numberWithBool: [folder isActive]]; if ([isActive intValue] != 0) { fUID = [folder nameInContainer]; - [selectedCalendars addObject: fUID]; + fName = [folder displayName]; + [selectedCalendars addObject: [NSDictionary dictionaryWithObjectsAndKeys: + fUID, @"id", + fName, @"name", + nil]]; } } return selectedCalendars; @@ -1289,9 +1306,10 @@ _computeBlocksPosition (NSArray *blocks) { int count, max; NSArray *events, *event, *calendars; - NSDictionary *eventsBlocks; - NSMutableArray *allDayBlocks, *blocks, *currentDay, *eventsByCalendars, *eventsForCalendar; + NSDictionary *eventsBlocks, *calendar; + NSMutableArray *allDayBlocks, *blocks, *currentDay, *eventsForCalendar, *eventsByCalendars; NSNumber *eventNbr; + NSString *calendarName, *calendarId; BOOL isAllDay; int i, j; @@ -1301,20 +1319,25 @@ _computeBlocksPosition (NSArray *blocks) if ([currentView isEqualToString: @"multicolumndayview"]) { - calendars = [self _selectedCalendars]; + calendars = (NSMutableArray *)[self _selectedCalendars]; eventsByCalendars = [NSMutableArray arrayWithCapacity:[calendars count]]; for (i = 0; i < [calendars count]; i++) // For each calendar { + calendar = [calendars objectAtIndex:i]; + calendarName = [calendar objectForKey: @"name"]; + calendarId = [calendar objectForKey: @"id"]; eventsForCalendar = [NSMutableArray array]; [self _prepareEventBlocks: &blocks withAllDays: &allDayBlocks]; for (j = 0; j < [events count]; j++) { - if ([[[events objectAtIndex:j] objectAtIndex:eventFolderIndex] isEqualToString:[calendars objectAtIndex:i]]) { + if ([[[events objectAtIndex:j] objectAtIndex:eventFolderIndex] isEqualToString: calendarId]) { // Event is in current calendar [eventsForCalendar addObject: [events objectAtIndex:j]]; } } eventsBlocks = [NSDictionary dictionaryWithObjectsAndKeys: - eventsFields, @"eventsFields", + calendarId , @"id", + calendarName, @"calendarName", + eventsFields, @"eventsFields", eventsForCalendar, @"events", allDayBlocks, @"allDayBlocks", blocks, @"blocks", nil]; @@ -1336,8 +1359,7 @@ _computeBlocksPosition (NSArray *blocks) [currentDay sortUsingSelector: @selector (compareEventByStart:)]; [self _addBlocksWidth: currentDay]; } - - [eventsByCalendars insertObject:eventsBlocks atIndex:i]; + [eventsByCalendars addObject: eventsBlocks]; } return [self _responseWithData: eventsByCalendars]; } @@ -1373,7 +1395,7 @@ _computeBlocksPosition (NSArray *blocks) [currentDay sortUsingSelector: @selector (compareEventByStart:)]; [self _addBlocksWidth: currentDay]; } - return [self _responseWithData: eventsBlocks]; + return [self _responseWithData: [NSArray arrayWithObject: eventsBlocks]]; } } diff --git a/UI/Scheduler/UIxCalMainView.m b/UI/Scheduler/UIxCalMainView.m index 2a7a8680a..443fadfa3 100644 --- a/UI/Scheduler/UIxCalMainView.m +++ b/UI/Scheduler/UIxCalMainView.m @@ -46,6 +46,11 @@ @implementation UIxCalMainView +- (NSString *) modulePath +{ + return @"Calendar"; +} + - (void) checkDefaultModulePreference { SOGoUserDefaults *ud; diff --git a/UI/Scheduler/UIxCalMonthView.h b/UI/Scheduler/UIxCalMonthView.h index 431b78f6a..b443815db 100644 --- a/UI/Scheduler/UIxCalMonthView.h +++ b/UI/Scheduler/UIxCalMonthView.h @@ -1,8 +1,6 @@ /* UIxCalMonthView.h - this file is part of SOGo * - * Copyright (C) 2006-2009 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -69,7 +67,6 @@ - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay; - (NSCalendarDate *) currentTableDay; -- (NSString *) labelForCurrentDayCell; @end diff --git a/UI/Scheduler/UIxCalMonthView.m b/UI/Scheduler/UIxCalMonthView.m index c0c51097f..0e0832c22 100644 --- a/UI/Scheduler/UIxCalMonthView.m +++ b/UI/Scheduler/UIxCalMonthView.m @@ -1,8 +1,6 @@ /* UIxCalMonthView.m - this file is part of SOGo * - * Copyright (C) 2006, 2007 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -235,27 +233,6 @@ return currentWeek; } -- (NSString *) labelForCurrentDayCell -{ - NSCalendarDate *lastDayOfMonth; - NSString *label, *monthOfYear; - int dayOfMonth; - - dayOfMonth = [currentTableDay dayOfMonth]; - lastDayOfMonth = [currentTableDay lastDayOfMonth]; - if (dayOfMonth == 1 - || [currentTableDay isDateOnSameDay: lastDayOfMonth]) - { - monthOfYear - = [monthNames objectAtIndex: [currentTableDay monthOfYear]]; - label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear]; - } - else - label = [NSString stringWithFormat: @"%d", dayOfMonth]; - - return label; -} - - (NSString *) headerDayCellClasses { unsigned int dayOfWeek; @@ -265,24 +242,19 @@ return [NSString stringWithFormat: @"headerDay day%d", dayOfWeek]; } -- (NSString *) dayHeaderNumber +- (NSString *) dayHeaderMonth { - NSString *nameOfMonth, *dayHeaderNumber; + NSString *nameOfMonth = nil; unsigned int dayOfMonth; dayOfMonth = [currentTableDay dayOfMonth]; if (dayOfMonth == 1 || [currentTableDay isDateOnSameDay: [currentTableDay lastDayOfMonth]]) { - nameOfMonth - = [self localizedNameForMonthOfYear: [currentTableDay monthOfYear]]; - dayHeaderNumber = [NSString stringWithFormat: @"%d %@", dayOfMonth, - nameOfMonth]; + nameOfMonth = [self localizedNameForMonthOfYear: [currentTableDay monthOfYear]]; } - else - dayHeaderNumber = [NSString stringWithFormat: @"%d", dayOfMonth]; - return dayHeaderNumber; + return nameOfMonth; } - (NSString *) dayCellClasses @@ -299,7 +271,7 @@ [classes appendFormat: @"day weekOf%d week%dof%d day%d", numberOfWeeks, - [weeksToDisplay indexOfObject: currentWeek], + (int)[weeksToDisplay indexOfObject: currentWeek], numberOfWeeks, dayOfWeek]; if (realDayOfWeek == 0 || realDayOfWeek == 6) [classes appendString: @" weekEndDay"]; diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index 813e2e2ad..c49fd8a18 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -49,6 +49,7 @@ static NSArray *layoutItems = nil; - (void) dealloc { [item release]; + [super dealloc]; } - (void) setItem: (NSString *) newItem @@ -68,7 +69,7 @@ static NSArray *layoutItems = nil; - (NSString *) itemPrintLayoutText { - return [self labelForKey: [NSString stringWithFormat: item]]; + return [self labelForKey: [NSString stringWithFormat: @"%@", item]]; } // diff --git a/UI/Scheduler/UIxCalendarProperties.m b/UI/Scheduler/UIxCalendarProperties.m index 40250ba03..ee496d1ff 100644 --- a/UI/Scheduler/UIxCalendarProperties.m +++ b/UI/Scheduler/UIxCalendarProperties.m @@ -68,6 +68,7 @@ * @apiParam {Number} includeInFreeBusy 1 if calendar must be include in freebusy * @apiParam {Number} showCalendarAlarms 1 if alarms must be enabled * @apiParam {Number} showCalendarTasks 1 if tasks must be enabled + * @apiParam {Number} synchronize 1 if we enable EAS synchronization for this calendar * @apiParam {Number} reloadOnLogin 1 if calendar is a Web calendar that must be reload when user logins * @apiParam {Object} [notifications] Notification (if active user is the calendar's owner) * @apiParam {Number} notifications.notifyOnPersonalModifications 1 if a mail is sent for each modification made by the owner @@ -108,6 +109,10 @@ if ([o isKindOfClass: [NSNumber class]]) [calendar setShowCalendarTasks: [o boolValue]]; + o = [params objectForKey: @"synchronize"]; + if ([o isKindOfClass: [NSNumber class]]) + [calendar setSynchronize: [o boolValue]]; + values = [params objectForKey: @"notifications"]; if ([values isKindOfClass: [NSDictionary class]]) { diff --git a/UI/Scheduler/UIxCalendarSelector.m b/UI/Scheduler/UIxCalendarSelector.m index df081ca6c..86a709684 100644 --- a/UI/Scheduler/UIxCalendarSelector.m +++ b/UI/Scheduler/UIxCalendarSelector.m @@ -99,7 +99,7 @@ _intValueFromHex (NSString *hexString) NSNumber *isActive, *fActiveTasks; SOGoAppointmentFolders *co; SOGoAppointmentFolder *folder; - BOOL reloadOnLogin; + BOOL reloadOnLogin, synchronize; if (!calendars) { @@ -133,6 +133,16 @@ _intValueFromHex (NSString *hexString) [calendar setObject: [NSNumber numberWithBool: [folder showCalendarAlarms]] forKey: @"showCalendarAlarms"]; [calendar setObject: [NSNumber numberWithBool: [folder showCalendarTasks]] forKey: @"showCalendarTasks"]; + if ([folder isKindOfClass: [SOGoWebAppointmentFolder class]]) + synchronize = NO; + else + synchronize = [folder synchronize]; + + if ([[folder nameInContainer] isEqualToString: @"personal"]) + synchronize = YES; + + [calendar setObject: [NSNumber numberWithBool: synchronize] forKey: @"synchronize"]; + if ([folder isWebCalendar]) { urls = [NSMutableDictionary dictionaryWithObject: [folder folderPropertyValueInCategory: @"WebCalendars"] diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index a8e67b593..8da53b366 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -896,7 +896,7 @@ static NSArray *reminderValues = nil; content = [NSMutableString string]; response = [context response]; - [content appendFormat: [[self clientObject] contentAsString]]; + [content appendFormat: @"%@", [[self clientObject] contentAsString]]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: content]; diff --git a/UI/Scheduler/UIxRecurrenceEditor.m b/UI/Scheduler/UIxRecurrenceEditor.m index f423fbbe5..7184277e8 100644 --- a/UI/Scheduler/UIxRecurrenceEditor.m +++ b/UI/Scheduler/UIxRecurrenceEditor.m @@ -158,7 +158,7 @@ [shortWeekDaysList retain]; } - id = [NSString stringWithFormat: @"weekDay%i", [shortWeekDaysList indexOfObject: item]]; + id = [NSString stringWithFormat: @"weekDay%i", (int)[shortWeekDaysList indexOfObject: item]]; return id; } diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index e8dabb3af..4a344f2e9 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -182,6 +182,10 @@ actionClass = "UIxCalFolderActions"; actionName = "import"; }; + UIxCalUserRightsEditor = { + protectedBy = "ReadAcls"; + pageName = "UIxCalUserRightsEditor"; + }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxCalUserRightsEditor"; diff --git a/UI/Templates/AdministrationUI/UIxAdministration.wox b/UI/Templates/AdministrationUI/UIxAdministration.wox index 887efd5b6..e9d625fa7 100644 --- a/UI/Templates/AdministrationUI/UIxAdministration.wox +++ b/UI/Templates/AdministrationUI/UIxAdministration.wox @@ -1,40 +1,133 @@ + xmlns:var="http://www.skyrix.com/od/binding" + xmlns:const="http://www.skyrix.com/od/constant" + xmlns:rsrc="OGo:url" + xmlns:label="OGo:label" + className="UIxPageFrame" + title="title" + const:jsFiles="Common.js, Administration.js, + Administration.services.js, Preferences.services.js, + Contacts.services.js, Scheduler.services.js"> -