Add periodic time field choice.
This commit is contained in:
BoHung Chiu 2021-03-08 19:19:10 +08:00
parent 7a488c02c6
commit dce4cac9bc
11 changed files with 133 additions and 29 deletions

View File

@ -129,7 +129,7 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
"accepts_nested_attributes_for :#{field_name.pluralize}, :allow_destroy => true"
}.join("\r\n")
plugin_template = @personal_plugin_field.primary_modal_name
backend_index_fields = @personal_plugin_field.backend_fields["index"] rescue []
backend_index_fields = @personal_plugin_field.backend_fields["index"].to_a rescue []
backend_index_fields_contents = backend_index_fields.map do |field_name|
if field_name == slug_title
"\r\n <%= link_to #{plugin_template}.#{field_name}, page_for_#{plugin_template}(#{plugin_template}), target: \"blank\" %>\r\n" +
@ -147,7 +147,7 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
"<%= #{plugin_template}.#{field_name} %>"
end
end
backend_profile_fields = @personal_plugin_field.backend_fields["profile"] rescue []
backend_profile_fields = @personal_plugin_field.backend_fields["profile"].to_a rescue []
backend_profile_fields_contents = backend_profile_fields.map do |field_name|
if field_name == slug_title
"\r\n <%= link_to #{plugin_template}.#{field_name}, page_for_#{plugin_template}(#{plugin_template}), target: \"blank\" %>\r\n" +
@ -165,9 +165,9 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
"<%= #{plugin_template}.#{field_name} %>"
end
end
col_name_to_show = @personal_plugin_field.frontend_fields["member_show"] rescue []
col_name_to_show_in_show_page = @personal_plugin_field.frontend_fields["show"] rescue []
col_name_to_show_in_index_page = @personal_plugin_field.frontend_fields["index"] rescue []
col_name_to_show = @personal_plugin_field.frontend_fields["member_show"].to_a rescue []
col_name_to_show_in_show_page = @personal_plugin_field.frontend_fields["show"].to_a rescue []
col_name_to_show_in_index_page = @personal_plugin_field.frontend_fields["index"].to_a rescue []
extra_translate_title = col_name_to_show_in_index_page.map{|field_name| #在個人外掛前台index頁面的欄位翻譯名稱hash
["th-#{field_name}","I18n.t(\"#{@personal_plugin_field.module_name}.#{field_name}\")"]
}
@ -250,11 +250,32 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
related_modal_name = @personal_plugin_field.related_modal_name[i]
field_names.map{|field_name| "<%= #{related_modal_name}.#{field_name} %>"}
}
member_methods_define = primary_modal_fields.select{|f| f[:field_type] == "member"}.map{|field_value|
member_methods_define = primary_modal_fields.select{|f| (f[:field_type] == "member" rescue false)}.map{|field_value|
["def #{field_value[:field_name].pluralize}",
" MemberProfile.find(self.#{field_value[:field_name].singularize}_ids) rescue []",
"end"]
}.flatten
date_time_strftime = {"date"=>"%Y/%m/%d","date_time"=>"%Y/%m/%d %H:%M","year_month"=>"%Y/%m"}
periodic_methods_define = primary_modal_fields.select{|f| (f[:periodic_time] == "1" rescue false)}.map{|field_value|
strftime_string = ""
if date_time_strftime.keys.include?(field_value[:field_type])
strftime_string = ".strftime(\"#{date_time_strftime[field_value[:field_type]]}\")"
end
["def #{field_value[:field_name]}",
" \"\#{self.#{field_value[:field_name]}_start#{strftime_string}} ~ \#{self.#{field_value[:field_name]}_end#{strftime_string}}\"",
"end"]
}.flatten
related_periodic_methods_define = @personal_plugin_field.related_modal_fields.map{|field_values|
field_values.select{|f| (f[:periodic_time] == "1" rescue false)}.map{|field_value|
strftime_string = ""
if date_time_strftime.keys.include? field_value[:field_type]
strftime_string = ".strftime(\"#{date_time_strftime[field_value[:field_type]]}\")"
end
["def #{field_value[:field_name]}",
" \"\#{self.#{field_value[:field_name]}_start#{strftime_string}} ~ \#{self.#{field_value[:field_name]}_end#{strftime_string}}\"",
"end"]
}.flatten
}
analysis_field_name = @personal_plugin_field.backend_fields[:analysis][0] rescue ""
analysis_field_name = "year" if analysis_field_name.blank?
analysis_field_input_fields = ""
@ -314,7 +335,9 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
"before_save_codes" => before_save_codes,
"time_fields_text" => time_fields.to_s,
"iterate_step_text" => iterate_step_text,
"plugin_template_related_members" => plugin_template_related_members.to_s
"plugin_template_related_members" => plugin_template_related_members.to_s,
"periodic_methods_define" => periodic_methods_define,
"related_periodic_methods_define" => related_periodic_methods_define
}
max_length = @match_pattern.keys.map{|k| k.length}.max
@match_pattern = @match_pattern.sort_by{|k,v| (v.class != Array) ? (max_length - k.length) : -k.length}
@ -355,26 +378,35 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
field_type = field_value[:field_type]
next if field_name.blank?
next if field_type == "file" || field_type == "link"
if (field_value[:localize] == "1" rescue false)
localize = (field_value[:localize] == "1" rescue false)
periodic = (field_value[:periodic_time] == "1" rescue false)
input_field = generate_input_field(field_type,field_name,localize,extra_field_name,plugin_template,periodic)
if localize
locale_fields << field_name
input_field = generate_input_field(field_type,field_name,true,extra_field_name,plugin_template)
locale_fields_input_fields << input_field
else
none_locale_fields << field_name
input_field = generate_input_field(field_type,field_name,false,extra_field_name,plugin_template)
none_locale_fields_input_fields << input_field
end
@index += 1
end
return locale_fields , none_locale_fields , locale_fields_input_fields,none_locale_fields_input_fields
end
def generate_input_field(field_type,field_name,localize = false,extra_field_name = nil, plugin_template = nil)
def generate_input_field(field_type,field_name,localize = false,extra_field_name = nil, plugin_template = nil,periodic = false)
personal_plugin_template = @personal_plugin_field.module_name
plugin_template = @personal_plugin_field.primary_modal_name if plugin_template.nil?
input_field = ""
field_value_text = "@#{plugin_template}.#{field_name}"
field_name_text = "\"#{field_name}\""
field_name_text = "locale" if localize
org_field_name = field_name
if periodic
if localize
field_name = "periodic_time_field"
else
field_name_text = "\"periodic_time_field\""
end
end
placeholder = "#{personal_plugin_template}.#{field_name}"
placeholder = "#{personal_plugin_template}.#{extra_field_name}.#{field_name}" if extra_field_name
if localize
@ -401,6 +433,15 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
if localize
input_field.prepend("<%= f.fields_for :#{field_name}_translations do |f| %>\r\n ").concat("\r\n<% end %>")
end
if periodic
input_fields = []
input_fields[0] = input_field.gsub("periodic_time_field","#{org_field_name}_start")
input_fields[1] = input_field.gsub("periodic_time_field","#{org_field_name}_end")
input_field = ["start","end"].map.with_index{|f,i|
"<span><%=t(\"#{personal_plugin_template}.extend_translate.#{f}_#{field_type}\")%></span>" +
input_fields[i]
}.join("")
end
input_field
end
def datetime_picker_text(plugin_template,field_name_text,format = "yyyy/MM/dd hh:mm",timepicker = false)
@ -420,7 +461,7 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
default = "DateTime.now.year"
when "date"
type = "Date"
default = "Date.parse(DateTime.now.to_s)"
default = "Date.today"
when "time"
type = "String"
default = "\"\""
@ -436,11 +477,23 @@ class Admin::PersonalPluginFieldsController < OrbitMemberController
field_name = "#{field_name.singularize}_ids"
end
no_localize_types = ["date","time","date_time","year_month"]
field_text = "field :#{field_name}, :type => #{type}, :default => #{default}"
field_text += ", :localize => true" if field_value[:localize] == "1" && !no_localize_types.include?(field_value[:field_type])
field_text += ", as: :slug_title" if field_value[:slug_title] == "1"
field_text = ""
if field_value[:periodic_time] == "1" && no_localize_types.include?(field_value[:field_type])
field_text = []
field_text[0] = "field :#{field_name}_start, :type => #{type}, :default => #{default}"
field_text[0] += ", :localize => true" if field_value[:localize] == "1" && !no_localize_types.include?(field_value[:field_type])
field_text[0] += ", as: :slug_title" if field_value[:slug_title] == "1"
field_text[1] = "field :#{field_name}_end, :type => #{type}, :default => #{default}"
field_text[1] += ", :localize => true" if field_value[:localize] == "1" && !no_localize_types.include?(field_value[:field_type])
field_text[1] += ", as: :slug_title" if field_value[:slug_title] == "1"
else
field_text = "field :#{field_name}, :type => #{type}, :default => #{default}"
field_text += ", :localize => true" if field_value[:localize] == "1" && !no_localize_types.include?(field_value[:field_type])
field_text += ", as: :slug_title" if field_value[:slug_title] == "1"
end
field_text
end
fields_text = fields_text.flatten
fields_text.select{|t| t.present?}.join("\r\n")
end
def replace_dirs(dirs,is_array = true)

