fe 0.0.4 → 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 (456) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +4 -4
  3. data/Rakefile +16 -36
  4. data/app/assets/config/fe/manifest.js +3 -0
  5. data/app/assets/config/manifest.js +3 -0
  6. data/app/assets/javascripts/application.js.erb +1 -1
  7. data/app/assets/javascripts/fe/admin.js +0 -2
  8. data/app/assets/javascripts/fe/fe.admin.js +40 -20
  9. data/app/assets/javascripts/fe/fe.common.js.erb +98 -0
  10. data/app/assets/javascripts/fe/fe.public.js +2 -416
  11. data/app/assets/javascripts/fe/fe.public.nojquery.js.erb +526 -0
  12. data/app/assets/javascripts/fe/jquery.html5_upload.js +258 -0
  13. data/app/assets/javascripts/fe/jquery.validate.pack.js +3 -15
  14. data/app/assets/stylesheets/fe/fe.screen.css.scss.erb +90 -10
  15. data/app/assets/stylesheets/fe/validation.css +5 -1
  16. data/app/controllers/concerns/fe/admin/question_sheets_controller_concern.rb +111 -0
  17. data/app/controllers/concerns/fe/answer_pages_controller_concern.rb +131 -0
  18. data/app/controllers/{fe/concerns → concerns/fe}/answer_sheets_controller_concern.rb +15 -7
  19. data/app/controllers/{fe/concerns → concerns/fe}/application_controller_concern.rb +15 -2
  20. data/app/controllers/fe/admin/elements_controller.rb +102 -64
  21. data/app/controllers/fe/admin/email_templates_controller.rb +7 -7
  22. data/app/controllers/fe/admin/question_pages_controller.rb +9 -9
  23. data/app/controllers/fe/admin/question_sheets_controller.rb +2 -103
  24. data/app/controllers/fe/reference_pages_controller.rb +11 -11
  25. data/app/controllers/fe/reference_sheets_controller.rb +6 -4
  26. data/app/controllers/fe/references_controller.rb +20 -19
  27. data/app/controllers/fe/submit_pages_controller.rb +5 -5
  28. data/app/helpers/fe/answer_pages_helper.rb +1 -1
  29. data/app/helpers/fe/application_helper.rb +8 -3
  30. data/app/jobs/fe/update_reference_sheet_visibility_job.rb +11 -0
  31. data/app/mailers/fe/notifier.rb +12 -5
  32. data/app/models/answer_sheet.rb +2 -0
  33. data/app/models/application_record.rb +3 -0
  34. data/app/models/{fe/concerns → concerns/fe}/answer_concern.rb +2 -2
  35. data/app/models/{fe/concerns → concerns/fe}/answer_pages_presenter_concern.rb +15 -5
  36. data/app/models/concerns/fe/answer_sheet_concern.rb +125 -0
  37. data/app/models/{fe/concerns → concerns/fe}/choice_field_concern.rb +56 -31
  38. data/app/models/fe/address.rb +2 -2
  39. data/app/models/fe/answer.rb +1 -1
  40. data/app/models/fe/answer_sheet.rb +1 -1
  41. data/app/models/fe/answer_sheet_question_sheet.rb +2 -2
  42. data/app/models/fe/application.rb +15 -10
  43. data/app/models/fe/condition.rb +4 -4
  44. data/app/models/fe/date_field.rb +2 -2
  45. data/app/models/fe/element.rb +201 -45
  46. data/app/models/fe/email_address.rb +2 -2
  47. data/app/models/fe/email_template.rb +1 -1
  48. data/app/models/fe/page.rb +138 -31
  49. data/app/models/fe/page_element.rb +8 -3
  50. data/app/models/fe/page_link.rb +6 -3
  51. data/app/models/fe/paragraph.rb +1 -1
  52. data/app/models/fe/person.rb +16 -13
  53. data/app/models/fe/phone_number.rb +1 -1
  54. data/app/models/fe/question.rb +64 -44
  55. data/app/models/fe/question_grid.rb +16 -4
  56. data/app/models/fe/question_grid_with_total.rb +15 -0
  57. data/app/models/fe/question_set.rb +54 -14
  58. data/app/models/fe/question_sheet.rb +54 -19
  59. data/app/models/fe/reference_question.rb +9 -13
  60. data/app/models/fe/reference_sheet.rb +113 -54
  61. data/app/models/fe/state_chooser.rb +2 -2
  62. data/app/models/fe/text_field.rb +2 -2
  63. data/app/models/fe/user.rb +1 -1
  64. data/app/models/staff.rb +8 -6
  65. data/app/validators/email_validator.rb +11 -0
  66. data/app/views/fe/admin/elements/create.js.erb +4 -3
  67. data/app/views/fe/admin/elements/destroy.js.erb +1 -1
  68. data/app/views/fe/admin/elements/drop.js.erb +2 -1
  69. data/app/views/fe/admin/elements/duplicate.js.erb +2 -1
  70. data/app/views/fe/admin/elements/edit.js.erb +1 -1
  71. data/app/views/fe/admin/elements/error.js.erb +1 -1
  72. data/app/views/fe/admin/elements/new.js.erb +13 -6
  73. data/app/views/fe/admin/elements/update.js.erb +1 -1
  74. data/app/views/fe/admin/email_templates/_form.html.erb +3 -3
  75. data/app/views/fe/admin/email_templates/edit.html.erb +3 -3
  76. data/app/views/fe/admin/email_templates/index.html.erb +3 -3
  77. data/app/views/fe/admin/email_templates/new.html.erb +3 -3
  78. data/app/views/fe/admin/panels/_advanced_options.html.erb +16 -10
  79. data/app/views/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  80. data/app/views/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  81. data/app/views/fe/admin/panels/_common_fields.html.erb +18 -19
  82. data/app/views/fe/admin/panels/_condition.html.erb +1 -1
  83. data/app/views/fe/admin/panels/_insert.html.erb +25 -25
  84. data/app/views/fe/admin/panels/_nav_controls.html.erb +4 -4
  85. data/app/views/fe/admin/panels/_page.html.erb +2 -2
  86. data/app/views/fe/admin/panels/_pages_list.html.erb +3 -3
  87. data/app/views/fe/admin/panels/_prop_attachment_field.html.erb +2 -2
  88. data/app/views/fe/admin/panels/_prop_choice_field.html.erb +52 -24
  89. data/app/views/fe/admin/panels/_prop_date_field.html.erb +1 -1
  90. data/app/views/fe/admin/panels/_prop_element.html.erb +7 -14
  91. data/app/views/fe/admin/panels/_prop_page.html.erb +11 -6
  92. data/app/views/fe/admin/panels/_prop_paragraph.html.erb +38 -24
  93. data/app/views/fe/admin/panels/_prop_question_grid.html.erb +7 -2
  94. data/app/views/fe/admin/panels/_prop_question_grid_with_total.html.erb +2 -2
  95. data/app/views/fe/admin/panels/_prop_reference_question.html.erb +3 -3
  96. data/app/views/fe/admin/panels/_prop_section.html.erb +8 -2
  97. data/app/views/fe/admin/panels/_prop_sheet.html.erb +7 -4
  98. data/app/views/fe/admin/panels/_prop_text_field.html.erb +12 -12
  99. data/app/views/fe/admin/question_pages/_element.html.erb +16 -6
  100. data/app/views/fe/admin/question_pages/_element_show.html.erb +2 -2
  101. data/app/views/fe/admin/question_pages/_question_page.html.erb +4 -4
  102. data/app/views/fe/admin/question_pages/create.js.erb +3 -3
  103. data/app/views/fe/admin/question_pages/destroy.js.erb +3 -3
  104. data/app/views/fe/admin/question_pages/edit.js.erb +1 -1
  105. data/app/views/fe/admin/question_pages/error.js.erb +1 -1
  106. data/app/views/fe/admin/question_pages/show.js.erb +2 -2
  107. data/app/views/fe/admin/question_pages/show_panel.js.erb +1 -1
  108. data/app/views/fe/admin/question_pages/update.js.erb +1 -1
  109. data/app/views/fe/admin/question_sheets/edit.js.erb +1 -1
  110. data/app/views/fe/admin/question_sheets/error.js.erb +1 -1
  111. data/app/views/fe/admin/question_sheets/index.html.erb +8 -8
  112. data/app/views/fe/admin/question_sheets/new.html.erb +3 -3
  113. data/app/views/fe/admin/question_sheets/show.html.erb +5 -5
  114. data/app/views/fe/admin/question_sheets/update.js.erb +1 -1
  115. data/app/views/fe/answer_pages/_answer_page.html.erb +14 -14
  116. data/app/views/fe/answer_pages/_element.html.erb +25 -6
  117. data/app/views/fe/answer_pages/_page_name.html.erb +1 -0
  118. data/app/views/fe/answer_pages/show.html.erb +39 -0
  119. data/app/views/fe/answer_pages/update.js.erb +11 -3
  120. data/app/views/fe/answer_sheets/_answer_sheet.html.erb +6 -6
  121. data/app/views/fe/answer_sheets/_element.html.erb +55 -35
  122. data/app/views/fe/answer_sheets/_incomplete.html.erb +1 -1
  123. data/app/views/fe/answer_sheets/_page_link.html.erb +9 -7
  124. data/app/views/fe/answer_sheets/_pages_list.html.erb +4 -4
  125. data/app/views/fe/answer_sheets/_submit_to.html.erb +1 -0
  126. data/app/views/fe/answer_sheets/_title.html.erb +1 -1
  127. data/app/views/fe/answer_sheets/edit.html.erb +24 -24
  128. data/app/views/fe/answer_sheets/incomplete.js.erb +9 -3
  129. data/app/views/fe/answer_sheets/index.html.erb +3 -3
  130. data/app/views/fe/answer_sheets/show.html.erb +1 -1
  131. data/app/views/fe/applications/_logout.html.erb +1 -0
  132. data/app/views/fe/applications/show.html.erb +1 -0
  133. data/app/views/fe/questions/fe/_acceptance.html.erb +11 -10
  134. data/app/views/fe/questions/fe/_attachment_field.html.erb +133 -10
  135. data/app/views/fe/questions/fe/_checkbox_field.html.erb +34 -30
  136. data/app/views/fe/questions/fe/_country.html.erb +6 -6
  137. data/app/views/fe/questions/fe/_date_field.html.erb +5 -5
  138. data/app/views/fe/questions/fe/_date_field_mmyy.html.erb +8 -8
  139. data/app/views/fe/questions/fe/_drop_down_field.html.erb +7 -6
  140. data/app/views/fe/questions/fe/_paragraph.html.erb +1 -1
  141. data/app/views/fe/questions/fe/_question_grid.html.erb +21 -16
  142. data/app/views/fe/questions/fe/_question_grid_with_total.html.erb +25 -18
  143. data/app/views/fe/questions/fe/_questions.html.erb +11 -5
  144. data/app/views/fe/questions/fe/_radio_button_field.html.erb +42 -25
  145. data/app/views/fe/questions/fe/_rating.html.erb +57 -18
  146. data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -1
  147. data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -1
  148. data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -1
  149. data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -1
  150. data/app/views/fe/questions/fe/_reference_question.html.erb +44 -21
  151. data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -1
  152. data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -1
  153. data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -1
  154. data/app/views/fe/questions/fe/_section.html.erb +1 -1
  155. data/app/views/fe/questions/fe/_state_chooser.html.erb +6 -6
  156. data/app/views/fe/questions/fe/_text_area_field.html.erb +17 -6
  157. data/app/views/fe/questions/fe/_text_field.html.erb +7 -6
  158. data/app/views/fe/questions/fe/_yes_no.html.erb +8 -8
  159. data/app/views/fe/questions/fe/_yes_no_field.erb +12 -9
  160. data/app/views/fe/reference_pages/_reference.html.erb +15 -15
  161. data/app/views/fe/reference_pages/edit.html.erb +9 -9
  162. data/app/views/fe/reference_sheets/done.html.erb +2 -2
  163. data/app/views/fe/reference_sheets/not_found.html.erb +4 -4
  164. data/app/views/fe/references/edit.html.erb +6 -6
  165. data/app/views/fe/references/show.html.erb +8 -8
  166. data/app/views/fe/references/submit.js.erb +3 -3
  167. data/app/views/fe/submit_pages/_thankyou.html.erb +1 -1
  168. data/app/views/fe/submit_pages/edit.html.erb +12 -12
  169. data/app/views/fe/submit_pages/error.js.erb +1 -1
  170. data/app/views/fe/submit_pages/submit.js.erb +2 -2
  171. data/app/views/layouts/fe/_error_messages_for.html.erb +7 -0
  172. data/app/views/layouts/fe/application.html.erb +4 -5
  173. data/app/views/layouts/fe/fe_admin.html.erb +30 -0
  174. data/app/views.current/fe/admin/elements/_errors.html.erb +11 -0
  175. data/app/views.current/fe/admin/elements/create.js.erb +12 -0
  176. data/app/views.current/fe/admin/elements/destroy.js.erb +4 -0
  177. data/app/views.current/fe/admin/elements/drop.js.erb +3 -0
  178. data/app/views.current/fe/admin/elements/duplicate.js.erb +3 -0
  179. data/app/views.current/fe/admin/elements/edit.js.erb +4 -0
  180. data/app/views.current/fe/admin/elements/error.js.erb +4 -0
  181. data/app/views.current/fe/admin/elements/new.js.erb +17 -0
  182. data/app/views.current/fe/admin/elements/reorder.js.erb +0 -0
  183. data/app/views.current/fe/admin/elements/update.js.erb +9 -0
  184. data/app/views.current/fe/admin/email_templates/_form.html.erb +8 -0
  185. data/app/views.current/fe/admin/email_templates/edit.html.erb +13 -0
  186. data/app/views.current/fe/admin/email_templates/index.html.erb +20 -0
  187. data/app/views.current/fe/admin/email_templates/new.html.erb +11 -0
  188. data/app/views.current/fe/admin/panels/_advanced_options.html.erb +49 -0
  189. data/app/views.current/fe/admin/panels/_common_boolean_fields.html.erb +1 -0
  190. data/app/views.current/fe/admin/panels/_common_boolean_fields_default.html.erb +11 -0
  191. data/app/views.current/fe/admin/panels/_common_fields.html.erb +23 -0
  192. data/app/views.current/fe/admin/panels/_condition.html.erb +6 -0
  193. data/app/views.current/fe/admin/panels/_insert.html.erb +39 -0
  194. data/app/views.current/fe/admin/panels/_nav_controls.html.erb +6 -0
  195. data/app/views.current/fe/admin/panels/_page.html.erb +3 -0
  196. data/app/views.current/fe/admin/panels/_pages_list.html.erb +16 -0
  197. data/app/views.current/fe/admin/panels/_prop_attachment_field.html.erb +2 -0
  198. data/app/views.current/fe/admin/panels/_prop_choice_field.html.erb +74 -0
  199. data/app/views.current/fe/admin/panels/_prop_date_field.html.erb +7 -0
  200. data/app/views.current/fe/admin/panels/_prop_element.html.erb +23 -0
  201. data/app/views.current/fe/admin/panels/_prop_page.html.erb +26 -0
  202. data/app/views.current/fe/admin/panels/_prop_paragraph.html.erb +46 -0
  203. data/app/views.current/fe/admin/panels/_prop_question_grid.html.erb +28 -0
  204. data/app/views.current/fe/admin/panels/_prop_question_grid_with_total.html.erb +14 -0
  205. data/app/views.current/fe/admin/panels/_prop_reference_question.html.erb +12 -0
  206. data/app/views.current/fe/admin/panels/_prop_section.html.erb +8 -0
  207. data/app/views.current/fe/admin/panels/_prop_sheet.html.erb +20 -0
  208. data/app/views.current/fe/admin/panels/_prop_text_field.html.erb +20 -0
  209. data/app/views.current/fe/admin/question_pages/_element.html.erb +28 -0
  210. data/app/views.current/fe/admin/question_pages/_element_show.html.erb +10 -0
  211. data/app/views.current/fe/admin/question_pages/_errors.html.erb +10 -0
  212. data/app/views.current/fe/admin/question_pages/_question_page.html.erb +13 -0
  213. data/app/views.current/fe/admin/question_pages/create.js.erb +11 -0
  214. data/app/views.current/fe/admin/question_pages/destroy.js.erb +5 -0
  215. data/app/views.current/fe/admin/question_pages/edit.js.erb +3 -0
  216. data/app/views.current/fe/admin/question_pages/error.js.erb +4 -0
  217. data/app/views.current/fe/admin/question_pages/show.js.erb +9 -0
  218. data/app/views.current/fe/admin/question_pages/show_panel.js.erb +3 -0
  219. data/app/views.current/fe/admin/question_pages/update.js.erb +2 -0
  220. data/app/views.current/fe/admin/question_sheets/_errors.html.erb +11 -0
  221. data/app/views.current/fe/admin/question_sheets/edit.js.erb +3 -0
  222. data/app/views.current/fe/admin/question_sheets/error.js.erb +5 -0
  223. data/app/views.current/fe/admin/question_sheets/index.html.erb +41 -0
  224. data/app/views.current/fe/admin/question_sheets/new.html.erb +15 -0
  225. data/app/views.current/fe/admin/question_sheets/show.html.erb +27 -0
  226. data/app/views.current/fe/admin/question_sheets/update.js.erb +2 -0
  227. data/app/views.current/fe/answer_pages/_answer_page.html.erb +53 -0
  228. data/app/views.current/fe/answer_pages/_element.html.erb +32 -0
  229. data/app/views.current/fe/answer_pages/_page_name.html.erb +1 -0
  230. data/app/views.current/fe/answer_pages/show.html.erb +39 -0
  231. data/app/views.current/fe/answer_pages/update.js.erb +13 -0
  232. data/app/views.current/fe/answer_sheets/_answer_sheet.html.erb +26 -0
  233. data/app/views.current/fe/answer_sheets/_element.html.erb +74 -0
  234. data/app/views.current/fe/answer_sheets/_incomplete.html.erb +10 -0
  235. data/app/views.current/fe/answer_sheets/_page_link.html.erb +9 -0
  236. data/app/views.current/fe/answer_sheets/_pages_list.html.erb +11 -0
  237. data/app/views.current/fe/answer_sheets/_submit_to.html.erb +1 -0
  238. data/app/views.current/fe/answer_sheets/_title.html.erb +1 -0
  239. data/app/views.current/fe/answer_sheets/edit.html.erb +66 -0
  240. data/app/views.current/fe/answer_sheets/incomplete.js.erb +11 -0
  241. data/app/views.current/fe/answer_sheets/index.html.erb +18 -0
  242. data/app/views.current/fe/answer_sheets/send_reference_invite.js.erb +8 -0
  243. data/app/views.current/fe/answer_sheets/show.html.erb +13 -0
  244. data/app/views.current/fe/applications/_logout.html.erb +1 -0
  245. data/app/views.current/fe/applications/show.html.erb +1 -0
  246. data/app/views.current/fe/help/builder.html +33 -0
  247. data/app/views.current/fe/help/question_grid.html +18 -0
  248. data/app/views.current/fe/questions/fe/_acceptance.html.erb +14 -0
  249. data/app/views.current/fe/questions/fe/_attachment_field.html.erb +165 -0
  250. data/app/views.current/fe/questions/fe/_checkbox_field.html.erb +53 -0
  251. data/app/views.current/fe/questions/fe/_country.html.erb +7 -0
  252. data/app/views.current/fe/questions/fe/_date_field.html.erb +7 -0
  253. data/app/views.current/fe/questions/fe/_date_field_mmyy.html.erb +9 -0
  254. data/app/views.current/fe/questions/fe/_drop_down_field.html.erb +8 -0
  255. data/app/views.current/fe/questions/fe/_paragraph.html.erb +1 -0
  256. data/app/views.current/fe/questions/fe/_question_grid.html.erb +70 -0
  257. data/app/views.current/fe/questions/fe/_question_grid_with_total.html.erb +64 -0
  258. data/app/views.current/fe/questions/fe/_questions.html.erb +15 -0
  259. data/app/views.current/fe/questions/fe/_radio_button_field.html.erb +60 -0
  260. data/app/views.current/fe/questions/fe/_rating.html.erb +64 -0
  261. data/app/views.current/fe/questions/fe/_reference_discipler.html.erb +1 -0
  262. data/app/views.current/fe/questions/fe/_reference_friend.html.erb +1 -0
  263. data/app/views.current/fe/questions/fe/_reference_parent.html.erb +1 -0
  264. data/app/views.current/fe/questions/fe/_reference_peer.html.erb +1 -0
  265. data/app/views.current/fe/questions/fe/_reference_question.html.erb +61 -0
  266. data/app/views.current/fe/questions/fe/_reference_roommate.html.erb +1 -0
  267. data/app/views.current/fe/questions/fe/_reference_spiritual.html.erb +1 -0
  268. data/app/views.current/fe/questions/fe/_reference_staff.html.erb +1 -0
  269. data/app/views.current/fe/questions/fe/_section.html.erb +1 -0
  270. data/app/views.current/fe/questions/fe/_state_chooser.html.erb +7 -0
  271. data/app/views.current/fe/questions/fe/_text_area_field.html.erb +17 -0
  272. data/app/views.current/fe/questions/fe/_text_field.html.erb +9 -0
  273. data/app/views.current/fe/questions/fe/_yes_no.html.erb +17 -0
  274. data/app/views.current/fe/questions/fe/_yes_no_field.erb +20 -0
  275. data/app/views.current/fe/reference_pages/_reference.html.erb +31 -0
  276. data/app/views.current/fe/reference_pages/edit.html.erb +24 -0
  277. data/app/views.current/fe/reference_sheets/done.html.erb +2 -0
  278. data/app/views.current/fe/reference_sheets/not_found.html.erb +5 -0
  279. data/app/views.current/fe/reference_sheets/submitted.js.erb +1 -0
  280. data/app/views.current/fe/references/edit.html.erb +8 -0
  281. data/app/views.current/fe/references/send_invite.js.erb +7 -0
  282. data/app/views.current/fe/references/show.html.erb +18 -0
  283. data/app/views.current/fe/references/submit.js.erb +3 -0
  284. data/app/views.current/fe/submit_pages/_errors.html.erb +1 -0
  285. data/app/views.current/fe/submit_pages/_thankyou.html.erb +2 -0
  286. data/app/views.current/fe/submit_pages/edit.html.erb +36 -0
  287. data/app/views.current/fe/submit_pages/error.js.erb +1 -0
  288. data/app/views.current/fe/submit_pages/submit.js.erb +3 -0
  289. data/app/views.current/layouts/fe/_error_messages_for.html.erb +7 -0
  290. data/app/views.current/layouts/fe/application.html.erb +47 -0
  291. data/app/{views/layouts/fe/fe.admin.html.erb → views.current/layouts/fe/fe_admin.html.erb} +4 -4
  292. data/config/initializers/paper_trail.rb +3 -0
  293. data/config/routes.rb +3 -37
  294. data/db/migrate/20131003041856_core.rb +23 -23
  295. data/db/migrate/20131003044250_create_reference_sheets.rb +2 -1
  296. data/db/migrate/20131003044436_add_element_and_answer_fields.rb +3 -3
  297. data/db/migrate/20131003044518_create_email_templates.rb +2 -2
  298. data/db/migrate/20131003044621_add_max_lengths.rb +1 -1
  299. data/db/migrate/20131003044714_create_join_table.rb +1 -1
  300. data/db/migrate/20131016162128_remove_question_id_from_element.rb +1 -1
  301. data/db/migrate/20140623153424_create_fe_people.rb +2 -2
  302. data/db/migrate/20140624180246_create_fe_addresses.rb +2 -2
  303. data/db/migrate/{20140624182216_create_create_fe_phone_numbers.rb → 20140624182216_create_fe_phone_numbers.rb} +2 -2
  304. data/db/migrate/20140625160545_create_fe_users.rb +2 -2
  305. data/db/migrate/20140808202507_add_conditional_type_to_elements.rb +1 -1
  306. data/db/migrate/20140808203609_add_conditional_answer_to_elements.rb +1 -1
  307. data/db/migrate/20141103204704_remove_short_value_column.rb +1 -1
  308. data/db/migrate/20141109154522_move_conditional_ids_used_for_choice_field_to_their_own_column.rb +1 -1
  309. data/db/migrate/20150504221439_add_all_element_ids_to_pages.rb +5 -0
  310. data/db/migrate/20150713022326_add_locale_columns.rb +9 -0
  311. data/db/migrate/20150714220730_add_locale_to_answer_sheet.rb +5 -0
  312. data/db/migrate/20150925181652_add_share_to_elements.rb +5 -0
  313. data/db/migrate/20150928085325_change_pages_all_element_ids_to_text.rb +5 -0
  314. data/db/migrate/20150930191538_add_locale_to_reference_sheets.rb +5 -0
  315. data/db/migrate/20151021181928_switch_conditional_answer_separator_to_semicolon.rb +7 -0
  316. data/db/migrate/20151021184250_add_question_sheet_id_in_refs.rb +12 -0
  317. data/db/migrate/20160201185838_add_visible_and_visibility_cache_key_to_reference_sheets.rb +6 -0
  318. data/db/migrate/20160805221415_add_rating_extra_labels.rb +10 -0
  319. data/db/migrate/20181108201746_create_versions.rb +80 -0
  320. data/db/migrate/20181218201130_increase_slug_length.rb +5 -0
  321. data/lib/access_key_generator.rb +12 -0
  322. data/lib/distinct_distinct_patch.rb +20 -0
  323. data/lib/fe/engine.rb +26 -14
  324. data/lib/fe/version.rb +1 -1
  325. data/lib/fe.rb +11 -1
  326. data/spec/controllers/fe/admin/elements_controller_spec.rb +211 -1
  327. data/spec/controllers/fe/admin/email_templates_controller_spec.rb +26 -1
  328. data/spec/controllers/fe/admin/question_pages_controller_spec.rb +8 -1
  329. data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +48 -1
  330. data/spec/controllers/fe/answer_pages_controller_spec.rb +129 -1
  331. data/spec/controllers/fe/answer_sheets_controller_spec.rb +136 -1
  332. data/spec/controllers/fe/reference_pages_controller.rb +4 -0
  333. data/spec/controllers/fe/references_controller_spec.rb +4 -0
  334. data/spec/controllers/fe/submit_pages_controller_spec.rb +4 -0
  335. data/spec/dummy/app/assets/config/manifest.js +0 -0
  336. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  337. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  338. data/spec/dummy/app/models/application.rb +3 -0
  339. data/spec/dummy/app/models/person.rb +11 -0
  340. data/spec/dummy/app/models/user.rb +3 -0
  341. data/spec/dummy/app/views/layouts/application.html.erb +2 -2
  342. data/spec/dummy/config/application.rb +3 -1
  343. data/spec/dummy/config/database.yml +20 -17
  344. data/spec/dummy/config/environments/production.rb +1 -5
  345. data/spec/dummy/config/environments/test.rb +4 -2
  346. data/spec/dummy/config/initializers/assets.rb +5 -2
  347. data/spec/dummy/config/initializers/fast_gettext.rb +5 -0
  348. data/spec/dummy/config/initializers/to_unsafe_h.rb +5 -0
  349. data/spec/dummy/config/initializers/to_unsafe_h.rb.new +5 -0
  350. data/spec/dummy/config/secrets.yml +2 -2
  351. data/spec/dummy/db/migrate/20141203214017_core.fe_engine.rb +92 -0
  352. data/spec/dummy/db/migrate/20141203214018_create_reference_sheets.fe_engine.rb +25 -0
  353. data/spec/dummy/db/migrate/20141203214019_add_element_and_answer_fields.fe_engine.rb +11 -0
  354. data/spec/dummy/db/migrate/20141203214020_create_email_templates.fe_engine.rb +18 -0
  355. data/spec/dummy/db/migrate/20141203214021_add_max_lengths.fe_engine.rb +9 -0
  356. data/spec/dummy/db/migrate/20141203214022_create_join_table.fe_engine.rb +12 -0
  357. data/spec/dummy/db/migrate/20141203214023_remove_question_id_from_element.fe_engine.rb +10 -0
  358. data/spec/dummy/db/migrate/20141203214024_create_fe_people.fe_engine.rb +13 -0
  359. data/spec/dummy/db/migrate/20141203214025_create_fe_addresses.fe_engine.rb +21 -0
  360. data/spec/dummy/db/migrate/20141203214027_create_fe_users.fe_engine.rb +13 -0
  361. data/spec/dummy/db/migrate/20141203214028_add_conditional_type_to_elements.fe_engine.rb +6 -0
  362. data/spec/dummy/db/migrate/20141203214029_add_conditional_answer_to_elements.fe_engine.rb +6 -0
  363. data/spec/dummy/db/migrate/20141203214030_remove_short_value_column.fe_engine.rb +6 -0
  364. data/spec/dummy/db/migrate/20141203214031_move_conditional_ids_used_for_choice_field_to_their_own_column.fe_engine.rb +8 -0
  365. data/spec/dummy/db/migrate/20150123215803_create_users.rb +9 -0
  366. data/spec/dummy/db/migrate/20150504222619_add_all_element_ids_to_pages.fe_engine.rb +6 -0
  367. data/spec/dummy/db/migrate/20150925192557_add_share_to_elements.fe_engine.rb +6 -0
  368. data/spec/dummy/db/migrate/20150930190001_create_fe_phone_numbers.fe_engine.rb +20 -0
  369. data/spec/dummy/db/migrate/20150930190002_add_locale_columns.fe_engine.rb +10 -0
  370. data/spec/dummy/db/migrate/20150930190003_add_locale_to_answer_sheet.fe_engine.rb +6 -0
  371. data/spec/dummy/db/migrate/20150930190004_change_pages_all_element_ids_to_text.fe_engine.rb +6 -0
  372. data/spec/dummy/db/migrate/20150930191756_add_locale_to_reference_sheets.fe_engine.rb +6 -0
  373. data/spec/dummy/db/migrate/20151021190027_add_question_sheet_id_in_refs.fe_engine.rb +13 -0
  374. data/spec/dummy/db/migrate/20160204164612_switch_conditional_answer_separator_to_semicolon.fe_engine.rb +8 -0
  375. data/spec/dummy/db/migrate/20160204164613_add_visible_and_visibility_cache_key_to_reference_sheets.fe_engine.rb +7 -0
  376. data/spec/dummy/db/migrate/20181108201746_create_versions.rb +80 -0
  377. data/spec/dummy/db/schema.rb +91 -69
  378. data/spec/dummy/log/test.log +101278 -419
  379. data/spec/factories/answer_sheet_question_sheets.rb +1 -1
  380. data/spec/factories/answer_sheets.rb +2 -2
  381. data/spec/factories/answers.rb +1 -1
  382. data/spec/factories/applications.rb +3 -4
  383. data/spec/factories/dummy_applications.rb +6 -0
  384. data/spec/factories/dummy_people.rb +6 -0
  385. data/spec/factories/dummy_users.rb +6 -0
  386. data/spec/factories/elements.rb +35 -10
  387. data/spec/factories/email_templates.rb +5 -0
  388. data/spec/factories/fe_addresses.rb +10 -10
  389. data/spec/factories/fe_email_addresses.rb +3 -3
  390. data/spec/factories/fe_email_templates.rb +9 -0
  391. data/spec/factories/fe_people.rb +5 -7
  392. data/spec/factories/fe_phone_numbers.rb +3 -3
  393. data/spec/factories/fe_user.rb +6 -0
  394. data/spec/factories/page.rb +1 -1
  395. data/spec/factories/page_elements.rb +1 -1
  396. data/spec/factories/paragraphs.rb +1 -1
  397. data/spec/factories/question_sheet.rb +3 -3
  398. data/spec/factories/reference_questions.rb +1 -1
  399. data/spec/factories/reference_sheets.rb +9 -0
  400. data/spec/jobs/fe/update_reference_sheet_visibility_job_spec.rb +40 -0
  401. data/spec/mailers/fe/notifier_spec.rb +39 -0
  402. data/spec/models/fe/answer_sheet_question_sheet_spec.rb +1 -1
  403. data/spec/models/fe/answer_spec.rb +2 -2
  404. data/spec/models/fe/application_spec.rb +94 -1
  405. data/spec/models/fe/choice_field_spec.rb +66 -0
  406. data/spec/models/fe/condition_spec.rb +2 -2
  407. data/spec/models/fe/element_spec.rb +414 -37
  408. data/spec/models/fe/email_template_spec.rb +1 -1
  409. data/spec/models/fe/page_element_spec.rb +1 -1
  410. data/spec/models/fe/page_spec.rb +168 -11
  411. data/spec/models/fe/person_spec.rb +1 -1
  412. data/spec/models/fe/question_set_spec.rb +91 -0
  413. data/spec/models/fe/question_sheet_spec.rb +103 -1
  414. data/spec/models/fe/question_spec.rb +73 -6
  415. data/spec/models/fe/reference_question_spec.rb +20 -0
  416. data/spec/models/fe/reference_sheet_spec.rb +305 -2
  417. data/spec/models/fe/text_field_spec.rb +22 -0
  418. data/spec/rails_helper.rb +85 -54
  419. data/spec/support/choices.xml +6 -0
  420. metadata +310 -84
  421. data/app/assets/javascripts/fe/fe.common.js +0 -57
  422. data/app/assets/javascripts/fe/jquery.scrollTo-min.js +0 -7
  423. data/app/assets/javascripts/fe/rails.extra.js +0 -6
  424. data/app/controllers/fe/applications_controller.rb +0 -183
  425. data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +0 -83
  426. data/app/controllers/fe/payments_controller.rb +0 -184
  427. data/app/models/fe/concerns/answer_sheet_concern.rb +0 -55
  428. data/app/models/fe/payment.rb +0 -77
  429. data/app/models/fe/payment_question.rb +0 -22
  430. data/app/views/fe/admin/panels/_prop_payment_question.html.erb +0 -1
  431. data/app/views/fe/application/_logout.html.erb +0 -1
  432. data/app/views/fe/payment_pages/_credit.html.erb +0 -47
  433. data/app/views/fe/payment_pages/_mail.html.erb +0 -27
  434. data/app/views/fe/payment_pages/_payment.html.erb +0 -6
  435. data/app/views/fe/payment_pages/_staff.html.erb +0 -25
  436. data/app/views/fe/payment_pages/_staff_results.html.erb +0 -17
  437. data/app/views/fe/payment_pages/edit.html.erb +0 -75
  438. data/app/views/fe/payment_pages/staff_search.js.erb +0 -2
  439. data/app/views/fe/payments/_credit.html.erb +0 -47
  440. data/app/views/fe/payments/_errors.html.erb +0 -1
  441. data/app/views/fe/payments/_payment.html.erb +0 -13
  442. data/app/views/fe/payments/_staff.html.erb +0 -21
  443. data/app/views/fe/payments/_staff_results.html.erb +0 -18
  444. data/app/views/fe/payments/approve.js.erb +0 -3
  445. data/app/views/fe/payments/create.js.erb +0 -19
  446. data/app/views/fe/payments/destroy.js.erb +0 -7
  447. data/app/views/fe/payments/edit.html.erb +0 -56
  448. data/app/views/fe/payments/error.js.erb +0 -3
  449. data/app/views/fe/payments/no_access.html.erb +0 -7
  450. data/app/views/fe/payments/staff_search.js.erb +0 -1
  451. data/app/views/fe/payments/update.html.erb +0 -24
  452. data/app/views/fe/questions/fe/_payment_question.html.erb +0 -70
  453. data/db/migrate/20140828045339_create_payments.rb +0 -13
  454. data/spec/dummy/db/test.sqlite3 +0 -0
  455. data/spec/factories/payments.rb +0 -7
  456. data/spec/models/fe/payment_question_spec.rb +0 -65
