2017-06-30 21:20:27 +08:00
|
|
|
class TeamUsersDatatable < CustomDatatable
|
2017-01-25 16:48:49 +08:00
|
|
|
include InputSanitizeHelper
|
2017-04-25 23:37:42 +08:00
|
|
|
include ActiveRecord::Sanitization::ClassMethods
|
2017-01-25 16:48:49 +08:00
|
|
|
|
|
|
|
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.created_at',
|
|
|
|
'User.confirmed_at',
|
|
|
|
'UserTeam.role'
|
|
|
|
]
|
|
|
|
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
|
|
|
|
formated_date = (I18n.t 'time.formats.datatables_date')
|
|
|
|
.gsub!(/^\"|\"?$/, '')
|
|
|
|
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
|
2017-04-25 23:37:42 +08:00
|
|
|
casted_column.matches("%#{sanitize_sql_like(value)}%")
|
2017-01-25 16:48:49 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
# Returns json of current samples (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),
|
2017-01-30 22:55:21 +08:00
|
|
|
'2': record.role_str,
|
|
|
|
'3': I18n.l(record.created_at, format: :full_date),
|
|
|
|
'4': record.user.active_status_str,
|
2017-01-25 16:48:49 +08:00
|
|
|
'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
|
|
|
|
|
|
|
|
# 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
|
|
|
|
end
|