From 2ba3253f6751e952dd2a863d4d6a553e2418a0e2 Mon Sep 17 00:00:00 2001 From: bohung Date: Thu, 18 Aug 2022 11:07:45 +0800 Subject: [PATCH] Update a lots.(2022/07/28 on trello) --- app/assets/stylesheets/ask/ask.css | 6 +- app/controllers/admin/asks_controller.rb | 66 ++++++++--- app/controllers/asks_controller.rb | 93 +++++++++++---- app/helpers/admin/asks_helper.rb | 77 +++++++++--- app/models/ask_category_setting.rb | 100 +++++++++++++++- app/models/ask_question.rb | 20 +++- app/models/ask_setting.rb | 101 ++++++++++++++-- app/views/admin/asks/_ask_setting.html.erb | 131 ++++++++++++++++++++- app/views/admin/asks/_form.html.erb | 3 + app/views/admin/asks/_index.html.erb | 5 +- app/views/asks/email.html.erb | 14 ++- app/views/asks/sorry.html.erb | 2 +- app/views/asks/thank.html.erb | 3 + ask.gemspec | 2 +- config/locales/en.yml | 12 ++ config/locales/zh_tw.yml | 12 ++ config/routes.rb | 61 +++++++--- lib/ask/engine.rb | 2 +- 18 files changed, 601 insertions(+), 109 deletions(-) diff --git a/app/assets/stylesheets/ask/ask.css b/app/assets/stylesheets/ask/ask.css index a5203bb..3dc5539 100644 --- a/app/assets/stylesheets/ask/ask.css +++ b/app/assets/stylesheets/ask/ask.css @@ -43,9 +43,11 @@ /*button*/ .form-horizontal .form-actions { border-top: 1px solid #d7dadb; - padding: 1em 0 0 20em; + /*padding: 1em 0 0 20em;*/ +} +.form-horizontal .form-actions input, .form-horizontal .form-actions a{ + float: right; } - /*驗證碼*/ .text-error { color: #b94a48; diff --git a/app/controllers/admin/asks_controller.rb b/app/controllers/admin/asks_controller.rb index 8e3897a..0bc1a37 100644 --- a/app/controllers/admin/asks_controller.rb +++ b/app/controllers/admin/asks_controller.rb @@ -69,7 +69,7 @@ class Admin::AsksController < OrbitAdminController ask_setting = AskSetting.first p1 = ask_setting_params(ask_setting,'ask_setting') ask_setting.update_attributes(p1) - redirect_to "/#{locale}/admin/asks" + redirect_to "/#{locale}/admin/asks/setting" end def switch_to_default_setting if AskCategorySetting.where(:id=>params[:id]).update_all(:use_default=>params[:use_default] == "true").documents[0]["nModified"] != 0 @@ -82,10 +82,8 @@ class Admin::AsksController < OrbitAdminController locale = I18n.locale ask_setting = AskCategorySetting.where(category_id: params['category_id']).first ask_setting = AskCategorySetting.create(category_id: params['category_id']) if ask_setting.nil? - p1 = ask_setting_params(ask_setting,'ask_category_setting') - puts ask_setting.inspect - puts ["update!", p1] - ask_setting.update!(p1) + p1 = ask_setting_params(ask_setting,'ask_category_setting', ask_setting.agree_customs.map{|k| "default@#{k}"}) + ask_setting.update_attributes(p1) redirect_to "/#{locale}/admin/asks/category_setting" end def setting @@ -106,6 +104,36 @@ class Admin::AsksController < OrbitAdminController ask_setting_index.save render :json => {key: ask_setting_index.key.to_i} end + def apply_default_custom_fields + ask_setting = AskCategorySetting.where(:category_id=>params[:category]).first + if ask_setting + if params[:apply_all].to_s == 'true' + apply_fields = ask_setting.need_check_customs + if params[:include_reject].to_s == 'true' + apply_fields += ask_setting.reject_customs + apply_fields = apply_fields.sort_by{|k| k.to_i} + end + else + apply_fields = params[:apply_fields].to_a + end + is_agree = params[:agree].to_s == 'true' + if is_agree + ask_setting.agree_customs_func(apply_fields) + custom_fields = AskSetting.first.custom_fields + set_input_name('ask_category_setting[custom_fields]') + view_context.set_input_name('ask_category_setting[custom_fields]') #prevent not setting variables + html = apply_fields.map do |k| + view_context.custom_field_block("default@#{k}", custom_fields[k]) + end.join("\n") + else + ask_setting.delete_customs_func(apply_fields, true) + html = "" + end + render :json => {:success=>true, :html=>html} + else + render :json => {:success=>false} + end + end def index AskPrintSetting.create() if AskPrintSetting.first.nil? @ask_setting = AskSetting.first @@ -113,7 +141,7 @@ class Admin::AsksController < OrbitAdminController @categories = @module_app.categories.enabled.sort_by{|category| (((@module_app.asc rescue true) ? category.sort_number.to_i : -category.sort_number.to_i) rescue category.id)} @filter_fields = filter_fields(@categories, @tags) # 列表欄位 - @table_fields = [:situation, :category, 'title' , 'ask.name', 'ask.phone', 'ask.appointment','ask.created_at','ask.ip'] + @table_fields = ['ask.serial_number', :situation, :category, 'title' , 'ask.name', 'ask.phone', 'ask.appointment','ask.created_at','ask.ip'] # 列表排序 # debugger if filter2("situation").blank? and filter2("identity").blank? @@ -413,17 +441,21 @@ class Admin::AsksController < OrbitAdminController p1 = default_setting.get_attrs ask_setting.update_attributes(p1) ask_setting.update(:use_default => true) + ask_setting_index = AskCategorySettingIndex.where(category_id: params[:category]).first + ask_setting_index = AskCategorySettingIndex.create(category_id: params[:category]) if ask_setting_index.nil? + ask_setting_index.key = default_setting.custom_fields.keys[-1].to_i rescue 0 + ask_setting_index.save end ask_setting.update(:sort_number=> sort_number) default_ask_setting = AskSetting.first default_sort_number = default_ask_setting.sort_number ask_setting_id = ask_setting.id.to_s - part_sort_number = sort_number.select{|k,v| k.include?('default@')}.map{|k,v| ["custom@#{ask_setting_id}@#{k.split('@')[-1]}", v]}.to_h + part_sort_number = sort_number.select{|k,v| k.start_with?('default@')}.map{|k,v| tmp=k.split('@')[1..-1].join('@');[(tmp.start_with?('default@') ? tmp : "custom@#{ask_setting_id}@#{tmp}"), v]}.to_h intersect_keys = default_sort_number.keys & part_sort_number.keys non_intersect_keys = part_sort_number.keys - default_sort_number.keys if intersect_keys.count != 0 - org_order = intersect_keys.map{|k| [k, default_sort_number[k]]} - default_sort_number = default_sort_number.merge(intersect_keys.zip(org_order.sort_by{|k, v| part_sort_number[k]}.map{|k,v| v}).to_h) + org_order = intersect_keys.map{|k| [k, default_sort_number[k]]}.sort_by{|k,v| v}.to_h + default_sort_number = default_sort_number.merge(org_order.sort_by{|k, v| part_sort_number[k]}.map{|k,v| k}.zip(org_order.values).to_h) end preserve_count = AskSetting::All_default_fields.count if non_intersect_keys.count != 0 @@ -441,19 +473,21 @@ class Admin::AsksController < OrbitAdminController end AskSetting.update_all(:sort_number=>sort_number) unless use_default - custom_sort_number = sort_number.select{|k, v| k.include?('custom@')} + default_customs_sort_number = sort_number.select{|k, v| k.start_with?('default@')}.map{|k,v| ["default@#{k}",v]} + custom_sort_number = sort_number.select{|k, v| k.start_with?('custom@')} all_custom_sort_numbers = custom_sort_number.group_by{|k, v| k.split('@')[1]} preserve_count = AskSetting::All_default_fields.count all_custom_sort_numbers.each do |ask_category_setting_id, part_sort_number| ask_setting = AskCategorySetting.find(ask_category_setting_id) rescue nil if ask_setting sort_number = ask_setting.sort_number - part_sort_number = part_sort_number.map{|k,v| ["default@#{k.split('@')[-1]}", v]}.to_h + tmp_default_customs_sort_number = default_customs_sort_number.select{|k, v| ask_setting.agree_customs.include?(k.split('@')[-1])} + part_sort_number = (part_sort_number.map{|k,v| ["default@#{k.split('@')[-1]}", v]} + tmp_default_customs_sort_number).to_h intersect_keys = sort_number.keys & part_sort_number.keys non_intersect_keys = part_sort_number.keys - sort_number.keys if intersect_keys.count != 0 - org_order = intersect_keys.map{|k| [k, sort_number[k]]} - sort_number = sort_number.merge(intersect_keys.zip(org_order.sort_by{|k, v| part_sort_number[k]}.map{|k,v| v}).to_h) + org_order = intersect_keys.map{|k| [k, sort_number[k]]}.sort_by{|k,v| v}.to_h + sort_number = sort_number.merge(org_order.sort_by{|k, v| part_sort_number[k]}.map{|k,v| k}.zip(org_order.values).to_h) end if non_intersect_keys.count != 0 max_sort_number = sort_number.map{|k,v| v.to_i}.max.to_i @@ -499,21 +533,21 @@ class Admin::AsksController < OrbitAdminController render :json => {:success=>true} end private - def ask_setting_params(ask_setting,collection_name) + def ask_setting_params(ask_setting,collection_name, except_customs=[]) param = params.require(collection_name).except("id").permit! param_clone = param.clone param_clone['default_setting'].each { |k, v| param_clone['default_setting'][k] = (v == 'true'? true : false) if param_clone['default_setting'][k].class==String} param_clone['default_setting_required'].each { |k, v| param_clone['default_setting_required'][k] = (v == 'true'? true : false) if param_clone['default_setting_required'][k].class==String} param_clone.delete('custom_fields') param_clone.delete('email_regex') + ask_setting.custom_fields_will_change! custom_fields = params['not_clone_attrs'] ? {} : ask_setting['custom_fields'].clone params_custom_fields = (params.require(collection_name).require('custom_fields') rescue {}) params_custom_fields.each do |k,v| + next if except_customs.include?(k.to_s) custom_fields[k] = v end field_to_delete = params['delete_field'].to_s.split(',').select{|v| !v.empty?} - puts ["field_to_delete", field_to_delete] - puts ["custom_fields", custom_fields] field_to_delete.each do |k| if custom_fields.keys.include? k custom_fields[k]['delete'] = true diff --git a/app/controllers/asks_controller.rb b/app/controllers/asks_controller.rb index fe5696e..423c6c8 100644 --- a/app/controllers/asks_controller.rb +++ b/app/controllers/asks_controller.rb @@ -45,7 +45,7 @@ class AsksController < ApplicationController csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32) token_tag = hidden_field_tag('authenticity_token',csrf_value) switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url) - email_regex = @default_ask_setting.email_regex_enable ? @default_ask_setting.email_regex.gsub("\\A","^").gsub("\\z","$") : nil + email_regex = @default_ask_setting.get_email_regex(true) { 'fields' => defalt_fields, 'extras'=>{ @@ -155,7 +155,7 @@ class AsksController < ApplicationController switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url) tags = module_app.tags ask_question = AskQuestion.new(id: nil) - email_regex = @default_ask_setting.email_regex_enable ? @default_ask_setting.email_regex.gsub("\\A","^").gsub("\\z","$") : nil + email_regex = @default_ask_setting.get_email_regex(true) { 'layout_type' => 'index', 'ask_question' => ask_question, @@ -194,17 +194,55 @@ class AsksController < ApplicationController temp_params = create_params all_to_save = [] ask_setting = AskCategorySetting.enabled.where(category_id: params['ask_question']['category_id']).first - email_regex = nil if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? - email_regex = ask_setting.email_regex - else - email_regex = AskSetting.first.email_regex rescue nil end - email_regex = nil if !(ask_setting.email_regex_enable) || !(ask_setting.default_setting['mail']) + check_fields = ask_setting.default_setting.select{|k,v| v}.keys & ask_setting.default_setting_required.select{|k,v| v}.keys - AskSetting::No_required + flag = true + check_fields.each do |f| + next if f == 'ask_category_id' || f == 'recaptcha' + if temp_params[f].blank? + flag = false + break + end + end + custom_values = temp_params[:custom_values] + custom_values = {} if custom_values.nil? + if flag + check_custom_fields = ask_setting.custom_fields.select{|k,v| v["required"] == 'true' } + if check_custom_fields.count != 0 + check_custom_fields.each do |k,v| + next if v['type'] == 'instructions' + tmp = custom_values[k] + v_type = v['type'] + is_date = false + if v_type == "checkbox" + tmp = tmp.values rescue [] + elsif v_type == 'date' + is_date = true + tmp = tmp["datetime"].values[0].values rescue [] + end + if tmp.present? + if is_date && v["range_flag"] == 'true' + if tmp.class != Array + flag = false + break + end + end + else + flag = false + break + end + end + end + end + if !flag + redirect_to "#{params[:referer_url]}?method=sorry" and return + end + email_regex = ask_setting.get_email_regex ask_setting.custom_fields.select{|k,v| v['type']=='file' || v['type']=='image'}.each do |k,v| - file = temp_params['custom_values'][k] + file = custom_values[k] if !file.blank? if v['type']=='image' all_to_save += [[k,AskImage.new(file: file,ask_question_id: @ask_question.id)]] @@ -213,11 +251,12 @@ class AsksController < ApplicationController end end end + puts "flag", flag flag = !ask_setting.default_setting['recaptcha'] || gotcha_valid? if flag all_to_save.each do |to_save| flag = flag && to_save[1].save - temp_params['custom_values'][to_save[0]] = [temp_params['custom_values'][to_save[0]].original_filename ,to_save[1].file.url] + custom_values[to_save[0]] = [custom_values[to_save[0]].original_filename ,to_save[1].file.url] end end if (email_regex ? ::Regexp.new(email_regex).match(temp_params["mail"].to_s) : true) && flag @@ -280,8 +319,7 @@ class AsksController < ApplicationController "usage_rule" => @usage_rule } ) - - email_er.email.deliver + # email_er.email.deliver end def create_params @@ -293,26 +331,30 @@ class AsksController < ApplicationController if filter_fields disp_fields_infos = disp_fields_infos.select{|field, info| filter_fields.include?(field)} end - tmp = 'mongoid.attributes.ask_question' - title_trans = ask_setting.field_name('title') - required = ask_setting.default_setting_required['title'] - defalt_fields = [{'style_html'=>'','label'=>ask_label(title_trans, required.to_s),'content'=>text_field_tag('ask_question[title]',nil,placeholder: title_trans,required: required)}] + # tmp = 'mongoid.attributes.ask_question' + defalt_fields = [] tmp_type = (ask_setting.class == AskSetting) ? 0 : 1 tmp_ask_cat_id = (tmp_type == 1) ? ask_setting.id.to_s : "" set_input_name("ask_question") disp_fields_infos.each do |field, info| - if field.include?("default@") + if field.start_with?("default@") k = field[8..-1] v = ask_setting.custom_fields[k] if v - defalt_fields << {'label'=>ask_label(v['field'][I18n.locale],v['required']),'content'=>show_on_front(k,v)} + field_name = info['trans'] + if field_name.present? + defalt_fields << {'label'=>ask_label(field_name, v['required']),'content'=>show_on_front(k,v)} + end end - elsif field.include?("custom@") && tmp_ask_cat_id != "" + elsif field.start_with?("custom@") && tmp_ask_cat_id != "" if tmp_type == 1 && field.include?(tmp_ask_cat_id) k = field[8+tmp_ask_cat_id.length..-1] v = ask_setting.custom_fields[k] if v - defalt_fields << {'label'=>ask_label(v['field'][I18n.locale],v['required']),'content'=>show_on_front(k,v)} + field_name = info['trans'] + if field_name.present? + defalt_fields << {'label'=>ask_label(v['field'][I18n.locale],v['required']),'content'=>show_on_front(k,v)} + end end end else @@ -328,12 +370,15 @@ class AsksController < ApplicationController end else if ask_setting.default_setting[field] || field == "usage_rule" - required = ask_setting.default_setting_required[field] + required = ask_setting.is_required(field) f1 = {'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("#{field}"),required.to_s)} field_name = "ask_question[#{field}]" + placeholder = @default_ask_setting.prompt_word(field) case field + when 'title' + f1['content'] = text_field_tag(field_name,nil,placeholder: placeholder,required: required) when 'name' - f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;", "fv-messages" => "必填欄位;"} : {}),required: required,placeholder:@default_ask_setting.field_name("#{field}")) + f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;", "fv-messages" => "必填欄位;"} : {}),required: required,placeholder: placeholder) when 'sex' f1['content'] = "" when 'mail' - f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"} : {}),required: required,placeholder:@default_ask_setting.field_name("#{field}")) + f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"} : {}),required: required,placeholder: placeholder) when 'phone' - f1['content'] = text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"),required: required) + f1['content'] = text_field_tag(field_name,nil,placeholder: placeholder,required: required) when 'appointment' if @appointment_idx.nil? @appointment_idx = 0 else @appointment_idx += 1 end - f1['content'] = "
#{text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"),data: {format: 'yy/mm/dd HH:MM'},required: required, id: "ask_question_appointment_#{@appointment_idx}")}
" + f1['content'] = "
#{text_field_tag(field_name,nil,placeholder: placeholder,data: {format: 'yyyy/MM/dd hh:mm'},required: required, id: "ask_question_appointment_#{@appointment_idx}")}
" when 'recaptcha' f1['content'] = "#{gotcha_error}#{gotcha}" when 'usage_rule' diff --git a/app/helpers/admin/asks_helper.rb b/app/helpers/admin/asks_helper.rb index 2e47ad8..40aa3c4 100644 --- a/app/helpers/admin/asks_helper.rb +++ b/app/helpers/admin/asks_helper.rb @@ -52,9 +52,9 @@ module Admin::AsksHelper end def multiple_lang_show_tag(field_name, index1,field,value=nil,combine_element='',exteral_options={},sortable=false) if !index1.nil? - all_field = (get_input_name + "[#{index1}][#{field}][parant]").gsub(/\[/,'_').gsub(/\]/,'') + all_field = (get_input_name + "[#{index1}][#{field}][parant]").gsub(/[\[@]/,'_').gsub(/\]/,'') else - all_field = (get_input_name + "[#{field}][parant]").gsub(/\[/,'_').gsub(/\]/,'') + all_field = (get_input_name + "[#{field}][parant]").gsub(/[\[@]/,'_').gsub(/\]/,'') end tmp = (I18n.available_locales.collect do |locale| active_flag = ((locale == I18n.locale) ? ' active' : '') @@ -84,9 +84,9 @@ module Admin::AsksHelper end def multiple_lang_tag(index1,type_of_tag,field,value=nil,custom_options={},combine_element='',exteral_options={},sortable=false) if !index1.nil? - all_field = (get_input_name + "[#{index1}][#{field}][parant]").gsub(/\[/,'_').gsub(/\]/,'') + all_field = (get_input_name + "[#{index1}][#{field}][parant]").gsub(/[\[@]/,'_').gsub(/\]/,'') else - all_field = (get_input_name + "[#{field}][parant]").gsub(/\[/,'_').gsub(/\]/,'') + all_field = (get_input_name + "[#{field}][parant]").gsub(/[\[@]/,'_').gsub(/\]/,'') end tmp = (I18n.available_locales.collect do |locale| active_flag = ((locale == I18n.locale) ? ' active' : '') @@ -141,8 +141,8 @@ module Admin::AsksHelper def field_select_tag(index1,field,options,selected=nil,custom_options={}) select_tag("#{get_input_name}[#{index1}][#{field}]",options_for_select(options,selected: selected),custom_options) end - def field_radio_button_tag(index1,field,show_value,value,custom_options={}) - radio_button_tag("#{get_input_name}[#{index1}][#{field}]",show_value,value) + def field_radio_button_tag(index1,field,show_value,checked,custom_options={}) + radio_button_tag("#{get_input_name}[#{index1}][#{field}]",show_value,checked,custom_options) end def render_date_block(field_name,v,i,value) case v['format'] @@ -228,14 +228,45 @@ module Admin::AsksHelper value = {} end if v['range_flag']=='true' - tmp = value['datetime']['date'] rescue {} - readonly ? "#{tmp['0']}~#{tmp['1']}" : "
+ if readonly + format_str = "%Y/%m/%d %H:%M" + case v['format'] + when 'format1' + format_str = "%Y/%m/%d %H:%M" + when 'format2' + format_str = "%Y/%m/%d" + when 'format3' + format_str = "%Y/%m" + when 'format4' + format_str = "%Y" + end + tmp = value['datetime']['date'] rescue {} + "#{DateTime.parse(tmp['0']).strftime(format_str) rescue ''}~#{DateTime.parse(tmp['1']).strftime(format_str) rescue ''}" + else + "
#{render_date_block(field_name,v,0,value)}
~
#{render_date_block(field_name,v,1,value)} -
".html_safe +
".html_safe + end else - readonly ? value : render_date_block(field_name,v,0,value) + if readonly + format_str = "%Y/%m/%d %H:%M" + case v['format'] + when 'format1' + format_str = "%Y/%m/%d %H:%M" + when 'format2' + format_str = "%Y/%m/%d" + when 'format3' + format_str = "%Y/%m" + when 'format4' + format_str = "%Y" + end + tmp = value['datetime']['date'] rescue {} + (DateTime.parse(tmp['0']).strftime(format_str) rescue '') + else + render_date_block(field_name,v,0,value) + end end when 'text_area' readonly ? value : text_area_tag(field_name,value,{:required => v['required']=='true',:placeholder=> v['prompt_word'][I18n.locale],:class=>'ckeditor'}) @@ -282,7 +313,7 @@ module Admin::AsksHelper "
#{e.inspect}
#{e.backtrace.to_yaml}
" end end - def custom_field_block(k,v={},show_only=false) + def custom_field_block(k,v={},show_only=false, other_first_rows="",extra_class="") markups = LIST[:markups].select{|k,v| k != 'member_relationship' && k != 'address'}.collect{|key,val| [t("lists.markups."+key),key]} +[[t('ask.file_field'),'file'],[t('ask.image_field'),'image'],[t('ask.instructions'),'instructions']] if show_only multi_lang_tag = multiple_lang_show_tag(t('ask.field_name'),k,'field',v['field']) @@ -304,29 +335,37 @@ module Admin::AsksHelper overflow-y: auto; } - + + #{other_first_rows} #{multi_lang_tag} #{require_ask_tag} #{field_select_tag} #{multi_lang_prompt_tag} " else - multi_lang_tag = multiple_lang_tag(k,'text_field','field',v['field'],{placeholder: t('ask.field_name')}) - field_select_tag = field_select_tag(k,'type',markups,v['type'],{:onchange=>'check_available_setting_block(this)'}) + not_editable = k.to_s.include?('default@') + hint_text = "" + if not_editable + hint_text = "
" + t('ask.this_field_is_default_custom_fields') + "
" + end + multi_lang_tag = multiple_lang_tag(k,'text_field','field',v['field'],{placeholder: t('ask.field_name'), disabled: (not_editable ? 'disabled' : nil)}) + field_select_tag = field_select_tag(k,'type',markups,v['type'],{:onchange=>'check_available_setting_block(this)', :disabled=>(not_editable ? 'disabled' : nil)}) key = hidden_field_tag "#{get_input_name}[#{k}][key]",k,{'class' => 'key'} all_new_options = Array(v['options']).collect do |key,value| tmp = create_delete_button('delete_added_select_option').html_safe+hidden_field_tag("#{get_input_name}[#{k}][options][#{key}][disabled]",value['disabled'],{'class' => 'disabled_field'}) hidden_style = value['disabled'] == 'true' ? {style: 'display:none;'} : {} - "#{multiple_lang_tag(k,'text_field',"options][#{key}",value,{placeholder: t('ask.option_name')},tmp,hidden_style,true)}" + "#{multiple_lang_tag(k,'text_field',"options][#{key}",value,{placeholder: t('ask.option_name'), :disabled=>(not_editable ? 'disabled' : nil)},tmp,hidden_style,true)}" end.join active_class = ['select','radio_button','checkbox'].include?(v['type']) ? ' active' : '' active_prompt_class = ['date','radio_button','checkbox'].exclude?(v['type']) ? ' active' : '' - multi_lang_prompt_tag = "
#{multiple_lang_tag(k,'text_field','prompt_word',v['prompt_word'],{placeholder: t('ask.prompt_word')})}
" - instructions_text_area = "
#{multiple_lang_tag(k,'text_area','instructions',v['instructions'],{placeholder: t('ask.prompt_word'), class: 'ckeditor'})}
" - require_ask_tag = "
#{t('ask.required')}:  #{field_radio_button_tag(k,'required','true',v['required']=='true')}#{t('ask.yes')}#{field_radio_button_tag(k,'required','false',v['required']!='true')}#{t('ask.no')}
" + multi_lang_prompt_tag = "
#{multiple_lang_tag(k,'text_field','prompt_word',v['prompt_word'],{placeholder: t('ask.prompt_word'), disabled: (not_editable ? 'disabled' : nil)})}
" + instructions_text_area = "
#{multiple_lang_tag(k,'text_area','instructions',v['instructions'],{placeholder: t('ask.prompt_word'), class: 'ckeditor', disabled: 'disabled'})}
" + require_ask_tag = "
#{t('ask.required')}:  #{field_radio_button_tag(k,'required','true',v['required']=='true',{disabled: (not_editable ? 'disabled' : nil)})}#{t('ask.yes')}#{field_radio_button_tag(k,'required','false',v['required']!='true',{disabled: (not_editable ? 'disabled' : nil)})}#{t('ask.no')}
" tmp = "
#{all_new_options}
" - field_html = " + field_html = " + #{other_first_rows} + #{hint_text} #{multi_lang_tag} #{require_ask_tag} #{field_select_tag}
diff --git a/app/models/ask_category_setting.rb b/app/models/ask_category_setting.rb index 56fbd9d..af1ba20 100644 --- a/app/models/ask_category_setting.rb +++ b/app/models/ask_category_setting.rb @@ -18,9 +18,20 @@ class AskCategorySetting self.save end end - def custom_fields - tmp = super - tmp.select{|k,v| v['delete'] != true} + before_save do + unless @skip_callback + if self.sort_number_changed? + self.sort_number = self.sort_number.map{|k,v| [k,v.to_i]}.sort_by{|k,v| v}.to_h + end + if self.custom_fields_changed? + delete_custom_fields = self.custom_fields.select{|k,v| v['delete'] == true}.keys + delete_custom_fields.each{|f| self.sort_number.delete(f)} + delete_custom_fields = delete_custom_fields.select{|k| k.include?("default@")} + self.delete_customs_func(delete_custom_fields, true) + self.custom_fields = self.custom_fields.select{|k,v| v['delete'] != true} + end + end + true end def field_name(k,locale=I18n.locale.to_s) (self.default_setting_field_name[k]&&self.default_setting_field_name[k][locale]) ? self.default_setting_field_name[k][locale] : self.default_field_name(k,locale) @@ -33,10 +44,86 @@ class AskCategorySetting def field_name_translations(k) I18n.available_locales.map{|v| [v.to_s,self.field_name(k,v.to_s)]}.to_h end + + def prompt_word(k,locale=I18n.locale.to_s,use_checkbox_trans=false) + tmp = self.default_setting_prompt_word[k] + (tmp&&tmp[locale]) ? tmp[locale] : self.field_name(k,locale) + end + + def prompt_word_translations(k) + I18n.available_locales.map{|v| [v.to_s,self.prompt_word(k,v.to_s)]}.to_h + end + + def is_required(k) + self.default_setting_required[k] + end + def agree_customs_func(apply_custom_fields, check_custom_fields=nil) + if apply_custom_fields.count != 0 + self.agree_customs += apply_custom_fields + self.agree_customs.uniq! + if check_custom_fields.nil? + check_custom_fields = AskSetting.first.custom_fields + end + apply_custom_fields.each{|k| self.custom_fields["default@#{k}"] = check_custom_fields[k]} + self.need_check_customs -= apply_custom_fields + self.reject_customs -= apply_custom_fields + @skip_callback = true + self.save + @skip_callback = false + end + true + end + def delete_customs_func(delete_custom_fields, add_to_reject=false) + if delete_custom_fields.count != 0 + delete_custom_fields = delete_custom_fields.map{|f| f.sub('default@', '')} + self.need_check_customs -= delete_custom_fields + self.agree_customs -= delete_custom_fields + if add_to_reject + self.reject_customs += delete_custom_fields + self.reject_customs.uniq! + else + self.reject_customs -= delete_custom_fields + delete_custom_fields.each do |f| + self.custom_fields.delete(f) + end + end + @skip_callback = true + self.save + @skip_callback = false + end + true + end + def update_need_check_customs(check_custom_fields, is_locale=false, need_check=false) + if need_check + check_custom_fields = check_custom_fields.map{|k,v| [k, v["field"][I18n.default_locale.to_s]]}.to_h unless is_locale + category_custom_fields = self.custom_fields.map{|k,v| v["field"][I18n.default_locale.to_s]} + self.need_check_customs += check_custom_fields.select{|k,v| v.blank? || !(category_custom_fields.include?(v))}.keys + else + self.need_check_customs += check_custom_fields.keys + end + self.need_check_customs = self.need_check_customs.uniq + self.need_check_customs -= self.reject_customs + self.need_check_customs -= self.agree_customs + unless is_locale + self.agree_customs.each{|k| self.custom_fields["default@#{k}"] = check_custom_fields[k]} + end + @skip_callback = true + self.save + @skip_callback = false + end + def get_email_regex(frontend=false) + tmp = self.email_regex + if tmp + tmp = tmp.gsub("\\A","^").gsub("\\z","$").gsub("\\","\\\\\\\\") + end + tmp = nil if !(self.email_regex_enable) || (self.application_form_signup_field_sets.where(:field_name=>'email').pluck(:disabled)[0] rescue false) + tmp + end field :sort_number, type: Hash, default: {} field :default_setting, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: true,appointment: true,recaptcha: true,agree_show: true,agree_usage: true} - field :default_setting_required, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: false,appointment: false,recaptcha: true,agree_show: true,agree_usage: true} + field :default_setting_required, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: false,appointment: false,recaptcha: true,agree_show: false,agree_usage: true} field :default_setting_field_name, type: Hash,default: {} + field :default_setting_prompt_word, type: Hash,default: {} field :use_default, type: Boolean, default: false field :custom_fields, type: Hash,default: {} field :usage_rule @@ -44,5 +131,8 @@ class AskCategorySetting field :title_layout, type: Integer field :email_regex_enable, type: Boolean, default: false field :email_regex, type: String, default: '\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z' + field :need_check_customs, type: Array, default: [] #From AskSetting + field :reject_customs, type: Array, default: [] #From AskSetting + field :agree_customs, type: Array, default: [] #From AskSetting scope :enabled, ->{where(:use_default.ne=>true)} -end +end \ No newline at end of file diff --git a/app/models/ask_question.rb b/app/models/ask_question.rb index 18297ec..8132f50 100644 --- a/app/models/ask_question.rb +++ b/app/models/ask_question.rb @@ -6,6 +6,7 @@ class AskQuestion # include OrbitTag::Taggable # 欄位 + field :serial_number, type: Integer field :ip, type: String field :name, type: String field :identity, type: String @@ -26,7 +27,10 @@ class AskQuestion field :agree_show,type: Boolean,default: false field :agree_usage,type: Boolean,default: false # validates_presence_of :name, :identity, :mail, :title, :content - + before_create do + last_serial_number = AskSetting.update_last_serial_number + self.serial_number = last_serial_number + end def email mail = Email.find(self.email_id) rescue nil end @@ -46,9 +50,19 @@ class AskQuestion a.destroy end end - email_address.uniq! email_address = email_address +[self.mail] if !self.mail.blank? email_address.flatten + email_address.uniq! + end + def get_serial_number(last_serial_number=nil, display_length=nil) + if display_length.nil? && last_serial_number.nil? + can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + last_serial_number = (can_update_shared_hash ? OrbitHelper::SharedHash["ask"][:last_serial_number] : AskSetting.pluck(:last_serial_number)[0].to_i) + end + display_length = [last_serial_number.to_s.length + 1, 4].max if display_length.nil? + display_format_string(self.serial_number, display_length) + end + def display_format_string(num, str_length) + return format("%0#{str_length}d", num) end - end diff --git a/app/models/ask_setting.rb b/app/models/ask_setting.rb index f300719..1f65f6f 100644 --- a/app/models/ask_setting.rb +++ b/app/models/ask_setting.rb @@ -2,6 +2,8 @@ class AskSetting include Mongoid::Document include Mongoid::Timestamps All_default_fields = ['ask_category_id','name','sex','mail','phone','appointment','recaptcha','usage_rule','agree_show','agree_usage'] + No_prompt_word = ['ask_category_id', 'sex', 'appointment', 'recaptcha'] + No_required = ['agree_show'] after_initialize do if !self.new_record? if self.default_setting.class != Hash && self.default_setting.class != BSON::Document @@ -19,20 +21,51 @@ class AskSetting self.save end end - after_save do - if self.email_regex_enable_changed? || self.email_regex_changed? - AskCategorySetting.all.update_all(email_regex_enable: self.email_regex_enable,email_regex: self.email_regex) + before_save do + if self.sort_number_changed? + self.sort_number = self.sort_number.map{|k,v| [k,v.to_i]}.sort_by{|k,v| v}.to_h end + @email_regex_enable_changed = self.email_regex_enable_changed? + @email_regex_changed = self.email_regex_changed? + @default_setting_prompt_word_changed = self.default_setting_prompt_word_changed? + @default_setting_field_name_changed = self.default_setting_field_name_changed? + @custom_fields_changed = self.custom_fields_changed? + if @custom_fields_changed + @delete_custom_fields = self.custom_fields.select{|k,v| v['delete'] == true}.keys + @delete_custom_fields.each{|f| self.sort_number.delete(f)} + self.custom_fields = self.custom_fields.select{|k,v| v['delete'] != true} + end + true end - def custom_fields - tmp = super - tmp.select{|k,v| v['delete'] != true} + after_save do + update_all_hash = {} + if @email_regex_enable_changed || @email_regex_changed + update_all_hash[:email_regex_enable] = self.email_regex_enable + update_all_hash[:email_regex] = self.email_regex + end + if @default_setting_prompt_word_changed + update_all_hash[:default_setting_prompt_word] = self.default_setting_prompt_word + end + if @default_setting_field_name_changed + update_all_hash[:default_setting_field_name] = self.default_setting_field_name + end + if update_all_hash.present? + AskCategorySetting.all.update_all(update_all_hash) + end + if @custom_fields_changed + AskCategorySetting.all.each do |a| + a.delete_customs_func(@delete_custom_fields) + a.update_need_check_customs(self.custom_fields) + end + end end def field_name(k,locale=I18n.locale.to_s,use_checkbox_trans=false) tmp = self.default_setting_field_name[k] (tmp&&tmp[locale]) ? tmp[locale] : self.default_field_name(k,locale) end - + def is_required(k) + self.default_setting_required[k] + end def default_field_name(k,locale=I18n.locale.to_s,use_checkbox_trans=false) I18n.with_locale(locale){ (use_checkbox_trans && ['agree_show','agree_usage'].include?(k.to_s)) ? I18n.t("ask.#{k}_checkbox") : I18n.t("mongoid.attributes.ask_question.#{k}")} end @@ -40,17 +73,27 @@ class AskSetting def field_name_translations(k) I18n.available_locales.map{|v| [v.to_s,self.field_name(k,v.to_s)]}.to_h end + def prompt_word(k,locale=I18n.locale.to_s,use_checkbox_trans=false) + tmp = self.default_setting_prompt_word[k] + (tmp&&tmp[locale]) ? tmp[locale] : self.field_name(k,locale) + end + + def prompt_word_translations(k) + I18n.available_locales.map{|v| [v.to_s,self.prompt_word(k,v.to_s)]}.to_h + end field :email_regex_enable, type: Boolean, default: false field :email_regex, type: String, default: '\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z' field :sort_number, type: Hash, default: {} field :default_setting, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: true,appointment: true,recaptcha: true,agree_show: true,agree_usage: true} - field :default_setting_required, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: false,appointment: false,recaptcha: true,agree_show: true,agree_usage: true} + field :default_setting_required, type: Hash,default: {title:true,ask_category_id: true,name: true,sex: true,mail: true,phone: false,appointment: false,recaptcha: true,agree_show: false,agree_usage: true} field :default_setting_field_name, type: Hash,default: {} + field :default_setting_prompt_word, type: Hash,default: {} field :custom_fields, type: Hash,default: {} field :usage_rule field :title_layout, type: Integer field :last_ticket_key, type: Integer, default: 0 + field :last_serial_number, type: Integer, default: 0 def get_attrs attrs = self.attributes.clone self.fields.each do |k, v| @@ -59,7 +102,21 @@ class AskSetting attrs.delete(k) end end - attrs.except("_type","_id","uid","updated_at", "created_at", "email_regex", "last_ticket_key") + attrs.except("_type","_id","uid","updated_at", "created_at", "email_regex", "last_ticket_key", "default_setting_required", "last_serial_number") + end + def self.update_last_serial_number(last_serial_number=nil) + can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + if last_serial_number.nil? + last_serial_number = (can_update_shared_hash ? OrbitHelper::SharedHash["ask"][:last_serial_number] : AskSetting.pluck(:last_serial_number)[0].to_i) + AskSetting.all.inc({'last_serial_number'=>1}) + last_serial_number += 1 + else + AskSetting.all.update_all(:last_serial_number=>last_serial_number) + end + if can_update_shared_hash + OrbitHelper::SharedHash["ask"][:last_serial_number] = last_serial_number + end + last_serial_number end def self.get_disp_fields_infos(only_display=true, cat=nil) ask_setting = nil @@ -72,6 +129,9 @@ class AskSetting disp_fields = self::All_default_fields disp_fields_infos = {} locale = I18n.locale.to_s + if !only_display || ask_setting.default_setting['title'] != false + disp_fields_infos['title'] = {"trans"=>ask_setting.field_name('title'), "sort_number"=>ask_setting.sort_number['title'].to_i} + end tmp = disp_fields[0...-4] if only_display tmp = tmp.select{|f| ask_setting.default_setting[f]} @@ -84,7 +144,10 @@ class AskSetting ask_setting.custom_fields.each do |k,v| trans = v["field"] tmp_locales.each do |l| - trans = trans[l] if trans[l].present? + if trans[l].present? + trans = trans[l] + break + end end next if trans.class != String tmp_k = "default@#{k}" @@ -101,9 +164,13 @@ class AskSetting c.custom_fields.each do |k,v| trans = v["field"] tmp_locales.each do |l| - trans = trans[l] if trans[l].present? + if trans[l].present? + trans = trans[l] + break + end end next if trans.class != String + next if k.start_with?('default@') tmp_k = "custom@#{c.id}@#{k}" cat_title = cat.title rescue "" disp_fields_infos[tmp_k] = {"trans"=>"#{cat_title}-#{trans}","sort_number"=>ask_setting.sort_number[tmp_k],"key"=>k,"type"=>v["type"],"options"=>v["options"],"instructions"=>v["instructions"]} @@ -119,9 +186,9 @@ class AskSetting max_sort_number = disp_fields_infos.values.map{|h| h["sort_number"]}.compact.max if max_sort_number max_sort_number = max_sort_number + 1 - disp_fields_infos.each do |k,h| + disp_fields_infos.each_with_index do |(k,h), i| if h["sort_number"].blank? - h["sort_number"] = max_sort_number + h["key"].to_i + h["sort_number"] = max_sort_number + i else h["sort_number"] = h["sort_number"] end @@ -130,4 +197,12 @@ class AskSetting end disp_fields_infos end + def get_email_regex(frontend=false) + tmp = self.email_regex + if tmp + tmp = tmp.gsub("\\A","^").gsub("\\z","$").gsub("\\","\\\\\\\\") + end + tmp = nil if !(self.email_regex_enable) || (self.application_form_signup_field_sets.where(:field_name=>'email').pluck(:disabled)[0] rescue false) + tmp + end end diff --git a/app/views/admin/asks/_ask_setting.html.erb b/app/views/admin/asks/_ask_setting.html.erb index 5c7b413..6e3c88d 100644 --- a/app/views/admin/asks/_ask_setting.html.erb +++ b/app/views/admin/asks/_ask_setting.html.erb @@ -180,7 +180,7 @@ <% end %> - +
+ <% end %> + <% end %> <% v = ask_setting.default_setting_required[k] %> + <% has_need_check_customs = (ask_setting.class == AskCategorySetting && (ask_setting.need_check_customs.count + ask_setting.reject_customs.count) != 0) + org_hide = ask_setting.class == AskCategorySetting ? (ask_setting.need_check_customs.count == 0) : true; + %> + <% if has_need_check_customs %> + + + + + <% end %> + <% if has_need_check_customs %> + <% (ask_setting.need_check_customs + ask_setting.reject_customs).sort_by{|k| k.to_i}.each do |k| %> + <% if ask_setting.reject_customs.include?(k) %> + <% other_first_rows = "" %> + <%= custom_field_block(k, @default_ask_setting.custom_fields[k], true, other_first_rows, "discard_fields hide").html_safe %> + <% else %> + <% other_first_rows = "" %> + <%= custom_field_block(k, @default_ask_setting.custom_fields[k], true, other_first_rows).html_safe %> + <% end %> + <% end %> + + <% end %>
@@ -193,6 +193,9 @@ <%= t('ask.field_name') %> + <%= t('ask.prompt_word') %> + <%= t('ask.required') %> @@ -219,6 +222,13 @@ <%= multiple_lang_tag(nil,'text_field',"default_setting_field_name][#{k}",ask_setting.field_name_translations(k),{placeholder: tmp}) %> + <% if AskSetting::No_prompt_word.include?(k) %> + <%= t('ask.the_same_as_field_name') %> + <% else %> + <%= multiple_lang_tag(nil,'text_field',"default_setting_prompt_word][#{k}",ask_setting.prompt_word_translations(k),{placeholder: tmp}) %> + <% end %> + @@ -252,6 +262,125 @@
+ <%= t('ask.default_custom_fields') %> + + + + + + <%=t('ask.apply_all')%> + <%=t('ask.discard_changes')%> +
#{t('ask.apply')}
#{t('ask.apply')}#{t('ask.discard')}
+ \ No newline at end of file diff --git a/app/views/admin/asks/_form.html.erb b/app/views/admin/asks/_form.html.erb index aa450b5..c35f374 100644 --- a/app/views/admin/asks/_form.html.erb +++ b/app/views/admin/asks/_form.html.erb @@ -55,6 +55,9 @@ <%= AskQuestion.human_attribute_name(:phone) %>:<%= @ask_question.phone %> + + <%= t('ask.serial_number') %>:<%= @ask_question.get_serial_number %> + <%= t('ask.ip') %>:<%= @ask_question.ip %> diff --git a/app/views/admin/asks/_index.html.erb b/app/views/admin/asks/_index.html.erb index fc6f24e..50a2ad4 100644 --- a/app/views/admin/asks/_index.html.erb +++ b/app/views/admin/asks/_index.html.erb @@ -3,7 +3,7 @@ <% @table_fields.each do |f| %> <% tmp = f.to_s.gsub(/ask\./,'') %> - <% if @ask_setting.default_setting[tmp].nil? || @ask_setting.default_setting[tmp] %> + <% if true #@ask_setting.default_setting[tmp].nil? || @ask_setting.default_setting[tmp] %> <%= thead(f) %> <% end %> <% end %> @@ -18,9 +18,12 @@ "is_published"=>"label-success" } situation_trans = AskTicketStatus.all.map{|a| [a.key, a.title]}.to_h + last_serial_number = @ask_setting.last_serial_number + display_length = [last_serial_number.to_s.length + 1, 4].max %> <% @askquestions.each do |b| %> + <%= b.get_serial_number(last_serial_number, display_length) %> <%= situation_trans[b.situation] %> diff --git a/app/views/asks/email.html.erb b/app/views/asks/email.html.erb index 4f3fb2a..5444cf0 100644 --- a/app/views/asks/email.html.erb +++ b/app/views/asks/email.html.erb @@ -35,19 +35,21 @@ type = field_info["type"] if ["select", "radio_button", "checkbox"].include?(type) if type == "checkbox" - val = val.values + val = val.values rescue [] else val = Array(val) end val = val.map{|v| field_info["options"][v][locale] rescue ""}.join("
").html_safe elsif ["file", "image"].include?(type) - val = "#{val[0]}".html_safe + if val.present? + val = "#{val[0]}".html_safe + end elsif type == "date" - val = val["datetime"].values[0].values + val = val["datetime"].values[0].values rescue [] if val.count == 2 - val = val[0] + " ~ " + val[1] + val = val[0].gsub('-', '/') + " ~ " + val[1].gsub('-', '/') else - val = val[0] + val = val[0].gsub('-', '/') end elsif type == "instructions" val = field_info["instructions"][locale].to_s.html_safe rescue "" @@ -56,6 +58,8 @@ val = Category.find(val).title rescue '' elsif f == 'usage_rule' val = @data['usage_rule'].to_s.html_safe + elsif f == 'appointment' + val = question.appointment.strftime('%Y/%m/%d %H:%M') rescue "" else val = val.to_s.html_safe end diff --git a/app/views/asks/sorry.html.erb b/app/views/asks/sorry.html.erb index a7f2009..34bbe2a 100644 --- a/app/views/asks/sorry.html.erb +++ b/app/views/asks/sorry.html.erb @@ -3,6 +3,6 @@

