scinote-web/app/datatables/team_users_datatable.rb
2021-03-22 13:40:25 +01:00

116 lines
3.2 KiB
Ruby

class TeamUsersDatatable < CustomDatatable
include InputSanitizeHelper
include ActiveRecord::Sanitization::ClassMethods
def_delegator :@view, :link_to
def_delegator :@view, :update_user_team_path
def_delegator :@view, :destroy_user_team_html_path
def initialize(view, team, user)
super(view)
@team = team
@user = user
end
def sortable_columns
@sortable_columns ||= [
'User.full_name',
'User.email',
'UserTeam.role',
'UserTeam.created_at',
'User.status'
]
end
def searchable_columns
@searchable_columns ||= [
'User.full_name',
'User.email',
'UserTeam.created_at'
]
end
# A hack that overrides the new_search_contition method default behavior of
# the ajax-datatables-rails gem now the method checks if the column is the
# created_at and generate a custom SQL to parse it back to the caller method
def new_search_condition(column, value)
model, column = column.split('.')
model = model.constantize
if column == 'created_at'
casted_column = ::Arel::Nodes::NamedFunction.new(
'CAST',
[Arel.sql(
"to_char( users.created_at, '#{formated_date}' ) AS VARCHAR"
)]
)
else
casted_column = ::Arel::Nodes::NamedFunction.new(
'CAST',
[model.arel_table[column.to_sym].as(typecast)]
)
end
casted_column.matches("%#{sanitize_sql_like(value)}%")
end
private
# Returns json of current items (already paginated)
def data
records.map do |record|
{
'DT_RowId': record.id,
'0': escape_input(record.user.full_name),
'1': escape_input(record.user.email),
'2': record.role_str,
'3': I18n.l(record.created_at, format: :full_date),
'4': record.user.active_status_str,
'5': ApplicationController.new.render_to_string(
partial: 'users/settings/teams/user_dropdown.html.erb',
locals: {
user_team: record,
update_role_path: update_user_team_path(record, format: :json),
destroy_uo_link: link_to(
I18n.t('users.settings.teams.edit.user_dropdown.remove_label'),
destroy_user_team_html_path(record, format: :json),
remote: true,
data: { action: 'destroy-user-team' }
),
user: @user
}
)
}
end
end
# Overwrite default pagination method as here
# we need to be able work also with arrays
def paginate_records(records)
records.to_a.drop(offset).first(per_page)
end
def load_paginator
self
end
# Query database for records (this will be later paginated and filtered)
# after that "data" function will return json
def get_raw_records
UserTeam
.includes(:user)
.references(:user)
.where(team: @team)
.distinct
end
def sort_records(records)
if sort_column(order_params) == 'users.status'
records = records.sort_by { |record| record.user.active_status_str }
order_params['dir'] == 'asc' ? records : records.reverse
elsif sort_column(order_params) == 'user_teams.role'
records = records.sort_by(&:role_str)
order_params['dir'] == 'asc' ? records : records.reverse
else
super(records)
end
end
end