• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

MarkUsProject / Markus / 27252220931

10 Jun 2026 04:00AM UTC coverage: 90.293% (-0.01%) from 90.303%
27252220931

Pull #7997

github

web-flow
Merge 08dfe0548 into 753af008a
Pull Request #7997: Add pagination to Admin Users table for performance

1067 of 2259 branches covered (47.23%)

Branch coverage included in aggregate %.

62 of 69 new or added lines in 3 files covered. (89.86%)

1 existing line in 1 file now uncovered.

46334 of 50238 relevant lines covered (92.23%)

126.49 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.38
/app/controllers/admin/users_controller.rb
1
module Admin
1✔
2
  class UsersController < ApplicationController
1✔
3
    DEFAULT_FIELDS = [:id, :user_name, :email, :id_number, :type, :first_name, :last_name].freeze
1✔
4
    SEARCHABLE_FIELDS = %w[user_name first_name last_name email id_number].freeze
1✔
5
    before_action { authorize! }
40✔
6

7
    respond_to :html
1✔
8
    layout 'assignment_content'
1✔
9

10
    def index
1✔
11
      respond_to do |format|
7✔
12
        format.html
7✔
13
        format.json do
7✔
14
          users_scope = visible_users
6✔
15

16
          if params[:filtered].present?
6✔
17
            JSON.parse(params[:filtered]).each do |f|
1✔
18
              next if f['value'].blank?
1✔
19

20
              if SEARCHABLE_FIELDS.include?(f['id'])
1✔
21
                term = "%#{User.sanitize_sql_like(f['value'].strip)}%"
1✔
22
                users_scope = users_scope.where("#{f['id']} ILIKE ?", term)
1✔
NEW
23
              elsif f['id'] == 'type' && f['value'] != 'all'
×
NEW
24
                users_scope = users_scope.where(type: f['value'])
×
25
              end
26
            end
27
          end
28

29
          if params[:sorted].present?
6✔
30
            sort_config = JSON.parse(params[:sorted]).first
1✔
31
            if sort_config
1✔
32
              direction = sort_config['desc'] ? 'DESC' : 'ASC'
1✔
33
              column = if %w[user_name first_name last_name email id_number type].include?(sort_config['id'])
1✔
34
                         sort_config['id']
1✔
35
                       else
NEW
UNCOV
36
                         'user_name'
×
37
                       end
38
              users_scope = users_scope.order("#{column} #{direction}")
1✔
39
            end
40
          else
41
            users_scope = users_scope.order(:user_name)
5✔
42
          end
43

44
          per_page = (params[:per_page] || 100).to_i
6✔
45
          current_page = (params[:page] || 1).to_i
6✔
46
          total_count = users_scope.count
6✔
47
          calculated_pages = (total_count.to_f / per_page).ceil
6✔
48
          offset_value = (current_page - 1) * per_page
6✔
49
          records = users_scope.limit(per_page).offset(offset_value)
6✔
50

51
          render json: {
6✔
52
            users: records.pluck_to_hash(:id, :user_name, :first_name, :last_name, :email, :id_number, :type),
53
            total_pages: calculated_pages > 0 ? calculated_pages : 1
6✔
54
          }
55
        end
56
      end
57
    end
58

59
    def new
1✔
60
      @user = User.new
1✔
61
    end
62

63
    def create
1✔
64
      user_params = params.require(:user)
4✔
65
      user_params[:type] = nil unless [EndUser.name, AdminUser.name].include? user_params[:type]
4✔
66
      @user = User.create(user_params.permit(*DEFAULT_FIELDS))
4✔
67
      respond_with @user, location: -> { admin_users_path }
6✔
68
    end
69

70
    def edit
1✔
71
      @user = record
1✔
72
    end
73

74
    def update
1✔
75
      @user = record
3✔
76
      user_params = params.require(@user.model_name.to_s.underscore)
3✔
77
      @user.update(user_params.permit(:user_name, :email, :id_number, :first_name, :last_name))
3✔
78
      respond_with @user, location: -> { edit_admin_user_path(@user) }
5✔
79
    end
80

81
    def upload
1✔
82
      begin
83
        data = process_file_upload(['.csv'])
5✔
84
      rescue StandardError => e
85
        flash_message(:error, e.message)
2✔
86
      else
87
        @current_job = UploadUsersJob.perform_later(EndUser,
3✔
88
                                                    data[:contents],
89
                                                    data[:encoding])
90
        session[:job_id] = @current_job.job_id
3✔
91
      end
92
      redirect_to action: 'index'
5✔
93
    end
94

95
    protected
1✔
96

97
    def implicit_authorization_target
1✔
98
      OpenStruct.new policy_class: Admin::UserPolicy
213✔
99
    end
100

101
    private
1✔
102

103
    # Do not make AutotestUser users visible
104
    def visible_users
1✔
105
      User.where.not(type: :AutotestUser)
6✔
106
    end
107

108
    def flash_interpolation_options
1✔
109
      { resource_name: @user.user_name.presence || @user.model_name.human,
7✔
110
        errors: @user.errors.full_messages.join('; ') }
111
    end
112
  end
113
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc