pages_core 3.4.3 → 3.7.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 (375) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +74 -15
  3. data/Rakefile +2 -0
  4. data/app/assets/javascripts/pages/admin.jsx +17 -0
  5. data/app/assets/javascripts/pages/admin/components.jsx +2 -0
  6. data/app/assets/javascripts/pages/admin/components/attachment.jsx +130 -0
  7. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +131 -0
  8. data/app/assets/javascripts/pages/admin/components/attachments.jsx +211 -0
  9. data/app/assets/javascripts/pages/admin/components/date_range_select.jsx +174 -0
  10. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +174 -0
  11. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +57 -0
  12. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +44 -0
  13. data/app/assets/javascripts/pages/admin/components/focal_point.jsx +82 -0
  14. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +124 -0
  15. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +496 -0
  16. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +306 -0
  17. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +176 -0
  18. data/app/assets/javascripts/pages/admin/components/modal.jsx +48 -0
  19. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +20 -0
  20. data/app/assets/javascripts/pages/admin/components/page_dates.jsx +58 -0
  21. data/app/assets/javascripts/pages/admin/components/page_files.jsx +14 -0
  22. data/app/assets/javascripts/pages/admin/components/page_images.jsx +16 -0
  23. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +300 -0
  24. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +396 -0
  25. data/app/assets/javascripts/pages/admin/components/page_tree_store.jsx +203 -0
  26. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +64 -0
  27. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +91 -0
  28. data/app/assets/javascripts/pages/admin/components/toast.jsx +34 -0
  29. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +52 -0
  30. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +72 -0
  31. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +97 -0
  32. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +14 -0
  33. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +160 -0
  34. data/app/assets/javascripts/pages/admin/lib/tree.jsx +294 -0
  35. data/app/assets/javascripts/pages/login_form.jsx +21 -0
  36. data/app/assets/stylesheets/pages/admin.scss +144 -0
  37. data/app/assets/stylesheets/pages/admin/components/archive.scss +6 -0
  38. data/app/assets/stylesheets/pages/admin/components/attachments.scss +130 -0
  39. data/app/assets/stylesheets/pages/admin/components/buttons.scss +23 -0
  40. data/app/assets/stylesheets/pages/admin/components/forms.scss +169 -0
  41. data/app/assets/stylesheets/pages/admin/components/header.scss +157 -0
  42. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +195 -0
  43. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +181 -0
  44. data/app/assets/stylesheets/pages/admin/components/image_uploader.scss +53 -0
  45. data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
  46. data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
  47. data/app/assets/stylesheets/pages/admin/components/list_table.scss +61 -0
  48. data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +3 -9
  49. data/app/assets/stylesheets/pages/admin/components/modal.scss +106 -0
  50. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +179 -0
  51. data/app/assets/stylesheets/pages/admin/components/pagination.scss +49 -0
  52. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +28 -0
  53. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +59 -0
  54. data/app/assets/stylesheets/pages/admin/components/textarea.scss +6 -0
  55. data/app/assets/stylesheets/pages/admin/components/toast.scss +51 -0
  56. data/app/assets/stylesheets/pages/admin/components/toolbar.scss +108 -0
  57. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +184 -0
  58. data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +2 -2
  59. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
  60. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
  61. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
  62. data/app/assets/stylesheets/pages/admin/vars.scss +30 -0
  63. data/app/assets/stylesheets/pages/errors.css +2 -0
  64. data/app/controller_dummies/admin/admin_controller.rb +1 -1
  65. data/app/controller_dummies/application_controller.rb +3 -3
  66. data/app/controller_dummies/attachments_controller.rb +4 -0
  67. data/app/controller_dummies/frontend_controller.rb +1 -1
  68. data/app/controller_dummies/images_controller.rb +1 -1
  69. data/app/controller_dummies/page_files_controller.rb +1 -1
  70. data/app/controller_dummies/pages_controller.rb +1 -1
  71. data/app/controller_dummies/sitemaps_controller.rb +1 -1
  72. data/app/controllers/admin/attachments_controller.rb +50 -0
  73. data/app/controllers/admin/categories_controller.rb +3 -4
  74. data/app/controllers/admin/images_controller.rb +29 -18
  75. data/app/controllers/admin/invites_controller.rb +20 -23
  76. data/app/controllers/admin/pages_controller.rb +59 -111
  77. data/app/controllers/admin/password_resets_controller.rb +23 -21
  78. data/app/controllers/admin/users_controller.rb +23 -23
  79. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +67 -0
  80. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  81. data/app/controllers/concerns/pages_core/authentication.rb +4 -3
  82. data/app/controllers/concerns/pages_core/error_renderer.rb +36 -0
  83. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  84. data/app/controllers/concerns/pages_core/policies_helper.rb +16 -13
  85. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +44 -0
  86. data/app/controllers/concerns/pages_core/process_titler.rb +4 -4
  87. data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
  88. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  89. data/app/controllers/errors_controller.rb +20 -30
  90. data/app/controllers/pages_core/admin_controller.rb +21 -70
  91. data/app/controllers/pages_core/attachments_controller.rb +40 -0
  92. data/app/controllers/pages_core/{application_controller.rb → base_controller.rb} +13 -8
  93. data/app/controllers/pages_core/frontend/page_files_controller.rb +7 -24
  94. data/app/controllers/pages_core/frontend/pages_controller.rb +39 -228
  95. data/app/controllers/pages_core/frontend_controller.rb +10 -3
  96. data/app/controllers/pages_core/images_controller.rb +2 -2
  97. data/app/controllers/pages_core/sitemaps_controller.rb +15 -10
  98. data/app/controllers/sessions_controller.rb +4 -14
  99. data/app/formatters/pages_core/html_formatter.rb +52 -48
  100. data/app/formatters/pages_core/image_embedder.rb +79 -0
  101. data/app/formatters/pages_core/link_renderer.rb +17 -0
  102. data/app/helpers/admin/admin_helper.rb +1 -1
  103. data/app/helpers/admin/menu_helper.rb +19 -16
  104. data/app/helpers/admin/pages_helper.rb +27 -30
  105. data/app/helpers/application_helper.rb +1 -1
  106. data/app/helpers/frontend_helper.rb +1 -1
  107. data/app/helpers/pages_core/admin/admin_helper.rb +44 -71
  108. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  109. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  110. data/app/helpers/pages_core/admin/form_builder.rb +44 -0
  111. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  112. data/app/helpers/pages_core/admin/labelled_field_helper.rb +19 -19
  113. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  114. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  115. data/app/helpers/pages_core/admin/tag_editor_helper.rb +16 -14
  116. data/app/helpers/pages_core/application_helper.rb +15 -26
  117. data/app/helpers/pages_core/attachments_helper.rb +40 -0
  118. data/app/helpers/pages_core/form_builder.rb +71 -134
  119. data/app/helpers/pages_core/frontend_helper.rb +2 -8
  120. data/app/helpers/pages_core/head_tags_helper.rb +36 -169
  121. data/app/helpers/pages_core/images_helper.rb +5 -4
  122. data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
  123. data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
  124. data/app/helpers/pages_core/page_path_helper.rb +66 -0
  125. data/app/jobs/pages_core/autopublish_job.rb +2 -2
  126. data/app/jobs/pages_core/sweep_cache_job.rb +3 -3
  127. data/app/mailers/admin_mailer.rb +8 -31
  128. data/app/models/attachment.rb +78 -0
  129. data/app/models/autopublisher.rb +7 -4
  130. data/app/models/category.rb +10 -11
  131. data/app/models/concerns/pages_core/has_roles.rb +5 -4
  132. data/app/models/concerns/pages_core/humanizable_param.rb +11 -8
  133. data/app/models/concerns/pages_core/page_model/attachments.rb +41 -0
  134. data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
  135. data/app/models/concerns/pages_core/page_model/dated_page.rb +59 -0
  136. data/app/models/concerns/pages_core/page_model/images.rb +51 -0
  137. data/app/models/concerns/pages_core/page_model/localizable.rb +38 -0
  138. data/app/models/concerns/pages_core/page_model/pathable.rb +114 -0
  139. data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
  140. data/app/models/concerns/pages_core/page_model/sortable.rb +53 -0
  141. data/app/models/concerns/pages_core/page_model/status.rb +50 -0
  142. data/app/models/concerns/pages_core/page_model/templateable.rb +85 -0
  143. data/app/models/concerns/pages_core/page_model/tree.rb +134 -0
  144. data/app/models/concerns/pages_core/sweepable.rb +3 -3
  145. data/app/models/concerns/pages_core/taggable.rb +11 -4
  146. data/app/models/image.rb +15 -1
  147. data/app/models/invite.rb +3 -11
  148. data/app/models/invite_role.rb +5 -3
  149. data/app/models/page.rb +49 -234
  150. data/app/models/page_builder.rb +5 -7
  151. data/app/models/page_category.rb +7 -0
  152. data/app/models/page_exporter.rb +100 -0
  153. data/app/models/page_file.rb +26 -50
  154. data/app/models/page_image.rb +7 -40
  155. data/app/models/page_path.rb +52 -0
  156. data/app/models/password_reset_token.rb +7 -9
  157. data/app/models/role.rb +23 -7
  158. data/app/models/tag.rb +28 -19
  159. data/app/models/tagging.rb +6 -5
  160. data/app/models/user.rb +38 -32
  161. data/app/policies/invite_policy.rb +2 -0
  162. data/app/policies/page_file_policy.rb +15 -17
  163. data/app/policies/page_image_policy.rb +15 -17
  164. data/app/policies/page_policy.rb +29 -23
  165. data/app/policies/policy.rb +4 -8
  166. data/app/policies/user_policy.rb +34 -32
  167. data/app/serializers/admin/attachment_serializer.rb +31 -0
  168. data/app/serializers/admin/image_serializer.rb +55 -6
  169. data/app/serializers/admin/page_file_serializer.rb +8 -0
  170. data/app/serializers/admin/page_image_serializer.rb +3 -1
  171. data/app/serializers/page_export_serializer.rb +32 -0
  172. data/app/serializers/page_file_export_serializer.rb +6 -0
  173. data/app/serializers/page_image_export_serializer.rb +42 -0
  174. data/app/serializers/page_image_serializer.rb +4 -0
  175. data/app/serializers/page_serializer.rb +2 -0
  176. data/app/services/pages_core/create_user_service.rb +39 -0
  177. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  178. data/app/services/pages_core/invite_service.rb +43 -0
  179. data/app/views/admin/images/show.json.jbuilder +8 -0
  180. data/app/views/admin/invites/new.html.erb +2 -1
  181. data/app/views/admin/invites/show.html.erb +3 -4
  182. data/app/views/admin/pages/_edit_content.html.erb +11 -2
  183. data/app/views/admin/pages/_edit_files.html.erb +8 -0
  184. data/app/views/admin/pages/_edit_images.html.erb +8 -84
  185. data/app/views/admin/pages/_edit_metadata.html.erb +23 -12
  186. data/app/views/admin/pages/_edit_options.html.erb +25 -25
  187. data/app/views/admin/pages/_list_item.html.erb +50 -0
  188. data/app/views/admin/pages/deleted.html.erb +42 -0
  189. data/app/views/admin/pages/edit.html.erb +11 -91
  190. data/app/views/admin/pages/index.html.erb +10 -54
  191. data/app/views/admin/pages/new.html.erb +5 -4
  192. data/app/views/admin/pages/news.html.erb +61 -47
  193. data/app/views/admin/password_resets/show.html.erb +6 -9
  194. data/app/views/admin/users/_access_control.html.erb +4 -1
  195. data/app/views/admin/users/_list.html.erb +12 -7
  196. data/app/views/admin/users/edit.html.erb +5 -11
  197. data/app/views/admin/users/login.html.erb +58 -15
  198. data/app/views/admin/users/show.html.erb +1 -1
  199. data/app/views/admin_mailer/invite.text.erb +1 -1
  200. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  201. data/app/views/errors/401.html.erb +6 -0
  202. data/app/views/errors/403.html.erb +1 -1
  203. data/app/views/errors/422.html.erb +7 -0
  204. data/app/views/errors/500.html.erb +2 -15
  205. data/app/views/errors/_generic_help.html.erb +1 -1
  206. data/app/views/feeds/pages.rss.builder +2 -2
  207. data/app/views/layouts/admin.html.erb +83 -79
  208. data/app/views/layouts/admin/_analytics.html.erb +1 -3
  209. data/app/views/layouts/admin/_header.html.erb +4 -4
  210. data/app/views/layouts/errors.html.erb +3 -7
  211. data/app/views/sitemaps/show.xml.builder +2 -0
  212. data/config/locales/en.yml +50 -1
  213. data/config/routes.rb +57 -58
  214. data/db/migrate/20111219033112_create_pages_tables.rb +191 -276
  215. data/lib/pages_core.rb +34 -32
  216. data/lib/pages_core/admin_menu_item.rb +18 -4
  217. data/lib/pages_core/archive_finder.rb +49 -20
  218. data/lib/pages_core/attachment_embedder.rb +36 -0
  219. data/lib/pages_core/cache_sweeper.rb +9 -89
  220. data/lib/pages_core/configuration.rb +3 -3
  221. data/lib/pages_core/configuration/base.rb +8 -9
  222. data/lib/pages_core/configuration/pages.rb +8 -9
  223. data/lib/pages_core/digest_verifier.rb +70 -0
  224. data/lib/pages_core/engine.rb +72 -5
  225. data/lib/pages_core/extensions.rb +2 -3
  226. data/lib/pages_core/extensions/string_extensions.rb +2 -2
  227. data/lib/pages_core/page_path_constraint.rb +23 -0
  228. data/lib/pages_core/pages_plugin.rb +13 -2
  229. data/lib/pages_core/plugin.rb +8 -52
  230. data/lib/pages_core/pub_sub.rb +38 -0
  231. data/lib/pages_core/static_cache.rb +26 -0
  232. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  233. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  234. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  235. data/lib/pages_core/templates.rb +10 -10
  236. data/lib/pages_core/templates/block_configuration.rb +4 -3
  237. data/lib/pages_core/templates/configuration.rb +115 -34
  238. data/lib/pages_core/templates/configuration_handler.rb +9 -5
  239. data/lib/pages_core/templates/configuration_proxy.rb +12 -12
  240. data/lib/pages_core/templates/controller_actions.rb +1 -1
  241. data/lib/pages_core/templates/template_configuration.rb +102 -98
  242. data/lib/pages_core/version.rb +2 -2
  243. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +11 -16
  244. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +1 -2
  245. data/lib/rails/generators/pages_core/frontend/templates/{application.css.scss.erb → application.scss.erb} +0 -0
  246. data/lib/rails/generators/pages_core/frontend/templates/{base.css.scss.erb → base.scss.erb} +0 -0
  247. data/lib/rails/generators/pages_core/frontend/templates/{breakpoints.css.scss.erb → breakpoints.scss.erb} +0 -0
  248. data/lib/rails/generators/pages_core/frontend/templates/clearfix.scss.erb +7 -0
  249. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +0 -3
  250. data/lib/rails/generators/pages_core/install/install_generator.rb +25 -66
  251. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  252. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -2
  253. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +1 -1
  254. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  255. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +16 -1
  256. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +1 -1
  257. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +1 -1
  258. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  259. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +9 -15
  260. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +1 -1
  261. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +5 -23
  262. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +19 -14
  263. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  264. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  265. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  266. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  267. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -45
  268. data/lib/tasks/pages.rake +2 -63
  269. data/lib/tasks/pages/cache.rake +12 -5
  270. data/lib/tasks/pages/export.rake +11 -0
  271. data/lib/tasks/pages/page_paths.rake +12 -0
  272. data/template.rb +5 -3
  273. data/vendor/assets/javascripts/ReactCrop.min.js +1 -0
  274. data/vendor/assets/javascripts/reflux.min.js +1 -0
  275. data/vendor/assets/stylesheets/ReactCrop.css +167 -0
  276. metadata +356 -192
  277. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  278. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  279. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  280. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  281. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  282. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  283. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  284. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  285. data/app/assets/javascripts/pages/admin.js.coffee +0 -54
  286. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
  287. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
  288. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
  289. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
  290. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
  291. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
  292. data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
  293. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
  294. data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
  295. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
  296. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
  297. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
  298. data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
  299. data/app/assets/stylesheets/pages/admin.css.erb +0 -404
  300. data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
  301. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
  302. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
  303. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
  304. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +0 -19
  305. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
  306. data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
  307. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +0 -160
  308. data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
  309. data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
  310. data/app/assets/stylesheets/pages/admin/modal.css.erb +0 -14
  311. data/app/assets/stylesheets/pages/admin/pagination.css.scss +0 -22
  312. data/app/assets/stylesheets/pages/admin/print.css.erb +0 -17
  313. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
  314. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
  315. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +0 -48
  316. data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
  317. data/app/controllers/admin/page_comments_controller.rb +0 -61
  318. data/app/controllers/admin/page_files_controller.rb +0 -81
  319. data/app/controllers/admin/page_images_controller.rb +0 -116
  320. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -28
  321. data/app/controllers/concerns/pages_core/exception_handler.rb +0 -114
  322. data/app/helpers/pages_core/login_helper.rb +0 -14
  323. data/app/indices/page_file_index.rb +0 -9
  324. data/app/indices/page_index.rb +0 -29
  325. data/app/indices/user_index.rb +0 -11
  326. data/app/models/concerns/pages_core/page_tree.rb +0 -85
  327. data/app/models/concerns/pages_core/searchable_page.rb +0 -33
  328. data/app/models/concerns/pages_core/templateable.rb +0 -85
  329. data/app/models/localization.rb +0 -27
  330. data/app/models/page_comment.rb +0 -18
  331. data/app/views/admin/pages/_edit_comments.html.erb +0 -21
  332. data/app/views/admin/pages/_pagelisting.html.erb +0 -63
  333. data/app/views/admin/users/_login_form.html.erb +0 -47
  334. data/app/views/admin_mailer/comment_notification.text.erb +0 -7
  335. data/app/views/admin_mailer/error_report.html.erb +0 -70
  336. data/app/views/errors/500_critical.html.erb +0 -7
  337. data/app/views/errors/report.html.erb +0 -4
  338. data/config/removed_migrations.yml +0 -60
  339. data/db/migrate/20120627033112_rename_textbits.rb +0 -19
  340. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -83
  341. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -11
  342. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -11
  343. data/db/migrate/20130303160632_remove_imagesets.rb +0 -24
  344. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -16
  345. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -25
  346. data/db/migrate/20140203183900_create_roles.rb +0 -63
  347. data/db/migrate/20140414150500_change_locale_names.rb +0 -13
  348. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
  349. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  350. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -79
  351. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  352. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  353. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  354. data/db/migrate/20141007173000_create_invites.rb +0 -16
  355. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  356. data/db/migrate/20150401131300_localize_images.rb +0 -39
  357. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  358. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  359. data/lib/pages_core/extensions/hash_extensions.rb +0 -23
  360. data/lib/pages_core/localizable.rb +0 -49
  361. data/lib/pages_core/localizable/active_record_extension.rb +0 -41
  362. data/lib/pages_core/localizable/class_methods.rb +0 -51
  363. data/lib/pages_core/localizable/configuration.rb +0 -50
  364. data/lib/pages_core/localizable/instance_methods.rb +0 -130
  365. data/lib/pages_core/localizable/localizer.rb +0 -72
  366. data/lib/pages_core/localizable/scope_extension.rb +0 -22
  367. data/lib/pages_core/paginates.rb +0 -102
  368. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +0 -8
  369. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -11
  370. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +0 -12
  371. data/lib/tasks/db.rake +0 -96
  372. data/lib/tasks/pages/assets.rake +0 -65
  373. data/lib/tasks/pages/update.rake +0 -19
  374. data/vendor/assets/javascripts/jquery.dimscreen.js +0 -77
  375. data/vendor/assets/javascripts/jquery.fieldselection.js +0 -59
