diff --git a/app/assets/javascripts/discourse/controllers/group.js.es6 b/app/assets/javascripts/discourse/controllers/group.js.es6 index fa85decd35..5f31424533 100644 --- a/app/assets/javascripts/discourse/controllers/group.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group.js.es6 @@ -27,23 +27,13 @@ export default Ember.Controller.extend({ this.get('tabs').forEach(tab => { tab.set('active', showing === tab.get('name')); }); - }, tabs: [ - Tab.create({ - active: true, - name: 'posts', - 'location': 'group.index' - }), - Tab.create({ - name: 'topics' - }), - Tab.create({ - name: 'mentions' - }), - Tab.create({ - name: 'members' - }) + Tab.create({ name: 'posts', active: true, 'location': 'group.index' }), + Tab.create({ name: 'topics' }), + Tab.create({ name: 'mentions' }), + Tab.create({ name: 'members' }), + Tab.create({ name: 'messages' }), ] }); diff --git a/app/assets/javascripts/discourse/controllers/group/members.js.es6 b/app/assets/javascripts/discourse/controllers/group/members.js.es6 index 0391cc4764..246a5f80cd 100644 --- a/app/assets/javascripts/discourse/controllers/group/members.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group/members.js.es6 @@ -1,20 +1,21 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ loading: false, limit: null, offset: null, - isOwner: function() { + @computed('model.owners.@each') + isOwner(owners) { if (this.get('currentUser.admin')) { return true; } - const owners = this.get('model.owners'); const currentUserId = this.get('currentUser.id'); if (currentUserId) { return !!owners.findBy('id', currentUserId); } - }.property('model.owners.@each'), + }, actions: { removeMember(user) { diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index 361eb3ba38..61744e0c67 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -127,8 +127,8 @@ const Group = Discourse.Model.extend({ var data = {}; if (opts.beforePostId) { data.before_post_id = opts.beforePostId; } - return Discourse.ajax(`/groups/${this.get('name')}/${type}.json`, { data: data }).then(function (posts) { - return posts.map(function (p) { + return Discourse.ajax(`/groups/${this.get('name')}/${type}.json`, { data: data }).then(posts => { + return posts.map(p => { p.user = Discourse.User.create(p.user); return Em.Object.create(p); }); diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 index 9e9c0a770f..4797903770 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -51,6 +51,7 @@ export default function() { this.route('topics'); this.route('mentions'); this.route('members'); + this.route('messages'); }); // User routes diff --git a/app/assets/javascripts/discourse/routes/group-messages.js.es6 b/app/assets/javascripts/discourse/routes/group-messages.js.es6 new file mode 100644 index 0000000000..34e077e362 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-messages.js.es6 @@ -0,0 +1,11 @@ +export default Discourse.Route.extend({ + + model() { + return this.modelFor("group").findPosts({type: 'messages'}); + }, + + setupController(controller, model) { + controller.set("model", model); + this.controllerFor("group").set("showing", "messages"); + } +}); diff --git a/app/assets/javascripts/discourse/templates/group.hbs b/app/assets/javascripts/discourse/templates/group.hbs index 22cd3d6fea..c4f91b981a 100644 --- a/app/assets/javascripts/discourse/templates/group.hbs +++ b/app/assets/javascripts/discourse/templates/group.hbs @@ -2,13 +2,12 @@
diff --git a/app/assets/javascripts/discourse/templates/group/index.hbs b/app/assets/javascripts/discourse/templates/group/index.hbs index 8aab2faec6..f6ca3b57f1 100644 --- a/app/assets/javascripts/discourse/templates/group/index.hbs +++ b/app/assets/javascripts/discourse/templates/group/index.hbs @@ -1,5 +1,7 @@
{{#each controller as |post|}} {{group-post post=post}} + {{else}} +
{{i18n "groups.empty.posts"}}
{{/each}}
diff --git a/app/assets/javascripts/discourse/templates/group/members.hbs b/app/assets/javascripts/discourse/templates/group/members.hbs index 7d91ec3e91..ba4715c0d5 100644 --- a/app/assets/javascripts/discourse/templates/group/members.hbs +++ b/app/assets/javascripts/discourse/templates/group/members.hbs @@ -15,27 +15,28 @@ {{/if}} - {{#each model.members as |m|}} - - {{user-small user=m}} - {{#if m.owner}} - {{i18n "groups.owner"}} - {{/if}} - - - {{bound-date m.last_posted_at}} - - - {{bound-date m.last_seen_at}} - - {{#if isOwner}} - - {{#unless m.owner}} - - {{/unless}} + {{#each model.members as |m|}} + + + {{user-small user=m}} + {{#if m.owner}}{{i18n "groups.owner"}}{{/if}} - {{/if}} - - {{/each}} - + + {{bound-date m.last_posted_at}} + + + {{bound-date m.last_seen_at}} + + {{#if isOwner}} + + {{#unless m.owner}} + + {{/unless}} + + {{/if}} + + {{/each}} + +{{else}} +
{{i18n "groups.empty.users"}}
{{/if}} diff --git a/app/assets/javascripts/discourse/templates/group/mentions.hbs b/app/assets/javascripts/discourse/templates/group/mentions.hbs index 49dabf33ef..6d55f86b1d 100644 --- a/app/assets/javascripts/discourse/templates/group/mentions.hbs +++ b/app/assets/javascripts/discourse/templates/group/mentions.hbs @@ -1,6 +1,8 @@
{{#each controller as |post|}} {{group-post post=post}} + {{else}} +
{{i18n "groups.empty.mentions"}}
{{/each}}
diff --git a/app/assets/javascripts/discourse/templates/group/messages.hbs b/app/assets/javascripts/discourse/templates/group/messages.hbs new file mode 100644 index 0000000000..529dcc2cd8 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/group/messages.hbs @@ -0,0 +1,7 @@ +
+ {{#each controller as |post|}} + {{group-post post=post}} + {{else}} +
{{i18n "groups.empty.messages"}}
+ {{/each}} +
diff --git a/app/assets/javascripts/discourse/templates/group/topics.hbs b/app/assets/javascripts/discourse/templates/group/topics.hbs index 8aab2faec6..7293ba917a 100644 --- a/app/assets/javascripts/discourse/templates/group/topics.hbs +++ b/app/assets/javascripts/discourse/templates/group/topics.hbs @@ -1,5 +1,7 @@
{{#each controller as |post|}} {{group-post post=post}} + {{else}} +
{{i18n "groups.empty.topics"}}
{{/each}}
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index f9a7dfcba1..68849d03da 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -6,10 +6,19 @@ class GroupsController < ApplicationController def counts group = find_group(:group_id) - render json: {counts: { posts: group.posts_for(guardian).count, - topics: group.posts_for(guardian).where(post_number: 1).count, - mentions: group.mentioned_posts_for(guardian).count, - members: group.users.count } } + + counts = { + posts: group.posts_for(guardian).count, + topics: group.posts_for(guardian).where(post_number: 1).count, + mentions: group.mentioned_posts_for(guardian).count, + members: group.users.count, + } + + if guardian.can_see_group_messages?(group) + counts[:messages] = group.messages_for(guardian).where(post_number: 1).count + end + + render json: { counts: counts } end def posts @@ -30,6 +39,15 @@ class GroupsController < ApplicationController render_serialized posts.to_a, GroupPostSerializer end + def messages + group = find_group(:group_id) + posts = if guardian.can_see_group_messages?(group) + group.messages_for(guardian, params[:before_post_id]).where(post_number: 1).limit(20).to_a + else + [] + end + render_serialized posts, GroupPostSerializer + end def members group = find_group(:group_id) @@ -114,8 +132,4 @@ class GroupsController < ApplicationController group end - def the_group - @the_group ||= find_group(:group_id) - end - end diff --git a/app/models/group.rb b/app/models/group.rb index 76ae67ded9..9748090a3b 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -85,8 +85,10 @@ class Group < ActiveRecord::Base end def posts_for(guardian, before_post_id=nil) - user_ids = group_users.map {|gu| gu.user_id} - result = Post.where(user_id: user_ids).includes(:user, :topic, :topic => :category).references(:posts, :topics, :category) + user_ids = group_users.map { |gu| gu.user_id } + result = Post.includes(:user, :topic, topic: :category) + .references(:posts, :topics, :category) + .where(user_id: user_ids) .where('topics.archetype <> ?', Archetype.private_message) .where(post_type: Post.types[:regular]) @@ -95,9 +97,21 @@ class Group < ActiveRecord::Base result.order('posts.created_at desc') end + def messages_for(guardian, before_post_id=nil) + result = Post.includes(:user, :topic, topic: :category) + .references(:posts, :topics, :category) + .where('topics.archetype = ?', Archetype.private_message) + .where(post_type: Post.types[:regular]) + .where('topics.id IN (SELECT topic_id FROM topic_allowed_groups WHERE group_id = ?)', self.id) + + result = guardian.filter_allowed_categories(result) + result = result.where('posts.id < ?', before_post_id) if before_post_id + result.order('posts.created_at desc') + end + def mentioned_posts_for(guardian, before_post_id=nil) result = Post.joins(:group_mentions) - .includes(:user, :topic, :topic => :category) + .includes(:user, :topic, topic: :category) .references(:posts, :topics, :category) .where('topics.archetype <> ?', Archetype.private_message) .where(post_type: Post.types[:regular]) @@ -113,9 +127,7 @@ class Group < ActiveRecord::Base end def self.refresh_automatic_group!(name) - - id = AUTO_GROUPS[name] - return unless id + return unless id = AUTO_GROUPS[name] unless group = self.lookup_group(name) group = Group.new(name: name.to_s, automatic: true) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ff728b46b3..4e8946d1bb 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -330,6 +330,12 @@ en: other: "%{count} users" groups: + empty: + posts: "There is no post by members of this group." + members: "There is no member in this group." + mentions: "There is no mention of this group." + messages: "There is no message for this group." + topics: "There is no topic by members of this group." add: "Add" selector_placeholder: "Add members" owner: "owner" diff --git a/config/routes.rb b/config/routes.rb index f542dfc7e4..221215a100 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -344,6 +344,7 @@ Discourse::Application.routes.draw do get 'posts' get 'topics' get 'mentions' + get 'messages' get 'counts' member do diff --git a/lib/guardian/group_guardian.rb b/lib/guardian/group_guardian.rb index 89b829c5fb..8cc3ffa389 100644 --- a/lib/guardian/group_guardian.rb +++ b/lib/guardian/group_guardian.rb @@ -5,7 +5,11 @@ module GroupGuardian # Automatic groups are not represented in the GROUP_USERS # table and thus do not allow membership changes. def can_edit_group?(group) - (group.users.where('group_users.owner').include?(user) || is_admin?) && !group.automatic + (is_admin? || group.users.where('group_users.owner').include?(user)) && !group.automatic + end + + def can_see_group_messages?(group) + is_admin? || group.users.include?(user) end end