fe 1.0.0 → 2.0.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.
Files changed (402) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +4 -4
  3. data/app/assets/config/fe/manifest.js +3 -0
  4. data/app/assets/config/manifest.js +3 -0
  5. data/app/assets/javascripts/application.js.erb +1 -1
  6. data/app/assets/javascripts/fe/admin.js +0 -1
  7. data/app/assets/javascripts/fe/fe.admin.js +2 -6
  8. data/app/assets/javascripts/fe/{fe.common.js → fe.common.js.erb} +14 -7
  9. data/app/assets/javascripts/fe/fe.public.js +1 -2
  10. data/app/assets/javascripts/fe/{fe.public.nojquery.js → fe.public.nojquery.js.erb} +152 -76
  11. data/app/assets/javascripts/fe/jquery.html5_upload.js +258 -0
  12. data/app/assets/stylesheets/fe/fe.screen.css.scss.erb +22 -1
  13. data/app/assets/stylesheets/fe/validation.css +5 -1
  14. data/app/controllers/{fe/concerns → concerns/fe}/admin/question_sheets_controller_concern.rb +15 -16
  15. data/app/controllers/concerns/fe/answer_pages_controller_concern.rb +131 -0
  16. data/app/controllers/{fe/concerns → concerns/fe}/answer_sheets_controller_concern.rb +14 -6
  17. data/app/controllers/{fe/concerns → concerns/fe}/application_controller_concern.rb +3 -3
  18. data/app/controllers/fe/admin/elements_controller.rb +46 -24
  19. data/app/controllers/fe/admin/email_templates_controller.rb +5 -5
  20. data/app/controllers/fe/admin/question_pages_controller.rb +8 -8
  21. data/app/controllers/fe/reference_pages_controller.rb +11 -11
  22. data/app/controllers/fe/reference_sheets_controller.rb +4 -4
  23. data/app/controllers/fe/references_controller.rb +19 -19
  24. data/app/controllers/fe/submit_pages_controller.rb +5 -5
  25. data/app/helpers/fe/answer_pages_helper.rb +1 -1
  26. data/app/helpers/fe/application_helper.rb +3 -3
  27. data/app/jobs/fe/update_reference_sheet_visibility_job.rb +11 -0
  28. data/app/mailers/fe/notifier.rb +4 -4
  29. data/app/models/answer_sheet.rb +1 -1
  30. data/app/models/application_record.rb +3 -0
  31. data/app/models/{fe/concerns → concerns/fe}/answer_concern.rb +2 -2
  32. data/app/models/{fe/concerns → concerns/fe}/answer_pages_presenter_concern.rb +6 -5
  33. data/app/models/concerns/fe/answer_sheet_concern.rb +125 -0
  34. data/app/models/{fe/concerns → concerns/fe}/choice_field_concern.rb +41 -23
  35. data/app/models/fe/address.rb +2 -2
  36. data/app/models/fe/answer.rb +1 -1
  37. data/app/models/fe/answer_sheet.rb +1 -1
  38. data/app/models/fe/answer_sheet_question_sheet.rb +2 -2
  39. data/app/models/fe/application.rb +14 -10
  40. data/app/models/fe/condition.rb +4 -4
  41. data/app/models/fe/date_field.rb +1 -1
  42. data/app/models/fe/element.rb +126 -44
  43. data/app/models/fe/email_address.rb +2 -2
  44. data/app/models/fe/email_template.rb +1 -1
  45. data/app/models/fe/page.rb +94 -19
  46. data/app/models/fe/page_element.rb +2 -2
  47. data/app/models/fe/paragraph.rb +1 -1
  48. data/app/models/fe/person.rb +5 -5
  49. data/app/models/fe/phone_number.rb +1 -1
  50. data/app/models/fe/question.rb +62 -38
  51. data/app/models/fe/question_grid.rb +15 -3
  52. data/app/models/fe/question_set.rb +53 -13
  53. data/app/models/fe/question_sheet.rb +49 -16
  54. data/app/models/fe/reference_question.rb +9 -3
  55. data/app/models/fe/reference_sheet.rb +102 -47
  56. data/app/models/fe/state_chooser.rb +2 -2
  57. data/app/models/fe/text_field.rb +2 -2
  58. data/app/models/fe/user.rb +1 -1
  59. data/app/models/staff.rb +6 -6
  60. data/app/views/fe/admin/elements/create.js.erb +3 -3
  61. data/app/views/fe/admin/elements/destroy.js.erb +1 -1
  62. data/app/views/fe/admin/elements/drop.js.erb +1 -1
  63. data/app/views/fe/admin/elements/duplicate.js.erb +1 -1
  64. data/app/views/fe/admin/elements/edit.js.erb +1 -1
  65. data/app/views/fe/admin/elements/error.js.erb +1 -1
  66. data/app/views/fe/admin/elements/new.js.erb +13 -6
  67. data/app/views/fe/admin/elements/update.js.erb +1 -1
  68. data/app/views/fe/admin/email_templates/_form.html.erb +3 -3
  69. data/app/views/fe/admin/email_templates/edit.html.erb +3 -3
  70. data/app/views/fe/admin/email_templates/index.html.erb +3 -3
  71. data/app/views/fe/admin/email_templates/new.html.erb +3 -3
  72. data/app/views/fe/admin/panels/_advanced_options.html.erb +8 -8
  73. data/app/views/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  74. data/app/views/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  75. data/app/views/fe/admin/panels/_common_fields.html.erb +2 -17
  76. data/app/views/fe/admin/panels/_condition.html.erb +1 -1
  77. data/app/views/fe/admin/panels/_insert.html.erb +25 -25
  78. data/app/views/fe/admin/panels/_nav_controls.html.erb +4 -4
  79. data/app/views/fe/admin/panels/_page.html.erb +1 -1
  80. data/app/views/fe/admin/panels/_pages_list.html.erb +3 -3
  81. data/app/views/fe/admin/panels/_prop_attachment_field.html.erb +2 -2
  82. data/app/views/fe/admin/panels/_prop_choice_field.html.erb +36 -17
  83. data/app/views/fe/admin/panels/_prop_date_field.html.erb +1 -1
  84. data/app/views/fe/admin/panels/_prop_element.html.erb +5 -5
  85. data/app/views/fe/admin/panels/_prop_page.html.erb +3 -3
  86. data/app/views/fe/admin/panels/_prop_paragraph.html.erb +8 -8
  87. data/app/views/fe/admin/panels/_prop_question_grid.html.erb +7 -2
  88. data/app/views/fe/admin/panels/_prop_question_grid_with_total.html.erb +2 -2
  89. data/app/views/fe/admin/panels/_prop_reference_question.html.erb +3 -3
  90. data/app/views/fe/admin/panels/_prop_section.html.erb +1 -1
  91. data/app/views/fe/admin/panels/_prop_sheet.html.erb +3 -3
  92. data/app/views/fe/admin/panels/_prop_text_field.html.erb +12 -12
  93. data/app/views/fe/admin/question_pages/_element.html.erb +7 -7
  94. data/app/views/fe/admin/question_pages/_element_show.html.erb +2 -2
  95. data/app/views/fe/admin/question_pages/_question_page.html.erb +4 -4
  96. data/app/views/fe/admin/question_pages/create.js.erb +3 -3
  97. data/app/views/fe/admin/question_pages/destroy.js.erb +3 -3
  98. data/app/views/fe/admin/question_pages/edit.js.erb +1 -1
  99. data/app/views/fe/admin/question_pages/error.js.erb +1 -1
  100. data/app/views/fe/admin/question_pages/show.js.erb +2 -2
  101. data/app/views/fe/admin/question_pages/show_panel.js.erb +1 -1
  102. data/app/views/fe/admin/question_pages/update.js.erb +1 -1
  103. data/app/views/fe/admin/question_sheets/edit.js.erb +1 -1
  104. data/app/views/fe/admin/question_sheets/error.js.erb +1 -1
  105. data/app/views/fe/admin/question_sheets/index.html.erb +8 -8
  106. data/app/views/fe/admin/question_sheets/new.html.erb +3 -3
  107. data/app/views/fe/admin/question_sheets/show.html.erb +5 -5
  108. data/app/views/fe/admin/question_sheets/update.js.erb +1 -1
  109. data/app/views/fe/answer_pages/_answer_page.html.erb +13 -14
  110. data/app/views/fe/answer_pages/_element.html.erb +22 -2
  111. data/app/views/fe/answer_pages/_page_name.html.erb +1 -1
  112. data/app/views/fe/answer_pages/show.html.erb +39 -0
  113. data/app/views/fe/answer_pages/update.js.erb +10 -2
  114. data/app/views/fe/answer_sheets/_answer_sheet.html.erb +4 -4
  115. data/app/views/fe/answer_sheets/_element.html.erb +9 -7
  116. data/app/views/fe/answer_sheets/_incomplete.html.erb +1 -1
  117. data/app/views/fe/answer_sheets/_page_link.html.erb +9 -7
  118. data/app/views/fe/answer_sheets/_pages_list.html.erb +3 -3
  119. data/app/views/fe/answer_sheets/_submit_to.html.erb +1 -1
  120. data/app/views/fe/answer_sheets/_title.html.erb +1 -1
  121. data/app/views/fe/answer_sheets/edit.html.erb +18 -18
  122. data/app/views/fe/answer_sheets/incomplete.js.erb +7 -4
  123. data/app/views/fe/answer_sheets/index.html.erb +1 -1
  124. data/app/views/fe/answer_sheets/show.html.erb +1 -1
  125. data/app/views/fe/applications/_logout.html.erb +1 -1
  126. data/app/views/fe/questions/fe/_acceptance.html.erb +10 -9
  127. data/app/views/fe/questions/fe/_attachment_field.html.erb +129 -10
  128. data/app/views/fe/questions/fe/_checkbox_field.html.erb +18 -16
  129. data/app/views/fe/questions/fe/_country.html.erb +6 -6
  130. data/app/views/fe/questions/fe/_date_field.html.erb +5 -4
  131. data/app/views/fe/questions/fe/_date_field_mmyy.html.erb +8 -8
  132. data/app/views/fe/questions/fe/_drop_down_field.html.erb +5 -5
  133. data/app/views/fe/questions/fe/_question_grid.html.erb +10 -10
  134. data/app/views/fe/questions/fe/_question_grid_with_total.html.erb +8 -8
  135. data/app/views/fe/questions/fe/_questions.html.erb +11 -5
  136. data/app/views/fe/questions/fe/_radio_button_field.html.erb +35 -19
  137. data/app/views/fe/questions/fe/_rating.html.erb +56 -18
  138. data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -1
  139. data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -1
  140. data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -1
  141. data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -1
  142. data/app/views/fe/questions/fe/_reference_question.html.erb +40 -24
  143. data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -1
  144. data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -1
  145. data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -1
  146. data/app/views/fe/questions/fe/_state_chooser.html.erb +6 -6
  147. data/app/views/fe/questions/fe/_text_area_field.html.erb +14 -10
  148. data/app/views/fe/questions/fe/_text_field.html.erb +7 -6
  149. data/app/views/fe/questions/fe/_yes_no.html.erb +8 -8
  150. data/app/views/fe/questions/fe/_yes_no_field.erb +11 -8
  151. data/app/views/fe/reference_pages/_reference.html.erb +12 -12
  152. data/app/views/fe/reference_pages/edit.html.erb +4 -4
  153. data/app/views/fe/reference_sheets/done.html.erb +2 -2
  154. data/app/views/fe/reference_sheets/not_found.html.erb +3 -3
  155. data/app/views/fe/references/edit.html.erb +5 -5
  156. data/app/views/fe/references/show.html.erb +3 -3
  157. data/app/views/fe/references/submit.js.erb +3 -3
  158. data/app/views/fe/submit_pages/_thankyou.html.erb +1 -1
  159. data/app/views/fe/submit_pages/edit.html.erb +9 -9
  160. data/app/views/fe/submit_pages/error.js.erb +1 -1
  161. data/app/views/fe/submit_pages/submit.js.erb +2 -2
  162. data/app/views/layouts/fe/_error_messages_for.html.erb +1 -1
  163. data/app/views/layouts/fe/application.html.erb +3 -4
  164. data/app/views/layouts/fe/fe_admin.html.erb +30 -0
  165. data/app/views.current/fe/admin/elements/_errors.html.erb +11 -0
  166. data/app/views.current/fe/admin/elements/create.js.erb +12 -0
  167. data/app/views.current/fe/admin/elements/destroy.js.erb +4 -0
  168. data/app/views.current/fe/admin/elements/drop.js.erb +3 -0
  169. data/app/views.current/fe/admin/elements/duplicate.js.erb +3 -0
  170. data/app/views.current/fe/admin/elements/edit.js.erb +4 -0
  171. data/app/views.current/fe/admin/elements/error.js.erb +4 -0
  172. data/app/views.current/fe/admin/elements/new.js.erb +17 -0
  173. data/app/views.current/fe/admin/elements/update.js.erb +9 -0
  174. data/app/views.current/fe/admin/email_templates/_form.html.erb +8 -0
  175. data/app/views.current/fe/admin/email_templates/edit.html.erb +13 -0
  176. data/app/views.current/fe/admin/email_templates/index.html.erb +20 -0
  177. data/app/views.current/fe/admin/email_templates/new.html.erb +11 -0
  178. data/app/views.current/fe/admin/panels/_advanced_options.html.erb +49 -0
  179. data/app/views.current/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  180. data/app/views.current/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  181. data/app/views.current/fe/admin/panels/_common_fields.html.erb +23 -0
  182. data/app/views.current/fe/admin/panels/_condition.html.erb +6 -0
  183. data/app/views.current/fe/admin/panels/_insert.html.erb +39 -0
  184. data/app/views.current/fe/admin/panels/_nav_controls.html.erb +6 -0
  185. data/app/views.current/fe/admin/panels/_page.html.erb +3 -0
  186. data/app/views.current/fe/admin/panels/_pages_list.html.erb +16 -0
  187. data/app/views.current/fe/admin/panels/_prop_attachment_field.html.erb +2 -0
  188. data/app/views.current/fe/admin/panels/_prop_choice_field.html.erb +74 -0
  189. data/app/views.current/fe/admin/panels/_prop_date_field.html.erb +7 -0
  190. data/app/views.current/fe/admin/panels/_prop_element.html.erb +23 -0
  191. data/app/views.current/fe/admin/panels/_prop_page.html.erb +26 -0
  192. data/app/views.current/fe/admin/panels/_prop_paragraph.html.erb +46 -0
  193. data/app/views.current/fe/admin/panels/_prop_question_grid.html.erb +28 -0
  194. data/app/views.current/fe/admin/panels/_prop_question_grid_with_total.html.erb +14 -0
  195. data/app/views.current/fe/admin/panels/_prop_reference_question.html.erb +12 -0
  196. data/app/views.current/fe/admin/panels/_prop_section.html.erb +8 -0
  197. data/app/views.current/fe/admin/panels/_prop_sheet.html.erb +20 -0
  198. data/app/views.current/fe/admin/panels/_prop_text_field.html.erb +20 -0
  199. data/app/views.current/fe/admin/question_pages/_element.html.erb +28 -0
  200. data/app/views.current/fe/admin/question_pages/_element_show.html.erb +10 -0
  201. data/app/views.current/fe/admin/question_pages/_errors.html.erb +10 -0
  202. data/app/views.current/fe/admin/question_pages/_question_page.html.erb +13 -0
  203. data/app/views.current/fe/admin/question_pages/create.js.erb +11 -0
  204. data/app/views.current/fe/admin/question_pages/destroy.js.erb +5 -0
  205. data/app/views.current/fe/admin/question_pages/edit.js.erb +3 -0
  206. data/app/views.current/fe/admin/question_pages/error.js.erb +4 -0
  207. data/app/views.current/fe/admin/question_pages/show.js.erb +9 -0
  208. data/app/views.current/fe/admin/question_pages/show_panel.js.erb +3 -0
  209. data/app/views.current/fe/admin/question_pages/update.js.erb +2 -0
  210. data/app/views.current/fe/admin/question_sheets/_errors.html.erb +11 -0
  211. data/app/views.current/fe/admin/question_sheets/edit.js.erb +3 -0
  212. data/app/views.current/fe/admin/question_sheets/error.js.erb +5 -0
  213. data/app/views.current/fe/admin/question_sheets/index.html.erb +41 -0
  214. data/app/views.current/fe/admin/question_sheets/new.html.erb +15 -0
  215. data/app/views.current/fe/admin/question_sheets/show.html.erb +27 -0
  216. data/app/views.current/fe/admin/question_sheets/update.js.erb +2 -0
  217. data/app/views.current/fe/answer_pages/_answer_page.html.erb +53 -0
  218. data/app/views.current/fe/answer_pages/_element.html.erb +32 -0
  219. data/app/views.current/fe/answer_pages/_page_name.html.erb +1 -0
  220. data/app/views.current/fe/answer_pages/show.html.erb +39 -0
  221. data/app/views.current/fe/answer_pages/update.js.erb +13 -0
  222. data/app/views.current/fe/answer_sheets/_answer_sheet.html.erb +26 -0
  223. data/app/views.current/fe/answer_sheets/_element.html.erb +74 -0
  224. data/app/views.current/fe/answer_sheets/_incomplete.html.erb +10 -0
  225. data/app/views.current/fe/answer_sheets/_page_link.html.erb +9 -0
  226. data/app/views.current/fe/answer_sheets/_pages_list.html.erb +11 -0
  227. data/app/views.current/fe/answer_sheets/_submit_to.html.erb +1 -0
  228. data/app/views.current/fe/answer_sheets/_title.html.erb +1 -0
  229. data/app/views.current/fe/answer_sheets/edit.html.erb +66 -0
  230. data/app/views.current/fe/answer_sheets/incomplete.js.erb +11 -0
  231. data/app/views.current/fe/answer_sheets/index.html.erb +18 -0
  232. data/app/views.current/fe/answer_sheets/send_reference_invite.js.erb +8 -0
  233. data/app/views.current/fe/answer_sheets/show.html.erb +13 -0
  234. data/app/views.current/fe/applications/_logout.html.erb +1 -0
  235. data/app/views.current/fe/applications/show.html.erb +1 -0
  236. data/app/views.current/fe/help/builder.html +33 -0
  237. data/app/views.current/fe/help/question_grid.html +18 -0
  238. data/app/views.current/fe/questions/fe/_acceptance.html.erb +14 -0
  239. data/app/views.current/fe/questions/fe/_attachment_field.html.erb +165 -0
  240. data/app/views.current/fe/questions/fe/_checkbox_field.html.erb +53 -0
  241. data/app/views.current/fe/questions/fe/_country.html.erb +7 -0
  242. data/app/views.current/fe/questions/fe/_date_field.html.erb +7 -0
  243. data/app/views.current/fe/questions/fe/_date_field_mmyy.html.erb +9 -0
  244. data/app/views.current/fe/questions/fe/_drop_down_field.html.erb +8 -0
  245. data/app/views.current/fe/questions/fe/_paragraph.html.erb +1 -0
  246. data/app/views.current/fe/questions/fe/_question_grid.html.erb +70 -0
  247. data/app/views.current/fe/questions/fe/_question_grid_with_total.html.erb +64 -0
  248. data/app/views.current/fe/questions/fe/_questions.html.erb +15 -0
  249. data/app/views.current/fe/questions/fe/_radio_button_field.html.erb +60 -0
  250. data/app/views.current/fe/questions/fe/_rating.html.erb +64 -0
  251. data/app/views.current/fe/questions/fe/_reference_discipler.html.erb +1 -0
  252. data/app/views.current/fe/questions/fe/_reference_friend.html.erb +1 -0
  253. data/app/views.current/fe/questions/fe/_reference_parent.html.erb +1 -0
  254. data/app/views.current/fe/questions/fe/_reference_peer.html.erb +1 -0
  255. data/app/views.current/fe/questions/fe/_reference_question.html.erb +61 -0
  256. data/app/views.current/fe/questions/fe/_reference_roommate.html.erb +1 -0
  257. data/app/views.current/fe/questions/fe/_reference_spiritual.html.erb +1 -0
  258. data/app/views.current/fe/questions/fe/_reference_staff.html.erb +1 -0
  259. data/app/views.current/fe/questions/fe/_section.html.erb +1 -0
  260. data/app/views.current/fe/questions/fe/_state_chooser.html.erb +7 -0
  261. data/app/views.current/fe/questions/fe/_text_area_field.html.erb +17 -0
  262. data/app/views.current/fe/questions/fe/_text_field.html.erb +9 -0
  263. data/app/views.current/fe/questions/fe/_yes_no.html.erb +17 -0
  264. data/app/views.current/fe/questions/fe/_yes_no_field.erb +20 -0
  265. data/app/views.current/fe/reference_pages/_reference.html.erb +31 -0
  266. data/app/views.current/fe/reference_pages/edit.html.erb +24 -0
  267. data/app/views.current/fe/reference_sheets/done.html.erb +2 -0
  268. data/app/views.current/fe/reference_sheets/not_found.html.erb +5 -0
  269. data/app/views.current/fe/reference_sheets/submitted.js.erb +1 -0
  270. data/app/views.current/fe/references/edit.html.erb +8 -0
  271. data/app/views.current/fe/references/send_invite.js.erb +7 -0
  272. data/app/views.current/fe/references/show.html.erb +18 -0
  273. data/app/views.current/fe/references/submit.js.erb +3 -0
  274. data/app/views.current/fe/submit_pages/_errors.html.erb +1 -0
  275. data/app/views.current/fe/submit_pages/_thankyou.html.erb +2 -0
  276. data/app/views.current/fe/submit_pages/edit.html.erb +36 -0
  277. data/app/views.current/fe/submit_pages/error.js.erb +1 -0
  278. data/app/views.current/fe/submit_pages/submit.js.erb +3 -0
  279. data/app/views.current/layouts/fe/_error_messages_for.html.erb +7 -0
  280. data/app/views.current/layouts/fe/application.html.erb +47 -0
  281. data/app/{views/layouts/fe/fe.admin.html.erb → views.current/layouts/fe/fe_admin.html.erb} +4 -4
  282. data/config/initializers/paper_trail.rb +3 -0
  283. data/config/routes.rb +3 -1
  284. data/db/migrate/20131003041856_core.rb +23 -23
  285. data/db/migrate/20131003044250_create_reference_sheets.rb +1 -1
  286. data/db/migrate/20131003044436_add_element_and_answer_fields.rb +3 -3
  287. data/db/migrate/20131003044518_create_email_templates.rb +2 -2
  288. data/db/migrate/20131003044621_add_max_lengths.rb +1 -1
  289. data/db/migrate/20131003044714_create_join_table.rb +1 -1
  290. data/db/migrate/20131016162128_remove_question_id_from_element.rb +1 -1
  291. data/db/migrate/20140623153424_create_fe_people.rb +1 -1
  292. data/db/migrate/20140624180246_create_fe_addresses.rb +1 -1
  293. data/db/migrate/20140624182216_create_fe_phone_numbers.rb +1 -1
  294. data/db/migrate/20140625160545_create_fe_users.rb +1 -1
  295. data/db/migrate/20140808202507_add_conditional_type_to_elements.rb +1 -1
  296. data/db/migrate/20140808203609_add_conditional_answer_to_elements.rb +1 -1
  297. data/db/migrate/20141103204704_remove_short_value_column.rb +1 -1
  298. data/db/migrate/20141109154522_move_conditional_ids_used_for_choice_field_to_their_own_column.rb +1 -1
  299. data/db/migrate/20150504221439_add_all_element_ids_to_pages.rb +1 -1
  300. data/db/migrate/20150713022326_add_locale_columns.rb +1 -1
  301. data/db/migrate/20150714220730_add_locale_to_answer_sheet.rb +1 -1
  302. data/db/migrate/20150925181652_add_share_to_elements.rb +5 -0
  303. data/db/migrate/20150928085325_change_pages_all_element_ids_to_text.rb +1 -1
  304. data/db/migrate/20150930191538_add_locale_to_reference_sheets.rb +1 -1
  305. data/db/migrate/20151021181928_switch_conditional_answer_separator_to_semicolon.rb +7 -0
  306. data/db/migrate/20151021184250_add_question_sheet_id_in_refs.rb +12 -0
  307. data/db/migrate/20160201185838_add_visible_and_visibility_cache_key_to_reference_sheets.rb +6 -0
  308. data/db/migrate/20160805221415_add_rating_extra_labels.rb +10 -0
  309. data/db/migrate/20181108201746_create_versions.rb +80 -0
  310. data/db/migrate/20181218201130_increase_slug_length.rb +5 -0
  311. data/lib/fe/engine.rb +10 -10
  312. data/lib/fe/version.rb +1 -1
  313. data/lib/fe.rb +7 -1
  314. data/spec/controllers/fe/admin/elements_controller_spec.rb +30 -20
  315. data/spec/controllers/fe/admin/email_templates_controller_spec.rb +2 -2
  316. data/spec/controllers/fe/admin/question_pages_controller_spec.rb +1 -1
  317. data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +4 -4
  318. data/spec/controllers/fe/answer_pages_controller_spec.rb +86 -30
  319. data/spec/controllers/fe/answer_sheets_controller_spec.rb +65 -9
  320. data/spec/dummy/app/assets/config/manifest.js +0 -0
  321. data/spec/dummy/app/models/user.rb +1 -1
  322. data/spec/dummy/app/views/layouts/application.html.erb +2 -2
  323. data/spec/dummy/config/application.rb +1 -0
  324. data/spec/dummy/config/environments/test.rb +3 -3
  325. data/spec/dummy/config/initializers/assets.rb +5 -2
  326. data/spec/dummy/config/initializers/fast_gettext.rb +1 -1
  327. data/spec/dummy/config/initializers/to_unsafe_h.rb +5 -0
  328. data/spec/dummy/config/initializers/to_unsafe_h.rb.new +5 -0
  329. data/spec/dummy/db/migrate/20141203214017_core.fe_engine.rb +23 -23
  330. data/spec/dummy/db/migrate/20141203214018_create_reference_sheets.fe_engine.rb +1 -1
  331. data/spec/dummy/db/migrate/20141203214019_add_element_and_answer_fields.fe_engine.rb +3 -3
  332. data/spec/dummy/db/migrate/20141203214020_create_email_templates.fe_engine.rb +2 -2
  333. data/spec/dummy/db/migrate/20141203214021_add_max_lengths.fe_engine.rb +1 -1
  334. data/spec/dummy/db/migrate/20141203214022_create_join_table.fe_engine.rb +1 -1
  335. data/spec/dummy/db/migrate/20141203214023_remove_question_id_from_element.fe_engine.rb +1 -1
  336. data/spec/dummy/db/migrate/20141203214024_create_fe_people.fe_engine.rb +1 -1
  337. data/spec/dummy/db/migrate/20141203214025_create_fe_addresses.fe_engine.rb +1 -1
  338. data/spec/dummy/db/migrate/20141203214027_create_fe_users.fe_engine.rb +1 -1
  339. data/spec/dummy/db/migrate/20141203214028_add_conditional_type_to_elements.fe_engine.rb +1 -1
  340. data/spec/dummy/db/migrate/20141203214029_add_conditional_answer_to_elements.fe_engine.rb +1 -1
  341. data/spec/dummy/db/migrate/20141203214030_remove_short_value_column.fe_engine.rb +1 -1
  342. data/spec/dummy/db/migrate/20141203214031_move_conditional_ids_used_for_choice_field_to_their_own_column.fe_engine.rb +1 -1
  343. data/spec/dummy/db/migrate/20150123215803_create_users.rb +1 -1
  344. data/spec/dummy/db/migrate/20150504222619_add_all_element_ids_to_pages.fe_engine.rb +1 -1
  345. data/spec/dummy/db/migrate/20150925192557_add_share_to_elements.fe_engine.rb +6 -0
  346. data/spec/dummy/db/migrate/20150930190001_create_fe_phone_numbers.fe_engine.rb +1 -1
  347. data/spec/dummy/db/migrate/20150930190002_add_locale_columns.fe_engine.rb +1 -1
  348. data/spec/dummy/db/migrate/20150930190003_add_locale_to_answer_sheet.fe_engine.rb +1 -1
  349. data/spec/dummy/db/migrate/20150930190004_change_pages_all_element_ids_to_text.fe_engine.rb +1 -1
  350. data/spec/dummy/db/migrate/20150930191756_add_locale_to_reference_sheets.fe_engine.rb +1 -1
  351. data/spec/dummy/db/migrate/20151021190027_add_question_sheet_id_in_refs.fe_engine.rb +13 -0
  352. data/spec/dummy/db/migrate/20160204164612_switch_conditional_answer_separator_to_semicolon.fe_engine.rb +8 -0
  353. data/spec/dummy/db/migrate/20160204164613_add_visible_and_visibility_cache_key_to_reference_sheets.fe_engine.rb +7 -0
  354. data/spec/dummy/db/migrate/20181108201746_create_versions.rb +80 -0
  355. data/spec/dummy/db/schema.rb +71 -79
  356. data/spec/dummy/log/test.log +101278 -419
  357. data/spec/factories/answer_sheet_question_sheets.rb +1 -1
  358. data/spec/factories/answer_sheets.rb +2 -2
  359. data/spec/factories/answers.rb +1 -1
  360. data/spec/factories/applications.rb +3 -3
  361. data/spec/factories/dummy_applications.rb +3 -3
  362. data/spec/factories/dummy_people.rb +3 -3
  363. data/spec/factories/dummy_users.rb +3 -3
  364. data/spec/factories/elements.rb +21 -21
  365. data/spec/factories/email_templates.rb +3 -3
  366. data/spec/factories/fe_addresses.rb +10 -10
  367. data/spec/factories/fe_email_addresses.rb +3 -3
  368. data/spec/factories/fe_email_templates.rb +4 -4
  369. data/spec/factories/fe_people.rb +5 -5
  370. data/spec/factories/fe_phone_numbers.rb +3 -3
  371. data/spec/factories/fe_user.rb +3 -3
  372. data/spec/factories/page.rb +1 -1
  373. data/spec/factories/page_elements.rb +1 -1
  374. data/spec/factories/paragraphs.rb +1 -1
  375. data/spec/factories/question_sheet.rb +2 -2
  376. data/spec/factories/reference_questions.rb +1 -1
  377. data/spec/factories/reference_sheets.rb +1 -1
  378. data/spec/jobs/fe/update_reference_sheet_visibility_job_spec.rb +40 -0
  379. data/spec/models/fe/answer_sheet_question_sheet_spec.rb +1 -1
  380. data/spec/models/fe/answer_spec.rb +2 -2
  381. data/spec/models/fe/application_spec.rb +94 -1
  382. data/spec/models/fe/choice_field_spec.rb +47 -1
  383. data/spec/models/fe/condition_spec.rb +2 -2
  384. data/spec/models/fe/element_spec.rb +252 -60
  385. data/spec/models/fe/email_template_spec.rb +1 -1
  386. data/spec/models/fe/page_element_spec.rb +1 -1
  387. data/spec/models/fe/page_spec.rb +57 -12
  388. data/spec/models/fe/person_spec.rb +1 -1
  389. data/spec/models/fe/question_set_spec.rb +91 -0
  390. data/spec/models/fe/question_sheet_spec.rb +11 -15
  391. data/spec/models/fe/question_spec.rb +73 -6
  392. data/spec/models/fe/reference_question_spec.rb +20 -0
  393. data/spec/models/fe/reference_sheet_spec.rb +287 -4
  394. data/spec/models/fe/text_field_spec.rb +22 -0
  395. data/spec/rails_helper.rb +79 -76
  396. metadata +195 -57
  397. data/app/assets/javascripts/fe/jquery.scrollTo-min.js +0 -7
  398. data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +0 -84
  399. data/app/models/fe/concerns/answer_sheet_concern.rb +0 -85
  400. data/spec/dummy/db/migrate/20141203214026_create_create_fe_phone_numbers.fe_engine.rb +0 -17
  401. data/spec/dummy/log/development.log +0 -5
  402. /data/app/{assets/stylesheets/360front.css → views.current/fe/admin/elements/reorder.js.erb} +0 -0
