diff --git a/app/assets/javascripts/admin/models/group.js b/app/assets/javascripts/admin/models/group.js
index ce556edd8..cc13392fd 100644
--- a/app/assets/javascripts/admin/models/group.js
+++ b/app/assets/javascripts/admin/models/group.js
@@ -1,6 +1,15 @@
Discourse.Group = Discourse.Model.extend({
loaded: false,
+
+ ALIAS_LEVELS : {
+ "nobody": 0,
+ "only_admins": 1,
+ "mods_and_admins": 2,
+ "members_mods_and_admins": 3,
+ "everyone": 99
+ },
+
userCountDisplay: function(){
var c = this.get('user_count');
// don't display zero its ugly
@@ -35,6 +44,16 @@ Discourse.Group = Discourse.Model.extend({
return usernames;
}.property('users'),
+ validValues: function() {
+ return Em.A([
+ { name: I18n.t("admin.groups.alias_levels.nobody"), value: this.ALIAS_LEVELS.nobody},
+ { name: I18n.t("admin.groups.alias_levels.only_admins"), value: this.ALIAS_LEVELS.only_admins},
+ { name: I18n.t("admin.groups.alias_levels.mods_and_admins"), value: this.ALIAS_LEVELS.mods_and_admins},
+ { name: I18n.t("admin.groups.alias_levels.members_mods_and_admins"), value: this.ALIAS_LEVELS.members_mods_and_admins},
+ { name: I18n.t("admin.groups.alias_levels.everyone"), value: this.ALIAS_LEVELS.everyone}
+ ]);
+ }.property(),
+
destroy: function(){
if(!this.id) return;
@@ -58,6 +77,7 @@ Discourse.Group = Discourse.Model.extend({
return Discourse.ajax("/admin/groups", {type: "POST", data: {
group: {
name: this.get('name'),
+ alias_level: this.get('alias_level'),
usernames: this.get('usernames')
}
}}).then(function(resp) {
@@ -83,6 +103,7 @@ Discourse.Group = Discourse.Model.extend({
data: {
group: {
name: this.get('name'),
+ alias_level: this.get('alias_level'),
usernames: this.get('usernames')
}
},
diff --git a/app/assets/javascripts/admin/templates/groups.js.handlebars b/app/assets/javascripts/admin/templates/groups.js.handlebars
index cfff5e5a2..79b3c6610 100644
--- a/app/assets/javascripts/admin/templates/groups.js.handlebars
+++ b/app/assets/javascripts/admin/templates/groups.js.handlebars
@@ -24,15 +24,23 @@
{{textField value=name placeholderKey="admin.groups.name_placeholder"}}
{{/if}}
- {{userSelector usernames=usernames id="group-users" placeholderKey="admin.groups.selector_placeholder" tabindex="1" disabledBinding="automatic"}}
+
+
Group members
+
+
+ {{userSelector usernames=usernames id="group-users" placeholderKey="admin.groups.selector_placeholder" tabindex="1" disabledBinding="automatic"}}
+
+
+
+
{{i18n admin.groups.alias_levels.title}}
+
+ {{combobox valueAttribute="value" value=alias_level content=validValues}}
+
+
+
{{i18n admin.customize.save}}
{{#unless automatic}}
-
{{i18n admin.customize.save}}
- {{#if id}}
{{i18n admin.customize.delete}}
- {{/if}}
- {{else}}
- {{i18n admin.groups.can_not_edit_automatic}}
{{/unless}}
{{/with}}
diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js b/app/assets/javascripts/discourse/lib/autocomplete.js
index 6c181deee..98fe2641c 100644
--- a/app/assets/javascripts/discourse/lib/autocomplete.js
+++ b/app/assets/javascripts/discourse/lib/autocomplete.js
@@ -92,19 +92,26 @@ $.fn.autocomplete = function(options) {
// dump what we have in single mode, just in case
inputSelectedItems = [];
}
- var d = $("" + (transformed || item) + " ");
- var prev = me.parent().find('.item:last');
- if (prev.length === 0) {
- me.parent().prepend(d);
- } else {
- prev.after(d);
+ if (!_.isArray(transformed)) {
+ transformed = [transformed || item];
}
- inputSelectedItems.push(item);
+ var divs = transformed.map(function(itm) {
+ var d = $("");
+ var prev = me.parent().find('.item:last');
+ if (prev.length === 0) {
+ me.parent().prepend(d);
+ } else {
+ prev.after(d);
+ }
+ inputSelectedItems.push(itm);
+ return divs;
+ });
+
if (options.onChangeItems) {
options.onChangeItems(inputSelectedItems);
}
- d.find('a').click(function() {
+ $(divs).find('a').click(function() {
closeAutocomplete();
inputSelectedItems.splice($.inArray(item, inputSelectedItems), 1);
$(this).parent().parent().remove();
diff --git a/app/assets/javascripts/discourse/lib/user_search.js b/app/assets/javascripts/discourse/lib/user_search.js
index 3a8aae6dd..c0a11c80f 100644
--- a/app/assets/javascripts/discourse/lib/user_search.js
+++ b/app/assets/javascripts/discourse/lib/user_search.js
@@ -9,11 +9,12 @@ var cache = {};
var cacheTopicId = null;
var cacheTime = null;
-var debouncedSearch = Discourse.debouncePromise(function(term, topicId) {
+var debouncedSearch = Discourse.debouncePromise(function(term, topicId, include_groups) {
return Discourse.ajax('/users/search/users', {
data: {
term: term,
- topic_id: topicId
+ topic_id: topicId,
+ include_groups: include_groups
}
}).then(function (r) {
cache[term] = r;
@@ -26,6 +27,7 @@ Discourse.UserSearch = {
search: function(options) {
var term = options.term || "";
+ var include_groups = options.include_groups || false;
var exclude = options.exclude || [];
var topicId = options.topicId;
var limit = options.limit || 5;
@@ -46,21 +48,35 @@ Discourse.UserSearch = {
cacheTopicId = topicId;
var organizeResults = function(r) {
- var result = [];
+ var users = [], groups = [], results = [];
_.each(r.users,function(u) {
if (exclude.indexOf(u.username) === -1) {
- result.push(u);
+ users.push(u);
+ results.push(u);
}
- if (result.length > limit) return false;
+ if (results.length > limit) return false;
return true;
});
- promise.resolve(result);
+
+ _.each(r.groups,function(g) {
+ if (results.length > limit) return false;
+ if (exclude.indexOf(g.name) === -1) {
+ groups.push(g);
+ results.push(g);
+ }
+ return true;
+ });
+
+ results.users = users;
+ results.groups = groups;
+
+ promise.resolve(results);
};
if (cache[term]) {
organizeResults(cache[term]);
} else {
- debouncedSearch(term, topicId).then(organizeResults);
+ debouncedSearch(term, topicId, include_groups).then(organizeResults);
}
return promise;
}
diff --git a/app/assets/javascripts/discourse/templates/composer.js.handlebars b/app/assets/javascripts/discourse/templates/composer.js.handlebars
index c188611cc..d0c8c9bb4 100644
--- a/app/assets/javascripts/discourse/templates/composer.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/composer.js.handlebars
@@ -28,6 +28,7 @@
{{userSelector topicId=controller.controllers.topic.model.id
excludeCurrentUser="true"
id="private-message-users"
+ include_groups="true"
class="span8"
placeholderKey="composer.users_placeholder"
tabindex="1"
diff --git a/app/assets/javascripts/discourse/templates/modal/invite_private.js.handlebars b/app/assets/javascripts/discourse/templates/modal/invite_private.js.handlebars
index a427dc0ac..4fab3aa18 100644
--- a/app/assets/javascripts/discourse/templates/modal/invite_private.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/modal/invite_private.js.handlebars
@@ -10,7 +10,7 @@
{{i18n topic.invite_private.success}}
{{else}}
{{i18n topic.invite_private.email_or_username}}
- {{userSelector single=true allowAny=true usernames=emailOrUsername placeholderKey="topic.invite_private.email_or_username_placeholder"}}
+ {{userSelector single=true allowAny=true usernames=emailOrUsername include_groups="true" placeholderKey="topic.invite_private.email_or_username_placeholder"}}
{{/if}}