View File

@ -1,4 +1,5 @@
module Admin::PersonalPluginFieldsHelper
include OrbitBackendHelper
def thead_field(field)
return I18n.t("personal_plugin_generator.#{field}")
end

View File

@ -15,7 +15,7 @@ class PersonalPluginField
field :log_text, :type => String, :default => ""
field :fields_order, :type => Hash, :default => {}
field :copy_id
before_save :change_extensions,:check_modal_name
before_save :change_extensions,:check_modal_name,:auto_add_display_fields
after_destroy do
delete_plugin("downloaded_extensions.rb",self.module_name)
restart_server
@ -80,6 +80,25 @@ class PersonalPluginField
return false
end
end
def auto_add_display_fields
change_primary_fields = self.primary_modal_fields.map{|f| f["field_name"]} - self.primary_modal_fields_was.map{|f| f["field_name"]}
change_related_fields = []
self.related_modal_fields.each_with_index do |field_values,i|
old_field_values = self.related_modal_fields_was[i].to_a rescue []
related_modal_name = self.related_modal_name[i].to_s
change_related_fields = change_related_fields + (field_values.map{|f| f["field_name"]} - old_field_values.map{|f| f["field_name"]}).select{|f| f.present?}.map{|f| "#{related_modal_name}.#{f}"}
end
change_fields = change_primary_fields + change_related_fields
change_fields = change_fields.select{|f| f.present?}
if change_fields.count > 0
["index","profile"].each do |f|
self.backend_fields[f] = self.backend_fields[f].to_a + change_fields
end
["index","show","member_show"].each do |f|
self.frontend_fields[f] = self.frontend_fields[f].to_a + change_fields
end
end
end
def self.get_modal_names
name_routes = Rails.application.routes.named_routes.map{|k,v| k}.select{|s| s.to_s[0..4] == "admin"}.map{|s| s.to_s.split('admin_').last}
modal_names = name_routes.map{|n| n.classify}.select{|n| (n.constantize rescue nil)}

