(feat) you can now select your alternate avatar
parent
39455a283a
commit
403d6fa54f
|
@ -58,6 +58,7 @@
|
|||
SOGoMailDomain = "localhost";
|
||||
SOGoSelectedAddressBook = "collected";
|
||||
SOGoRefreshViewCheck = "manually";
|
||||
SOGoAlternateAvatar = "none";
|
||||
SOGoMailMessageForwarding = "inline";
|
||||
SOGoMailReplyPlacement = "below";
|
||||
SOGoMailSignaturePlacement = "below";
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"];
|
||||
|
|
|
@ -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";
|
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -185,6 +185,17 @@
|
|||
</var:foreach>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
|
||||
<md-input-container>
|
||||
<label><var:string label:value="Alternate Avatar"/></label>
|
||||
<md-select ng-model="app.preferences.defaults.SOGoAlternateAvatar">
|
||||
<var:foreach list="alternateAvatar" item="item">
|
||||
<md-option var:value="item">
|
||||
<var:string value="itemAlternateAvatarText"/>
|
||||
</md-option>
|
||||
</var:foreach>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
</div>
|
||||
</md-content>
|
||||
</md-tab>
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue