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
@@ -0,0 +1,131 @@
1
+ module Fe::AnswerPagesControllerConcern
2
+ extend ActiveSupport::Concern
3
+
4
+ begin
5
+ included do
6
+ before_action :get_answer_sheet, only: [:show, :edit, :update, :save_file, :delete_file, :index]
7
+ before_action :set_quiet_reference_email_change, only: :update
8
+ skip_before_action :verify_authenticity_token, only: :save_file
9
+ end
10
+ rescue ActiveSupport::Concern::MultipleIncludedBlocks
11
+ end
12
+
13
+ def show
14
+ @presenter = Fe::AnswerPagesPresenter.new(self, @answer_sheet, params[:a], nil, true)
15
+ questions = @presenter.questions_for_page(params[:id])
16
+ questions.set_filter(get_filter)
17
+ @elements = questions.elements
18
+ @page = Fe::Page.find(params[:id]) || Fe::Page.find_by_number(1)
19
+ end
20
+
21
+ def edit
22
+ questions = @presenter.questions_for_page(params[:id])
23
+ questions.set_filter(get_filter)
24
+ @elements = questions.elements
25
+ @page = Fe::Page.find(params[:id]) || Fe::Page.find_by_number(1)
26
+
27
+ render partial: 'answer_page', locals: { show_first: nil }
28
+ end
29
+
30
+ # validate and save captured data for a given page
31
+ # PUT /answer_sheets/1/pages/1
32
+ def update
33
+ @page = Fe::Page.find(params[:id])
34
+ questions = @presenter.all_questions_for_page(params[:id])
35
+ questions.set_filter(get_filter)
36
+ questions.post(answer_params, @answer_sheet)
37
+ questions.save
38
+ Fe::UpdateReferenceSheetVisibilityJob.perform_later(@answer_sheet, questions.questions.collect(&:id))
39
+
40
+ @elements = questions.elements
41
+
42
+ # Save references
43
+
44
+ if params[:reference].present?
45
+ params[:reference].keys.each do |id|
46
+ reference_params = params.fetch(:reference)[id].permit(:relationship, :title, :first_name, :last_name, :phone, :email, :is_staff)
47
+
48
+ # The call to Application#reference_sheets is supposed to update the visibility cache and return the right references, but
49
+ # currently it does not do that right. It needs a reload to get the right list of references. I think this may be caused
50
+ # from a change in rails 5
51
+ @answer_sheet = answer_sheet_type.find(params[:answer_sheet_id]) # load a fresh instance of @answer_sheet
52
+ @answer_sheet.reference_sheets # this call seems to be necessary to build the right refs list
53
+ ref = @answer_sheet.reference_sheets.find(id)
54
+
55
+ # if the email address has changed, we have to trash the old reference answers
56
+ ref.attributes = reference_params
57
+ ref.save(validate: false)
58
+ end
59
+ end
60
+ @presenter.active_page = nil
61
+ @answer_sheet.update(locale: session[:locale])
62
+ set_saved_at_timestamp
63
+ respond_to do |format|
64
+ format.js
65
+ #format.html
66
+ end
67
+ end
68
+
69
+ def save_file
70
+ params.permit(:Filedata)
71
+ params.permit(:user_file) # jquery html5 uploader uses user_file; handle both as flash is fallback
72
+
73
+ if params[:Filedata] || params[:user_file]
74
+ @page = Fe::Page.find(params[:id])
75
+ @presenter.active_page = @page
76
+ question = Fe::Element.find(params[:question_id])
77
+ answer = Fe::Answer.where(answer_sheet_id: @answer_sheet.id, question_id: question.id).first
78
+ question.answers = [answer] if answer
79
+
80
+ @answer = question.save_file(@answer_sheet, params[:Filedata] || params[:user_file].first)
81
+ set_saved_at_timestamp
82
+
83
+ render action: :update
84
+ else
85
+ respond_to do |format|
86
+ format.js { head :ok }
87
+ end
88
+ end
89
+ end
90
+
91
+ def delete_file
92
+ @page = Fe::Page.find(params[:id])
93
+ @presenter.active_page = @page
94
+ question = Fe::Element.find(params[:question_id])
95
+ answer = Fe::Answer.where(answer_sheet_id: @answer_sheet.id, question_id: question.id).first
96
+ question.answers = [answer] if answer
97
+
98
+ @answer = question.delete_file(@answer_sheet, answer)
99
+ set_saved_at_timestamp
100
+
101
+ render action: :update
102
+ end
103
+
104
+ protected
105
+
106
+ def get_answer_sheet
107
+ @answer_sheet = answer_sheet_type.find(params[:answer_sheet_id])
108
+ @presenter = Fe::AnswerPagesPresenter.new(self, @answer_sheet, params[:a])
109
+ end
110
+
111
+ # extending classes can override this to set a questions filter
112
+ # see Fe::QuestionSet#set_filter for more details
113
+ def get_filter
114
+ end
115
+
116
+ def answer_sheet_type
117
+ (params[:answer_sheet_type] || Fe.answer_sheet_class || 'AnswerSheet').constantize
118
+ end
119
+
120
+ def answer_params
121
+ params.fetch(:answers, {}).permit!
122
+ end
123
+
124
+ def set_saved_at_timestamp
125
+ @saved_at_timestamp = [@answer_sheet.updated_at, @answer_sheet.answers.maximum(:updated_at)].compact.max
126
+ end
127
+
128
+ def set_quiet_reference_email_change
129
+ @answer_sheet.allow_quiet_reference_email_changes = true if @answer_sheet.is_a?(Fe::ReferenceSheet) && params[:a].present?
130
+ end
131
+ end
@@ -4,7 +4,7 @@ module Fe::AnswerSheetsControllerConcern
4
4
  begin
