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
  class CacheSweeper
3
5
  class << self
@@ -6,125 +8,25 @@ module PagesCore
6
8
  def disable(&_block)
7
9
  old_value = enabled
8
10
  self.enabled = false
9
- yield
11
+ yield if block_given?
10
12
  self.enabled = old_value
11
13
  end
12
14
 
13
15
  def once(&block)
14
16
  disable(&block)
15
- PagesCore::SweepCacheJob.perform_later
17
+ PagesCore::StaticCache.handler.sweep!
16
18
  end
17
19
 
18
- # Returns the configuration. Accepts a block, ie:
19
- #
20
- # PagesCore::CacheSweeper.config do |c|
21
- # c.patterns += [/^\/arkiv(.*)$/, /^\/tests(.*)$/]
22
- # end
23
20
  def config
24
- @configuration ||= default_config
25
- yield @configuration if block_given?
26
- @configuration
27
- end
28
-
29
- # Purge the entire pages cache
30
- def purge!
31
- cache_dir = config.cache_path
32
- FileUtils.rm_rf(Dir.glob("#{cache_dir}/*")) if File.exist?(cache_dir)
33
- end
34
-
35
- # Sweep all cached pages
36
- def sweep!
37
- return [] unless enabled
38
- cache_dirs.flat_map { |d| sweep_dir(d) }
39
- end
40
-
41
- private
42
-
43
- def cache_dirs
44
- if PagesCore.config(:domain_based_cache)
45
- Dir.entries(config.cache_path)
46
- .select { |d| visible_dir?(d) }
47
- .map { |d| File.join(config.cache_path, d).to_s }
48
- else
49
- [config.cache_path.to_s]
50
- end
51
- end
52
-
53
- # Returns the default configuration.
54
- def default_config
55
- OpenStruct.new(cache_path: ActionController::Base.page_cache_directory,
56
- patterns: [%r{^/index\.[\w]+$},
57
- %r{^/sitemap\.[\w]+$},
58
- %r{^/pages/[\w]{2,3}[/\.](.*)$},
59
- %r{^/[\w]{2,3}/(.*)$}])
60
- end
61
-
62
- def visible_dir?(dir)
63
- dir !~ /^\./ && File.directory?(File.join(config.cache_path, dir))
64
- end
65
-
66
- def sweep_dir(cache_dir)
67
- PagesCore::CacheSweeper.new(cache_dir).sweep!
21
+ ActiveSupport::Deprecation.warn(
22
+ "PagesCore::CacheSweeper.config is no longer used."
23
+ )
24
+ configuration = OpenStruct.new(patterns: [])
25
+ yield configuration if block_given?
26
+ configuration
68
27
  end
69
28
  end
70
29
 
71
- attr_reader :cache_dir
72
-
73
30
  self.enabled ||= true
74
-
75
- def initialize(cache_dir)
76
- @cache_dir = cache_dir
77
- end
78
-
79
- def sweep!
80
- return [] unless File.exist?(cache_dir)
81
- swept_files = []
82
-
83
- Find.find(cache_dir + "/") do |path|
84
- Find.prune if skip_path?(path) || !File.exist?(path)
85
-
86
- if sweep_file?(path)
87
- swept_files << path
88
- FileUtils.rm_rf(path)
89
- end
90
- end
91
- swept_files
92
- end
93
-
94
- private
95
-
96
- def locales
97
- return [I18n.default_locale.to_s] unless PagesCore.config.locales
98
-
99
- ([I18n.default_locale.to_s] +
100
- PagesCore.config.locales.keys.map(&:to_s)).uniq
101
- end
102
-
103
- def page_path?(relative)
104
- return false unless relative =~ /\.html$/
105
- page_paths.each do |p|
106
- return true if relative.start_with?(p)
107
- end
108
- false
109
- end
110
-
111
- def page_paths
112
- @page_paths ||= PagePath.all.flat_map do |p|
113
- ["/#{p.path}"] + locales.map { |l| "/#{l}/#{p.path}" }
114
- end
115
- end
116
-
117
- def pattern_match?(path)
118
- PagesCore::CacheSweeper.config.patterns.select { |p| p =~ path }.any?
119
- end
120
-
121
- def skip_path?(path)
122
- path =~ Regexp.new("^#{cache_dir}/dynamic_image[s]?")
123
- end
124
-
125
- def sweep_file?(path)
126
- relative = path.gsub(Regexp.new("^#{cache_dir}"), "")
127
- pattern_match?(relative) || page_path?(relative)
128
- end
129
31
  end
