added points and answer type to this module

This commit is contained in:
Harry Bomrah 2016-08-18 21:18:02 +08:00
parent 2c9c57287f
commit 4d57437144
14 changed files with 167 additions and 45 deletions

View File

@ -17,6 +17,8 @@ function setData(l, length, optionsI, className) {
name = "questionnaire_survey[survey_questions_attributes][", name = "questionnaire_survey[survey_questions_attributes][",
optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_", optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_",
optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]",
pointsID = l+"_survey_question_options_attributes_"+optionsI+"_points",
pointsName = l+"][survey_question_options_attributes]["+optionsI+"][points]",
radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_",
radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]"; radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]";
data = { data = {
@ -31,9 +33,11 @@ function setData(l, length, optionsI, className) {
_type: [id+l+"_type", name+l+"][type]"], _type: [id+l+"_type", name+l+"][type]"],
_is_required: [id+l+"_is_required", name+l+"][is_required]",false], _is_required: [id+l+"_is_required", name+l+"][is_required]",false],
_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_",{"en":"","zh_tw":""}], _option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_",{"en":"","zh_tw":""}],
_points: [id+pointsID, name+pointsName, "attributes_"+l+"_options_"+optionsI+"_"],
_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",{"en":"","zh_tw":""}], _radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",{"en":"","zh_tw":""}],
_custom_option: [id+l+"_custom_option", name+l+"][custom_option]",false] _custom_option: [id+l+"_custom_option", name+l+"][custom_option]",false]
}; };
return data; return data;
}; };
@ -45,6 +49,8 @@ function setEditData(l, length, d, optionsI, className) {
name = "questionnaire_survey[survey_questions_attributes][", name = "questionnaire_survey[survey_questions_attributes][",
optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_", optionID = l+"_survey_question_options_attributes_"+optionsI+"_name_translations_",
optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]",
pointsID = l+"_survey_question_options_attributes_"+optionsI+"_points",
pointsName = l+"][survey_question_options_attributes]["+optionsI+"][points]",
radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_",
radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]"; radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]";
data = { data = {
@ -60,6 +66,7 @@ function setEditData(l, length, d, optionsI, className) {
_type: [id+l+"_type", name+l+"][type]",d.type], _type: [id+l+"_type", name+l+"][type]",d.type],
_is_required: [id+l+"_is_required", name+l+"][is_required]",d.is_required], _is_required: [id+l+"_is_required", name+l+"][is_required]",d.is_required],
_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_"], _option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_"],
_points: [id+pointsID, name+pointsName, "attributes_"+l+"_options_"+optionsI+"_", d.points],
_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_"], _radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_"],
_custom_option: [id+l+"_custom_option", name+l+"][custom_option]",d.custom_option] _custom_option: [id+l+"_custom_option", name+l+"][custom_option]",d.custom_option]
}; };
@ -67,6 +74,7 @@ function setEditData(l, length, d, optionsI, className) {
}; };
function setEditQuestionAttributes(l, length, d, optionsI, className) { function setEditQuestionAttributes(l, length, d, optionsI, className) {
console.log(d);
if(!optionsI) { if(!optionsI) {
optionsI = 0; optionsI = 0;
} }
@ -76,6 +84,8 @@ function setEditQuestionAttributes(l, length, d, optionsI, className) {
optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]", optionName = l+"][survey_question_options_attributes]["+optionsI+"][name_translations]",
radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_", radiogroupsID = l+"_survey_question_radiogroups_attributes_"+optionsI+"_name_translations_",
radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]", radiogroupsName = l+"][survey_question_radiogroups_attributes]["+optionsI+"][name_translations]",
pointsID = l+"_survey_question_options_attributes_"+optionsI+"_points",
pointsName = l+"][survey_question_options_attributes]["+optionsI+"][points]",
option_id = l+"][survey_question_options_attributes]["+optionsI+"][id]", option_id = l+"][survey_question_options_attributes]["+optionsI+"][id]",
destroy = l+"][survey_question_options_attributes]["+optionsI+"][_destroy]", destroy = l+"][survey_question_options_attributes]["+optionsI+"][_destroy]",
radiogroups_id = l+"][survey_question_radiogroups_attributes]["+optionsI+"][id]"; radiogroups_id = l+"][survey_question_radiogroups_attributes]["+optionsI+"][id]";
@ -86,6 +96,7 @@ function setEditQuestionAttributes(l, length, d, optionsI, className) {
_className: className, _className: className,
_destroy: [name+destroy], _destroy: [name+destroy],
_option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_", d.name_translations], _option: [id+optionID, name+optionName, "attributes_"+l+"_options_"+optionsI+"_", d.name_translations],
_points: [id+pointsID, name+pointsName, "attributes_"+l+"_options_"+optionsI+"_", d.points],
_radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",d.name_translations], _radiogroups: [id+radiogroupsID, name+radiogroupsName, "attributes_"+l+"_radiogroups_"+optionsI+"_",d.name_translations],
_options_id: [name+option_id,d.qid], _options_id: [name+option_id,d.qid],
_radiogroups_id: [name+radiogroups_id,d.qid] _radiogroups_id: [name+radiogroups_id,d.qid]

View File

@ -47,7 +47,14 @@ class Admin::SurveysController < OrbitAdminController
def create def create
@survey = QuestionnaireSurvey.new(survey_params) @survey = QuestionnaireSurvey.new(survey_params)
total = 0
@survey.survey_questions.each do |ques|
ques.survey_question_options.each do |opt|
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end
end
@survey.total_points = total
@survey.create_user_id = current_user.id @survey.create_user_id = current_user.id
@survey.update_user_id = current_user.id @survey.update_user_id = current_user.id
@ -92,10 +99,21 @@ class Admin::SurveysController < OrbitAdminController
uid = params[:id].split('-').last uid = params[:id].split('-').last
@survey = QuestionnaireSurvey.find_by(:uid=>uid) @survey = QuestionnaireSurvey.find_by(:uid=>uid)
@survey.update_user_id = current_user.id @survey.update_user_id = current_user.id
total = 0
@survey.survey_questions.each do |ques|
ques.survey_question_options.each do |opt|
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end
end
@survey.total_points = total
respond_to do |format| respond_to do |format|
if @survey.update_attributes(survey_params) if @survey.update_attributes(survey_params)
format.html { redirect_to(admin_surveys_url(:page => params[:page])) } if params[:et] == "result"
format.html { redirect_to(set_answers_admin_survey_path(@survey.id)) }
else
format.html { redirect_to(admin_surveys_url(:page => params[:page])) }
end
format.xml { head :ok } format.xml { head :ok }
else else
format.html { render :action => "edit" } format.html { render :action => "edit" }
@ -219,7 +237,12 @@ class Admin::SurveysController < OrbitAdminController
end end
def survey_params def survey_params
params.require(:questionnaire_survey).permit! p = params.require(:questionnaire_survey).permit!
if !p[:result_criteria].blank?
x = p[:result_criteria].collect{|y| y.last}
p[:result_criteria] = x
end
p
end end
end end

View File

@ -101,6 +101,7 @@ class SurveysController < ApplicationController
uid = params[:id].split('-').last uid = params[:id].split('-').last
@survey = QuestionnaireSurvey.find_by(:uid=>uid) @survey = QuestionnaireSurvey.find_by(:uid=>uid)
total = 0
answer = params[:answer] answer = params[:answer]
@answer_model = @survey.survey_answers.new @answer_model = @survey.survey_answers.new
@answer_model.user = current_user.id if !current_user.nil? @answer_model.user = current_user.id if !current_user.nil?
@ -115,7 +116,10 @@ class SurveysController < ApplicationController
@answer_model[qid] = answer[qid + '_custom_option'] @answer_model[qid] = answer[qid + '_custom_option']
else else
if answer[qid] if answer[qid]
@answer_model[qid] = question.survey_question_options.find(answer[qid]).name opt = question.survey_question_options.find(answer[qid])
@answer_model[qid] = opt.name
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end end
end end
when SurveyQuestion::Check when SurveyQuestion::Check
@ -126,19 +130,23 @@ class SurveysController < ApplicationController
if question.custom_option && oid == 'custom_option' if question.custom_option && oid == 'custom_option'
@answer_model[qid].push answer[qid + '_custom_option'] @answer_model[qid].push answer[qid + '_custom_option']
else else
@answer_model[qid].push question.survey_question_options.find(oid).name opt = question.survey_question_options.find(oid)
@answer_model[qid].push opt.name
p = (opt.points == nil ? 0 : opt.points) rescue 0
total = total + p
end end
end end
end end
end end
when SurveyQuestion::Radiogroup when SurveyQuestion::Radiogroup
@answer_model[qid] = {} @answer_model[qid] = {}
options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, o.name ] }] options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, (o.points.nil? ? 0 : o.points) ] }]
radiogroups = Hash[question.survey_question_radiogroups.collect{|rg| [ rg.id.to_s, rg.name] }] radiogroups = Hash[question.survey_question_radiogroups.collect{|rg| [ rg.id.to_s, rg.name] }]
if answer[qid] if answer[qid]
answer[qid].each do |oid, value| answer[qid].each do |oid, value|
unless value.blank? unless value.blank?
@answer_model[qid][oid] = radiogroups[value] @answer_model[qid][oid] = radiogroups[value]
total = total + options[oid]
else else
if question.is_required if question.is_required
@answer_model.errors.add question.title, t('survey_question.required_error') @answer_model.errors.add question.title, t('survey_question.required_error')
@ -152,14 +160,28 @@ class SurveysController < ApplicationController
end end
end end
if @answer_model.errors.empty? if @answer_model.errors.empty?
@answer_model.scored_points = total
@answer_model.save! @answer_model.save!
render :answer_success redirect_to OrbitHelper.url_to_show(@survey.to_param) + "?method=answer_success&ans=#{@answer_model.id.to_s}"
else else
@survey_answer_error = @answer_model.errors.full_messages.join(',') @survey_answer_error = @answer_model.errors.full_messages.join(',')
render :answer_error render :answer_error
end end
end end
def answer_success
params = OrbitHelper.params
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
answer = SurveyAnswer.find(params[:ans])
page = Page.where(:page_id => params[:page_id]).first
{
'survey' => survey,
'answer' => answer,
'url' => "/#{I18n.locale.to_s}" + page.url
}
end
def result def result
params = OrbitHelper.params params = OrbitHelper.params