@@ -1,74 +1,50 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class PageFile < ActiveRecord::Base
4
- include Dis::Model
3
+ class PageFile < ApplicationRecord
4
+ include PagesCore::Sweepable
5
5
 
6
6
  belongs_to :page
7
-
8
- validates_data_presence
9
- validates :content_type, presence: true
10
- validates :filename, presence: true
11
- validates :content_length, presence: true
7
+ belongs_to :attachment
12
8
 
13
9
  acts_as_list scope: :page
14
10
 
15
- localizable do
16
- attribute :description
17
- end
11
+ accepts_nested_attributes_for :attachment
18
12
 
19
- before_validation :set_name_from_filename
13
+ localizable
20
14
 
21
- after_save ThinkingSphinx::RealTime.callback_for(:page_file)
15
+ delegate :published, to: :page
22
16
 
23
- class << self
24
- def formats
25
- {
26
- "audio/mpeg" => :mp3,
27
- "image/gif" => :gif,
28
- "image/jpeg" => :jpg,
29
- "image/jpg" => :jpg,
30
- "image/pjpeg" => :jpg,
31
- "image/png" => :png,
32
- "application/pdf" => :pdf
33
- }
34
- end
17
+ def attachment
18
+ super&.localize!(locale)
35
19
  end
36
20
 
