diff --git a/app/controllers/admin/asks_controller.rb b/app/controllers/admin/asks_controller.rb index 8db0cbb..8e3897a 100644 --- a/app/controllers/admin/asks_controller.rb +++ b/app/controllers/admin/asks_controller.rb @@ -71,17 +71,25 @@ class Admin::AsksController < OrbitAdminController ask_setting.update_attributes(p1) redirect_to "/#{locale}/admin/asks" end + def switch_to_default_setting + if AskCategorySetting.where(:id=>params[:id]).update_all(:use_default=>params[:use_default] == "true").documents[0]["nModified"] != 0 + render :json => {success: true} + else + render :json => {success: false} + end + end def category_setting_save 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') - ask_setting.update_attributes(p1) + puts ask_setting.inspect + puts ["update!", p1] + ask_setting.update!(p1) redirect_to "/#{locale}/admin/asks/category_setting" end def setting @ask_setting = AskSetting.first - @ask_setting = AskSetting.create() if @ask_setting.nil? @url = setting_save_admin_asks_path end def get_new_setting_index @@ -101,12 +109,11 @@ class Admin::AsksController < OrbitAdminController def index AskPrintSetting.create() if AskPrintSetting.first.nil? @ask_setting = AskSetting.first - @ask_setting = AskSetting.create() if @ask_setting.nil? @tags = @module_app.tags @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'] + @table_fields = [:situation, :category, 'title' , 'ask.name', 'ask.phone', 'ask.appointment','ask.created_at','ask.ip'] # 列表排序 # debugger if filter2("situation").blank? and filter2("identity").blank? @@ -142,17 +149,9 @@ class Admin::AsksController < OrbitAdminController @categories = current_user.approved_categories_for_module(@module_app).sort_by{|category| (((@module_app.asc rescue true) ? category.sort_number.to_i : -category.sort_number.to_i) rescue category.id)} @category_ids = @categories.collect(&:id) @category_titles = @categories.collect{|v| v.title} - - @category_added = AskCategorySetting.all.asc(:created_at) - @category_added_ids = @category_added.pluck(:category_id) - @category_not_add_index = @category_ids.to_enum.with_index.select{|v,i| @category_added_ids.exclude? v.to_s}.collect{|v,i| i} - @category_not_add = @category_titles.values_at(*@category_not_add_index).zip(@category_ids.values_at(*@category_not_add_index)) - - @category_print_added = AskCategoryPrintSetting.all.asc(:created_at) - @category_print_added_ids = @category_print_added.pluck(:category_id) - @category_print_not_add_index = @category_ids.to_enum.with_index.select{|v,i| @category_print_added_ids.exclude? v.to_s}.collect{|v,i| i} - @category_print_not_add = @category_titles.values_at(*@category_print_not_add_index).zip(@category_ids.values_at(*@category_print_not_add_index)) - + @category_added = AskCategorySetting.all.asc(:created_at).map{|a| [a.category_id, a]}.to_h + @category_added_ids = @category_added.map{|k,v| k} + @url = category_setting_save_admin_asks_path end def get_category_setting_field @default_ask_setting = AskSetting.first @@ -294,7 +293,6 @@ class Admin::AsksController < OrbitAdminController ask_setting = AskCategorySetting.where(category_id: params['ask_question']['category_id']).first if ask_setting.nil? ask_setting = AskSetting.first - ask_setting = AskSetting.create() if ask_setting.nil? end if temp_params['custom_values'].nil? temp_params['custom_values'] = {} @@ -402,42 +400,125 @@ class Admin::AsksController < OrbitAdminController def order_fields @cats_relations = get_categories_info @category_id = (params[:category] || @cats_relations[0][0] rescue nil) - @disp_fields_infos = AskSetting.get_disp_fields_infos(@category_id) + @disp_fields_infos = AskSetting.get_disp_fields_infos(false,@category_id) end def update_order_fields - if params[:category] - ask_setting = AskCategorySetting.where(:category_id=>params[:category]).first + ask_setting = AskCategorySetting.where(:category_id=>params[:category]).first + use_default = ask_setting && ask_setting.use_default + sort_number = params[:sort_number].map{|k,v| [k,v.to_i]}.to_h + if params[:category].present? && !use_default if ask_setting.nil? default_setting = AskSetting.first - default_setting = AskSetting.create if default_setting.nil? ask_setting = AskCategorySetting.create(category_id: params[:category]) p1 = default_setting.get_attrs ask_setting.update_attributes(p1) + ask_setting.update(:use_default => true) end - ask_setting.update(:sort_number=>params[:sort_number]) + 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 + 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) + end + preserve_count = AskSetting::All_default_fields.count + if non_intersect_keys.count != 0 + max_sort_number = default_sort_number.map{|k,v| v.to_i}.max.to_i + max_sort_number += 1 + max_sort_number += preserve_count + part_sort_number = non_intersect_keys.map.with_index{|(k,v), i| [k, max_sort_number + i]} + default_sort_number = default_sort_number.merge(part_sort_number.to_h) + end + default_ask_setting.update(:sort_number=>default_sort_number) else - AskSetting.update_all(:sort_number=>params[:sort_number]) + ask_setting = AskSetting.first + if use_default + sort_number = ask_setting.sort_number.merge(sort_number) + end + AskSetting.update_all(:sort_number=>sort_number) + unless use_default + custom_sort_number = sort_number.select{|k, v| k.include?('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 + 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) + end + if non_intersect_keys.count != 0 + max_sort_number = sort_number.map{|k,v| v.to_i}.max.to_i + max_sort_number += 1 + max_sort_number += preserve_count + part_sort_number = non_intersect_keys.map.with_index{|(k,v), i| [k, max_sort_number + i]} + sort_number = sort_number.merge(part_sort_number.to_h) + end + ask_setting.update(:sort_number=>sort_number) + end + end + end + end + render :json => {:success=>true} + end + def ticket_status + @ticket_statuses = AskTicketStatus.all + if request.xhr? + render 'ticket_status', :layout => false + end + end + def get_ticket_status + ticket_status = AskTicketStatus.where(:id=>params[:id]).first + render :json => { + "id"=>params[:id], + "title_translations"=> (ticket_status ? ticket_status.get_title_translations : {}) + } + end + def update_ticket_status + if params[:id].blank? + ticket_status = AskTicketStatus.new + else + ticket_status = AskTicketStatus.where(:id=>params[:id]).first + end + ticket_status.update_attributes(params.require(:ask_ticket_status).permit!) + render :json => {:success=>true} + end + def delete_ticket_status + ticket_status = AskTicketStatus.where(:id=>params[:id]).first + unless ticket_status.is_default + ticket_status.destroy end render :json => {:success=>true} end private def ask_setting_params(ask_setting,collection_name) - param = params.require(collection_name).permit! + 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'].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') - custom_fields = ask_setting['custom_fields'].clone + 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| 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 end end - param_clone.merge({custom_fields: custom_fields}) + param_clone.merge({"custom_fields"=> custom_fields}) end end diff --git a/app/controllers/asks_controller.rb b/app/controllers/asks_controller.rb index ea61e7f..5508db0 100644 --- a/app/controllers/asks_controller.rb +++ b/app/controllers/asks_controller.rb @@ -18,15 +18,21 @@ class AsksController < ApplicationController else categories = Category.where(:id.in=>OrbitHelper.widget_categories).enabled end - categories = categories.sort_by{|category| (((module_app.asc rescue true) ? category.sort_number.to_i : -category.sort_number.to_i) rescue category.id)} + if (module_app.asc rescue true) + categories = categories.sort_by{|category| (category.sort_number.to_i rescue category.id)} + else + categories = categories.sort_by{|category| (-category.sort_number.to_i rescue category.id)} + end tags = module_app.tags ask_question = AskQuestion.new locale = I18n.locale - ask_settings = AskCategorySetting.where(:category_id.in=> categories.collect{|v| v.id.to_s}).to_a + category_ids = categories.collect{|v| v.id.to_s} + ask_settings = AskCategorySetting.enabled.where(:category_id.in=> category_ids).to_a + first_category_id = category_ids.first + ask_setting = ask_settings.select{|a| a.category_id == first_category_id}.first if ask_settings.count != categories.count ask_settings = [AskSetting.first]+ask_settings end - ask_setting = AskCategorySetting.where(category_id: categories.first.id.to_s).first if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? @@ -100,7 +106,7 @@ class AsksController < ApplicationController end def show ask_question = AskQuestion.where(id: @params['item']).first - ask_setting = AskCategorySetting.where(category_id: ask_question.category_id.to_s).first + ask_setting = AskCategorySetting.enabled.where(category_id: ask_question.category_id.to_s).first ask_setting = AskSetting.first if ask_setting.nil? {'ask_question' => ask_question,'layout_type'=>'show','ask_setting'=>ask_setting} end @@ -125,12 +131,18 @@ class AsksController < ApplicationController else categories = Category.where(:id.in=>OrbitHelper.page_categories).enabled end - categories = categories.sort_by{|category| (((module_app.asc rescue true) ? category.sort_number.to_i : -category.sort_number.to_i) rescue category.id)} if !(categories.include?("all")) - ask_settings = AskCategorySetting.where(:category_id.in=> categories.collect{|v| v.id.to_s}).to_a + if (module_app.asc rescue true) + categories = categories.sort_by{|category| (category.sort_number.to_i rescue category.id)} + else + categories = categories.sort_by{|category| (-category.sort_number.to_i rescue category.id)} + end + category_ids = categories.collect{|v| v.id.to_s} + ask_settings = AskCategorySetting.enabled.where(:category_id.in=> category_ids).to_a + first_category_id = category_ids.first + ask_setting = ask_settings.select{|a| a.category_id == first_category_id}.first if ask_settings.count != categories.count ask_settings = [AskSetting.first]+ask_settings end - ask_setting = AskCategorySetting.where(category_id: categories.first.id.to_s).first if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? @@ -178,10 +190,10 @@ class AsksController < ApplicationController if !params[:referer_url].blank? && !params[:referer_url].to_s.start_with?("/") render :file => "#{Rails.root}/app/views/errors/403.html", :layout => false, :status => 403 and return end - @ask_question = AskQuestion.new() + @ask_question = AskQuestion.new(:ip=>request.remote_ip) temp_params = create_params all_to_save = [] - ask_setting = AskCategorySetting.where(category_id: params['ask_question']['category_id']).first + ask_setting = AskCategorySetting.enabled.where(category_id: params['ask_question']['category_id']).first email_regex = nil if ask_setting.nil? ask_setting = AskSetting.first @@ -208,7 +220,9 @@ class AsksController < ApplicationController temp_params['custom_values'][to_save[0]] = [temp_params['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 + if (email_regex ? ::Regexp.new(email_regex).match(temp_params["mail"].to_s) : true) && flag + @disp_fields_infos = AskSetting.get_disp_fields_infos(true, ask_setting.class == AskCategorySetting ? ask_setting.category_id : nil) + @usage_rule = ask_setting.usage_rule @ask_question.update_attributes(temp_params) build_email(@ask_question) redirect_to "#{params[:referer_url]}?method=thank" @@ -239,7 +253,10 @@ class AsksController < ApplicationController site = current_site rescue Site.first mail_from = site.title_translations[site.default_locale] - + host_url = Site.first.root_url rescue "http://" + if host_url == "http://" + host_url = request.protocol + request.host_with_port + end email_er.email.update_attributes( :mail_lang=> site.default_locale, :create_user=>(current_user rescue nil), @@ -256,7 +273,11 @@ class AsksController < ApplicationController "phone" => email_er.phone, # "fax" => email_er.fax, # "content" => email_er.content - "appointment" => email_er.appointment + "appointment" => email_er.appointment, + "disp_fields_infos" => @disp_fields_infos, + "ask_question_id" => email_er.id.to_s, + "site_host" => host_url, + "usage_rule" => @usage_rule } ) @@ -268,14 +289,17 @@ class AsksController < ApplicationController end private def cal_form_from_setting(ask_setting,categories,show_categories=false,filter_fields=nil) - disp_fields_infos = AskSetting.get_disp_fields_infos(ask_setting.class == AskCategorySetting ? ask_setting.category_id : nil) + disp_fields_infos = AskSetting.get_disp_fields_infos(true, ask_setting.class == AskCategorySetting ? ask_setting.category_id : nil) 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)}] + 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_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@") k = field[8..-1] @@ -304,34 +328,34 @@ class AsksController < ApplicationController 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)} + required = ask_setting.default_setting_required[field] + f1 = {'style_html'=>'','label'=>ask_label(@default_ask_setting.field_name("#{field}"),required.to_s)} 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}")) + f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;", "fv-messages" => "必填欄位;"} : {}),required: required,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}")) + 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}")) when 'phone' - f1['content'] = text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}")) + f1['content'] = text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"),required: required) when 'appointment' - f1['content'] = "
#{text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"))}
" + f1['content'] = "
#{text_field_tag(field_name,nil,placeholder:@default_ask_setting.field_name("#{field}"),required: required)}
" 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]') + f1['content'] = check_box_tag('ask_question[agree_show]', "1", false, {required: required}) when 'agree_usage' - f1['content'] = check_box_tag('ask_question[agree_usage]') + f1['content'] = check_box_tag('ask_question[agree_usage]', "1", false, {required: required}) end defalt_fields << f1 end diff --git a/app/helpers/admin/asks_helper.rb b/app/helpers/admin/asks_helper.rb index a18a666..2e47ad8 100644 --- a/app/helpers/admin/asks_helper.rb +++ b/app/helpers/admin/asks_helper.rb @@ -16,11 +16,22 @@ module Admin::AsksHelper OrbitHelper.set_this_module_app("ask") cats_relations = [] access_level = OrbitHelper.user_access_level? + include_all = false + cats = [] if access_level == "sub_manager" - cats_relations = current_user.approved_categories_for_module(@module_app).map{|c| [c.id.to_s, c.title]} + cats = current_user.approved_categories_for_module(@module_app) elsif access_level && access_level != "user" cats = @module_app.categories.enabled - cats_relations = [["",t(:all)]] + cats.map{|c| [c.id.to_s, c.title]} + include_all = true + end + if (@module_app.asc rescue true) + cats = cats.sort_by{|category| (category.sort_number.to_i rescue category.id) } + else + cats = cats.sort_by{|category| (-category.sort_number.to_i rescue category.id)} + end + cats_relations = cats.map{|c| [c.id.to_s, c.title]} + if include_all + cats_relations.insert(0, ["",t(:all)]) end cats_relations end @@ -39,6 +50,38 @@ module Admin::AsksHelper end.join.html_safe end 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(/\]/,'') + else + all_field = (get_input_name + "[#{field}][parant]").gsub(/\[/,'_').gsub(/\]/,'') + end + tmp = (I18n.available_locales.collect do |locale| + active_flag = ((locale == I18n.locale) ? ' active' : '') + content_tag(:div,:class => "tab-content#{active_flag}",:id=>"#{all_field}_#{locale}") do + value_locale = value[locale.to_s] rescue nil + "
#{value_locale}
".html_safe + end + end.join + create_lang_panel(all_field)).html_safe + combine_element + + if sortable + if exteral_options['style'].nil? + exteral_options['style'] = 'display: flex;align-items: center;flex-wrap: nowrap;' + else + exteral_options['style'] = exteral_options['style'] + 'display: flex;align-items: center;flex-wrap: nowrap;' + end + tmp = content_tag(:div,{:class => "tab-panel border"}.merge(exteral_options)) do + ("" +content_tag(:div) do + tmp + end).html_safe + end + else + tmp = content_tag(:div,{:class => "tab-panel"}.merge(exteral_options)) do + tmp + end + end + tmp = "#{field_name}".html_safe + ":".html_safe + tmp + "".html_safe + 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(/\]/,'') @@ -170,6 +213,8 @@ module Admin::AsksHelper case v['type'] when 'text_field' readonly ? value : text_field_tag(field_name,value,{:required => v['required']=='true',placeholder: v['prompt_word'][I18n.locale]}) + when 'instructions' + (v['instructions'][I18n.locale].html_safe rescue "") when 'select' prompt_hash = v['prompt_word'][I18n.locale].blank? ? {} : {prompt: v['prompt_word'][I18n.locale]} prompt_hash.merge(:required => v['required']=='true') @@ -221,7 +266,7 @@ module Admin::AsksHelper file_path = value[1] rescue nil file_required = v['required']=='true' ? 'required="required"' : '' readonly ? "#{file_value}" : "
" when 'image' @@ -229,7 +274,7 @@ module Admin::AsksHelper file_path = value[1] rescue nil file_required = v['required']=='true' ? 'required="required"' : '' readonly ? "\"#{file_value}\"" : "
" end @@ -237,35 +282,65 @@ module Admin::AsksHelper "
#{e.inspect}
#{e.backtrace.to_yaml}
" end end - def custom_field_block(k,v={}) - 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']] - 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)'}) - 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)}" - 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')})}
" - 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')}
" - tmp = "
#{all_new_options}
" - field_html = " - + def custom_field_block(k,v={},show_only=false) + 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']) + require_ask_tag = "#{t('ask.required')}:#{v['required']=='true' ? t('ask.yes') : t('ask.no')}" + markups = markups.map{|k,v| [v,k]}.to_h + tmp = markups[v['type']] + tmp = markups.values[0] if tmp.nil? + field_select_tag = "#{t('ask.setting_type')}:
#{tmp}
" + active_prompt_class = ['date','radio_button','checkbox'].exclude?(v['type']) ? ' active' : '' + active_class = ['select','radio_button','checkbox'].include?(v['type']) ? ' active' : '' + multi_lang_prompt_tag = multiple_lang_show_tag(t('ask.prompt_word'),k,'prompt_word',v['prompt_word']) + field_html = " + + #{multi_lang_tag} #{require_ask_tag} - #{field_select_tag}
+ #{field_select_tag} #{multi_lang_prompt_tag} - #{time_setting_block(k,v)} - #{tmp} - #{key} - - - #{create_delete_button('delete_field_func')} - - " + " + 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)'}) + 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)}" + 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')}
" + tmp = "
#{all_new_options}
" + field_html = " + + #{multi_lang_tag} + #{require_ask_tag} + #{field_select_tag}
+ #{multi_lang_prompt_tag} + #{instructions_text_area} + #{time_setting_block(k,v)} + #{tmp} + #{key} + + + #{create_delete_button('delete_field_func')} + + " + end end def create_delete_button(func_name) "" diff --git a/app/models/ask_category_setting.rb b/app/models/ask_category_setting.rb index 2f08f5a..56fbd9d 100644 --- a/app/models/ask_category_setting.rb +++ b/app/models/ask_category_setting.rb @@ -34,14 +34,15 @@ class AskCategorySetting 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, 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_field_name, type: Hash,default: {} - + field :use_default, type: Boolean, default: false field :custom_fields, type: Hash,default: {} field :usage_rule field :category_id field :title_layout, type: Integer field :email_regex_enable, type: Boolean, default: false field :email_regex, type: String, default: '\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z' - + scope :enabled, ->{where(:use_default.ne=>true)} end diff --git a/app/models/ask_question.rb b/app/models/ask_question.rb index 29aea0a..18297ec 100644 --- a/app/models/ask_question.rb +++ b/app/models/ask_question.rb @@ -3,9 +3,10 @@ class AskQuestion include Mongoid::Timestamps # include ActiveModel::Validations include OrbitCategory::Categorizable - include OrbitTag::Taggable + # include OrbitTag::Taggable # 欄位 + field :ip, type: String field :name, type: String field :identity, type: String field :mail, type: String @@ -46,7 +47,7 @@ class AskQuestion end end email_address.uniq! - # email_address = email_address +[self.mail] if !self.mail.blank? + email_address = email_address +[self.mail] if !self.mail.blank? email_address.flatten end diff --git a/app/models/ask_setting.rb b/app/models/ask_setting.rb index a750e66..f300719 100644 --- a/app/models/ask_setting.rb +++ b/app/models/ask_setting.rb @@ -43,12 +43,14 @@ class AskSetting 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: {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, 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_field_name, 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 def get_attrs attrs = self.attributes.clone self.fields.each do |k, v| @@ -57,20 +59,25 @@ class AskSetting attrs.delete(k) end end - attrs.except("_type","_id","uid","updated_at", "created_at", "email_regex") + attrs.except("_type","_id","uid","updated_at", "created_at", "email_regex", "last_ticket_key") end - def self.get_disp_fields_infos(cat=nil) + def self.get_disp_fields_infos(only_display=true, cat=nil) ask_setting = nil if cat.present? - ask_setting = AskCategorySetting.where(:category_id=>cat).first + ask_setting = AskCategorySetting.enabled.where(:category_id=>cat).first end ask_setting = self.first if ask_setting.nil? ask_setting = self.create() if ask_setting.nil? + default_ask_setting = ask_setting.class == self ? ask_setting : self.first 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]} + tmp = disp_fields[0...-4] + if only_display + tmp = tmp.select{|f| ask_setting.default_setting[f]} + end + tmp.each do |f| + disp_fields_infos[f] = {"trans"=>default_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]) @@ -81,13 +88,13 @@ class AskSetting 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]} + disp_fields_infos[tmp_k] = {"trans"=>trans,"sort_number"=>ask_setting.sort_number[tmp_k],"key"=>k,"type"=>v["type"],"options"=>v["options"],"instructions"=>v["instructions"]} end ask_category_settings = [] if ask_setting.class == AskCategorySetting || cat.present? ask_category_settings = [] else - ask_category_settings = AskCategorySetting.all.to_a + ask_category_settings = AskCategorySetting.enabled.to_a end ask_category_settings.each do |c| cat = Category.find(c.category_id) @@ -99,20 +106,24 @@ class AskSetting 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]} + 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"]} 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]} + tmp = disp_fields[-4..-1] + if only_display + tmp = tmp.select{|f| ask_setting.default_setting[f] || f == 'usage_rule'} end - max_sort_number = disp_fields_infos.values.map{|h| h["sort_number"].to_i}.max + tmp.each do |f| + disp_fields_infos[f] = {"trans"=>default_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"]}.compact.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 + h["sort_number"] = max_sort_number + h["key"].to_i else - h["sort_number"] = h["sort_number"].to_i + h["sort_number"] = h["sort_number"] end end disp_fields_infos = disp_fields_infos.sort_by {|_key, value| value["sort_number"]} diff --git a/app/models/ask_ticket_status.rb b/app/models/ask_ticket_status.rb new file mode 100644 index 0000000..6561b6a --- /dev/null +++ b/app/models/ask_ticket_status.rb @@ -0,0 +1,42 @@ +class AskTicketStatus + include Mongoid::Document + include Mongoid::Timestamps + DefaultKeys = ["is_waiting", "is_processed", "is_referral", "is_published"] + field :title, type: String, localize: true + field :is_default, type: Boolean, default: false # if true => cannot delete + field :key, type: String + before_create do + if self.key.blank? + can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + last_ticket_key = can_update_shared_hash ? OrbitHelper::SharedHash["ask"][:last_ticket_key] : AskSetting.pluck(:last_ticket_key)[0].to_i + self.key = last_ticket_key.to_s + AskSetting.all.inc({'last_ticket_key'=>1}) + if can_update_shared_hash + OrbitHelper::SharedHash["ask"][:last_ticket_key] = last_ticket_key + 1 + end + end + true + end + after_destroy do + # can_update_shared_hash = (defined?(OrbitHelper::SharedHash) && OrbitHelper::SharedHash) + # AskSetting.all.inc({'last_ticket_key'=>-1}) + # if can_update_shared_hash + # OrbitHelper::SharedHash["ask"][:last_ticket_key] = OrbitHelper::SharedHash["ask"][:last_ticket_key] - 1 + # end + end + def title + tmp = super + if self.is_default + tmp = I18n.t("ask.#{self.key}") if tmp.blank? + end + tmp + end + def get_title_translations(locales=nil) + locales = I18n.available_locales if locales.nil? + trans = {} + locales.each do |locale| + trans[locale] = I18n.with_locale(locale){self.title} + end + trans + end +end \ No newline at end of file diff --git a/app/views/admin/asks/_ask_setting.html.erb b/app/views/admin/asks/_ask_setting.html.erb index 4f510c5..5c7b413 100644 --- a/app/views/admin/asks/_ask_setting.html.erb +++ b/app/views/admin/asks/_ask_setting.html.erb @@ -43,7 +43,7 @@ .center .tab-panel{ justify-content: start; } - tr.custom_field { + tr.custom_field, tbody.custom_field { border: 0.1em solid #8e00ff; } tr.custom_field > td >div { @@ -64,23 +64,30 @@ var tmp = $(ele).val() var parent_div = $(ele).parents('.custom_field').eq(0) if (tmp != 'date' && tmp != 'radio_button' && tmp!='checkbox'){ - parent_div.find('.prompt_word').addClass('active') + parent_div.find('.prompt_word').addClass('active'); }else{ - parent_div.find('.prompt_word').removeClass('active') + parent_div.find('.prompt_word').removeClass('active'); } if (tmp == 'select' || tmp == 'radio_button' || tmp=='checkbox'){ - parent_div.find('.add_new_options').addClass('active') + parent_div.find('.add_new_options').addClass('active'); }else{ - parent_div.find('.add_new_options').removeClass('active') + parent_div.find('.add_new_options').removeClass('active'); + } + if (tmp == 'instructions'){ + parent_div.find('.instructions_text_area').removeClass('hide'); + parent_div.find('.prompt_word').removeClass('active'); + }else{ + parent_div.find('.instructions_text_area').addClass('hide'); + parent_div.find('.prompt_word').addClass('active'); } if (tmp == 'date'){ - parent_div.find('.time_setting_block').addClass('active') + parent_div.find('.time_setting_block').addClass('active'); }else{ - parent_div.find('.time_setting_block').removeClass('active') + parent_div.find('.time_setting_block').removeClass('active'); } } function delete_field_func(ele){ - $(ele).parents('tr').remove() + $(ele).parents('tr').hide() var all_delete_field = $('.delete_field').val() all_delete_field = all_delete_field + ',' + $(ele).parents('tr').find('.key').val() $('.delete_field').val(all_delete_field) @@ -113,6 +120,24 @@ set_input_name("#{form_type}") %>
+ <% if @has_switch_button %> +
+ +
+
+
+ <% elsif form_type!= 'ask_setting' %> +
+
+ <%= t("ask.use_default") %> + <%= hidden_field_tag "#{f.object_name}[use_default]", false %> +
+
+
+
+ <% end %>
@@ -141,6 +166,19 @@ } }) + <% else %> +
+
+ <%= t("ask.email_regex") %>: +
+
+ <%= check_box_tag :email_regex_enable, @default_ask_setting.email_regex_enable , nil , {:id=>"",:disabled=>'disabled'} %><%= t("ask.enable") %> +
+
+ <%= @default_ask_setting.email_regex %> +
+
+
<% end %> @@ -154,13 +192,22 @@ <% if form_type=='ask_setting' %> <% end %> + <% locale = I18n.locale.to_s %> - <% ask_setting.default_setting.each do |k,v| %> + <% + default_setting = ask_setting.default_setting + if default_setting.keys[0].to_s != 'title' + default_setting = {title: true}.merge(default_setting) + end + %> + <% default_setting.each do |k,v| %> <% end %> + <% v = ask_setting.default_setting_required[k] %> + <% end %> <% set_input_name(tmp_get_input_name) %> diff --git a/app/views/admin/asks/_category_setting_field.html.erb b/app/views/admin/asks/_category_setting_field.html.erb index de8191a..baa3495 100644 --- a/app/views/admin/asks/_category_setting_field.html.erb +++ b/app/views/admin/asks/_category_setting_field.html.erb @@ -1,8 +1,7 @@ <% set_input_name('ask_category_setting[custom_fields]') %> -<%= form_for ask_setting,method: 'post',url: "/#{I18n.locale}/admin/asks/category_setting_save",html: { class: "form-horizontal fade-in active detail", 'id' => ask_setting.id.to_s ,:id => ask_setting.id} do |f| %> +<%= form_for ask_setting,method: 'post',url: category_setting_save_admin_asks_path ,html: { class: "form-horizontal fade-in active detail", 'id' => ask_setting.id.to_s ,:id => ask_setting.id} do |f| %> <%= render partial: 'ask_setting',locals:{ask_setting: ask_setting,f: f,submit_text: t('ask.modify')} %> <%= hidden_field_tag "category_id",ask_setting.category_id %> - <% end %> \ No newline at end of file diff --git a/app/views/admin/asks/_default_ask_setting.html.erb b/app/views/admin/asks/_default_ask_setting.html.erb new file mode 100644 index 0000000..2f0c17a --- /dev/null +++ b/app/views/admin/asks/_default_ask_setting.html.erb @@ -0,0 +1,13 @@ +
+
+ <%= render :partial => 'show_default_ask_setting' %> +
+
+ <%= form_for @default_ask_setting, method: 'post',url: @url,html: { class: 'form-horizontal main-forms previewable' } do |f| %> + <% f.object_name = 'ask_category_setting' %> + <%= hidden_field_tag "not_clone_attrs", true , :class=> 'not_clone_attrs' %> + <%= hidden_field_tag "category_id", @first_category_id , :class=> 'hidden_category_id' %> + <%= render partial: 'ask_setting',locals:{ask_setting: @default_ask_setting,f: f,submit_text: t('submit'), :@has_email_regex => false, :@has_switch_button => true} %> + <% end %> +
+
\ 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 a97e969..aa450b5 100644 --- a/app/views/admin/asks/_form.html.erb +++ b/app/views/admin/asks/_form.html.erb @@ -56,12 +56,17 @@ - + - - + + <% if ask_setting.default_setting['appointment'] %> + + + + + <% end %> @@ -83,12 +88,7 @@ diff --git a/app/views/admin/asks/_index.html.erb b/app/views/admin/asks/_index.html.erb index cbfd624..fc6f24e 100644 --- a/app/views/admin/asks/_index.html.erb +++ b/app/views/admin/asks/_index.html.erb @@ -10,18 +10,19 @@ + <% + situation_class_relation = { + "is_waiting"=>"label-important", + "is_processed"=>"label-warning", + "is_referral"=>"", + "is_published"=>"label-success" + } + situation_trans = AskTicketStatus.all.map{|a| [a.key, a.title]}.to_h + %> <% @askquestions.each do |b| %> <% end %> + <% end %> diff --git a/app/views/admin/asks/_show_default_ask_setting.html.erb b/app/views/admin/asks/_show_default_ask_setting.html.erb new file mode 100644 index 0000000..a8e863b --- /dev/null +++ b/app/views/admin/asks/_show_default_ask_setting.html.erb @@ -0,0 +1,77 @@ +
+ +
<%= t('ask.field_name') %> - + + <%= t('ask.required') %> +
<%= tmp = (form_type=='ask_setting' ? ask_setting.default_field_name(k,locale, true) : @default_ask_setting.field_name(k,locale, true)) %> @@ -173,6 +220,10 @@ <%= multiple_lang_tag(nil,'text_field',"default_setting_field_name][#{k}",ask_setting.field_name_translations(k),{placeholder: tmp}) %> + <%= select_tag "#{get_input_name}[default_setting_required][#{k}]",options_for_select([[t('yes'),'true'],[t('no'),false]],v) %> +
<%= t('title') %>:<%= @ask_question.title %><%= t('ask.ip') %>:<%= @ask_question.ip %>
<%= AskQuestion.human_attribute_name(:appointment) %>:<%= @ask_question.appointment.strftime("%Y-%m-%d %H:%M") rescue nil %><%= t('title') %>:<%= @ask_question.title %>
<%= AskQuestion.human_attribute_name(:appointment) %>:<%= @ask_question.appointment.strftime("%Y-%m-%d %H:%M") rescue nil %>
<%= f.label t('situation') %> - <%= f.select :situation, [ - [t('ask.is_waiting'), 'is_waiting'], - [t('ask.is_processed'), 'is_processed'], - [t('ask.is_referral'), 'is_referral'], - [t('ask.is_published'),'is_published'] - ] %> + <%= f.select :situation, AskTicketStatus.all.map{|a| [a.title, a.key]} %>
- <% if b.situation == 'is_waiting' %> - <%= t('ask.is_waiting') %> - <% elsif b.situation == 'is_processed' %> - <%= t('ask.is_processed') %> - <% elsif b.situation == 'is_referral' %> - <%= t('ask.is_referral') %> - <% elsif b.situation == 'is_published' %> - <%= t('ask.is_published') %> - <% end %> + <%= situation_trans[b.situation] %> <%= b.category.title rescue 'category not set' %> @@ -54,6 +55,7 @@ <%= b.appointment.strftime("%Y-%m-%d %H:%M") rescue nil %><%= b.created_at.strftime("%Y-%m-%d %H:%M") rescue nil %><%= b.ip %>
+ + + + + + + + + + + + + + + + + + <% locale = I18n.locale.to_s %> + <% true_false_trans = {'true'=> t('yes'), 'false'=>t('no')} %> + <% + default_setting = @default_ask_setting.default_setting + if default_setting.keys[0].to_s != 'title' + default_setting = {title: true}.merge(default_setting) + end + %> + <% default_setting.each do |k,v| %> + + + + + <% end %> + + + + + + <% @default_ask_setting.custom_fields.each do |k,v| %> + <%= custom_field_block(k,v,true).html_safe %> + <% end %> +
+ <%= t('ask.clone_default_setting') %> + <%= t('ask.recover_data') %> +
<%= t("ask.title_layout") %>:<%= [t("ask.single_column"),t("ask.two_column")][@default_ask_setting.title_layout] %>
<%= t("ask.email_regex") %>: + <%= check_box_tag :email_regex_enable, @default_ask_setting.email_regex_enable , nil, {:id=>"",:disabled=>'disabled'} %><%= t("ask.enable") %> +
+
+ <%= @default_ask_setting.email_regex %> +
+
+ <%= t('ask.field') %> + + <%= t('ask.whether_open') %> +
+ <%= tmp = @default_ask_setting.field_name(k,locale, true) %> + + <%= + tmp2 = true_false_trans[v] + tmp2 = true_false_trans.values[0] if tmp2.nil? + tmp2 + %> +
+ <%= t("ask.usage_rule") %> + + <%= @default_ask_setting.usage_rule.html_safe %> +
+
\ No newline at end of file diff --git a/app/views/admin/asks/category_setting.html.erb b/app/views/admin/asks/category_setting.html.erb index e1d3559..8f87679 100644 --- a/app/views/admin/asks/category_setting.html.erb +++ b/app/views/admin/asks/category_setting.html.erb @@ -1,42 +1,149 @@ -<%= t('ask.setting_type') %>: <%= select_tag "setting_type", options_for_select([[t('ask.field_setting'),'field'],[t('ask.print_setting'),'print']]), :class => "category-selector" %> +<% if current_user.is_admin? || current_user.is_manager?(module_app) %> + +<% end %> + + + + - <% if @category_not_add.length != 0 %> - <% ask_setting = AskCategorySetting.new %> - <%= form_for ask_setting,method: 'post',url: "/#{I18n.locale}/admin/asks/category_setting_save",html: { class: "form-horizontal category-set-page"} do |f| %> -
- <% prompt = t('ask.select_category') %> - <%= t('category') %>: <%= select_tag "category_id", options_for_select(@category_not_add.unshift(prompt),selected: prompt,disabled: prompt), :class => "category-selector" %> - <%= render partial: 'ask_setting',locals:{ask_setting: ask_setting,f: f,submit_text: t('submit')} %> -
- <% end %> - <% end %> - <% index1 = 0 %> - <% first_category_added = nil %> + <% + first_category_html = "" + @first_category_id = nil + @first_setting = nil + %>
- <% @category_added.each do |category_added| %> - <% category = @categories.select{|cat| cat.id.to_s==category_added.category_id.to_s}[0] %> - <% if !category.nil? %> - <% if first_category_added.nil? - first_category_added = category_added - end - %> - <% index1+=1 %> - <% name1 = category.title %> - <%= name1.blank? ? "no name" : name1 %> - <% end %> + <% @categories.each_with_index do |category, index1| %> + <% + category_id = category.id.to_s + has_category_setting = @category_added_ids.include?(category_id) + name1 = category.title + if name1.blank? + name1 = "No Name" + end + is_default = false + if has_category_setting + category_added = @category_added[category_id] + is_default = category_added.use_default + else + category_added = @default_ask_setting + is_default = true + end + if index1 == 0 + @first_category_id = category_id + @first_setting = category_added + if has_category_setting && !is_default + first_category_html = render(partial: 'category_setting_field',locals: {ask_setting: category_added}) + end + end + %> + <%= name1 %> (<%=t('ask.default')%>) <% end %>
- <% if !first_category_added.nil? %> - <%= render partial: 'category_setting_field',locals: {ask_setting: first_category_added} %> - <% end %> +
+ <%= first_category_html %> +
+ <%= render(:partial=>"default_ask_setting", locals: {:@is_hidden=>(first_category_html.present? || @categories.length == 0), :@first_category_id=>@first_category_id}) %> - - -
- <% if @category_print_not_add.length != 0 %> -
- <%= hidden_field_tag :authenticity_token, form_authenticity_token %> -
- <% prompt = t('ask.select_category') %> - <%= t('category') %>: <%= select_tag "category_id", options_for_select(@category_print_not_add.unshift(prompt),selected: prompt,disabled: prompt), :class => "category-selector" %> - <%= render partial: 'category_print_setting',locals:{print_setting: AskCategoryPrintSetting.new} %> - - <%= render partial: 'print_format_explain' %> -
-
- <% else %> - <%= render partial: 'print_format_explain' %> - <% end %> - <% index1 = 0 %> - <% categories = []%> -
- <% @category_print_added.each do |category_print_added| %> - <% category = @categories.select{|cat| cat.id.to_s==category_print_added.category_id.to_s}[0] %> - <% categories << category %> - <% if !category.nil? %> - <% index1+=1 %> - <% name1 = category.title %> - <%= name1.blank? ? "no name" : name1 %> - <% end %> - <% end %> -
- <% index2 = 0 %> - <% @category_print_added.each_with_index do |category_print_added,index1| %> - <% if !categories[index1].nil? %> - <% index2 = index2 + 1 %> -
" method="post" id='<%= category_print_added.id.to_s %>' class="form-horizontal fade-in <%= 'active' if index2==1 %>"> - <%= hidden_field_tag :category_id, category_print_added.category_id %> - <%= hidden_field_tag :authenticity_token, form_authenticity_token %> - <%= render partial: 'category_print_setting',locals:{print_setting: category_print_added} %> - - -
- <% end %> - <% end %> -
\ No newline at end of file + \ 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 2e947cb..1d0cb8b 100644 --- a/app/views/admin/asks/setting.html.erb +++ b/app/views/admin/asks/setting.html.erb @@ -14,14 +14,18 @@ var add_field_html = "<%= custom_field_block(-1).inspect %>" add_field_html = add_field_html.replace(/-1/g,data['key']) $(ele).parents('.add_field').before($('
').html(add_field_html).text().slice(1,-2)) - $('.add_new_options').sortable({'handle':'.icons-list-2'}) + var new_item = add_field.prev(); + new_item.find('.add_new_options').sortable({'handle':'.icons-list-2'}) + new_item.find('.ckeditor').each(function(i, item){ + CKEDITOR.replace(item); + }); } }) } <%= form_for @ask_setting,method: 'post',url: @url,html: { class: 'form-horizontal main-forms previewable' } do |f| %> diff --git a/app/views/admin/asks/ticket_status.html.erb b/app/views/admin/asks/ticket_status.html.erb new file mode 100644 index 0000000..1c26dd2 --- /dev/null +++ b/app/views/admin/asks/ticket_status.html.erb @@ -0,0 +1,115 @@ +
+
+ + + + +
+
+
+
+ <%= form_for :ask_ticket_status, url: update_ticket_status_admin_asks_path, remote: true, :html=>{id: "ask_ticket_status_form"} do |f| %> +
+ <%= hidden_field_tag :id, "", {:id=>'hidden_id_field'} %> + <%= f.fields_for :title_translations do |f| %> + <% @site_in_use_locales.each do |locale| %> +
+ +
+ +
+
+ <% end %> + <% end %> +
+ <%= t(:cancel) %> + <%= f.submit t(:submit), class: 'btn btn-primary btn-small', id: "ask_ticket_status_submit" %> +
+
+ <% end %> +
+
+
+
+ + + + + + + + +<% @ticket_statuses.each do |ticket_status| %> + + + + +<% end %> + +
<%= t('ask.status') %><%= t('ask.action') %>
<%= ticket_status.title %> + <%= t(:edit) %> + <% unless ticket_status.is_default %> + + <% end %> +
+"><%= t(:add) %> + \ No newline at end of file diff --git a/app/views/asks/email.html.erb b/app/views/asks/email.html.erb index 7ac9755..4f3fb2a 100644 --- a/app/views/asks/email.html.erb +++ b/app/views/asks/email.html.erb @@ -6,6 +6,67 @@ + <% question = AskQuestion.find(@data['ask_question_id']) rescue nil %> + <% if question %> + <% + yes_trans = t('ask.yes') + no_trans = t('ask.no') + locale = I18n.locale.to_s + %> + <% @data['disp_fields_infos'].each do |f, field_info| %> + <% next if f == 'recaptcha' %> + + <% + trans = field_info["trans"] + is_cat = false + is_custom = false + if f.include?("@") + f = field_info["key"] + is_custom = true + elsif f == 'ask_category_id' + f = 'category_id' + is_cat = true + end + val = question[f] + if val == true || val == false + val = val ? yes_trans : no_trans + else + val = question.custom_values[f] if is_custom + type = field_info["type"] + if ["select", "radio_button", "checkbox"].include?(type) + if type == "checkbox" + val = val.values + 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 + elsif type == "date" + val = val["datetime"].values[0].values + if val.count == 2 + val = val[0] + " ~ " + val[1] + else + val = val[0] + end + elsif type == "instructions" + val = field_info["instructions"][locale].to_s.html_safe rescue "" + else + if is_cat + val = Category.find(val).title rescue '' + elsif f == 'usage_rule' + val = @data['usage_rule'].to_s.html_safe + else + val = val.to_s.html_safe + end + end + end + %> + + + + <% end %> + <% else %> @@ -33,7 +94,8 @@ - + + <% end %>
<%= trans %><%= val %>
<%= AskQuestion.human_attribute_name(:name) %>: <%= @data['name'] %>
<%= AskQuestion.human_attribute_name(:name) %>: <%= @data['name'].to_s.gsub(/[(\n)(\r)]/, "\n" => "
", "\r" => "" ).html_safe %>

此為系統自動發信,請勿直接回覆

diff --git a/app/views/asks/index.html.erb b/app/views/asks/index.html.erb index 7a310e3..65c0a5c 100644 --- a/app/views/asks/index.html.erb +++ b/app/views/asks/index.html.erb @@ -157,20 +157,29 @@ $(function(){ // } }) $(document).ready(function(){ + function scrollIntoView(selector, offset = 0) { + window.scroll(0, document.querySelector(selector).offsetTop - offset); + } var email_regex = "<%=email_regex%>"; if(email_regex.length != 0){ email_regex = new RegExp(email_regex); var submit_flag = false; $(".ask-question-form").each(function(i, form){ var $form = $(form); - if($form.length != 0 && $form.find('#ask_question_mail').length != 0){ + var email_field = $form.find('#ask_question_mail'); + if($form.length != 0 && email_field.length != 0){ $form.submit(function(){ if(!submit_flag){ submit_flag = true; - if(email_regex.test($form.find('#ask_question_mail').val())){ + if(email_regex.test(email_field.val())){ submit_flag = false; }else{ + email_field.css("border", "2px solid red"); + scrollIntoView('#ask_question_mail'); alert("<%=t('ask.please_check_email_format')%>"); + email_field.one("input",function(){ + email_field.css("border", ""); + }) submit_flag = false; return false; } diff --git a/ask.gemspec b/ask.gemspec index 826e229..ed1369c 100644 --- a/ask.gemspec +++ b/ask.gemspec @@ -32,6 +32,9 @@ Gem::Specification.new do |s| s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] 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)}" + } # s.add_dependency ~> "gotcha" end diff --git a/config/locales/en.yml b/config/locales/en.yml index 435b7fc..ceb980f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,7 +1,22 @@ en: - situation: Situation + situation: Status sex: Sex ask: + 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?" + are_you_sure_to_cancel_edit: "Are you sure to cancel edit?" + cancel_edit: "Cancel Edit" + instructions: "Instructions" + clone_default_setting: "Clone Default Setting" + use_default: "Use Default" + default: "Default" + new_status: "New Status" + status: "Status" + action: "Action" + ip: "IP" + ticket_status: "Ticket Status" + all_tickets: "All Tickets" title_layout: Title layout single_column: Single Column in One Row two_column: Two Column in One Row @@ -40,7 +55,7 @@ en: custom_explain: custom field which will automatically include all custom field to table but exclude the fields that are added explanation: Explanation name_mask: 'Name only show the first word,for example: 蔡**' - category_setting: Category Management + category_setting: Category fields print_setting: Print Format Setting print_format: Print Format file_field: File Field diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 3684474..c5c203d 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -1,11 +1,26 @@ zh_tw: - situation: 狀況 + situation: 狀態 identity: 身份 recaptcha: errors: verification_failed: 驗證碼錯誤 ask: + recover_data: "復原資料" + are_you_sure_to_recover_data: "您確定要復原資料嗎?" + are_you_sure_to_switch_to_default_setting: "您確定要切換成預設設定嗎?" + are_you_sure_to_cancel_edit: "您確定要取消修改嗎?" + cancel_edit: "取消修改" + instructions: "說明文字 Instructions" + clone_default_setting: "複製預設設定" + use_default: "使用預設" + default: "預設" + new_status: "新增狀態" + status: "狀態" + action: "動作" + ip: "IP" + ticket_status: "服務單狀態設定" + all_tickets: "全部服務單" title_layout: 題目樣式 single_column: 單欄式 two_column: 兩欄式 @@ -43,7 +58,7 @@ zh_tw: show_title_trans: 會顯示當前語言的標籤翻譯 explanation: 說明 name_mask: 姓名只顯示第一個字,如蔡** - category_setting: 類別管理設定 + category_setting: 類別欄位設計 print_setting: 列印格式設定 print_format: 列印格式 file_field: 檔案欄位 @@ -68,7 +83,7 @@ zh_tw: option_name: 選項名稱 field_name: 欄位名稱 whether_open: 是否開啟 - setting: 基本欄位設定 + setting: "基本欄位設定(預設值)" name: 發問者 appointment: 預約時間 created_at: 發問時間 @@ -110,7 +125,7 @@ zh_tw: female: 女 appointment: 預約時間 fax: 傳真 - title: 主旨 + title: 標題 reply: 回覆 created_at: 日期 content: 內容 diff --git a/config/routes.rb b/config/routes.rb index 80a3864..f4c3c83 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,29 @@ 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 ) + end + end + end + end + end scope "(:locale)", locale: Regexp.new(locales.join("|")) do namespace :admin do #backend resources :asks do @@ -15,8 +38,13 @@ Rails.application.routes.draw do get 'category_print_setting_delete' post 'category_print_setting_save' get 'category_print_setting_save' + post 'switch_to_default_setting' get 'get_new_category_setting_index' get 'print_setting' + get 'ticket_status' + post 'get_ticket_status' + post 'update_ticket_status' + delete 'delete_ticket_status' post 'print_setting_save' post 'setting_save' post 'get_new_setting_index' diff --git a/lib/ask/engine.rb b/lib/ask/engine.rb index ff8c898..3e2bec2 100644 --- a/lib/ask/engine.rb +++ b/lib/ask/engine.rb @@ -59,7 +59,7 @@ module Ask set_keyword_contstraints ['/asks'] widget_methods ["widget"] widget_settings [{"data_count"=>10}] - taggable "AskQuestion" + # taggable "AskQuestion" begin show_option_items data_item rescue => e @@ -76,60 +76,65 @@ module Ask active_for_controllers (['admin/asks']) head_link_path "admin_asks_path" - context_link 'ask.all_articles', + context_link 'ask.all_tickets', :link_path=>"admin_asks_path" , :priority=>1, :active_for_action=>{'admin/asks'=>'index'}, :available_for => 'users' + # context_link 'tags', + # :link_path=>"admin_module_app_tags_path" , + # :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'ask').id}", + # :priority=>4, + # :active_for_action=>{'admin/ask'=>'tags'}, + # :active_for_tag => 'Ask', + # :available_for => 'managers' + context_link 'ask.setting', + :link_path=>"setting_admin_asks_path" , + :priority=>2, + :active_for_action=>{'admin/asks'=>'setting'}, + :available_for => 'managers' + context_link 'ask.category_setting', + :link_path=>"category_setting_admin_asks_path" , + :priority=>3, + :active_for_action=>{'admin/asks'=>'category_setting'}, + :available_for => 'sub_managers' + context_link 'ask.order_fields', + :link_path=>"order_fields_admin_asks_path" , + :priority=>4, + :active_for_action=>{'admin/asks'=>'order_fields'}, + :available_for => 'sub_managers' + context_link 'ask.print_setting', + :link_path=>"print_setting_admin_asks_path" , + :priority=>5, + :active_for_action=>{'admin/asks'=>'print_setting'}, + :available_for => 'sub_managers' + context_link 'ask.ticket_status', + :link_path=>"ticket_status_admin_asks_path" , + :priority=>6, + :active_for_action=>{'admin/asks'=>'ticket_status'}, + :available_for => 'managers' context_link 'categories', :link_path=>"admin_module_app_categories_path" , :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'ask').id}", - :priority=>2, + :priority=>7, :active_for_action=>{'admin/asks'=>'categories'}, :active_for_category => 'Ask', :available_for => 'managers' context_link 'ask.acknowledgements', :link_path=>"admin_ask_acknowledgements_path" , - :priority=>3, + :priority=>8, :active_for_action=>{'admin/asks'=>'acknowledgements'}, :available_for => 'managers' - context_link 'tags', - :link_path=>"admin_module_app_tags_path" , - :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'ask').id}", - :priority=>4, - :active_for_action=>{'admin/ask'=>'tags'}, - :active_for_tag => 'Ask', - :available_for => 'managers' context_link 'ask.admins', :link_path=>"admin_ask_admins_path" , - :priority=>5, + :priority=>9, :active_for_action=>{'admin/asks'=>'admins'}, :available_for => 'managers' context_link 'ask.exports', :link_path=>"export_admin_asks_path" , - :priority=>6, + :priority=>10, :active_for_action=>{'admin/asks'=>'exports'}, :available_for => 'managers' - context_link 'ask.order_fields', - :link_path=>"order_fields_admin_asks_path" , - :priority=>7, - :active_for_action=>{'admin/asks'=>'order_fields'}, - :available_for => 'sub_managers' - context_link 'ask.setting', - :link_path=>"setting_admin_asks_path" , - :priority=>7, - :active_for_action=>{'admin/asks'=>'setting'}, - :available_for => 'managers' - context_link 'ask.category_setting', - :link_path=>"category_setting_admin_asks_path" , - :priority=>7, - :active_for_action=>{'admin/asks'=>'category_setting'}, - :available_for => 'sub_managers' - context_link 'ask.print_setting', - :link_path=>"print_setting_admin_asks_path" , - :priority=>8, - :active_for_action=>{'admin/asks'=>'print_setting'}, - :available_for => 'sub_managers' # context_link 'new_', # :link_path=>"new_admin_ask_path" , # :priority=>2, diff --git a/modules/ask/_ask_widget_form.html.erb b/modules/ask/_ask_widget_form.html.erb index 27d8ad6..7f677b5 100644 --- a/modules/ask/_ask_widget_form.html.erb +++ b/modules/ask/_ask_widget_form.html.erb @@ -75,20 +75,29 @@ } }) $(document).ready(function(){ + function scrollIntoView(selector, offset = 0) { + window.scroll(0, document.querySelector(selector).offsetTop - offset); + } var email_regex = "{{email_regex}}"; if(email_regex.length != 0){ email_regex = new RegExp(email_regex); var submit_flag = false; $(".ask-question-form").each(function(i, form){ var $form = $(form); - if($form.length != 0 && $form.find('#ask_question_mail').length != 0){ + var email_field = $form.find('#ask_question_mail'); + if($form.length != 0 && email_field.length != 0){ $form.submit(function(){ if(!submit_flag){ submit_flag = true; - if(email_regex.test($form.find('#ask_question_mail').val())){ + if(email_regex.test(email_field.val())){ submit_flag = false; }else{ + email_field.css("border", "2px solid red"); + scrollIntoView('#ask_question_mail'); alert("<%=t('ask.please_check_email_format')%>"); + email_field.one("input",function(){ + email_field.css("border", ""); + }) submit_flag = false; return false; }