View File

@ -8,6 +8,7 @@ class QuestionnaireSurvey
ResultChart = 0 ResultChart = 0
ResultExtern = 1 ResultExtern = 1
ResultFile = 2 ResultFile = 2
ResultCriteria = 3
scope :can_display, ->{where(is_hidden: false)} scope :can_display, ->{where(is_hidden: false)}
@ -22,10 +23,12 @@ class QuestionnaireSurvey
field :is_hidden, :type => Boolean, :default => false field :is_hidden, :type => Boolean, :default => false
field :needs_login, :type => Boolean, :default => false field :needs_login, :type => Boolean, :default => false
field :total_points, type: Integer, :default => 0
field :result_type, :type => Integer, :default => 0 field :result_type, :type => Integer, :default => 0
field :extern_link field :extern_link
mount_uploader :upload_file, AssetUploader mount_uploader :upload_file, AssetUploader
field :result_criteria, type: Array, :default => []
field :jump_mode, :type => Boolean, :default => false field :jump_mode, :type => Boolean, :default => false

View File

@ -3,6 +3,7 @@ class SurveyAnswer
include Mongoid::Timestamps include Mongoid::Timestamps
field :user, type: BSON::ObjectId field :user, type: BSON::ObjectId
field :scored_points, type: Integer, :default => 0
belongs_to :questionnaire_survey belongs_to :questionnaire_survey