View File

@ -172,9 +172,9 @@
})
<%
related_modal_fields_html = "<div index=\"new_index\"><h4>#{thead_field("related_modal_name")} : <span class=\"related_modal_name\"></span></h4>"
related_modal_fields_html += render(:partial => 'render_table',locals: {:f => f,:root_name => "related_modal_fields][new_index",:field_values => [nil],:field_types => field_types1})
related_modal_fields_html += render(:partial => 'render_table',locals: {:f => f,:root_name => "related_modal_fields][new_index",:field_values => [nil],:field_types => field_types1,:@include_blank=>false})
related_modal_fields_html += "</div>"
primary_modal_field_html = render(:partial => 'render_table',locals: {:f => f,:root_name => "primary_modal_fields",:field_values => [nil],:field_types => field_types})
primary_modal_field_html = render(:partial => 'render_table',locals: {:f => f,:root_name => "primary_modal_fields",:field_values => [nil],:field_types => field_types,:@include_blank=>false})
%>
var related_modal_fields_html = "<%= escape_javascript(related_modal_fields_html.html_safe) %>";
var primary_modal_field_html = $("<%= escape_javascript(primary_modal_field_html.html_safe) %>").find("tbody tr")[0].outerHTML;

View File

@ -6,6 +6,7 @@
<th><%= thead_field("field_type") %></th>
<th><%= thead_field("localize") %></th>
<th><%= thead_field("slug_title") %></th>
<th><%= thead_field("periodic_time") %></th>
</thead>
<tbody>
<%= f.fields_for root_name do |f| %>
@ -32,6 +33,10 @@
<%= hidden_field_tag "#{f.object_name}[#{i}][slug_title]", "0",:id=>nil %>
<%= check_box_tag "#{f.object_name}[#{i}][slug_title]", "1" , (field_value["slug_title"] == "1" rescue false),:id=>nil,:class=>"slug_title" %>
</td>
<td>
<%= hidden_field_tag "#{f.object_name}[#{i}][periodic_time]", "0",:id=>nil %>
<%= check_box_tag "#{f.object_name}[#{i}][periodic_time]", "1" , (field_value["periodic_time"] == "1" rescue false),:id=>nil,:class=>"periodic_time" %>
</td>
</tr>
<% end %>
<% end %>

