Module: TableOnSteroids::TableConcern
- Extended by:
- ActiveSupport::Concern
- Defined in:
- app/controllers/concerns/table_on_steroids/table_concern.rb
Instance Method Summary collapse
- #filter_and_order(objects, columns_on_steroid, global_search = nil, include_counts = false, all_pages = false) ⇒ Object
- #object_where_integer(integer, operator, value) ⇒ Object
- #objects_where(objects, columns_on_steroid, t) ⇒ Object
- #objects_where_date(objects, column, value, operator) ⇒ Object
-
#objects_where_or(objects, columns_on_steroid) ⇒ Object
save for later.
- #objects_where_ruby_date(object, column, value, operator) ⇒ Object
- #table_csv(objects, columns_on_steroid) ⇒ Object
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 |