upgrade_surveyor_gui 0.1.2

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.
Files changed (291) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +44 -0
  3. data/.travis.yml +17 -0
  4. data/CHANGELOG.md +46 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE +21 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +244 -0
  9. data/Rakefile +66 -0
  10. data/app/controllers/surveyor_controller.rb +89 -0
  11. data/app/controllers/surveyor_gui/answers_controller.rb +3 -0
  12. data/app/controllers/surveyor_gui/application_controller.rb +3 -0
  13. data/app/controllers/surveyor_gui/dependencys_controller.rb +286 -0
  14. data/app/controllers/surveyor_gui/question_groups_controller.rb +90 -0
  15. data/app/controllers/surveyor_gui/questions_controller.rb +187 -0
  16. data/app/controllers/surveyor_gui/reports_controller.rb +339 -0
  17. data/app/controllers/surveyor_gui/responses_controller.rb +41 -0
  18. data/app/controllers/surveyor_gui/survey_controller.rb +16 -0
  19. data/app/controllers/surveyor_gui/survey_sections_controller.rb +80 -0
  20. data/app/controllers/surveyor_gui/surveyforms_controller.rb +4 -0
  21. data/app/facades/report_formatter.rb +46 -0
  22. data/app/facades/report_preview_wrapper.rb +11 -0
  23. data/app/facades/report_response_generator.rb +147 -0
  24. data/app/helpers/surveyor_gui/application_helper.rb +2 -0
  25. data/app/helpers/surveyor_gui/dependencys_helper.rb +5 -0
  26. data/app/helpers/surveyor_gui/question_groups_helper.rb +3 -0
  27. data/app/helpers/surveyor_gui/questions_helper.rb +22 -0
  28. data/app/helpers/surveyor_gui/reports_helper.rb +19 -0
  29. data/app/helpers/surveyor_gui/surveyforms_helper.rb +164 -0
  30. data/app/helpers/surveyor_helper.rb +4 -0
  31. data/app/inputs/currency_input.rb +5 -0
  32. data/app/inputs/date_picker_input.rb +7 -0
  33. data/app/inputs/datetime_picker_input.rb +5 -0
  34. data/app/inputs/percent_input.rb +5 -0
  35. data/app/inputs/time_picker_input.rb +5 -0
  36. data/app/mailers/.gitkeep +0 -0
  37. data/app/models/.gitkeep +0 -0
  38. data/app/models/answer.rb +4 -0
  39. data/app/models/column.rb +3 -0
  40. data/app/models/dependency.rb +4 -0
  41. data/app/models/dependency_condition.rb +4 -0
  42. data/app/models/permitted_params_decorator.rb +80 -0
  43. data/app/models/question.rb +4 -0
  44. data/app/models/question_group.rb +4 -0
  45. data/app/models/question_group_tracker.rb +19 -0
  46. data/app/models/question_type.rb +7 -0
  47. data/app/models/response.rb +4 -0
  48. data/app/models/response_set.rb +4 -0
  49. data/app/models/row.rb +3 -0
  50. data/app/models/survey.rb +4 -0
  51. data/app/models/survey_section.rb +4 -0
  52. data/app/models/surveyform.rb +103 -0
  53. data/app/uploaders/blob_uploader.rb +48 -0
  54. data/app/views/layouts/surveyor_gui/application.html.erb +14 -0
  55. data/app/views/layouts/surveyor_gui/surveyor_gui_blank.html.erb +13 -0
  56. data/app/views/layouts/surveyor_gui/surveyor_gui_default.html.erb +17 -0
  57. data/app/views/layouts/surveyor_gui/surveyor_modified.html.erb +14 -0
  58. data/app/views/partials/_answer.html.haml +33 -0
  59. data/app/views/partials/_question.html.haml +33 -0
  60. data/app/views/partials/_question_group.html.haml +73 -0
  61. data/app/views/partials/_section.html.haml +13 -0
  62. data/app/views/surveyor/edit.html.haml +21 -0
  63. data/app/views/surveyor_gui/dependencys/_column.html.erb +1 -0
  64. data/app/views/surveyor_gui/dependencys/_dependency.html.erb +22 -0
  65. data/app/views/surveyor_gui/dependencys/_dependency_condition_fields.html.erb +48 -0
  66. data/app/views/surveyor_gui/dependencys/_form.html.erb +20 -0
  67. data/app/views/surveyor_gui/dependencys/blank.html.erb +0 -0
  68. data/app/views/surveyor_gui/dependencys/edit.html.erb +1 -0
  69. data/app/views/surveyor_gui/dependencys/new.html.erb +1 -0
  70. data/app/views/surveyor_gui/partials/_url_helpers.html.erb +5 -0
  71. data/app/views/surveyor_gui/question_groups/_form.html.erb +57 -0
  72. data/app/views/surveyor_gui/question_groups/_group_inline_field.html.erb +21 -0
  73. data/app/views/surveyor_gui/question_groups/_group_inline_fields.html.erb +25 -0
  74. data/app/views/surveyor_gui/question_groups/blank.html.erb +0 -0
  75. data/app/views/surveyor_gui/question_groups/edit.html.erb +1 -0
  76. data/app/views/surveyor_gui/question_groups/new.html.erb +1 -0
  77. data/app/views/surveyor_gui/questions/_answer_fields.html.erb +23 -0
  78. data/app/views/surveyor_gui/questions/_answer_options.html.erb +28 -0
  79. data/app/views/surveyor_gui/questions/_form.html.erb +66 -0
  80. data/app/views/surveyor_gui/questions/_grid_dropdown_columns.html.erb +10 -0
  81. data/app/views/surveyor_gui/questions/_grid_dropdown_fields.html.erb +42 -0
  82. data/app/views/surveyor_gui/questions/_grid_fields.html.erb +9 -0
  83. data/app/views/surveyor_gui/questions/_no_picks.html.erb +29 -0
  84. data/app/views/surveyor_gui/questions/_pick.html +21 -0
  85. data/app/views/surveyor_gui/questions/_picks.html.erb +12 -0
  86. data/app/views/surveyor_gui/questions/blank.html.erb +0 -0
  87. data/app/views/surveyor_gui/questions/edit.html.erb +1 -0
  88. data/app/views/surveyor_gui/questions/new.html.erb +1 -0
  89. data/app/views/surveyor_gui/reports/_graphs.html.haml +21 -0
  90. data/app/views/surveyor_gui/reports/_grid.html.haml +42 -0
  91. data/app/views/surveyor_gui/reports/_grid_dropdown.html.haml +56 -0
  92. data/app/views/surveyor_gui/reports/_repeater.html.haml +27 -0
  93. data/app/views/surveyor_gui/reports/_show_report.html.haml +33 -0
  94. data/app/views/surveyor_gui/reports/_single_question.html.haml +70 -0
  95. data/app/views/surveyor_gui/reports/show.html.erb +14 -0
  96. data/app/views/surveyor_gui/responses/_grid.html.haml +20 -0
  97. data/app/views/surveyor_gui/responses/_grid_dropdown.html.haml +20 -0
  98. data/app/views/surveyor_gui/responses/_repeater.html.haml +22 -0
  99. data/app/views/surveyor_gui/responses/_survey_results.html.haml +40 -0
  100. data/app/views/surveyor_gui/responses/index.html.haml +24 -0
  101. data/app/views/surveyor_gui/responses/show.html.haml +42 -0
  102. data/app/views/surveyor_gui/shared/_grid_comments.html.haml +10 -0
  103. data/app/views/surveyor_gui/shared/_new_line.html.haml +2 -0
  104. data/app/views/surveyor_gui/shared/_pick_comments.html.haml +15 -0
  105. data/app/views/surveyor_gui/shared/_question_number.html.haml +11 -0
  106. data/app/views/surveyor_gui/shared/_report_data.html.haml +27 -0
  107. data/app/views/surveyor_gui/shared/_stars_report_data.html.haml +14 -0
  108. data/app/views/surveyor_gui/survey_sections/_form.html.erb +13 -0
  109. data/app/views/surveyor_gui/survey_sections/blank.html.erb +0 -0
  110. data/app/views/surveyor_gui/survey_sections/edit.html.erb +1 -0
  111. data/app/views/surveyor_gui/survey_sections/new.html.erb +1 -0
  112. data/app/views/surveyor_gui/surveyforms/_form.html.erb +50 -0
  113. data/app/views/surveyor_gui/surveyforms/_question_field.html.erb +148 -0
  114. data/app/views/surveyor_gui/surveyforms/_question_group.html.erb +116 -0
  115. data/app/views/surveyor_gui/surveyforms/_question_group_fields.html.erb +3 -0
  116. data/app/views/surveyor_gui/surveyforms/_question_name_and_number.html.erb +6 -0
  117. data/app/views/surveyor_gui/surveyforms/_question_section.html.erb +15 -0
  118. data/app/views/surveyor_gui/surveyforms/_question_wrapper.html.erb +108 -0
  119. data/app/views/surveyor_gui/surveyforms/_survey_section_fields.html.erb +137 -0
  120. data/app/views/surveyor_gui/surveyforms/clone_survey.html.erb +13 -0
  121. data/app/views/surveyor_gui/surveyforms/edit.html.erb +5 -0
  122. data/app/views/surveyor_gui/surveyforms/index.html.erb +40 -0
  123. data/app/views/surveyor_gui/surveyforms/new.html.erb +1 -0
  124. data/app/views/surveyor_gui/surveyforms/show.html.erb +5 -0
  125. data/config/environment.rb +0 -0
  126. data/config/routes.rb +71 -0
  127. data/config.ru +4 -0
  128. data/db/migrate/20140307204049_add_template_to_surveys.rb +5 -0
  129. data/db/migrate/20140307235607_add_test_data_to_response_sets.rb +5 -0
  130. data/db/migrate/20140308171947_add_original_choice_to_answers.rb +5 -0
  131. data/db/migrate/20140308172118_add_blob_to_responses.rb +5 -0
  132. data/db/migrate/20140308172417_add_modifiable_to_survey_section.rb +5 -0
  133. data/db/migrate/20140308174532_add_modifiable_to_question.rb +5 -0
  134. data/db/migrate/20140308175305_add_dynamically_generate_to_questions.rb +5 -0
  135. data/db/migrate/20140311032923_add_dummy_blob_to_questions.rb +5 -0
  136. data/db/migrate/20140311160609_add_dynamic_source_to_questions.rb +5 -0
  137. data/db/migrate/20140311161714_add_report_code_to_questions.rb +5 -0
  138. data/db/migrate/20140530181134_add_is_comment_to_questions.rb +5 -0
  139. data/db/migrate/20140531012006_add_is_comment_to_answers.rb +5 -0
  140. data/db/migrate/20140531225529_create_rows.rb +9 -0
  141. data/db/migrate/20140601011151_create_columns.rb +11 -0
  142. data/db/migrate/20140602030330_add_column_id_to_answers.rb +5 -0
  143. data/db/migrate/20140603155606_add_column_id_to_responses.rb +5 -0
  144. data/db/migrate/20140606023527_add_column_id_to_dependency_conditions.rb +5 -0
  145. data/db/migrate/20140815165307_add_user_id_to_survey.rb +5 -0
  146. data/lib/assets/.gitkeep +0 -0
  147. data/lib/assets/images/addicon.png +0 -0
  148. data/lib/assets/images/datepicker.gif +0 -0
  149. data/lib/assets/images/delete.gif +0 -0
  150. data/lib/assets/images/delete.png +0 -0
  151. data/lib/assets/images/images/border.png +0 -0
  152. data/lib/assets/images/images/controls.png +0 -0
  153. data/lib/assets/images/images/loading.gif +0 -0
  154. data/lib/assets/images/images/loading_background.png +0 -0
  155. data/lib/assets/images/images/overlay.png +0 -0
  156. data/lib/assets/images/rails.png +0 -0
  157. data/lib/assets/images/star.gif +0 -0
  158. data/lib/assets/javascripts/.gitkeep +0 -0
  159. data/lib/assets/javascripts/surveyor_gui/jquery.MetaData.js +121 -0
  160. data/lib/assets/javascripts/surveyor_gui/jquery.blockUI.js +619 -0
  161. data/lib/assets/javascripts/surveyor_gui/jquery.rating.js +377 -0
  162. data/lib/assets/javascripts/surveyor_gui/jquery.validate.js +1188 -0
  163. data/lib/assets/javascripts/surveyor_gui/surveyor_add_ons.js +10 -0
  164. data/lib/assets/javascripts/surveyor_gui/surveyor_gui.js +1428 -0
  165. data/lib/assets/stylesheets/.gitkeep +0 -0
  166. data/lib/assets/stylesheets/surveyor_gui/jquery.rating.css +12 -0
  167. data/lib/assets/stylesheets/surveyor_gui/surveyor_add_ons.css +3 -0
  168. data/lib/assets/stylesheets/surveyor_gui/surveyor_gui.sass +652 -0
  169. data/lib/enumerable_extenders.rb +31 -0
  170. data/lib/generators/surveyor_gui/install_generator.rb +57 -0
  171. data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_add_ons.js +2 -0
  172. data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_gui_all.js +24 -0
  173. data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_add_ons.css.sass +1 -0
  174. data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_gui_all.css.sass +8 -0
  175. data/lib/generators/surveyor_gui/templates/app/helpers/surveyor_helper.rb +4 -0
  176. data/lib/generators/surveyor_gui/templates/app/models/response_set_user.rb +13 -0
  177. data/lib/generators/surveyor_gui/templates/app/views/layouts/surveyor_gui/surveyor_gui_default.html.erb +17 -0
  178. data/lib/generators/surveyor_gui/templates/config/initializers/simple_form.rb +140 -0
  179. data/lib/generators/surveyor_gui/templates/config/locales/en.yml +5 -0
  180. data/lib/surveyor_gui/engine.rb +31 -0
  181. data/lib/surveyor_gui/helpers/surveyor_helper_methods.rb +19 -0
  182. data/lib/surveyor_gui/models/answer_methods.rb +24 -0
  183. data/lib/surveyor_gui/models/column_methods.rb +43 -0
  184. data/lib/surveyor_gui/models/dependency_condition_methods.rb +53 -0
  185. data/lib/surveyor_gui/models/dependency_methods.rb +83 -0
  186. data/lib/surveyor_gui/models/question_and_group_shared_methods.rb +11 -0
  187. data/lib/surveyor_gui/models/question_group_methods.rb +55 -0
  188. data/lib/surveyor_gui/models/question_methods.rb +435 -0
  189. data/lib/surveyor_gui/models/question_type_methods.rb +493 -0
  190. data/lib/surveyor_gui/models/response_methods.rb +71 -0
  191. data/lib/surveyor_gui/models/response_set_methods.rb +56 -0
  192. data/lib/surveyor_gui/models/row_methods.rb +11 -0
  193. data/lib/surveyor_gui/models/survey_methods.rb +32 -0
  194. data/lib/surveyor_gui/models/survey_section_methods.rb +32 -0
  195. data/lib/surveyor_gui/surveyforms_controller_methods.rb +258 -0
  196. data/lib/surveyor_gui/version.rb +3 -0
  197. data/lib/surveyor_gui.rb +17 -0
  198. data/lib/tasks/.gitkeep +0 -0
  199. data/lib/tasks/surveyor_gui_tasks.rake +4 -0
  200. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  201. data/spec/controllers/surveyforms_controller_spec.rb +362 -0
  202. data/spec/controllers/surveyor_controller_spec.rb +303 -0
  203. data/spec/factories.rb +181 -0
  204. data/spec/features/create_survey_spec.rb +417 -0
  205. data/spec/features/dependencies_spec.rb +65 -0
  206. data/spec/features/make_and_take_spec.rb +187 -0
  207. data/spec/features/rearrange_survey_spec.rb +118 -0
  208. data/spec/features/ui_spec.rb +469 -0
  209. data/spec/fixtures/REDCapDemoDatabase_DataDictionary.csv +127 -0
  210. data/spec/fixtures/chinese_survey.rb +14 -0
  211. data/spec/fixtures/everything.rb +215 -0
  212. data/spec/fixtures/favorites-ish.rb +22 -0
  213. data/spec/fixtures/favorites.rb +22 -0
  214. data/spec/fixtures/feelings.rb +38 -0
  215. data/spec/fixtures/lifestyle.rb +55 -0
  216. data/spec/fixtures/numbers.rb +21 -0
  217. data/spec/fixtures/redcap_new_headers.csv +1 -0
  218. data/spec/fixtures/redcap_siblings.csv +1 -0
  219. data/spec/fixtures/redcap_whitespace.csv +1 -0
  220. data/spec/helpers/formtastic_custom_input_spec.rb +15 -0
  221. data/spec/helpers/surveyor_helper_spec.rb +116 -0
  222. data/spec/lib/common_spec.rb +37 -0
  223. data/spec/lib/parser_spec.rb +393 -0
  224. data/spec/lib/rake_kitchen_sink.rb +42 -0
  225. data/spec/lib/redcap_parser_spec.rb +129 -0
  226. data/spec/lib/unparser_spec.rb +126 -0
  227. data/spec/models/answer_spec.rb +144 -0
  228. data/spec/models/dependency_condition_spec.rb +428 -0
  229. data/spec/models/dependency_spec.rb +90 -0
  230. data/spec/models/question_group_spec.rb +66 -0
  231. data/spec/models/question_spec.rb +176 -0
  232. data/spec/models/response_set_spec.rb +452 -0
  233. data/spec/models/response_spec.rb +208 -0
  234. data/spec/models/survey_section_spec.rb +58 -0
  235. data/spec/models/survey_spec.rb +155 -0
  236. data/spec/models/surveyor_gui/question_spec.rb +60 -0
  237. data/spec/models/surveyor_gui/question_type_spec.rb +268 -0
  238. data/spec/models/validation_condition_spec.rb +98 -0
  239. data/spec/models/validation_spec.rb +64 -0
  240. data/spec/spec.opts +4 -0
  241. data/spec/spec_helper.rb +119 -0
  242. data/spec/support/scenario_outline_helper.rb +39 -0
  243. data/spec/support/shared.rb +10 -0
  244. data/spec/support/surveyforms_creation_helpers.rb +313 -0
  245. data/spec/support/surveyforms_rearrangement_helpers.rb +170 -0
  246. data/spec/support/surveyor_api_helpers.rb +15 -0
  247. data/spec/support/surveyor_ui_helpers.rb +108 -0
  248. data/spec/support/wait_for_ajax.rb +11 -0
  249. data/spec/views/questions/edit.html.erb_spec.rb +74 -0
  250. data/spec/views/surveyforms/edit.html.erb_spec.rb +126 -0
  251. data/surveyor_gui.gemspec +52 -0
  252. data/test/dummy/README.rdoc +261 -0
  253. data/test/dummy/Rakefile +7 -0
  254. data/test/dummy/app/assets/javascripts/application.js +15 -0
  255. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  256. data/test/dummy/app/controllers/application_controller.rb +3 -0
  257. data/test/dummy/app/helpers/application_helper.rb +2 -0
  258. data/test/dummy/app/mailers/.gitkeep +0 -0
  259. data/test/dummy/app/models/.gitkeep +0 -0
  260. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  261. data/test/dummy/config/application.rb +59 -0
  262. data/test/dummy/config/boot.rb +10 -0
  263. data/test/dummy/config/database.yml +25 -0
  264. data/test/dummy/config/environment.rb +5 -0
  265. data/test/dummy/config/environments/development.rb +37 -0
  266. data/test/dummy/config/environments/production.rb +67 -0
  267. data/test/dummy/config/environments/test.rb +37 -0
  268. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  269. data/test/dummy/config/initializers/inflections.rb +15 -0
  270. data/test/dummy/config/initializers/mime_types.rb +5 -0
  271. data/test/dummy/config/initializers/secret_token.rb +7 -0
  272. data/test/dummy/config/initializers/session_store.rb +8 -0
  273. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  274. data/test/dummy/config/locales/en.yml +5 -0
  275. data/test/dummy/config/routes.rb +58 -0
  276. data/test/dummy/config.ru +4 -0
  277. data/test/dummy/lib/assets/.gitkeep +0 -0
  278. data/test/dummy/log/.gitkeep +0 -0
  279. data/test/dummy/public/404.html +26 -0
  280. data/test/dummy/public/422.html +26 -0
  281. data/test/dummy/public/500.html +25 -0
  282. data/test/dummy/public/favicon.ico +0 -0
  283. data/test/dummy/script/rails +6 -0
  284. data/test/surveyor-gui_test.rb +7 -0
  285. data/test/test_helper.rb +15 -0
  286. data/tmp/cache/assets/CF0/DA0/sprockets%2Fd7d5b37686831d37c4dd75e645f5e016 +0 -0
  287. data/tmp/cache/assets/E25/4C0/sprockets%2Fde2fd9fd11c04a582cdbbe3d84a35ae6 +0 -0
  288. data/vendor/assets/stylesheets/.gitkeep +0 -0
  289. data/vendor/assets/stylesheets/custom.sass +5 -0
  290. data/vendor/plugins/.gitkeep +0 -0
  291. metadata +600 -0
