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"}} +
+ +
+ {{userSelector usernames=usernames id="group-users" placeholderKey="admin.groups.selector_placeholder" tabindex="1" disabledBinding="automatic"}} +
+
+
+ +
+ {{combobox valueAttribute="value" value=alias_level content=validValues}} +
+
+ {{#unless automatic}} - - {{#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 = $("
" + (itm) + "
"); + 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}} - {{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}}