diff --git a/app/controllers/admin/universal_tables_controller.rb b/app/controllers/admin/universal_tables_controller.rb index 3455981..202f16a 100644 --- a/app/controllers/admin/universal_tables_controller.rb +++ b/app/controllers/admin/universal_tables_controller.rb @@ -2,12 +2,38 @@ class Admin::UniversalTablesController < OrbitAdminController def index @table_fields = ["universal_table.table_name","universal_table.created_time","universal_table.total_no_of_entries", "universal_table.import_from_excel"] - @tables = UTable.where(:title.ne => "") - .order_by(sort) - .with_categories(filters("category")) + @tables = UTable.where(:title.ne => "") + .order_by(sort) + .with_categories(filters("category")) end + + def update_sort + uid = params[:universal_table_id].split("-").last + @table = UTable.where(:uid => uid).first rescue nil + if !@table.nil? + ids = params[:ids] + ids = ids.reverse if @table.sort_number_order_direction=='desc' + ids.each_with_index do |id,i| + TableEntry.where(id: id).update(sort_number: i) + end + @entries = TableEntry.where(u_table_id: @table.id).sorting(params: params,table: @table) + @columns = @table.table_columns.asc(:order) + @table_fields = ['universal_table.sort_number']+@columns.collect{|tc| tc.title} + ['universal_table.created_at'] + render 'update_sort',layout: false + end + end + def edit_sort + uid = params[:universal_table_id].split("-").last + @table = UTable.where(:uid => uid).first rescue nil + if !@table.nil? + @entries = TableEntry.where(u_table_id: @table.id).sorting(params: params,table: @table) + @columns = @table.table_columns.asc(:order) + @table_fields = ['universal_table.sort_number']+@columns.collect{|tc| tc.title} + ['universal_table.created_at'] + end + end + def show uid = params[:id].split("-").last @table = UTable.where(:uid => uid).first rescue nil @@ -17,7 +43,7 @@ class Admin::UniversalTablesController < OrbitAdminController if params[:q].present? @entries = search_data(@table) else - @entries = @table.table_entries.criteria.sorting(params: params,table: @table,page_num: params[:page],per: 10) + @entries = TableEntry.where(u_table_id: @table.id).sorting(params: params,table: @table,page_num: params[:page],per: 10) end end end @@ -88,6 +114,8 @@ class Admin::UniversalTablesController < OrbitAdminController skip = skip + 1 end ce.text_translations = v + when "integer" + ce.number = (val.blank? ? nil : val) when "editor" v = {} @site_in_use_locales.sort.each_with_index do |locale,x| @@ -110,6 +138,7 @@ class Admin::UniversalTablesController < OrbitAdminController ce.period_to = val end ce.table_column_id = tc.id + ce.u_table_id = table.id ce.save te.column_entries << ce end diff --git a/app/controllers/universal_tables_controller.rb b/app/controllers/universal_tables_controller.rb index 41ae2e5..6eb2a13 100644 --- a/app/controllers/universal_tables_controller.rb +++ b/app/controllers/universal_tables_controller.rb @@ -34,13 +34,22 @@ class UniversalTablesController < ApplicationController sort_class = "sort hide" when "text" if tc.make_categorizable - select_values = tc.column_entries.distinct(:text).uniq + select_values = tc.column_entries.distinct(:text) form_field = "" end + when "integer" + if tc.make_categorizable + select_values = tc.column_entries.distinct(:number) + form_field = "" + end end if params["sortcolumn"] == tc.key @@ -77,6 +86,8 @@ class UniversalTablesController < ApplicationController case ce.type when "text" text = ce.text + when "integer" + text = ce.number when "editor" text = ce.content when "date" @@ -146,6 +157,8 @@ class UniversalTablesController < ApplicationController case ce.type when "text" text = ce.text + when "integer" + text = ce.number when "editor" text = ce.content when "date" @@ -215,6 +228,8 @@ class UniversalTablesController < ApplicationController case ce.type when "text" text = ce.text + when "integer" + text = ce.number when "editor" text = ce.content when "date" diff --git a/app/helpers/admin/universal_tables_helper.rb b/app/helpers/admin/universal_tables_helper.rb index 2a53e9d..bc6edee 100644 --- a/app/helpers/admin/universal_tables_helper.rb +++ b/app/helpers/admin/universal_tables_helper.rb @@ -27,5 +27,17 @@ module Admin::UniversalTablesHelper select = select + "" "
Or " + select + "
" end + + def render_unique_number(f,column,i) + select_values = column.column_entries.distinct(:number).uniq + select = "" + "
Or " + select + "
" + end end diff --git a/app/models/column_entry.rb b/app/models/column_entry.rb index 3ccd0a7..f9e4db0 100644 --- a/app/models/column_entry.rb +++ b/app/models/column_entry.rb @@ -7,6 +7,7 @@ class ColumnEntry field :date, type: DateTime field :period_from, type: DateTime field :period_to, type: DateTime + field :number, type: Integer mount_uploader :image, ImageUploader @@ -16,5 +17,5 @@ class ColumnEntry def type self.table_column.type - end + end end \ No newline at end of file diff --git a/app/models/table_column.rb b/app/models/table_column.rb index 4b39b86..16fd3d4 100644 --- a/app/models/table_column.rb +++ b/app/models/table_column.rb @@ -19,6 +19,8 @@ class TableColumn case self.type when "text" {text: direction} + when "integer" + {number: direction} when "editor" {content: direction} when "image" diff --git a/app/models/table_entry.rb b/app/models/table_entry.rb index 8d48b20..9ff3e61 100644 --- a/app/models/table_entry.rb +++ b/app/models/table_entry.rb @@ -4,12 +4,19 @@ class TableEntry include Slug attr_accessor :sort_value - field :sort_number, type: Integer, default: 0 + field :sort_number, type: Integer has_many :column_entries, :dependent => :destroy belongs_to :u_table accepts_nested_attributes_for :column_entries, :allow_destroy => true + + before_save do + if self[:sort_number].nil? + sort_number_to_set = self.class.where(u_table_id: self.u_table_id).order_by(sort_number: :desc).first.sort_number + self.sort_number = sort_number_to_set + 1 + end + end def self.u_table UTable.find(criteria.selector['u_table_id']) @@ -30,23 +37,30 @@ class TableEntry 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 + field,direction = table.default_ordered + else + field = field.to_s + if !(field=='created_at' || field == 'sort_number') + field = table.table_columns.where(key: field).first || table.table_columns.where(title: field).first end end end - field = field.to_s - if (field=='created_at' || field == 'sort_number') && column_entries.nil? - values = self.order_by({field => direction}) - if !per.nil? - values = values.page(page_num).per(per) + if (field=='created_at' || field == 'sort_number') + if column_entries.nil? + values = self.order_by({field => direction}) + if !per.nil? + values = values.page(page_num).per(per) + end + else + values = column_entries.map{|v| v.table_entry} + values = values.sort_by{|v| v.send(field)} + if direction == 'desc' + values = values.reverse + end end else - column_to_sort = table.table_columns.where(key: field).first || table.table_columns.where(title: field).first + column_to_sort = field if column_entries.nil? if criteria.selector.keys != ['u_table_id'] column_entries = ColumnEntry.where(:table_column_id=>column_to_sort.id,:table_entry_id.in => criteria.pluck(:id)).order_by(column_to_sort.sort_hash(direction)) diff --git a/app/models/u_table.rb b/app/models/u_table.rb index 6b97bc5..6669399 100644 --- a/app/models/u_table.rb +++ b/app/models/u_table.rb @@ -5,16 +5,36 @@ class UTable include Slug field :title, as: :slug_title, localize: true + + field :ordered_with_sort_number, type: Boolean, default: false + field :sort_number_order_direction, type: String, default: 'desc' + + field :ordered_with_created_at, type: Boolean, default: true + field :created_at_order_direction, type: String, default: 'desc' has_many :table_columns, :dependent => :destroy has_many :table_entries, :dependent => :destroy accepts_nested_attributes_for :table_columns, :allow_destroy => true - FIELD_TYPES = ["text", "editor", "image", "date", "period"] + FIELD_TYPES = ["text", "integer", "editor", "image", "date", "period"] 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' + def default_ordered + if self.ordered_with_created_at + sort_column = 'created_at' + direction = self.created_at_order_direction + elsif self.ordered_with_sort_number + sort_column = 'sort_number' + direction = self.sort_number_order_direction + else + sort_column = self.table_columns.where(default_ordered_field: true).first + if sort_column + direction = sort_column.order_direction + else + sort_column = 'created_at' + direction = self.created_at_order_direction + end + end + [sort_column,direction] end end \ No newline at end of file diff --git a/app/views/admin/universal_tables/_column.html.erb b/app/views/admin/universal_tables/_column.html.erb index d4f424c..11e72f3 100644 --- a/app/views/admin/universal_tables/_column.html.erb +++ b/app/views/admin/universal_tables/_column.html.erb @@ -1,7 +1,7 @@ - <% if !defined?(i) %> -
- <% end %> -
+<% if !defined?(i) %> +
+<% end %> +
Delete <% if defined?(i) %> <%= f.hidden_field :_destroy, :value => "false", :class => "attribute_field_to_delete" %> @@ -64,13 +64,13 @@ <%= f.select :order_direction,['desc','asc'].map{|v| [t("universal_table.#{v}"),v]} %>
-
+
<% select_values = UTable::FIELD_TYPES.collect{|ft| [ft.capitalize,ft]} %> <%= f.select :type, select_values, {}, {class: "type-selector"} %> - "> + "> diff --git a/app/views/admin/universal_tables/_edit_sort.html.erb b/app/views/admin/universal_tables/_edit_sort.html.erb new file mode 100644 index 0000000..e2ca601 --- /dev/null +++ b/app/views/admin/universal_tables/_edit_sort.html.erb @@ -0,0 +1,79 @@ +
+ + + + <% @table_fields.each do |field| %> + <% + field_text = field.to_s.include?('.') ? t(field.to_s) : field.to_s + sort = field.to_s.split('.')[-1] + active = params[:sort].eql? sort + order = active ? (["asc", "desc"]-[params[:order]]).first : "asc" + arrow = (order.eql? "desc") ? "" : "" + klass = field.eql?(:title) ? "span5" : "span2" + th_data = "#{field_text} #{active ? arrow : ""}" + %> + + <% end %> + + + + <% can_edit = can_edit_or_delete?(@entries.first.u_table) if !(@entries.first.nil?) %> + <% @entries.each do |entry| %> + + + <% @columns.each_with_index do |column, index| %> + <% ce = entry.column_entries.where(:table_column_id => column.id).first rescue nil %> + <% if !ce.nil? %> + + <% else %> + + <% end %> + <% end %> + + + <% end %> + +
<%= th_data.html_safe %>
+ <%= entry.sort_number %> + + <% case ce.type %> + <% when "text" %> + <%= ce.text %> + <% when "integer" %> + <%= ce.number %> + <% when "editor" %> + <%= ce.content.html_safe rescue "" %> + <% when "image" %> +
+ <% if !ce.image.nil? %> + + <% end %> +
+ <% when "date" %> + <%= format_date(ce.date, column.date_format) %> + <% when "period" %> + <% if !ce.period_from.nil? %> + <%= format_date(ce.period_from, column.date_format) %> ~ <%= format_date(ce.period_to, column.date_format) %> + <% end %> + <% end %> + <% if index == 0 && can_edit %> + + <% end %> +
+   + + <%= entry.created_at %> +
+
+ + + + + + + diff --git a/app/views/admin/universal_tables/_entry_form.html.erb b/app/views/admin/universal_tables/_entry_form.html.erb index 377ca07..e454f8c 100644 --- a/app/views/admin/universal_tables/_entry_form.html.erb +++ b/app/views/admin/universal_tables/_entry_form.html.erb @@ -24,18 +24,7 @@ %> <% end %> <%= f.fields_for :column_entries, object, :child_index => index do |f| %> - <% case column.type %> - <% when "text" %> - <%= render :partial => "text_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> - <% when "editor" %> - <%= render :partial => "editor_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> - <% when "image" %> - <%= render :partial => "image_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> - <% when "date" %> - <%= render :partial => "date_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> - <% when "period" %> - <%= render :partial => "period_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> - <% end %> + <%= render :partial => "#{column.type}_field", :object => object, :locals => {:f => f, :column => column, :i => index} %> <% end %> <% end %>
diff --git a/app/views/admin/universal_tables/_index.html.erb b/app/views/admin/universal_tables/_index.html.erb index 4597fb9..b543612 100644 --- a/app/views/admin/universal_tables/_index.html.erb +++ b/app/views/admin/universal_tables/_index.html.erb @@ -12,15 +12,18 @@ <%= table.title %> -
- -
+
+ +
<%= table.created_at.strftime("%Y-%m-%d") %> diff --git a/app/views/admin/universal_tables/_integer_field.html.erb b/app/views/admin/universal_tables/_integer_field.html.erb new file mode 100644 index 0000000..843f3a1 --- /dev/null +++ b/app/views/admin/universal_tables/_integer_field.html.erb @@ -0,0 +1,25 @@ +
+ <%= f.label :number, column.title, :class => "control-label" %> +
+
+ <%= f.number_field :number, :value => integer_field.number %> +
+ <% if column.make_categorizable %> + <%= render_unique_number(f,column,i).html_safe %> + + <% end %> + +
+ <% if !integer_field.new_record? %> + <%= f.hidden_field :id %> + <% else %> + <%= f.hidden_field :table_column_id, :value => column.id %> + <% end %> +
\ No newline at end of file diff --git a/app/views/admin/universal_tables/_table_form.html.erb b/app/views/admin/universal_tables/_table_form.html.erb index b2a6c4e..c87da20 100644 --- a/app/views/admin/universal_tables/_table_form.html.erb +++ b/app/views/admin/universal_tables/_table_form.html.erb @@ -1,55 +1,83 @@ <% content_for :page_specific_css do %> <%= stylesheet_link_tag "universal_table/universal-table" %> <% end %> - <% content_for :page_specific_javascript do %> +<% content_for :page_specific_javascript do %> <%= javascript_include_tag "universal_table/jquery-ui.min" %> <% end %>
-
-

