Index: app/controllers/context_menus_controller.rb =================================================================== --- app/controllers/context_menus_controller.rb (revision 24239) +++ app/controllers/context_menus_controller.rb (working copy) @@ -134,6 +134,29 @@ if @users.size == 1 @user = @users.first end + @user_ids = @users.map(&:id) + + @groups_for_remove = Group.givable + .joins(:groups_users) + .where(groups_users: { user_id: @user_ids }) + .distinct + .order(:name) + + @groups_for_add = Group.givable + .joins(<<-SQL.squish) + LEFT JOIN groups_users gu + ON gu.group_id = #{Group.table_name}.id + AND gu.user_id IN (#{@user_ids.map { |i| ActiveRecord::Base.connection.quote(i) }.join(',')}) + SQL + .group("#{Group.table_name}.id") + .having('COUNT(DISTINCT gu.user_id) < ?', @user_ids.size) + .order(:name) + + if @users.size <= 10 + names = @users.map { |u| "#{u.firstname} #{u.lastname}".strip } + @user_names = names.join("\n") + end + render layout: false end end Index: app/controllers/groups_controller.rb =================================================================== --- app/controllers/groups_controller.rb (revision 24239) +++ app/controllers/groups_controller.rb (working copy) @@ -23,9 +23,9 @@ before_action :require_admin, :except => [:show] before_action :find_group, :except => [:index, :new, :create] - accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_user + accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_users - require_sudo_mode :add_users, :remove_user, :create, :update, :destroy, :edit_membership, :destroy_membership + require_sudo_mode :add_users, :remove_users, :create, :update, :destroy, :edit_membership, :destroy_membership helper :custom_fields helper :principal_memberships @@ -117,7 +117,10 @@ @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 do + flash[:notice] = l(:notice_successful_update) unless request.referer.presence == edit_group_path(@group, :tab => 'users') + redirect_back_or_default edit_group_path(@group, tab: 'users'), referer: true + end format.js format.api do if @users.any? @@ -129,10 +132,14 @@ end end - def remove_user - @group.users.delete(User.find(params[:user_id])) if request.delete? + def remove_users + @users = User.in_group(@group).where(:id => (params[:user_id] || params[:user_ids])).to_a + @group.users.delete(@users) respond_to do |format| - format.html {redirect_to edit_group_path(@group, :tab => 'users')} + format.html do + flash[:notice] = l(:notice_successful_delete) unless request.referer.presence == edit_group_path(@group, :tab => 'users') + redirect_back_or_default edit_group_path(@group, tab: 'users'), referer: true + end format.js format.api {render_api_ok} end Index: app/views/context_menus/users.html.erb =================================================================== --- app/views/context_menus/users.html.erb (revision 24239) +++ app/views/context_menus/users.html.erb (working copy) @@ -23,17 +23,50 @@ <% else %> <% unless @users.all?(&:locked?) %>