@@ -1,107 +1,6 @@
1
1
  # QuestionSheets is used exclusively on the administration side to design a Questionniare
2
2
  # which can than be instantiated as an AnswerSheet for data capture on the front-end
3
-
4
3
  class Fe::Admin::QuestionSheetsController < ApplicationController
5
- before_filter :check_valid_user
6
- before_filter :get_question_sheet, :only => [:show, :archive, :unarchive, :destroy, :edit, :update, :duplicate]
7
- layout 'fe/fe.admin'
8
-
9
- # list of all questionnaires/forms to edit
10
- # GET /question_sheets
11
- def index
12
- @active_question_sheets = Fe::QuestionSheet.active.order('label')
13
- @archived_question_sheets = Fe::QuestionSheet.archived.order('label')
14
-
15
- respond_to do |format|
16
- format.html # index.rhtml
17
- format.xml { render :xml => @question_sheets.to_xml }
18
- end
19
- end
20
-
21
- def archive
22
- @question_sheet.update_attribute(:archived, true)
23
- redirect_to :back
24
- end
25
-
26
- def unarchive
27
- @question_sheet.update_attribute(:archived, false)
28
- redirect_to :back
29
- end
30
-
31
- def duplicate
32
- @question_sheet.duplicate
33
- redirect_to :back
34
- end
35
-
36
- # entry point: display form designer with page 1 and panels loaded
37
- # GET /question_sheets/1
38
- def show
39
- @all_pages = @question_sheet.pages
40
- @page = @all_pages[0]
41
-
42
- respond_to do |format|
43
- format.html # show.rhtml
44
- format.xml { render :xml => @question_sheet.to_xml }
45
- end
46
- end
47
-
48
- # create sheet with inital page, redirect to show
49
- # POST /question_sheets
50
- def create
51
- @question_sheet = Fe::QuestionSheet.new_with_page
52
-
53
- respond_to do |format|
54
- if @question_sheet.save
55
- format.html { redirect_to fe_admin_question_sheet_path(@question_sheet) }
56
- format.xml { head :created, :location => admin_question_sheet_path(@question_sheet) }
57
- else
58
- format.html { render :action => "new" }
59
- format.xml { render :xml => @question_sheet.errors.to_xml }
60
- end
61
- end
62
- end
63
-
64
-
65
- # display sheet properties panel
66
- # GET /question_sheets/1/edit
67
- def edit
68
-
69
- respond_to do |format|
70
- format.js
71
- end
72
- end
73
-
74
- # save changes to properties panel (label, language)
75
- # PUT /question_sheets/1
76
- def update
77
- params.require(:fe_question_sheet).permit!
78
-
79
- respond_to do |format|
80
- if @question_sheet.update_attributes(params[:fe_question_sheet])
81
- format.html { redirect_to fe_admin_question_sheet_path(@question_sheet) }
82
- format.js
83
- format.xml { head :ok }
84
- else
85
- format.html { render :action => "edit" }
86
- format.js { render :action => "error.rjs"}
87
- format.xml { render :xml => @question_sheet.errors.to_xml }
88
- end
89
- end
90
- end
91
-
92
- # mark sheet as destroyed
93
- # DELETE /question_sheets/1
94
- def destroy
95
- @question_sheet.destroy
96
-
97
- respond_to do |format|
98
- format.html { redirect_to fe_admin_question_sheets_path }
99
- format.xml { head :ok }
100
- end
101
- end
102
-
103
- protected
104
- def get_question_sheet
105
- @question_sheet = Fe::QuestionSheet.find(params[:id])
106
- end
4
+ include Fe::Admin::QuestionSheetsControllerConcern
107
5
  end