37
- def format?
38
- content_type && self.class.formats.keys.include?(content_type)
21
+ def name
22
+ attachment&.name
39
23
  end
40
24
 
41
- def format
42
- self.class.formats[content_type]
43
- end
44
-
45
- def filename_extension
46
- if filename_extension?
47
- filename.match(/\.([^\.]+)$/)[1]
48
- else
49
- ""
50
- end
25
+ def description
26
+ attachment&.description
51
27
  end
52
28
 
53
- def filename_extension?
54
- filename =~ /\./
29
+ def filename
30
+ attachment&.filename
55
31
  end
56
32
 
57
- def to_param
58
- if filename_extension?
59
- "#{id}.#{filename_extension}"
60
- else
61
- "#{id}"
62
- end
33
+ def format?
34
+ attachment&.format?
63
35
  end
64
36
 
65
- def published
66
- page.published
37
+ def format
38
+ attachment&.format
67
39
  end
68
40
 
69
- private
41
+ def to_param
42
+ return id unless attachment
70
43
 
71
- def set_name_from_filename
72
- self.name = File.basename(filename, ".*") if self.filename? && !self.name?
44
+ if attachment.filename_extension?
45
+ "#{id}-#{attachment.content_hash}.#{attachment.filename_extension}"
46
+ else
47
+ "#{id}-#{attachment.content_hash}"
48
+ end
73
49
  end
