pages_core 3.6.2 → 3.8.2

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 (332) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -3
  3. data/Rakefile +3 -1
  4. data/app/assets/builds/pages_core/admin-dist.js +55 -0
  5. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  6. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
  7. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
  8. data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
  9. data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
  10. data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
  11. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
  12. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
  13. data/app/assets/stylesheets/pages/admin.scss +0 -1
  14. data/app/assets/stylesheets/pages/errors.css +2 -0
  15. data/app/controller_dummies/admin/admin_controller.rb +3 -1
  16. data/app/controller_dummies/application_controller.rb +3 -1
  17. data/app/controller_dummies/attachments_controller.rb +3 -1
  18. data/app/controller_dummies/frontend_controller.rb +3 -1
  19. data/app/controller_dummies/images_controller.rb +3 -1
  20. data/app/controller_dummies/page_files_controller.rb +3 -1
  21. data/app/controller_dummies/pages_controller.rb +3 -1
  22. data/app/controller_dummies/sitemaps_controller.rb +3 -1
  23. data/app/controllers/admin/attachments_controller.rb +5 -3
  24. data/app/controllers/admin/categories_controller.rb +2 -0
  25. data/app/controllers/admin/images_controller.rb +16 -8
  26. data/app/controllers/admin/invites_controller.rb +4 -1
  27. data/app/controllers/admin/pages_controller.rb +7 -19
  28. data/app/controllers/admin/password_resets_controller.rb +9 -5
  29. data/app/controllers/admin/users_controller.rb +10 -4
  30. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  31. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  32. data/app/controllers/concerns/pages_core/authentication.rb +13 -5
  33. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  34. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  35. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  36. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +8 -0
  37. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  38. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  39. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  40. data/app/controllers/errors_controller.rb +5 -53
  41. data/app/controllers/pages_core/admin_controller.rb +7 -67
  42. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  43. data/app/controllers/pages_core/base_controller.rb +11 -17
  44. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  45. data/app/controllers/pages_core/frontend/pages_controller.rb +14 -17
  46. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  47. data/app/controllers/pages_core/images_controller.rb +3 -1
  48. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  49. data/app/controllers/sessions_controller.rb +3 -1
  50. data/app/formatters/pages_core/html_formatter.rb +13 -63
  51. data/app/formatters/pages_core/image_embedder.rb +79 -0
  52. data/app/formatters/pages_core/link_renderer.rb +4 -2
  53. data/app/helpers/admin/admin_helper.rb +2 -0
  54. data/app/helpers/admin/menu_helper.rb +6 -4
  55. data/app/helpers/admin/pages_helper.rb +4 -57
  56. data/app/helpers/application_helper.rb +3 -1
  57. data/app/helpers/frontend_helper.rb +3 -1
  58. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  59. data/app/helpers/pages_core/admin/content_tabs_helper.rb +31 -0
  60. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  61. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  62. data/app/helpers/pages_core/admin/image_uploads_helper.rb +47 -0
  63. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  64. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  65. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  66. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -39
  67. data/app/helpers/pages_core/application_helper.rb +3 -0
  68. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  69. data/app/helpers/pages_core/form_builder.rb +17 -13
  70. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  71. data/app/helpers/pages_core/head_tags_helper.rb +18 -22
  72. data/app/helpers/pages_core/images_helper.rb +3 -0
  73. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  74. data/app/helpers/pages_core/open_graph_tags_helper.rb +8 -6
  75. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  76. data/app/javascript/admin-dist.js +2 -0
  77. data/app/javascript/components/Attachments/Attachment.jsx +121 -0
  78. data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
  79. data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
  80. data/app/javascript/components/Attachments.jsx +165 -0
  81. data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
  82. data/app/javascript/components/EditableImage.jsx +61 -0
  83. data/app/javascript/components/FileUploadButton.jsx +47 -0
  84. data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
  85. data/app/javascript/components/ImageCropper/Image.jsx +65 -0
  86. data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
  87. data/app/javascript/components/ImageCropper/useCrop.js +199 -0
  88. data/app/javascript/components/ImageCropper.jsx +90 -0
  89. data/app/javascript/components/ImageEditor/Form.jsx +98 -0
  90. data/app/javascript/components/ImageEditor.jsx +62 -0
  91. data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
  92. data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
  93. data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
  94. data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
  95. data/app/javascript/components/ImageGrid.jsx +257 -0
  96. data/app/javascript/components/ImageUploader.jsx +171 -0
  97. data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
  98. data/app/{assets/javascripts/pages/admin/components/page_dates.jsx → javascript/components/PageDates.jsx} +11 -1
  99. data/app/{assets/javascripts/pages/admin/components/page_files.jsx → javascript/components/PageFiles.jsx} +11 -2
  100. data/app/{assets/javascripts/pages/admin/components/page_images.jsx → javascript/components/PageImages.jsx} +11 -2
  101. data/app/{assets/javascripts/pages/admin/components/page_tree_store.jsx → javascript/components/PageTree.jsx} +127 -137
  102. data/app/{assets/javascripts/pages/admin/components/page_tree.jsx → javascript/components/PageTreeDraggable.jsx} +44 -38
  103. data/app/{assets/javascripts/pages/admin/components/page_tree_node.jsx → javascript/components/PageTreeNode.jsx} +46 -31
  104. data/app/javascript/components/RichTextArea.jsx +213 -0
  105. data/app/javascript/components/RichTextToolbarButton.jsx +20 -0
  106. data/app/javascript/components/TagEditor/AddTagForm.jsx +42 -0
  107. data/app/javascript/components/TagEditor/Tag.jsx +32 -0
  108. data/app/javascript/components/TagEditor.jsx +61 -0
  109. data/app/javascript/components/Toast.jsx +72 -0
  110. data/app/javascript/components/drag/draggedOrder.js +51 -0
  111. data/app/javascript/components/drag/useDragCollection.js +84 -0
  112. data/app/javascript/components/drag/useDragUploader.js +112 -0
  113. data/app/javascript/components/drag/useDraggable.js +17 -0
  114. data/app/javascript/components/drag.js +6 -0
  115. data/app/javascript/components.js +15 -0
  116. data/app/javascript/controllers/EditPageController.js +20 -0
  117. data/app/javascript/controllers/LoginController.js +29 -0
  118. data/app/javascript/controllers/MainController.js +65 -0
  119. data/app/javascript/controllers/PageOptionsController.js +62 -0
  120. data/app/javascript/features/RichText.jsx +34 -0
  121. data/app/javascript/hooks.js +2 -0
  122. data/app/javascript/index.js +38 -0
  123. data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +64 -63
  124. data/app/javascript/lib/copyToClipboard.js +13 -0
  125. data/app/javascript/lib/readyHandler.js +22 -0
  126. data/app/javascript/lib/request.js +36 -0
  127. data/app/javascript/stores/ModalStore.jsx +12 -0
  128. data/app/javascript/stores/ToastStore.jsx +14 -0
  129. data/app/javascript/stores.js +2 -0
  130. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  131. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  132. data/app/mailers/admin_mailer.rb +4 -14
  133. data/app/models/attachment.rb +10 -8
  134. data/app/models/autopublisher.rb +3 -0
  135. data/app/models/category.rb +3 -1
  136. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  137. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  138. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  139. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  140. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  141. data/app/models/concerns/pages_core/page_model/images.rb +8 -2
  142. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  143. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  144. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  145. data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
  146. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  147. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  148. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  149. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  150. data/app/models/concerns/pages_core/searchable_document.rb +71 -0
  151. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  152. data/app/models/concerns/pages_core/taggable.rb +33 -12
  153. data/app/models/image.rb +14 -1
  154. data/app/models/invite.rb +3 -1
  155. data/app/models/invite_role.rb +5 -3
  156. data/app/models/page.rb +6 -3
  157. data/app/models/page_builder.rb +2 -0
  158. data/app/models/page_category.rb +3 -1
  159. data/app/models/page_exporter.rb +23 -10
  160. data/app/models/page_file.rb +3 -1
  161. data/app/models/page_image.rb +3 -3
  162. data/app/models/page_path.rb +13 -5
  163. data/app/models/password_reset_token.rb +3 -1
  164. data/app/models/role.rb +9 -6
  165. data/app/models/search_document.rb +72 -0
  166. data/app/models/tag.rb +9 -6
  167. data/app/models/tagging.rb +4 -2
  168. data/app/models/user.rb +8 -5
  169. data/app/policies/invite_policy.rb +2 -0
  170. data/app/policies/page_file_policy.rb +2 -0
  171. data/app/policies/page_image_policy.rb +2 -0
  172. data/app/policies/page_policy.rb +2 -0
  173. data/app/policies/policy.rb +2 -0
  174. data/app/policies/user_policy.rb +2 -0
  175. data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +10 -7
  176. data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +13 -11
  177. data/app/resources/admin/page_file_resource.rb +10 -0
  178. data/app/resources/admin/page_image_resource.rb +10 -0
  179. data/app/resources/export/attachment_resource.rb +10 -0
  180. data/app/resources/export/page_image_resource.rb +45 -0
  181. data/app/resources/export/page_resource.rb +42 -0
  182. data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +10 -16
  183. data/app/resources/page_resource.rb +33 -0
  184. data/app/services/pages_core/create_user_service.rb +5 -2
  185. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  186. data/app/services/pages_core/invite_service.rb +4 -2
  187. data/app/views/admin/images/show.json.jbuilder +2 -0
  188. data/app/views/admin/pages/_edit_content.html.erb +1 -1
  189. data/app/views/admin/pages/_edit_files.html.erb +1 -5
  190. data/app/views/admin/pages/_edit_images.html.erb +1 -5
  191. data/app/views/admin/pages/_edit_options.html.erb +74 -55
  192. data/app/views/admin/pages/_form.html.erb +19 -0
  193. data/app/views/admin/pages/edit.html.erb +35 -61
  194. data/app/views/admin/pages/index.html.erb +0 -1
  195. data/app/views/admin/pages/new.html.erb +32 -32
  196. data/app/views/admin/pages/news.html.erb +1 -1
  197. data/app/views/admin/users/_access_control.html.erb +5 -1
  198. data/app/views/admin/users/login.html.erb +12 -4
  199. data/app/views/errors/500.html.erb +2 -20
  200. data/app/views/errors/_generic_help.html.erb +1 -1
  201. data/app/views/feeds/pages.rss.builder +3 -2
  202. data/app/views/layouts/admin/_header.html.erb +1 -1
  203. data/app/views/layouts/admin/_page_header.html.erb +33 -0
  204. data/app/views/layouts/admin.html.erb +23 -42
  205. data/app/views/pages_core/_google_analytics.html.erb +8 -0
  206. data/app/views/sitemaps/show.xml.builder +2 -0
  207. data/config/routes.rb +5 -5
  208. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  209. data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
  210. data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
  211. data/db/migrate/20210210235200_create_search_documents.rb +74 -0
  212. data/lib/pages_core/admin_menu_item.rb +3 -0
  213. data/lib/pages_core/archive_finder.rb +12 -16
  214. data/lib/pages_core/attachment_embedder.rb +4 -6
  215. data/lib/pages_core/cache_sweeper.rb +10 -108
  216. data/lib/pages_core/configuration/base.rb +5 -0
  217. data/lib/pages_core/configuration/pages.rb +4 -2
  218. data/lib/pages_core/configuration.rb +2 -0
  219. data/lib/pages_core/digest_verifier.rb +5 -5
  220. data/lib/pages_core/engine.rb +53 -5
  221. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  222. data/lib/pages_core/extensions.rb +2 -0
  223. data/lib/pages_core/page_path_constraint.rb +2 -0
  224. data/lib/pages_core/pages_plugin.rb +3 -1
  225. data/lib/pages_core/plugin.rb +4 -52
  226. data/lib/pages_core/pub_sub.rb +2 -0
  227. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  228. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  229. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  230. data/lib/pages_core/static_cache.rb +26 -0
  231. data/lib/pages_core/templates/block_configuration.rb +4 -1
  232. data/lib/pages_core/templates/configuration.rb +5 -1
  233. data/lib/pages_core/templates/configuration_handler.rb +5 -3
  234. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  235. data/lib/pages_core/templates/controller_actions.rb +2 -0
  236. data/lib/pages_core/templates/template_configuration.rb +18 -13
  237. data/lib/pages_core/templates.rb +5 -3
  238. data/lib/pages_core/version.rb +3 -1
  239. data/lib/pages_core.rb +13 -5
  240. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -7
  241. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  242. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  243. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  244. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  245. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  246. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  247. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  248. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  249. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  250. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +4 -2
  251. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  252. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  253. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  254. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  255. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  256. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  257. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  258. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  259. data/lib/tasks/pages/cache.rake +8 -5
  260. data/lib/tasks/pages/export.rake +3 -1
  261. data/lib/tasks/pages/page_paths.rake +2 -0
  262. data/lib/tasks/pages.rake +3 -2
  263. data/template.rb +2 -0
  264. metadata +194 -157
  265. data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
  266. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
  267. data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
  268. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
  269. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
  270. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +0 -44
  271. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
  272. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
  273. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -301
  274. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -171
  275. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
  276. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -63
  277. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -58
  278. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -37
  279. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
  280. data/app/assets/javascripts/pages/admin/components.jsx +0 -2
  281. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
  282. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
  283. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
  284. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
  285. data/app/assets/javascripts/pages/admin.jsx +0 -17
  286. data/app/assets/javascripts/pages/login_form.jsx +0 -21
  287. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  288. data/app/serializers/admin/page_file_serializer.rb +0 -6
  289. data/app/serializers/admin/page_image_serializer.rb +0 -6
  290. data/app/serializers/page_export_serializer.rb +0 -30
  291. data/app/serializers/page_file_export_serializer.rb +0 -4
  292. data/app/serializers/page_image_export_serializer.rb +0 -40
  293. data/app/serializers/page_serializer.rb +0 -21
  294. data/app/views/admin_mailer/error_report.html.erb +0 -70
  295. data/app/views/errors/500_critical.html.erb +0 -7
  296. data/app/views/errors/report.html.erb +0 -4
  297. data/app/views/layouts/admin/_analytics.html.erb +0 -16
  298. data/config/removed_migrations.yml +0 -60
  299. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  300. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  301. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  302. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  303. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  304. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  305. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  306. data/db/migrate/20140203183900_create_roles.rb +0 -66
  307. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  308. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  309. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  310. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  311. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  312. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  313. data/db/migrate/20141007173000_create_invites.rb +0 -16
  314. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  315. data/db/migrate/20150401131300_localize_images.rb +0 -38
  316. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  317. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  318. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  319. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  320. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  321. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  322. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  323. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  324. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  325. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  326. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  327. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  328. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
  329. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  330. data/lib/tasks/pages/update.rake +0 -17
  331. data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
  332. data/vendor/assets/javascripts/reflux.min.js +0 -1
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Authentication
3
5
  extend ActiveSupport::Concern
