diff --git a/app/assets/javascripts/admin/components/admin-group-selector.js.es6 b/app/assets/javascripts/admin/components/admin-group-selector.js.es6 new file mode 100644 index 000000000..4189beed3 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-group-selector.js.es6 @@ -0,0 +1,34 @@ +export default Ember.Component.extend({ + tagName: 'div', + + didInsertElement: function(){ + this.$("input").select2({ + multiple: true, + width: '100%', + query: function(opts){ + opts.callback({ + results: this.get("available").map(this._format) + }); + }.bind(this) + }).on("change", function(evt) { + if (evt.added){ + this.triggerAction({action: "groupAdded", + actionContext: this.get("available" + ).findBy("id", evt.added.id)}); + } else if (evt.removed) { + this.triggerAction({action:"groupRemoved", + actionContext: this.get("selected" + ).findBy("id", evt.removed.id)}); + } + }.bind(this)); + this._refreshOnReset(); + }, + + _format: function(item){ + return {"text": item.name, "id": item.id, "locked": item.automatic}; + }, + + _refreshOnReset: function() { + this.$("input").select2("data", this.get("selected").map(this._format)); + }.observes("selected") +}); \ No newline at end of file diff --git a/app/assets/javascripts/admin/controllers/admin_user_controller.js b/app/assets/javascripts/admin/controllers/admin_user_controller.js index 50dff9a2f..f909dec1d 100644 --- a/app/assets/javascripts/admin/controllers/admin_user_controller.js +++ b/app/assets/javascripts/admin/controllers/admin_user_controller.js @@ -25,6 +25,10 @@ Discourse.AdminUserIndexController = Discourse.ObjectController.extend({ primaryGroupDirty: Discourse.computed.propertyNotEqual('originalPrimaryGroupId', 'primary_group_id'), + custom_groups: Ember.computed.filter("model.groups", function(g){ + return (!g.automatic && g.visible); + }), + actions: { toggleTitleEdit: function() { this.toggleProperty('editingTitle'); @@ -45,6 +49,18 @@ Discourse.AdminUserIndexController = Discourse.ObjectController.extend({ this.get('model').generateApiKey(); }, + groupAdded: function(added){ + this.get('model').groupAdded(added).catch(function() { + bootbox.alert(I18n.t('generic_error')); + }); + }, + + groupRemoved: function(removed){ + this.get('model').groupRemoved(removed).catch(function() { + bootbox.alert(I18n.t('generic_error')); + }); + }, + savePrimaryGroup: function() { var self = this; Discourse.ajax("/admin/users/" + this.get('id') + "/primary_group", { diff --git a/app/assets/javascripts/admin/models/admin_user.js b/app/assets/javascripts/admin/models/admin_user.js index 981e1be36..62a8fd73c 100644 --- a/app/assets/javascripts/admin/models/admin_user.js +++ b/app/assets/javascripts/admin/models/admin_user.js @@ -23,6 +23,25 @@ Discourse.AdminUser = Discourse.User.extend({ }); }, + groupAdded: function(added){ + var self = this; + return Discourse.ajax("/admin/users/" + this.get('id') + "/groups", { + type: 'POST', + data: {group_id: added.id} + }).then(function () { + self.get('groups').pushObject(added); + }); + }, + + groupRemoved: function(removed){ + var self = this; + return Discourse.ajax("/admin/users/" + this.get('id') + "/groups/" + removed.id, { + type: 'DELETE' + }).then(function () { + self.set('groups.[]', self.get('groups').rejectBy("id", removed.id)); + }); + }, + /** Revokes a user's current API key diff --git a/app/assets/javascripts/admin/routes/admin_user_route.js b/app/assets/javascripts/admin/routes/admin_user_route.js index fd78a5ed6..96af282eb 100644 --- a/app/assets/javascripts/admin/routes/admin_user_route.js +++ b/app/assets/javascripts/admin/routes/admin_user_route.js @@ -23,6 +23,11 @@ Discourse.AdminUserRoute = Discourse.Route.extend({ afterModel: function(adminUser) { var controller = this.controllerFor('adminUser'); + Discourse.Group.findAll().then(function(groups){ + controller.set("availableGroups", groups.filterBy("automatic", false)); + }.bind(this)); + + return adminUser.loadDetails().then(function () { adminUser.setOriginalTrustLevel(); controller.set('model', adminUser); diff --git a/app/assets/javascripts/admin/templates/user_index.js.handlebars b/app/assets/javascripts/admin/templates/user_index.js.handlebars index dddcee603..22d77122a 100644 --- a/app/assets/javascripts/admin/templates/user_index.js.handlebars +++ b/app/assets/javascripts/admin/templates/user_index.js.handlebars @@ -53,20 +53,18 @@