6
+
@@ -1,12 +1,12 @@
1
1
  # gather reference information from Applicant
2
2
  module Fe
3
3
  class ReferencePagesController < ApplicationController
4
- skip_before_filter :cas_filter
5
- skip_before_filter :authentication_filter
6
-
4
+ skip_before_action :cas_filter, raise: false
5
+ skip_before_action :authentication_filter, raise: false
6
+
7
7
  layout nil
8
-
9
- before_filter :setup
8
+
9
+ before_action :setup
10
10
 
11
11
  MONTHS_KNOWN_OPTIONS = [
12
12
  ["3 months", 3],
@@ -15,27 +15,27 @@ module Fe
15
15
  ["2 years", 24],
16
16
  ["3 or more years", 36]
17
17
  ]
18
-
18
+
19
19
  # Allow applicant to edit reference
20
20
  # /applications/1/reference_page/edit
21
21
  # js: provide a partial to replace the answer_sheets page area
22
22
  # html?: return a full page for editing reference independantly (after submission)
23
23
  def edit
24
24
  @references = @application.reference_sheets
25
-
25
+
26
26
  # NEXT: skipping all the fancy answer sheets stuff since all custom pages come after those
27
27
  @next_page = next_custom_page(@application, 'reference_page')
28
28
  end
29
-
29
+
30
30
  def update