@@ -17,29 +19,35 @@ module PagesCore
17
19
  end
18
20
 
19
21
  def authenticate!(user)
20
- user.mark_active!
21
- @current_user = user
22
+ reset_session
23
+ authenticated(user)
22
24
  end
23
25
 
24
26
  def deauthenticate!
25
27
  @current_user = nil
26
- session[:current_user_id] = nil
28
+ reset_session
27
29
  end
28
30
 
29
31
  protected
30
32
 
33
+ def authenticated(user)
34
+ user.mark_active!
35
+ @current_user = user
36
+ end
37
+
31
38
  def start_authenticated_session
32
39
  if session[:current_user_id]
33
40
  user = User.where(id: session[:current_user_id]).first
34
41
  end
35
42
 
36
- return unless user && user.can_login?
43
+ return unless user&.can_login?
37
44
 
38
- authenticate!(user)
45
+ authenticated(user)
39
46
  end
40
47
 
41
48
  def finalize_authenticated_session
42
49
  return unless current_user
50
+
43
51
  session[:current_user_id] = current_user.id
44
52
  end
45
53
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ErrorRenderer
3
5
  extend ActiveSupport::Concern
@@ -23,6 +25,7 @@ module PagesCore
23
25
 
24
26
  def error_layout(error, options = {})
