mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 11:38:47 +08:00
FEATURE: Allow sorting group members by custom field via API (#25061)
* UX: add sorting params to groups table plugin outlet * FEATURE: allow sorting group members by custom field via API --------- Co-authored-by: Jean Perez <jmperez127@gmail.com>
This commit is contained in:
parent
f5f3742166
commit
c2aa64b251
|
@ -99,7 +99,7 @@
|
|||
|
||||
<PluginOutlet
|
||||
@name="group-index-table-header-after-username"
|
||||
@outletArgs={{hash group=this.model}}
|
||||
@outletArgs={{hash group=this.model asc=this.asc order=this.order}}
|
||||
/>
|
||||
|
||||
<TableHeaderToggle
|
||||
|
|
|
@ -284,10 +284,20 @@ class GroupsController < ApplicationController
|
|||
)
|
||||
end
|
||||
|
||||
include_custom_fields = params[:include_custom_fields] == "true"
|
||||
|
||||
allowed_fields =
|
||||
User.allowed_user_custom_fields(guardian) +
|
||||
UserField.all.pluck(:id).map { |fid| "#{User::USER_FIELD_PREFIX}#{fid}" }
|
||||
|
||||
if params[:order] && %w[last_posted_at last_seen_at].include?(params[:order])
|
||||
order = "#{params[:order]} #{dir} NULLS LAST"
|
||||
elsif params[:order] == "added_at"
|
||||
order = "group_users.created_at #{dir}"
|
||||
elsif include_custom_fields && params[:order] == "custom_field" &&
|
||||
allowed_fields.include?(params[:order_field])
|
||||
order =
|
||||
"(SELECT value FROM user_custom_fields ucf WHERE ucf.user_id = users.id AND ucf.name = '#{params[:order_field]}') #{dir} NULLS LAST"
|
||||
end
|
||||
|
||||
users = group.users.human_users
|
||||
|
@ -315,7 +325,7 @@ class GroupsController < ApplicationController
|
|||
owners = users.where("group_users.owner")
|
||||
|
||||
group_members_serializer =
|
||||
params[:include_custom_fields] ? GroupUserWithCustomFieldsSerializer : GroupUserSerializer
|
||||
include_custom_fields ? GroupUserWithCustomFieldsSerializer : GroupUserSerializer
|
||||
|
||||
render json: {
|
||||
members: serialize_data(members, group_members_serializer),
|
||||
|
|
|
@ -657,13 +657,49 @@ RSpec.describe GroupsController do
|
|||
SiteSetting.public_user_custom_fields = user_field_name
|
||||
end
|
||||
|
||||
it "shows custom the fields" do
|
||||
it "shows the custom fields" do
|
||||
get "/groups/#{group.name}/members.json", params: { include_custom_fields: true }
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
response_custom_fields = response.parsed_body["members"].first["custom_fields"]
|
||||
expect(response_custom_fields[user_field_name]).to eq("A custom field")
|
||||
end
|
||||
|
||||
it "allows sorting by custom fields" do
|
||||
group.add(user2)
|
||||
UserCustomField.create!(user_id: user2.id, name: user_field_name, value: "C custom field")
|
||||
group.add(other_user)
|
||||
UserCustomField.create!(
|
||||
user_id: other_user.id,
|
||||
name: user_field_name,
|
||||
value: "B custom field",
|
||||
)
|
||||
|
||||
get "/groups/#{group.name}/members.json",
|
||||
params: {
|
||||
include_custom_fields: true,
|
||||
order: "custom_field",
|
||||
order_field: user_field_name,
|
||||
asc: true,
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["members"].pluck("id")).to eq(
|
||||
[user.id, other_user.id, user2.id],
|
||||
)
|
||||
|
||||
get "/groups/#{group.name}/members.json",
|
||||
params: {
|
||||
include_custom_fields: true,
|
||||
order: "custom_field",
|
||||
order_field: user_field_name,
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["members"].pluck("id")).to eq(
|
||||
[user2.id, other_user.id, user.id],
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user