31
31
  #update_references
32
32
  head :ok
33
33
  end
34
-
34
+
35
35
  private
36
36
  def setup
37
37
  @application = Application.find(params[:application_id])
38
- end
39
-
38
+ end
39
+
40
40
  end
41
41
  end
@@ -1,6 +1,8 @@
1
+ # TODO determine how this relates to Fe::ReferencesController and if we can delete one of the two
1
2
  class Fe::ReferenceSheetsController < Fe::AnswerSheetsController
2
- skip_before_filter :ssm_login_required, :login
3
- before_filter :edit_only, :except => [:edit]
3
+ skip_before_action :ssm_login_required, :login, raise: false
4
+ before_action :edit_only, except: [:edit]
5
+
4
6
  def edit
5
7
  @reference_sheet = @answer_sheet
6
8
  unless @answer_sheet
@@ -16,13 +18,13 @@ class Fe::ReferenceSheetsController < Fe::AnswerSheetsController
16
18
  @page = @presenter.pages.first
17
19
  render 'fe/answer_sheets/edit', layout: 'fe/application'
18
20
  end
19
-
21
+
20
22
  protected
21
23
  def get_answer_sheet
22
24
  @answer_sheet ||= Fe::ReferenceSheet.find_by_id_and_access_key(params[:id], params[:a])
