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?) %>
  • - <%= context_menu_link sprite_icon('lock', l(:button_lock)), bulk_lock_users_path(ids: @users.map(&:id)), method: :post, class: 'icon icon-lock' %> + <%= context_menu_link sprite_icon('lock', l(:button_lock)), bulk_lock_users_path(ids: @user_ids), method: :post, class: 'icon icon-lock' %>
  • <% else %>
  • - <%= context_menu_link sprite_icon('unlock', l(:button_unlock)), bulk_unlock_users_path(ids: @users.map(&:id)), method: :post, class: 'icon icon-unlock' %> + <%= context_menu_link sprite_icon('unlock', l(:button_unlock)), bulk_unlock_users_path(ids: @user_ids), method: :post, class: 'icon icon-unlock' %>
  • <% end %>
  • <%= context_menu_link sprite_icon('del', l(:button_delete)), - {controller: 'users', action: 'bulk_destroy', ids: @users.map(&:id)}, + {controller: 'users', action: 'bulk_destroy', ids: @user_ids}, method: :delete, class: 'icon icon-del' %>
  • <% end %> + <% if @groups_for_add.any? %> +
  • + <%= l(:label_add_user_to_group) %> + <%= sprite_icon('angle-right', rtl: true) %> + +
  • + <% end %> + <% if @groups_for_remove.any? %> +
  • + <%= l(:label_remove_user_from_group) %> + <%= sprite_icon('angle-right', rtl: true) %> + +
  • + <% end %> + Index: app/views/groups/remove_user.js.erb =================================================================== --- app/views/groups/remove_user.js.erb (revision 24239) +++ app/views/groups/remove_user.js.erb (nonexistent) @@ -1 +0,0 @@ -$('#tab-content-users').html('<%= escape_javascript(render :partial => 'groups/users') %>'); Property changes on: app/views/groups/remove_user.js.erb ___________________________________________________________________ Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Index: app/views/groups/remove_users.js.erb =================================================================== Index: config/routes.rb =================================================================== --- config/routes.rb (revision 24239) +++ config/routes.rb (working copy) @@ -344,7 +344,8 @@ get 'groups/:id/users/new', :to => 'groups#new_users', :id => /\d+/, :as => 'new_group_users' post 'groups/:id/users', :to => 'groups#add_users', :id => /\d+/, :as => 'group_users' - delete 'groups/:id/users/:user_id', :to => 'groups#remove_user', :id => /\d+/, :as => 'group_user' + delete 'groups/:id/users/:user_id', :to => 'groups#remove_users', :id => /\d+/, :as => 'group_user' + delete 'groups/:id/users', :to => 'groups#remove_users', :id => /\d+/, :as => 'group_remove_users' resources :trackers, :except => :show do collection do