diff --git a/app/assets/javascripts/discourse/components/image-uploader.js.es6 b/app/assets/javascripts/discourse/components/image-uploader.js.es6 index 095bf6cabe8..52b1112ee42 100644 --- a/app/assets/javascripts/discourse/components/image-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/image-uploader.js.es6 @@ -13,10 +13,7 @@ export default Em.Component.extend(UploadMixin, { this.set('imageUrl', data.result.url); }, - actions: { - trash: function() { - this.set('imageUrl', null); - this.sendAction('clear'); - } + deleteDone: function() { + this.set('imageUrl', null); } }); diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index cde0cadc501..680f4cf4394 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -70,10 +70,6 @@ export default Discourse.ObjectController.extend({ actions: { - clearProfileBackground: function() { - this.get('model').clearProfileBackground(); - }, - save: function() { var self = this; this.setProperties({ saving: true, saved: false }); diff --git a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 index 232e5531378..e9ab1d32ee4 100644 --- a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 @@ -12,17 +12,15 @@ export default Discourse.Controller.extend(Discourse.ModalFunctionality, { local: false, showMore: false, - init: function() { - this._super(); + _initialize: function() { this.setProperties({ local: this.get("allowLocal"), showMore: false }); - }, + }.on('init'), - allowLocal: function() { - return Discourse.SiteSettings.max_attachment_size_kb > 0; - }.property(), + maxSize: Discourse.computed.setting('max_attachment_size_kb'), + allowLocal: Em.computed.gt('maxSize', 0), actions: { useLocal: function() { this.setProperties({ local: true, showMore: false}); }, diff --git a/app/assets/javascripts/discourse/mixins/upload.js.es6 b/app/assets/javascripts/discourse/mixins/upload.js.es6 index 58b864801b8..9560c4ff757 100644 --- a/app/assets/javascripts/discourse/mixins/upload.js.es6 +++ b/app/assets/javascripts/discourse/mixins/upload.js.es6 @@ -6,6 +6,10 @@ export default Em.Mixin.create({ Em.warn("You should implement `uploadDone`"); }, + deleteDone: function() { + Em.warn("You should implement `deleteDone`"); + }, + _initializeUploader: function() { var $upload = this.$('input[type=file]'), // note: we can't cache this as fileupload replaces the input after upload self = this; @@ -49,6 +53,18 @@ export default Em.Mixin.create({ actions: { selectFile: function() { this.$('input[type=file]').click(); + }, + + trash: function() { + var self = this; + Discourse.ajax(this.get('uploadUrl'), { + type: 'DELETE', + data: { image_type: this.get('type') } + }).then(function() { + self.deleteDone(); + }).catch(function() { + bootbox.alert(I18n.t('generic_error')); + }); } } }); diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 23c19acdb16..1e99660aa1a 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -343,19 +343,6 @@ Discourse.User = Discourse.Model.extend({ }); }, - /* - Clear profile background - - @method clearProfileBackground - @returns {Promise} the result of the clear profile background request - */ - clearProfileBackground: function() { - return Discourse.ajax("/users/" + this.get("username_lower") + "/preferences/profile_background/clear", { - type: 'PUT', - data: { } - }); - }, - /** Determines whether the current user is allowed to upload a file. diff --git a/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars b/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars index 87122f1ff94..ff2d172c4dc 100644 --- a/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars +++ b/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars @@ -94,8 +94,7 @@
{{image-uploader uploadUrl=imageUploadUrl imageUrl=profile_background - type="profile_background" - clear="clearProfileBackground"}} + type="profile_background"}}
{{/if}} diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 42030745434..d1faece9b03 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -7,7 +7,7 @@ class UsersController < ApplicationController skip_before_filter :authorize_mini_profiler, only: [:avatar] skip_before_filter :check_xhr, only: [:show, :password_reset, :update, :activate_account, :authorize_email, :user_preferences_redirect, :avatar, :my_redirect] - before_filter :ensure_logged_in, only: [:username, :update, :change_email, :user_preferences_redirect, :upload_user_image, :pick_avatar, :clear_profile_background, :destroy] + before_filter :ensure_logged_in, only: [:username, :update, :change_email, :user_preferences_redirect, :upload_user_image, :pick_avatar, :destroy_user_image, :destroy] before_filter :respond_to_suspicious_request, only: [:create] # we need to allow account creation with bad CSRF tokens, if people are caching, the CSRF token on the @@ -380,11 +380,16 @@ class UsersController < ApplicationController render nothing: true end - def clear_profile_background + def destroy_user_image user = fetch_user_from_params guardian.ensure_can_edit!(user) - user.user_profile.clear_profile_background + image_type = params.require(:image_type) + if image_type == 'profile_background' + user.user_profile.clear_profile_background + else + raise Discourse::InvalidParameters.new(:image_type) + end render nothing: true end diff --git a/config/routes.rb b/config/routes.rb index e3278f4e4d7..333cfb922b1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -203,8 +203,8 @@ Discourse::Application.routes.draw do get "users/:username/avatar(/:size)" => "users#avatar", constraints: {username: USERNAME_ROUTE_FORMAT} # LEGACY ROUTE post "users/:username/preferences/avatar" => "users#upload_avatar", constraints: {username: USERNAME_ROUTE_FORMAT} # LEGACY ROUTE post "users/:username/preferences/user_image" => "users#upload_user_image", constraints: {username: USERNAME_ROUTE_FORMAT} + delete "users/:username/preferences/user_image" => "users#destroy_user_image", constraints: {username: USERNAME_ROUTE_FORMAT} put "users/:username/preferences/avatar/pick" => "users#pick_avatar", constraints: {username: USERNAME_ROUTE_FORMAT} - put "users/:username/preferences/profile_background/clear" => "users#clear_profile_background", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/invited" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT} post "users/:username/send_activation_email" => "users#send_activation_email", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/activity" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT} diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 9018b8148bc..3e73192c10f 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -1269,10 +1269,10 @@ describe UsersController do end - describe '.clear_profile_background' do + describe '.destroy_user_image' do it 'raises an error when not logged in' do - lambda { xhr :put, :clear_profile_background, username: 'asdf' }.should raise_error(Discourse::NotLoggedIn) + lambda { xhr :put, :destroy_user_image, type: 'profile_background', username: 'asdf' }.should raise_error(Discourse::NotLoggedIn) end context 'while logged in' do @@ -1281,12 +1281,20 @@ describe UsersController do it 'raises an error when you don\'t have permission to clear the profile background' do Guardian.any_instance.expects(:can_edit?).with(user).returns(false) - xhr :put, :clear_profile_background, username: user.username + xhr :put, :destroy_user_image, username: user.username, image_type: 'profile_background' response.should be_forbidden end - it 'it successful' do - xhr :put, :clear_profile_background, username: user.username + it "requires the `image_type` param" do + -> { xhr :put, :destroy_user_image, username: user.username }.should raise_error(ActionController::ParameterMissing) + end + + it "only allows certain `image_types`" do + -> { xhr :put, :destroy_user_image, username: user.username, image_type: 'wat' }.should raise_error(Discourse::InvalidParameters) + end + + it 'can clear the profile background' do + xhr :put, :destroy_user_image, image_type: 'profile_background', username: user.username user.reload.user_profile.profile_background.should == "" response.should be_success end