5
5
  included do
6
6
  layout 'fe/application'
7
- before_filter :get_answer_sheet, :only => [:edit, :show, :send_reference_invite, :submit]
7
+ before_action :get_answer_sheet, only: [:edit, :show, :send_reference_invite, :submit]
8
8
  end
9
9
  rescue ActiveSupport::Concern::MultipleIncludedBlocks
10
10
  end
@@ -22,7 +22,7 @@ module Fe::AnswerSheetsControllerConcern
22
22
  @question_sheet = Fe::QuestionSheet.find(params[:question_sheet_id])
23
23
  @answer_sheet = @question_sheet.answer_sheets.create
24
24
 
25
- redirect_to edit_answer_sheet_path(@answer_sheet)
25
+ redirect_to edit_fe_answer_sheet_path(@answer_sheet)
26
26
  end
27
27
 
28
28
  # display answer sheet for data capture (page 1)
@@ -31,9 +31,9 @@ module Fe::AnswerSheetsControllerConcern
31
31
  unless @presenter.active_answer_sheet.pages.present?
32
32
  flash[:error] = "Sorry, there are no questions for this form yet."
33
33
  if request.env["HTTP_REFERER"]
34
- redirect_to :back
34
+ redirect_back(fallback_location: '/')
35
35
  else
36
- render :text => "", :layout => true
36
+ render html: "", layout: true
37
37
  end
38
38
  else
39
39
  @elements = @presenter.questions_for_page(:first).elements
@@ -46,7 +46,9 @@ module Fe::AnswerSheetsControllerConcern
46
46
  @question_sheet = @answer_sheet.question_sheet
47
47
  pf = Fe.table_name_prefix
48
48
  @elements = @question_sheet.pages.collect {|p| p.elements.includes(:pages).order("#{pf}pages.number,#{pf}page_elements.position").all}.flatten