23
25
  return false unless @answer_sheet
24
26
  end
25
-
27
+
26
28
  def edit_only
27
29
  return false
28
30
  end
@@ -1,49 +1,50 @@
1
1
  # for Reference completing answer sheet
2
+ # TODO determine how this relates to Fe::ReferenceSheetsController and if we can delete one of the two
2
3
  module Fe
3
4
  class ReferencesController < ApplicationController
4
- skip_before_filter :cas_filter
5
- skip_before_filter :authentication_filter
6
-
7
- before_filter :setup
8
-
5
+ skip_before_action :cas_filter, raise: false
6
+ skip_before_action :authentication_filter, raise: false
7
+
8
+ before_action :setup
9
+
9
10
  layout 'public'
10
11
 
11
12
  # AnswerSheet for reference to fill in
12
13
  # /applications/1/references/{token}
13
14
  def edit
14
15
  ref = Fe::ReferenceSheet.find_by_access_key(params[:id])
15
- redirect_to edit_fe_reference_sheet_path(ref, :a => params[:id])
16
+ redirect_to edit_fe_reference_sheet_path(ref, a: params[:id])
16
17
  end
17
18
 
18
19
  # final submission
19
20
  def submit
20
21
  @reference = @application.references.find(params[:id])
21
22
  @reference.submit!
