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,9 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class HtmlFormatter
3
- include ActionView::Helpers::AssetTagHelper
4
- include PagesCore::ImagesHelper
5
- include Rails.application.routes.url_helpers
6
-
7
5
  class << self
8
6
  def to_html(string, options = {})
9
7
  new(string, options).to_html
@@ -16,12 +14,9 @@ module PagesCore
16
14
  end
17
15
 
18
16
  def to_html
19
- string = parse_images(parse_files(parse_attachments(@string)))
20
- if @options[:shorten] && string.length > @options[:shorten]
21
- string = string[0..@options[:shorten]] + "..."
22
- end
17
+ string = shorten(parse_images(parse_files(parse_attachments(@string))))
23
18
  string += " #{@options[:append]}" if @options[:append]
24
- RedCloth.new(string).to_html.html_safe
19
+ fix_markup(RedCloth.new(string).to_html).html_safe
25
20
  end
26
21
 
27
22
  private
@@ -34,31 +29,6 @@ module PagesCore
34
29
  /\[file:([\d,]+)\]/
35
30
  end
36
31
 
37
- def image_expression
38
- /\[image:(\d+)([^\]]*)?\]/
39
- end
40
-
41
- def embed_image(id, size:, class_name:, link:)
42
- image = Image.find(id).localize(I18n.locale)
43
- class_name = ["image", image_class_name(image), class_name].compact
44
- image_tag = dynamic_image_tag(image,
45
- size: size, crop: false, upscale: false)
46
- content_tag(:figure,
47
- (link ? link_to(image_tag, link) : image_tag) +
48
- image_caption(image),
49
- class: class_name)
50
- rescue ActiveRecord::RecordNotFound
51
- nil
52
- end
53
-
54
- def embed_image_size(str)
55
- if str =~ /size="(\d*x\d*)"/
56
- Regexp.last_match(1)
57
- else
58
- "2000x2000"
59
- end
60
- end
61
-
62
32
  def find_attachment(id)
63
33
  Attachment.find(id).localize(I18n.locale)
64
34
  rescue ActiveRecord::RecordNotFound
@@ -85,6 +55,10 @@ module PagesCore
85
55
  .compact
86
56
  end
87
57
 
58
+ def fix_markup(str)
59
+ Nokogiri::HTML.fragment(str).to_html
60
+ end
61
+
88
62
  def parse_attachments(string)
89
63
  string.gsub(attachment_expression).each do |str|
90
64
  PagesCore.config.attachment_embedder.new(
@@ -101,40 +75,16 @@ module PagesCore
101
75
  end
102
76
  end
103
77
 
104
- def parse_image(str)
105
- id = str.match(image_expression)[1]
106
- options = str.match(image_expression)[2]
107
- class_name = (Regexp.last_match(1) if options =~ /class="([\s\-\w]+)"/)
108
- link = (Regexp.last_match(1) if options =~ /link="([^"]+)"/)
109
- embed_image(id,
110
- size: embed_image_size(options),
111
- class_name: class_name,
112
- link: link)
113
- end
114
-
115
78
  def parse_images(string)
116
- string.gsub(image_expression).each do |str|
117
- parse_image(str)
118
- end
79
+ PagesCore::ImageEmbedder.new(string).embed
119
80
  end
120
81
 
121
- def image_caption(image)
122
- return unless image.caption?
123
- content_tag(:figcaption, image.caption)
124
- end
125
-
126
- def image_class_name(image)
127
- if image.size.x == image.size.y
128
- "square"
129
- elsif image.size.x > image.size.y
130
- "landscape"
131
- else
132
- "portrait"
82
+ def shorten(string)
83
+ unless @options[:shorten] && string.length > @options[:shorten]
84
+ return string
133
85
  end
134
- end
135
86
 
136
- def link_to(content, href)
137
- content_tag(:a, content, href: href)
87
+ "#{string[0..@options[:shorten]]}..."
138
88
  end
139
89
  end
140
90
  end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ class ImageEmbedder