49
- @elements = Fe::QuestionSet.new(@elements, @answer_sheet).elements.group_by{ |e| e.pages.first }
49
+ questions = Fe::QuestionSet.new(@elements, @answer_sheet)
50
+ questions.set_filter(get_filter)
51
+ @elements = questions.elements.group_by{ |e| e.pages.find_by(id: @question_sheet.page_ids) }
50
52
  end
51
53
 
52
54
  def send_reference_invite(reference = nil)
@@ -54,10 +56,10 @@ module Fe::AnswerSheetsControllerConcern
54
56
  if params[:reference]
55
57
  reference_params = params.fetch(:reference)[@reference.id.to_s].permit(:relationship, :title, :first_name, :last_name, :phone, :email, :is_staff)
56
58
 
57
- @reference.update_attributes(reference_params)
59
+ @reference.update(reference_params)
58
60
  end
59
61
  if @reference.valid?
60
- @reference.send_invite
62
+ @reference.send_invite(request.host)
61
63
  end
62
64
  end
63
65
 
@@ -68,6 +70,12 @@ module Fe::AnswerSheetsControllerConcern
68
70
  end
69
71
 
70
72
  protected
73
+
74
+ # extending classes can override this to set a questions filter
75
+ # see Fe::QuesitonSet#set_filter for more details
76
+ def get_filter
77
+ end
78
+
71
79
  def answer_sheet_type
72
80
  return Fe::ReferenceSheet if params[:controller] == "fe/reference_sheets"
73
81
  (params[:answer_sheet_type] || Fe.answer_sheet_class || 'AnswerSheet').constantize
@@ -4,13 +4,14 @@ module Fe::ApplicationControllerConcern
4
4
  begin
5
5
  included do
6
6
  helper_method :fe_user
7
+ before_action :set_locale
7
8
  end
8
9
  rescue ActiveSupport::Concern::MultipleIncludedBlocks
9
10
  end
10
11
 
11
12
  def fe_user
12
13
  return nil unless current_user
13
- @fe_user ||= Fe::User.where(:user_id => current_user.id).first
14
+ @fe_user ||= Fe::User.where(user_id: current_user.id).first
14
15
  if @fe_user
15
16
  @fe_user.update_attribute(:last_login, Time.now)
16
17
  session[:login_stamped] = true
@@ -18,10 +19,22 @@ module Fe::ApplicationControllerConcern
18
19
  @fe_user
19
20
  end
20
21
 
22
+ def extract_locale_from_accept_language_header
23
+ request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE'].present?
24
+ end
25
+
26
+ def set_locale
27
+ session[:locale] = params[:locale] if params[:locale]
28
+ session[:locale] ||= extract_locale_from_accept_language_header || I18n.default_locale
29
+ if @answer_sheet
30
+ session[:locale] = I18n.default_locale unless @answer_sheet.languages.include?(session[:locale])
31
+ end
32
+ end
33
+
21
34
  def current_person
22
35
  #raise "no user" unless current_user
23
36
  return nil unless current_user
24
- current_user.fe_person || Fe::Person.create(:user_id => current_user.id)
37
+ current_user.fe_person || Fe::Person.create(user_id: current_user.id)
25
38
  end
26
39
 
27
40
  def check_valid_user
@@ -1,52 +1,52 @@
1
1
  class Fe::Admin::ElementsController < ApplicationController
2
- before_filter :check_valid_user
3
- layout 'fe/fe.admin'
4
-
5
- before_filter :get_page
6
-
7
- # GET /elements/1
8
- def show
9
- @element = Fe::Element.find(params[:id])
2
+ before_action :check_valid_user
3
+ layout 'fe/fe_admin'
10
4
 
11
- respond_to do |format|
12
- format.js
13
- end
14
- end
5
+ before_action :get_page
15
6
 
16
7
  # GET /element/1/edit
17
8
  def edit
18
- @element = Fe::Element.find(params[:id])
19
-
9
+ @element = @page.all_elements.find(params[:id])
10
+
20
11
  # for dependencies
21
12
  if @element.question?
22
13
  (3 - @element.conditions.length).times { @element.conditions.build }
