diff --git a/UI/Templates/ContactsUI/UIxContactViewTemplate.wox b/UI/Templates/ContactsUI/UIxContactViewTemplate.wox index fbb66e50a..bb7c70f3b 100644 --- a/UI/Templates/ContactsUI/UIxContactViewTemplate.wox +++ b/UI/Templates/ContactsUI/UIxContactViewTemplate.wox @@ -56,7 +56,7 @@ + size="40">
diff --git a/UI/Templates/ContactsUI/UIxContactsUserFolders.wox b/UI/Templates/ContactsUI/UIxContactsUserFolders.wox index b8b2e31d7..b7a7c5975 100644 --- a/UI/Templates/ContactsUI/UIxContactsUserFolders.wox +++ b/UI/Templates/ContactsUI/UIxContactsUserFolders.wox @@ -23,8 +23,7 @@
-
diff --git a/UI/Templates/MailerUI/UIxMailEditor.wox b/UI/Templates/MailerUI/UIxMailEditor.wox index 0596911cd..41d288e80 100644 --- a/UI/Templates/MailerUI/UIxMailEditor.wox +++ b/UI/Templates/MailerUI/UIxMailEditor.wox @@ -10,7 +10,7 @@
edit - diff --git a/UI/Templates/MailerUI/UIxMailFolderTemplate.wox b/UI/Templates/MailerUI/UIxMailFolderTemplate.wox index c75b6a3ff..b0a062bd2 100644 --- a/UI/Templates/MailerUI/UIxMailFolderTemplate.wox +++ b/UI/Templates/MailerUI/UIxMailFolderTemplate.wox @@ -168,7 +168,7 @@ ng-show="!currentMessage.selected" ng-click="currentMessage.selected = !currentMessage.selected" sg-email="::currentMessage.from[0].email" - size="48"> + size="40">
diff --git a/UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox b/UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox index 3f39d9c05..0086bff76 100644 --- a/UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox +++ b/UI/Templates/MailerUI/UIxMailUserDelegationEditor.wox @@ -26,7 +26,7 @@
+ size="40">
{{user.cn}}
{{user.c_email}}
diff --git a/UI/Templates/MailerUI/UIxMailViewTemplate.wox b/UI/Templates/MailerUI/UIxMailViewTemplate.wox index b81096f90..54b5c9555 100644 --- a/UI/Templates/MailerUI/UIxMailViewTemplate.wox +++ b/UI/Templates/MailerUI/UIxMailViewTemplate.wox @@ -85,7 +85,7 @@
+ size="40">
diff --git a/UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox b/UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox index 00a402a20..ccac99e4f 100644 --- a/UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox +++ b/UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox @@ -98,7 +98,9 @@ ng-model="::editor.organizer" readonly="true"> -
{{$chip.name}}
+
+ +
{{$chip.name}}
@@ -112,7 +114,9 @@ ng-model="::editor.component.attendees" readonly="true"> -
{{$chip.name}}
+
+ +
{{$chip.name}}
diff --git a/UI/Templates/UIxAclEditor.wox b/UI/Templates/UIxAclEditor.wox index 4a40367d2..fcfa45645 100644 --- a/UI/Templates/UIxAclEditor.wox +++ b/UI/Templates/UIxAclEditor.wox @@ -28,7 +28,7 @@
+ size="40">
diff --git a/UI/WebServerResources/js/Common/Gravatar.service.js b/UI/WebServerResources/js/Common/Gravatar.service.js index 62c4f1079..5a5956940 100644 --- a/UI/WebServerResources/js/Common/Gravatar.service.js +++ b/UI/WebServerResources/js/Common/Gravatar.service.js @@ -27,8 +27,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'; + // return 'https://www.gravatar.com/avatar/' + hash + '?s=' + s + '&d=wavatar'; }; } diff --git a/UI/WebServerResources/js/Common/sgAvatarImage.directive.js b/UI/WebServerResources/js/Common/sgAvatarImage.directive.js index 40b145042..541148041 100644 --- a/UI/WebServerResources/js/Common/sgAvatarImage.directive.js +++ b/UI/WebServerResources/js/Common/sgAvatarImage.directive.js @@ -15,19 +15,36 @@ function sgAvatarImage() { return { restrict: 'AE', - replace: true, scope: { size: '@', email: '=sgEmail', src: '=sgSrc' }, template: '', + link: link, bindToController: true, controller: 'sgAvatarImageController', controllerAs: 'vm' }; } + function link(scope, element, attrs, controller) { + var el = element[0], + className = el.className, + imgElement = element.find('img'), + img = imgElement[0]; + + if (attrs.size) { + imgElement.attr('width', attrs.size); + imgElement.attr('height', attrs.size); + } + + imgElement.bind('error', function() { + // Error while loading external link; insert a generic avatar + controller.insertGenericAvatar(img); + }); + } + /** * @ngInject */ @@ -36,7 +53,18 @@ var vm = this; $scope.$watch('vm.email', function(email) { - if (email && !vm.url) { + 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'); + } vm.url = Gravatar(email, vm.size); } }); @@ -49,6 +77,17 @@ } }); } + + vm.insertGenericAvatar = function(img) { + var avatar; + + if (!vm.genericAvatar) { + avatar = document.createElement('md-icon'); + avatar.className = 'material-icons icon-person'; + img.classList.add('ng-hide'); + vm.genericAvatar = img.parentNode.insertBefore(avatar, img); + } + }; } angular diff --git a/UI/WebServerResources/scss/components/chips/chips.scss b/UI/WebServerResources/scss/components/chips/chips.scss index 281882e73..7ebd91277 100644 --- a/UI/WebServerResources/scss/components/chips/chips.scss +++ b/UI/WebServerResources/scss/components/chips/chips.scss @@ -21,6 +21,20 @@ md-chips { width: (3 * $contact-chip-name-width); } +// Adjust avatar size according to chips dimensions +.md-contact-chips { + .md-chips { + .md-chip { + .md-contact-avatar { + md-icon { + height: ($chip-height * .75); + margin: ($chip-height * .25/2); + } + } + } + } +} + // In the autocompletion menu, don't limit the contact name to a fixed width // and show the email address right after it .md-contact-suggestion { diff --git a/UI/WebServerResources/scss/components/list/list.scss b/UI/WebServerResources/scss/components/list/list.scss index 58593005b..7e29d0606 100644 --- a/UI/WebServerResources/scss/components/list/list.scss +++ b/UI/WebServerResources/scss/components/list/list.scss @@ -42,6 +42,7 @@ md-list-item { .md-tile-left, .md-tile-right { + display: block; border-radius: 100%; padding: $layout-gutter-width; width: $sg-md-grid-pitch + $baseline-grid; @@ -149,17 +150,18 @@ div.md-tile-left { // Avatar placeholder // ------------------------------------ -.md-tile-left:before { +.md-tile-left:before, +.md-tile-left md-icon { font-family: 'Material Icons'; font-size: 40px; color: rgba(0, 0, 0, 0.26); } -.md-tile-left-card { - @extend .md-tile-left; - &:before { - content: "\e7fd"; // person - } -} +//.md-tile-left-card { +// @extend .md-tile-left; +// &:before { +// content: "\e7fd"; // person +// } +//} .md-tile-left-list { @extend .md-tile-left; &:before { @@ -201,9 +203,9 @@ div.md-tile-left { // content: "\e7fd"; // person //} .sg-avatar { - @extend .md-tile-left-card; - margin-right: 0; - margin-left: 0; +// @extend .md-tile-left-card; +// margin-right: 0; +// margin-left: 0; } .sg-list-avatar { @extend .md-tile-left-list;