diff --git a/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 index a89a97d412..e370efdfaf 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 @@ -7,12 +7,13 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; export default Ember.Controller.extend(CanCheckEmails, PreferencesTabController, { - saveAttrNames: ['name'], + saveAttrNames: ['name', 'title'], canEditName: setting('enable_names'), canSaveUser: true, newNameInput: null, + newTitleInput: null, passwordProgress: null, @@ -30,9 +31,9 @@ export default Ember.Controller.extend(CanCheckEmails, PreferencesTabController, return I18n.t(this.siteSettings.full_name_required ? 'user.name.instructions_required' : 'user.name.instructions'); }, - @computed("model.has_title_badges") - canSelectTitle(hasTitleBadges) { - return this.siteSettings.enable_badges && hasTitleBadges; + @computed('model.availableTitles') + canSelectTitle(availableTitles) { + return availableTitles.length > 0; }, @computed() @@ -52,6 +53,7 @@ export default Ember.Controller.extend(CanCheckEmails, PreferencesTabController, const model = this.get('model'); model.set('name', this.get('newNameInput')); + model.set('title', this.get('newTitleInput')); return model.save(this.get('saveAttrNames')).then(() => { this.set('saved', true); diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index 5816cd2642..6663fc9050 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -218,6 +218,7 @@ const User = RestModel.extend({ 'website', 'location', 'name', + 'title', 'locale', 'custom_fields', 'user_fields', @@ -569,6 +570,25 @@ const User = RestModel.extend({ canManageGroup(group) { return group.get('automatic') ? false : (this.get('admin') || group.get('is_group_owner')); + }, + + @computed('groups.@each.title', 'badges.@each') + availableTitles() { + let titles = []; + + _.each(this.get('groups'), group => { + if (group.get('title')) { + titles.push(group.get('title')); + } + }); + + _.each(this.get('badges'), badge => { + if (badge.get('allow_title')) { + titles.push(badge.get('name')); + } + }); + + return titles; } }); diff --git a/app/assets/javascripts/discourse/routes/preferences-account.js.es6 b/app/assets/javascripts/discourse/routes/preferences-account.js.es6 index bde67c6ce9..b5e574c772 100644 --- a/app/assets/javascripts/discourse/routes/preferences-account.js.es6 +++ b/app/assets/javascripts/discourse/routes/preferences-account.js.es6 @@ -1,13 +1,23 @@ +import UserBadge from 'discourse/models/user-badge'; import RestrictedUserRoute from "discourse/routes/restricted-user"; export default RestrictedUserRoute.extend({ showFooter: true, + model: function() { + const user = this.modelFor('user'); + return UserBadge.findByUsername(this.modelFor('user').get('username')).then(userBadges => { + user.set('badges', userBadges.map(ub => ub.badge)); + return user; + }); + }, + setupController(controller, user) { controller.reset(); controller.setProperties({ model: user, - newNameInput: user.get('name') + newNameInput: user.get('name'), + newTitleInput: user.get('title') }); } }); diff --git a/app/assets/javascripts/discourse/templates/preferences/account.hbs b/app/assets/javascripts/discourse/templates/preferences/account.hbs index 6862fac382..c9a6b01105 100644 --- a/app/assets/javascripts/discourse/templates/preferences/account.hbs +++ b/app/assets/javascripts/discourse/templates/preferences/account.hbs @@ -100,8 +100,10 @@