23
- @questions_before_this = @page.questions_before_position(@element.position(@page))
14
+ @questions_before_this = @page.questions_before_position(@element.position(@page))
24
15
  end
25
-
16
+
26
17
  respond_to do |format|
27
18
  format.js
28
19
  end
29
20
  end
30
-
21
+
31
22
  def new
32
- @questions = params[:element_type].constantize.active.order('label')
23
+ @questions = params[:element_type].constantize.active.shared.order('label')
33
24
 
34
25
  @style = element_params[:style]
35
26
  if @style
36
- @questions = @questions.where(:style => @style).uniq
27
+ @questions = @questions.where(style: @style).to_a.uniq
37
28
  end
38
29
  end
39
-
30
+
40
31
  def use_existing
41
- @element = Fe::Element.find(params[:id])
32
+ @element = Fe::Element.find(params[:id]) # NOTE the enclosing app might want to override this method and check that they have access to the questionnaire that the existing element is used on
42
33
  # Don't put the same question on a questionnaire twice
43
34
  unless @page.question_sheet.elements.include?(@element)
44
- @page_element = Fe::PageElement.create(:element => @element, :page => @page)
35
+ @page_element = Fe::PageElement.create(element: @element, page: @page)
45
36
  end
46
37
  @question_sheet = @page.question_sheet
47
38
  render :create
48
39
  end
49
40
 
41
+ def copy_existing
42
+ @element = Fe::Element.find(params[:id]) # NOTE the enclosing app might want to override this method and check that they have access to the questionnaire that the existing element is used on
43
+ # duplicate the elements
44
+ @element = @element.duplicate(@page)
45
+ @element.update_attribute(:share, false)
46
+ @page_element = Fe::PageElement.where(element: @element, page: @page).first_or_create
47
+ render :create
48
+ end
49
+
50
50
  # POST /elements
51
51
  def create
52
52
  @element = params[:element_type].constantize.new(element_params)
@@ -54,24 +54,24 @@ class Fe::Admin::ElementsController < ApplicationController
54
54
  @question_sheet = @page.question_sheet
55
55
 
56
56
  respond_to do |format|
57
- if @element.save!
58
- @page_element = Fe::PageElement.create(:element => @element, :page => @page)
57
+ if @element.save
58
+ @page_element = Fe::PageElement.create(element: @element, page: @page)
59
59
  format.js
60
60
  else
61
- format.js { render :action => 'error.rjs' }
61
+ format.js { render action: 'error.js.erb' }
62
62
  end
63
63
  end
64
64
  end
65
65
 
66
66
  # PUT /elements/1
67
67
  def update
68
- @element = Fe::Element.find(params[:id])
68
+ @element = @page.all_elements.find(params[:id])
69
69
 
70
70
  respond_to do |format|
71
- if @element.update_attributes(element_params)
71
+ if @element.update(element_params)
72
72
  format.js
73
73
  else
74
- format.js { render :action => 'error.rjs' }
74
+ format.js { render action: 'error.js.erb' }
75
75
  end
76
76
  end
77
77
  end
@@ -79,14 +79,14 @@ class Fe::Admin::ElementsController < ApplicationController
79
79
  # DELETE /elements/1
80
80
  # DELETE /elements/1.xml
81
81
  def destroy
82
- @element = Fe::Element.find(params[:id])
82
+ @element = @page.all_elements.find(params[:id])
83
83
  # Start by removing the element from the page
84
- page_element = Fe::PageElement.where(:element_id => @element.id, :page_id => @page.id).first
84
+ page_element = Fe::PageElement.where(element_id: @element.id, page_id: @page.id).first
85
85
  page_element.destroy if page_element
86
-
86
+
87
87
  # If this element is not on any other pages, is not a question or has no answers, Destroy it