View File

@ -3,6 +3,7 @@ class SurveyQuestionOption
field :name, :localize => true field :name, :localize => true
field :jump_to, :default => 0 field :jump_to, :default => 0
field :points, :type => Integer, :default => 0
embedded_in :survey_question embedded_in :survey_question
end end

View File

@ -88,7 +88,6 @@
</label> </label>
</div> </div>
</div> </div>
<!-- redirect mode --> <!-- redirect mode -->
<div class="control-group"> <div class="control-group">
<label class="control-label muted" for="redirectMode"><%= t('survey.redirect_mode') %></label> <label class="control-label muted" for="redirectMode"><%= t('survey.redirect_mode') %></label>

View File

@ -170,6 +170,10 @@
<i class="icon-trash"></i> <i class="icon-trash"></i>
</a> </a>
</div> </div>
<div style="margin-left:10px; display:inline;">
<input type="number" name="${_points[1]}" id="${_points[0]}" class="span1" value="${_points[3]}" />
<label for="${_points[0]}" class="radio inline" style="padding-left: 5px;">Points</label>
</div>
</div> </div>
{{/if}} {{/if}}

View File

@ -30,13 +30,14 @@
<%= f.select :result_type, { <%= f.select :result_type, {
t('survey.chart') => QuestionnaireSurvey::ResultChart, t('survey.chart') => QuestionnaireSurvey::ResultChart,
t('survey.extern_link') => QuestionnaireSurvey::ResultExtern, t('survey.extern_link') => QuestionnaireSurvey::ResultExtern,
t('survey.upload_file') => QuestionnaireSurvey::ResultFile t('survey.upload_file') => QuestionnaireSurvey::ResultFile,
t('survey.criteria') => QuestionnaireSurvey::ResultCriteria
}, {}, :class => "tinput-medium", :onchange=>"OnSelectionChange (this)" %> }, {}, :class => "tinput-medium", :onchange=>"OnSelectionChange (this)" %>
</div> </div>
</div> </div>
<!-- Extern Link --> <!-- Extern Link -->
<div class="control-group <%= (@survey.result_type == 1) ? '' : 'hide' %>" data-type="1"> <div class="control-group selectable <%= (@survey.result_type == 1) ? '' : 'hide' %>" data-type="1">
<label class="control-label muted" for="account"><%= t('survey.extern_link') %></label> <label class="control-label muted" for="account"><%= t('survey.extern_link') %></label>
<div class="controls"> <div class="controls">
<%= f.text_field :extern_link, :style=>"width:80%;", :class=>'post-extern_link' %> <%= f.text_field :extern_link, :style=>"width:80%;", :class=>'post-extern_link' %>
@ -44,7 +45,7 @@
</div> </div>
<!-- Upload_file --> <!-- Upload_file -->
<div class="control-group <%= (@survey.result_type == 2) ? '' : 'hide' %>" data-type="2"> <div class="control-group selectable <%= (@survey.result_type == 2) ? '' : 'hide' %>" data-type="2">
<label class="control-label muted" for="account"><%= t('survey.upload_file') %></label> <label class="control-label muted" for="account"><%= t('survey.upload_file') %></label>
<div class="controls"> <div class="controls">
<%= f.file_field :upload_file %> <%= f.file_field :upload_file %>
@ -58,11 +59,40 @@
<% end %> <% end %>
</div> </div>
</div> </div>
<!-- points criteria -->
<div class="control-group selectable <%= (@survey.result_type == 3) ? '' : 'hide' %>" data-type="3">
<label class="control-label muted" for="account"><%= t('survey.criteria') %></label>
<div class="controls">
<button class="btn btn-small btn-primary" id="add-criteria">Add</button>
</div>
<div id="criterias" class="controls" style="width:850px;">
<% if @survey.result_criteria.blank? %>
<div class="criteria-span" style="margin-left:0px;display:block;">
<label style="padding-left:0px;" for="" class="radio inline"> From : <input name="questionnaire_survey[result_criteria][0][]" class="span1" max="<%= @survey.total_points %>" type="number"></label>
<label for="" class="radio inline"> To : <input name="questionnaire_survey[result_criteria][0][]" class="span1" max="<%= @survey.total_points %>" type="number"></label>
<label for="" class="radio inline">Save to add text</label>
</div>
<% else %>
<% @survey.result_criteria.each_with_index do |criteria, idx| %>
<div class="criteria-span" style="margin-left:0px;display:block;margin-bottom:50px;">
<label style="padding-left:0px;" for="" class="radio inline"> From : <input name="questionnaire_survey[result_criteria][<%= idx %>][]" class="span1" max="<%= @survey.total_points %>" type="number" value="<%= criteria[0] %>"></label>
<label for="" class="radio inline"> To : <input name="questionnaire_survey[result_criteria][<%= idx %>][]" class="span1" max="<%= @survey.total_points %>" type="number" value="<%= criteria[1] %>"></label>
<% if idx != 0 %>
<a href="" style="margin-left:5px;" class="btn btn-danger delete-critera"><i class="icon icon-trash"></i></a>
<% end %>
<label for="" class="radio inline">
<textarea class="ckeditor" name="questionnaire_survey[result_criteria][<%= idx %>][]"><%= criteria[2] %></textarea>
</label>
</div>
<% end %>
<% end %>
</div>
</div>
</div> </div>
<div class="form-actions"> <div class="form-actions">
<%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %> <%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %>
<%= hidden_field_tag 'et', "result" %>
<%= f.submit t('save'), :class=>'btn btn-primary' %> <%= f.submit t('save'), :class=>'btn btn-primary' %>
<%= link_to t('cancel'), get_go_back, :class=>"btn" %> <%= link_to t('cancel'), get_go_back, :class=>"btn" %>
</div> </div>
@ -74,21 +104,29 @@
<script type="text/javascript"> <script type="text/javascript">
function OnSelectionChange (select) { function OnSelectionChange (select) {
var selectedOption = select.options[select.selectedIndex]; var selectedOption = select.options[select.selectedIndex];
if (selectedOption.value == '1' ) $(".selectable").addClass("hide");
{ $(".selectable[data-type=" + selectedOption.value + "]").removeClass("hide");
$('.control-group[data-type=1]').removeClass('hide');
$('.control-group[data-type=2]').addClass('hide');
}
else if (selectedOption.value == '2' )
{
$('.control-group[data-type=2]').removeClass('hide');
$('.control-group[data-type=1]').addClass('hide');
}
else
{
$('.control-group[data-type=1]').addClass('hide');
$('.control-group[data-type=2]').addClass('hide');
}
} }
var index = <%= @survey.result_criteria.count == 0 ? 1 : @survey.result_criteria.count + 1 %>,
html = '<div data-critera-number="criteria_{index}" class="criteria-span" style="width:800px;"><label style="padding-left:0px;" for="" class="radio inline"> From : <input name="questionnaire_survey[result_criteria][{index}][]" class="span1" max="<%= @survey.total_points %>" type="number"></label><label for="" class="radio inline"> To : <input name="questionnaire_survey[result_criteria][{index}][]" class="span1" max="<%= @survey.total_points %>" type="number"></label><a href="" style="margin-left:5px;" class="btn btn-primary delete-critera"><i class="icon icon-trash"></i></a><span class="radio inline">Save to add text</span></div>';
$("#add-criteria").on("click",function(){
var newhtml = html.replace(/{index}/g,index);
console.log(newhtml);
index++;
$("#criterias").append(newhtml);
return false;
})
$(document).on("click", ".delete-critera" ,function(){
$(this).parent().remove();
return false;
})
</script> </script>