View File

@ -46,4 +46,5 @@ en:
goto: "Go to "
generating_plugin: Generating plugin
please_change_module_name: "Please change module name(This name already exist)."
copy: Copy
copy: Copy
periodic_time: Periodic time

View File

@ -46,4 +46,5 @@ zh_tw:
goto: "前往 "
generating_plugin: 正在生成個人外掛中...
please_change_module_name: "請更改模組名稱(此名稱已存在)"
copy: 複製
copy: 複製
periodic_time: 週期性時間

View File

@ -27,12 +27,24 @@ module Admin::PluginTemplatesHelper
d = {}
d["name"] = role.title
mps = role.member_profile_ids
d["data"] = PluginTemplate.where(:analysis_field_name.gte => analysis_field_name_start, :analysis_field_name.lte => analysis_field_name_end, :member_profile_id.in => mps) rescue []
d["data"] = filter_data(PluginTemplate, analysis_field_name_start, analysis_field_name_end, mps)
data << d
end
return data
end
def filter_data(data,analysis_field_name_start,analysis_field_name_end,mps = nil)
result = []
if @periodic
all_ids = data.all.pluck(:id) rescue []
out_of_range_ids1 = data.where(:analysis_field_name_start.gt => analysis_field_name_end).pluck(:id) rescue []
out_of_range_ids2 = data.where(:analysis_field_name_end.lt => analysis_field_name_start).pluck(:id) rescue []
result = data.where(:id.in=>(all_ids - out_of_range_ids1 - out_of_range_ids2)) rescue []
else
result = data.where(:analysis_field_name.gte => analysis_field_name_start, :analysis_field_name.lte => analysis_field_name_end) rescue []
end
result = result.where(:member_profile_id.in => mps) rescue [] unless mps.nil?
return result
end
def get_chart_data(analysis_field_name_start,analysis_field_name_end,role,type,timezone)
analysis_field_name_start = parse_date_time_field("analysis_field_name",analysis_field_name_start,timezone)
analysis_field_name_end = parse_date_time_field("analysis_field_name",analysis_field_name_end,timezone)
@ -71,7 +83,8 @@ parse_again_end
current_analysis_field_name = analysis_field_name
current_analysis_field_name = analysis_field_name.strftime("%H:%M") if time_fields.include?("analysis_field_name")
next_analysis_field_name = next_analysis_field_name.strftime("%H:%M") if time_fields.include?("analysis_field_name")
t = jl.plugin_templates.where(:analysis_field_name.gte => current_analysis_field_name, :analysis_field_name.lt => next_analysis_field_name, :member_profile_id.in => mps).count rescue 0
t = filter_data(jl.plugin_templates, current_analysis_field_name, next_analysis_field_name, mps)
if current_analysis_field_name.class == DateTime
current_analysis_field_name = display_date_time(current_analysis_field_name,timezone,iterate_step)
end
@ -87,13 +100,13 @@ parse_again_end
next_analysis_field_name = next_analysis_field_name.strftime("%H:%M") if time_fields.include?("analysis_field_name")
case type
when "default"
t = PluginTemplate.where(:analysis_field_name.gte => current_analysis_field_name, :analysis_field_name.lt => next_analysis_field_name, :member_profile_id.in => mps).count rescue 0
t = filter_data(PluginTemplate, current_analysis_field_name, next_analysis_field_name, mps).count rescue 0
parse_again_start
when "plugin_template_related"
t = PluginTemplate.where(:analysis_field_name.gte => current_analysis_field_name, :analysis_field_name.lt => next_analysis_field_name, :member_profile_id.in => mps, :plugin_template_related_id => nil).count rescue 0
t = filter_data(PluginTemplate, current_analysis_field_name, next_analysis_field_name, mps).where(:plugin_template_related_id => nil).count rescue 0
parse_again_end
else
t = PluginTemplate.where(:analysis_field_name.gte => current_analysis_field_name, :analysis_field_name.lt => next_analysis_field_name, :member_profile_id.in => mps).count rescue 0
t = filter_data(PluginTemplate, current_analysis_field_name, next_analysis_field_name, mps).count rescue 0
end
current_analysis_field_name = current_analysis_field_name.new_offset(timezone) if current_analysis_field_name.class == DateTime
if current_analysis_field_name.class == DateTime
@ -106,11 +119,16 @@ parse_again_end
end
def parse_date_time_field(field,value,timezone="+08:00")
time_fields = time_fields_text
type = PluginTemplate.fields[field].type rescue nil
if type.nil?
@periodic = true
type = PluginTemplate.fields[field + "_start"].type
end
if time_fields.include?(field)
parse_time(value,timezone)
elsif PluginTemplate.fields[field].type == Integer
elsif type == Integer
value.to_i
elsif PluginTemplate.fields[field].type == Date
elsif type == Date
Date.parse(value)
else
DateTime.parse(value+timezone).utc

View File

@ -21,6 +21,9 @@ parse_again_end
parse_again_start
member_methods_define
parse_again_end
parse_again_start
periodic_methods_define
parse_again_end
before_save do
before_save_codes

View File

@ -5,4 +5,7 @@ class PluginTemplateRelated
col_related_fields
has_many :plugin_templates
parse_again_start
related_periodic_methods_define
parse_again_end
end

View File

@ -7,7 +7,7 @@ wb = xlsx_package.workbook
heading = sheet.styles.add_style(:b => true, :locked => true)
row = [t("personal_plugin_template.author_name_translation")]
row = [t("personal_plugin_template.member_profile")]
parse_again_start
@site_in_use_locales.each do |locale|
row << t("personal_plugin_template.locale_fields") + " - " + t(locale.to_s)