From 403d6fa54f1d8765ccb3b5446c225275d37685d3 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 27 Nov 2015 16:04:12 -0500 Subject: [PATCH] (feat) you can now select your alternate avatar --- SoObjects/SOGo/SOGoDefaults.plist | 1 + SoObjects/SOGo/SOGoUserDefaults.h | 3 ++ SoObjects/SOGo/SOGoUserDefaults.m | 10 ++++++ .../English.lproj/Localizable.strings | 7 ++++ UI/PreferencesUI/UIxJSONPreferences.m | 3 ++ UI/PreferencesUI/UIxPreferences.m | 12 +++++++ UI/Templates/PreferencesUI/UIxPreferences.wox | 11 +++++++ .../js/Common/Gravatar.service.js | 11 ++++--- .../js/Common/sgAvatarImage.directive.js | 33 ++++++++++--------- 9 files changed, 71 insertions(+), 20 deletions(-) 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/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/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 12e4dc386..990522a71 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -344,3 +344,10 @@ "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Password change is not supported."; "Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; + +/* Avatars */ +"none" = "None"; +"identicon" = "Ident Icon"; +"monsterid" = "Monster"; +"wavatar" = "Wavatar"; +"retro" = "Retro"; \ No newline at end of file diff --git a/UI/PreferencesUI/UIxJSONPreferences.m b/UI/PreferencesUI/UIxJSONPreferences.m index ed6c2f95f..8a7dd9418 100644 --- a/UI/PreferencesUI/UIxJSONPreferences.m +++ b/UI/PreferencesUI/UIxJSONPreferences.m @@ -96,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 9a4adf36c..2213dd9a6 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1380,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; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 18e4a9a13..24ae11631 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -185,6 +185,17 @@ + + + + + + + + + + + diff --git a/UI/WebServerResources/js/Common/Gravatar.service.js b/UI/WebServerResources/js/Common/Gravatar.service.js index 5a5956940..3c9f37832 100644 --- a/UI/WebServerResources/js/Common/Gravatar.service.js +++ b/UI/WebServerResources/js/Common/Gravatar.service.js @@ -8,10 +8,11 @@ * @memberof SOGo.Common * @param {string} email * @param {number} [size] - the size of the image + * @param {string} alternate avatar to use * @ngInject */ function Gravatar() { - return function(email, size) { + return function(email, size, alternate_avatar) { var x, y, hash, s = size; if (!email) { return ''; @@ -27,10 +28,10 @@ } hash = email.md5(); - return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=404'; - //return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=retro'; - // return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=identicon'; - // return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=wavatar'; + if (alternate_avatar == "none") + alternate_avatar = "404"; + + return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=' + alternate_avatar; }; } diff --git a/UI/WebServerResources/js/Common/sgAvatarImage.directive.js b/UI/WebServerResources/js/Common/sgAvatarImage.directive.js index 541148041..13efe3fb9 100644 --- a/UI/WebServerResources/js/Common/sgAvatarImage.directive.js +++ b/UI/WebServerResources/js/Common/sgAvatarImage.directive.js @@ -48,25 +48,28 @@ /** * @ngInject */ - sgAvatarImageController.$inject = ['$scope', '$element', 'Gravatar']; - function sgAvatarImageController($scope, $element, Gravatar) { + sgAvatarImageController.$inject = ['$scope', '$element', 'Preferences', 'Gravatar']; + function sgAvatarImageController($scope, $element, Preferences, Gravatar) { var vm = this; $scope.$watch('vm.email', function(email) { - var img = $element.find('img')[0]; - if (!email && !vm.genericAvatar) { - // If no email is specified, insert a generic avatar - vm.insertGenericAvatar(img); - } - else if (email && !vm.url) { - if (vm.genericAvatar) { - // Remove generic avatar and restore visibility of image - vm.genericAvatar.parentNode.removeChild(vm.genericAvatar); - delete vm.genericAvatar; - img.classList.remove('ng-hide'); + + Preferences.ready().then(function() { + var img = $element.find('img')[0]; + if (!email && !vm.genericAvatar) { + // If no email is specified, insert a generic avatar + vm.insertGenericAvatar(img); } - vm.url = Gravatar(email, vm.size); - } + else if (email && !vm.url) { + if (vm.genericAvatar) { + // Remove generic avatar and restore visibility of image + vm.genericAvatar.parentNode.removeChild(vm.genericAvatar); + delete vm.genericAvatar; + img.classList.remove('ng-hide'); + } + vm.url = Gravatar(email, vm.size, Preferences.defaults.SOGoAlternateAvatar); + } + }); }); // If sg-src is defined, watch the expression for the URL of a local image