25
27
  return options[:layout] if options.key?(:layout)
28
+
26
29
  if error == 404 && PagesCore.config.error_404_layout?
27
30
  PagesCore.config.error_404_layout
28
31
  else
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module ErrorReporting
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :configure_sentry_context
9
+ end
10
+
11
+ protected
12
+
13
+ def configure_sentry_context
14
+ if Object.const_defined?("Sentry")
15
+ Sentry.set_user(current_user_context)
16
+ Sentry.set_tags(locale: params[:locale] || I18n.default_locale.to_s)
17
+ Sentry.set_extras(params: params.to_unsafe_h)
18
+ elsif Object.const_defined?("Raven")
19
+ configure_legacy_sentry_context
20
+ end
21
+ end
22
+
23
+ def configure_legacy_sentry_context
24
+ Raven.user_context(current_user_context)
25
+ Raven.tags_context(locale: params[:locale] || I18n.default_locale.to_s)
26
+ Raven.extra_context(params: params.to_unsafe_h)
27
+ end
28
+
29
+ def current_user_context
30
+ return { user_id: :guest } unless logged_in?
31
+
32
+ { user_id: current_user.id,
33
+ user_email: current_user.email }
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PoliciesHelper
3
5
  extend ActiveSupport::Concern
@@ -33,7 +35,8 @@ module PagesCore
33
35
  end