130
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Configuration
3
5
  class Base
@@ -25,6 +27,7 @@ module PagesCore
25
27
 
26
28
  def get(key)
27
29
  raise InvalidConfigurationKey unless setting?(key)
30
+
28
31
  if configuration.key?(key)
29
32
  configuration[key]
30
33
  else
@@ -34,6 +37,7 @@ module PagesCore
34
37
 
35
38
  def set(key, value)
36
39
  raise InvalidConfigurationKey unless setting?(key)
40
+
37
41
  value = parse_value(key, value)
38
42
  unless valid_type?(key, value)
39
43
  raise(
@@ -60,6 +64,7 @@ module PagesCore
60
64
 
61
65
  def valid_type?(key, value)
62
66
  return true if value.nil?
67
+
63
68
  if type_for(key) == :boolean
64
69
  value.is_a?(TrueClass) || value.is_a?(FalseClass)
65
70
  else
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/attachment_embedder"
4
+ require "pages_core/static_cache"
2
5
 
3
6
  module PagesCore
4
7
  module Configuration
@@ -8,13 +11,12 @@ module PagesCore
8
11
  setting :localizations, :boolean, false
9
12
  setting :locales, :hash
10
13
  setting :text_filter, :symbol, :textile
11
- setting :page_cache, :boolean, true
12
- setting :domain_based_cache, :boolean, false
13
14
  setting :rss_fulltext, :boolean, true
14
15
  setting :image_fallback_url, :string
15
16
  setting :default_author, :string
16
17
  setting :error_404_layout, :string
17
18
  setting :attachment_embedder, :object, PagesCore::AttachmentEmbedder
19
+ setting :static_cache_handler, :object
18
20
  end
19
21
  end
20
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/configuration/base"
2
4
  require "pages_core/configuration/pages"
3
5
 
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module PagesCore
4
4
  # = Digest Verifier
@@ -42,13 +42,13 @@ module PagesCore
42
42
 
43
43
  private
44
44
 
45
- def secure_compare(a, b)
46
- return false unless a.bytesize == b.bytesize
45
+ def secure_compare(value, other)
46
+ return false unless value.bytesize == other.bytesize
47
47
 
48
- l = a.unpack "C#{a.bytesize}"
48
+ l = value.unpack "C#{value.bytesize}"
49
49
 
50
50
  res = 0
51
- b.each_byte { |byte| res |= byte ^ l.shift }
51
+ other.each_byte { |byte| res |= byte ^ l.shift }
52
52
  res.zero?
53
53
  end
54
54
 
@@ -1,9 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class Engine < Rails::Engine
3
5
  # config.autoload_paths += Dir["#{config.root}/lib/"]
4
6
  # config.autoload_paths += Dir["#{config.root}/lib/pages_core/**/"]
5
7
  # config.eager_load_paths += Dir["#{config.root}/lib/pages_core/**/"]
6
8
 
9
+ initializer :factory_bot_definitions do |app|
10
+ path = File.expand_path("../../spec/factories", __dir__)
11
+
12
+ if defined?(FactoryBotRails)
13
+ app.config.factory_bot.definition_file_paths << path
14
+ FactoryBot.definition_file_paths =
15
+ Rails.application.config.factory_bot.definition_file_paths
16
+ end
17
+ end
18
+
7
19
  initializer :append_migrations do |app|
8
20
  unless app.root.to_s.match root.to_s
9
21
  config.paths["db/migrate"].expanded.each do |expanded_path|
@@ -15,21 +27,57 @@ module PagesCore
15
27
  # Enable asset precompilation
16
28
  initializer :assets do |_config|
17
29
  Rails.application.config.assets.precompile += %w[
18
- pages/admin.js
30
+ pages_core/admin-dist.js
19
31
  pages/admin.css
20
32
  pages/errors.css
33
+ pages/favicon.gif
34
+ pages/admin/icon.png
21
35
  pages/*.gif
22
36
  pages/*.png
23
37
  pages/*.jpg
24
38
  ]
25
39
  end
26
40
 
27
- initializer :enable_recursive_serialization do |_app|
28
- ActiveModelSerializers.config.default_includes = "**"
29
- end
30
-
31
41
  initializer :handle_exceptions do |app|
32
42
  app.config.exceptions_app = app.routes
43
+ ActionDispatch::ExceptionWrapper.rescue_responses.merge!(
44
+ "PagesCore::NotAuthorized" => :forbidden
45
+ )
46
+ end
47
+
48
+ initializer :healthcheck do |_app|
49
+ Healthcheck.configure do |config|
50
+ config.success = 200
51
+ config.error = 503
52
+ config.verbose = true
53
+ config.route = "/healthcheck"
54
+ config.method = :get
55
+
56
+ # -- Checks --
57
+ config.add_check :database, lambda {
58
+ ActiveRecord::Base.connection.execute("select 1")
59
+ }
60
+ # config.add_check :migrations, lambda {
61
+ # ActiveRecord::Migration.check_pending!
62
+ # }
63
+ # config.add_check :cache, -> { Rails.cache.read("some_key") }
64
+ end
65
+ end
66
+
67
+ initializer :lograge do |app|
68
+ app.config.lograge.enabled = true if ENV["ENABLE_LOGRAGE"]
69
+ app.config.lograge.formatter = Lograge::Formatters::Json.new
70
+ app.config.lograge.ignore_actions =
71
+ ["Healthcheck::HealthchecksController#check"]
72
+
73
+ app.config.lograge.custom_options = lambda do |event|
74
+ exclude_params = %w[controller action format id]
75
+ { remote_ip: event.payload[:remote_ip],
76
+ user_id: event.payload[:user_id],
77
+ user_email: event.payload[:user_email],
78
+ params: event.payload[:params]
79
+ .except(*exclude_params) }
80
+ end
33
81
  end
34
82
 
35
83
  # React configuration
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Extensions
3
5
  module StringExtensions
@@ -12,4 +14,4 @@ module PagesCore
12
14
  end
13
15
  end
14
16
 
15
- String.send(:include, PagesCore::Extensions::StringExtensions)
17
+ String.include PagesCore::Extensions::StringExtensions
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "pages_core/extensions/string_extensions"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class PagePathConstraint
3
5
  def matches?(request)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class PagesPlugin < Plugin
3
5
  class << self
@@ -14,7 +16,7 @@ module PagesCore
14
16
  paths["db/migrate"] = "db/migrate"
15
17
 
16
18
  admin_menu_item "News", proc { news_admin_pages_path(@locale) }, :pages,
17
- if: proc { Page.news_pages.any? },
19
+ if: proc { Page.news_pages.any? },
18
20
  current: proc { @page && @page.parent.try(&:news_page?) }
19
21
 
20
22
  admin_menu_item "Pages", proc { admin_pages_path(@locale) }, :pages
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # module PagesGallery
2
4
  # class Plugin < PagesCore::Plugin
3
5
  # paths['db/migrate'] = 'template/db/migrate'
@@ -21,6 +23,7 @@ module PagesCore
21
23
  end
22
24
  )
23
25
  end
26
+ super
24
27
  end
25
28
 
26
29
  def admin_menu_item(label, path, group = :custom, options = {})
@@ -35,38 +38,10 @@ module PagesCore
35
38
  end
36
39
  end
37
40
 
38
- def migrations
39
- plugins.map { |p| p.new.migrations }.flatten.compact
40
- end
41
-
42
- def removed_migrations
43
- plugins.map { |p| p.new.removed_migrations }.flatten.compact
44
- end
45
-
46
- def existing_removed_migrations
47
- removed_migrations
48
- .select { |m| File.exist?(Rails.root.join("db", "migrate", m)) }
49
- end
50
-
51
- def existing_migrations
52
- migrations
53
- .map { |m| Rails.root.join("db", "migrate", m.basename) }
54
- .select { |m| File.exist?(m) }
55
- end
56
-
57
- def remove_old_migrations!
58
- (existing_removed_migrations + existing_migrations).each do |migration|
59
- File.unlink Rails.root.join("db", "migrate", migration)
60
- end
61
- end
62
-
63
41
  private
64
42
 
65
43
  def default_paths
66
- {
67
- "db/migrate" => "db/migrate",
68
- "config/removed_migrations.yml" => "config/removed_migrations.yml"
69
- }
44
+ { "db/migrate" => "db/migrate" }
70
45
  end
71
46
  end
72
47
 
@@ -78,29 +53,6 @@ module PagesCore
78
53
  self.class.paths
79
54
  end
80
55
 
81
- def migrations_path
82
- root.join(paths["db/migrate"])
83
- end
84
-
85
- def removed_migrations_path
86
- root.join(paths["config/removed_migrations.yml"])
87
- end
88
-
89
- def migrations?
90
- File.exist?(migrations_path) && File.directory?(migrations_path)
91
- end
92
-
93
- def migrations
94
- Dir.entries(migrations_path)
95
- .select { |f| f =~ /\.rb$/ }
96
- .map { |f| migrations_path.join(f) }
97
- end
98
-
99
- def removed_migrations
100
- return unless File.exist?(removed_migrations_path)
101
- YAML.load_file(removed_migrations_path)
102
- end
103
-
104
56
  protected
105
57
 
106
58
  def find_root_with_subfolder(subfolder)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PubSub
3
5
  class << self
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module StaticCache
5
+ class NullHandler
6
+ def cache_page(_controller, _request, _response); end
7
+
8
+ def cache_page_permanently(_controller, _request, _response); end
9
+
10
+ def purge!; end
11
+
12
+ def sweep!; end
13
+
14
+ def sweep_now!; end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module StaticCache
5
+ class PageCacheHandler
6
+ def cache_page(controller, _request, _response)
7
+ controller.class.page_cache_directory = page_cache_directory
8
+ controller.cache_page
9
+ end
10
+
11
+ def cache_page_permanently(controller, _request, _response)
12
+ controller.class.page_cache_directory = permanent_page_cache_directory
13
+ controller.cache_page
14
+ end
15
+
16
+ def purge!
17
+ return unless PagesCore::CacheSweeper.enabled
18
+
19
+ clear_directory(page_cache_directory)
20
+ clear_directory(permanent_page_cache_directory)
21
+ end
22
+
23
+ def sweep!
24
+ return unless PagesCore::CacheSweeper.enabled
25
+
26
+ PagesCore::SweepCacheJob.perform_later
27
+ end
28
+
29
+ def sweep_now!
30
+ return unless PagesCore::CacheSweeper.enabled
31
+
32
+ clear_directory(page_cache_directory)
33
+ end
34
+
35
+ private
36
+
37
+ def cache_root
38
+ Rails.root.join("public")
39
+ end
40
+
41
+ def clear_directory(path)
42
+ return unless File.exist?(path)
43
+
44
+ FileUtils.rm_rf(Dir.glob("#{path}/*"))
45
+ end
46
+
47
+ def page_cache_directory
48
+ cache_root.join("static_cache")
49
+ end
50
+
51
+ def permanent_page_cache_directory
52
+ cache_root.join("cache")
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module StaticCache
5
+ class VarnishHandler
6
+ attr_reader :varnish_url
7
+
8
+ def initialize(varnish_url)
9
+ @varnish_url = varnish_url
10
+ end
11
+
12
+ def cache_page(_controller, request, response)
13
+ response.set_header("X-Cache-Tags", "static")
14
+ request.session_options[:skip] = true
15
+ # controller.expires_in 1.hour, public: true
16
+ end
17
+
18
+ def cache_page_permanently(controller, request, response)
19
+ response.set_header("X-Cache-Tags", "permanent")
20
+ request.session_options[:skip] = true
21
+ controller.expires_in 1.year, public: true
22
+ end
23
+
24
+ def purge!
25
+ return unless PagesCore::CacheSweeper.enabled
26
+
27
+ hydra = Typhoeus::Hydra.hydra
28
+ hydra.queue(ban_request("static"))
29
+ hydra.queue(ban_request("permanent"))
30
+ hydra.run
31
+ end
32
+
33
+ def sweep!
34
+ return unless PagesCore::CacheSweeper.enabled
35
+
36
+ # PagesCore::SweepCacheJob.perform_later
37
+ sweep_now!
38
+ end
39
+
40
+ def sweep_now!
41
+ return unless PagesCore::CacheSweeper.enabled
42
+
43
+ ban_request("static").run
44
+ end
45
+
46
+ private
47
+
48
+ def ban_request(cache_tag)
49
+ Typhoeus::Request.new(varnish_url,
50
+ method: :ban,
51
+ headers: { "X-Cache-Tags": cache_tag })
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pages_core/static_cache/null_handler"
4
+ require "pages_core/static_cache/page_cache_handler"
5
+ require "pages_core/static_cache/varnish_handler"
6
+
7
+ module PagesCore
8
+ module StaticCache
9
+ class << self
10
+ def handler
11
+ PagesCore.config.static_cache_handler || default_handler
12
+ end
13
+
14
+ private
15
+
16
+ def default_handler
17
+ if ENV["VARNISH_URL"]
18
+ return PagesCore::StaticCache::VarnishHandler.new(ENV["VARNISH_URL"])
19
+ end
20
+
21
+ # PagesCore::StaticCache::NullHandler.new
22
+ PagesCore::StaticCache::PageCacheHandler.new
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,14 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Templates
3
5
  # Configuration for the blocks on an individual template
4
6
  class BlockConfiguration
5
7
  attr_reader :name, :title, :description, :optional, :enforced
8
+
6
9
  def small?
7
10
  @size == :small
8
11
  end
9
12
 
10
13
  def large?
11
- small? ? false : true
14
+ !small?
12
15
  end
13
16
  end
14
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Templates
3
5
  # = Template configuration
@@ -96,7 +98,7 @@ module PagesCore
96
98
  enabled_blocks sub_template tags dates]
97
99
  end
98
100
 
99
- def configure_block(tpl_name, block_name, title = false, options = {})
101
+ def configure_block(tpl_name, block_name, title = nil, options = {})
100
102
  block_name = block_name.to_sym
101
103
  opts = {
102
104
  title: title || block_name.to_s.humanize,
@@ -115,6 +117,7 @@ module PagesCore
115
117
  unless valid_template_options.include?(setting)
116
118
  raise "Invalid template configuration value: #{setting.inspect}"
117
119
  end
120
+
118
121
  set(
119
122
  template_path(template_name),
120
123
  template_config(setting, value, options)
@@ -151,6 +154,7 @@ module PagesCore
151
154
 
152
155
  def template_path(name)
153
156
  return [:default] if name == :_defaults
157
+
154
158
  [:templates, name]
155
159
  end
156
160
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Templates
3
5
  class ConfigurationHandler
@@ -33,7 +35,7 @@ module PagesCore
33
35
 
34
36
  def proxy(proxy_block = nil, &callback)
35
37
  proxy_object = PagesCore::Templates::ConfigurationProxy.new(callback)
36
- proxy_block.call(proxy_object) if proxy_block
38
+ proxy_block&.call(proxy_object)
37
39
  proxy_object
38
40
  end
39
41
 
@@ -47,7 +49,7 @@ module PagesCore
47
49
  value = false if value == :disabled
48
50
  stack = [stack] unless stack.is_a?(Enumerable)
49
51
  partial_hash = stack.reverse.inject(value) do |hash, key|
50
- Hash[key => hash]
52
+ { key => hash }
51
53
  end
52
54
  @configuration = @configuration.deep_merge(partial_hash)
53
55
  value
@@ -56,7 +58,7 @@ module PagesCore
56
58
  def get(*path)
57
59
  @configuration ||= {}
58
60
  path.inject(@configuration) do |value, key|
59
- value && value.is_a?(Hash) && value.key?(key) ? value[key] : nil
61
+ value.is_a?(Hash) && value&.key?(key) ? value[key] : nil
60
62
  end
61
63
  end
62
64
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Templates
3
5
  class ConfigurationProxy
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Templates
3
5
  module ControllerActions