@@ -0,0 +1,89 @@
1
+ module SurveyorControllerCustomMethods
2
+ def self.included(base)
3
+ base.send :layout, 'surveyor_gui/surveyor_modified'
4
+ end
5
+
6
+ def edit
7
+ root = File.expand_path('../../', __FILE__)
8
+ #place the surveyor_gui views ahead of the default surveyor view in order of preference
9
+ #so we can load customized partials.
10
+ prepend_view_path(root+'/views')
11
+ super
12
+ end
13
+ def update
14
+ question_ids_for_dependencies = (params[:r] || []).map{|k,v| v["question_id"] }.compact.uniq
15
+ saved = load_and_update_response_set_with_retries
16
+
17
+ if saved && params[:finish] && !@response_set.mandatory_questions_complete?
18
+ #did not complete mandatory fields
19
+ ids, remove, question_ids, flashmsg = {}, {}, [], []
20
+ flashmsg << "You must complete all required fields before submitting the survey. Please fill in the following:"
21
+
22
+ triggered_mandatory_missing = @response_set.triggered_mandatory_missing
23
+
24
+ survey_section = ''
25
+ question_number = {}
26
+ last_question_of_previous_section = 0
27
+ last_question_number = 0
28
+ @response_set.survey.survey_sections.each do |ss|
29
+ index = 0
30
+ ss.questions.where('display_type!=?','label').each do |q|
31
+ if q.triggered?(@response_set)
32
+ question_number[q.id.to_s] = last_question_number = last_question_of_previous_section + index + 1
33
+ index = index + 1
34
+ end
35
+ end
36
+ last_question_of_previous_section = last_question_number
37
+ end
38
+
39
+ triggered_mandatory_missing.each do |m|
40
+ if m.survey_section_id != survey_section
41
+ survey_section = m.survey_section_id
42
+ flashmsg << ""
43
+ flashmsg << "&nbsp;&nbsp;" + m.survey_section.title
44
+ end
45
+
46
+ flashmsg << "&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;" + question_number[m.id.to_s].to_s + ') '+ m.text
47
+ end
48
+ respond_to do |format|
49
+ format.js do
50
+
51
+ render :json=>{"flashmsg"=>flashmsg}
52
+ end
53
+ format.html do
54
+ flash[:notice] = flashmsg.join('<br />')
55
+ redirect_to surveyor.edit_my_survey_path(:anchor => anchor_from(params[:section]), :section => section_id_from(params))
56
+ end
57
+ end
58
+ return
59
+ # elsif @response_set.survey.id.to_s == evaluation_institution.institution.vendor_value_analysis_questionnaire_id && saved && params[:finish]
60
+ elsif saved && params[:finish]
61
+ return redirect_with_message(surveyor_finish, :notice, t('surveyor.completed_survey'))
62
+ end
63
+
64
+
65
+ respond_to do |format|
66
+ format.html do
67
+ if @response_set.nil?
68
+ return redirect_with_message(surveyor.available_surveys_path, :notice, t('surveyor.unable_to_find_your_responses'))
69
+ else
70
+ flash[:notice] = t('surveyor.unable_to_update_survey') unless saved
71
+ redirect_to surveyor.edit_my_survey_path(:anchor => anchor_from(params[:section]), :section => section_id_from(params))
72
+ end
73
+ end
74
+ format.js do
75
+ if @response_set
76
+ render :json => @response_set.reload.all_dependencies(question_ids_for_dependencies)
77
+ else
78
+ render :text => "No response set #{params[:response_set_code]}",
79
+ :status => 404
80
+ end
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+ class SurveyorController < ApplicationController
87
+ include Surveyor::SurveyorControllerMethods
88
+ include SurveyorControllerCustomMethods
89
+ end
@@ -0,0 +1,3 @@
1
+ class SurveyorGui::AnswersController < ApplicationController
2
+ layout 'surveyor_gui/surveyor_gui_blank'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SurveyorGui::ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,286 @@
1
+ class SurveyorGui::DependencysController < ApplicationController
2
+ layout 'surveyor_gui/surveyor_gui_blank'
3
+
4
+ def new
5
+ prep_variables
6
+ @title = "Add Logic for "+@this_question
7
+ if @question.part_of_group?
8
+ @question.question_group.build_dependency(:rule=>'A')
9
+ else
10
+ @question.build_dependency(:rule=>'A')
11
+ end
12
+ end
13
+
14
+ def edit
15
+ prep_variables
16
+ @title = "Edit Logic for Question "+@this_question
17
+ end
18
+
19
+ def create
20
+ @question = Question.new(question_params)
21
+ if @question.save
22
+ redirect_to :back
23
+ else
24
+ render :action => 'new', :layout => 'surveyor_gui/surveyor_gui_blank'
25
+ end
26
+ end
27
+
28
+ def update
29
+ @title = "Update Question"
30
+ @question = Question.includes(:answers).find(params[:id])
31
+ if @question.part_of_group?
32
+ update_object = @question.question_group
33
+ update_params = question_group_params
34
+ else
35
+ update_object = @question
36
+ update_params = question_params
37
+ end
38
+ if update_object.update_attributes(update_params)
39
+ update_object.dependency.destroy if update_object.dependency.dependency_conditions.blank?
40
+ render :blank, :layout => 'surveyor_gui/surveyor_gui_blank'
41
+ else
42
+ prep_variables
43
+ render :action => 'edit', :layout => 'surveyor_gui/surveyor_gui_blank'
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ question = Question.find(params[:id])
49
+ if question.part_of_group?
50
+ question.question_group.dependency.destroy
51
+ else
52
+ question.dependency.destroy
53
+ end
54
+ render :nothing=>true
55
+ end
56
+
57
+ def render_dependency_conditions_partial
58
+ prep_variables
59
+ @question_or_group = @question.part_of_group? ? @question.question_group : @question
60
+ @dependency = Dependency.find(params[:dependency_id]) if !params[:dependency_id].blank?
61
+ if @dependency.nil?
62
+ @question_or_group.build_dependency(:rule=>'A').dependency_conditions.build()
63
+ end
64
+ if @question_or_group.dependency.dependency_conditions.empty?
65
+ @question_or_group.dependency.dependency_conditions.build()
66
+ else
67
+ if params[:add_row]
68
+ @question_or_group = eval(@question_or_group.class.name).new
69
+ @question_or_group.build_dependency.dependency_conditions.build()
70
+ end
71
+ end
72
+ render :partial => 'dependency_condition_fields'
73
+ end
74
+
75
+ def get_answers
76
+ options=""
77
+ question_id = params[:question_id]
78
+ question = Question.find(question_id)
79
+ column_id = params[:column_id].blank? ? _default_column_id(question) : params[:column_id]
80
+ dependency_condition_id = params[:dependency_condition_id]
81
+ dependency_condition = dependency_condition_id.blank? ? nil : DependencyCondition.find(dependency_condition_id)
82
+ if question && question.answers
83
+ question.answers.where('column_id = ? OR column_id IS NULL',column_id.to_i).each_with_index do |a, index|
84
+ options += '<option ' + _get_selected_answer(index, dependency_condition, a, column_id) +
85
+ 'value="' + a.id.to_s + '"' +
86
+ '>'+a.text.to_s+"</option>"
87
+ end
88
+ end
89
+ render :inline=>options
90
+ end
91
+
92
+ def get_columns
93
+ options=""
94
+ question_id = params[:question_id]
95
+ dependency_condition_id = params[:dependency_condition_id]
96
+ dependency_condition = dependency_condition_id.blank? ? nil : DependencyCondition.find(dependency_condition_id)
97
+ question = Question.find(question_id)
98
+ if question && question.question_group
99
+ question.question_group.columns.each_with_index do |c, index|
100
+ options += '<option ' +
101
+ _get_selected_column(index, dependency_condition, c) +
102
+ 'value="' + c.id.to_s + '"' +
103
+ '>'+c.text.to_s+"</option>"
104
+ end
105
+ end
106
+ render :inline=>options
107
+ end
108
+
109
+ def get_question_type
110
+ question_id = params[:question_id]
111
+ question = Question.find(question_id)
112
+ response=question.pick
113
+ response += ','+question.question_type_id.to_s
114
+ response += ','+question_id
115
+ render :inline=>response
116
+ end
117
+
118
+ private
119
+
120
+ def prep_variables
121
+ @question = Question.includes(:dependency).find(params[:id]) unless @question
122
+ controlling_questions = get_controlling_question_collection(@question)
123
+ @controlling_questions = controlling_questions.collection
124
+ @this_question = @question.part_of_group? ? @question.question_group.text : @question.question_description
125
+ @operators = get_operators
126
+ end
127
+
128
+ def get_controlling_question_collection(dependent_question)
129
+ all_questions_in_survey = _get_all_questions_in_survey(dependent_question)
130
+ _get_question_collection(all_questions_in_survey, dependent_question)
131
+ end
132
+
133
+ def _get_all_questions_in_survey(question)
134
+ PossibleControllingQuestion.unscoped
135
+ .joins(:survey_section)
136
+ .where('survey_id = ?', question.survey_section.survey_id)
137
+ .order('survey_sections.display_order','survey_sections.id','questions.display_order')
138
+ end
139
+
140
+ def _get_question_collection(all_questions, dependent_question)
141
+ return QuestionCollection.new(dependent_question).add_questions(all_questions)
142
+ end
143
+
144
+ def get_operators
145
+ return [
146
+ ['equal to (=)','=='],
147
+ ['not equal to','!='],
148
+ ['less than (<)','<'],
149
+ ['less than or equal to (<=)','<='],
150
+ ['greater than or equal to (>=)','>='],
151
+ ['greater than','>']
152
+ ]
153
+ end
154
+
155
+ def question_params
156
+ ::PermittedParams.new(params[:question]).question
157
+ end
158
+
159
+ def question_group_params
160
+ ::PermittedParams.new(params[:question_group]).question_group
161
+ end
162
+
163
+ def _default_column_id(question)
164
+ if question.part_of_group?
165
+ columns = question.question_group.columns
166
+ columns.first ? columns.first.id.to_s : ""
167
+ else
168
+ ""
169
+ end
170
+ end
171
+
172
+ def _get_selected_answer(index, dependency_condition, a, column_id)
173
+ if _matches_dependency_condition(dependency_condition, a, column_id)
174
+ 'selected="selected" '
175
+ else
176
+ ''
177
+ end
178
+ end
179
+
180
+ def _get_selected_column(index, dependency_condition, column)
181
+ if _matches_dependency_condition_column(dependency_condition, column)
182
+ 'selected="selected"'
183
+ else
184
+ ''
185
+ end
186
+ end
187
+
188
+ def _matches_dependency_condition (dependency_condition, a, column_id)
189
+ if dependency_condition.nil?
190
+ false
191
+ else
192
+ (dependency_condition.answer_id == a.id && (column_id.blank? || dependency_condition.column_id == column_id.to_i ))
193
+ end
194
+ end
195
+
196
+ def _matches_dependency_condition_column(dependency_condition, column)
197
+ if dependency_condition.nil?
198
+ false
199
+ else
200
+ dependency_condition.column_id == column.id
201
+ end
202
+ end
203
+
204
+ end
205
+
206
+ class QuestionCollection
207
+ ## QuestionCollection provides a 2 dimensional array consisting of a question id
208
+ ## and a question description. The collection may be used in a view's select field.
209
+ ##
210
+ ## Its membership is determined by a base question.
211
+ ## The base question is the one from which other questions in the collection are derived.
212
+ ## E.g., in a dependency, the question that is shown or hidden based on the answers to others
213
+ ## is the base question. It shouldn't show up in the collection.
214
+ ##
215
+ ## Other questions may or may not show up in the collection depending on their eligibility.
216
+ ##
217
+ ## Some questions should have a question number and
218
+ ## some should not. The QuestionCollection numbers questions that should be numbered
219
+ ## and keeps track of the numbering. If a question is numbered, the question number
220
+ ## is included in the description, e.g. "3) What is your name?". Otherwise,
221
+ ## the description is just the question text, e.g. "Don't forget to use your middle initial".
222
+ ##
223
+ ## Incoming questions may be duck typed, but should respond to is_numbered? and is_eligible?
224
+ ## messages.
225
+
226
+ attr_accessor :collection, :dependency_question_description
227
+
228
+ def initialize(base_question)
229
+ @collection = []
230
+ @question_number = 1
231
+ @base_question = base_question
232
+ @dependency_question_description = nil
233
+ end
234
+
235
+ def collection
236
+ @collection
237
+ end
238
+
239
+ def add_questions(questions)
240
+ questions.each {|q| add_question(q)}
241
+ return self
242
+ end
243
+
244
+ def add_question(question)
245
+ _add_to_collection_if_eligible(question)
246
+ if question.is_numbered?
247
+ _increment_question_number
248
+ end
249
+ return self
250
+ end
251
+
252
+ private
253
+
254
+ def _get_description(question)
255
+ @question_number.to_s + ') ' + (question.part_of_group? ? question.question_group.text + ": " : "") +question.text
256
+ end
257
+
258
+ def _add_to_collection(question)
259
+ description = _get_description(question)
260
+ @collection.push([description, question.id])
261
+ end
262
+
263
+ def _add_to_collection_if_eligible(question)
264
+ _add_to_collection(question) if question.is_eligible? && _this_is_not_the_base_question?(question)
265
+ end
266
+
267
+ def _this_is_not_the_base_question?(question)
268
+ if question.part_of_group?
269
+ question.question_group_id != @base_question.question_group_id
270
+ else
271
+ question.id != @base_question.id
272
+ end
273
+ end
274
+
275
+ def _increment_question_number
276
+ @question_number += 1
277
+ end
278
+ end
279
+
280
+ ## This shouldn't be here but breaks saving nested attributes on question when put
281
+ ## in QuestionMethods. Not sure why, but leave for now and revisit later.
282
+ class PossibleControllingQuestion < Question
283
+ def is_eligible?
284
+ question_type_id!=:label && question_type_id!=:file
285
+ end
286
+ end
@@ -0,0 +1,90 @@
1
+ class SurveyorGui::QuestionGroupsController < ApplicationController
2
+ layout 'surveyor_gui/surveyor_gui_blank'
3
+
4
+ def new
5
+ @title = "Add Question"
6
+ @survey_section_id = question_params[:survey_section_id]
7
+ @question_group = QuestionGroup.new(
8
+ text: params[:text],
9
+ question_type_id: params[:question_type_id])
10
+ original_question = Question.find(params[:question_id]) if !params[:question_id].blank?
11
+ if original_question
12
+ @question_group.questions.build(
13
+ display_order: params[:display_order],
14
+ id: params[:question_id],
15
+ question_type_id: original_question.question_type_id,
16
+ pick: original_question.pick,
17
+ display_type: original_question.display_type)
18
+ else
19
+ @question_group.questions.build(
20
+ display_order: params[:display_order])
21
+ end
22
+ end
23
+
24
+
25
+ def edit
26
+ @title = "Edit Question Group"
27
+ @question_group = QuestionGroup.includes(:questions).find(params[:id])
28
+ @question_group.question_type_id = params[:question_type_id]
29
+ @survey_section_id = question_params[:survey_section_id]
30
+ p "edit survey sect id #{@survey_section_id}"
31
+ end
32
+
33
+ def create
34
+ @question_group = QuestionGroup.new(question_group_params)
35
+ if @question_group.save
36
+ #@question_group.questions.update_attributes(survey_section_id: question_group_params[])
37
+ original_question = Question.find(question_group_params[:question_id]) if !question_group_params[:question_id].blank?
38
+ original_question.destroy if original_question
39
+ render :inline => '<div id="cboxQuestionId">'+@question_group.questions.first.id.to_s+'</div>', :layout => 'surveyor_gui/surveyor_gui_blank'
40
+ else
41
+ @title = "Add Question"
42
+ survey_section_id = question_group_params[:survey_section_id]
43
+ redirect_to :action => 'new', :controller => 'questions', :layout => 'surveyor_gui/surveyor_gui_blank', :survey_section_id => survey_section_id
44
+ end
45
+ end
46
+
47
+ def update
48
+ @title = "Update Question"
49
+ @question_group = QuestionGroup.includes(:questions).find(params[:id])
50
+ if @question_group.update_attributes(question_group_params)
51
+ render :blank, :layout => 'surveyor_gui/surveyor_gui_blank'
52
+ #If a nested question is destroyed, the Question model performs a cascade delete
53
+ #on the parent QuestionGroup (stuck with this behaviour as it is a Surveyor default).
54
+ #Need to check for this and restore question group.
55
+ begin
56
+ QuestionGroup.find(params[:id])
57
+ rescue
58
+ scrubbed_params = question_group_params.to_hash
59
+ scrubbed_params.delete("questions_attributes")
60
+ QuestionGroup.create!(scrubbed_params)
61
+ end
62
+ else
63
+ render :action => 'edit', :layout => 'surveyor_gui/surveyor_gui_blank'
64
+ end
65
+ end
66
+
67
+ def render_group_inline_partial
68
+ if params[:id].blank?
69
+ @question_group = QuestionGroup.new
70
+ else
71
+ @question_group = QuestionGroup.find(params[:id])
72
+ end
73
+ if params[:add_row]
74
+
75
+ @question_group = QuestionGroup.new
76
+ @question_group.questions.build(display_order: params[:display_order])
77
+ render :partial => 'group_inline_field'
78
+ else
79
+ render :partial => 'group_inline_fields'
80
+ end
81
+ end
82
+ private
83
+ def question_group_params
84
+ ::PermittedParams.new(params[:question_group]).question_group
85
+ end
86
+ def question_params
87
+ params.permit(:survey_section_id, :id, :text, :question_id, :question_type_id, :display_order, :pick, :display_type)
88
+ end
89
+
90
+ end