88
- if @element.reuseable? && (Fe::PageElement.where(:element_id => params[:id]).present? || @element.has_response?)
89
- @element.update_attributes(:question_grid_id => nil, :conditional_id => nil)
88
+ if @element.reuseable? && (Fe::PageElement.where(element_id: params[:id]).present? || @element.has_response?)
89
+ @element.update(question_grid_id: nil, conditional_id: nil)
90
90
  else
91
91
  @element.destroy
92
92
  end
@@ -95,91 +95,129 @@ class Fe::Admin::ElementsController < ApplicationController
95
95
  format.js
96
96
  end
97
97
  end
98
-
99
- def reorder
98
+
99
+ def reorder
100
100
  # since we don't know the name of the list, just find the first param that is an array
101
- params.each_key do |key|
101
+ params.permit!.to_h.each_key do |key|
102
102
  if key.include?('questions_list')
103
103
  grid_id = key.sub('questions_list_', '').to_i
104
104
  # See if we're ordering inside of a grid
105
105
  if grid_id > 0
106
- Fe::Element.find(grid_id).elements.each do |element|
106
+ @page.all_elements.find(grid_id).elements.each do |element|
107
107
  if index = params[key].index(element.id.to_s)
108
- element.position = index + 1
109
- element.save(:validate => false)
108
+ element.position = index + 1
109
+ element.save(validate: false)
110
110
  end
111
111
  end
112
112
  else
113
113
  @page.page_elements.each do |page_element|
114
114
  if index = params[key].index(page_element.element_id.to_s)
115
- page_element.position = index + 1
116
- page_element.save(:validate => false)
115
+ page_element.position = index + 1
116
+ page_element.save(validate: false)
117
117
  @element = page_element.element
118
118
  end
119
119
  end
120
120
  end
121
121
  end
122
122
  end
123
-
123
+
124
124
  respond_to do |format|
125
125
  format.js
126
126
  end
127
127
  end
128
-
128
+
129
129
  def drop
130
- element = Fe::Element.find(params[:draggable_element].split('_')[1]) # element being dropped
131
- target = Fe::Element.find(params[:id])
130
+ element = @page.all_elements.find(params[:draggable_element].split('_')[1]) # element being dropped
131
+ target = @page.all_elements.find(params[:id])
132
+
133
+ if [params[:before], params[:after]].include?('true')
134
+ # move the element out of its parent and back onto the page directly, placing it before the target
135
+ page_element = Fe::PageElement.where(page_id: @page.id, element_id: element.id).first_or_create
136
+ @page.page_elements << page_element
137
+
138
+ parent_element = element.question_grid || element.choice_field
139
+ parent_page_element = @page.page_elements.find_by(element_id: parent_element.id)
140
+ if params[:before]
141
+ page_element.insert_at(parent_page_element.position)
142
+ else
143
+ page_element.insert_at(parent_page_element.position + 1)
144
+ end
145
+
146
+ # remove question grid / choice_field ref since it's directly on the page now
147
+ element.update(question_grid_id: nil, choice_field_id: nil)
148
+ return
149
+ end
150
+
132
151
  case target.class.to_s
133
- when 'QuestionGrid', 'QuestionGridWithTotal'
152
+ when 'Fe::QuestionGrid', 'Fe::QuestionGridWithTotal'
134
153
  # abort if the element is already in this box
135
154
  if element.question_grid_id == params[:id].to_i
136
- render :nothing => true
155
+ render nothing: true
137
156
  else
138
157
  element.question_grid_id = params[:id]
139
158
  element.save!
140
159
  end
141
- when 'ChoiceField'
160
+ when 'Fe::ChoiceField'
142
161
  # abort if the element is already in this box
143
- if element.conditional_id == params[:id].to_i
144
- render :nothing => true
162
+ if element.choice_field_id == params[:id].to_i
163
+ render nothing: true
145
164
  else
146
- element.conditional_id = params[:id]
165
+ element.choice_field_id = params[:id]
147
166
  element.save!
148
167
  end
149
168
  end
