From 41b0fbe001340796f48fe993f4e40e8df10b576e Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 19 Mar 2018 18:28:57 +0800 Subject: [PATCH] UX: Indicate user's group membership on groups page. --- .../components/group-membership-button.js.es6 | 6 +-- .../discourse/templates/groups.hbs | 12 +++++- .../stylesheets/common/base/groups.scss | 6 +++ app/controllers/groups_controller.rb | 15 +++++--- app/serializers/basic_group_serializer.rb | 38 ++++++++++++++++--- config/locales/client.en.yml | 1 + spec/requests/groups_controller_spec.rb | 9 +++-- 7 files changed, 69 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 index 99c5273e09b..df22b7e429c 100644 --- a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 +++ b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 @@ -13,12 +13,12 @@ export default Ember.Component.extend({ return publicExit && userIsGroupUser; }, - @computed("model.is_group_user", "model.id", "groupUserIds") - userIsGroupUser(isGroupUser, groupId, groupUserIds) { + @computed("model.is_group_user") + userIsGroupUser(isGroupUser) { if (isGroupUser !== undefined) { return isGroupUser; } else { - return !!groupUserIds && groupUserIds.includes(groupId); + return false; } }, diff --git a/app/assets/javascripts/discourse/templates/groups.hbs b/app/assets/javascripts/discourse/templates/groups.hbs index 857d8161d00..1bf0ddce3b2 100644 --- a/app/assets/javascripts/discourse/templates/groups.hbs +++ b/app/assets/javascripts/discourse/templates/groups.hbs @@ -14,6 +14,7 @@ {{directory-toggle field="user_count" labelKey="groups.user_count" order=order asc=asc}} {{i18n "groups.membership"}} + @@ -52,7 +53,6 @@ {{#group-membership-button model=group showMembershipStatus=true - groupUserIds=groups.extras.group_user_ids showLogin='showLogin'}} {{d-button icon="ban" @@ -60,6 +60,16 @@ disabled=true}} {{/group-membership-button}} + + + {{#if group.is_group_user}} + {{d-icon "user" title="groups.is_group_user"}} + {{/if}} + + {{#if group.is_group_owner}} + {{d-icon "shield" title="groups.is_group_owner"}} + {{/if}} + {{/each}} diff --git a/app/assets/stylesheets/common/base/groups.scss b/app/assets/stylesheets/common/base/groups.scss index a547ec332d9..c9580a23110 100644 --- a/app/assets/stylesheets/common/base/groups.scss +++ b/app/assets/stylesheets/common/base/groups.scss @@ -34,6 +34,12 @@ padding: 0.8em; } + td.group-user-status { + i { + color: $primary; + } + } + td.groups-user-count { font-size: $font-up-2 } diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 306cf062e28..4e38158bee2 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -40,13 +40,18 @@ class GroupsController < ApplicationController Group.preload_custom_fields(groups, Group.preloaded_custom_field_names) end - group_user_ids = GroupUser.where(group: groups, user: current_user).pluck(:group_id) + if current_user + group_users = GroupUser.where(group: groups, user: current_user) + user_group_ids = group_users.pluck(:group_id) + owner_group_ids = group_users.where(owner: true).pluck(:group_id) + end render_json_dump( - groups: serialize_data(groups, BasicGroupSerializer), - extras: { - group_user_ids: group_user_ids - }, + groups: serialize_data(groups, + BasicGroupSerializer, + user_group_ids: user_group_ids || [], + owner_group_ids: owner_group_ids || [] + ), total_rows_groups: count, load_more_groups: groups_path(page: page + 1) ) diff --git a/app/serializers/basic_group_serializer.rb b/app/serializers/basic_group_serializer.rb index a09bce0d3ba..095324ca330 100644 --- a/app/serializers/basic_group_serializer.rb +++ b/app/serializers/basic_group_serializer.rb @@ -24,7 +24,9 @@ class BasicGroupSerializer < ApplicationSerializer :allow_membership_requests, :full_name, :default_notification_level, - :membership_request_template + :membership_request_template, + :is_group_user, + :is_group_owner def include_display_name? object.automatic @@ -40,17 +42,41 @@ class BasicGroupSerializer < ApplicationSerializer staff? end - def include_has_messages + def include_has_messages? staff? end - def include_bio_raw + def include_bio_raw? staff? end + def include_is_group_user? + user_group_ids.present? + end + + def is_group_user + user_group_ids.include?(object.id) + end + + def include_is_group_owner? + owner_group_ids.present? + end + + def is_group_owner + owner_group_ids.include?(object.id) + end + private - def staff? - @staff ||= scope.is_staff? - end + def staff? + @staff ||= scope.is_staff? + end + + def user_group_ids + @options[:user_group_ids] + end + + def owner_group_ids + @options[:owner_group_ids] + end end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 73bbb6b977b..ccba6daa66b 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -437,6 +437,7 @@ en: automatic_group: Automatic Group closed_group: Closed Group is_group_user: "You are a member of this group" + is_group_owner: "You are an owner of this group" allow_membership_requests: "Allow users to send membership requests to group owners" membership_request_template: "Custom template to display to users when sending a membership request" membership_request: diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index 8b90e461c7e..b30e1f519c4 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -77,7 +77,6 @@ describe GroupsController do group_ids = response_body["groups"].map { |g| g["id"] } - expect(response_body["extras"]["group_user_ids"]).to eq([]) expect(group_ids).to include(group.id) expect(group_ids).to_not include(staff_group.id) expect(response_body["load_more_groups"]).to eq("/groups?page=1") @@ -89,6 +88,7 @@ describe GroupsController do admin = Fabricate(:admin) sign_in(admin) group.add(admin) + group.add_owner(admin) get "/groups.json" @@ -97,8 +97,10 @@ describe GroupsController do response_body = JSON.parse(response.body) group_ids = response_body["groups"].map { |g| g["id"] } + group_body = response_body["groups"].find { |g| g["id"] == group.id } - expect(response_body["extras"]["group_user_ids"]).to eq([group.id]) + expect(group_body["is_group_user"]).to eq(true) + expect(group_body["is_group_owner"]).to eq(true) expect(group_ids).to include(group.id, staff_group.id) expect(response_body["load_more_groups"]).to eq("/groups?page=1") expect(response_body["total_rows_groups"]).to eq(10) @@ -301,7 +303,8 @@ describe GroupsController do members = JSON.parse(response.body)["members"] - expect(members.map { |m| m["id"] }).to eq([user1.id, user2.id, user3.id]) + expect(members.map { |m| m["id"] }) + .to contain_exactly(user1.id, user2.id, user3.id) end end