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 @@
{{#each tabs as |tab|}}
- -
- {{#link-to tab.location model}}{{tab.name}}
- {{#if tab.count}}
- ({{tab.count}})
- {{/if}}
- {{/link-to}}
-
+ -
+ {{#link-to tab.location model}}
+ {{tab.name}}
+ {{#if tab.count}}({{tab.count}}){{/if}}
+ {{/link-to}}
+
{{/each}}
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