@@ -1,4 +1,95 @@
1
1
  require 'rails_helper'
2
2
 
3
3
  describe Fe::QuestionSet do
4
+ let(:app) { create(:application) }
5
+ let(:app2) { create(:application) }
6
+
7
+ before do
8
+ @page = create(:page)
9
+ @el_confidential = create(:text_field_element, label: 'conf1', is_confidential: true, share: true)
10
+ @el_visible = create(:text_field_element, label: 'vis1', is_confidential: false, share: false)
11
+ @el_confidential2 = create(:text_field_element, label: 'conf2', is_confidential: true, share: true)
12
+ @el_visible2 = create(:text_field_element, label: 'vis2', is_confidential: false, share: true)
13
+ @page.elements << @el_confidential << @el_visible << @el_confidential2 << @el_visible2
14
+ @question_set = Fe::QuestionSet.new(@page.elements, app)
15
+ end
16
+
17
+ it 'should filter default show' do
18
+ # filter out confidential questions and questions with share flag (the share flag would likely
19
+ # never be used to filter, but just to test that it will only filter those that match all the
20
+ # filter methods)
21
+ @question_set.set_filter(filter_default: :show, filter: [ :is_confidential, :share ])
22
+ expect(@question_set.elements).to eq([@el_visible, @el_visible2])
23
+ end
24
+
25
+ it 'should filter default hide' do
26
+ # show only confidential questions and questions with share flag (the share flag would likely
27
+ # never be used to filter, but just to test that it will only filter those that match all the
28
+ # filter methods)
29
+ @question_set.set_filter(filter_default: :hide, filter: [ :is_confidential, :share ])
30
+ expect(@question_set.elements).to eq([@el_confidential, @el_confidential2])
31
+ end
32
+
33
+ context 'saving answers (#post then #save)' do
34
+ it 'saves a new value' do
35
+ @question_set.post({ @el_visible.id => 'a text response' }, app)
36
+ @question_set.save
37
+ expect(Fe::Answer.count).to eq(1)
38
+ expect(Fe::Answer.first.value).to eq('a text response')
39
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
40
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
41
+ end
42
+ it 'replaces an existing answer' do
43
+ create(:answer, value: 'a text response', answer_sheet: app, question: @el_visible)
44
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
45
+ @question_set.post({ @el_visible.id => 'an updated response' }, app)
46
+ @question_set.save
47
+ expect(Fe::Answer.count).to eq(1)
48
+ expect(Fe::Answer.first.value).to eq('an updated response')
49
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
50
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
51
+ end
52
+ it "doesn't save empty strings continually" do
53
+ create(:answer, value: '', answer_sheet: app, question: @el_visible)
54
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
55
+ @question_set.post({ @el_visible.id => '' }, app)
56
+ @question_set.save
57
+ expect(Fe::Answer.count).to eq(1)
58
+ expect(Fe::Answer.first.value).to eq('')
59
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
60
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
61
+ end
62
+ it 'saves multiple values' do
63
+ @el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
64
+ create(:answer, value: 'choice 1', answer_sheet: app, question: @el_visible)
65
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
66
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1', '1' => 'choice 2' } }, app)
67
+ @question_set.save
68
+ expect(Fe::Answer.count).to eq(2)
69
+ expect(Fe::Answer.first.value).to eq('choice 1')
70
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
71
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
72
+ expect(Fe::Answer.second.value).to eq('choice 2')
73
+ expect(Fe::Answer.second.answer_sheet_id).to eq(app.id)
74
+ expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
75
+ end
76
+ it 'saves the same value for different answer sheets' do
77
+ @el_visible.update(kind: 'Fe::ChoiceField', style: 'checkbox', content: "choice 1\nchoice 2")
78
+ @question_set = Fe::QuestionSet.new(@page.elements, app) # need this to reload the elements in the question set to get the new answer
79
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app)
80
+ @question_set.save
81
+ @question_set = Fe::QuestionSet.new(@page.elements, app2) # need this to save answers to app2
82
+ $b = true
83
+ @question_set.post({ @el_visible.id => { '0' => 'choice 1' } }, app2)
84
+ @question_set.save
85
+ $b = false
86
+ expect(Fe::Answer.count).to eq(2)
87
+ expect(Fe::Answer.first.value).to eq('choice 1')
88
+ expect(Fe::Answer.first.answer_sheet_id).to eq(app.id)
89
+ expect(Fe::Answer.first.question_id).to eq(@el_visible.id)
90
+ expect(Fe::Answer.second.value).to eq('choice 1')
91
+ expect(Fe::Answer.second.answer_sheet_id).to eq(app2.id)
92
+ expect(Fe::Answer.second.question_id).to eq(@el_visible.id)
93
+ end
94
+ end
4
95
  end