150
169
  # Remove page element for this page since it's now in a grid
151
- Fe::PageElement.where(:page_id => @page.id, :element_id => element.id).first.try(:destroy)
170
+ Fe::PageElement.where(page_id: @page.id, element_id: element.id).first.try(:destroy)
152
171
  end
153
-
172
+
154
173
  def remove_from_grid
155
- element = Fe::Element.find(params[:id])
156
- Fe::PageElement.create(:element_id => element.id, :page_id => @page.id) unless Fe::PageElement.where(:element_id => element.id, :page_id => @page.id).first
174
+ element = @page.all_elements.find(params[:id])
175
+ Fe::PageElement.create(element_id: element.id, page_id: @page.id) unless Fe::PageElement.where(element_id: element.id, page_id: @page.id).first
157
176
  if element.question_grid_id
158
- element.set_position(element.question_grid.position(@page), @page)
177
+ element.set_position(element.question_grid.position(@page), @page)
159
178
  element.question_grid_id = nil
160
179
  elsif element.choice_field_id
161
- element.set_position(element.choice_field.position(@page), @page)
180
+ element.set_position(element.choice_field.position(@page), @page)
162
181
  element.choice_field_id = nil
163
182
  end
164
183
  element.save!
165
- render :action => :drop
184
+ render action: :drop
166
185
  end
167
-
186
+
168
187
  def duplicate
169
- element = Fe::Element.find(params[:id])
170
- @element = element.duplicate(@page, element.question_grid || element.choice_field)
188
+ element = @page.all_elements.find(params[:id])
189
+ @element = element.duplicate(@page, element.question_grid || element.question_grid_with_total || element.choice_field)
171
190
  respond_to do |format|
172
- format.js
191
+ format.js
173
192
  end
174
193
  end
175
-
194
+
195
+ # give enclosing apps a way to permit their own element attributes by overriding this method
196
+ def extra_element_params
197
+ []
198
+ end
199
+
176
200
  private
201
+
177
202
  def get_page
178
203
  @page = Fe::Page.find(params[:page_id])
179
204
  end
180
205
 
181
206
  def element_params
182
- params.fetch(:element, {}).permit(:style, :label, :tooltip, :position, :source, :value_xpath, :text_xpath, :question_grid_id, :cols, :total_cols, :css_id, :css_class, :related_question_sheet_id, :conditional_id, :hide_option_labels, :slug, :required, :is_confidential, :hide_label, :object_name, :attribute_name, :max_length, :content, :conditional_type, :conditional_id, :conditional_answer)
207
+ params.fetch(:element, {}).permit([{label_translations: Fe::LANGUAGES.keys},
208
+ {tip_translations: Fe::LANGUAGES.keys},
209
+ {content_translations: Fe::LANGUAGES.keys},
210
+ {rating_before_label_translations: Fe::LANGUAGES.keys},
211
+ {rating_after_label_translations: Fe::LANGUAGES.keys},
212
+ {rating_na_label_translations: Fe::LANGUAGES.keys},
213
+ :rating_before_label, :rating_after_label, :rating_na_label,
214
+ :style, :label, :tooltip,
215
+ :position, :source, :value_xpath,
216
+ :text_xpath, :question_grid_id, :cols, :total_cols, :css_id, :css_class,
217
+ :related_question_sheet_id, :conditional_id, :hide_option_labels, :slug,
218
+ :required, :is_confidential, :hide_label, :object_name, :attribute_name,
219
+ :max_length, :content, :conditional_type, :conditional_id, :conditional_answer,
220
+ :share] + extra_element_params)
183
221
  end
184
222
 
185
223
  end
@@ -1,6 +1,6 @@
1
1
  class Fe::Admin::EmailTemplatesController < ApplicationController
2
- before_filter :check_valid_user
3
- layout 'fe/fe.admin'
2
+ before_action :check_valid_user
3
+ layout 'fe/fe_admin'
4
4
 
