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:
Renato Atilio 2024-01-11 13:39:17 -03:00 committed by GitHub
parent f5f3742166
commit c2aa64b251
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 3 deletions

View File

@ -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

View File

@ -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),

View File

@ -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