22
-
23
+
23
24
  # Send Reference Thank You
24
25
  Fe::Notifier.notification(@reference.email,
25
- Fe.from_email,
26
- "Reference Thank You",
27
- {'reference_full_name' => @reference.name,
26
+ Fe.from_email,
27
+ "Reference Thank You",
28
+ {'reference_full_name' => @reference.name,
28
29
  'applicant_full_name' => @application.applicant.informal_full_name}).deliver
29
30
 
30
-
31
+
31
32
  # Send Reference Completion Notice
32
33
  Fe::Notifier.notification(@application.applicant.email,
33
- Fe.from_email,
34
- "Reference Complete",
35
- {'reference_full_name' => @reference.name,
34
+ Fe.from_email,
35
+ "Reference Complete",
36
+ {'reference_full_name' => @reference.name,
36
37
  'applicant_full_name' => @application.applicant.informal_full_name,
37
38
  'reference_submission_date' => @reference.submitted_at.strftime("%m/%d/%Y")}).deliver
38
-
39
+
39
40
  end
40
41
 
41
-
42
+
42
43
  def show
43
44
  @reference = @application.references.find_by_access_key(params[:id])
44
45
 
45
46
  if @reference.nil?
46
- render :action => :edit
47
+ render action: :edit
47
48
  else
48
49
  @answer_sheet = @reference
49
50
  @question_sheet = @answer_sheet.question_sheet
@@ -57,11 +58,11 @@ module Fe
57
58
  end
58
59
  end
59
60
  end
60
-
61
+
61
62
  def send_invite
62
63
  # Save references on page first
63
64
  #update_references
64
-
65
+
65
66
  @reference = Fe::ReferenceSheet.find(params[:id])
66
67
  send_reference_invite(@reference)
67
68
  end
@@ -1,14 +1,14 @@
1
1
  class Fe::SubmitPagesController < ApplicationController
2
2
 
3
- before_filter :setup
4
- skip_before_filter :get_answer_sheet
3
+ before_action :setup
4
+ skip_before_action :get_answer_sheet, raise: false
5
5
 
6
6
  layout nil
7
-
7
+
8
8
  def edit
9
9
  @next_page = next_custom_page(@application, 'submit_page')
10
10
  end
11
-
11
+
12
12
  # save any changes on the submit_page (for auto-save, no server-validation)
13
13
  def update
14
14
  head :ok
@@ -18,5 +18,5 @@ class Fe::SubmitPagesController < ApplicationController
18
18
 
19
19
  def setup
20
20
  @application = @answer_sheet = Fe.answer_sheet_class.constantize.find(params[:application_id]) unless @application
21
- end
21
+ end
22
22
  end
@@ -13,7 +13,7 @@ module Fe::AnswerPagesHelper
13
13
  def load_page_js(page_link)
14
14
  return '' if page_link.nil?
15
15
 
16
- %{$.fe.pageHandler.loadPage('#{page_link.dom_id}','#{page_link.load_path}')}
16
+ %{fe.pageHandler.loadPage('#{page_link.dom_id}','#{page_link.load_path}')}
17
17
  end
18
18
 
19
19
  end
@@ -37,12 +37,12 @@ module Fe
37
37
  end
38
38
 
39
39
  def tip(t)
40
- image_tag('fe/icons/question-balloon.png', :title => t, :class => 'tip')
40
+ image_tag('fe/icons/question-balloon.png', title: t, class: 'tip')
41
41
  end
42
42
 
43
43
  def spinner(extra = nil)
44
44
  e = extra ? "spinner_#{extra}" : 'spinner'
45
- image_tag('spinner.gif', :id => e, :style => 'display:none', :class => 'spinner')
45
+ image_tag('spinner.gif', id: e, style: 'display:none', class: 'spinner')
46
46
  end
47
47
 
48
48
  def link_to_function(name, *args, &block)
@@ -52,7 +52,12 @@ module Fe
52
52
  onclick = "#{"#{html_options[:onclick]}; " if html_options[:onclick]}#{function}; return false;"
53
53
  href = html_options[:href] || '#'
54
54
 
55
- content_tag(:a, name, html_options.merge(:href => href, :onclick => onclick))
55
+ content_tag(:a, name, html_options.merge(href: href, onclick: onclick))
56
+ end
57
+
58
+ def error_messages_for(model)
59
+ record = instance_variable_get(:"@#{(model.is_a?(ActiveRecord::Base) ? model.class : model).to_s.underscore}")
60
+ render "layouts/fe/error_messages_for", record: record
56
61
  end
57
62
  end
58
63
  end
@@ -0,0 +1,11 @@
1
+ class Fe::UpdateReferenceSheetVisibilityJob < ActiveJob::Base
2
+ def perform(answer_sheet, question_ids)
3
+ answer_sheet.question_sheets_all_reference_elements.each do |r|
4
+ if (r.visibility_affecting_element_ids & question_ids).any?
5
+ answer_sheet.all_references.where(question_id: r.id).each do |ref|
6
+ ref.update_visible
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -6,12 +6,19 @@ module Fe
6
6
  email_template = EmailTemplate.find_by_name(template_name)
7
7
 
8
8
  if email_template.nil?
9
- raise "Email Template #{template_name} could not be found"
9
+ raise "Email Template '#{template_name}' could not be found"
10
10
  else
11
- mail(:to => p_recipients,
12
- :from => p_from,
13
- :subject => Liquid::Template.parse(email_template.subject).render(template_params),
14
- :body => Liquid::Template.parse(email_template.content).render(template_params))
11
+ set_format = options.delete(:format)
12
+ mail({to: p_recipients,
13
+ from: p_from,
14
+ subject: Liquid::Template.parse(email_template.subject).render(template_params)}.merge(options)) do |format|
15
+ case set_format.to_s
16
+ when 'html'
17
+ format.html { render html: Liquid::Template.parse(email_template.content).render(template_params) }
18
+ else
19
+ format.text { render plain: Liquid::Template.parse(email_template.content).render(template_params) }
20
+ end
21
+ end
15
22
  @recipients = p_recipients
16
23
  @from = p_from
17
24
  @subject = Liquid::Template.parse(email_template.subject).render(template_params)
@@ -0,0 +1,2 @@
1
+ class AnswerSheet < ApplicationRecord
2
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -6,8 +6,8 @@ module Fe
6
6
  begin
7
7
  included do
8
8
 
9
- belongs_to :answer_sheet
10
- belongs_to :question, :class_name => "Element", :foreign_key => "question_id"
9
+ belongs_to :answer_sheet, optional: true
10
+ belongs_to :question, optional: true, class_name: "Element", foreign_key: "question_id"
11
11
 
12
12
  before_save :set_value_from_filename
13
13
  end
@@ -9,11 +9,11 @@ module Fe
9
9
  rescue ActiveSupport::Concern::MultipleIncludedBlocks
10
10
  end
11
11
 
12
- def initialize(controller, answer_sheets, a = nil, custom_pages = nil)
12
+ def initialize(controller, answer_sheets, a = nil, custom_pages = nil, show_hidden_pages = false)
13
13
  super(controller)
14
14
  @answer_sheets = Array.wrap(answer_sheets)
15
15
  @active_answer_sheet = @answer_sheets.first
16
- initialize_pages(@active_answer_sheet)
16
+ initialize_pages(@active_answer_sheet, show_hidden_pages)
17
17
 
18
18
  @page_links = page_list(@answer_sheets, a, custom_pages)
19
19
  end
@@ -48,6 +48,15 @@ module Fe
48
48
  link
49
49
  end
50
50
 
51
+ def prev_page
52
+ active_page_dom_id = active_page_link.dom_id
53
+
54
+ this_page = @page_links.find {|p| p.dom_id == active_page_dom_id}
55
+ index = @page_links.index(this_page)
56
+ return nil if index == 0
57
+ @page_links.at( index - 1 ) unless this_page.nil?
58
+ end
59
+
51
60
  def next_page
52
61
  active_page_dom_id = active_page_link.dom_id
53
62
 
@@ -63,10 +72,11 @@ module Fe
63
72
  end
64
73
  end
65
74
 
66
- def initialize_pages(answer_sheet)
75
+ def initialize_pages(answer_sheet, show_hidden_pages = false)
67
76
  @pages = []
68
77
  answer_sheet.question_sheets.each do |qs|
69
- qs.pages.visible.each do |page|
78
+ pages = show_hidden_pages ? qs.pages : qs.pages.visible
79
+ pages.each do |page|
70
80
  @pages << page
71
81
  end
72
82
  end
@@ -81,7 +91,7 @@ module Fe
81
91
  end
82
92
 
83
93
  def new_page_link(answer_sheet, page, a = nil)
84
- Fe::PageLink.new(page.label, edit_fe_answer_sheet_page_path(answer_sheet, page, :a => a), dom_page(answer_sheet, page), page) if page
94
+ Fe::PageLink.new(edit_fe_answer_sheet_page_path(answer_sheet, page, a: a), dom_page(answer_sheet, page), page) if page
85
95
  end
86
96
 
87
97
  protected
@@ -0,0 +1,125 @@
1
+ module Fe
2
+ module AnswerSheetConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ begin
6
+ included do
7
+ has_many :answer_sheet_question_sheets, foreign_key: 'answer_sheet_id', class_name: '::Fe::AnswerSheetQuestionSheet'
8
+ has_many :question_sheets, through: :answer_sheet_question_sheets, class_name: 'Fe::QuestionSheet'
9
+ has_many :answers, ->(answer_sheet) {
10
+ question_sheet_ids = answer_sheet.question_sheet_ids
11
+
12
+ if question_sheet_ids.any?
13
+ element_ids = Fe::Page.joins(:question_sheet).where(question_sheet_id: question_sheet_ids).pluck(:all_element_ids).compact
14
+ element_ids = element_ids.collect{ |e| e.split(',') }.flatten
15
+ end
16
+
17
+ unless question_sheet_ids.any? && element_ids.any?
18
+ # an answer sheet not assigned to a question sheet, or assigned to
19
+ # a question sheet with no elements should not return any answers
20
+ return where('false')
21
+ end
22
+
23
+ where('question_id' => element_ids)
24
+
25
+ }, foreign_key: 'answer_sheet_id', class_name: '::Fe::Answer'
26
+ has_many :reference_sheets, foreign_key: 'applicant_answer_sheet_id', class_name: 'Fe::ReferenceSheet'
27
+ has_many :payments, foreign_key: 'application_id', class_name: 'Fe::Payment'
28
+ end
29
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks
30
+ end
31
+
32
+ def languages
33
+ return [] unless question_sheets.first
34
+
35
+ unless @languages
36
+ @languages = question_sheets.first.languages
37
+ question_sheets[1..-1].each { |qs| @languages &= qs.languages.select(&:present?) }
38
+ end
39
+ @languages
40
+ end
41
+
42
+ def complete?
43
+ !completed_at.nil?
44
+ end
45
+
46
+ # answers for this sheet, grouped by question id
47
+ def answers_by_question
48
+ @answers_by_question ||= answers.group_by { |answer| answer.question_id }
49
+ end
50
+
51
+ # Convenience method if there is only one question sheet in your system
52
+ def question_sheet
53
+ question_sheets.first
54
+ end
55
+
56
+ def pages
57
+ Page.where(question_sheet_id: question_sheets.collect(&:id)).visible.order('number')
58
+ end
59
+
60
+ def completely_filled_out?
61
+ pages.all? {|p| p.complete?(self)}
62
+ end
63
+
64
+ def has_answer_for?(question_id)
65
+ !answers_by_question[question_id].nil?
66
+ end
67
+
68
+ def reference?
69
+ false
70
+ end
71
+
72
+ def percent_complete(required_only = true, restrict_to_pages = [])
73
+ # build an element to page lookup using page's cached all_element_ids
74
+ # this will make the hidden? calls on element faster because we can pass the page
75
+ # (the page builds a list of hidden elements for quick lookup)
76
+ elements_to_pages = {}
77
+ pages = question_sheets.collect(&:pages).flatten
78
+ pages = pages & restrict_to_pages if restrict_to_pages.present?
79
+ pages.each do |p|
80
+ p.all_element_ids_arr.each do |e_id|
81
+ elements_to_pages[e_id] = p
82
+ end
83
+ end
84
+
85
+ # determine which questions should count towards the questions total in the percent calculation
86
+ countable_questions = question_sheets.collect{ |qs| qs.all_elements.questions }.flatten
87
+ countable_questions.select!{ |e| elements_to_pages[e.id] } if restrict_to_pages.present?
88
+ countable_questions.reject!{ |e| e.hidden?(self, elements_to_pages[e.id]) }
89
+ countable_questions.select!{ |e| e.required } if required_only
90
+
91
+ # no progress if there are no questions
92
+ num_questions = countable_questions.length
93
+ return 0 if num_questions == 0
94
+
95
+ # count questions with answers in Fe::Answer
96
+ answers = self.answers.where("(question_id IN (?) AND value IS NOT NULL) AND (value != '')", countable_questions.collect(&:id))
97
+ answered_question_ids = answers.pluck(Arel.sql('distinct(question_id)'))
98
+
99
+ # need to look for answers for the remaining questions using has_response?
100
+ # so that questions with object_name/attribute_name set are counted
101
+ other_answered_questions = countable_questions.reject{ |e| answered_question_ids.include?(e.id) }
102
+ other_answered_questions.select!{ |e| e.has_response?(self) }
103
+
104
+ # count total
105
+ num_answers = answered_question_ids.count + other_answered_questions.count
106
+ [ [ (num_answers.to_f / num_questions.to_f * 100.0).to_i, 100 ].min, 0 ].max
107
+ end
108
+
109
+ def collat_title() "" end
110
+
111
+ def question_sheet_ids
112
+ question_sheets.collect(&:id)
113
+ end
114
+
115
+ def question_sheets_all_reference_elements
116
+ # forms are generally not changed often so caching on the last updated elementd
117
+ # will provide a good balance of speed and cache invalidation
118
+ element_ids = Rails.cache.fetch(question_sheets + ['answer_sheet#answer_sheet_all_reference_elements', Fe::Element.order('updated_at desc, id desc').first]) do
119
+ question_sheets.compact.collect { |q| q.all_elements.reference_kinds.pluck(:id) }.flatten
120
+ end
121
+
122
+ Fe::Element.find(element_ids)
123
+ end
124
+ end
125
+ end