add default sorting option
This commit is contained in:
parent
22ce8d5f1a
commit
14038cf90c
|
@ -15,10 +15,11 @@ class Admin::UniversalTablesController < OrbitAdminController
|
||||||
@columns = @table.table_columns.asc(:order)
|
@columns = @table.table_columns.asc(:order)
|
||||||
@table_fields = @columns.collect{|tc| tc.title}
|
@table_fields = @columns.collect{|tc| tc.title}
|
||||||
if params[:q].present?
|
if params[:q].present?
|
||||||
@entries = Kaminari.paginate_array(search_data(@table)).page(params[:page]).per(10)
|
@entries = search_data(@table)
|
||||||
else
|
else
|
||||||
@entries = @table.table_entries.desc(:created_at).page(params[:page]).per(10)
|
@entries = @table.table_entries.criteria
|
||||||
end
|
end
|
||||||
|
@entries = @entries.sorting(params: params,table: @table).page(params[:page]).per(10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -242,11 +243,12 @@ class Admin::UniversalTablesController < OrbitAdminController
|
||||||
column.each do |c|
|
column.each do |c|
|
||||||
columns = (columns | c.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex))
|
columns = (columns | c.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex))
|
||||||
end
|
end
|
||||||
entries = []
|
entry_ids = []
|
||||||
columns.each do |column|
|
columns.each do |column|
|
||||||
entries << column.table_entry
|
entry_ids << column.table_entry_id
|
||||||
end
|
end
|
||||||
entries = entries.sort{|k,v| v["created_at"] <=> k["created_at"]}
|
entry_ids = entry_ids.uniq
|
||||||
|
entries = TableEntry.where(:id.in=> entry_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
def table_params
|
def table_params
|
||||||
|
|
|
@ -179,66 +179,66 @@ class UniversalTablesController < ApplicationController
|
||||||
def get_entries(params, table, page, paginated=true)
|
def get_entries(params, table, page, paginated=true)
|
||||||
entries = []
|
entries = []
|
||||||
if params["column"].present?
|
if params["column"].present?
|
||||||
keywords = params["q"]
|
keywords = params["q"]
|
||||||
keywords = keywords.strip.nil? ? keywords : keywords.strip
|
keywords = keywords.strip.nil? ? keywords : keywords.strip
|
||||||
column = table.table_columns.where(:key => params["column"]).first
|
column = table.table_columns.where(:key => params["column"]).first
|
||||||
if column.make_categorizable
|
if column.make_categorizable
|
||||||
regex = Regexp.new(".*"+keywords+".*", "i")
|
regex = Regexp.new(".*"+keywords+".*", "i")
|
||||||
else
|
else
|
||||||
regexes = keywords.split(/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/)
|
regexes = keywords.split(/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/)
|
||||||
regex = Regexp.union(regexes.map{|word| Regexp.new(".*"+word+".*", "i")})
|
regex = Regexp.union(regexes.map{|word| Regexp.new(".*"+word+".*", "i")})
|
||||||
|
end
|
||||||
|
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
|
end
|
||||||
if params["sort"].present?
|
if params["column"] == params["sortcolumn"]
|
||||||
column_to_sort = table.table_columns.where(:key => params["sortcolumn"]).first
|
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"])
|
||||||
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
|
else
|
||||||
columns = column.column_entries.any_of(:"text.en" => regex).or(:"text.zh_tw" => regex).or(:"content.en" => regex).or(:"content.zh_tw" => regex)
|
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
|
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
|
||||||
|
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) if(paginated)
|
||||||
|
else
|
||||||
|
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
|
||||||
|
columns = column_to_sort.column_entries.order_by(field_name => params["sort"])
|
||||||
columns.each do |column|
|
columns.each do |column|
|
||||||
entries << column.table_entry
|
entries << column.table_entry
|
||||||
end
|
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) if(paginated)
|
entries = Kaminari.paginate_array(entries).page(params["page_no"]).per(OrbitHelper.page_data_count) if(paginated)
|
||||||
else
|
else
|
||||||
if params["sort"].present?
|
entries = table.table_entries.sorting(params: params,table: table).page(params["page_no"]).per(OrbitHelper.page_data_count) if(paginated)
|
||||||
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"])
|
|
||||||
columns.each do |column|
|
|
||||||
entries << column.table_entry
|
|
||||||
end
|
|
||||||
|
|
||||||
entries = Kaminari.paginate_array(entries).page(params["page_no"]).per(OrbitHelper.page_data_count) if(paginated)
|
|
||||||
else
|
|
||||||
entries = table.table_entries.desc(:created_at).page(params["page_no"]).per(OrbitHelper.page_data_count) if(paginated)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
entries
|
end
|
||||||
|
entries
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|
|
@ -17,4 +17,18 @@ class ColumnEntry
|
||||||
def type
|
def type
|
||||||
self.table_column.type
|
self.table_column.type
|
||||||
end
|
end
|
||||||
|
def sort_value
|
||||||
|
case self.type
|
||||||
|
when "text"
|
||||||
|
self.text
|
||||||
|
when "editor"
|
||||||
|
self.content
|
||||||
|
when "image"
|
||||||
|
self[:image]
|
||||||
|
when "date"
|
||||||
|
self.date
|
||||||
|
when "period"
|
||||||
|
[self.period_from,ce.period_to]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
|
@ -10,7 +10,8 @@ class TableColumn
|
||||||
field :is_link_to_show, type: Boolean, default: false
|
field :is_link_to_show, type: Boolean, default: false
|
||||||
field :order, type: Integer
|
field :order, type: Integer
|
||||||
field :make_categorizable, type: Boolean, default: false
|
field :make_categorizable, type: Boolean, default: false
|
||||||
|
field :default_ordered_field, type: Boolean, default: false
|
||||||
|
field :order_direction,type: String,default: 'desc'
|
||||||
belongs_to :u_table
|
belongs_to :u_table
|
||||||
|
|
||||||
has_many :column_entries, :dependent => :destroy
|
has_many :column_entries, :dependent => :destroy
|
||||||
|
|
|
@ -3,8 +3,54 @@ class TableEntry
|
||||||
include Mongoid::Timestamps
|
include Mongoid::Timestamps
|
||||||
include Slug
|
include Slug
|
||||||
|
|
||||||
|
attr_accessor :sort_value
|
||||||
|
field :sort_number, type: Integer, default: 0
|
||||||
|
|
||||||
has_many :column_entries, :dependent => :destroy
|
has_many :column_entries, :dependent => :destroy
|
||||||
belongs_to :u_table
|
belongs_to :u_table
|
||||||
|
|
||||||
accepts_nested_attributes_for :column_entries, :allow_destroy => true
|
accepts_nested_attributes_for :column_entries, :allow_destroy => true
|
||||||
|
|
||||||
|
def self.u_table
|
||||||
|
UTable.find(criteria.selector['u_table_id'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.sorting(params: nil,table: nil,field: nil,direction: nil)
|
||||||
|
if table.nil?
|
||||||
|
table = u_table
|
||||||
|
end
|
||||||
|
if field.nil? || direction.nil?
|
||||||
|
if !params[:sortcolumn].blank?
|
||||||
|
field = params[:sortcolumn]
|
||||||
|
direction = params[:sort]
|
||||||
|
else
|
||||||
|
field = params[:sort].blank? ? nil : params[:sort]
|
||||||
|
direction = params[:order].blank? ? 'desc' : params[:order]
|
||||||
|
end
|
||||||
|
if field.nil?
|
||||||
|
field = table.default_ordered_field
|
||||||
|
if field != 'created_at'
|
||||||
|
columns = table.table_columns
|
||||||
|
sort_column = columns.where(:key=>field).first || columns.where(:title=>field).first
|
||||||
|
direction = sort_column.order_direction
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
field = field.to_s
|
||||||
|
if field=='created_at' || field == 'sort_number'
|
||||||
|
self.order_by({field => direction})
|
||||||
|
else
|
||||||
|
values = criteria.to_a
|
||||||
|
field_id = table.table_columns.where(key: field).first || table.table_columns.where(title: field).first
|
||||||
|
values.each do |v|
|
||||||
|
v.sort_value = v.column_entries.where(:table_column_id=>field_id).first.sort_value
|
||||||
|
end
|
||||||
|
values = values.sort_by{|v| v.sort_value}
|
||||||
|
if direction=='desc'
|
||||||
|
values = values.reverse
|
||||||
|
end
|
||||||
|
Kaminari.paginate_array(values)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
|
@ -13,4 +13,8 @@ class UTable
|
||||||
|
|
||||||
FIELD_TYPES = ["text", "editor", "image", "date", "period"]
|
FIELD_TYPES = ["text", "editor", "image", "date", "period"]
|
||||||
DATE_FORMATS = ["yyyy/MM/dd hh:mm", "yyyy/MM/dd","yyyy/MM", "yyyy"]
|
DATE_FORMATS = ["yyyy/MM/dd hh:mm", "yyyy/MM/dd","yyyy/MM", "yyyy"]
|
||||||
|
def default_ordered_field
|
||||||
|
f = self.table_columns.where(default_ordered_field: true).first
|
||||||
|
f ? (f.key||f.title) : 'created_at'
|
||||||
|
end
|
||||||
end
|
end
|
|
@ -14,46 +14,57 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label muted" for="key_0">Key</label>
|
<label class="control-label muted" for="key_0">Key</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<%= f.number_field :key, :autocomplete => "off", :'data-type' => 'key' %>
|
<%= f.text_field :key, :autocomplete => "off", :'data-type' => 'key' %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label muted" for="">Title</label>
|
<label class="control-label muted" for="">Title</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<div class="input-append">
|
<div class="input-append">
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<% @site_in_use_locales.each do |locale| %>
|
<% @site_in_use_locales.each do |locale| %>
|
||||||
<% active = (locale == @site_in_use_locales.first ? "active in" : "") %>
|
<% active = (locale == @site_in_use_locales.first ? "active in" : "") %>
|
||||||
<% id = (defined?(i) ? "table_column_#{i}_title_translations_#{locale.to_s}" : "table_column_XXX_title_translations_#{locale.to_s}") %>
|
<% id = (defined?(i) ? "table_column_#{i}_title_translations_#{locale.to_s}" : "table_column_XXX_title_translations_#{locale.to_s}") %>
|
||||||
<div class="tab-pane fade in <%= active %>" id="<%= id %>">
|
<div class="tab-pane fade in <%= active %>" id="<%= id %>">
|
||||||
<%= f.fields_for :title_translations do |f| %>
|
<%= f.fields_for :title_translations do |f| %>
|
||||||
<%= f.text_field locale, :value => column.title_translations[locale] %>
|
<%= f.text_field locale, :value => column.title_translations[locale] %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group" data-toggle="buttons-radio">
|
<div class="btn-group" data-toggle="buttons-radio">
|
||||||
<% @site_in_use_locales.each do |locale| %>
|
<% @site_in_use_locales.each do |locale| %>
|
||||||
<% active = (locale == @site_in_use_locales.first ? "active" : "") %>
|
<% active = (locale == @site_in_use_locales.first ? "active" : "") %>
|
||||||
<% id = (defined?(i) ? "table_column_#{i}_title_translations_#{locale.to_s}" : "table_column_XXX_title_translations_#{locale.to_s}") %>
|
<% id = (defined?(i) ? "table_column_#{i}_title_translations_#{locale.to_s}" : "table_column_XXX_title_translations_#{locale.to_s}") %>
|
||||||
<%= link_to t(locale).to_s,"##{id}",:class=>"btn #{active}",:data=>{:toggle=>"tab"}%>
|
<%= link_to t(locale).to_s,"##{id}",:class=>"btn #{active}",:data=>{:toggle=>"tab"}%>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label muted" for="">Display in index</label>
|
<label class="control-label muted" for="">Display in index</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<label class="radio inline">
|
<label class="radio inline">
|
||||||
<%= f.radio_button :display_in_index, "true" %>Yes
|
<%= f.radio_button :display_in_index, "true" %>Yes
|
||||||
</label>
|
</label>
|
||||||
<label class="radio inline">
|
<label class="radio inline">
|
||||||
<%= f.radio_button :display_in_index, "false" %>No
|
<%= f.radio_button :display_in_index, "false" %>No
|
||||||
</label>
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label muted" for=""><%= t('universal_table.default_ordered_field') %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<div>
|
||||||
|
<%= f.check_box :default_ordered_field, class: 'default_ordered_field' %>
|
||||||
|
</div>
|
||||||
|
<div class="order_direction<%= ' hidden' if !f.object.default_ordered_field %>">
|
||||||
|
<%= f.select :order_direction,['desc','asc'].map{|v| [t("universal_table.#{v}"),v]} %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label muted" for="">Type</label>
|
<label class="control-label muted" for="">Type</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
|
|
|
@ -100,6 +100,13 @@
|
||||||
label.addClass("hide");
|
label.addClass("hide");
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
$(document).on('change','.default_ordered_field',function(){
|
||||||
|
$('.order_direction').addClass('hidden');
|
||||||
|
if ($(this).prop('checked')){
|
||||||
|
$('.default_ordered_field').not(this).prop('checked',false);
|
||||||
|
$(this).parents('.controls').eq(0).find('.order_direction').removeClass('hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
function key_on_blur() {
|
function key_on_blur() {
|
||||||
$('input[data-type=key]').on('blur',function() {
|
$('input[data-type=key]').on('blur',function() {
|
||||||
var index_this = $(this).parents('.attributes').index()
|
var index_this = $(this).parents('.attributes').index()
|
||||||
|
@ -126,7 +133,7 @@
|
||||||
var now_ele = ui_child.eq(i);
|
var now_ele = ui_child.eq(i);
|
||||||
now_ele.find('input[data-type=key]').val(i+1);
|
now_ele.find('input[data-type=key]').val(i+1);
|
||||||
}
|
}
|
||||||
updateOrder
|
updateOrder();
|
||||||
}
|
}
|
||||||
$('#attributes-area').ready(function(){
|
$('#attributes-area').ready(function(){
|
||||||
$("#attributes-area").sortable({
|
$("#attributes-area").sortable({
|
||||||
|
|
|
@ -11,3 +11,6 @@ en:
|
||||||
total_number_of_entries: "Total number of enteries found : %{total_number}"
|
total_number_of_entries: "Total number of enteries found : %{total_number}"
|
||||||
export_xls: Export XLSX
|
export_xls: Export XLSX
|
||||||
add_column: Add Column
|
add_column: Add Column
|
||||||
|
default_ordered_field: Default Ordered Field
|
||||||
|
asc: asc
|
||||||
|
desc: desc
|
|
@ -11,3 +11,6 @@ zh_tw:
|
||||||
total_number_of_entries: "搜尋結果數量: %{total_number}"
|
total_number_of_entries: "搜尋結果數量: %{total_number}"
|
||||||
export_xls: 匯出XLSX
|
export_xls: 匯出XLSX
|
||||||
add_column: 新增欄位
|
add_column: 新增欄位
|
||||||
|
default_ordered_field: 預設排序欄位
|
||||||
|
asc: 升序
|
||||||
|
desc: 降序
|
Loading…
Reference in New Issue