From 3b3791f9ec664679f475e64bc1695f103b29a1c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 20 May 2026 08:20:54 +0200 Subject: [PATCH] Use correct configuration for group filter on user administration https://community.openproject.org/work_packages/74763 --- .../users/user_filters_component.rb | 11 +++++-- .../queries/users/filters/group_filter.rb | 4 +++ spec/features/users/index_spec.rb | 17 ++++++++++ .../users/filters/group_filter_spec.rb | 2 +- spec/support/pages/admin/users/index.rb | 33 ++++++++++++++++++- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/app/components/users/user_filters_component.rb b/app/components/users/user_filters_component.rb index 912b49e9f60..eb923be1ffa 100644 --- a/app/components/users/user_filters_component.rb +++ b/app/components/users/user_filters_component.rb @@ -46,8 +46,15 @@ module Users when Queries::Users::Filters::GroupFilter { autocomplete_options: { - component: "opce-group-autocompleter", - resource: "groups" + component: "opce-user-autocompleter", + resource: "principals", + url: ::API::V3::Utilities::PathHelper::ApiV3Path.principals, + filters: [ + { name: "type", operator: "=", values: %w[Group] } + ], + searchKey: "any_name_attribute", + inputValue: filter.values, + bindValue: "id" } } else diff --git a/app/models/queries/users/filters/group_filter.rb b/app/models/queries/users/filters/group_filter.rb index d8861edeb12..92ed4ad7a3e 100644 --- a/app/models/queries/users/filters/group_filter.rb +++ b/app/models/queries/users/filters/group_filter.rb @@ -30,4 +30,8 @@ class Queries::Users::Filters::GroupFilter < Queries::Users::Filters::UserFilter include Queries::Filters::Shared::GroupFilter + + def human_name + I18n.t(:label_group) + end end diff --git a/spec/features/users/index_spec.rb b/spec/features/users/index_spec.rb index 28b4ea9285d..8954c895d0e 100644 --- a/spec/features/users/index_spec.rb +++ b/spec/features/users/index_spec.rb @@ -42,6 +42,7 @@ RSpec.describe "index users", :js do describe "filtering", :js do let!(:alice) { create(:user, login: "alice", firstname: "Alice", lastname: "Smith") } let!(:bob) { create(:user, login: "bob", firstname: "Bob", lastname: "Jones") } + let!(:my_group) { create(:group, lastname: "My group", members: [alice]) } it "filters by name via the search input and updates without a page reload" do index_page.visit! @@ -62,6 +63,22 @@ RSpec.describe "index users", :js do index_page.filter_by_status(I18n.t(:status_registered)) index_page.expect_listed(registered) end + + it "filters by group and keeps that filter after reload" do + index_page.visit! + expect(page).to have_css("td.username a", text: alice.login) + expect(page).to have_css("td.username a", text: bob.login) + + index_page.filter_by_group("My group") + index_page.expect_listed(alice) + index_page.expect_not_listed(bob) + + page.refresh + + index_page.expect_group_filter("My group") + index_page.expect_listed(alice) + index_page.expect_not_listed(bob) + end end describe "with some sortable users" do diff --git a/spec/models/queries/users/filters/group_filter_spec.rb b/spec/models/queries/users/filters/group_filter_spec.rb index aa650fc040e..122ce368624 100644 --- a/spec/models/queries/users/filters/group_filter_spec.rb +++ b/spec/models/queries/users/filters/group_filter_spec.rb @@ -44,7 +44,7 @@ RSpec.describe Queries::Users::Filters::GroupFilter do it_behaves_like "basic query filter" do let(:class_key) { :group } let(:type) { :list_optional } - let(:name) { I18n.t("query_fields.member_of_group") } + let(:name) { I18n.t(:label_group) } describe "#allowed_values" do it "is a list of the possible values" do diff --git a/spec/support/pages/admin/users/index.rb b/spec/support/pages/admin/users/index.rb index d632d7b004b..711d06fccb8 100644 --- a/spec/support/pages/admin/users/index.rb +++ b/spec/support/pages/admin/users/index.rb @@ -34,6 +34,8 @@ module Pages module Admin module Users class Index < ::Pages::Page + include ::Components::Autocompleter::NgSelectAutocompleteHelpers + def path "/users" end @@ -60,6 +62,12 @@ module Pages .to have_css("tr.generic-table--empty-row", text: "There is currently nothing to display.") end + def expect_not_listed(*users) + users.each do |user| + expect(page).to have_no_css("td.username a", text: user.login) + end + end + def expect_user_locked(user) expect(page) .to have_css("tr.user.locked td.username", text: user.login) @@ -85,6 +93,29 @@ module Pages wait_for_network_idle end + def filter_by_group(value) + open_filter_panel + unless page.has_css?("li.advanced-filters--filter[data-filter-name='group']:not(.hidden)") + select "Group", from: "add_filter_select" + end + + within_filter("group") do + select_autocomplete find('[data-filter-autocomplete="true"]'), + query: value, + results_selector: "body" + end + + wait_for_network_idle + end + + def expect_group_filter(value) + open_filter_panel + + within_filter("group") do + expect_current_autocompleter_value find('[data-filter-autocomplete="true"]'), value + end + end + def clear_filters find_by_id("user-filters-form-clear-button").click @@ -105,7 +136,7 @@ module Pages end def within_filter(name, &) - within("[data-filter-name='#{name}']", &) + within("li.advanced-filters--filter[data-filter-name='#{name}']:not(.hidden)", &) end def order_by(key)