diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 139dfb67..7abdcfd0 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -7,9 +7,10 @@ module Admin end def index + users_datatable = Datatable.new(view_context, User.where(nil), %w(name email), %w(id state email name)) respond_to do |format| format.html - format.json { render json: UsersDatatable.new(view_context) } + format.json { render json: users_datatable.to_json(data: users_datatable.paginated_records.map {|user| users_datatable_data(user)}) } end end diff --git a/app/datatables/datatable.rb b/app/datatables/datatable.rb new file mode 100644 index 00000000..6f5d4340 --- /dev/null +++ b/app/datatables/datatable.rb @@ -0,0 +1,48 @@ +class Datatable + delegate :params, to: :@view + + def initialize(view, collection, search_columns, sort_columns) + @view = view + @collection = collection + @search_columns = search_columns + @sort_columns = sort_columns + end + + def as_json(options={}) + { + sEcho: params[:sEcho].to_i, + iTotalRecords: @collection.count, + iTotalDisplayRecords: records.count, + aaData: options[:data] + } + end + + def paginated_records + paginate(records) + end + + private + + def records + @records ||= fetch_records + end + + def fetch_records + sort_direction = params[:sSortDir_0] == 'desc' ? 'desc' : 'asc' + sort_column = @sort_columns[params[:iSortCol_0].to_i] + records = @collection.order("#{sort_column} #{sort_direction}") + if params[:sSearch].present? && @search_columns.present? + search_query = '' + @search_columns.each { |column| search_query += "#{column} like :search or " } + search_query = search_query.chomp(' or ') + records = records.where(search_query, search: "%#{params[:sSearch]}%") + end + records + end + + def paginate(records) + per_page = params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10 + page = params[:iDisplayStart].to_i / per_page + 1 + records.offset((page - 1) * per_page).limit(per_page) + end +end diff --git a/app/datatables/users_datatable.rb b/app/datatables/users_datatable.rb deleted file mode 100644 index 7f895b50..00000000 --- a/app/datatables/users_datatable.rb +++ /dev/null @@ -1,53 +0,0 @@ -class UsersDatatable - delegate :params, :link_to, :current_ability, :show_roles, to: :@view - - def initialize(view) - @view = view - end - - def as_json(_options = {}) - { - sEcho: params[:sEcho].to_i, - iTotalRecords: User.count, - iTotalDisplayRecords: users.count, - aaData: data - } - end - - private - - def data - paginate(users).map do |user| - [ - user.id, - (user.confirmed? ? 'confirmed' : 'unconfirmed'), - user.email, - user.name, - user.registrations.where(attended: true).count, - (user.roles.empty? ? 'None' : "#{show_roles(user.get_roles.first(2))} #{'...' if user.get_roles.count > 2}"), - (link_to('View', Rails.application.routes.url_helpers.admin_user_path(user), class: 'btn btn-success') if current_ability.can?(:show, user)), - (link_to('Edit', Rails.application.routes.url_helpers.edit_admin_user_path(user), class: 'btn btn-primary') if current_ability.can?(:update, user)) - ] - end - end - - def users - @users ||= fetch_users - end - - def fetch_users - sort_direction = params[:sSortDir_0] == 'desc' ? 'desc' : 'asc' - sort_column = %w(id state email name)[params[:iSortCol_0].to_i] - users = User.order("#{sort_column} #{sort_direction}") - if params[:sSearch].present? - users = users.where('name like :search or email like :search', search: "%#{params[:sSearch]}%") - end - users - end - - def paginate(users) - per_page = params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10 - page = params[:iDisplayStart].to_i / per_page + 1 - users.offset((page - 1) * per_page).limit(per_page) - end -end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 09f69484..24730355 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -491,4 +491,17 @@ module ApplicationHelper end end end + + def users_datatable_data(user) + [ + user.id, + (user.confirmed? ? 'confirmed' : 'unconfirmed'), + user.email, + user.name, + user.registrations.where(attended: true).count, + (user.roles.empty? ? 'None' : "#{show_roles(user.get_roles.first(2))} #{'...' if user.get_roles.count > 2}"), + (view_context.link_to('View', admin_user_path(user), class: 'btn btn-success') if current_ability.can?(:show, user)), + (view_context.link_to('Edit', edit_admin_user_path(user), class: 'btn btn-primary') if current_ability.can?(:update, user)) + ] + end end