class Engine2::ListAction
Public Instance Methods
invoke(handler)
click to toggle source
# File lib/engine2/action/list.rb, line 96 def invoke handler params = handler.params model = assets[:model] query = list_context(get_query, handler) if search = params[:search] query = list_search(query, handler, search) elsif @filters || static.filters static.filters.to_h.merge(@filters.to_h).each do |name, filter| query = filter.(handler, query, {}) handler.permit query end end count = query.count if lookup(:config, :use_count) if order = params[:order] order = order.to_sym handler.permit lookup(:fields, order, :sort) query = list_order(query, handler, order, params[:asc] == "true") elsif order = @default_order_field || static.default_order_field query = list_order(query, handler, order, true) end per_page = lookup(:config, :per_page) page = params[:page].to_i handler.permit page >= 0 && page < 1000000 query = query.limit(per_page, page) res = {entries: page_frame(handler, query.load_all)} res[:count] = count if count res end
list_context(query, handler)
click to toggle source
# File lib/engine2/action/list.rb, line 190 def list_context query, handler query end
list_order(query, handler, order, asc)
click to toggle source
# File lib/engine2/action/list.rb, line 178 def list_order query, handler, order, asc model = assets[:model] query = if order_blk = (@orders && @orders[order]) || (dynamic? && (static.orders && static.orders[order])) order_blk.(handler, query) else order = model.table_name.q(order) if model.type_info[order] query.order(order) end asc ? query : query.reverse end
list_search(query, handler, search)
click to toggle source
# File lib/engine2/action/list.rb, line 131 def list_search query, handler, search hash = JSON.parse(search, symbolize_names: true) rescue handler.halt_forbidden model = assets[:model] sfields = lookup(:search_field_list) handler.permit sfields filters = @filters || static.filters ? static.filters.to_h.merge(@filters.to_h) : {} sfields.each do |name| type_info = model.find_type_info(name) name = name.to_sym filter = filters[name] if !(value = hash[name]).nil? # use key? query = if filter filter.(handler, query, hash) elsif filter = DefaultFilters[type_info[:otype]] name = model.type_info[name] ? model.table_name.q(name) : Sequel.expr(name) filter.(query, name, value, type_info, hash) else raise E2Error.new("Filter not found for field '#{name}' in model '#{model}'") unless filter end handler.permit query else if filter query = filter.(handler, query, hash) handler.permit query end end end # hash.each_pair do |name, value| # handler.permit name = sfields.find{|sf|sf.to_sym == name} # type_info = model.find_type_info(name) # query = if filter = (@filters && @filters[name]) || (dynamic? && (static.filters && static.filters[name])) # filter.(handler, query, hash) # elsif filter = DefaultFilters[type_info[:otype]] # name = model.type_info[name] ? model.table_name.q(name) : Sequel.expr(name) # filter.(query, name, value, type_info, hash) # else # raise E2Error.new("Filter not found for field '#{name}' in model '#{model}'") unless filter # end # handler.permit query # end query end
page_frame(handler, entries)
click to toggle source
# File lib/engine2/action/list.rb, line 92 def page_frame handler, entries entries end
post_run()
click to toggle source
Calls superclass method
Engine2::Action#post_run
# File lib/engine2/action/list.rb, line 87 def post_run query select(*assets[:model].columns.reject{|col| assets[:model].type_info[col][:length].to_i > 20}.take(10)) unless @query super end