From e3eb5d74bc5eaaabd7d40cdb0e68211c32721154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20B=C4=82LTEANU?= Date: Tue, 14 Apr 2026 23:00:55 +0300 Subject: [PATCH 2/2] Add or remove users from group using the context menu (#43640). --- app/controllers/context_menus_controller.rb | 5 +++ app/controllers/groups_controller.rb | 4 +- app/views/context_menus/users.html.erb | 25 ++++++++++++ config/locales/en.yml | 2 + .../context_menus_controller_test.rb | 40 +++++++++++++++++++ test/functional/groups_controller_test.rb | 14 +++++++ 6 files changed, 88 insertions(+), 2 deletions(-) diff --git a/app/controllers/context_menus_controller.rb b/app/controllers/context_menus_controller.rb index 11d4b37c0..f243e7cf5 100644 --- a/app/controllers/context_menus_controller.rb +++ b/app/controllers/context_menus_controller.rb @@ -134,6 +134,11 @@ class ContextMenusController < ApplicationController if @users.size == 1 @user = @users.first end + + @groups = Group.givable.sorted.to_a + @common_group_ids = @users.map(&:group_ids).reduce(:&) + @back = back_url + render layout: false end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index dca2b9c42..81c4ce50b 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -117,7 +117,7 @@ class GroupsController < ApplicationController @users = User.not_in_group(@group).where(:id => (params[:user_id] || params[:user_ids])).to_a @group.users << @users respond_to do |format| - format.html {redirect_to edit_group_path(@group, :tab => 'users')} + format.html {redirect_back_or_default edit_group_path(@group, :tab => 'users')} format.js format.api do if @users.any? @@ -133,7 +133,7 @@ class GroupsController < ApplicationController @users = User.where(:id => (params[:user_id] || params[:user_ids])).to_a @group.users.delete(@users) if request.delete? respond_to do |format| - format.html {redirect_to edit_group_path(@group, :tab => 'users')} + format.html {redirect_back_or_default edit_group_path(@group, :tab => 'users')} format.js format.api {render_api_ok} end diff --git a/app/views/context_menus/users.html.erb b/app/views/context_menus/users.html.erb index 5b6c783b7..4fc67a081 100644 --- a/app/views/context_menus/users.html.erb +++ b/app/views/context_menus/users.html.erb @@ -36,4 +36,29 @@ method: :delete, class: 'icon icon-del' %> <% end %> + + <% if @groups.present? %> +
  • + <%= l(:button_add_to_group) %> + <%= sprite_icon('angle-right', rtl: true) %> + +
  • + <% if @common_group_ids.present? %> +
  • + <%= l(:button_remove_from_group) %> + <%= sprite_icon('angle-right', rtl: true) %> + +
  • + <% end %> + <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 8315e12ce..07fca36b2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1205,12 +1205,14 @@ en: button_expand_all: Expand all button_delete: Delete button_remove: Remove + button_remove_from_group: Remove from group button_create: Create button_create_and_continue: Create and add another button_test: Test button_edit: Edit button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_add: Add + button_add_to_group: Add to group button_change: Change button_apply: Apply button_clear: Clear diff --git a/test/functional/context_menus_controller_test.rb b/test/functional/context_menus_controller_test.rb index b91d9dcce..3771a6a91 100644 --- a/test/functional/context_menus_controller_test.rb +++ b/test/functional/context_menus_controller_test.rb @@ -522,4 +522,44 @@ class ContextMenusControllerTest < Redmine::ControllerTest assert_select 'a.icon-del', :count => 0 end end + + def test_users_context_menu + @request.session[:user_id] = 1 # admin + get :users, :params => {:ids => [8]} + assert_response :success + + assert_select 'li.folder' do + assert_select 'a', :text => 'Add to group' + assert_select 'ul' do + assert_select 'a', :text => 'A Team' + end + end + # User 8 is in Group 10 + assert_select 'li.folder' do + assert_select 'a', :text => 'Remove from group' + assert_select 'a', :text => 'A Team' + end + end + + def test_users_context_menu_bulk + @request.session[:user_id] = 1 # admin + # Add user 2 to group 10 (user 8 is already there) + Group.find(10).users << User.find(2) + + get :users, :params => {:ids => [2, 8]} + assert_response :success + + assert_select 'li.folder' do + assert_select 'a', :text => 'Add to group' + assert_select 'ul' do + assert_select 'a', :text => 'A Team' + assert_select 'a', :text => 'B Team' + end + end + # Both users are in Group 10 + assert_select 'li.folder' do + assert_select 'a', :text => 'Remove from group' + assert_select 'a', :text => 'A Team' + end + end end diff --git a/test/functional/groups_controller_test.rb b/test/functional/groups_controller_test.rb index f2664700b..f846f9494 100644 --- a/test/functional/groups_controller_test.rb +++ b/test/functional/groups_controller_test.rb @@ -314,4 +314,18 @@ class GroupsControllerTest < Redmine::ControllerTest assert_response :success assert_include 'John Smith', response.body end + + def test_add_users_from_context_menu_should_redirect_to_back_url + assert_difference 'Group.find(10).users.count', 1 do + post( + :add_users, + :params => { + :id => 10, + :user_ids => ['2'], + :back_url => '/users' + } + ) + assert_redirected_to '/users' + end + end end -- 2.50.1 (Apple Git-155)