@@ -1,24 +1,11 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::QuestionSheet do
3
+ describe Fe::QuestionSheet, type: :model do
4
4
  it { expect have_many :pages }
5
5
  it { expect have_many :answer_sheets }
6
6
  it { expect validate_presence_of :label }
7
7
  it { expect validate_uniqueness_of :label }
8
8
 
9
- context '#questions_count' do
10
- it 'should count elements in a grid' do
11
- s = create(:question_sheet)
12
- p = create(:page, question_sheet: s)
13
- e = create(:question_grid)
14
- create(:page_element, page: p, element: e)
15
- create(:text_field_element, question_grid: e)
16
- create(:section, question_grid: e) # this shouldn't get counted
17
- p.reload # get the updated all_element_ids column
18
- expect(s.questions_count).to eq(1)
19
- end
20
- end
21
-
22
9
  context '#all_elements' do
23
10
  it 'should return elements in the same order as the ids' do
24
11
  s = create(:question_sheet)
@@ -92,9 +79,18 @@ describe Fe::QuestionSheet do
92
79
  it 'should handle pages with no elements' do
93
80
  qs = create(:question_sheet)
94
81
  p = create(:page)
95
- qs.pages.reload
82
+ qs.pages << p
96
83
  expect(qs.all_elements).to eq([])