5
+ include ActionView::Helpers::AssetTagHelper
6
+ include PagesCore::ImagesHelper
7
+ include Rails.application.routes.url_helpers
8
+
9
+ def initialize(string)
10
+ @string = string
11
+ end
12
+
13
+ def embed
14
+ parse_images(@string)
15
+ end
16
+
17
+ private
18
+
19
+ def image_expression
20
+ /\[image:(\d+)([^\]]*)?\]/
21
+ end
22
+
23
+ def embed_image(id, size:, class_name:, link:)
24
+ image = Image.find(id).localize(I18n.locale)
25
+ class_name = ["image", image_class_name(image), class_name].compact
26
+ image_tag = dynamic_image_tag(image,
27
+ size: size, crop: false, upscale: false)
28
+ tag.figure((link ? link_to(image_tag, link) : image_tag) +
29
+ image_caption(image), class: class_name)
30
+ rescue ActiveRecord::RecordNotFound
31
+ nil
32
+ end
33
+
34
+ def embed_image_size(str)
35
+ if str =~ /size="(\d*x\d*)"/
36
+ Regexp.last_match(1)
37
+ else
38
+ "2000x2000"
39
+ end
40
+ end
41
+
42
+ def image_caption(image)
43
+ return unless image.caption?
44
+
45
+ tag.figcaption(image.caption)
46
+ end
47
+
48
+ def image_class_name(image)
49
+ if image.size.x == image.size.y
50
+ "square"
51
+ elsif image.size.x > image.size.y
52
+ "landscape"
53
+ else
54
+ "portrait"
55
+ end
56
+ end
57
+
58
+ def link_to(content, href)
59
+ tag.a(content, href: href)
60
+ end
61
+
62
+ def parse_image(str)
63
+ id = str.match(image_expression)[1]
64
+ options = str.match(image_expression)[2]
65
+ class_name = (Regexp.last_match(1) if options =~ /class="([\s\-\w]+)"/)
66
+ link = (Regexp.last_match(1) if options =~ /link="([^"]+)"/)
67
+ embed_image(id,
68
+ size: embed_image_size(options),
69
+ class_name: class_name,
70
+ link: link)
71
+ end
72
+
73
+ def parse_images(string)
74
+ string.gsub(image_expression).each do |str|
75
+ parse_image(str)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class LinkRenderer < WillPaginate::ActionView::LinkRenderer
3
5
  def previous_page
4
6
  num = @collection.current_page > 1 &&
5
- @collection.current_page - 1
7
+ (@collection.current_page - 1)
6
8
  previous_or_next_page(num, "Previous", "previous")
7
9
  end
8
10
 
9
11
  def next_page
10
12
  num = @collection.current_page < total_pages &&
11
- @collection.current_page + 1
13
+ (@collection.current_page + 1)
12
14
  previous_or_next_page(num, "Next", "next")
13
15
  end
14
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
4
  module AdminHelper
3
5
  include PagesCore::Admin::AdminHelper
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
4
  module MenuHelper
3
5
  def header_tabs(group)
