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 Admin
3
5
  module LabelledFieldHelper
@@ -17,7 +19,7 @@ module PagesCore
17
19
  # <% end %>
18
20
  #
19
21
  def labelled_field(field, label, options = {})
20
- content_tag(:div, class: labelled_field_class(options)) do
22
+ tag.div(class: labelled_field_class(options)) do
21
23
  safe_join(
22
24
  [labelled_field_label(label, options),
23
25
  labelled_field_description(options[:description]),
@@ -30,9 +32,8 @@ module PagesCore
30
32
  def image_upload_field(form, label, method = :image, options = {})
31
33
  output = ""
32
34
  if form.object.send(method)
33
- output += content_tag(:p,
34
- dynamic_image_tag(form.object.send(method),
35
- size: "120x100"))
35
+ output += tag.p(dynamic_image_tag(form.object.send(method),
36
+ size: "120x100"))
36
37
  end
37
38
  output + labelled_field(
38
39
  form.file_field(method),
@@ -43,7 +44,7 @@ module PagesCore
43
44
  private
44
45
 
45
46
  def labelled_field_class(options = {})
46
- if options[:errors] && options[:errors].any?
47
+ if options[:errors]&.any?
47
48
  "field field-with-errors"
48
49
  else
49
50
  "field"
@@ -51,19 +52,21 @@ module PagesCore
51
52
  end
52
53
 
53
54
  def labelled_field_label(label, options = {})
54
- content_tag(:label) do
55
+ tag.label do
55
56
  label + labelled_field_errors(options[:errors])
56
57
  end
57
58
  end
58
59
 
59
60
  def labelled_field_description(str)
60
61
  return "" unless str
61
- content_tag(:p, str, class: "description")
62
+
63
+ tag.p(str, class: "description")
62
64
  end
63
65
 
64
66
  def labelled_field_errors(errors)
65
- return "" unless errors && errors.any?
66
- content_tag(:span, class: "error") { Array(errors).last }
67
+ return "" unless errors&.any?
68
+
69
+ tag.span(class: "error") { Array(errors).last }
67
70
  end
68
71
  end
69
72
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module PageBlocksHelper
6
+ def page_block_field(form, block_name, block_options)
7
+ labelled_field(
8
+ if block_options[:type] == :select
9
+ page_block_select(form, block_name, block_options)
10
+ else
11
+ page_block_text_field(form, block_name, block_options)
12
+ end,
13
+ block_options[:title],
14
+ errors: form.object.errors[block_name],
15
+ description: block_options[:description]
16
+ )
17
+ end
18
+
19
+ def page_block_select(form, block_name, block_options)
20
+ opts = localize_page_select_options(form, block_options)
21
+ opts = opts.call if opts.is_a?(Proc)
22
+ opts = opts.map { |v| [v, v] } unless nested_array?(opts)
23
+ opts = ([["", nil]] + opts).uniq
24
+
25
+ value = form.object.send(block_name)
26
+ opts << [value, value] unless opts.map(&:last).include?(value)
27
+
28
+ form.send(:select, block_name, opts)
29
+ end
30
+
31
+ def page_block_text_field(form, block_name, block_options)
32
+ form.send(
33
+ block_options[:size] == :field ? :text_field : :rich_text_area,
34
+ block_name,
35
+ page_block_field_options(block_options)
36
+ )
37
+ end
38
+
39
+ private
40
+
41
+ def localize_page_select_options(form, block_options)
42
+ if block_options[:options].is_a?(Hash)
43
+ block_options[:options][form.object.locale.to_sym]
44
+ else
45
+ block_options[:options]
46
+ end
47
+ end
48
+
49
+ def page_block_classes(class_name, block_options = {})
50
+ [class_name, block_options[:class]].join(" ").strip
51
+ end
52
+
53
+ def page_block_field_options(block_options = {})
54
+ opts = { placeholder: block_options[:placeholder] }
55
+ if block_options[:size] == :field
56
+ opts.merge(class: page_block_classes("rich", block_options))
57
+ else
58
+ opts.merge(
59
+ class: page_block_classes("rich", block_options),
60
+ rows: (block_options[:size] == :large ? 15 : 5)
61
+ )
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module PageJsonHelper
6
+ def page_json(page)
7
+ { id: page.id, param: page.to_param,
8
+ name: page.name,
9
+ parent_page_id: page.parent_page_id,
10
+ locale: page.locale, status: page.status,
11
+ news_page: page.news_page,
12
+ published_at: page.published_at,
13
+ pinned: page.pinned?, starts_at: page.starts_at,
14
+ permissions: page_permissions(page) }
15
+ end
16
+
17
+ def page_permissions(page)
18
+ [(:edit if policy(page).edit?),
19
+ (:create if policy(page).edit?)].compact
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,45 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Admin
3
5
  module TagEditorHelper
4
- def tag_editor_for(
5
- form_helper, item, field_name = :serialized_tags, options = {}
6
- )
7
- tags = options[:tags] || Tag.tags_and_suggestions_for(item, limit: 20)
8
- tagged = options[:tagged] || item.tags
9
- options[:placeholder] ||= "Add tag..."
10
- content_tag(:div, class: "tag-editor clearfix") do
11
- form_helper.hidden_field(field_name, class: "serialized_tags") +
12
- tag_check_boxes(tags, tagged) +
13
- add_tag_button(options)
14
- end
15
- end
16
-
17
- private
18
-
19
- def tag_check_box(tag, tagged)
20
- content_tag(:span, class: :tag) do
21
- check_box_tag(
22
- "tag-#{tag.id}",
23
- 1,
24
- tagged.include?(tag)
25
- ) + content_tag(:span, tag.name, class: :name)
26
- end
27
- end
28
-
29
- def tag_check_boxes(tags, tagged)
30
- content_tag(:div, class: :tags) do
31
- safe_join(tags.map { |t| tag_check_box(t, tagged) }, "")
32
- end
33
- end
34
-
35
- def add_tag_button(options = {})
36
- content_tag(:div, class: "add-tag-form") do
37
- text_field_tag(
38
- "add_tag",
39
- options[:placeholder],
40
- class: "add-tag"
41
- ) + content_tag(:button, "Add", class: "add-tag-button")
42
- end
6
+ def tag_editor_for(form, object, attribute: :serialized_tags)
7
+ object ||= form.object
8
+ react_component(
9
+ "TagEditor",
10
+ { enabled: object.tags.map(&:name),
11
+ tags: Tag.tags_and_suggestions_for(object, limit: 20)
12
+ .map(&:name),
13
+ name: "#{form.object_name}[#{attribute}]" }
14
+ )
43
15
  end
44
16
  end
45
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Methods added to this helper will be available to all templates
2
4
  # in the application.
3
5
  module PagesCore
@@ -14,6 +16,7 @@ module PagesCore
14
16
  page.localize(link_locale) do |p|
15
17
  title = options[:title] || p.name.to_s
16
18
  return title unless conditional_options?(options)
19
+
17
20
  link_to(title, page_link_path(link_locale, p), class: options[:class])
18
21
  end
19
22
  end
@@ -1,36 +1,40 @@
1
- module PagesCore::AttachmentsHelper
2
- def attachment_path(*args)
3
- super(*attachment_params(args))
4
- end
1
+ # frozen_string_literal: true
5
2
 
6
- def download_attachment_path(*args)
7
- super(*attachment_params(args))
8
- end
3
+ module PagesCore
4
+ module AttachmentsHelper
5
+ def attachment_path(*args)
6
+ super(*attachment_params(args))
7
+ end
9
8
 
10
- def page_file_path(*args)
11
- ActiveSupport::Deprecation.warn(
12
- "#page_file_path is deprecated, use #attachment_path"
13
- )
14
- page_file = args.detect { |a| a.is_a?(PageFile) }
15
- return attachment_path(page_file.attachment) if page_file
9
+ def download_attachment_path(*args)
10
+ super(*attachment_params(args))
11
+ end
16
12
 
17
- super(*args)
18
- end
13
+ def page_file_path(*args)
14
+ ActiveSupport::Deprecation.warn(
15
+ "#page_file_path is deprecated, use #attachment_path"
16
+ )
17
+ page_file = args.detect { |a| a.is_a?(PageFile) }
18
+ return attachment_path(page_file.attachment) if page_file
19
19
 
20
- private
20
+ super(*args)
21
+ end
22
+
23
+ private
21
24
 
22
- def attachment_params(args)
23
- attachment = args.detect { |a| a.is_a?(Attachment) }
24
- args = [attachment.digest] + args if args.first == attachment
25
- if args.last.is_a?(Hash)
26
- args.last[:format] = attachment.filename_extension
27
- else
28
- args.push(format: attachment.filename_extension)
25
+ def attachment_params(args)
26
+ attachment = args.detect { |a| a.is_a?(Attachment) }
27
+ args = [attachment.digest] + args if args.first == attachment
28
+ if args.last.is_a?(Hash)
29
+ args.last[:format] = attachment.filename_extension
30
+ else
31
+ args.push(format: attachment.filename_extension)
32
+ end
33
+ args
29
34
  end
30
- args
31
- end
32
35
 
33
- def attachment_digest(attachment)
34
- Attachment.verifier.generate(attachment.id.to_s)
36
+ def attachment_digest(attachment)
37
+ Attachment.verifier.generate(attachment.id.to_s)
38
+ end
35
39
  end
36
40
  end
@@ -1,18 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class FormBuilder < ActionView::Helpers::FormBuilder
3
5
  include ActionView::Helpers::TagHelper
4
6
 
5
- def field_with_label(attr, str, label = nil)
6
- classes = ["field"]
7
+ def field_with_label(attr, str, label = nil, class_name = nil)
8
+ classes = ["field", class_name]
7
9
  classes << "field-with-errors" if object.errors[attr].any?
8
- content_tag(:div, label_for(attr, label) + str, class: classes.join(" "))
10
+ tag.div(label_for(attr, label) + str, class: classes.compact.join(" "))
9
11
  end
10
12
 
11
13
  def image_file_preview(attribute)
12
14
  return "" unless object.send(attribute) &&
13
15
  !object.send(attribute).new_record?
14
- content_tag(
15
- :p, @template.dynamic_image_tag(object.send(attribute), size: "120x100")
16
+
17
+ tag.p(
18
+ @template.dynamic_image_tag(object.send(attribute), size: "120x100")
16
19
  )
17
20
  end
18
21
 
@@ -22,14 +25,15 @@ module PagesCore
22
25
 
23
26
  def label_and_errors(attribute, label_text)
24
27
  return label_text unless object.errors[attribute].any?
25
- error = content_tag(:span, object.errors[attribute].first, class: "error")
28
+
29
+ error = tag.span(object.errors[attribute].first, class: "error")
26
30
  safe_join([label_text, error], " ")
27
31
  end
28
32
 
29
33
  def label_for(attribute, label_text = nil)
30
34
  label_text ||= object.class.human_attribute_name(attribute)
31
- content_tag("label", label_and_errors(attribute, label_text),
32
- for: [object.class.to_s.underscore, attribute].join("_"))
35
+ tag.label(label_and_errors(attribute, label_text),
36
+ for: [object.class.to_s.underscore, attribute].join("_"))
33
37
  end
34
38
 
35
39
  def labelled_check_box(
@@ -78,7 +82,7 @@ module PagesCore
78
82
  end
79
83
 
80
84
  def labelled_password_field(attribute, label_text = nil, options = {})
81
- labelled_field(attribute, label_text, options) do |opts|
85
+ labelled_field(attribute, label_text, options, "text-field") do |opts|
82
86
  password_field(attribute, opts)
83
87
  end
84
88
  end
@@ -90,13 +94,13 @@ module PagesCore
90
94
  end
91
95
 
92
96
  def labelled_text_area(attribute, label_text = nil, options = {})
93
- labelled_field(attribute, label_text, options) do |opts|
97
+ labelled_field(attribute, label_text, options, "text-area") do |opts|
94
98
  text_area(attribute, opts)
95
99
  end
96
100
  end
97
101
 
98
102
  def labelled_text_field(attribute, label_text = nil, options = {})
99
- labelled_field(attribute, label_text, options) do |opts|
103
+ labelled_field(attribute, label_text, options, "text-field") do |opts|
100
104
  text_field(attribute, opts)
101
105
  end
102
106
  end
@@ -109,12 +113,12 @@ module PagesCore
109
113
 
110
114
  protected
111
115
 
112
- def labelled_field(attribute, label_text = nil, options = {})
116
+ def labelled_field(attr, label_text = nil, options = {}, class_name = nil)
113
117
  if label_text.is_a?(Hash) && options == {}
114
118
  options = label_text
115
119
  label_text = nil
116
120
  end
117
- field_with_label(attribute, yield(options), label_text)
121
+ field_with_label(attr, yield(options), label_text, class_name)
118
122
  end
119
123
  end
120
124
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module FrontendHelper
3
5
  def root_pages
@@ -8,8 +10,6 @@ module PagesCore
8
10
  @root_page ||= root_pages.first
9
11
  end
10
12
 
11
- attr_reader :search_query
12
-
13
- attr_reader :search_category_id
13
+ attr_reader :search_query, :search_category_id
14
14
  end
15
15
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module HeadTagsHelper
3
5
  # Sets a document title.
@@ -30,6 +32,7 @@ module PagesCore
30
32
  def feed_tags(options = {})
31
33
  feeds = Page.enabled_feeds(@locale, options)
32
34
  return unless feeds.any?
35
+
33
36
  feed_tags = [
34
37
  rss_link_tag(PagesCore.config(:site_name),
35
38
  pages_url(@locale, format: :rss))
@@ -45,14 +48,8 @@ module PagesCore
45
48
  # google_analytics_tags "UA-12345678-1"
46
49
  #
47
50
  def google_analytics_tags(account_id)
48
- javascript_tag(
49
- "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||" \
50
- "function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new " \
51
- "Date();a=s.createElement(o),\nm=s.getElementsByTagName(o)[0];" \
52
- "a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n})(window," \
53
- "document,'script','//www.google-analytics.com/analytics.js','ga');" \
54
- "\n\nga('create', '#{account_id}', 'auto');\nga('send', 'pageview');"
55
- )
51
+ render(partial: "pages_core/google_analytics",
52
+ locals: { account_id: account_id })
56
53
  end
57
54
 
58
55
  # Outputs a HTML5 doctype and head tags, with document title
@@ -72,7 +69,7 @@ module PagesCore
72
69
  safe_join(
73
70
  [
74
71
  "<!doctype html>\n<html lang=\"#{I18n.locale}\">".html_safe,
75
- content_tag(:head) do
72
+ tag.head do
76
73
  safe_join(head_tag_contents(block_output), "\n")
77
74
  end
78
75
  ]
@@ -84,13 +81,10 @@ module PagesCore
84
81
  # rss_link_tag "My feed", "feed.rss"
85
82
  #
86
83
  def rss_link_tag(title, href)
87
- tag(
88
- :link,
89
- rel: "alternate",
90
- type: "application/rss+xml",
91
- title: title,
92
- href: href
93
- )
84
+ tag.link(rel: "alternate",
85
+ type: "application/rss+xml",
86
+ title: title,
87
+ href: href)
94
88
  end
95
89
 
96
90
  # Outputs Typekit tags.
@@ -108,11 +102,11 @@ module PagesCore
108
102
 
109
103
  def head_tag_contents(block_output)
110
104
  [
111
- tag(:meta, charset: "utf-8"),
112
- tag(:meta, "http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
113
- content_tag(:title, document_title),
105
+ tag.meta(charset: "utf-8"),
106
+ tag.meta("http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
107
+ tag.title(document_title),
114
108
  meta_description_tag, meta_keywords_tag,
115
- (tag(:link, rel: "image_src", href: meta_image) if meta_image?),
109
+ (tag.link(rel: "image_src", href: meta_image) if meta_image?),
116
110
  open_graph_tags,
117
111
  csrf_meta_tags,
118
112
  block_output
@@ -121,12 +115,14 @@ module PagesCore
121
115
 
122
116
  def meta_description_tag
123
117
  return unless meta_description?
124
- tag(:meta, name: "description", content: meta_description)
118
+
119
+ tag.meta(name: "description", content: meta_description)
125
120
  end
126
121
 
127
122
  def meta_keywords_tag
128
123
  return unless meta_keywords?
129
- tag(:meta, name: "keywords", content: meta_keywords)
124
+
125
+ tag.meta(name: "keywords", content: meta_keywords)
130
126
  end
131
127
  end
132
128
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ImagesHelper
3
5
  include DynamicImage::Helper
@@ -28,6 +30,7 @@ module PagesCore
28
30
  def extract_alt_text(record_or_array)
29
31
  record = extract_dynamic_image_record(record_or_array)
30
32
  return {} unless record.alternative?
33
+
31
34
  { alt: record.alternative }
32
35
  end
33
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module MetaTagsHelper
3
5
  # Sets a default image to use for meta tags. Supports
@@ -72,7 +74,7 @@ module PagesCore
72
74
  @meta_keywords = Array(args.first).join(", ")
73
75
  else
74
76
  keywords = @meta_keywords
75
- keywords ||= @page.tag_list if @page && @page.tags.any?
77
+ keywords ||= @page.tag_list if @page&.tags&.any?
76
78
  strip_tags(keywords)
77
79
  end
78
80
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module OpenGraphTagsHelper
3
5
  def open_graph_properties
@@ -11,7 +13,7 @@ module PagesCore
11
13
  properties
12
14
  .delete_if { |_, content| content.nil? }
13
15
  .map do |name, content|
14
- tag(:meta, property: "og:#{name}", content: content)
16
+ tag.meta(property: "og:#{name}", content: content)
15
17
  end,
16
18
  "\n"
17
19
  )
@@ -37,12 +39,12 @@ module PagesCore
37
39
 
38
40
  def default_open_graph_properties
39
41
  {
40
- type: "website",
41
- site_name: PagesCore.config(:site_name),
42
- title: default_open_graph_title,
43
- image: (meta_image if meta_image?),
42
+ type: "website",
43
+ site_name: PagesCore.config(:site_name),
44
+ title: default_open_graph_title,
45
+ image: (meta_image if meta_image?),
44
46
  description: default_open_graph_description,
45
- url: request.url
47
+ url: request.url
46
48
  }
47
49
  end
48
50
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PagePathHelper
3
5
  def page_path(locale, page, options = {})
@@ -6,17 +8,19 @@ module PagesCore
6
8
 
7
9
  (PagesCore.config.localizations? ? "/#{locale}/" : "/") +
8
10
  escape_page_path(p.full_path) +
11
+ (html_format?(options) ? "" : ".#{options[:format]}") +
9
12
  paginated_section(options)
10
13
  end
11
14
  end
12
15
 
13
16
  def page_url(page_or_locale, page = nil, opts = {})
14
17
  locale, page = page_url_locale_and_page(page_or_locale, page, opts)
18
+
15
19
  page.localize(locale) do |p|
16
- if p.redirects?
17
- p.redirect_path(locale: locale)
20
+ if p.redirects? && html_format?(opts)
21
+ page_redirect_url(locale, p)
18
22
  elsif p.full_path
19
- "#{request.protocol}#{request.host_with_port}" + page_path(locale, p)
23
+ base_page_url + page_path(locale, p, opts)
20
24
  else
21
25
  super(locale, p, opts)
22
26
  end
@@ -25,12 +29,28 @@ module PagesCore
25
29
 
26
30
  private
27
31
 
32
+ def page_redirect_url(locale, page)
33
+ redirect = page.redirect_path(locale: locale)
34
+ return redirect if redirect =~ %r{^https?://}
35
+
36
+ base_page_url + redirect
37
+ end
38
+
39
+ def base_page_url
40
+ "#{request.protocol}#{request.host_with_port}"
41
+ end
42
+
43
+ def html_format?(opts)
44
+ opts[:format].blank? || opts[:format].to_sym == :html
45
+ end
46
+
28
47
  def escape_page_path(path)
29
48
  path.split("/").map { |s| CGI.escape(s) }.join("/")
30
49
  end
31
50
 
32
51
  def page_url_locale_and_page(page_or_locale, page, opts)
33
52
  return [page_or_locale, page] if page
53
+
34
54
  ActiveSupport::Deprecation.warn(
35
55
  "Calling page_url without locale is deprecated"
36
56
  )
@@ -39,6 +59,7 @@ module PagesCore
39
59
 
40
60
  def paginated_section(opts)
41
61
  return "" unless opts[:page]
62
+
42
63
  "/page/#{opts[:page]}"
43
64
  end
44
65
  end
@@ -0,0 +1,2 @@
1
+ import startPages from "./index.js";
2
+ startPages();