97
84
  end
85
+ it 'should handle pages with no elements with empty string for all_elements' do
86
+ qs = create(:question_sheet)
87
+ p = create(:page, all_element_ids: '')
88
+ p2 = create(:page, all_element_ids: '')
89
+ e = create(:text_field_element)
90
+ create(:page_element, page: p2, element: e)
91
+ qs.pages << p << p2
92
+ expect(qs.all_elements).to eq([e])
93
+ end
98
94
  end
99
95
 
100
96
  context '#elements' do
@@ -1,21 +1,88 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Question do
3
+ describe Fe::Question, type: :model do
4
4
  it { expect have_many :conditions }
5
5
  it { expect have_many :dependents }
6
6
  it { expect have_many :sheet_answers }
7
7
  it { expect belong_to :related_question_sheet }
8
-
8
+
9
9
  # it { expect validate_format_of :slug }
10
10
  # it { expect validate_length_of :slug }
11
11
  # it { expect validate_uniqueness_of :slug }
12
-
13
- describe '#default_label?' do
14
- it 'expect return true' do
12
+
13
+ describe '#default_label?' do
14
+ it 'expect return true' do
15
15
  question = Fe::Question.new
16
16
  #question.default_label?.expect be_true
17
17
  expect(question.default_label?).to eq(true)