<%= t("universal_table.table_name") %>

-
-
-
-
-
- <% @site_in_use_locales.each do |locale| %> - <% active = (locale == @site_in_use_locales.first ? "active in" : "") %> -
- <%= f.fields_for :title_translations do |f| %> - <%= f.text_field locale, :placeholder => "Title", :value => @table.title_translations[locale] %> - <% end %> -
- <% end %> -
- -
+
+

<%= t("universal_table.table_name") %>

+
+
+
+
+
<% @site_in_use_locales.each do |locale| %> - <% active = (locale == @site_in_use_locales.first ? "active" : "") %> - <%= link_to t(locale).to_s,"#table_name_#{locale.to_s}",:class=>"btn #{active}",:data=>{:toggle=>"tab"}%> + <% active = (locale == @site_in_use_locales.first ? "active in" : "") %> +
+ <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, :placeholder => "Title", :value => @table.title_translations[locale] %> + <% end %> +
<% end %> -
-
-
-
-
+
-
-
- <% @table.table_columns.asc(:order).each_with_index do |table_column, index| %> -
- <%= f.fields_for :table_columns, table_column, :child_index => index.to_s do |f| %> - <%= render :partial => "column", :object => table_column, :locals => {:f => f, :i => index} %> - <%= f.hidden_field :id %> - <% end %> +
+ <% @site_in_use_locales.each do |locale| %> + <% active = (locale == @site_in_use_locales.first ? "active" : "") %> + <%= link_to t(locale).to_s,"#table_name_#{locale.to_s}",:class=>"btn #{active}",:data=>{:toggle=>"tab"}%> + <% end %> +
+
+
+ +
+ +
+
+

