Project

General

Profile

Patch #43640 » v2-01-group-controller-remove_users.patch

Florian Walchshofer, 2026-01-03 22:33

View differences:

app/controllers/context_menus_controller.rb (working copy)
134 134
    if @users.size == 1
135 135
      @user = @users.first
136 136
    end
137
    @user_ids = @users.map(&:id)
138

  
139
    @groups_for_remove = Group.givable
140
      .joins(:groups_users)
141
      .where(groups_users: { user_id: @user_ids })
142
      .distinct
143
      .order(:name)
144

  
145
    @groups_for_add = Group.givable
146
          .joins(<<-SQL.squish)
147
          LEFT JOIN groups_users gu
148
                 ON gu.group_id = #{Group.table_name}.id
149
                AND gu.user_id IN (#{@user_ids.map { |i| ActiveRecord::Base.connection.quote(i) }.join(',')})
150
          SQL
151
          .group("#{Group.table_name}.id")
152
          .having('COUNT(DISTINCT gu.user_id) < ?', @user_ids.size)
153
          .order(:name)
154

  
155
    if @users.size <= 10
156
      names = @users.map { |u| "#{u.firstname} #{u.lastname}".strip }
157
      @user_names = names.join("\n")
158
    end
159

  
137 160
    render layout: false
138 161
  end
139 162
end
app/controllers/groups_controller.rb (working copy)
23 23

  
24 24
  before_action :require_admin, :except => [:show]
25 25
  before_action :find_group, :except => [:index, :new, :create]
26
  accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_user
26
  accept_api_auth :index, :show, :create, :update, :destroy, :add_users, :remove_users
27 27

  
28
  require_sudo_mode :add_users, :remove_user, :create, :update, :destroy, :edit_membership, :destroy_membership
28
  require_sudo_mode :add_users, :remove_users, :create, :update, :destroy, :edit_membership, :destroy_membership
29 29

  
30 30
  helper :custom_fields
31 31
  helper :principal_memberships
......
117 117
    @users = User.not_in_group(@group).where(:id => (params[:user_id] || params[:user_ids])).to_a
118 118
    @group.users << @users
119 119
    respond_to do |format|
120
      format.html {redirect_to edit_group_path(@group, :tab => 'users')}
120
      format.html do
121
        flash[:notice] = l(:notice_successful_update) unless request.referer.presence == edit_group_path(@group, :tab => 'users')
122
        redirect_back_or_default edit_group_path(@group, tab: 'users'), referer: true
123
      end
121 124
      format.js
122 125
      format.api do
123 126
        if @users.any?
......
129 132
    end
130 133
  end
131 134

  
132
  def remove_user
133
    @group.users.delete(User.find(params[:user_id])) if request.delete?
135
  def remove_users
136
    @users = User.in_group(@group).where(:id => (params[:user_id] || params[:user_ids])).to_a
137
    @group.users.delete(@users)
134 138
    respond_to do |format|
135
      format.html {redirect_to edit_group_path(@group, :tab => 'users')}
139
      format.html do
140
        flash[:notice] = l(:notice_successful_delete) unless request.referer.presence == edit_group_path(@group, :tab => 'users')
141
        redirect_back_or_default edit_group_path(@group, tab: 'users'), referer: true
142
      end
136 143
      format.js
137 144
      format.api {render_api_ok}
138 145
    end
app/views/context_menus/users.html.erb (working copy)
23 23
  <% else %>
24 24
    <% unless @users.all?(&:locked?) %>
25 25
      <li>
26
        <%= context_menu_link sprite_icon('lock', l(:button_lock)), bulk_lock_users_path(ids: @users.map(&:id)), method: :post, class: 'icon icon-lock' %>
26
        <%= context_menu_link sprite_icon('lock', l(:button_lock)), bulk_lock_users_path(ids: @user_ids), method: :post, class: 'icon icon-lock' %>
27 27
      </li>
28 28
    <% else %>
29 29
      <li>
30
        <%= context_menu_link sprite_icon('unlock', l(:button_unlock)), bulk_unlock_users_path(ids: @users.map(&:id)), method: :post, class: 'icon icon-unlock' %>
30
        <%= context_menu_link sprite_icon('unlock', l(:button_unlock)), bulk_unlock_users_path(ids: @user_ids), method: :post, class: 'icon icon-unlock' %>
31 31
      </li>
32 32
    <% end %>
33 33
    <li>
34 34
      <%= context_menu_link sprite_icon('del', l(:button_delete)),
35
                            {controller: 'users', action: 'bulk_destroy', ids: @users.map(&:id)},
35
                            {controller: 'users', action: 'bulk_destroy', ids: @user_ids},
36 36
                            method: :delete, class: 'icon icon-del' %>
37 37
    </li>
38 38
  <% end %>
39
  <% if @groups_for_add.any? %>
40
    <li class="folder">
41
      <a href="#" class="submenu"><%= l(:label_add_user_to_group) %></a>
42
      <span class="icon-only"><%= sprite_icon('angle-right', rtl: true) %></span>
43
      <ul>
44
        <% @groups_for_add.each do |group| %>
45
          <li>
46
            <%= context_menu_link group.name,
47
                group_users_path(user_ids: @user_ids, id: group.id),
48
                :method => :post,
49
                :disabled => false %>
50
          </li>
51
        <% end %>
52
      </ul>
53
    </li>
54
  <% end %>
55
  <% if @groups_for_remove.any? %>
56
    <li class="folder">
57
      <a href="#" class="submenu"><%= l(:label_remove_user_from_group) %></a>
58
      <span class="icon-only"><%= sprite_icon('angle-right', rtl: true) %></span>
59
      <ul>
60
        <% @groups_for_remove.each do |group| %>
61
          <li>
62
            <%= context_menu_link group.name,
63
                group_remove_users_path(user_ids: @user_ids, id: group.id),
64
                method: :delete,
65
                data: { confirm: l(:text_remove_user_from_group_confirmation, count: @user_ids.size, groupname: group.name, users: @user_names) } %>
66
          </li>
67
        <% end %>
68
      </ul>
69
    </li>
70
  <% end %>
71

  
39 72
</ul>
app/views/groups/remove_user.js.erb (nonexistent)
1
$('#tab-content-users').html('<%= escape_javascript(render :partial => 'groups/users') %>');
2 0

  
config/routes.rb (working copy)
344 344

  
345 345
  get 'groups/:id/users/new', :to => 'groups#new_users', :id => /\d+/, :as => 'new_group_users'
346 346
  post 'groups/:id/users', :to => 'groups#add_users', :id => /\d+/, :as => 'group_users'
347
  delete 'groups/:id/users/:user_id', :to => 'groups#remove_user', :id => /\d+/, :as => 'group_user'
347
  delete 'groups/:id/users/:user_id', :to => 'groups#remove_users', :id => /\d+/, :as => 'group_user'
348
  delete 'groups/:id/users', :to => 'groups#remove_users', :id => /\d+/, :as => 'group_remove_users'
348 349

  
349 350
  resources :trackers, :except => :show do
350 351
    collection do
(6-6/8)