class UniversalTablesController < ApplicationController
include Admin::UniversalTablesHelper
def index
params = OrbitHelper.params
table = UTable.where(:category_id => OrbitHelper.page_categories.first).first rescue nil
page = Page.where(:page_id => params[:page_id]).first
if !table.nil?
reset = "hide"
table_heads = table.table_columns.where(:display_in_index => true).asc(:order).collect do |tc|
search = ""
sort_class = "sort"
sort = ""
form_field = ""
query_string = ""
query_string = "&column=#{params["column"]}&q=#{params["q"]}" if params["column"].present?
query_string = query_string + "&page_no=#{params["page_no"]}" if params["page_no"].present?
sort_url = "/#{I18n.locale.to_s}#{page.url}?sortcolumn=#{tc.key}&sort=asc#{query_string}"
title_class = ""
case tc.type
when "date"
search = "hide"
when "period","image"
sort_class = "sort hide"
search = "hide"
sort_url = "#"
sort = "hide"
when "editor"
sort_url = "#"
sort = "hide"
sort_class = "sort hide"
when "text"
if tc.make_categorizable
select_values = tc.column_entries.distinct(:text).uniq
form_field = ""
end
end
if params["sortcolumn"] == tc.key
sort_class = params["sort"] == "asc" ? "sort-desc" : "sort-asc"
sort_url = "/#{I18n.locale.to_s}#{page.url}?sortcolumn=#{tc.key}&sort=#{params["sort"] == "asc" ? "desc" : "asc"}#{query_string}"
end
title_class = title_class + "no-sort" if sort == "sort"
title_class = title_class + " no-search" if search == "hide"
{
"title" => tc.title,
"type" => tc.type,
"key" => tc.key,
"search" => search,
"form-field" => form_field,
"sort" => sort,
"sort-class" => sort_class,
"sort-url" => sort_url,
"title-class" => title_class
}
end
tablecolumns = table.table_columns.where(:display_in_index => true).asc(:order)
rows = []
if params["column"].present?
reset = ""
keywords = params["q"]
keywords = keywords.strip.nil? ? keywords : keywords.strip
regexes = keywords.split(/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/)
regex = Regexp.union(regexes.map{|word| Regexp.new(".*"+word+".*", "i")})
column = table.table_columns.where(:key => params["column"]).first
if params["sort"].present?
column_to_sort = table.table_columns.where(:key => params["sortcolumn"]).first
case column_to_sort.type
when "text"
field_name = :text
when "editor"
field_name = :content
when "date"
field_name = :date
end
if params["column"] == params["sortcolumn"]
columns = column.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex).order_by(field_name => params["sort"])
else
temp = column.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex)
columns = []
temp.each do |c|
columns << c.table_entry.column_entries.where(:table_column_id => column_to_sort.id).first
end
sorted_columns = column_to_sort.column_entries.order_by(field_name => params["sort"]).to_a
columns = sorted_columns & columns
end
else
columns = column.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex)
end
entries = []
columns.each do |column|
entries << column.table_entry
end
entries = entries.sort{|k,v| v["created_at"] <=> k["created_at"]} if !params["sort"].present?
entries = Kaminari.paginate_array(entries).page(params["page_no"]).per(OrbitHelper.page_data_count)
else
if params["sort"].present?
reset = ""
column_to_sort = table.table_columns.where(:key => params["sortcolumn"]).first
case column_to_sort.type
when "text"
field_name = :text
when "editor"
field_name = :content
when "date"
field_name = :date
end
columns = column_to_sort.column_entries.order_by(field_name => params["sort"])
entries = []
columns.each do |column|
entries << column.table_entry
end
entries = Kaminari.paginate_array(entries).page(params["page_no"]).per(OrbitHelper.page_data_count)
else
entries = table.table_entries.desc(:created_at).page(params["page_no"]).per(OrbitHelper.page_data_count)
end
end
total_pages = entries.total_pages
entries.each do |te|
cols = []
sort_value = ""
tablecolumns.each do |column|
ce = te.column_entries.where(:table_column_id => column.id).first rescue nil
if !ce.nil?
text = ""
case ce.type
when "text"
text = ce.text
when "editor"
text = ce.content
when "date"
text = format_date(ce.date, column.date_format)
when "period"
text = format_date(ce.period_from, column.date_format) + " ~ " + format_date(ce.period_to, column.date_format)
text = "" if text.starts_with?(" ~")
when "image"
text = ""
end
if column.is_link_to_show
text = "#{text}"
end
cols << {"text" => text}
else
cols << {"text" => ""}
end
end
rows << {
"columns" => cols
}
end
end
{
"head-columns" => table_heads,
"rows" => rows,
"total_pages" => total_pages,
"extras" => {
"table-name" => table.title,
"reset" => reset,
"url" => "/#{I18n.locale.to_s}#{page.url}"
}
}
end
def show
params = OrbitHelper.params
entry = TableEntry.where(:uid => params[:uid]).first rescue nil
rows = []
entry.column_entries.each do |ce|
ct = ce.table_column
text = ""
case ce.type
when "text"
text = ce.text
when "editor"
text = ce.content
when "date"
text = format_date(ce.date, ce.table_column.date_format)
when "period"
text = format_date(ce.period_from, ce.table_column.date_format) + " ~ " + format_date(ce.period_from, ce.table_column.date_format)
text = "" if text.starts_with?(" ~")
when "image"
text = ""
end
rows << {
"title" => ct.title,
"text" => text,
"order" => ct.order
} if text != ""
end
sorted = rows.sort{ |k,v| k["order"] <=> v["order"] }
{
"entry" => sorted
}
end
end