Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/components/filter/filter_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ def user_autocomplete_options
resource: "principals",
url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals,
filters: [
{ name: "type", operator: "=", values: ["User"] },
{ name: "status", operator: "!", values: [Principal.statuses["locked"].to_s] }
],
searchKey: "any_name_attribute",
Expand Down
24 changes: 24 additions & 0 deletions app/models/queries/filters/shared/custom_fields/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,30 @@ class User < ListOptional
def allowed_values
@allowed_values ||= me_allowed_value + super
end

def values_replaced
vals = super
vals += group_members_added(vals)
vals + user_groups_added(vals)
end

private

def group_members_added(vals)
::User
.joins(:groups)
.where(groups_users: { id: vals })
.pluck(:id)
.map(&:to_s)
end

def user_groups_added(vals)
Group
.joins(:users)
.where(users_users: { id: vals })
.pluck(:id)
.map(&:to_s)
end
end
end
end
1 change: 1 addition & 0 deletions app/models/queries/projects/filters/custom_field_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@

class Queries::Projects::Filters::CustomFieldFilter < Queries::Projects::Filters::Base
include Queries::Filters::Shared::CustomFieldFilter

self.custom_field_context = ::Queries::Projects::CustomFieldContext
end
64 changes: 62 additions & 2 deletions spec/features/projects/lists/filters_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,10 @@ def load_and_open_filters(user)

describe "user cf filter" do
let(:some_user) { create(:user, member_with_roles: { project => [project_role] }) }
let!(:some_placeholder) { create(:placeholder_user, member_with_roles: { project => [project_role] }) }
let!(:some_group) { create(:group, members: [some_user], member_with_roles: { project => [project_role] }) }
let!(:empty_group) { create(:group, member_with_roles: { project => [project_role] }) }

let!(:user_cf) do
create(:user_project_custom_field,
name: "A user CF",
Expand All @@ -505,24 +509,80 @@ def load_and_open_filters(user)
end
end

it "filters for the project that has the corresponding value" do
it "filters for the project that has the correct user" do
load_and_open_filters manager

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

projects_page.expect_projects_listed(project)
end

it "displays the visible project members as available options" do
it "filters for any group where the user is a member" do
load_and_open_filters manager

# Since the user is member of this group, this project will match the filter
projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_group.name])

projects_page.expect_projects_listed(project)
end

it "displays the visible project members, groups and placeholders as available options" do
load_and_open_filters manager

expected_options = [
{ name: empty_group.name },
{ name: some_group.name },
{ name: some_user.name, email: some_user.mail },
{ name: some_placeholder.name },
{ name: manager.name, email: manager.mail }
]

projects_page.expect_user_autocomplete_options_for(user_cf, expected_options)
end

context "with the cf field set to a group" do
before do
project.update(custom_field_values: { user_cf.id => [some_group.id] })
end

it "filters for the group" do
load_and_open_filters manager

projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_group.name])

projects_page.expect_projects_listed(project)
end

it "filters for users that are members of the group" do
load_and_open_filters manager

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

projects_page.expect_projects_listed(project)
end

it "does not match if you filter for another group" do
load_and_open_filters manager

projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [empty_group.name])

projects_page.expect_projects_not_listed(project)
end
end

context "with the cf field set to a placeholder user" do
before do
project.update(custom_field_values: { user_cf.id => [some_placeholder.id] })
end

it "filters for the placeholder user" do
load_and_open_filters manager

projects_page.set_filter(user_cf.column_name, user_cf.name, "is (OR)", [some_placeholder.name])

projects_page.expect_projects_listed(project)
end
end
end

describe "list cf filter" do
Expand Down
3 changes: 2 additions & 1 deletion spec/features/projects/lists/table_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ def load_and_open_filters(user)

context "with valid Enterprise token" do
shared_let(:long_text_custom_field) { create(:text_project_custom_field) }

specify "CF columns and filters are not visible by default" do
load_and_open_filters admin

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

# Admins shall be the only ones to see invisible CFs
expect(page).to have_text(invisible_custom_field.name.upcase)
expect(page).to have_select("add_filter_select", with_options: [invisible_custom_field.name])
projects_page.expect_filter_available(invisible_custom_field.name)
end

specify "long-text fields are truncated" do
Expand Down
Loading
Loading