18
18
  end
19
19
  end
20
-
20
+
21
+ context 'slug' do
22
+ let(:qs) { create(:question_sheet_with_pages) }
23
+ let(:page) { qs.pages.first }
24
+ let(:qs2) { create(:question_sheet_with_pages) }
25
+ let(:page2) { qs2.pages.first }
26
+ let(:e1) { create(:text_field_element, slug: 'test') }
27
+ let(:e2) { create(:text_field_element) }
28
+
29
+ before do
30
+ e1.pages << page
31
+ end
32
+
33
+ it "doesn't let the same slug be used in the question sheet" do
34
+ e2.pages << page
35
+ e2.slug = 'test'
36
+ e2.save
37
+ expect(e2.errors.full_messages.join(', ')).to include('Slug must be unique (within the question sheet)')
38
+ end
39
+ it "lets two elements with the same slug save on different sheets" do
40
+ e2.pages << page2
41
+ e2.slug = 'test'
42
+ expect(e2.save).to be true
43
+ end
44
+ end
45
+
46
+ context 'saving' do
47
+ let(:e) { create(:text_field_element) }
48
+ let(:app) { create(:text_field_element) }
49
+ let(:app2) { create(:text_field_element) }
50
+
51
+ before do
52
+ e.set_response('answer value', app)
53
+ end
54
+
55
+ context '#save_file' do
56
+ it ' checks that the answer sheet that calls set_response is the same one that calls save' do
57
+ expect {
58
+ e.save_file(app2, nil)
59
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
60
+ end
61
+ end
62
+
63
+ context '#delete_file' do
64
+ it ' checks that the answer sheet that calls set_response is the same one that calls delete' do
65
+ expect {
66
+ e.delete_file(app2, nil)
67
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
68
+ end
69
+
70
+ it 'deletes the given answer record' do
71
+ answer_sheet = create(:answer_sheet)
72
+ question = create(:attachment_field_element)
73
+ answer = create(:answer, attachment_file_name: 'test_file', answer_sheet: answer_sheet, question: question)
74
+ question.set_response('', answer_sheet)
75
+ question.delete_file(answer_sheet, answer)
76
+ expect{answer.reload}.to raise_error(ActiveRecord::RecordNotFound)
77
+ end
78
+ end
79
+
80
+ context '#save_response' do
81
+ it ' checks that the answer sheet that calls set_response is the same one that calls save' do
82
+ expect {
83
+ e.save_response(app2)
84
+ }.to raise_error(RuntimeError, "Trying to save answers to a different answer sheet than the one given in set_response")
85
+ end
86
+ end
87
+ end
21
88
  end
@@ -14,4 +14,24 @@ describe Fe::ReferenceQuestion do
14
14
  expect(ref.ptemplate).to eq("fe/reference_abc")
15
15
  end
16
16
  end
17
+
18
+ it 'resets the question_sheet_id for references not created' do
19
+ qs1 = create(:question_sheet)
20
+ reference_question = create(:reference_question, related_question_sheet_id: qs1.id)
21
+ reference_sheet = create(:reference_sheet, question: reference_question)
22
+ expect(reference_sheet.question_sheet_id).to eq(qs1.id)
23
+
24
+ # change question sheet on ref element, the reference_sheet's question sheet should change
25
+ qs2 = create(:question_sheet)
26
+ expect(reference_sheet.status).to eq('created')
27
+ reference_question.update_attribute(:related_question_sheet_id, qs2.id)
28
+ expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
29
+
30
+ # start the reference, then change question sheet on ref element,
31
+ # the reference_sheet's question sheet should not change
32
+ reference_sheet.update_attribute(:status, 'started')
33
+ qs3 = create(:question_sheet)
34
+ reference_question.update_attribute(:related_question_sheet_id, qs3.id)
35
+ expect(reference_sheet.reload.question_sheet_id).to eq(qs2.id)
36
+ end
17
37
  end
@@ -1,14 +1,14 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::ReferenceSheet do
4
- it { expect belong_to :question }
3
+ describe Fe::ReferenceSheet, type: :model do
4
+ it { expect belong_to :question }
5
5
  it { expect belong_to :applicant_answer_sheet }
6
6
  # it { expect validate_presence_of :first_name } # need to add started_at column
7
7
  # it { expect validate_presence_of :last_name } # need to add started_at column
8
8
  # it { expect validate_presence_of :phone } # need to add started_at column
9
9
  # it { expect validate_presence_of :email } # need to add started_at column
10
10
  # it { expect validate_presence_of :relationship } # need to add started_at column
11
-
11
+
12
12
  context '#access_key' do
13
13
  it 'should generate two different in the same second' do
14
14
  # there's a small chance the first and second access keys generated will be in different seconds
@@ -27,5 +27,288 @@ describe Fe::ReferenceSheet do
27
27
  a = create(:answer_sheet, applicant_id: p.id)
28
28
  r = create(:reference_sheet, applicant_answer_sheet: a)
29
29
  expect(r.applicant).to eq(a.applicant)
30
- end
30
+ end
31
+
32
+ it 'returns the user for applicant' do
33
+ p = create(:fe_person)
34
+ a = create(:answer_sheet, applicant_id: p.id)
35
+ r = create(:reference_sheet, applicant_answer_sheet: a)
36
+ expect(r.applicant).to eq(a.applicant)
37
+ end
38
+
39
+ context '#required?' do
40
+ it 'should return the opposite of required? when optional? is false' do
41
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
42
+ application = FactoryBot.create(:answer_sheet)
43
+ application.question_sheets << question_sheet
44
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
45
+ question_sheet.pages.first.elements << element
46
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
47
+ allow(reference).to receive(:optional?).and_return(false)
48
+ expect(reference.optional?).to be false
49
+ expect(reference.required?).to be true
50
+ end
51
+ it 'should return the opposite of required? when optional? is true' do
52
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
53
+ application = FactoryBot.create(:answer_sheet)
54
+ application.question_sheets << question_sheet
55
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
56
+ question_sheet.pages.first.elements << element
57
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
58
+ allow(reference).to receive(:optional?).and_return(true)
59
+ expect(reference.optional?).to be true
60
+ expect(reference.required?).to be false
61
+ end
62
+ it 'should return false when the element is not required' do
63
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
64
+ application = FactoryBot.create(:answer_sheet)
65
+ application.question_sheets << question_sheet
66
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: false)
67
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
68
+ expect(reference.required?).to be false
69
+ end
70
+ end
71
+
72
+ context '#optional?' do
73
+ it 'returns true when the ref question element is hidden from a yes/no choice_field' do
74
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
75
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?")
76
+ question_sheet.pages.reload
77
+ question_sheet.pages[3].elements << choice_field
78
+ element = FactoryBot.create(:reference_element, label: "Reference question here", choice_field_id: choice_field.id, required: true)
79
+ question_sheet.pages[3].elements << element
80
+
81
+ application = FactoryBot.create(:answer_sheet)
82
+ application.question_sheets << question_sheet
83
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
84
+
85
+ # make the answer to the conditional question 'no' so that the ref is not required (optional true)
86
+ choice_field.set_response("no", application)
87
+ choice_field.save_response(application)
88
+
89
+ expect(reference.optional?).to be true
90
+ end
91
+ it 'returns false when the ref question element is visible from a yes/no choice_field' do
92
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
93
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?")
94
+ question_sheet.pages.reload
95
+ question_sheet.pages[3].elements << choice_field
96
+ element = FactoryBot.create(:reference_element, label: "Reference question here", choice_field_id: choice_field.id, required: true)
97
+ question_sheet.pages[3].elements << element
98
+
99
+ question_sheet.pages[3].elements << choice_field
100
+ application = FactoryBot.create(:answer_sheet)
101
+ application.question_sheets << question_sheet
102
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
103
+
104
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
105
+ choice_field.set_response("yes", application)
106
+ choice_field.save_response(application)
107
+
108
+ expect(reference.optional?).to be false
109
+ end
110
+ it 'returns false when the ref question element is hidden from a conditional element' do
111
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
112
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_answer: "yes")
113
+ question_sheet.pages.reload
114
+ question_sheet.pages[3].elements << choice_field
115
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
116
+ question_sheet.pages[3].elements << element
117
+
118
+ application = FactoryBot.create(:answer_sheet)
119
+ application.question_sheets << question_sheet
120
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
121
+
122
+ # make the answer to the conditional question 'no' so that the ref is not required (optional true)
123
+ choice_field.set_response("no", application)
124
+ choice_field.save_response(application)
125
+
126
+ expect(reference.optional?).to be true
127
+ end
128
+ it 'returns false when the ref question element is visible from a conditional element' do
129
+ question_sheet = FactoryBot.create(:question_sheet_with_pages)
130
+ choice_field = FactoryBot.create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_answer: "yes")
131
+ question_sheet.pages.reload
132
+ question_sheet.pages[3].elements << choice_field
133
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true)
134
+ question_sheet.pages[3].elements << element
135
+
136
+ application = FactoryBot.create(:answer_sheet)
137
+ application.question_sheets << question_sheet
138
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
139
+
140
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
141
+ choice_field.set_response("yes", application)
142
+ choice_field.save_response(application)
143
+
144
+ expect(reference.optional?).to be false
145
+ end
146
+ end
147
+
148
+ it 'sets the question_sheet_id' do
149
+ element = FactoryBot.create(:reference_element, label: "Reference question here", required: true, related_question_sheet_id: 1)
150
+ application = FactoryBot.create(:answer_sheet)
151
+ reference = FactoryBot.create(:reference_sheet, applicant_answer_sheet: application, question: element)
152
+ expect(reference.question_sheet_id).to eq(1)
153
+ end
154
+
155
+ it 'starts out in created status' do
156
+ r = create(:reference_sheet)
157
+ expect(r.status).to eq('created')
158
+ end
159
+
160
+ context '#check_email_change' do
161
+ let(:qs) { create(:question_sheet) }
162
+ let(:ref_qs) { create(:question_sheet) }
163
+ let(:ref_tf) { create(:text_field_element) }
164
+ let(:q) { create(:reference_question, related_question_sheet: ref_qs) }
165
+ let(:applicant) { FactoryBot.create(:fe_person) }
166
+ let(:application) { FactoryBot.create(:answer_sheet, applicant_id: applicant.id) }
167
+ let(:r) { create(:reference_sheet, status: 'started', question: q, email_sent_at: 1.hour.ago, applicant_answer_sheet: application) }
168
+ let(:a) { create(:answer, value: 'test', answer_sheet_id: r.id, question: ref_tf) }
169
+
170
+ before do
171
+ ref_qs.pages << create(:page)
172
+ ref_qs.pages.first.elements << ref_tf
173
+ @access_key_before = r.access_key
174
+ @a = create(:answer, value: 'test', answer_sheet_id: r.id, question: ref_tf)
175
+ create(:fe_email_template, name: 'Reference Deleted', subject: 'Reference Deleted', content: "<a href='test'>reference deleted</a>")
176
+ end
177
+
178
+ it 'should reset the answers and access key if created' do
179
+ r.update_column(:status, 'created')
180
+ r.update_attribute(:email, 'a@b.com')
181
+ expect(r.access_key).to_not eq(@access_key_before)
182
+ expect(Fe::Answer.count).to eq(0)
183
+ end
184
+
185
+ it 'should reset the answers and access key if started' do
186
+ r.update_column(:status, 'started')
187
+ r.update_attribute(:email, 'a@b.com')
188
+ expect(r.access_key).to_not eq(@access_key_before)
189
+ expect(Fe::Answer.count).to eq(0)
190
+ end
191
+
192
+ it 'should not reset the answers and access key if completed' do
193
+ r.update_column(:status, 'completed')
194
+ r.update_attribute(:email, 'a@b.com')
195
+ expect(r.access_key).to eq(@access_key_before)
196
+ expect(Fe::Answer.count).to eq(1)
197
+ end
198
+
199
+ it 'should not reset the answers and access key if completed' do
200
+ r.update_column(:status, 'completed')
201
+ r.update_attribute(:email, 'a@b.com')
202
+ expect(r.access_key).to eq(@access_key_before)
203
+ expect(Fe::Answer.find_by(id: a.id)).to_not be_nil
204
+ end
205
+
206
+ it "doesn't delete the answers if allow_quiet_reference_email_changes is set " do
207
+ r.update_column(:status, 'started')
208
+ r.update_attribute(:email, 'a@b.com')
209
+ r.allow_quiet_reference_email_changes = true
210
+ expect(r.access_key).to_not eq(@access_key_before)
211
+ expect(Fe::Answer.count).to eq(0)
212
+ end
213
+ end
214
+
215
+ context do
216
+ let(:qs) { create(:question_sheet_with_pages) }
217
+ let(:qs2) { create(:question_sheet_with_pages) }
218
+ let(:p) { qs.pages.first }
219
+ let(:p2) { qs.pages.first }
220
+ let(:ref_el) { create(:reference_element) }
221
+ let(:ref_el2) { create(:reference_element) }
222
+ let(:ref_el3) { create(:reference_element) }
223
+ let(:app) { create(:application) }
224
+ let(:affecting_el) { create(:choice_field_element, label: "Is the reference required?", conditional_type: "Fe::Element", conditional_id: ref_el.id, conditional_answer: "yes") }
225
+ let(:ref_sheet) { create(:reference_sheet, question: ref_el, applicant_answer_sheet_id: app.id) }
226
+
227
+ before do
228
+ p.elements << affecting_el << ref_el
229
+ p2.elements << ref_el2
230
+ app.question_sheets << qs << qs2
231
+ end
232
+
233
+ context '#computed_visibility_cache_key' do
234
+ it 'returns a cache key that changes when the answers on visibility_affecting_element_ids changes' do
235
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
236
+ affecting_el.set_response('no', app)
237
+ affecting_el.save_response(app)
238
+
239
+ cache_key_before = ref_sheet.computed_visibility_cache_key
240
+
241
+ # make the answer to the conditional question 'yes' so that the ref is required (optional false)
242
+ sleep(1) # make sure the update_at for the answer is changed
243
+ affecting_el.set_response('yes', app)
244
+ affecting_el.save_response(app)
245
+ cache_key_after = ref_sheet.computed_visibility_cache_key
246
+
247
+ expect(cache_key_before).to_not eq(cache_key_after)
248
+ end
249
+ end
250
+
251
+ context '#update_visible' do
252
+ it "doesn't recompute the visibility if the cache key is the same" do
253
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
254
+ affecting_el.set_response('no', app)
255
+ affecting_el.save_response(app)
256
+ ref_sheet.update_visible
257
+
258
+ # call update_visible again, it shouldn't update anything because the cache
259
+ # key hasn't changed
260
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
261
+ expect(ref_el).to_not receive(:visible?)
262
+ ref_sheet.update_visible
263
+ end
264
+ it 'computes the visibility and sets the cache key if cache key is initially null' do
265
+ ref_sheet.update(visibility_cache_key: nil)
266
+
267
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
268
+ affecting_el.set_response('no', app)
269
+ affecting_el.save_response(app)
270
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
271
+ expect(ref_el).to receive(:visible?).and_return(true)
272
+ ref_sheet.update_visible
273
+ ref_sheet.reload
274
+ expect(ref_sheet.visible).to be true
275
+ expect(ref_sheet.visibility_cache_key).to_not be_nil
276
+ end
277
+ it 'computes the visibility and sets the cache key if the cache key changes' do
278
+ ref_sheet.update(visibility_cache_key: 'something')
279
+
280
+ # make the answer to the conditional question 'no' so that the ref is required (optional false)
281
+ affecting_el.set_response('no', app)
282
+ affecting_el.save_response(app)
283
+ allow(ref_sheet).to receive(:question).and_return(ref_el)
284
+ expect(ref_el).to receive(:visible?).and_return(false)
285
+ ref_sheet.update_visible
286
+ ref_sheet.reload
287
+ expect(ref_sheet.visible).to be false
288
+ expect(ref_sheet.visibility_cache_key).to_not eq('something')
289
+ end
290
+ end
291
+ end
292
+
293
+ context '#all_affecting_questions_answered' do
294
+ let(:p) { create(:fe_person) }
295
+ let(:a) { create(:answer_sheet, applicant_id: p.id) }
296
+ let(:ref_el) { create(:reference_element) }
297
+ let(:r) { create(:reference_sheet, question_id: ref_el.id, applicant_answer_sheet: a) }
298
+ let(:text_el) { create(:text_field_element) }
299
+
300
+ it 'returns true when all visibility affecting questions are answered' do
301
+ expect(r).to receive(:question).and_return(ref_el).twice
302
+ expect(ref_el).to receive(:visibility_affecting_questions).and_return([text_el])
303
+ text_el.set_response('some text response', a)
304
+ text_el.save_response(a)
305
+ expect(r.all_affecting_questions_answered).to be true
306
+ end
307
+
308
+ it 'returns false when not all visibility affecting questions are answered' do
309
+ expect(r).to receive(:question).and_return(ref_el).twice
310
+ expect(ref_el).to receive(:visibility_affecting_questions).and_return([text_el])
311
+ expect(r.all_affecting_questions_answered).to be false
312
+ end
313
+ end
31
314
  end
@@ -14,4 +14,26 @@ describe Fe::TextField do
14
14
  expect(text_field.ptemplate).to eq("fe/text_area_field")
15
15
  end
16
16
  end
17
+
18
+ it 'should match conditional_match' do
19
+ qs = create(:question_sheet)
20
+ app = create(:application)
21
+ app.question_sheets << qs
22
+ e = create(:text_field_element, conditional_answer: 'a;b', style: 'drop-down')
23
+ qs.pages << create(:page)
24
+ qs.pages.reload.first.elements << e
25
+ a = create(:answer, question_id: e.id, value: 'b', answer_sheet_id: app.id)
26
+ expect(e.conditional_match(app)).to be true
27
+ end
28
+
29
+ it "should not match conditional_match if the answer doesn't match" do
30
+ qs = create(:question_sheet)
31
+ app = create(:application)
32
+ app.question_sheets << qs
33
+ e = create(:text_field_element, conditional_answer: 'a;b', style: 'drop-down')
34
+ qs.pages << create(:page)
35
+ qs.pages.reload.first.elements << e
36
+ a = create(:answer, question_id: e.id, value: 'c', answer_sheet_id: app.id)
37
+ expect(e.conditional_match(app)).to_not be true
38
+ end
17
39
  end