<%= t("universal_table.default_ordered_field") %>

+
+
+ +
+
+ <%= f.check_box :ordered_with_created_at, class: 'default_ordered_field ordered_with_created_at' %> +
+
+ <%= f.select :created_at_order_direction,['desc','asc'].map{|v| [t("universal_table.#{v}"),v]} %>
- <% end %>
-
- - "> +
+
+ +
+
+ <%= f.check_box :ordered_with_sort_number, class: 'default_ordered_field' %> +
+
+ <%= f.select :sort_number_order_direction,['desc','asc'].map{|v| [t("universal_table.#{v}"),v]} %> +
-
+ + + +
+
+ <% @table.table_columns.asc(:order).each_with_index do |table_column, index| %> +
+ <%= f.fields_for :table_columns, table_column, :child_index => index.to_s do |f| %> + <%= render :partial => "column", :object => table_column, :locals => {:f => f, :i => index} %> + <%= f.hidden_field :id %> + <% end %> +
+ <% end %> +
+
+ + "> +
+
+ + + + + + + diff --git a/app/views/admin/universal_tables/export_structure.xlsx.axlsx b/app/views/admin/universal_tables/export_structure.xlsx.axlsx index aec52a9..e05085b 100644 --- a/app/views/admin/universal_tables/export_structure.xlsx.axlsx +++ b/app/views/admin/universal_tables/export_structure.xlsx.axlsx @@ -18,6 +18,10 @@ wb.add_worksheet(name: "Structure") do |sheet| row1 << column.key row2 << column.type + "-#{locale}" end + when "integer" + row << column.title + row1 << column.key + row2 << column.type when "editor" @site_in_use_locales.sort.each do |locale| row << column.title + " - " + t(locale.to_s) diff --git a/app/views/admin/universal_tables/show.html.erb b/app/views/admin/universal_tables/show.html.erb index 611df79..08352c9 100644 --- a/app/views/admin/universal_tables/show.html.erb +++ b/app/views/admin/universal_tables/show.html.erb @@ -37,6 +37,8 @@ <% case ce.type %> <% when "text" %> <%= ce.text %> + <% when "integer" %> + <%= ce.number %> <% when "editor" %> <%= ce.content.html_safe rescue "" %> <% when "image" %> diff --git a/app/views/admin/universal_tables/update_sort.html.erb b/app/views/admin/universal_tables/update_sort.html.erb new file mode 100644 index 0000000..79513a3 --- /dev/null +++ b/app/views/admin/universal_tables/update_sort.html.erb @@ -0,0 +1 @@ +<%= render partial: 'edit_sort' %> \ No newline at end of file diff --git a/app/views/utable_export/export.xlsx.axlsx b/app/views/utable_export/export.xlsx.axlsx index 19bbdeb..4bd04ae 100644 --- a/app/views/utable_export/export.xlsx.axlsx +++ b/app/views/utable_export/export.xlsx.axlsx @@ -18,6 +18,10 @@ wb.add_worksheet(name: "Structure") do |sheet| row1 << column.key row2 << column.type + "-#{locale}" end + when "integer" + row << column.title + row1 << column.key + row2 << column.type when "editor" site_in_use_locales.sort.each do |locale| row << column.title + " - " + t(locale.to_s) @@ -52,6 +56,8 @@ wb.add_worksheet(name: "Structure") do |sheet| site_in_use_locales.sort.each do |locale| row << (column.text_translations[locale.to_s] rescue "") end + when "integer" + row << column.number when "editor" site_in_use_locales.sort.each do |locale| row << (column.content_translations[locale.to_s] rescue "") diff --git a/config/locales/en.yml b/config/locales/en.yml index 9221e62..a8d1598 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -13,4 +13,8 @@ en: add_column: Add Column default_ordered_field: Default Ordered Field asc: asc - desc: desc \ No newline at end of file + desc: desc + sort_number: Sort Number + created_at: Created Time + edit_sort: Edit Sorting + manual_update_sort: Manually Update Sorting \ No newline at end of file diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 5360677..9879a56 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -13,4 +13,8 @@ zh_tw: add_column: 新增欄位 default_ordered_field: 預設排序欄位 asc: 升序 - desc: 降序 \ No newline at end of file + desc: 降序 + sort_number: 排序數 + created_at: 創建時間 + edit_sort: 編輯排序 + manual_update_sort: 手動更新排序 \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index dff7726..82754f0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,9 @@ Rails.application.routes.draw do resources :universal_tables do get "new_entry" delete "delete_entry" - get "edit_entry" + get "edit_entry" + get "edit_sort" + post "update_sort", to: 'universal_tables#update_sort' get "export_structure" member do get "export_data" diff --git a/lib/universal_table/engine.rb b/lib/universal_table/engine.rb index 49cec09..b070345 100644 --- a/lib/universal_table/engine.rb +++ b/lib/universal_table/engine.rb @@ -1,6 +1,21 @@ module UniversalTable class Engine < ::Rails::Engine - initializer "universal_table" do + initializer "universal_table" do + if ENV['worker_num']=='0' && File.basename($0) != 'rake' && !Rails.const_defined?('Console') + require File.expand_path('../../../app/models/table_entry', __FILE__) + require File.expand_path('../../../app/models/u_table', __FILE__) + if defined?(TableEntry) && defined?(UTable) + if TableEntry.where(sort_number: nil).count>0 + UTable.all.pluck(:id).each do |u_table_id| + table_entries = TableEntry.where(u_table_id: u_table_id).order_by(id: 1) + table_entry_ids = table_entries.pluck(:id) + table_entry_ids.each_with_index do |id,i| + TableEntry.where(id: id).update(sort_number: i) + end + end + end + end + end OrbitApp.registration "UniversalTable", :type => "ModuleApp" do module_label "universal_table.universal_table" base_url File.expand_path File.dirname(__FILE__)