74
50
  end
@@ -1,51 +1,23 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
3
+ class PageImage < ApplicationRecord
4
+ include PagesCore::Sweepable
2
5
 
3
- class PageImage < ActiveRecord::Base
4
6
  belongs_to :page
5
7
  belongs_to_image :image
6
8
 
7
- validates_presence_of :page_id
9
+ validates :page_id, presence: true
8
10
 
9
11
  accepts_nested_attributes_for :image
10
12
  validates_associated :image
11
13
 
12
- acts_as_list scope: :page
14
+ acts_as_list scope: %i[page primary]
13
15
 
14
16
  localizable
15
17
 
16
- validate do |page_image|
17
- if page_image.page && page_image.page.page_images.count < 1
18
- page_image.primary = true
19
- end
20
- end
21
-
22
- after_save do |page_image|
23
- if page_image.primary_changed?
24
-
25
- # Make sure only one PageImage can be the primary,
26
- # then update image_id on the page.
27
- if page_image.primary?
28
- PageImage.where
29
- page_image.page
30
- .page_images
31
- .where("id != ?", page_image.id)
32
- .update_all(primary: false)
33
- page_image.page.update(image_id: page_image.image_id)
34
-
35
- # Clear image_id on the page if primary is toggled off
36
- else
37
- page_image.page.update(image_id: nil)
38
- end
39
- end
40
- end
41
-
42
- after_destroy do |page_image|
43
- page_image.page.update(image_id: nil) if page_image.primary?
44
- end
45
-
46
18
  class << self
