diff --git a/app/assets/javascripts/discourse/lib/transform-post.js b/app/assets/javascripts/discourse/lib/transform-post.js
index 09cb6d967c..585bb02af3 100644
--- a/app/assets/javascripts/discourse/lib/transform-post.js
+++ b/app/assets/javascripts/discourse/lib/transform-post.js
@@ -139,6 +139,10 @@ export default function transformPost(
}
}
+ if (post.post_number === 1 && topic.requested_group_name) {
+ postAtts.requestedGroupName = topic.requested_group_name;
+ }
+
const showPMMap =
topic.archetype === "private_message" && post.post_number === 1;
if (showPMMap) {
diff --git a/app/assets/javascripts/discourse/widgets/post.js b/app/assets/javascripts/discourse/widgets/post.js
index bd84bfb428..c6fc4f3319 100644
--- a/app/assets/javascripts/discourse/widgets/post.js
+++ b/app/assets/javascripts/discourse/widgets/post.js
@@ -344,6 +344,22 @@ createWidget("expand-post-button", {
}
});
+createWidget("post-group-request", {
+ buildKey: attrs => `post-group-request-${attrs.id}`,
+
+ buildClasses() {
+ return ["group-request"];
+ },
+
+ html(attrs) {
+ const href = Discourse.getURL(
+ "/g/" + attrs.requestedGroupName + "/requests?filter=" + attrs.username
+ );
+
+ return h("a", { attributes: { href } }, I18n.t("groups.requests.handle"));
+ }
+});
+
createWidget("post-contents", {
buildKey: attrs => `post-contents-${attrs.id}`,
@@ -366,6 +382,11 @@ createWidget("post-contents", {
let result = [
new PostCooked(attrs, new DecoratorHelper(this), this.currentUser)
];
+
+ if (attrs.requestedGroupName) {
+ result.push(this.attach("post-group-request", attrs));
+ }
+
result = result.concat(applyDecorators(this, "after-cooked", attrs, state));
if (attrs.cooked_hidden) {
diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss
index b458f04e37..2f028e3c5d 100644
--- a/app/assets/stylesheets/common/base/topic-post.scss
+++ b/app/assets/stylesheets/common/base/topic-post.scss
@@ -552,6 +552,10 @@ blockquote {
.cooked {
overflow: hidden;
}
+ .group-request {
+ border-top: 1px solid $primary-low;
+ padding-top: 0.5em;
+ }
&.highlighted {
animation: background-fade-highlight 2.5s ease-out;
}
diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss
index a23e46d335..d404169fd8 100644
--- a/app/assets/stylesheets/desktop/topic-post.scss
+++ b/app/assets/stylesheets/desktop/topic-post.scss
@@ -613,6 +613,9 @@ blockquote {
.cooked {
padding: 0 $topic-body-width-padding 0.25em $topic-body-width-padding;
}
+ .group-request {
+ padding: 0.5em $topic-body-width-padding 0 $topic-body-width-padding;
+ }
a.expand-hidden {
padding-left: $topic-body-width-padding;
}
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 126d0910af..0df1f49012 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -439,7 +439,7 @@ class GroupsController < ApplicationController
raw: params[:reason],
archetype: Archetype.private_message,
target_usernames: usernames.join(','),
- custom_fields: { requested_group_id: group.id },
+ topic_opts: { custom_fields: { requested_group_id: group.id } },
skip_validations: true
).create!
diff --git a/app/serializers/basic_post_serializer.rb b/app/serializers/basic_post_serializer.rb
index 32c14b5c72..3486c47bc2 100644
--- a/app/serializers/basic_post_serializer.rb
+++ b/app/serializers/basic_post_serializer.rb
@@ -40,34 +40,7 @@ class BasicPostSerializer < ApplicationSerializer
I18n.t('flagging.user_must_edit')
end
else
- cooked = object.filter_quotes(@parent_post)
-
- if scope&.user
-
- # PERF: this should not run on every post, only specific ones
- # also, why is this in basic post serializer?
- requested_group_id = post_custom_fields['requested_group_id'].to_i
-
- if requested_group_id > 0
- group = Group
- .joins('JOIN group_users ON groups.id = group_users.group_id')
- .find_by(
- id: object.custom_fields['requested_group_id'].to_i,
- group_users: { user_id: scope.user.id, owner: true }
- )
-
- if group
- cooked << <<~EOF
-
-
- #{I18n.t('groups.request_membership_pm.handle')}
-
- EOF
- end
- end
- end
-
- cooked
+ object.filter_quotes(@parent_post)
end
end
diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb
index a0f37d3d70..824dfcb068 100644
--- a/app/serializers/topic_view_serializer.rb
+++ b/app/serializers/topic_view_serializer.rb
@@ -70,7 +70,8 @@ class TopicViewSerializer < ApplicationSerializer
:destination_category_id,
:pm_with_non_human_user,
:queued_posts_count,
- :show_read_indicator
+ :show_read_indicator,
+ :requested_group_name
)
has_one :details, serializer: TopicViewDetailsSerializer, root: false, embed: :objects
@@ -255,4 +256,21 @@ class TopicViewSerializer < ApplicationSerializer
def show_read_indicator
object.show_read_indicator?
end
+
+ def requested_group_name
+ if scope&.user
+ group = Group
+ .joins('JOIN group_users ON groups.id = group_users.group_id')
+ .find_by(
+ id: object.topic.custom_fields['requested_group_id'].to_i,
+ group_users: { user_id: scope.user.id, owner: true }
+ )
+
+ group.name if group
+ end
+ end
+
+ def include_requested_group_name?
+ object.personal_message
+ end
end
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 9f72e5b3d8..e9ad9aac7c 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -614,6 +614,7 @@ en:
deny: "Deny"
denied: "denied"
undone: "request undone"
+ handle: "handle membership request"
manage:
title: "Manage"
name: "Name"
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index d034819d16..6d1c849522 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -427,7 +427,6 @@ en:
trust_level_4: "trust_level_4"
request_membership_pm:
title: "Membership Request for @%{group_name}"
- handle: "handle membership request"
view_hidden_topic_request_reason: "I would like to join the group '%{group_name}', so I may access [this topic](%{topic_url})"
education:
diff --git a/lib/topic_view.rb b/lib/topic_view.rb
index 3123e19b46..94f31f44b1 100644
--- a/lib/topic_view.rb
+++ b/lib/topic_view.rb
@@ -35,7 +35,7 @@ class TopicView
end
def self.default_post_custom_fields
- @default_post_custom_fields ||= [Post::NOTICE_TYPE, Post::NOTICE_ARGS, "action_code_who", "requested_group_id"]
+ @default_post_custom_fields ||= [Post::NOTICE_TYPE, Post::NOTICE_ARGS, "action_code_who"]
end
def self.post_custom_fields_whitelisters
diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb
index f26f2483ee..381e247e42 100644
--- a/spec/requests/groups_controller_spec.rb
+++ b/spec/requests/groups_controller_spec.rb
@@ -1479,7 +1479,7 @@ describe GroupsController do
body = JSON.parse(response.body)
expect(body['relative_url']).to eq(topic.relative_url)
- expect(post.custom_fields['requested_group_id'].to_i).to eq(group.id)
+ expect(post.topic.custom_fields['requested_group_id'].to_i).to eq(group.id)
expect(post.user).to eq(user)
expect(topic.title).to eq(I18n.t('groups.request_membership_pm.title',
diff --git a/spec/serializers/basic_post_serializer_spec.rb b/spec/serializers/basic_post_serializer_spec.rb
index 04f70583c4..c390527ca1 100644
--- a/spec/serializers/basic_post_serializer_spec.rb
+++ b/spec/serializers/basic_post_serializer_spec.rb
@@ -22,27 +22,4 @@ describe BasicPostSerializer do
end
- context "cooked" do
- it "includes membership requests" do
- user = Fabricate(:user)
- member = Fabricate(:user)
- owner = Fabricate(:user)
-
- group = Fabricate(:group)
- group.add(member)
- group.add_owner(owner)
-
- post = Fabricate(:post, custom_fields: { requested_group_id: group.id })
-
- json = BasicPostSerializer.new(post, scope: Guardian.new(user), root: false).as_json
- expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle'))
-
- json = BasicPostSerializer.new(post, scope: Guardian.new(member), root: false).as_json
- expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle'))
-
- json = BasicPostSerializer.new(post, scope: Guardian.new(owner), root: false).as_json
- expect(json[:cooked]).to include(I18n.t('groups.request_membership_pm.handle'))
- end
- end
-
end
diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6
index 23a7b17bdf..7c19c715e6 100644
--- a/test/javascripts/widgets/post-test.js.es6
+++ b/test/javascripts/widgets/post-test.js.es6
@@ -922,3 +922,18 @@ widgetTest("post notice - with name", {
);
}
});
+
+widgetTest("show group request in post", {
+ template: '{{mount-widget widget="post" args=args}}',
+ beforeEach() {
+ this.set("args", {
+ username: "foo",
+ requestedGroupName: "testGroup"
+ });
+ },
+ test(assert) {
+ const link = find(".group-request a");
+ assert.equal(link.text().trim(), I18n.t("groups.requests.handle"));
+ assert.equal(link.attr("href"), "/g/testGroup/requests?filter=foo");
+ }
+});