Module: TableOnSteroids::TableConcern

Extended by:
ActiveSupport::Concern
Defined in:
app/controllers/concerns/table_on_steroids/table_concern.rb

Instance Method Summary collapse

Instance Method Details

#filter_and_order(objects, columns_on_steroid, global_search = nil, include_counts = false, all_pages = false) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 40

def filter_and_order(objects, columns_on_steroid, global_search=nil, include_counts=false, all_pages=false )
  # execute the global search if you have one
  objects = global_search.call(objects,params[:search]) if global_search && params[:search].present?

  [:activerecord, :array].each do |t|

    #column search 
    objects = objects_where(objects, columns_on_steroid, t) 

    #apply filters
    if params[:filters].present?
      params[:filters].each_pair do | k, v |
        filter = columns_on_steroid[k]
        next unless filter.present? && filter[t].present?
        objects = filter[t][:filter_lambda].call(objects, v)
      end
    end

    #order
    if params[:knowledge] && params[:knowledge] && params[:knowledge][:order].present? && (object_order = columns_on_steroid[params[:knowledge][:order]]).present?       
      if(object_order[t] && object_order[t][:order_lambda])
        objects = objects.reorder(nil) if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
        objects = object_order[t][:order_lambda].call(objects)
      end
    elsif(object_order = columns_on_steroid.select{ |c,v| v[:default_order]}.collect{ |c,v| v[:order_lambda] }).present?
      objects = object_order.call(objects)
    elsif(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
      #objects = objects.order('created_at desc')
    end

  end

  #pagination 
  return (include_counts ? [objects, 1, objects.count] : objects) if all_pages
  if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
    objects = objects.page(params[:page]).per(OBJECTS_PER_PAGE) 
    total_pages = objects.total_pages
    total_count = objects.total_count
  else 
    total_count = objects.count
    total_pages = total_count / OBJECTS_PER_PAGE.to_f 
    current_offset = OBJECTS_PER_PAGE * ((params[:page] || 1) - 1)
    objects = objects[current_offset..(current_offset + OBJECTS_PER_PAGE)]
  end
  include_counts ? [objects, total_pages, total_count] : objects
end

#object_where_integer(integer, operator, value) ⇒ Object



139
140
141
142
143
144
145
146
147
148
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 139

def object_where_integer(integer, operator, value)
    case operator
  when "<",">=" then
    return integer.to_f < value.to_f
  when "=" then
    return integer.to_f == value.to_f
  when ">" then
    return integer.to_f > value.to_f
  end
end

#objects_where(objects, columns_on_steroid, t) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 103

def objects_where(objects, columns_on_steroid, t)
  columns_on_steroid.select{ 
    |c,v| v[t] && v[t][:search_lambda].present? }.each{ 
      |c,v| 
        if(params["search_operator_" + c]) # (v[:datatype].present? && ['date','integer'].include?(v[:datatype]))
          objects = v[t][:search_lambda].call(objects, params["search_" + c], params["search_operator_" + c]) if(params["search_" + c] && !params["search_" + c].blank?) 
        else
          objects = v[t][:search_lambda].call(objects, params["search_" + c]) if(params["search_" + c] && !params["search_" + c].blank?) 
        end
      }
  objects
end

#objects_where_date(objects, column, value, operator) ⇒ Object



116
117
118
119
120
121
122
123
124
125
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 116

def objects_where_date(objects, column, value, operator)
  case operator
  when "<",">=" then
    return objects.where((column + ' ' + operator + ' ?'), (value + " 00:00:00") )
  when ">","<=" then
    return objects.where((column + ' ' + operator + ' ?'), (value + " 23:59:59") )
  when "=" then
    return objects.where((column + ' between ? and ?'), (value + " 00:00:00"), (value + " 23:59:59")  )
  end
end

#objects_where_or(objects, columns_on_steroid) ⇒ Object

save for later



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 151

def objects_where_or(objects, columns_on_steroid)
  where_sql = "" 
  values = []
  
  #search all columns
  if(!query.blank?)
    where_sql += columns_on_steroid.select{ 
      |c,v| v[:or_where_sql].present? }.map{ 
        |c,v| v[:or_where_sql].map{ 
          |w| w[:where] }.join(" or ") }.join(" or ")
    
    columns_on_steroid.select{ 
      |c,v| v[:or_where_sql].present? }.map{ 
        |c,v| v[:or_where_sql].each{ 
          |w| values << ((w[:value]) ? w[:value] : ("%" + query + "%")) }}

    where_sql = ("(" + where_sql + ")") if !where_sql.blank?

    objects = objects.where(where_sql, *values)
  end

  objects
end

#objects_where_ruby_date(object, column, value, operator) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 127

def objects_where_ruby_date(object, column, value, operator)
  value = Date.strptime(value, '%m/%d/%Y').midnight
  case operator
  when "<" then
    return object.send(column) < value
  when ">" then
    return object.send(column) > value + 1.days - 1.seconds
  when "=" then
    return ((object.send(column) > value) && (object.send(column) < (value + 1.days - 1.seconds)))
  end
end

#table_csv(objects, columns_on_steroid) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/controllers/concerns/table_on_steroids/table_concern.rb', line 87

def table_csv(objects, columns_on_steroid)
  titles = []
  csvs = CSV.generate do |csv|
    columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each{ |c,v| ((v[:download_label].present?) ? titles.push(*v[:download_label]) : titles << v[:label]) }
    csv << titles
    objects.each do |o|
      vals = []
      columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each do |c,v| 
        vals.push(*v[:download_value_lambda].call(o))
      end
      csv << vals
    end
  end
end