4
- content_tag :ul, class: group.to_s do
6
+ tag.ul(class: group.to_s) do
5
7
  safe_join(menu_items_for(group).map do |item|
6
- content_tag :li do
8
+ tag.li do
7
9
  path = instance_eval(&item.path)
8
10
  link_to(item.label,
9
11
  path,
@@ -20,9 +22,9 @@ module Admin
20
22
  .select { |_, routing| routing[:controller] == params[:controller] }
21
23
  end
22
24
 
23
- def find_menu_candidate
25
+ def find_menu_candidate(&block)
24
26
  menu_item_candidates
25
- .select { |item, routing| yield(item, routing) }
27
+ .select { |item, routing| block.call(item, routing) }
26
28
  .try(&:first)
27
29
  .try(&:first)
28
30
  end
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
4
  module PagesHelper
5
+ include PagesCore::Admin::PageBlocksHelper
6
+
3
7
  def available_templates_for_select
4
8
  PagesCore::Templates.names.collect do |template|
5
9
  if template == "index"
@@ -26,39 +30,6 @@ module Admin
26
30
  ([page.author] + User.activated).uniq
27
31
  end
28
32
 
29
- def page_block_field(form, block_name, block_options)
30
- labelled_field(
31
- if block_options[:type] == :select
32
- page_block_select(form, block_name, block_options)
33
- else
34
- page_block_text_field(form, block_name, block_options)
35
- end,
36
- block_options[:title],
37
- errors: form.object.errors[block_name],
38
- description: block_options[:description]
39
- )
40
- end
41
-
42
- def page_block_select(form, block_name, block_options)
43
- opts = localize_page_select_options(form, block_options)
44
- opts = opts.call if opts.is_a?(Proc)
45
- opts = opts.map { |v| [v, v] } unless nested_array?(opts)
46
- opts = ([["", nil]] + opts).uniq
47
-
48
- value = form.object.send(block_name)
49
- opts << [value, value] unless opts.map(&:last).include?(value)
50
-
51
- form.send(:select, block_name, opts)
52
- end
53
-
54
- def page_block_text_field(form, block_name, block_options)
55
- form.send(
56
- block_options[:size] == :field ? :text_field : :rich_text_area,
57
- block_name,
58
- page_block_field_options(block_options)
59
- )
60
- end
61
-
62
33
  def page_name(page, options = {})
63
34
  page_names = if options[:include_parents]
64
35
  page.self_and_ancestors.reverse
@@ -83,34 +54,10 @@ module Admin
83
54
 
84
55
  private
85
56
 
86
- def localize_page_select_options(form, block_options)
87
- if block_options[:options].is_a?(Hash)
88
- block_options[:options][form.object.locale.to_sym]
89
- else
90
- block_options[:options]
91
- end
92
- end
93
-
94
57
  def nested_array?(array)
95
58
  array.present? && array.first.is_a?(Array)
96
59
  end
97
60
 
98
- def page_block_classes(class_name, block_options = {})
99
- [class_name, block_options[:class]].join(" ").strip
100
- end
101
-
102
- def page_block_field_options(block_options = {})
103
- opts = { placeholder: block_options[:placeholder] }
104
- if block_options[:size] == :field
105
- opts.merge(class: page_block_classes("rich", block_options))
106
- else
107
- opts.merge(
108
- class: page_block_classes("rich", block_options),
109
- rows: (block_options[:size] == :large ? 15 : 5)
110
- )
111
- end
112
- end
113
-
114
61
  def page_name_with_fallback(page)
115
62
  if page.name?
116
63
  page.name.to_s
@@ -1,3 +1,5 @@
1
- module ApplicationHelper #:nodoc:
1
+ # frozen_string_literal: true
2
+
3
+ module ApplicationHelper # :nodoc:
2
4
  include PagesCore::ApplicationHelper
3
5
  end
@@ -1,3 +1,5 @@
1
- module FrontendHelper #:nodoc:
1
+ # frozen_string_literal: true
2
+
3
+ module FrontendHelper # :nodoc:
2
4
  include PagesCore::FrontendHelper
3
5
  end
@@ -1,13 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Admin
3
5
  module AdminHelper
6
+ include PagesCore::Admin::ContentTabsHelper
7
+ include PagesCore::Admin::DateRangeHelper
8
+ include PagesCore::Admin::ImageUploadsHelper
9
+ include PagesCore::Admin::PageJsonHelper
4
10
  include PagesCore::Admin::LabelledFieldHelper
5
11
  include PagesCore::Admin::TagEditorHelper
6
12
 
7
- attr_writer :page_title
8
- attr_writer :page_description
9
- attr_writer :page_description_class
10
- attr_writer :page_description_links
13
+ attr_writer :page_title, :page_description, :page_description_class,
14
+ :page_description_links
11
15
 
12
16
  def add_body_class(class_name)
13
17
  @body_classes ||= []
@@ -16,72 +20,10 @@ module PagesCore
16
20
 
17
21
  def body_classes
18
22
  classes = @body_classes || []
19
- classes << controller.class.to_s.underscore
20
- classes << "#{controller.action_name}_action" if controller.action_name
21
23
  classes << "with_notice" if flash[:notice]
22
24
  classes
23
25
  end
24
26
 
25
- def page_date_range(page)
26
- if page.all_day?
27
- date_range(page.starts_at.to_date, page.ends_at.to_date)
28
- else
29
- date_range(page.starts_at, page.ends_at)
30
- end
31
- end
32
-
33
- def date_range(starts_at, ends_at)
34
- show_time = !(starts_at.is_a?(Date) && ends_at.is_a?(Date))
35
- dates = if starts_at.year != ends_at.year
36
- [l(starts_at, format: :pages_full), l(ends_at, format: :pages_full)]
37
- elsif starts_at.month != ends_at.month
38
- [l(starts_at, format: :pages_date), l(ends_at, format: :pages_full)]
39
- elsif starts_at.day != ends_at.day && !show_time
40
- [l(starts_at, format: :pages_day), l(ends_at, format: :pages_full)]
41
- elsif starts_at.day != ends_at.day
42
- [l(starts_at, format: :pages_date), l(ends_at, format: :pages_full)]
43
- elsif !show_time
44
- [l(starts_at, format: :pages_full)]
45
- else
46
- [l(starts_at, format: :pages_full), l(ends_at, format: :pages_time)]
47
- end
48
- safe_join(dates.map(&:strip), "&ndash;".html_safe)
49
- end
50
-
51
- # Generates tags for an editable dynamic image.
52
- def editable_dynamic_image_tag(image, width: 250, caption: false, locale: nil)
53
- react_component("EditableImage",
54
- editable_image_options(
55
- image,
56
- width: width,
57
- caption: caption,
58
- locale: locale
59
- ).merge(width: width))
60
- end
61
-
62
- def image_uploader_tag(name, image, options = {})
63
- opts = { caption: false, locale: nil }.merge(options)
64
- react_component("ImageUploader",
65
- editable_image_options(
66
- image,
67
- caption: opts[:caption],
68
- locale: opts[:locale]
69
- ).merge(attr: name, alternative: opts[:alternative]))
70
- end
71
-
72
- def content_tab(name, options = {}, &block)
73
- @content_tabs ||= []
74
- return unless block_given?
75
- tab = {
76
- name: name.to_s.humanize,
77
- key: options[:key] || name.to_s.underscore.gsub(/[\s]+/, "_"),
78
- options: options,
79
- content: capture(&block)
80
- }
81
- @content_tabs << tab
82
- content_tab_tag(tab[:key], tab[:content])
83
- end
84
-
85
27
  def rich_text_area_tag(name, content = nil, options = {})
86
28
  react_component("RichTextArea",
87
29
  options.merge(id: sanitize_to_id(name),
@@ -90,7 +32,7 @@ module PagesCore
90
32
  end
91
33
 
92
34
  def link_separator
93
- safe_join [" ", content_tag(:span, "|", class: "separator"), " "]
35
+ safe_join [" ", tag.span("|", class: "separator"), " "]
94
36
  end
95
37
 
96
38
  def deprecate_page_description_args(string = nil, class_name = nil)
@@ -100,6 +42,7 @@ module PagesCore
100
42
  "use page_description_class=")
101
43
  end
102
44
  return unless string
45
+
103
46
  ActiveSupport::Deprecation.warn("Setting description with " \
104
47
  "page_description is deprecated, " \
105
48
  "use page_description=")
@@ -116,49 +59,22 @@ module PagesCore
116
59
  end
117
60
 
118
61
  def page_description_links(links = nil)
119
- if links
120
- ActiveSupport::Deprecation.warn(
121
- "Setting page description_links with page_description_links " \
122
- "is deprecated, use page_description_links="
123
- )
124
- @page_description_links = links
125
- else
126
- @page_description_links
127
- end
128
- end
62
+ return @page_description_links unless links
129
63
 
130
- def page_title(title = nil)
131
- if title
132
- ActiveSupport::Deprecation.warn(
133
- "Setting page title with page_title is deprecated, use page_title="
134
- )
135
- @page_title = title
136
- else
137
- @page_title
138
- end
64
+ ActiveSupport::Deprecation.warn(
65
+ "Setting page description_links with page_description_links " \
66
+ "is deprecated, use page_description_links="
67
+ )
68
+ @page_description_links = links
139
69
  end
140
70
 
141
- private
142
-
143
- def content_tab_tag(key, content)
144
- content_tag(:div,
145
- content,
146
- class: "content_tab",
147
- id: "content-tab-#{key}")
148
- end
71
+ def page_title(title = nil)
72
+ return @page_title unless title
149
73
 
150
- def editable_image_options(image, width: 250, caption: false, locale: nil)
151
- image_opts = if image
152
- { src: dynamic_image_path(image, size: "#{width * 2}x"),
153
- image: ::Admin::ImageSerializer.new(image) }
154
- else
155
- {}
156
- end
157
- image_opts.merge(width: width,
158
- caption: caption,
159
- locale: locale || I18n.default_locale,
160
- locales: PagesCore.config.locales,
161
- csrf_token: form_authenticity_token)
74
+ ActiveSupport::Deprecation.warn(
75
+ "Setting page title with page_title is deprecated, use page_title="
76
+ )
77
+ @page_title = title
162
78
  end
163
79
  end
164
80
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module ContentTabsHelper
6
+ def content_tab(name, options = {}, &block)
7
+ @content_tabs ||= []
8
+ return unless block_given?
9
+
10
+ tab = {
11
+ name: name.to_s.humanize,
12
+ key: options[:key] || name.to_s.underscore.gsub(/\s+/, "_"),
13
+ options: options,
14
+ content: capture(&block)
15
+ }
16
+ @content_tabs << tab
17
+ content_tab_tag(tab[:key], tab[:content])
18
+ end
19
+
20
+ private
21
+
22
+ def content_tab_tag(key, content)
23
+ tag.div(content,
24
+ class: "content-tab",
25
+ id: "content-tab-#{key}",
26
+ data: { tab: key,
27
+ "main-target" => "tab" })
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module DateRangeHelper
6
+ def page_date_range(page)
7
+ if page.all_day?
8
+ date_range(page.starts_at.to_date, page.ends_at.to_date)
9
+ else
10
+ date_range(page.starts_at, page.ends_at)
11
+ end
12
+ end
13
+
14
+ def date_range(starts_at, ends_at)
15
+ dates = different_year_date_range(starts_at, ends_at) ||
16
+ different_month_date_range(starts_at, ends_at) ||
17
+ different_day_date_range(starts_at, ends_at) ||
18
+ same_day_date_range(starts_at, ends_at)
19
+ safe_join(dates.map(&:strip), "&ndash;".html_safe)
20
+ end
21
+
22
+ private
23
+
24
+ def different_year_date_range(starts_at, ends_at)
25
+ return if starts_at.year == ends_at.year
26
+
27
+ [l(starts_at, format: :pages_full), l(ends_at, format: :pages_full)]
28
+ end
29
+
30
+ def different_month_date_range(starts_at, ends_at)
31
+ return if starts_at.month == ends_at.month
32
+
33
+ [l(starts_at, format: :pages_date), l(ends_at, format: :pages_full)]
34
+ end
35
+
36
+ def different_day_date_range(starts_at, ends_at)
37
+ return if starts_at.day == ends_at.day
38
+
39
+ if starts_at.is_a?(Date) && ends_at.is_a?(Date)
40
+ [l(starts_at, format: :pages_day), l(ends_at, format: :pages_full)]
41
+ else
42
+ [l(starts_at, format: :pages_date), l(ends_at, format: :pages_full)]
43
+ end
44
+ end
45
+
46
+ def same_day_date_range(starts_at, ends_at)
47
+ if starts_at.is_a?(Date) && ends_at.is_a?(Date)
48
+ [l(starts_at, format: :pages_full)]
49
+ else
50
+ [l(starts_at, format: :pages_full), l(ends_at, format: :pages_time)]
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Admin
3
5
  class FormBuilder < PagesCore::FormBuilder
@@ -19,6 +21,12 @@ module PagesCore
19
21
  )
20
22
  end
21
23
 
24
+ def labelled_rich_text_area(attribute, label_text = nil, options = {})
25
+ labelled_field(attribute, label_text, options) do |opts|
26
+ rich_text_area(attribute, opts)
27
+ end
28
+ end
29
+
22
30
  def labelled_image_uploader(attribute, label_text = nil, options = {})
23
31
  labelled_field(attribute, label_text, options) do |opts|
24
32
  image_uploader(attribute, opts)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module ImageUploadsHelper
6
+ # Generates tags for an editable dynamic image.
7
+ def editable_dynamic_image_tag(image, width: 250,
8
+ caption: false, locale: nil)
9
+ react_component("EditableImage",
10
+ editable_image_options(
11
+ image,
12
+ width: width,
13
+ caption: caption,
14
+ locale: locale
15
+ ).merge(width: width))
16
+ end
17
+
18
+ def image_uploader_tag(name, image, options = {})
19
+ opts = { caption: false, locale: nil }.merge(options)
20
+ react_component("ImageUploader",
21
+ editable_image_options(
22
+ image,
23
+ caption: opts[:caption],
24
+ locale: opts[:locale]
25
+ ).merge(attr: name, alternative: opts[:alternative]))
26
+ end
27
+
28
+ private
29
+
30
+ def editable_image_src_options(image, width)
31
+ return {} unless image
32
+
33
+ { src: dynamic_image_path(image, size: "#{width * 2}x"),
34
+ image: ::Admin::ImageResource.new(image).to_hash }
35
+ end
36
+
37
+ def editable_image_options(image, width: 250, caption: false, locale: nil)
38
+ editable_image_src_options(image, width).merge(
39
+ width: width,
40
+ caption: caption,
41
+ locale: locale || I18n.default_locale,
42
+ locales: PagesCore.config.locales
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end