parse ranges and return some data about the filtering
This commit is contained in:
parent
4fa9a01c73
commit
1957e3854a
1 changed files with 33 additions and 21 deletions
|
@ -3,34 +3,46 @@ module DataTable
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
def apply_filter(user, params)
|
||||
p AjaxRequest.new(params)
|
||||
selection_to_json(user, user.transactions)
|
||||
params = sanitize_params(params)
|
||||
selection_to_json(user, params[:draw], user.transactions)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
class AjaxRequest
|
||||
|
||||
def initialize(params)
|
||||
def sanitize_params(params)
|
||||
# Parsing according to https://datatables.net/manual/server-side
|
||||
@draw = params.require(:draw).to_i
|
||||
@start = params.require(:start).to_i
|
||||
@length = params.require(:length).to_i
|
||||
@columns = Hash.new
|
||||
clean = {
|
||||
draw: params.require(:draw).to_i,
|
||||
start: params.require(:start).to_i,
|
||||
length: params.require(:length).to_i,
|
||||
columns: Hash.new
|
||||
}
|
||||
params.require(:columns).each do |i, column|
|
||||
@columns[column.require(:data).to_sym] = {
|
||||
type, value = column.require(:search)[:value].split(':')
|
||||
h = clean[:columns][column.require(:data).to_sym] = {
|
||||
name: column[:name],
|
||||
searchable: column[:searchable] == 'true',
|
||||
orderable: column[:orderable] == 'true',
|
||||
search_value: column.require(:search)[:value]
|
||||
type: type
|
||||
}
|
||||
if type == 'number-range'
|
||||
h[:lower], h[:upper] = value.split('~').map &:to_i
|
||||
elsif type == 'date-range'
|
||||
h[:lower], h[:upper] = value.split('~').map &:to_datetime
|
||||
else
|
||||
h[:value] = value
|
||||
end
|
||||
end
|
||||
return clean
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def selection_to_json(user, selection)
|
||||
{ data: selection.map { |transaction| {
|
||||
def selection_to_json(user, draw, selection)
|
||||
selection = selection.to_a
|
||||
{
|
||||
draw: draw,
|
||||
recordsTotal: user.transactions.count,
|
||||
recordsFiltered: selection.count,
|
||||
data: selection.map { |transaction| {
|
||||
time: transaction.created_at,
|
||||
amount: transaction.signed_amount_for(user),
|
||||
peer: transaction.peer_of(user).try(:name),
|
||||
|
|
Loading…
Reference in a new issue