diff --git a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 index af6642bc7..76e2c766f 100644 --- a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 @@ -9,6 +9,23 @@ **/ export default Discourse.Controller.extend(Discourse.ModalFunctionality, { + selectedUploadId: function(){ + switch(this.get("selected")){ + case "system": + return this.get("system_avatar_upload_id"); + break; + case "gravatar": + return this.get("gravatar_avatar_upload_id"); + break; + default: + return this.get("custom_avatar_upload_id"); + } + }.property( + 'selected', + 'system_avatar_upload_id', + 'gravatar_avatar_upload_id', + 'custom_avatar_upload_id'), + actions: { useUploadedAvatar: function() { this.set("selected", "uploaded"); @@ -18,6 +35,16 @@ export default Discourse.Controller.extend(Discourse.ModalFunctionality, { }, useSystem: function() { this.set("selected", "system"); + }, + refreshGravatar: function(){ + var self = this; + self.set("gravatarRefreshDisabled", true); + Discourse + .ajax("/user_avatar/" + this.get("username") + "/refresh_gravatar", {method: 'POST'}) + .then(function(result){ + self.set("gravatarRefreshDisabled", false); + self.set("gravatar_avatar_upload_id", result.upload_id); + }); } } }); diff --git a/app/assets/javascripts/discourse/helpers/application_helpers.js b/app/assets/javascripts/discourse/helpers/application_helpers.js index 6b3bacaf7..f97669ee5 100644 --- a/app/assets/javascripts/discourse/helpers/application_helpers.js +++ b/app/assets/javascripts/discourse/helpers/application_helpers.js @@ -216,25 +216,35 @@ Handlebars.registerHelper('avatar', function(user, options) { /** Bound avatar helper. - Will rerender whenever the "avatar_template" changes. @method boundAvatar @for Handlebars **/ -Ember.Handlebars.registerBoundHelper('boundAvatar', function(user, options) { +Ember.Handlebars.registerBoundHelper('boundAvatar', function(user, size, uploadId) { var username = Em.get(user, 'username'); - console.log(options.hash); + if(arguments.length < 4){ + uploadId = Em.get(user, 'uploaded_avatar_id'); + } - var uploadId = (options.hash.uploadId && Em.get(user, options.hash.uploadId)) || Em.get(user, 'uploaded_avatar_id'); var avatarTemplate = Discourse.User.avatarTemplate(username,uploadId); return new Handlebars.SafeString(Discourse.Utilities.avatarImg({ - size: options.hash.imageSize, + size: size, avatarTemplate: avatarTemplate })); -}, 'uploadId', 'username', 'uploaded_avatar_id'); +}, 'uploaded_avatar_id'); + +/* + * Used when we only have a template + */ +Ember.Handlebars.registerBoundHelper('boundAvatarTemplate', function(avatarTemplate, size) { + return new Handlebars.SafeString(Discourse.Utilities.avatarImg({ + size: size, + avatarTemplate: avatarTemplate + })); +}); /** Nicely format a date without binding or returning HTML diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 5e1138cc1..d1d317bec 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -332,15 +332,12 @@ Discourse.User = Discourse.Model.extend({ /* Change avatar selection - - @method toggleAvatarSelection - @param {Boolean} useUploadedAvatar true if the user is using the uploaded avatar - @returns {Promise} the result of the toggle avatar selection */ - toggleAvatarSelection: function(useUploadedAvatar) { - return Discourse.ajax("/users/" + this.get("username_lower") + "/preferences/avatar/toggle", { + pickAvatar: function(uploadId) { + this.set("uploaded_avatar_id", uploadId); + return Discourse.ajax("/users/" + this.get("username_lower") + "/preferences/avatar/pick", { type: 'PUT', - data: { use_uploaded_avatar: useUploadedAvatar } + data: { upload_id: uploadId } }); }, @@ -403,7 +400,7 @@ Discourse.User = Discourse.Model.extend({ return this.get('can_delete_account') && ((this.get('reply_count')||0) + (this.get('topic_count')||0)) <= 1; }.property('can_delete_account', 'reply_count', 'topic_count'), - delete: function() { + "delete": function() { if (this.get('can_delete_account')) { return Discourse.ajax("/users/" + this.get('username'), { type: 'DELETE', @@ -419,7 +416,7 @@ Discourse.User = Discourse.Model.extend({ Discourse.User.reopenClass(Discourse.Singleton, { avatarTemplate: function(username, uploadedAvatarId){ - return Discourse.getURL("/avatar/" + username.toLowerCase() + "/{size}/" + uploadedAvatarId + ".png"); + return Discourse.getURL("/user_avatar/" + username.toLowerCase() + "/{size}/" + uploadedAvatarId + ".png"); }, /** diff --git a/app/assets/javascripts/discourse/routes/preferences_routes.js b/app/assets/javascripts/discourse/routes/preferences_routes.js index 5108dbd87..2c68967e9 100644 --- a/app/assets/javascripts/discourse/routes/preferences_routes.js +++ b/app/assets/javascripts/discourse/routes/preferences_routes.js @@ -20,30 +20,46 @@ Discourse.PreferencesRoute = Discourse.RestrictedUserRoute.extend({ showAvatarSelector: function() { Discourse.Route.showModal(this, 'avatar-selector'); // all the properties needed for displaying the avatar selector modal - this.controllerFor('avatar-selector').setProperties(this.modelFor('user').getProperties( + var controller = this.controllerFor('avatar-selector'); + var user = this.modelFor('user'); + var props = user.getProperties( 'username', 'email', + 'uploaded_avatar_id', 'system_avatar_upload_id', - 'gravatr_avatar_upload_id', + 'gravatar_avatar_upload_id', 'custom_avatar_upload_id' - ) - ); + ); + + switch(props.uploaded_avatar_id){ + case props.system_avatar_upload_id: + props.selected = "system"; + break; + case props.gravatar_avatar_upload_id: + props.selected = "gravatar"; + break; + default: + props.selected = "uploaded"; + } + + controller.setProperties(props); }, saveAvatarSelection: function() { var user = this.modelFor('user'); var avatarSelector = this.controllerFor('avatar-selector'); + + // sends the information to the server if it has changed - if (avatarSelector.get('use_uploaded_avatar') !== user.get('use_uploaded_avatar')) { - user.toggleAvatarSelection(avatarSelector.get('use_uploaded_avatar')); + if (avatarSelector.get('selectedUploadId') !== user.get('uploaded_avatar_id')) { + user.pickAvatar(avatarSelector.get('selectedUploadId')); } + // saves the data back user.setProperties(avatarSelector.getProperties( - 'has_uploaded_avatar', - 'use_uploaded_avatar', - 'gravatar_template', - 'uploaded_avatar_template' + 'system_avatar_upload_id', + 'gravatar_avatar_upload_id', + 'custom_avatar_upload_id' )); - user.set('avatar_template', avatarSelector.get('avatarTemplate')); avatarSelector.send('closeModal'); }, diff --git a/app/assets/javascripts/discourse/templates/header.js.handlebars b/app/assets/javascripts/discourse/templates/header.js.handlebars index 03a8b76a1..111fbfae2 100644 --- a/app/assets/javascripts/discourse/templates/header.js.handlebars +++ b/app/assets/javascripts/discourse/templates/header.js.handlebars @@ -104,7 +104,7 @@ href="#" title='{{i18n user.avatar.title}}' id="current-user"> - {{boundAvatar currentUser imageSize="medium"}} + {{boundAvatar currentUser "medium"}} {{/if}} diff --git a/app/assets/javascripts/discourse/templates/modal/avatar_selector.js.handlebars b/app/assets/javascripts/discourse/templates/modal/avatar_selector.js.handlebars index a70d12d48..c5295b90f 100644 --- a/app/assets/javascripts/discourse/templates/modal/avatar_selector.js.handlebars +++ b/app/assets/javascripts/discourse/templates/modal/avatar_selector.js.handlebars @@ -2,18 +2,22 @@