47
19
  def cleanup!
48
- all.each do |page_image|
20
+ all.find_each do |page_image|
49
21
  page_image.destroy unless page_image.image
50
22
  end
51
23
  end
@@ -54,9 +26,4 @@ class PageImage < ActiveRecord::Base
54
26
  def image
55
27
  super.localize!(locale)
56
28
  end
57
-
58
- def to_json(options = {})
59
- options = { include: [:image] }.merge(options)
60
- super(options)
61
- end
62
29
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PagePath < ApplicationRecord
4
+ class PageNotSavedError < StandardError; end
5
+
6
+ class NoPathError < StandardError; end
7
+
8
+ class NoLocaleError < StandardError; end
9
+
10
+ belongs_to :page
11
+ validates :locale, presence: true
12
+ validates :path, presence: true, uniqueness: { scope: :locale }
13
+
14
+ class << self
15
+ def build(page)
16
+ page.locales.each do |locale|
17
+ localized = page.localize(locale)
18
+ localized.ensure_path_segment
19
+ associate(localized) if !localized.deleted? && localized.full_path?
20
+ end
21
+ page.children.each { |p| build(p) }
22
+ end
23
+
24
+ def build_all
25
+ Page.roots.each do |p|
26
+ build(p)
27
+ end
28
+ end
29
+
30
+ def get(locale, path)
31
+ find_by(locale: locale, path: path)
32
+ end
33
+
34
+ def associate(page, locale: nil, path: nil)
35
+ locale ||= page.locale
36
+ path ||= page.full_path
37
+ raise PageNotSavedError unless page.id?
38
+ raise NoLocaleError unless locale
39
+ raise NoPathError unless path
40
+
41
+ page_path = get_or_create(locale, path, page)
42
+ page_path.update(page: page) unless page_path.page_id == page.id
43
+ page_path
44
+ end
45
+
46
+ private
47
+
48
+ def get_or_create(locale, path, page)
49
+ get(locale, path) || create(locale: locale, path: path, page: page)
50
+ end
51
+ end
52
+ end
@@ -1,12 +1,14 @@
1
- class PasswordResetToken < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class PasswordResetToken < ApplicationRecord
2
4
  belongs_to :user
