Skip to content

Commit 2622650

Browse files
committed
[#68702] Project user filter also includes groups and placeholder users
[#68702] Clean up custom field filter spec [#68702] Clean up Project table spec [#68702] Add project list filter spec for groups and placeholder users [#68702] User filter matches group membership [#68702] Add specs for group membership filtering
1 parent 94e2ec0 commit 2622650

File tree

6 files changed

+123
-35
lines changed

6 files changed

+123
-35
lines changed

app/components/filter/filter_component.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ def user_autocomplete_options
168168
resource: "principals",
169169
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
170170
filters: [
171-
{ name: "type", operator: "=", values: ["User"] },
172171
{ name: "status", operator: "!", values: [Principal.statuses["locked"].to_s] }
173172
],
174173
searchKey: "any_name_attribute",

app/models/queries/filters/shared/custom_fields/user.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,30 @@ class User < ListOptional
4141
def allowed_values
4242
@allowed_values ||= me_allowed_value + super
4343
end
44+
45+
def values_replaced
46+
vals = super
47+
vals += group_members_added(vals)
48+
vals + user_groups_added(vals)
49+
end
50+
51+
private
52+
53+
def group_members_added(vals)
54+
::User
55+
.joins(:groups)
56+
.where(groups_users: { id: vals })
57+
.pluck(:id)
58+
.map(&:to_s)
59+
end
60+
61+
def user_groups_added(vals)
62+
Group
63+
.joins(:users)
64+
.where(users_users: { id: vals })
65+
.pluck(:id)
66+
.map(&:to_s)
67+
end
4468
end
4569
end
4670
end

app/models/queries/projects/filters/custom_field_filter.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@
3030

3131
class Queries::Projects::Filters::CustomFieldFilter < Queries::Projects::Filters::Base
3232
include Queries::Filters::Shared::CustomFieldFilter
33+
3334
self.custom_field_context = ::Queries::Projects::CustomFieldContext
3435
end

spec/features/projects/lists/filters_spec.rb

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,10 @@ def load_and_open_filters(user)
497497

498498
describe "user cf filter" do
499499
let(:some_user) { create(:user, member_with_roles: { project => [project_role] }) }
500+
let!(:some_placeholder) { create(:placeholder_user, member_with_roles: { project => [project_role] }) }
501+
let!(:some_group) { create(:group, members: [some_user], member_with_roles: { project => [project_role] }) }
502+
let!(:empty_group) { create(:group, member_with_roles: { project => [project_role] }) }
503+
500504
let!(:user_cf) do
501505
create(:user_project_custom_field,
502506
name: "A user CF",
@@ -505,24 +509,80 @@ def load_and_open_filters(user)
505509
end
506510
end
507511

508-
it "filters for the project that has the corresponding value" do
512+
it "filters for the project that has the correct user" do
509513
load_and_open_filters manager
510514

511515
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_user.name])
512516

513517
projects_page.expect_projects_listed(project)
514518
end
515519

516-
it "displays the visible project members as available options" do
520+
it "filters for any group where the user is a member" do
521+
load_and_open_filters manager
522+
523+
# Since the user is member of this group, this project will match the filter
524+
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_group.name])
525+
526+
projects_page.expect_projects_listed(project)
527+
end
528+
529+
it "displays the visible project members, groups and placeholders as available options" do
517530
load_and_open_filters manager
518531

519532
expected_options = [
533+
{ name: empty_group.name },
534+
{ name: some_group.name },
520535
{ name: some_user.name, email: some_user.mail },
536+
{ name: some_placeholder.name },
521537
{ name: manager.name, email: manager.mail }
522538
]
523539

524540
projects_page.expect_user_autocomplete_options_for(user_cf, expected_options)
525541
end
542+
543+
context "with the cf field set to a group" do
544+
before do
545+
project.update(custom_field_values: { user_cf.id => [some_group.id] })
546+
end
547+
548+
it "filters for the group" do
549+
load_and_open_filters manager
550+
551+
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_group.name])
552+
553+
projects_page.expect_projects_listed(project)
554+
end
555+
556+
it "filters for users that are members of the group" do
557+
load_and_open_filters manager
558+
559+
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_user.name])
560+
561+
projects_page.expect_projects_listed(project)
562+
end
563+
564+
it "does not match if you filter for another group" do
565+
load_and_open_filters manager
566+
567+
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [empty_group.name])
568+
569+
projects_page.expect_projects_not_listed(project)
570+
end
571+
end
572+
573+
context "with the cf field set to a placeholder user" do
574+
before do
575+
project.update(custom_field_values: { user_cf.id => [some_placeholder.id] })
576+
end
577+
578+
it "filters for the placeholder user" do
579+
load_and_open_filters manager
580+
581+
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_placeholder.name])
582+
583+
projects_page.expect_projects_listed(project)
584+
end
585+
end
526586
end
527587

528588
describe "list cf filter" do

spec/features/projects/lists/table_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ def load_and_open_filters(user)
370370

371371
context "with valid Enterprise token" do
372372
shared_let(:long_text_custom_field) { create(:text_project_custom_field) }
373+
373374
specify "CF columns and filters are not visible by default" do
374375
load_and_open_filters admin
375376

@@ -388,7 +389,7 @@ def load_and_open_filters(user)
388389

389390
# Admins shall be the only ones to see invisible CFs
390391
expect(page).to have_text(invisible_custom_field.name.upcase)
391-
expect(page).to have_select("add_filter_select", with_options: [invisible_custom_field.name])
392+
projects_page.expect_filter_available(invisible_custom_field.name)
392393
end
393394

394395
specify "long-text fields are truncated" do

0 commit comments

Comments
 (0)