diff --git a/app/assets/javascripts/discourse/components/group_selector_component.js b/app/assets/javascripts/discourse/components/group_selector_component.js new file mode 100644 index 00000000000..597634a8138 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group_selector_component.js @@ -0,0 +1,52 @@ +Discourse.GroupSelectorComponent = Em.Component.extend({ + placeholder: function(){ + return I18n.t(this.get("placeholderKey")); + }.property("placeholderKey"), + + didInsertElement: function() { + var self = this; + var selectedGroups; + + self.$('input').autocomplete({ + allowAny: false, + onChangeItems: function(items){ + selectedGroups = items; + self.set("groupNames", items.join(",")); + }, + transformComplete: function(g) { + return g.name; + }, + dataSource: function(term) { + return Discourse.Group.findAll({search: term, ignore_automatic: true}).then(function(groups){ + if(!selectedGroups){ + return groups; + } + + return groups.filter(function(group){ + return !selectedGroups.any(function(s){return s === group.name}); + }); + }); + }, + template: Discourse.GroupSelectorComponent.templateFunction() + }); + } +}); + +// TODO autocomplete should become an ember component, then we don't need this +Discourse.GroupSelectorComponent.reopenClass({ + templateFunction: function() { + this.compiled = this.compiled || Handlebars.compile( + "
" + + "" + + "
" + ); + + return this.compiled; + } +}); diff --git a/app/assets/javascripts/discourse/controllers/invite-private.js.es6 b/app/assets/javascripts/discourse/controllers/invite-private.js.es6 index 53d60e36c60..dfe32be7f6d 100644 --- a/app/assets/javascripts/discourse/controllers/invite-private.js.es6 +++ b/app/assets/javascripts/discourse/controllers/invite-private.js.es6 @@ -10,6 +10,10 @@ export default Discourse.ObjectController.extend(Discourse.ModalFunctionality, { modalClass: 'invite', + isAdmin: function(){ + return Discourse.User.currentProp("admin"); + }.property(), + onShow: function(){ this.set('controllers.modal.modalClass', 'invite-modal'); this.set('emailOrUsername', ''); diff --git a/app/assets/javascripts/discourse/controllers/invite.js.es6 b/app/assets/javascripts/discourse/controllers/invite.js.es6 index 5e80c1fec28..aab9b5ea6fc 100644 --- a/app/assets/javascripts/discourse/controllers/invite.js.es6 +++ b/app/assets/javascripts/discourse/controllers/invite.js.es6 @@ -9,6 +9,10 @@ **/ export default Discourse.ObjectController.extend(Discourse.ModalFunctionality, { + isAdmin: function(){ + return Discourse.User.currentProp("admin"); + }.property(), + /** Can we submit the form? @@ -89,8 +93,10 @@ export default Discourse.ObjectController.extend(Discourse.ModalFunctionality, { if (this.get('disabled')) { return; } var self = this; + var groupNames = this.get("groupNames"); + this.setProperties({ saving: true, error: false }); - this.get('model').createInvite(this.get('email')).then(function() { + this.get('model').createInvite(this.get('email'), groupNames).then(function() { self.setProperties({ saving: false, finished: true }); }).catch(function() { self.setProperties({ saving: false, error: true }); diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js b/app/assets/javascripts/discourse/lib/autocomplete.js index e3cf8627ead..c3222cf3a3d 100644 --- a/app/assets/javascripts/discourse/lib/autocomplete.js +++ b/app/assets/javascripts/discourse/lib/autocomplete.js @@ -244,7 +244,6 @@ $.fn.autocomplete = function(options) { } }; - // chain to allow multiples var oldClose = me.data("closeAutocomplete"); me.data("closeAutocomplete", function() { diff --git a/app/assets/javascripts/discourse/models/group.js b/app/assets/javascripts/discourse/models/group.js index 3ef5edc94df..669c8f698f8 100644 --- a/app/assets/javascripts/discourse/models/group.js +++ b/app/assets/javascripts/discourse/models/group.js @@ -72,8 +72,8 @@ Discourse.Group = Discourse.Model.extend({ }); Discourse.Group.reopenClass({ - findAll: function(){ - return Discourse.ajax("/admin/groups.json").then(function(groups){ + findAll: function(opts){ + return Discourse.ajax("/admin/groups.json", { data: opts }).then(function(groups){ return groups.map(function(g) { return Discourse.Group.create(g); }); }); }, diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js index 11bd7c21504..5d25f25baf5 100644 --- a/app/assets/javascripts/discourse/models/topic.js +++ b/app/assets/javascripts/discourse/models/topic.js @@ -217,10 +217,10 @@ Discourse.Topic = Discourse.Model.extend({ @method createInvite @param {String} emailOrUsername The email or username of the user to be invited **/ - createInvite: function(emailOrUsername) { + createInvite: function(emailOrUsername, groupNames) { return Discourse.ajax("/t/" + this.get('id') + "/invite", { type: 'POST', - data: { user: emailOrUsername } + data: { user: emailOrUsername, group_names: groupNames } }); }, diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 3e401639a6a..4f1d57c7f6d 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -375,10 +375,10 @@ Discourse.User = Discourse.Model.extend({ @param {String} email The email address of the user to invite to the site @returns {Promise} the result of the server call **/ - createInvite: function(email) { + createInvite: function(email, groupNames) { return Discourse.ajax('/invites', { type: 'POST', - data: {email: email} + data: {email: email, group_names: groupNames} }); }, diff --git a/app/assets/javascripts/discourse/templates/components/group-selector.js.handlebars b/app/assets/javascripts/discourse/templates/components/group-selector.js.handlebars new file mode 100644 index 00000000000..5bc39ab4676 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/group-selector.js.handlebars @@ -0,0 +1 @@ + diff --git a/app/assets/javascripts/discourse/templates/modal/invite.js.handlebars b/app/assets/javascripts/discourse/templates/modal/invite.js.handlebars index 07065975ceb..1d24dd64480 100644 --- a/app/assets/javascripts/discourse/templates/modal/invite.js.handlebars +++ b/app/assets/javascripts/discourse/templates/modal/invite.js.handlebars @@ -1,4 +1,4 @@ -