5
5
  def index
6
6
  @email_templates = Fe::EmailTemplate.order('name')
@@ -31,9 +31,9 @@ class Fe::Admin::EmailTemplatesController < ApplicationController
31
31
 
32
32
  respond_to do |format|
33
33
  if @email_template.save
34
- format.html { redirect_to admin_email_templates_path }
34
+ format.html { redirect_to fe_admin_email_templates_path }
35
35
  else
36
- format.html { render :action => :new }
36
+ format.html { render action: :new }
37
37
  end
38
38
  end
39
39
  end
@@ -42,10 +42,10 @@ class Fe::Admin::EmailTemplatesController < ApplicationController
42
42
  @email_template = Fe::EmailTemplate.find(params[:id])
43
43
 
44
44
  respond_to do |format|
45
- if @email_template.update_attributes(email_template_params)
45
+ if @email_template.update(email_template_params)
46
46
  format.html { redirect_to fe_admin_email_templates_path }
47
47
  else
48
- format.html { render :action => "edit" }
48
+ format.html { render action: "edit" }
49
49
  end
50
50
  end
51
51
  end
@@ -55,7 +55,7 @@ class Fe::Admin::EmailTemplatesController < ApplicationController
55
55
  @email_template.destroy
56
56
 
57
57
  respond_to do |format|
58
- format.html { redirect_to email_templates_path }
58
+ format.html { redirect_to fe_admin_email_templates_path }
59
59
  end
60
60
  end
61
61
 
@@ -1,8 +1,8 @@
1
1
  class Fe::Admin::QuestionPagesController < ApplicationController
2
- before_filter :check_valid_user
3
- layout 'fe/fe.admin'
2
+ before_action :check_valid_user
3
+ layout 'fe/fe_admin'
4
4
 
5
- before_filter :get_sheet
5
+ before_action :get_sheet
6
6
 
7
7
  # selecting a page
8
8
  # GET /pages/1
@@ -26,14 +26,14 @@ class Fe::Admin::QuestionPagesController < ApplicationController
26
26
 
27
27
  # POST /pages
28
28
  def create
29
- @page = @question_sheet.pages.build(:label => next_label, :number => @question_sheet.pages.length + 1)
29
+ @page = @question_sheet.pages.build(label: next_label, number: @question_sheet.pages.length + 1)
30
30
  @all_pages = @question_sheet.pages
31
31
 
32
32
  respond_to do |format|
33
33
  if @page.save
34
34
  format.js
35
35
  else
36
- format.js { render :action => "error.rjs"}
36
+ format.js { render action: "error.rjs"}
37
37
  end
38
38
  end
39
39
  end
@@ -43,11 +43,11 @@ class Fe::Admin::QuestionPagesController < ApplicationController
43
43
  @page = @question_sheet.pages.find(params[:id])
44
44
 
45
45
  respond_to do |format|
46
- if @page.update_attributes(page_params)
46
+ if @page.update(page_params)
47
47
  @all_pages = @question_sheet.pages
48
48
  format.js { render action: :destroy }
49
49
  else
50
- format.js { render :action => "error.rjs"}
50
+ format.js { render action: "error.rjs"}
51
51
  end
52
52
  end
53
53
  end
@@ -88,7 +88,7 @@ class Fe::Admin::QuestionPagesController < ApplicationController
88
88
  @page = page
89
89
  end
90
90
  end
91
- render :nothing => true
91
+ render nothing: true
92
92
  end
93
93
 
94
94
  private
@@ -108,6 +108,6 @@ class Fe::Admin::QuestionPagesController < ApplicationController
108
108
  end
109
109
 
110
110
  def page_params
111
- params.fetch(:fe_page, {}).permit(:label, :hidden, :no_cache)
111
+ params.fetch(:fe_page, {}).permit({label_translations: Fe::LANGUAGES.keys}, :label, :hidden, :no_cache)
112
112
  end
113
113
  end