From 30cd93dee851f94291c178e7c1282db679e5aff9 Mon Sep 17 00:00:00 2001 From: Bohung Date: Fri, 18 Mar 2022 11:49:11 +0800 Subject: [PATCH] Fix known bug. Add order fields feature. --- app/controllers/admin/asks_controller.rb | 8 + app/controllers/asks_controller.rb | 141 ++++++++----- app/models/ask_category_setting.rb | 2 +- app/models/ask_setting.rb | 63 +++++- app/views/admin/asks/_ask_setting.html.erb | 18 +- .../admin/asks/category_setting.html.erb | 2 +- app/views/admin/asks/order_fields.html.erb | 196 ++++++++++++++++++ app/views/admin/asks/setting.html.erb | 4 +- app/views/asks/index.html.erb | 156 +------------- ask.gemspec | 23 +- config/locales/en.yml | 5 + config/locales/zh_tw.yml | 5 + config/routes.rb | 2 + lib/ask/engine.rb | 5 + 14 files changed, 396 insertions(+), 234 deletions(-) create mode 100644 app/views/admin/asks/order_fields.html.erb diff --git a/app/controllers/admin/asks_controller.rb b/app/controllers/admin/asks_controller.rb index 662181a..cfc79dd 100644 --- a/app/controllers/admin/asks_controller.rb +++ b/app/controllers/admin/asks_controller.rb @@ -141,6 +141,7 @@ class Admin::AsksController < OrbitAdminController end def get_category_setting_field + @default_ask_setting = AskSetting.first ask_setting = AskCategorySetting.find(params['id']) render partial: 'category_setting_field',locals: {ask_setting: ask_setting} end @@ -384,6 +385,13 @@ class Admin::AsksController < OrbitAdminController def set_askquestion @ask_question = AskQuestion.find(params[:id]) end + def order_fields + @disp_fields_infos = AskSetting.get_disp_fields_infos + end + def update_order_fields + AskSetting.update_all(:sort_number=>params[:sort_number]) + render :json => {:success=>true} + end private def ask_setting_params(ask_setting,collection_name) param = params.require(collection_name).permit! diff --git a/app/controllers/asks_controller.rb b/app/controllers/asks_controller.rb index f9502a5..18b38da 100644 --- a/app/controllers/asks_controller.rb +++ b/app/controllers/asks_controller.rb @@ -37,11 +37,6 @@ class AsksController < ActionController::Base { 'fields' => defalt_fields, 'extras'=>{ - 'token_tag' => token_tag, - 'form_url' => "/#{I18n.locale.to_s}/asks", - 'submit_tag' => submit_tag(t('submit'), :class=> 'btn btn-primary', :id => 'button-mail'), - 'close_tag' => button_tag(t('cancel'), type: 'reset', :class=> 'btn'), - 'referer_url' => referer_url, 'switch_form' => switch_form } } @@ -254,54 +249,82 @@ class AsksController < ActionController::Base params.require(:ask_question).permit! end private - def cal_form_from_setting(ask_setting,categories,show_categories=false) + def cal_form_from_setting(ask_setting,categories,show_categories=false,filter_fields=nil) + disp_fields_infos = AskSetting.get_disp_fields_infos + if filter_fields + disp_fields_infos = disp_fields_infos.select{|field, info| filter_fields.include?(field)} + end tmp = 'mongoid.attributes.ask_question' defalt_fields = [{'style_html'=>'','label'=>ask_label(t('title'),'true'),'content'=>text_field_tag('ask_question[title]',nil,placeholder: t('title'),required: true)}] - if show_categories || ask_setting.default_setting['ask_category_id'] - if categories.count > 1 - defalt_fields = defalt_fields + [{'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("ask_category_id"),'true'),'content'=>select_tag('ask_question[category_id]', options_for_select(categories.collect{|t| [ t.title, t.id ]}))}] + tmp_type = (ask_setting.class == AskSetting) ? 0 : 1 + tmp_ask_cat_id = (tmp_type == 1) ? ask_setting.id.to_s : "" + disp_fields_infos.each do |field, info| + if field.include?("default@") + if tmp_type == 0 + 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)} + end + end + elsif field.include?("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)} + end + end else - defalt_fields = defalt_fields + [{'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("ask_category_id"),'true'),'content'=>"#{(categories[0].title rescue '')}"+hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}] + if field == 'ask_category_id' + if show_categories || ask_setting.default_setting[field] + if categories.count > 1 + defalt_fields = defalt_fields + [{'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("ask_category_id"),'true'),'content'=>select_tag('ask_question[category_id]', options_for_select(categories.collect{|t| [ t.title, t.id ]}))}] + else + defalt_fields = defalt_fields + [{'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("ask_category_id"),'true'),'content'=>"#{(categories[0].title rescue '')}"+hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}] + end + else + defalt_fields = defalt_fields + [{'style_html'=>'display: none;','label'=>'','content'=>hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}] + end + else + if ask_setting.default_setting[field] || field == "usage_rule" + required = ['phone','appointment'].exclude?(field) ? 'true' : 'false' + f1 = {'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("#{field}"),required)} + field_name = "ask_question[#{field}]" + case field + when 'name' + f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;", "fv-messages" => "必填欄位;"},required: true,placeholder:@default_ask_setting.field_name("#{field}")) + when 'sex' + f1['content'] = " + " + when 'mail' + f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"},required: true,placeholder:@default_ask_setting.field_name("#{field}")) + when 'phone' + f1['content'] = text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}")) + when 'appointment' + f1['content'] = "
#{text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"))}
" + when 'recaptcha' + f1['content'] = "{{gotcha_error}}{{gotcha}}" + when 'usage_rule' + next if ask_setting.usage_rule.blank? + f1['content'] = ask_setting.usage_rule + when 'agree_show' + f1['content'] = check_box_tag('ask_question[agree_show]') + when 'agree_usage' + f1['content'] = check_box_tag('ask_question[agree_usage]') + end + defalt_fields << f1 + end + end end - else - defalt_fields = defalt_fields + [{'style_html'=>'display: none;','label'=>'','content'=>hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}] - end - defalt_fields = defalt_fields + ['name','sex','mail','phone','appointment'].select{|v| ask_setting.default_setting[v]}.collect do |field| - required = ['phone','appointment'].exclude?(field) ? 'true' : 'false' - f1 = {'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("#{field}"),required)} - field_name = "ask_question[#{field}]" - case field - when 'name' - f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;", "fv-messages" => "必填欄位;"},required: true,placeholder:@default_ask_setting.field_name("#{field}")) - when 'sex' - f1['content'] = " - " - when 'mail' - f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"},required: true,placeholder:@default_ask_setting.field_name("#{field}")) - when 'phone' - f1['content'] = text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}")) - when 'appointment' - f1['content'] = "
#{text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"))}
" - end - f1 - end - defalt_fields = defalt_fields + ask_setting.custom_fields.collect{|k,v| {'label'=>ask_label(v['field'][I18n.locale],v['required']),'content'=>show_on_front(k,v)}} - if !ask_setting.usage_rule.blank? - defalt_fields << {'style_html'=>'','label'=>ask_label(t("ask.usage_rule")),'content'=>ask_setting.usage_rule} - end - if ask_setting.default_setting['agree_usage'] - defalt_fields << {'style_html'=>'','label'=>ask_label(t("#{tmp}.agree_usage")),'content'=>check_box_tag('ask_question[agree_usage]')} - end - if ask_setting.default_setting['agree_show'] - defalt_fields << {'style_html'=>'','label'=>ask_label(t("#{tmp}.agree_show")),'content'=>check_box_tag('ask_question[agree_show]')} end defalt_fields end - def cal_html(fields,token_tag,form_id,referer_url) + def cal_html(fields,token_tag,form_id,referer_url,is_hidden=true) form_url = "/#{I18n.locale.to_s}/asks" submit_tag = submit_tag(t('submit'), :class=> 'btn btn-primary', :id => 'button-mail') close_tag = button_tag(t('cancel'), type: 'reset', :class=> 'btn') @@ -316,7 +339,7 @@ class AsksController < ActionController::Base " end.join - "
+ " #{token_tag}
#{tmp} @@ -368,17 +391,21 @@ class AsksController < ActionController::Base end def cal_switch_form(ask_settings,categories,token_tag,referer_url) switch_form = '' - if ask_settings.count > 1 - switch_form = script_text + ask_settings.collect do |ask_setting| - fields = cal_form_from_setting(ask_setting,categories,true) - if ask_setting.class == AskSetting - form_id = 'ask-default-form' - else - form_id = ask_setting.category_id - end - cal_html(fields,token_tag,form_id,referer_url) - end.join + default_idx = 0 + if categories.count != 0 + default_idx = ask_settings[1..-1].map{|a| a.category_id.to_s}.index(categories[0].id.to_s) + default_idx = default_idx.nil? ? 0 : default_idx + 1 end + switch_form = script_text + ask_settings.collect.with_index do |ask_setting,i| + fields = cal_form_from_setting(ask_setting,categories,true) + is_hidden = (i != default_idx) + if ask_setting.class == AskSetting + form_id = 'ask-default-form' + else + form_id = ask_setting.category_id + end + cal_html(fields,token_tag,form_id,referer_url,is_hidden) + end.join switch_form end end \ No newline at end of file diff --git a/app/models/ask_category_setting.rb b/app/models/ask_category_setting.rb index efb2d38..d29e7d8 100644 --- a/app/models/ask_category_setting.rb +++ b/app/models/ask_category_setting.rb @@ -33,7 +33,7 @@ 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 - + field :sort_number, type: Hash, default: {} field :default_setting, type: Hash,default: {ask_category_id: true,name: true,sex: false,mail: true,phone: false,appointment: false,recaptcha: false,agree_show: true,agree_usage: false} field :default_setting_field_name, type: Hash,default: {} diff --git a/app/models/ask_setting.rb b/app/models/ask_setting.rb index 3565268..8c7617c 100644 --- a/app/models/ask_setting.rb +++ b/app/models/ask_setting.rb @@ -1,6 +1,7 @@ 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'] after_initialize do if !self.new_record? if self.default_setting.class != Hash && self.default_setting.class != BSON::Document @@ -22,21 +23,73 @@ class AskSetting tmp = super tmp.select{|k,v| v['delete'] != 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) + 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 default_field_name(k,locale=I18n.locale.to_s) - I18n.with_locale(locale){(['agree_show','agree_usage'].include?(k.to_s) ? I18n.t("ask.#{k}_checkbox") : I18n.t("mongoid.attributes.ask_question.#{k}"))} + 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 def field_name_translations(k) I18n.available_locales.map{|v| [v.to_s,self.field_name(k,v.to_s)]}.to_h end - + field :sort_number, type: Hash, default: {} field :default_setting, type: Hash,default: {ask_category_id: true,name: true,sex: false,mail: true,phone: false,appointment: false,recaptcha: false,agree_show: true,agree_usage: false} field :default_setting_field_name, type: Hash,default: {} field :custom_fields, type: Hash,default: {} field :usage_rule + + def self.get_disp_fields_infos + ask_setting = self.first + ask_setting = self.create() if ask_setting.nil? + disp_fields = self::All_default_fields + disp_fields_infos = {} + locale = I18n.locale.to_s + disp_fields[0...-4].each do |f| + disp_fields_infos[f] = {"trans"=>ask_setting.field_name(f,locale),"sort_number"=>ask_setting.sort_number[f]} + end + tmp_locales = I18n.available_locales.map{|l| l.to_s} + tmp_locales = [locale] + (tmp_locales - [locale]) + ask_setting.custom_fields.each do |k,v| + trans = v["field"] + tmp_locales.each do |l| + trans = trans[l] if trans[l].present? + end + next if trans.class != String + tmp_k = "default@#{k}" + disp_fields_infos[tmp_k] = {"trans"=>trans,"sort_number"=>ask_setting.sort_number[tmp_k]} + end + AskCategorySetting.all.each do |c| + cat = Category.find(c.category_id) + c.custom_fields.each do |k,v| + trans = v["field"] + tmp_locales.each do |l| + trans = trans[l] if trans[l].present? + end + next if trans.class != String + 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]} + end + end + disp_fields[-4..-1].each do |f| + disp_fields_infos[f] = {"trans"=>ask_setting.field_name(f,locale),"sort_number"=>ask_setting.sort_number[f]} + end + max_sort_number = disp_fields_infos.values.map{|h| h["sort_number"].to_i}.max + if max_sort_number + max_sort_number = max_sort_number + 1 + disp_fields_infos.each do |k,h| + if h["sort_number"].blank? + h["sort_number"] = max_sort_number + else + h["sort_number"] = h["sort_number"].to_i + end + end + disp_fields_infos = disp_fields_infos.sort_by {|_key, value| value["sort_number"]} + end + disp_fields_infos + end end diff --git a/app/views/admin/asks/_ask_setting.html.erb b/app/views/admin/asks/_ask_setting.html.erb index 6bf13b5..237c7e3 100644 --- a/app/views/admin/asks/_ask_setting.html.erb +++ b/app/views/admin/asks/_ask_setting.html.erb @@ -1,5 +1,5 @@ + \ No newline at end of file diff --git a/app/views/admin/asks/setting.html.erb b/app/views/admin/asks/setting.html.erb index 1650f6a..1521831 100644 --- a/app/views/admin/asks/setting.html.erb +++ b/app/views/admin/asks/setting.html.erb @@ -2,7 +2,7 @@ set_input_name('ask_setting[custom_fields]') %>