surveyor 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +22 -0
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/Rakefile +4 -1
- data/app/views/partials/_answer.html.haml +1 -1
- data/app/views/partials/_section_menu.html.haml +8 -1
- data/app/views/surveyor/edit.html.haml +1 -1
- data/app/views/surveyor/new.html.haml +1 -1
- data/app/views/surveyor/show.html.haml +17 -20
- data/ci-exec.sh +1 -1
- data/config/routes.rb +7 -7
- data/features/internationalization.feature +68 -2
- data/features/show_survey.feature +29 -0
- data/features/step_definitions/parser_steps.rb +15 -0
- data/features/step_definitions/surveyor_steps.rb +11 -9
- data/features/support/paths.rb +5 -2
- data/features/z_redcap_parser.feature +4 -1
- data/lib/assets/javascripts/surveyor/jquery.surveyor.js +5 -1
- data/lib/assets/stylesheets/surveyor.sass +2 -0
- data/lib/generators/surveyor/install_generator.rb +4 -0
- data/lib/generators/surveyor/templates/app/controllers/surveyor_controller.rb +2 -2
- data/lib/generators/surveyor/templates/config/locales/surveyor_en.yml +1 -0
- data/lib/generators/surveyor/templates/config/locales/surveyor_es.yml +1 -0
- data/lib/generators/surveyor/templates/config/locales/surveyor_he.yml +1 -0
- data/lib/generators/surveyor/templates/config/locales/surveyor_ko.yml +2 -1
- data/lib/generators/surveyor/templates/surveys/languages.rb +9 -5
- data/lib/generators/surveyor/templates/surveys/translations/languages.es.yml +4 -0
- data/lib/generators/surveyor/templates/surveys/translations/languages.he.yml +4 -0
- data/lib/generators/surveyor/templates/surveys/translations/languages.ko.yml +4 -0
- data/lib/surveyor/helpers/surveyor_helper_methods.rb +1 -1
- data/lib/surveyor/models/answer_methods.rb +2 -2
- data/lib/surveyor/models/question_methods.rb +3 -3
- data/lib/surveyor/models/response_methods.rb +18 -5
- data/lib/surveyor/models/response_set_methods.rb +1 -1
- data/lib/surveyor/models/survey_methods.rb +2 -2
- data/lib/surveyor/models/survey_section_methods.rb +2 -2
- data/lib/surveyor/parser.rb +25 -4
- data/lib/surveyor/redcap_parser.rb +13 -13
- data/lib/surveyor/surveyor_controller_methods.rb +22 -19
- data/lib/surveyor/version.rb +1 -1
- data/lib/tasks/surveyor_tasks.rake +1 -1
- data/spec/controllers/surveyor_controller_spec.rb +155 -269
- data/spec/lib/parser_spec.rb +189 -21
- data/spec/models/response_set_spec.rb +7 -5
- data/spec/spec_helper.rb +3 -1
- data/stacktests.sh +1 -1
- data/surveyor.gemspec +3 -1
- metadata +271 -275
@@ -14,7 +14,10 @@ Feature: Survey import from REDCap
|
|
14
14
|
And there should be 233 answers with:
|
15
15
|
||
|
16
16
|
And there should be 3 resolved dependency_conditions with:
|
17
|
-
|
17
|
+
| rule_key | operator | question_reference | answer_reference |
|
18
|
+
| A | == | sex | 0 |
|
19
|
+
| A | == | sex | 0 |
|
20
|
+
| B | == | given_birth | 1 |
|
18
21
|
And there should be 2 dependencies with:
|
19
22
|
| rule |
|
20
23
|
| A |
|
@@ -35,7 +35,7 @@ jQuery(document).ready(function(){
|
|
35
35
|
jQuery("input[type='text'].datetime").datetimepicker({
|
36
36
|
showSecond: true,
|
37
37
|
showMillisec: false,
|
38
|
-
timeFormat: '
|
38
|
+
timeFormat: 'HH:mm:ss',
|
39
39
|
dateFormat: 'yy-mm-dd',
|
40
40
|
changeMonth: true,
|
41
41
|
changeYear: true
|
@@ -147,4 +147,8 @@ jQuery(document).ready(function(){
|
|
147
147
|
$(e).mask(inputMask, options);
|
148
148
|
});
|
149
149
|
|
150
|
+
// translations selection
|
151
|
+
$(".surveyor_language_selection").show();
|
152
|
+
$(".surveyor_language_selection select#locale").change(function(){ this.form.submit(); });
|
153
|
+
|
150
154
|
});
|
@@ -27,11 +27,11 @@ module SurveyorControllerCustomMethods
|
|
27
27
|
# Paths
|
28
28
|
def surveyor_index
|
29
29
|
# most of the above actions redirect to this method
|
30
|
-
super # available_surveys_path
|
30
|
+
super # surveyor.available_surveys_path
|
31
31
|
end
|
32
32
|
def surveyor_finish
|
33
33
|
# the update action redirects to this method if given params[:finish]
|
34
|
-
super # available_surveys_path
|
34
|
+
super # surveyor.available_surveys_path
|
35
35
|
end
|
36
36
|
end
|
37
37
|
class SurveyorController < ApplicationController
|
@@ -1,10 +1,14 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
survey "One language is never enough" do
|
3
|
-
translations :es => "translations/languages.es.yml", :he => "translations/languages.he.yml", :ko => "translations/languages.ko.yml"
|
3
|
+
translations :en =>:default, :es => "translations/languages.es.yml", :he => "translations/languages.he.yml", :ko => "translations/languages.ko.yml"
|
4
4
|
section_one "One" do
|
5
5
|
g_hello "Hello" do
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
q_name "What is your name?"
|
7
|
+
a_name :string, :help_text => "My name is..."
|
8
|
+
end
|
9
9
|
end
|
10
|
-
|
10
|
+
section_two "Two" do
|
11
|
+
q_color "What is your favorite color?"
|
12
|
+
a_name :string
|
13
|
+
end
|
14
|
+
end
|
@@ -3,6 +3,8 @@ title: "Un idioma nunca es suficiente"
|
|
3
3
|
survey_sections:
|
4
4
|
one:
|
5
5
|
title: "Uno"
|
6
|
+
two:
|
7
|
+
title: "Dos"
|
6
8
|
question_groups:
|
7
9
|
hello:
|
8
10
|
text: "¡Hola!"
|
@@ -12,3 +14,5 @@ questions:
|
|
12
14
|
answers:
|
13
15
|
name:
|
14
16
|
help_text: "Mi nombre es..."
|
17
|
+
color:
|
18
|
+
text: "¿Cuál es tu color favorito?"
|
@@ -3,6 +3,8 @@ title: "ידיעת שפה אחת אינה מספיקה"
|
|
3
3
|
survey_sections:
|
4
4
|
one:
|
5
5
|
title: "אחת"
|
6
|
+
two:
|
7
|
+
title: "שנים"
|
6
8
|
question_groups:
|
7
9
|
hello:
|
8
10
|
text: "שלום"
|
@@ -12,3 +14,5 @@ questions:
|
|
12
14
|
answers:
|
13
15
|
name:
|
14
16
|
help_text: "שמי..."
|
17
|
+
color:
|
18
|
+
text: "מהו הצבע האהוב עליך?"
|
@@ -79,7 +79,7 @@ module Surveyor
|
|
79
79
|
def generate_pick_none_input_html(value, default_value, css_class, response_class, disabled, input_mask, input_mask_placeholder)
|
80
80
|
html = {}
|
81
81
|
html[:class] = [response_class,css_class].reject{ |c| c.blank? }
|
82
|
-
html[:value] = default_value
|
82
|
+
html[:value] = value.blank? ? default_value : value
|
83
83
|
html[:disabled] = disabled unless disabled.blank?
|
84
84
|
if input_mask
|
85
85
|
html[:'data-input-mask'] = input_mask
|
@@ -10,7 +10,7 @@ module Surveyor
|
|
10
10
|
base.send :has_many, :validations, :dependent => :destroy
|
11
11
|
|
12
12
|
# Scopes
|
13
|
-
base.send :default_scope, :order => "display_order ASC"
|
13
|
+
base.send :default_scope, :order => "#{base.quoted_table_name}.display_order ASC"
|
14
14
|
|
15
15
|
# Mustache
|
16
16
|
base.send :include, MustacheContext
|
@@ -83,4 +83,4 @@ module Surveyor
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
86
|
-
end
|
86
|
+
end
|
@@ -7,12 +7,12 @@ module Surveyor
|
|
7
7
|
# Associations
|
8
8
|
base.send :belongs_to, :survey_section
|
9
9
|
base.send :belongs_to, :question_group, :dependent => :destroy
|
10
|
-
base.send :has_many, :answers, :
|
10
|
+
base.send :has_many, :answers, :dependent => :destroy # it might not always have answers
|
11
11
|
base.send :has_one, :dependency, :dependent => :destroy
|
12
12
|
base.send :belongs_to, :correct_answer, :class_name => "Answer", :dependent => :destroy
|
13
13
|
|
14
14
|
# Scopes
|
15
|
-
base.send :default_scope, :order => "display_order ASC"
|
15
|
+
base.send :default_scope, :order => "#{base.quoted_table_name}.display_order ASC"
|
16
16
|
|
17
17
|
# Mustache
|
18
18
|
base.send :include, MustacheContext
|
@@ -112,4 +112,4 @@ module Surveyor
|
|
112
112
|
|
113
113
|
end
|
114
114
|
end
|
115
|
-
end
|
115
|
+
end
|
@@ -7,9 +7,6 @@ module Surveyor
|
|
7
7
|
base.send :belongs_to, :question
|
8
8
|
base.send :belongs_to, :answer
|
9
9
|
|
10
|
-
# Scopes
|
11
|
-
base.send :default_scope, :order => "created_at ASC"
|
12
|
-
|
13
10
|
@@validations_already_included ||= nil
|
14
11
|
unless @@validations_already_included
|
15
12
|
# Validations
|
@@ -78,7 +75,23 @@ module Surveyor
|
|
78
75
|
end
|
79
76
|
|
80
77
|
def datetime_format
|
81
|
-
'%Y-%m-%d %H:%M'
|
78
|
+
'%Y-%m-%d %H:%M:%S'
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_formatted_s
|
82
|
+
return "" if answer.nil? || answer.response_class.nil?
|
83
|
+
return case t = answer.response_class.to_sym
|
84
|
+
when :string, :text, :integer, :float
|
85
|
+
send("#{t}_value".to_sym).to_s
|
86
|
+
when :date
|
87
|
+
date_value
|
88
|
+
when :time
|
89
|
+
time_value
|
90
|
+
when :datetime
|
91
|
+
read_attribute(:datetime_value).strftime(datetime_format)
|
92
|
+
else
|
93
|
+
to_s
|
94
|
+
end
|
82
95
|
end
|
83
96
|
|
84
97
|
def to_s # used in dependency_explanation_helper
|
@@ -99,7 +112,7 @@ module Surveyor
|
|
99
112
|
}
|
100
113
|
|
101
114
|
found = formats[answer.response_class]
|
102
|
-
found ?
|
115
|
+
found ? datetime_value.try{|d| d.utc.strftime(found)} : as(answer.response_class)
|
103
116
|
end
|
104
117
|
end
|
105
118
|
end
|
@@ -7,7 +7,7 @@ module Surveyor
|
|
7
7
|
# Associations
|
8
8
|
base.send :belongs_to, :survey
|
9
9
|
base.send :belongs_to, :user
|
10
|
-
base.send :has_many, :responses, :dependent => :destroy
|
10
|
+
base.send :has_many, :responses, :order => "#{Response.quoted_table_name}.created_at ASC", :dependent => :destroy
|
11
11
|
base.send :accepts_nested_attributes_for, :responses, :allow_destroy => true
|
12
12
|
|
13
13
|
@@validations_already_included ||= nil
|
@@ -6,8 +6,8 @@ module Surveyor
|
|
6
6
|
module SurveyMethods
|
7
7
|
def self.included(base)
|
8
8
|
# Associations
|
9
|
-
base.send :has_many, :sections, :class_name => "SurveySection", :order =>
|
10
|
-
base.send :has_many, :sections_with_questions, :include => :questions, :class_name => "SurveySection", :order =>
|
9
|
+
base.send :has_many, :sections, :class_name => "SurveySection", :order => "#{SurveySection.quoted_table_name}.display_order", :dependent => :destroy
|
10
|
+
base.send :has_many, :sections_with_questions, :include => :questions, :class_name => "SurveySection", :order => "#{SurveySection.quoted_table_name}.display_order"
|
11
11
|
base.send :has_many, :response_sets
|
12
12
|
base.send :has_many, :translations, :class_name => "SurveyTranslation"
|
13
13
|
|
@@ -3,7 +3,7 @@ module Surveyor
|
|
3
3
|
module SurveySectionMethods
|
4
4
|
def self.included(base)
|
5
5
|
# Associations
|
6
|
-
base.send :has_many, :questions, :
|
6
|
+
base.send :has_many, :questions, :dependent => :destroy
|
7
7
|
base.send :belongs_to, :survey
|
8
8
|
|
9
9
|
# Scopes
|
@@ -53,4 +53,4 @@ module Surveyor
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
-
end
|
56
|
+
end
|
data/lib/surveyor/parser.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
%w(survey survey_translation survey_section question_group question dependency dependency_condition answer validation validation_condition).each {|model| require model }
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
2
5
|
module Surveyor
|
3
6
|
class ParserError < StandardError; end
|
4
7
|
class Parser
|
@@ -8,6 +11,9 @@ module Surveyor
|
|
8
11
|
attr_accessor :context
|
9
12
|
|
10
13
|
# Class methods
|
14
|
+
def self.parse_file(filename, options={})
|
15
|
+
self.parse(File.read(filename),{:filename => filename}.merge(options))
|
16
|
+
end
|
11
17
|
def self.parse(str, options={})
|
12
18
|
self.ensure_attrs
|
13
19
|
self.options = options
|
@@ -82,6 +88,7 @@ module Surveyor
|
|
82
88
|
resolve_dependency_condition_references
|
83
89
|
resolve_question_correct_answers
|
84
90
|
report_lost_and_duplicate_references
|
91
|
+
report_missing_default_locale
|
85
92
|
Surveyor::Parser.rake_trace("", -2)
|
86
93
|
if context[:survey].save
|
87
94
|
Surveyor::Parser.rake_trace "Survey saved."
|
@@ -116,6 +123,11 @@ module Surveyor
|
|
116
123
|
def block_models
|
117
124
|
%w(survey survey_section question_group)
|
118
125
|
end
|
126
|
+
def report_missing_default_locale
|
127
|
+
if !self.context[:survey].translations.empty? && self.context[:survey].translations.select{|t|YAML::load(t.translation)=={}}.empty?
|
128
|
+
Surveyor::Parser.raise_error("No default locale specified for translations.",true)
|
129
|
+
end
|
130
|
+
end
|
119
131
|
def report_lost_and_duplicate_references
|
120
132
|
Surveyor::Parser.raise_error("Bad references: #{self.context[:bad_references].join("; ")}", true) unless self.context[:bad_references].empty?
|
121
133
|
Surveyor::Parser.raise_error("Duplicate references: #{self.context[:duplicate_references].join("; ")}", true) unless self.context[:duplicate_references].empty?
|
@@ -177,9 +189,18 @@ end
|
|
177
189
|
# SurveySection model
|
178
190
|
module SurveyorParserSurveyTranslationMethods
|
179
191
|
def parse_and_build(context, args, original_method, reference_identifier)
|
192
|
+
dir = Surveyor::Parser.options[:filename].nil? ? Dir.pwd : File.dirname(Surveyor::Parser.options[:filename])
|
180
193
|
# build, no change in context
|
181
194
|
args[0].each do |k,v|
|
182
|
-
|
195
|
+
case v
|
196
|
+
when Hash
|
197
|
+
trans = YAML::dump(v)
|
198
|
+
when String
|
199
|
+
trans = File.read(File.join(dir,v))
|
200
|
+
when :default
|
201
|
+
trans = YAML::dump({})
|
202
|
+
end
|
203
|
+
context[:survey].translations << self.class.new(:locale => k.to_s, :translation => trans)
|
183
204
|
end
|
184
205
|
end
|
185
206
|
end
|
@@ -337,10 +358,10 @@ module SurveyorParserAnswerMethods
|
|
337
358
|
self.attributes = ({:display_order => context[:question].answers.size}.merge(attrs))
|
338
359
|
context[:question].answers << context[:answer] = self
|
339
360
|
# keep reference for dependencies
|
340
|
-
unless context[:question].reference_identifier.blank? or reference_identifier.blank?
|
361
|
+
unless context[:question].reference_identifier.blank? or self.reference_identifier.blank?
|
341
362
|
context[:answer_references][context[:question].reference_identifier] ||= {}
|
342
|
-
context[:duplicate_references].push "q_#{context[:question].reference_identifier}, a_#{reference_identifier}" if context[:answer_references][context[:question].reference_identifier].has_key?(reference_identifier)
|
343
|
-
context[:answer_references][context[:question].reference_identifier][reference_identifier] = context[:answer]
|
363
|
+
context[:duplicate_references].push "q_#{context[:question].reference_identifier}, a_#{self.reference_identifier}" if context[:answer_references][context[:question].reference_identifier].has_key?(self.reference_identifier)
|
364
|
+
context[:answer_references][context[:question].reference_identifier][self.reference_identifier] = context[:answer]
|
344
365
|
end
|
345
366
|
end
|
346
367
|
end
|
@@ -62,16 +62,15 @@ module Surveyor
|
|
62
62
|
end
|
63
63
|
def resolve_references
|
64
64
|
context[:dependency_conditions].each do |dc|
|
65
|
-
return unless dc.lookup_reference
|
66
65
|
Surveyor::RedcapParser.rake_trace "resolve(#{dc.question_reference},#{dc.answer_reference})"
|
67
|
-
if dc.answer_reference.blank? and (
|
66
|
+
if dc.answer_reference.blank? and (context[:question_references][dc.question_reference].answers.size == 1)
|
68
67
|
Surveyor::RedcapParser.rake_trace "...found "
|
69
|
-
dc.question =
|
68
|
+
dc.question = context[:question_references][dc.question_reference]
|
70
69
|
dc.answer = dc.question.answers.first
|
71
|
-
elsif
|
70
|
+
elsif answer = context[:answer_references][dc.question_reference][dc.answer_reference]
|
72
71
|
Surveyor::RedcapParser.rake_trace "...found "
|
73
|
-
dc.answer =
|
74
|
-
dc.question = dc.
|
72
|
+
dc.answer = answer
|
73
|
+
dc.question = context[:question_references][dc.question_reference]
|
75
74
|
else
|
76
75
|
Surveyor::RedcapParser.rake_trace "\n!!! failed lookup for dependency_condition q: #{question_reference} a: #{question_reference}"
|
77
76
|
end
|
@@ -118,8 +117,8 @@ module SurveyorRedcapParserQuestionMethods
|
|
118
117
|
})
|
119
118
|
context[:survey_section].questions << context[:question] = self
|
120
119
|
unless context[:question].reference_identifier.blank?
|
121
|
-
context[:
|
122
|
-
context[:
|
120
|
+
context[:question_references] ||= {}
|
121
|
+
context[:question_references][context[:question].reference_identifier] = context[:question]
|
123
122
|
end
|
124
123
|
Surveyor::RedcapParser.rake_trace "question_#{context[:question].reference_identifier} "
|
125
124
|
end
|
@@ -141,7 +140,7 @@ module SurveyorRedcapParserDependencyMethods
|
|
141
140
|
self.attributes = {:rule => hash[:rule]}
|
142
141
|
context[:question].dependency = context[:dependency] = self
|
143
142
|
hash[:components].each do |component|
|
144
|
-
dc = context[:dependency].dependency_conditions.build(decompose_component(component).merge(
|
143
|
+
dc = context[:dependency].dependency_conditions.build(decompose_component(component).merge({ :rule_key => letters.shift } ))
|
145
144
|
context[:dependency_conditions] << dc
|
146
145
|
end
|
147
146
|
Surveyor::RedcapParser.rake_trace "dependency(#{hash[:rule]}) "
|
@@ -193,8 +192,8 @@ end
|
|
193
192
|
# DependencyCondition model
|
194
193
|
module SurveyorRedcapParserDependencyConditionMethods
|
195
194
|
DependencyCondition.instance_eval do
|
196
|
-
attr_accessor :question_reference, :answer_reference
|
197
|
-
attr_accessible :question_reference, :answer_reference
|
195
|
+
attr_accessor :question_reference, :answer_reference
|
196
|
+
attr_accessible :question_reference, :answer_reference
|
198
197
|
end
|
199
198
|
end
|
200
199
|
|
@@ -228,8 +227,9 @@ module SurveyorRedcapParserAnswerMethods
|
|
228
227
|
:display_order => context[:question].answers.size })
|
229
228
|
context[:question].answers << context[:answer] = a
|
230
229
|
unless context[:question].reference_identifier.blank? or aref.blank? or !context[:answer].valid?
|
231
|
-
context[:
|
232
|
-
context[:
|
230
|
+
context[:answer_references] ||= {}
|
231
|
+
context[:answer_references][context[:question].reference_identifier] ||= {}
|
232
|
+
context[:answer_references][context[:question].reference_identifier][aref] = context[:answer]
|
233
233
|
end
|
234
234
|
Surveyor::RedcapParser.rake_trace "#{context[:answer].errors.full_messages}, #{context[:answer].inspect}" unless context[:answer].valid?
|
235
235
|
Surveyor::RedcapParser.rake_trace "answer_#{context[:answer].reference_identifier} "
|
@@ -15,7 +15,7 @@ module Surveyor
|
|
15
15
|
# Actions
|
16
16
|
def new
|
17
17
|
@surveys_by_access_code = Survey.order("created_at DESC, survey_version DESC").all.group_by(&:access_code)
|
18
|
-
redirect_to surveyor_index unless surveyor_index == available_surveys_path
|
18
|
+
redirect_to surveyor_index unless surveyor_index == surveyor.available_surveys_path
|
19
19
|
end
|
20
20
|
|
21
21
|
def create
|
@@ -29,7 +29,7 @@ module Surveyor
|
|
29
29
|
create(:survey => @survey, :user_id => (@current_user.nil? ? @current_user : @current_user.id))
|
30
30
|
if (@survey && @response_set)
|
31
31
|
flash[:notice] = t('surveyor.survey_started_success')
|
32
|
-
redirect_to(edit_my_survey_path(
|
32
|
+
redirect_to(surveyor.edit_my_survey_path(
|
33
33
|
:survey_code => @survey.access_code, :response_set_code => @response_set.access_code))
|
34
34
|
else
|
35
35
|
flash[:notice] = t('surveyor.Unable_to_find_that_survey')
|
@@ -60,11 +60,7 @@ module Surveyor
|
|
60
60
|
if @response_set
|
61
61
|
@survey = Survey.with_sections.find_by_id(@response_set.survey_id)
|
62
62
|
@sections = @survey.sections
|
63
|
-
|
64
|
-
@section = @sections.with_includes.find(section_id_from(params[:section])) || @sections.with_includes.first
|
65
|
-
else
|
66
|
-
@section = @sections.with_includes.first
|
67
|
-
end
|
63
|
+
@section = @sections.with_includes.find(section_id_from(params) || :first) || @sections.with_includes.first
|
68
64
|
set_dependents
|
69
65
|
else
|
70
66
|
flash[:notice] = t('surveyor.unable_to_find_your_responses')
|
@@ -81,11 +77,10 @@ module Surveyor
|
|
81
77
|
respond_to do |format|
|
82
78
|
format.html do
|
83
79
|
if @response_set.nil?
|
84
|
-
return redirect_with_message(available_surveys_path, :notice, t('surveyor.unable_to_find_your_responses'))
|
80
|
+
return redirect_with_message(surveyor.available_surveys_path, :notice, t('surveyor.unable_to_find_your_responses'))
|
85
81
|
else
|
86
82
|
flash[:notice] = t('surveyor.unable_to_update_survey') unless saved
|
87
|
-
redirect_to edit_my_survey_path(
|
88
|
-
:anchor => anchor_from(params[:section]), :section => section_id_from(params[:section]))
|
83
|
+
redirect_to surveyor.edit_my_survey_path(:anchor => anchor_from(params[:section]), :section => section_id_from(params))
|
89
84
|
end
|
90
85
|
end
|
91
86
|
format.js do
|
@@ -167,18 +162,26 @@ module Surveyor
|
|
167
162
|
end
|
168
163
|
|
169
164
|
def set_locale
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
165
|
+
if params[:new_locale]
|
166
|
+
I18n.locale = params[:new_locale]
|
167
|
+
elsif params[:locale]
|
168
|
+
I18n.locale = params[:locale]
|
169
|
+
else
|
170
|
+
I18n.locale = I18n.default_locale
|
171
|
+
end
|
175
172
|
end
|
176
173
|
|
177
174
|
# Params: the name of some submit buttons store the section we'd like to go
|
178
175
|
# to. for repeater questions, an anchor to the repeater group is also stored
|
179
176
|
# e.g. params[:section] = {"1"=>{"question_group_1"=>"<= add row"}}
|
180
|
-
def section_id_from(p)
|
181
|
-
p.respond_to?(:keys)
|
177
|
+
def section_id_from(p = {})
|
178
|
+
if p[:section] && p[:section].respond_to?(:keys)
|
179
|
+
p[:section].keys.first
|
180
|
+
elsif p[:section]
|
181
|
+
p[:section]
|
182
|
+
elsif p[:current_section]
|
183
|
+
p[:current_section]
|
184
|
+
end
|
182
185
|
end
|
183
186
|
|
184
187
|
def anchor_from(p)
|
@@ -186,10 +189,10 @@ module Surveyor
|
|
186
189
|
end
|
187
190
|
|
188
191
|
def surveyor_index
|
189
|
-
available_surveys_path
|
192
|
+
surveyor.available_surveys_path
|
190
193
|
end
|
191
194
|
def surveyor_finish
|
192
|
-
available_surveys_path
|
195
|
+
surveyor.available_surveys_path
|
193
196
|
end
|
194
197
|
|
195
198
|
def redirect_with_message(path, message_type, message)
|