View File

@ -1,2 +1,15 @@
alert("<%= t('survey.answer_success')%>"); <% @survey.result_type.inspect %>
<% if @survey.result_type == 3 %>
var scoredPoints = <%= @answer_model.scored_points %>,
msg = "";
<% @survey.result_criteria.each do |criteria| %>
<% if (criteria[0].to_i..criteria[1].to_i).cover?(@answer_model.scored_points) %>
msg = "<%= criteria[2] %>";
<% end %>
<% end %>
alert("Your total score is " + scoredPoints + "; " + msg);
<% else %>
alert("<%= t('survey.answer_success')%>");
<% end %>
window.location.href = "<%= page_for_survey %>"; window.location.href = "<%= page_for_survey %>";

View File

@ -1,4 +1,18 @@
<script type="text/javascript"> <%
alert("<%= t('survey.answer_success')%>"); data = action_data
window.location.href = "<%= page_for_survey %>"; @survey = data['survey']
</script> @answer_model = data['answer']
%>
<% if @survey.result_type == 3 %>
<h3>Your total score is <%= @answer_model.scored_points %> </h3>
<% @survey.result_criteria.each do |criteria| %>
<% if (criteria[0].to_i..criteria[1].to_i).cover?(@answer_model.scored_points) %>
<div> <%= criteria[2].html_safe %> </div>
<% end %>
<% end %>
<% else %>
<h3><%= t('survey.answer_success')%></h3>
<% end %>
<a href="<%= data['url'] %>">Go Back</a>