發問失敗,請重新發問!

Failed to ask questions, please re-ask!

- +
\ No newline at end of file diff --git a/app/views/asks/thank.html.erb b/app/views/asks/thank.html.erb index f01d9ca..9709c7c 100644 --- a/app/views/asks/thank.html.erb +++ b/app/views/asks/thank.html.erb @@ -7,5 +7,8 @@ text = t('ask.thank_text') if text.to_s.empty? %> <%= text.html_safe %> +
+ <%=t('ask.go_back')%> +
\ No newline at end of file diff --git a/ask.gemspec b/ask.gemspec index ed1369c..38ce40c 100644 --- a/ask.gemspec +++ b/ask.gemspec @@ -34,7 +34,7 @@ Gem::Specification.new do |s| s.test_files = Dir["test/**/*"] s.metadata = { "_require" => "#{File.expand_path("../app/models/ask_setting", __FILE__)}", - "global_hash" => "{last_ticket_key: (AskSetting.pluck(:last_ticket_key)[0] rescue 0)}" + "global_hash" => "{last_ticket_key: (AskSetting.pluck(:last_ticket_key)[0].to_i rescue 0), last_serial_number: (AskSetting.pluck(:last_serial_number)[0].to_i rescue 0)}" } # s.add_dependency ~> "gotcha" end diff --git a/config/locales/en.yml b/config/locales/en.yml index ceb980f..e4f8b3a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2,6 +2,18 @@ en: situation: Status sex: Sex ask: + go_back: "Go back" + this_field_is_default_custom_fields: "This field is default custom fields(Not editable)" + display_discard_fields: "Display discard fields" + are_you_sure_to_apply: "Are you sure to apply?" + are_you_sure_to_discard: "Are you sure to discard?" + apply: "Apply" + discard: "Discard" + apply_all: "Apply All" + discard_changes: "Discard Changes" + default_custom_fields: "Default custom fields" + serial_number: "No." + the_same_as_field_name: "The same as Field Name" recover_data: "Recover Data" are_you_sure_to_recover_data: "Are you sure to recover data?" are_you_sure_to_switch_to_default_setting: "Are you sure to switch to default setting?" diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index c5c203d..ff88fc0 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -6,6 +6,18 @@ zh_tw: errors: verification_failed: 驗證碼錯誤 ask: + go_back: "回上一頁" + this_field_is_default_custom_fields: "此欄位為預設客製化欄位(不可修改)" + display_discard_fields: "顯示捨棄的欄位" + are_you_sure_to_apply: "您確定要套用嗎?" + are_you_sure_to_discard: "您確定要捨棄嗎?" + apply: "套用" + discard: "捨棄" + apply_all: "套用全部" + discard_changes: "捨棄變更" + default_custom_fields: "預設客製化欄位" + serial_number: "單號" + the_same_as_field_name: "與欄位名稱相同" recover_data: "復原資料" are_you_sure_to_recover_data: "您確定要復原資料嗎?" are_you_sure_to_switch_to_default_setting: "您確定要切換成預設設定嗎?" diff --git a/config/routes.rb b/config/routes.rb index f4c3c83..91ef03f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,24 +2,50 @@ Rails.application.routes.draw do locales = Site.first.in_use_locales rescue I18n.available_locales if ENV['worker_num']=='0' && File.basename($0) != 'rake' && !Rails.const_defined?('Console') Thread.new do - ask_setting = AskSetting.first - if ask_setting.nil? - ask_setting = AskSetting.create - else - ask_setting.sort_number = ask_setting.sort_number.map{|k,v| [k, v.to_i]}.to_h - ask_setting.save - end - AskCategorySetting.all.each do |ask_setting| - ask_setting.sort_number = ask_setting.sort_number.map{|k,v| [k, v.to_i]}.to_h - ask_setting.save - end - default_keys = AskTicketStatus::DefaultKeys - if AskTicketStatus.count < default_keys.count - default_keys.each do |k| - ticket_status = AskTicketStatus.where(:is_default=>true,:key=>k).first - if ticket_status.nil? - AskTicketStatus.create(:is_default=>true,:key=>k, :title_translations=>locales.map{|l| [l.to_s, I18n.with_locale(l){I18n.t("ask.#{k}")}]}.to_h ) + s = OrbitHelper::SharedHash['current_site']['site'] rescue Site.first + update_flag = s.respond_to?(:tmp_flags) + need_update = !update_flag || !(s.tmp_flags.include?('askf1')) + if need_update + ask_setting = AskSetting.first + check_custom_fields = {} + if ask_setting.nil? + ask_setting = AskSetting.create + else + ask_setting.sort_number = ask_setting.sort_number.map{|k,v| [k, v.to_i]}.sort_by{|k,v| v}.to_h + AskSetting::No_required.each do |f| + ask_setting.default_setting_required.delete(f) end + ask_setting.save + check_custom_fields = ask_setting.custom_fields.map{|k,v| [k, v["field"][I18n.default_locale.to_s]]}.to_h + end + default_setting_field_name = ask_setting.default_setting_field_name + AskCategorySetting.all.each do |ask_setting| + ask_setting.sort_number = ask_setting.sort_number.map{|k,v| [k, v.to_i]}.sort_by{|k,v| v}.to_h + AskSetting::No_required.each do |f| + ask_setting.default_setting_required.delete(f) + end + ask_setting.default_setting_field_name = default_setting_field_name + ask_setting.update_need_check_customs(check_custom_fields, true, true) + ask_setting.save + end + default_keys = AskTicketStatus::DefaultKeys + if AskTicketStatus.count < default_keys.count + default_keys.each do |k| + ticket_status = AskTicketStatus.where(:is_default=>true,:key=>k).first + if ticket_status.nil? + AskTicketStatus.create(:is_default=>true,:key=>k, :title_translations=>locales.map{|l| [l.to_s, I18n.with_locale(l){I18n.t("ask.#{k}")}]}.to_h ) + end + end + end + AskQuestion.where(:serial_number=>nil).asc(:id).each do |a| + last_serial_number = AskSetting.update_last_serial_number + a.serial_number = last_serial_number + a.save + end + if update_flag + s = OrbitHelper::SharedHash['current_site']['site'] rescue Site.first + s.tmp_flags << 'askf1' + s.save end end end @@ -52,6 +78,7 @@ Rails.application.routes.draw do post 'export', to: 'asks#do_export' get 'order_fields' post 'update_order_fields' + post 'apply_default_custom_fields' end end resources :ask_acknowledgements diff --git a/lib/ask/engine.rb b/lib/ask/engine.rb index 204d97c..20df664 100644 --- a/lib/ask/engine.rb +++ b/lib/ask/engine.rb @@ -157,4 +157,4 @@ module Ask end end end -end +end \ No newline at end of file