Generalized datatable class
This commit is contained in:
parent
caa63f9c1c
commit
6cb6ddf78d
4 changed files with 63 additions and 54 deletions
|
|
@ -7,9 +7,10 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
users_datatable = Datatable.new(view_context, User.where(nil), %w(name email), %w(id state email name))
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
48
app/datatables/datatable.rb
Normal file
48
app/datatables/datatable.rb
Normal file
|
|
@ -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
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -491,4 +491,17 @@ module ApplicationHelper
|
||||||
end
|
end
|
||||||
end
|
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
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue