From caa63f9c1c8998c0b0b6ce6b889f7ed7f71b9f73 Mon Sep 17 00:00:00 2001 From: Nishanth Vijayan Date: Mon, 1 Aug 2016 02:32:48 +0530 Subject: [PATCH] Implement server-side rendering of datatables in users#index --- app/assets/javascripts/osem-datatables.js | 9 +++- app/controllers/admin/users_controller.rb | 5 ++- app/datatables/users_datatable.rb | 53 +++++++++++++++++++++++ app/views/admin/users/index.html.haml | 30 +------------ 4 files changed, 66 insertions(+), 31 deletions(-) create mode 100644 app/datatables/users_datatable.rb diff --git a/app/assets/javascripts/osem-datatables.js b/app/assets/javascripts/osem-datatables.js index f950159e..b6453604 100644 --- a/app/assets/javascripts/osem-datatables.js +++ b/app/assets/javascripts/osem-datatables.js @@ -12,7 +12,14 @@ $(function () { pagingType: 'full_numbers', order: [[ 0, 'desc' ]] }); + + $('#userstable').DataTable({ + pagingType: 'full_numbers', + processing: true, + serverSide: true, + sAjaxSource: $('#userstable').data('source'), + aoColumns: [ null, { "bSortable": false }, null, null, { "bSortable": false }, { "bSortable": false }, { "bSortable": false }, { "bSortable": false }] + }); }); }); - diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index dbd54ffd..139dfb67 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -7,7 +7,10 @@ module Admin end def index - @users = User.all + respond_to do |format| + format.html + format.json { render json: UsersDatatable.new(view_context) } + end end def show diff --git a/app/datatables/users_datatable.rb b/app/datatables/users_datatable.rb new file mode 100644 index 00000000..7f895b50 --- /dev/null +++ b/app/datatables/users_datatable.rb @@ -0,0 +1,53 @@ +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/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index c3d7b672..ffea91c2 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -7,7 +7,7 @@ = "(#{@users.length})" .row .col-md-12.table-responsive - %table.table.table-striped.table-bordered.table-hover.datatable + %table.table.table-striped.table-bordered.table-hover#userstable{data: {source: admin_users_path(format: :json)}} %thead %th ID %th State @@ -18,31 +18,3 @@ %th View %th Edit %tbody - - @users.each do |user| - %tr - %td - = user.id - %td - - if user.confirmed? - confirmed - - else - unconfirmed - %td - = user.email - %td - = user.name - %td - = user.registrations.where(attended: true).count - %td - - unless user.get_roles.blank? - = show_roles(user.get_roles.first(2)) - - if user.get_roles.count > 2 - = '...' - - else - None - %td - - if can? :show, user - = link_to 'View', admin_user_path(user), class: 'btn btn-success' - %td - - if can? :update, user - = link_to 'Edit', edit_admin_user_path(user), class: 'btn btn-primary'