Project

General

Profile

Feature #43355 » 0002-Add-pagination-to-the-group-users-management-list.patch

Takenori TAKAKI, 2026-09-10 19:23

View differences:

app/controllers/groups_controller.rb
119 119
    respond_to do |format|
120 120
      format.html do
121 121
        flash[:notice] = l(:notice_successful_update)
122
        redirect_back_or_default edit_group_path(@group, :tab => 'users')
122
        redirect_back_or_default edit_group_path(@group, group_users_url_params)
123 123
      end
124 124
      format.js
125 125
      format.api do
......
145 145
      respond_to do |format|
146 146
        format.html do
147 147
          flash[:notice] = l(:notice_successful_delete)
148
          redirect_back_or_default edit_group_path(@group, :tab => 'users')
148
          redirect_back_or_default edit_group_path(@group, group_users_url_params)
149 149
        end
150 150
        format.api {render_api_ok}
151 151
      end
......
174 174
  def user_count_by_group_id
175 175
    User.joins(:groups).group(:group_id).count.transform_keys(&:to_i)
176 176
  end
177

  
178
  def group_users_url_params
179
    query = {:tab => 'users'}
180
    query[:users_page] = params[:users_page] if params[:users_page].present?
181
    query[:per_page] = params[:per_page] if params[:per_page].present?
182
    query
183
  end
177 184
end
app/helpers/groups_helper.rb
50 50
      end
51 51
    s + content_tag('span', links, :class => 'pagination')
52 52
  end
53

  
54
  def paginate_group_users(group)
55
    scope = group.users.sorted
56
    user_count = scope.count
57
    user_pages = Redmine::Pagination::Paginator.new(user_count, per_page_option, params['users_page'], 'users_page')
58
    users = scope.limit(user_pages.per_page).offset(user_pages.offset).to_a
59
    [users, user_pages, user_count]
60
  end
53 61
end
app/views/groups/_new_users_modal.html.erb
1 1
<h3 class="title"><%= l(:label_user_new) %></h3>
2 2

  
3
<%= form_for(@group, :url => group_users_path(@group), :remote => true, :method => :post) do |f| %>
3
<%= form_for(@group, :url => group_users_path(@group, :users_page => params[:users_page]), :remote => true, :method => :post) do |f| %>
4 4
  <%= render :partial => 'new_users_form' %>
5 5
  <p class="buttons">
6 6
    <%= submit_tag l(:button_add) %>
app/views/groups/_users.html.erb
1
<p><%= link_to sprite_icon('add', l(:label_user_new)), new_group_users_path(@group), :remote => true, :class => "icon icon-add" %></p>
1
<% users, user_pages, user_count = paginate_group_users(@group) %>
2
<p><%= link_to sprite_icon('add', l(:label_user_new)), new_group_users_path(@group, :users_page => params[:users_page]), :remote => true, :class => "icon icon-add" %></p>
2 3

  
3
<% if @group.users.any? %>
4
<% if user_count > 0 %>
5
  <div class="autoscroll">
4 6
  <table class="list users">
5 7
    <thead><tr>
6 8
      <th><%= l(:label_user) %></th>
7 9
      <th style="width:15%"></th>
8 10
    </tr></thead>
9 11
    <tbody>
10
    <% @group.users.sort.each do |user| %>
12
    <% users.each do |user| %>
11 13
      <tr id="user-<%= user.id %>">
12 14
        <td class="name"><%= link_to_user user %></td>
13 15
        <td class="buttons">
14
          <%= link_to sprite_icon('link-break', l(:button_remove)), group_users_path(@group, :user_id => user), :method => :delete, :class => 'icon icon-link-break' %>
16
          <%= link_to sprite_icon('link-break', l(:button_remove)), group_users_path(@group, :user_id => user, :users_page => params[:users_page]), :method => :delete, :class => 'icon icon-link-break' %>
15 17
        </td>
16 18
      </tr>
17 19
    <% end %>
18 20
    </tbody>
19 21
  </table>
22
  </div>
23
  <span class="pagination">
24
    <%= pagination_links_full(user_pages, user_count) do |text, parameters, options|
25
          link_to text, edit_group_path(@group, request.query_parameters.merge(parameters).merge(:tab => 'users')), options
26
        end %>
27
  </span>
20 28
<% else %>
21 29
  <p class="nodata"><%= l(:label_no_data) %></p>
22 30
<% end %>
test/functional/groups_controller_test.rb
169 169
    assert_select 'div#tab-content-memberships a.icon-link-break', :text => 'Remove'
170 170
  end
171 171

  
172
  def test_edit_users_tab_should_be_paginated
173
    group = Group.generate!
174
    3.times { group.users << User.generate! }
175

  
176
    with_settings :per_page_options => '2,25,50' do
177
      get(:edit, :params => {:id => group.id, :tab => 'users'})
178
      assert_response :success
179
      assert_select 'div#tab-content-users table.users tbody tr', :count => 2
180
      assert_select 'div#tab-content-users span.pagination'
181
      assert_select 'div#tab-content-users span.pagination a[href*=?]', 'users_page='
182

  
183
      get(:edit, :params => {:id => group.id, :tab => 'users', :users_page => 2})
184
      assert_response :success
185
      assert_select 'div#tab-content-users table.users tbody tr', :count => 1
186
    end
187
  end
188

  
189
  def test_edit_users_tab_with_out_of_range_page_should_keep_pagination
190
    group = Group.generate!
191
    3.times { group.users << User.generate! }
192

  
193
    with_settings :per_page_options => '2,25,50' do
194
      get(:edit, :params => {:id => group.id, :tab => 'users', :users_page => 99})
195
    end
196
    assert_response :success
197
    assert_select 'div#tab-content-users p.nodata', :count => 0
198
    assert_select 'div#tab-content-users table.users'
199
    assert_select 'div#tab-content-users span.pagination a[href*=?]', 'users_page='
200
  end
201

  
202
  def test_edit_users_tab_without_users_should_show_no_data
203
    group = Group.generate!
204
    get(:edit, :params => {:id => group.id, :tab => 'users'})
205
    assert_response :success
206
    assert_select 'div#tab-content-users p.nodata'
207
    assert_select 'div#tab-content-users table.users', :count => 0
208
  end
209

  
210
  def test_new_users_xhr_should_keep_current_page_in_form_action
211
    get(:new_users, :params => {:id => 10, :users_page => 2}, :xhr => true)
212
    assert_response :success
213
    assert_match %r{/groups/10/users\?users_page=2}, response.body
214
  end
215

  
172 216
  def test_update
173 217
    new_name = 'New name'
174 218
    put(
test/helpers/groups_helper_test.rb
39 39
    assert_select_in result, 'span.pagination li.current span', :text => '1'
40 40
    assert_select_in result, 'a[href=?]', "/groups/#{group.id}/autocomplete_for_user.js?page=2", :text => '2'
41 41
  end
42

  
43
  def test_paginate_group_users_returns_only_the_requested_page
44
    # per_page_option is provided by ApplicationController in the running app
45
    stubs(:per_page_option).returns(2)
46
    group = Group.generate!
47
    3.times { group.users << User.generate! }
48

  
49
    users, user_pages, user_count = paginate_group_users(group)
50

  
51
    assert_equal 2, users.size
52
    assert_equal 2, user_pages.per_page
53
    assert_equal group.users.count, user_count
54
  end
42 55
end
(5-5/7)