3
5
  before_create :ensure_token
4
6
  before_create :ensure_expiration
5
7
 
6
8
  validates :user_id, presence: true
7
9
 
8
- scope :active, -> { where("expires_at >= ?", Time.now) }
9
- scope :expired, -> { where("expires_at < ?", Time.now) }
10
+ scope :active, -> { where("expires_at >= ?", Time.now.utc) }
11
+ scope :expired, -> { where("expires_at < ?", Time.now.utc) }
10
12
 
11
13
  class << self
12
14
  def default_expiration
@@ -16,20 +18,16 @@ class PasswordResetToken < ActiveRecord::Base
16
18
  def expire!
17
19
  expired.delete_all
18
20
  end
19
-
20
- def find_by_token(token)
21
- active.where(token: token).first
22
- end
23
21
  end
24
22
 
25
23
  def expired?
26
- expires_at < Time.now
24
+ expires_at < Time.now.utc
27
25
  end
28
26
 
29
27
  private
30
28
 
31
29
  def ensure_expiration
32
- self.expires_at ||= Time.now + self.class.default_expiration
30
+ self.expires_at ||= Time.now.utc + self.class.default_expiration
33
31
  end
34
32
 
35
33
  def ensure_token
data/app/models/role.rb CHANGED
@@ -1,14 +1,16 @@
1
- class Role < ActiveRecord::Base
2
- belongs_to :user
1
+ # frozen_string_literal: true
2
+
3
+ class Role < ApplicationRecord
4
+ belongs_to :user, touch: true
3
5
  validates :name,
4
- presence: true,
6
+ presence: true,
5
7
  uniqueness: { scope: :user_id },
6
- inclusion: { in: proc { Role.roles.map(&:name) } }
8
+ inclusion: { in: proc { Role.roles.map(&:name) } }
7
9
 
8
10
  class << self
9
- def define(name, description, default = false)
11
+ def define(name, description, default: false)
10
12
  if roles.map(&:name).include?(name.to_s)
11
- fail ArgumentError, "Tried to define role :#{role}, " \
13
+ raise ArgumentError, "Tried to define role :#{role}, " \
12
14
  "but a role by that name already exists"
13
15
  else