View File

@ -145,14 +145,7 @@
<%= javascript_include_tag "lib/jquery.form"%> <%= javascript_include_tag "lib/jquery.form"%>
<script type="text/javascript"> <script type="text/javascript">
$('form.survey').ajaxForm({
beforeSubmit: function(a,f,o) {
o.dataType = 'script';
},
success: function(data) {
}
});
<% if @survey.jump_mode %> <% if @survey.jump_mode %>
var answers = <%== @answers.to_json %>; var answers = <%== @answers.to_json %>;
var jump_tos_map = <%== @jump_tos_map.to_json %>; var jump_tos_map = <%== @jump_tos_map.to_json %>;

View File

@ -8,7 +8,7 @@ en:
time_range: Date Range time_range: Date Range
write: Write write: Write
result: Result result: Result
survey_type: Survey Type
description: Description description: Description
postdate: Start Date postdate: Start Date
deadline: End Date deadline: End Date
@ -26,7 +26,7 @@ en:
result_type: Result Type (Frontend) result_type: Result Type (Frontend)
extern_link: External Link extern_link: External Link
upload_file: Uploaded File upload_file: Uploaded File
criteria: Criteria
remove_upload_file: Remove Uploaded File remove_upload_file: Remove Uploaded File
answer_success: Successfully answeredjump back now answer_success: Successfully answeredjump back now

View File

@ -10,7 +10,7 @@ zh_tw:
time_range: 問卷期間 time_range: 問卷期間
write: 填問卷 write: 填問卷
result: 結果 result: 結果
survey_type: Survey Type
description: 問卷說明 description: 問卷說明
postdate: 開始時間 postdate: 開始時間
deadline: 結束時間 deadline: 結束時間
@ -25,7 +25,7 @@ zh_tw:
taken_by: Taken By taken_by: Taken By
taken_date: Taken On taken_date: Taken On
view_answers: View Answers view_answers: View Answers
criteria: Criteria
result_type: 前端結果表示方式 result_type: 前端結果表示方式
extern_link: 外部連結 extern_link: 外部連結
upload_file: 結果文件 upload_file: 結果文件