34
36
 
35
37
  def verify_policy(record)
36
- return true if policy(record).public_send(action_name + "?")
38
+ return true if policy(record).public_send("#{action_name}?")
39
+
37
40
  raise PagesCore::NotAuthorized
38
41
  end
39
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PreviewPagesController
3
5
  extend ActiveSupport::Concern
@@ -8,6 +10,8 @@ module PagesCore
8
10
 
9
11
  def preview
10
12
  redirect_to(page_url(@locale, @page)) && return unless logged_in?
13
+
14
+ @preview = true
11
15
  @page.attributes = page_params.merge(
12
16
  status: 2,
13
17
  published_at: Time.zone.now,
@@ -17,6 +21,10 @@ module PagesCore
17
21
  render_page
18
22
  end
19
23
 
24
+ def preview?
25
+ @preview || false
26
+ end
27
+
20
28
  private
21
29
 
22
30
  def disable_xss_protection
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ProcessTitler
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module RssController
3
5
  extend ActiveSupport::Concern
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module StaticCacheController
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def static_cache(*actions, permanent: false)
9
+ return unless perform_caching
10
+
11
+ if permanent
12
+ after_action :cache_static_page_permanently, only: actions
13
+ else
14
+ after_action :cache_static_page, only: actions
15
+ end
16
+ end
17
+
18
+ alias caches_page static_cache
19
+ end
20
+
21
+ def disable_static_cache!
22
+ @static_cache_disabled = true
23
+ end
24
+
25
+ private
26
+
27
+ def cache_static_page
28
+ return unless static_cache_allowed?
29
+
30
+ PagesCore::StaticCache.handler.cache_page(
31
+ self, request, response
32
+ )
33
+ end
34
+
35
+ def cache_static_page_permanently
36
+ return unless static_cache_allowed?
37
+
38
+ PagesCore::StaticCache.handler.cache_page_permanently(
39
+ self, request, response
40
+ )
41
+ end
42
+
43
+ def static_cache_allowed?
44
+ (request.get? || request.head?) && response.status == 200 &&
45
+ perform_caching && !@static_cache_disabled
46
+ end
47
+ end
48
+ end
@@ -1,13 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ErrorsController < ::ApplicationController
2
4
  layout "errors"
3
5
 
4
- def report
5
- report = decrypt_report(params[:error_report])
6
- report[:user] = User.find_by(id: report[:user_id]) if report.key?(:user_id)
7
-
8
- deliver_error_report(report, params[:email], params[:description])
9
- end
10
-
11
6
  def show
12
7
  render_error params[:id].to_i
13
8
  end
@@ -30,54 +25,11 @@ class ErrorsController < ::ApplicationController
30
25
 
31
26
  def internal_error
32
27
  exception = request.env["action_dispatch.exception"]
33
- if !exception
34
- render_error 500
35
- elsif exception.is_a?(PagesCore::NotAuthorized)
36
- render_error 403
37
- else
38
- @report = encrypt_report(error_report(request, exception))
28
+ if exception
39
29
  wrapper = ActionDispatch::ExceptionWrapper.new(nil, exception)
40
30
  render_error wrapper.status_code
31
+ else
32
+ render_error 500
41
33
  end
42
34
  end
43
-
44
- private
45
-
46
- def deliver_error_report(report, from, description)
47
- AdminMailer.error_report(report, from, description).deliver_now
48
- end
49
-
50
- def decrypt_report(str)
51
- YAML.safe_load(report_encryptor.decrypt_and_verify(str))
52
- end
53
-
54
- def encrypt_report(report)
55
- report_encryptor.encrypt_and_sign(report.to_yaml)
56
- end
57
-
58
- def error_report(request, exception)
59
- { message: exception.to_s,
60
- url: request.original_url,
61
- env: request.env.select { |_, v| v.is_a?(String) },
62
- params: params.to_unsafe_h,
63
- session: session.to_hash,
64
- backtrace: exception_backtrace(exception),
65
- timestamp: Time.now.utc,
66
- user_id: current_user.try(&:id) }
67
- end
68
-
69
- def exception_backtrace(exception)
70
- Rails.backtrace_cleaner.send(:filter, exception.backtrace)
71
- end
72
-
73
- def report_encryptor
74
- ActiveSupport::MessageEncryptor.new(
75
- ActiveSupport::CachingKeyGenerator.new(
76
- ActiveSupport::KeyGenerator.new(
77
- Rails.application.secrets.secret_key_base,
78
- iterations: 1000
79
- )
80
- ).generate_key("encrypted error report")
81
- )
82
- end
83
35
  end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # All admin controllers inherit Admin::AdminController, which provides layout,
2
4
  # authorization and other common code for the Admin set of controllers.
3
5
  module PagesCore
4
6
  class AdminController < ::ApplicationController
7
+ include PagesCore::Admin::PersistentParams
8
+
5
9
  protect_from_forgery with: :exception
6
10
 
7
11
  before_action :set_i18n_locale
8
12
  before_action :require_authentication
9
- before_action :restore_persistent_params
10
- after_action :save_persistent_params
11
13
 
12
14
  layout "admin"
13
15
 
@@ -36,29 +38,14 @@ module PagesCore
36
38
  # If not, renders the login screen.
37
39
  def require_authentication
38
40
  return if logged_in?
41
+
39
42
  if User.count < 1
40
- redirect_to(new_admin_user_url) && return
43
+ redirect_to(new_admin_user_url)
41
44
  else
42
- redirect_to(login_admin_users_url) && return
45
+ redirect_to(login_admin_users_url)
43
46
  end
44
47
  end
45
48
 
46
- # Loads persistent params from user model and merges with session.
47
- def restore_persistent_params
48
- return unless current_user && current_user.persistent_data?
49
- session[:persistent_params] ||= {}
50
- session[:persistent_params] = current_user.persistent_data.merge(
51
- session[:persistent_params]
52
- )
53
- end
54
-
55
- # Saves persistent params from session to User model if applicable.
56
- def save_persistent_params
57
- return unless current_user && session[:persistent_params]
58
- current_user.persistent_data = session[:persistent_params]
59
- current_user.save
60
- end
61
-
62
49
  def secure_compare(compare, other)
63
50
  return false unless compare && other
64
51
  return false unless compare.bytesize == other.bytesize
@@ -69,52 +56,5 @@ module PagesCore
69
56
  other.each_byte { |byte| res |= byte ^ l.shift }
70
57
  res.zero?
71
58
  end
72
-
73
- # --- HELPERS ---
74
-
75
- # Add a stylesheet
76
- def add_stylesheet(css_file)
77
- @admin_stylesheets ||= []
78
- @admin_stylesheets << "admin/#{css_file}"
79
- end
80
-
81
- def persistent_params(namespace)
82
- session[:persistent_params] ||= {}
83
- session[:persistent_params][namespace] ||= {}
84
- session[:persistent_params][namespace]
85
- end
86
-
87
- def coerce_persistent_param(value)
88
- case value
89
- when "true"
90
- true
91
- when "false"
92
- false
93
- else
94
- value
95
- end
96
- end
97
-
98
- # Get a persistent param
99
- def persistent_param(key, default = nil, options = {})
100
- key = key.to_s
101
- namespace = options[:namespace] || self.class.to_s
102
-
103
- value = coerce_persistent_param(
104
- if params.key?(key)
105
- params[key]
106
- elsif persistent_params(namespace).key?(key)
107
- persistent_params(namespace)[key]
108
- else
109
- default
110
- end
111
- )
112
-
113
- if !value.nil? || options[:preserve_nil]
114
- persistent_params(namespace)[key.to_s] = value
115
- end
116
-
117
- value
118
- end
119
59
  end
120
60
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class AttachmentsController < ::ApplicationController
3
5
  before_action :verify_signed_params
4
6
  before_action :find_attachment, only: %i[show download]
5
7
 
6
- caches_page :show
8
+ static_cache :show, permanent: true
7
9
 
8
10
  def show
9
11
  send_attachment
@@ -20,12 +22,14 @@ module PagesCore
20
22
  end
21
23
 
22
24
  def send_attachment(disposition: "inline")
23
- if stale?(etag: @attachment, last_modified: @attachment.updated_at)
24
- send_data(@attachment.data,
25
- filename: @attachment.filename,
26
- type: @attachment.content_type,
27
- disposition: disposition)
25
+ unless stale?(etag: @attachment, last_modified: @attachment.updated_at)
26
+ return
28
27
  end
28
+
29
+ send_data(@attachment.data,
30
+ filename: @attachment.filename,
31
+ type: @attachment.content_type,
32
+ disposition: disposition)
29
33
  end
30
34
 
31
35
  def verify_signed_params
@@ -1,41 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class BaseController < ActionController::Base
3
5
  include PagesCore::Authentication
4
- include PagesCore::DomainBasedCache
5
6
  include PagesCore::ErrorRenderer
7
+ include PagesCore::ErrorReporting
6
8
  include PagesCore::ProcessTitler
7
9
  include PagesCore::PoliciesHelper
10
+ include PagesCore::StaticCacheController
8
11
 
9
- before_action :set_locale, :configure_error_reporting
12
+ before_action :set_locale
10
13
  after_action :set_content_language_header
11
14
 
12
15
  protected
13
16
 
14
- # Configures additional report data if Sentry is installed
15
- def configure_error_reporting
16
- return unless Object.const_defined?("Raven")
17
- if logged_in?
18
- Raven.user_context(user_id: current_user.id,
19
- user_email: current_user.email)
20
- else
21
- Raven.user_context({})
22
- end
23
- Raven.tags_context(locale: locale)
24
- Raven.extra_context(params: params.to_unsafe_h)
17
+ def append_info_to_payload(payload)
18
+ super
19
+ payload[:remote_ip] = request.remote_ip
20
+ payload.merge!(current_user_context)
25
21
  end
26
22
 
27
23
  # Sets @locale from params[:locale], with I18n.default_locale as fallback
28
24
  def set_locale
29
- legacy_locales = {
30
- "nor" => "nb",
31
- "eng" => "en"
32
- }
25
+ legacy_locales = { "nor" => "nb", "eng" => "en" }
33
26
  @locale = params[:locale] || I18n.default_locale.to_s
34
27
  @locale = legacy_locales[@locale] if legacy_locales[@locale]
35
28
  end
36
29
 
37
30
  def set_content_language_header
38
31
  return unless locale
32
+
39
33
  headers["Content-Language"] = locale.to_s
40
34
  end
41
35
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Frontend
3
5
  class PageFilesController < ::FrontendController
@@ -6,9 +8,11 @@ module PagesCore
6
8
  before_action :find_page_file, only: %i[show]
7
9
 
8
10
  def show
9
- if stale?(etag: @page_file, last_modified: @page_file.updated_at)
10
- redirect_to attachment_path(@page_file.attachment)
11
+ unless stale?(etag: @page_file, last_modified: @page_file.updated_at)
12
+ return
11
13
  end
14
+
15
+ redirect_to attachment_path(@page_file.attachment)
12
16
  end
13
17
 
14
18
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Frontend
3
5
  class PagesController < ::FrontendController
@@ -13,7 +15,7 @@ module PagesCore
13
15
  before_action :find_page, only: %i[show preview]
14
16
  before_action :require_page, only: %i[show preview]
15
17
  before_action :canonicalize_url, only: [:show]
16
- after_action :cache_page_request, only: %i[index show]
18
+ static_cache :index, :show
17
19
 
18
20
  def index
19
21
  respond_to do |format|
@@ -25,8 +27,11 @@ module PagesCore
25
27
  def show
26
28
  respond_to do |format|
27
29
  format.html { render_published_page(@page) }
28
- format.rss { render_rss(@page.pages.limit(20), title: @page.name) }
29
- format.json { render json: @page }
30
+ format.json { render json: PageResource.new(@page) }
31
+ format.rss do
32
+ render_rss(@page.pages.limit(20).includes(:image, :author),
33
+ title: @page.name)
34
+ end
30
35
  end
31
36
  end
32
37
 
@@ -45,11 +50,8 @@ module PagesCore
45
50
  return if request.path == canonical_path(@page)
46
51
  # Don't canonicalize if any unknown params are present
47
52
  return if (params.keys - %w[controller action path locale id]).any?
48
- redirect_to(canonical_path(@page), status: :moved_permanently)
49
- end
50
53
 
51
- def disable_page_cache!
52
- @page_cache_disabled = true
54
+ redirect_to(canonical_path(@page), status: :moved_permanently)
53
55
  end
54
56
 
55
57
  def render(*args)
@@ -80,20 +82,13 @@ module PagesCore
80
82
  template = page_template(@page)
81
83
  run_template_actions_for(template, @page)
82
84
  return if @already_rendered
83
- render template: "pages/templates/#{template}"
84
- end
85
85
 
86
- # Cache pages by hand. This is dirty, but it works.
87
- def cache_page_request
88
- return if @page_cache_disabled || !PagesCore.config(:page_cache)
89
- return if response.status&.to_i != 200
90
- return unless @page && @locale
91
-
92
- self.class.cache_page(response.body, request.path)
86
+ render template: "pages/templates/#{template}"
93
87
  end
94
88
 
95
89
  def find_page_by_path
96
90
  return unless params[:path]
91
+
97
92
  @page = PagePath.get(locale, params[:path]).try(&:page)
98
93
  end
99
94
 
@@ -103,7 +98,7 @@ module PagesCore
103
98
  end
104
99
 
105
100
  def render_published_page(page)
106
- if page && page.published?
101
+ if page&.published?
107
102
  @page = page
108
103
  render_page
109
104
  else
@@ -113,11 +108,13 @@ module PagesCore
113
108
 
114
109
  def redirect_page(page)
115
110
  return false unless page.redirects?
111
+
116
112
  redirect_to(page.redirect_path(locale: locale))
117
113
  end
118
114
 
119
115
  def require_page
120
116
  return if @page
117
+
121
118
  render_error 404
122
119
  end
123
120
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Abstract controller for all frontend controllers.
2
4
  module PagesCore
3
5
  class FrontendController < ::ApplicationController
@@ -32,6 +34,7 @@ module PagesCore
32
34
  I18n.locale = locale_param
33
35
  rescue I18n::InvalidLocale
34
36
  raise if Rails.application.config.consider_all_requests_local
37
+
35
38
  render_error 404
36
39
  end
37
40
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class ImagesController < ::ApplicationController
3
5
  include DynamicImage::Controller
4
6
 
5
- caches_page :show, :uncropped, :original
7
+ static_cache :show, :uncropped, :original, permanent: true
6
8
 
7
9
  private
8
10
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class SitemapsController < ::ApplicationController
3
5
  include PagesCore::PagePathHelper
4
- caches_page :show
6
+ static_cache :show
5
7
 
6
8
  def show
7
9
  @entries = formatted_entries
@@ -42,13 +44,13 @@ module PagesCore
42
44
 
43
45
  def pages
44
46
  ([Page.root.try(:localize, I18n.default_locale)] +
45
- locales.flat_map do |locale|
46
- Page.published.localized(locale)
47
- end).compact.uniq
47
+ locales.flat_map do |locale|
48
+ Page.published.localized(locale).includes(:parent)
49
+ end).compact.uniq
48
50
  end
49
51
 
50
52
  def page_record_url(record)
51
- if record == Page.root && record.locale == I18n.default_locale
53
+ if record == root_page && record.locale == I18n.default_locale
52
54
  root_url
53
55
  else
54
56
  page_url(record.locale, record)
@@ -68,5 +70,9 @@ module PagesCore
68
70
  def records
69
71
  pages
70
72
  end
73
+
74
+ def root_page
75
+ @root_page ||= Page.root
76
+ end
71
77
  end
72
78
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SessionsController < ::ApplicationController
2
4
  def create
3
5
  user = find_user(params[:username], params[:password])
@@ -7,7 +9,7 @@ class SessionsController < ::ApplicationController
7
9
  redirect_to admin_default_url
8
10
  else
9
11
  flash[:notice] = "The provided email address and password combination " \
10
- "was not valid"
12
+ "was not valid"
11
13
  redirect_to login_admin_users_url
12
14
  end
13
15
  end