14
16
  roles << OpenStruct.new(
@@ -20,7 +22,7 @@ class Role < ActiveRecord::Base
20
22
  end
21
23
 
22
24
  def roles
23
- @roles ||= default_roles
25
+ @roles ||= default_roles + config_roles
24
26
  end
25
27
 
26
28
  def names
@@ -29,6 +31,20 @@ class Role < ActiveRecord::Base
29
31
 
30
32
  protected
31
33
 
34
+ def config_file
35
+ Rails.root.join("config/roles.yml")
36
+ end
37
+
38
+ def config_roles
39
+ return [] unless File.exist?(config_file)
40
+
41
+ YAML.load_file(config_file).map do |key, opts|
42
+ OpenStruct.new(name: key.to_s,
43
+ description: opts["description"],
44
+ default: opts["default"])
45
+ end
46
+ end
47
+
32
48
  def default_roles
33
49
  [
34
50
  OpenStruct.new(
data/app/models/tag.rb CHANGED
@@ -1,40 +1,49 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class Tag < ActiveRecord::Base
3
+ class Tag < ApplicationRecord
4
4
  include PagesCore::HumanizableParam
5
- has_many :taggings
5
+ has_many :taggings, dependent: :destroy
6
6
 
7
7
  scope :pinned, -> { where(pinned: true) }
8
8
  scope :sorted, -> { order("pinned DESC, name ASC") }
9
9
 
10
10
  class << self
11
11
  def tags_and_suggestions_for(taggable, options = {})
12
- options = default_options.merge(options)
12
+ limit = options[:limit] || 100
13
13
  tags = (taggable.tags.sorted + pinned.sorted).uniq
14
- if tags.count < options[:limit]
15
- suggested = suggestions(tags, options)
16
- tags = tags.to_a + suggested[0...(options[:limit] - tags.length)]
17
- end
18
- tags
14
+
15
+ return tags unless tags.count < limit
16
+
17
+ tags + suggestions(taggable, tags, limit)[0...(limit - tags.length)]
19
18
  end
20
19
 
21
20
  def parse(*tags)
22
21
  Array(tags).flatten
23
- .map { |tag| tag.is_a?(Tag) ? tag.name : tag }
24
- .map { |tag| tag.split(",") }
25
- .flatten
26
- .map(&:strip)
22
+ .map { |tag| tag.is_a?(Tag) ? tag.name : tag }
23
+ .map { |tag| tag.split(",") }
24
+ .flatten
25
+ .map(&:strip)
27
26
  end
28
27
 
29
28
  private
30
29
 
31
- def suggestions(tags, options = {})
30
+ def suggestions(taggable, tags, limit)
31
+ suggestions = taggable_suggestions(taggable, limit).to_a
32
+ suggestions += all_suggestions(limit) if suggestions.length < limit
33
+ suggestions.reject { |t| tags.include?(t) }.uniq[0...limit]
34
+ end
35
+
36
+ def taggable_suggestions(taggable, limit)
37
+ all_suggestions(limit)
38
+ .where(taggings: { taggable_type: taggable.class.to_s })
39
+ end
40
+
41
+ def all_suggestions(limit)
32
42
  Tag.joins(:taggings)
33
- .select("`tags`.*, COUNT(`tags`.id) AS counter")
34
- .group("`tags`.id")
35
- .order("counter DESC")
36
- .limit(options[:limit])
37
- .reject { |t| tags.include?(t) }
43
+ .select("tags.*, COUNT(tags.id) AS counter")
44
+ .group("tags.id")
45
+ .order("counter DESC")
46
+ .limit(limit)
38
47
  end
39
48
 
40
49
  def default_options
@@ -1,13 +1,14 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class Tagging < ActiveRecord::Base
3
+ class Tagging < ApplicationRecord
4
4
  belongs_to :tag
5
- belongs_to :taggable, polymorphic: true
5
+ belongs_to :taggable, polymorphic: true, touch: true
6
6
 
7
- validates_presence_of :taggable_id, :taggable_type
7
+ validates :taggable_id, presence: true
8
+ validates :taggable_type, presence: true
8
9
  validates :tag_id,
9
10
  presence: true,
10
- uniqueness: { scope: [:taggable_type, :taggable_id] }
11
+ uniqueness: { scope: %i[taggable_type taggable_id] }
11
12
 
12
13
  def self.tagged_class(taggable)
13
14
  ActiveRecord::Base.send(
data/app/models/user.rb CHANGED
@@ -1,26 +1,31 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class User < ActiveRecord::Base
3
+ class User < ApplicationRecord
4
4
  include PagesCore::HasRoles
5
5
 
6
6
  attr_accessor :password, :confirm_password
7
7
 
8
- belongs_to :creator, class_name: "User", foreign_key: "created_by"
9
- has_many :created_users, class_name: "User", foreign_key: "created_by"
10
- has_many :pages
8
+ belongs_to(:creator,
9
+ class_name: "User",
10
+ foreign_key: "created_by",
11
+ optional: true,
12
+ inverse_of: :created_users)
13
+ has_many(:created_users,
14
+ class_name: "User",
15
+ foreign_key: "created_by",
16
+ dependent: :nullify,
17
+ inverse_of: :creator)
18
+ has_many :pages, dependent: :nullify
11
19
  has_many :password_reset_tokens, dependent: :destroy
12
20
  has_many :roles, dependent: :destroy
13
21
  has_many :invites, dependent: :destroy
14
- belongs_to_image :image, foreign_key: :image_id
22
+ belongs_to_image :image, foreign_key: :image_id, optional: true
15
23
 
16
24
  serialize :persistent_data
17
25
 
18
- validates :username,
19
- presence: true,
20
- uniqueness: { case_sensitive: false }
26
+ validates :username, presence: true, uniqueness: { case_sensitive: false }
21
27
 
22
- validates :name,
23
- presence: true
28
+ validates :name, presence: true
24
29
 
25
30
  validates :email,
26
31
  presence: true,
@@ -36,41 +41,41 @@ class User < ActiveRecord::Base
36
41
  before_validation :hash_password
37
42
  before_create :ensure_first_user_has_all_roles
38
43
 
39
- after_save ThinkingSphinx::RealTime.callback_for(:user)
40
-
41
44
  scope :by_name, -> { order("name ASC") }
42
45
  scope :activated, -> { by_name.includes(:roles).where(activated: true) }
43
46
  scope :deactivated, -> { by_name.includes(:roles).where(activated: false) }
44
47
 
45
48
  class << self
46
49
  def authenticate(email, password:)
47
- user = User.find_by_username_or_email(email)
50
+ user = User.login_name(email)
48
51
  user if user.try { |u| u.authenticate!(password) }
49
52
  end
50
53
 
54
+ def find_by_email(str)
55
+ find_by("LOWER(email) = ?", str.to_s.downcase)
56
+ end
57
+
51
58
  # Finds a user by either username or email address.
52
- def find_by_username_or_email(string)
53
- where(username: string.to_s).first ||
54
- where(email: string.to_s).first
59
+ def login_name(string)
60
+ find_by(username: string.to_s) || find_by_email(string)
55
61
  end
56
62
  end
57
63
 
58
64
  def authenticate!(password)
59
- if can_login? && valid_password?(password)
60
- rehash_password!(password) if password_needs_rehash?
61
- true
62
- else
63
- false
64
- end
65
+ return false unless can_login? && valid_password?(password)
66
+
67
+ rehash_password!(password) if password_needs_rehash?
68
+ true
65
69
  end
66
70
 
67
71
  def can_login?
68
- self.activated?
72
+ activated?
69
73
  end
70
74
 
71
75
  def mark_active!
72
76
  return if last_login_at && last_login_at > 10.minutes.ago
73
- update_columns(last_login_at: Time.now)
77
+
78
+ update(last_login_at: Time.now.utc)
74
79
  end
75
80
 
76
81
  def name_and_email
@@ -78,7 +83,7 @@ class User < ActiveRecord::Base
78
83
  end
79
84
 
80
85
  def online?
81
- (last_login_at && last_login_at > 15.minutes.ago) ? true : false
86
+ last_login_at && last_login_at > 15.minutes.ago ? true : false
82
87
  end
83
88
 
84
89
  def realname
@@ -89,6 +94,7 @@ class User < ActiveRecord::Base
89
94
 
90
95
  def confirm_password_must_match
91
96
  return if password.blank? || password == confirm_password
97
+
92
98
  errors.add(:confirm_password, "does not match")
93
99
  end
94
100
 
@@ -102,14 +108,15 @@ class User < ActiveRecord::Base
102
108
 
103
109
  def ensure_first_user_has_all_roles
104
110
  return if User.any?
111
+
105
112
  self.activated = true
106
- Role.roles.each do |role|
107
- roles.new(name: role.name)
113
+ Role.roles.each do |r|
114
+ roles.new(name: r.name) unless role?(r.name)
108
115
  end
109
116
  end
110
117
 
111
118
  def hash_password
112
- self.hashed_password = encrypt_password(password) unless password.blank?
119
+ self.hashed_password = encrypt_password(password) if password.present?
113
120
  end
114
121
 
115
122
  def password_needs_rehash?
@@ -122,10 +129,9 @@ class User < ActiveRecord::Base
122
129
 
123
130
  def valid_password?(password)
124
131
  if hashed_password.length <= 40
125
- return true if hashed_password == Digest::SHA1.hexdigest(password)
132
+ hashed_password == Digest::SHA1.hexdigest(password)
126
133
  else
127
- return true if BCrypt::Password.new(hashed_password) == password
134
+ BCrypt::Password.new(hashed_password) == password
128
135
  end
129
- false
130
136
  end
131
137
  end