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,9 @@
1
+ class AddLocaleColumns < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::QuestionSheet.table_name, :languages, :text
4
+ add_column Fe::Element.table_name, :label_translations, :text
5
+ add_column Fe::Element.table_name, :tip_translations, :text
6
+ add_column Fe::Element.table_name, :content_translations, :text
7
+ add_column Fe::Page.table_name, :label_translations, :text
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocaleToAnswerSheet < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe.answer_sheet_class.constantize.table_name, :locale, :string, default: 'en'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddShareToElements < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::Element.table_name, :share, :boolean, default: false
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class ChangePagesAllElementIdsToText < ActiveRecord::Migration[4.2]
2
+ def change
3
+ change_column Fe::Page.table_name, :all_element_ids, :text
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocaleToReferenceSheets < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::ReferenceSheet.table_name, :locale, :string, default: 'en'
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class SwitchConditionalAnswerSeparatorToSemicolon < ActiveRecord::Migration[4.2]
2
+ def change
3
+ Fe::Element.where("conditional_answer IS NOT NULL AND conditional_answer != ''").each do |e|
4
+ e.update_column :conditional_answer, e.conditional_answer.gsub(',', ';')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ class AddQuestionSheetIdInRefs < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::ReferenceSheet.table_name, :question_sheet_id, :integer
4
+
5
+ # set initial question_sheet_id on all refs
6
+ # NOTE: doing an update on a join query is a pain to do in both mysql and postgres
7
+ # and since there's not that many reference questions, this should be fine
8
+ Fe::ReferenceQuestion.all.each do |rq|
9
+ Fe::ReferenceSheet.where(question_id: rq.id).update_all(question_sheet_id: rq.related_question_sheet_id)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class AddVisibleAndVisibilityCacheKeyToReferenceSheets < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::ReferenceSheet.table_name, :visible, :boolean
4
+ add_column Fe::ReferenceSheet.table_name, :visibility_cache_key, :string
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class AddRatingExtraLabels < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column Fe::Element.table_name, :rating_before_label, :text
4
+ add_column Fe::Element.table_name, :rating_after_label, :text
5
+ add_column Fe::Element.table_name, :rating_na_label, :text
6
+ add_column Fe::Element.table_name, :rating_before_label_translations, :text
7
+ add_column Fe::Element.table_name, :rating_after_label_translations, :text
8
+ add_column Fe::Element.table_name, :rating_na_label_translations, :text
9
+ end
10
+ end
@@ -0,0 +1,80 @@
1
+ # This migration creates the `versions` table, the only schema PT requires.
2
+ # All other migrations PT provides are optional.
3
+ class CreateVersions < ActiveRecord::Migration[4.2]
4
+ # Class names of MySQL adapters.
5
+ # - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
6
+ # - `Mysql2Adapter` - Used by `mysql2` gem.
7
+ MYSQL_ADAPTERS = [
8
+ "ActiveRecord::ConnectionAdapters::MysqlAdapter",
9
+ "ActiveRecord::ConnectionAdapters::Mysql2Adapter"
10
+ ].freeze
11
+
12
+ # The largest text column available in all supported RDBMS is
13
+ # 1024^3 - 1 bytes, roughly one gibibyte. We specify a size
14
+ # so that MySQL will use `longtext` instead of `text`. Otherwise,
15
+ # when serializing very large objects, `text` might not be big enough.
16
+ TEXT_BYTES = 1_073_741_823
17
+
18
+ def change
19
+ create_table :versions, versions_table_options do |t|
20
+ t.string :item_type, item_type_options
21
+ t.integer :item_id, null: false
22
+ t.string :event, null: false
23
+ t.string :whodunnit
24
+ t.text :object, limit: TEXT_BYTES
25
+
26
+ # Known issue in MySQL: fractional second precision
27
+ # -------------------------------------------------
28
+ #
29
+ # MySQL timestamp columns do not support fractional seconds unless
30
+ # defined with "fractional seconds precision". MySQL users should manually
31
+ # add fractional seconds precision to this migration, specifically, to
32
+ # the `created_at` column.
33
+ # (https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html)
34
+ #
35
+ # MySQL users should also upgrade to rails 4.2, which is the first
36
+ # version of ActiveRecord with support for fractional seconds in MySQL.
37
+ # (https://github.com/rails/rails/pull/14359)
38
+ #
39
+ t.datetime :created_at
40
+ end
41
+ add_index :versions, [:item_type, :item_id]
42
+ end
43
+
44
+ private
45
+
46
+ # MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
47
+ # See https://github.com/airblade/paper_trail/issues/651
48
+ def item_type_options
49
+ opt = { null: false }
50
+ opt[:limit] = 191 if mysql?
51
+ opt
52
+ end
53
+
54
+ def mysql?
55
+ MYSQL_ADAPTERS.include?(connection.class.name)
56
+ end
57
+
58
+ # Even modern versions of MySQL still use `latin1` as the default character
59
+ # encoding. Many users are not aware of this, and run into trouble when they
60
+ # try to use PaperTrail in apps that otherwise tend to use UTF-8. Postgres, by
61
+ # comparison, uses UTF-8 except in the unusual case where the OS is configured
62
+ # with a custom locale.
63
+ #
64
+ # - https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
65
+ # - http://www.postgresql.org/docs/9.4/static/multibyte.html
66
+ #
67
+ # Furthermore, MySQL's original implementation of UTF-8 was flawed, and had
68
+ # to be fixed later by introducing a new charset, `utf8mb4`.
69
+ #
70
+ # - https://mathiasbynens.be/notes/mysql-utf8mb4
71
+ # - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
72
+ #
73
+ def versions_table_options
74
+ if mysql?
75
+ { options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci" }
76
+ else
77
+ {}
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,5 @@
1
+ class IncreaseSlugLength < ActiveRecord::Migration
2
+ def change
3
+ change_column Fe::Question.table_name, :slug, :string, limit: 128
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ require 'securerandom'
2
+
3
+ module Fe
4
+ module AccessKeyGenerator
5
+ def generate_access_key
6
+ begin
7
+ self.access_key = SecureRandom.hex
8
+ end while self.class.exists?(access_key: access_key)
9
+ return access_key
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_record'
2
+
3
+ module DistinctDistinctPatch
4
+ def construct_limited_ids_condition(relation)
5
+ orders = relation.order_values.map { |val| val.presence }.compact
6
+ values = @klass.connection.distinct("#{@klass.connection.quote_table_name table_name}.#{primary_key}", orders)
7
+
8
+ relation = relation.dup.select(values)
9
+ relation.uniq_value = nil
10
+
11
+ id_rows = @klass.connection.select_all(relation.arel, 'SQL', relation.bind_values)
12
+ ids_array = id_rows.map {|row| row[primary_key]}
13
+
14
+ ids_array.empty? ? raise(ActiveRecord::ThrowResult) : table[primary_key].in(ids_array)
15
+ end
16
+ end
17
+
18
+ class ActiveRecord::Relation
19
+ include DistinctDistinctPatch
20
+ end
data/lib/fe/engine.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'acts_as_list'
2
+
1
3
  module Fe
2
4
  class Engine < ::Rails::Engine
3
5
  # isolate_namespace is causing problems accessing the app's url helpers when the app
@@ -6,7 +8,7 @@ module Fe
6
8
  # Using the si as an example:
7
9
  #
8
10
  # si/app/controllers/fe/test_controller.rb
9
- #
11
+ #
10
12
  # class Fe::TestController < ApplicationController
11
13
  # def index
12
14
  # end
@@ -20,15 +22,15 @@ module Fe
20
22
  # http://crypt.codemancers.com/posts/2013-09-22-isolate-namespace-in-rails-engines/
21
23
  # it's a real pain to extend an isolated namespace engine from the app:
22
24
  #
23
- # "Other issues include extending models and controllers. Rails
25
+ # "Other issues include extending models and controllers. Rails
24
26
  # guides gives two options here. One to use class_eval, and other
25
- # to use concerns introduced in Rails 4. Both are kind of hacky.
27
+ # to use concerns introduced in Rails 4. Both are kind of hacky.
26
28
  # Hope there is a better solution."
27
- #
29
+ #
28
30
  # and as per a user comment on that page:
29
31
  #
30
32
  # "I've had a similar experience with `isolate_namespace`, if the engines
31
- # need to be truely isolated it works, but if you need to extend the engine
33
+ # need to be truely isolated it works, but if you need to extend the engine
32
34
  # from the client app its best to remove it and just namespace manually.
33
35
  #
34
36
  # I'm disabling the isolate_namespace
@@ -37,28 +39,38 @@ module Fe
37
39
 
38
40
 
39
41
  config.to_prepare do
40
- Dir.glob(File.join(File.dirname(__FILE__), "..", "..", "app", "**", "*_concern.rb")).each do |c|
41
- require_dependency(c)
42
+ require_dependency('distinct_distinct_patch.rb')
43
+ require_dependency('access_key_generator')
44
+
45
+ # Loading concerns and dependencies here when running FE specs breaks the coverage report. The
46
+ # Rakefile will set SKIP_CONCERNS and SKIP_DECORATORS true and decorators/concerns are loaded from
47
+ # spec/rails_helper.rb instead
48
+ if ENV['SKIP_CONCERNS'] != 'true'
49
+ Dir.glob(File.join(File.dirname(__FILE__), "..", "..", "app", "**", "*_concern.rb")).each do |c|
50
+ require_dependency(c)
51
+ end
42
52
  end
43
53
 
44
- Dir.glob(File.join(Rails.root + 'app/decorators/**/*_decorator.rb')).each do |c|
45
- require_dependency(c)
54
+ if ENV['SKIP_CONCERNS'] != 'true'
55
+ Dir.glob(File.join(Rails.root + 'app/decorators/**/*_decorator.rb')).each do |c|
56
+ require_dependency(c)
57
+ end
46
58
  end
47
59
  end
48
60
 
49
61
  config.generators do |g|
50
- g.test_framework :rspec, :fixture => false
51
- g.fixture_replacement :factory_girl, :dir => 'spec/factories'
62
+ g.test_framework :rspec, fixture: false
63
+ g.fixture_replacement :factory_bot, dir: 'spec/factories'
52
64
  g.assets false
53
65
  g.helper false
54
66
  end
55
67
 
56
68
  initializer "fe.asset_precompile_paths" do |app|
57
69
  app.config.assets.precompile += %w(fe/admin.js fe/fe.screen.css)
58
- end
70
+ end
59
71
 
60
- initializer "model_core.factories", :after => "factory_girl.set_factory_paths" do
61
- FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories', __FILE__) if defined?(FactoryGirl)
72
+ initializer "model_core.factories", after: "factory_bot.set_factory_paths" do
73
+ FactoryBot.definition_file_paths << File.expand_path('../../../spec/factories', __FILE__) if defined?(FactoryBot)
62
74
  end
63
75
  end
64
76
  end
data/lib/fe/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fe
2
- VERSION = "0.0.4"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/fe.rb CHANGED
@@ -1,16 +1,20 @@
1
1
  require "fe/engine"
2
2
 
3
3
  module Fe
4
+ LANGUAGES = { 'es' => 'Español', 'pt' => 'Português' }
4
5
  # prefix for database tables
5
6
  mattr_accessor :table_name_prefix
6
7
  self.table_name_prefix ||= 'fe_'
7
-
8
+
8
9
  mattr_accessor :answer_sheet_class
9
10
  self.answer_sheet_class ||= 'Fe::Application'
10
11
 
11
12
  mattr_accessor :from_email
12
13
  self.from_email ||= 'info@example.com'
13
14
 
15
+ mattr_accessor :never_reuse_elements
16
+ self.never_reuse_elements = false
17
+
14
18
  def self.next_label(prefix, labels)
15
19
  max = labels.inject(0) do |m, label|
16
20
  num = label[/^#{prefix} ([0-9]+)$/i, 1].to_i # extract your digits
@@ -19,4 +23,10 @@ module Fe
19
23
 
20
24
  "#{prefix} #{max.next}"
21
25
  end
26
+
27
+ mattr_accessor :date_format
28
+ self.date_format = 'yy-mm-dd'
29
+
30
+ mattr_accessor :bootstrap
31
+ self.bootstrap = false
22
32
  end
@@ -1,4 +1,214 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::ElementsController do
3
+ describe Fe::Admin::ElementsController, type: :controller do
4
+ context '#show' do
5
+ it 'should work' do
6
+ answer_sheet = create(:answer_sheet)
7
+ page = create(:page)
8
+ question_sheet = page.question_sheet
9
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
10
+ element = create(:text_field_element)
11
+ create(:page_element, element: element, page: page)
12
+
13
+ get :edit, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
14
+ expect(assigns(:element)).to eq(element)
15
+ end
16
+ end
17
+ context '#new' do
18
+ it 'should work' do
19
+ answer_sheet = create(:answer_sheet)
20
+ page = create(:page)
21
+ question_sheet = page.question_sheet
22
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
23
+ element1 = create(:text_field_element, style: 'style', share: true)
24
+ element2 = create(:text_field_element, style: 'style', share: false)
25
+ create(:page_element, element: element1, page: page)
26
+ create(:page_element, element: element2, page: page)
27
+
28
+ get :new, params: {element_type: 'Fe::TextField', element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id}, xhr: true
29
+ expect(assigns(:questions)).to eq([element1])
30
+ end
31
+ end
32
+ context '#use_existing' do
33
+ it 'should work' do
34
+ answer_sheet = create(:answer_sheet)
35
+ page = create(:page)
36
+ question_sheet = page.question_sheet
37
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
38
+ element = create(:text_field_element, style: 'style')
39
+
40
+ get :use_existing, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
41
+ expect(assigns(:page_element)).to_not be_nil
42
+ expect(assigns(:page_element)).to_not be_nil
43
+ expect(assigns(:page)).to eq(page)
44
+ expect(assigns(:page_element).element).to eq(element)
45
+ end
46
+ end
47
+ context '#copy_existing' do
48
+ it 'should work' do
49
+ answer_sheet = create(:answer_sheet)
50
+ page = create(:page)
51
+ question_sheet = page.question_sheet
52
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
53
+ element = create(:text_field_element, style: 'style', share: true)
54
+
55
+ get :copy_existing, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
56
+ expect(assigns(:page_element)).to_not be_nil
57
+ expect(assigns(:page_element)).to_not be_nil
58
+ expect(assigns(:page)).to eq(page)
59
+ expect(assigns(:page_element).element).to_not eq(element)
60
+ expect(assigns(:page_element).element.share).to be false
61
+ end
62
+ end
63
+ context '#create' do
64
+ it 'should work' do
65
+ answer_sheet = create(:answer_sheet)
66
+ page = create(:page)
67
+ question_sheet = page.question_sheet
68
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
69
+
70
+ expect {
71
+ post :create, params: {element_type: 'Fe::TextField', element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id}, xhr: true
72
+ }.to change{Fe::Element.count}.by(1)
73
+
74
+ expect(assigns(:page_element)).to_not be_nil
75
+ new_element = Fe::Element.last
76
+ expect(assigns(:page_element).element).to eq(new_element)
77
+ expect(assigns(:page_element).page).to eq(page)
78
+ end
79
+ it 'should handle error saving element' do
80
+ answer_sheet = create(:answer_sheet)
81
+ page = create(:page)
82
+ question_sheet = page.question_sheet
83
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
84
+
85
+ expect {
86
+ post :create, params: {element_type: 'Fe::TextField', element: { slug: "Illegal Chars: #@$!" }, question_sheet_id: question_sheet.id, page_id: page.id}, xhr: true
87
+ }.to change{Fe::Element.count}.by(0)
88
+
89
+ expect(assigns(:page_element)).to be_nil
90
+ expect(response).to render_template('error.js.erb')
91
+ end
92
+ end
93
+ context '#update' do
94
+ it 'should work' do
95
+ answer_sheet = create(:answer_sheet)
96
+ page = create(:page)
97
+ question_sheet = page.question_sheet
98
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
99
+ element = create(:text_field_element, style: 'style')
100
+ create(:page_element, element: element, page: page)
101
+
102
+ put :update, params: {element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
103
+
104
+ expect(assigns(:element)).to eq(element)
105
+ expect(assigns(:element).style).to eq('style')
106
+ end
107
+ it 'should handle error saving element' do
108
+ answer_sheet = create(:answer_sheet)
109
+ page = create(:page)
110
+ question_sheet = page.question_sheet
111
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
112
+ element = create(:text_field_element, style: 'style')
113
+ create(:page_element, element: element, page: page)
114
+
115
+ put :update, params: {element: { slug: "Illegal Chars: #@$!" }, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
116
+ expect(assigns(:element)).to eq(element)
117
+ expect(response).to render_template('error.js.erb')
118
+ end
119
+ end
120
+ context '#destroy' do
121
+ it 'should destroy the element when it is not used in any other pages' do
122
+ answer_sheet = create(:answer_sheet)
123
+ page = create(:page)
124
+ question_sheet = page.question_sheet
125
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
126
+ element = create(:text_field_element, style: 'style')
127
+ create(:page_element, element: element, page: page)
128
+
129
+ delete :destroy, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
130
+
131
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
132
+ expect(Fe::Element.find_by(id: element.id)).to be_nil
133
+ end
134
+ it 'should not destroy the element when it is not used in any other pages, but it has answers' do
135
+ answer_sheet = create(:answer_sheet)
136
+ page = create(:page)
137
+ question_sheet = page.question_sheet
138
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
139
+ element = create(:text_field_element, style: 'style')
140
+ create(:page_element, element: element, page: page)
141
+ create(:answer, question: element, value: 'answer here', answer_sheet: answer_sheet)
142
+
143
+ delete :destroy, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
144
+
145
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
146
+ expect(Fe::Element.find_by(id: element.id)).to_not be_nil
147
+ end
148
+ it 'should not destroy the element when it has no answers, but is being used in another page' do
149
+ answer_sheet = create(:answer_sheet)
150
+ page = create(:page)
151
+ page2 = create(:page)
152
+ question_sheet = page.question_sheet
153
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
154
+ element = create(:text_field_element, style: 'style')
155
+ create(:page_element, element: element, page: page)
156
+ create(:page_element, element: element, page: page2)
157
+
158
+ delete :destroy, params: {question_sheet_id: question_sheet.id, page_id: page.id, id: element.id}, xhr: true
159
+
160
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
161
+ expect(Fe::Element.find_by(id: element.id)).to_not be_nil
162
+ end
163
+ end
164
+
165
+ context '#reorder' do
166
+ it 'should work inside a question grid' do
167
+ answer_sheet = create(:answer_sheet)
168
+ page = create(:page)
169
+ question_sheet = page.question_sheet
170
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
171
+ element = create(:text_field_element, style: 'style')
172
+ element2 = create(:text_field_element, style: 'style')
173
+ element3 = create(:question_grid, style: 'style')
174
+ element4 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
175
+ element5 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
176
+ create(:page_element, element: element, page: page)
177
+ create(:page_element, element: element2, page: page)
178
+ create(:page_element, element: element3, page: page)
179
+
180
+ page_element_positions_before = Fe::PageElement.all.pluck(:position)
181
+
182
+ post :reorder, params: {question_sheet_id: question_sheet.id, page_id: page.id, "questions_list_#{element3.id}" => [ element5.id, element4.id ]}, xhr: true
183
+ # it shouldn't touch the page elements
184
+ expect(Fe::PageElement.all.pluck(:position)).to eq(page_element_positions_before)
185
+ # it should put a new order on the question grid elements
186
+ expect(element5.reload.position).to eq(1)
187
+ expect(element4.reload.position).to eq(2)
188
+ end
189
+ it 'should work outside a question grid' do
190
+ answer_sheet = create(:answer_sheet)
191
+ page = create(:page)
192
+ question_sheet = page.question_sheet
193
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
194
+ element = create(:text_field_element, style: 'style')
195
+ element2 = create(:text_field_element, style: 'style')
196
+ element3 = create(:question_grid, style: 'style')
197
+ element4 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
198
+ element5 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
199
+ pe1 = create(:page_element, element: element, page: page)
200
+ pe2 = create(:page_element, element: element2, page: page)
201
+ pe3 = create(:page_element, element: element3, page: page)
202
+
203
+ question_grid_elements_positions_before = element3.reload.elements.pluck(:position)
204
+
205
+ post :reorder, params: {question_sheet_id: question_sheet.id, page_id: page.id, "questions_list" => [ element3.id, element.id, element2.id ]}, xhr: true
206
+ # it shouldn't touch the question grid positions
207
+ expect(element3.reload.elements.pluck(:position)).to eq(question_grid_elements_positions_before)
208
+ # it should put a new order on the page elements
209
+ expect(pe3.reload.position).to eq(1)
210
+ expect(pe1.reload.position).to eq(2)
211
+ expect(pe2.reload.position).to eq(3)
212
+ end
213
+ end
4
214
  end
@@ -1,4 +1,29 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::EmailTemplatesController do
3
+ describe Fe::Admin::EmailTemplatesController, type: :controller do
4
+ let(:email_template) { create(:email_template) }
5
+
6
+ context '#index' do
7
+ it 'should work' do
8
+ email_template = create(:email_template, name: 'Template')
9
+ get :index
10
+ expect(assigns(:email_templates)).to eq([email_template])
11
+ end
12
+ end
13
+
14
+ context '#new' do
15
+ it 'should work' do
16
+ get :new
17
+ expect(assigns(:email_template)).to_not be_nil
18
+ end
19
+ end
20
+
21
+ context '#create' do
22
+ it 'should work' do
23
+ expect {
24
+ post :create, params: {email_template: { name: 'Name', subject: 'Subject', content: 'Content' }}
25
+ }.to change{Fe::EmailTemplate.count}.by(1)
26
+ expect(assigns(:email_template)).to_not be_nil
27
+ end
28
+ end
4
29
  end
@@ -1,4 +1,11 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::QuestionPagesController do
3
+ describe Fe::Admin::QuestionPagesController, type: :controller do
4
+ context '#show' do
5
+ it 'should work' do
6
+ page = create(:page)
7
+ question_sheet = page.question_sheet
8
+ get :show, params: {question_sheet_id: question_sheet.id, id: page.id}, xhr: true
9
+ end
10
+ end
4
11
  end
@@ -1,4 +1,51 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::QuestionSheetsController do
3
+ describe Fe::Admin::QuestionSheetsController, type: :controller do
4
+ context '#index' do
5
+ it 'should work' do
6
+ active_qs = create(:question_sheet, archived: false)
7
+ archived_qs = create(:question_sheet, archived: true)
8
+ get :index
9
+ expect(assigns(:active_question_sheets)).to_not be_nil
10
+ expect(assigns(:archived_question_sheets)).to_not be_nil
11
+ expect(assigns(:active_question_sheets)).to eq([active_qs])
12
+ expect(assigns(:archived_question_sheets)).to eq([archived_qs])
13
+ end
14
+ end
15
+ context '#archive' do
16
+ it 'should work' do
17
+ active_qs = create(:question_sheet, archived: false)
18
+ request.env["HTTP_REFERER"] = '/'
19
+ post :archive, params: {id: active_qs.id}
20
+ expect(active_qs.reload.archived).to be true
21
+ end
22
+ end
23
+ context '#unarchive' do
24
+ it 'should work' do
25
+ active_qs = create(:question_sheet, archived: true)
26
+ request.env["HTTP_REFERER"] = '/'
27
+ post :unarchive, params: {id: active_qs.id}
28
+ expect(active_qs.reload.archived).to be false
29
+ end
30
+ end
31
+ context '#duplicate' do
32
+ it 'should work' do
33
+ qs = create(:question_sheet)
34
+ request.env["HTTP_REFERER"] = '/'
35
+ expect {
36
+ post :duplicate, params: {id: qs.id}
37
+ }.to change{Fe::QuestionSheet.count}.by(1)
38
+ expect(Fe::QuestionSheet.last.label).to eq("#{qs.label} - COPY")
39
+ end
40
+ end
41
+ context '#show' do
42
+ it 'should work' do
43
+ qs = create(:question_sheet)
44
+ p1 = create(:page, question_sheet: qs)
45
+ p2 = create(:page, question_sheet: qs)
46
+ get :show, params: {id: qs.id}
47
+ expect(assigns(:all_pages)).to eq([p1, p2])
48
+ expect(assigns(:page)).to eq(p1)
49
+ end
50
+ end
4
51
  end