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
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SearchDocument < ApplicationRecord
4
+ include PgSearch::Model
5
+
6
+ belongs_to :searchable, polymorphic: true
7
+
8
+ validates :locale, presence: true
9
+
10
+ before_validation :configure_dictionary,
11
+ :inherit_updated_at
12
+
13
+ scope :published, -> { where(published: true) }
14
+
15
+ pg_search_scope :full_text_search_scope, lambda { |query, dictionary|
16
+ { against: %i[name description content tags],
17
+ using: { tsearch: { prefix: true,
18
+ dictionary: dictionary,
19
+ tsvector_column: "tsv" },
20
+ trigram: { only: %i[name] } },
21
+ ignoring: :accents,
22
+ order_within_rank: "search_documents.record_updated_at DESC",
23
+ query: query }
24
+ }
25
+
26
+ class << self
27
+ def results
28
+ select(:searchable_id, :searchable_type, :locale)
29
+ .map(&:localized_searchable)
30
+ end
31
+
32
+ def search(query, locale: nil)
33
+ locale ||= I18n.locale
34
+ where(locale: locale)
35
+ .includes(:searchable)
36
+ .full_text_search_scope(query, search_configuration(locale))
37
+ end
38
+
39
+ def search_configuration(locale)
40
+ search_configurations[locale&.to_sym] || "simple_unaccent"
41
+ end
42
+
43
+ def search_configurations
44
+ # These are the dictionaries PostgreSQL 12 ships with.
45
+ # Also available in PostgreSQL 13: el: "greek_unaccent",
46
+ { ar: "arabic_unaccent", da: "danish_unaccent", nl: "dutch_unaccent",
47
+ en: "english_unaccent", fi: "finnish_unaccent", fr: "french_unaccent",
48
+ de: "german_unaccent", hu: "hungarian_unaccent",
49
+ id: "indonesian_unaccent", ga: "irish_unaccent", it: "italian_unaccent",
50
+ lt: "lithuanian_unaccent", ne: "nepali_unaccent",
51
+ nb: "norwegian_unaccent", pt: "portuguese_unaccent",
52
+ rm: "romanian_unaccent", ru: "russian_unaccent", es: "spanish_unaccent",
53
+ sv: "swedish_unaccent", ta: "tamil_unaccent", tr: "turkish_unaccent" }
54
+ end
55
+ end
56
+
57
+ def localized_searchable
58
+ return searchable unless searchable.respond_to?(:localize)
59
+
60
+ searchable.localize(locale)
61
+ end
62
+
63
+ private
64
+
65
+ def configure_dictionary
66
+ self.tsv_config = self.class.search_configuration(locale)
67
+ end
68
+
69
+ def inherit_updated_at
70
+ self.record_updated_at = searchable.updated_at
71
+ end
72
+ end
data/app/models/tag.rb CHANGED
@@ -1,7 +1,10 @@
1
- class Tag < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Tag < ApplicationRecord
2
4
  include PagesCore::HumanizableParam
3
5
  has_many :taggings, dependent: :destroy
4
6
 
7
+ scope :by_name, -> { order("name ASC") }
5
8
  scope :pinned, -> { where(pinned: true) }
6
9
  scope :sorted, -> { order("pinned DESC, name ASC") }
7
10
 
@@ -11,6 +14,7 @@ class Tag < ActiveRecord::Base
11
14
  tags = (taggable.tags.sorted + pinned.sorted).uniq
12
15
 
13
16
  return tags unless tags.count < limit
17
+
14
18
  tags + suggestions(taggable, tags, limit)[0...(limit - tags.length)]
15
19
  end
16
20
 
@@ -26,14 +30,13 @@ class Tag < ActiveRecord::Base
26
30
 
27
31
  def suggestions(taggable, tags, limit)
28
32
  suggestions = taggable_suggestions(taggable, limit).to_a
29
- if suggestions.length < limit
30
- suggestions += all_suggestions(limit)
31
- end
32
- suggestions.reject { |t| tags.include?(t) }.uniq[0...(limit)]
33
+ suggestions += all_suggestions(limit) if suggestions.length < limit
34
+ suggestions.reject { |t| tags.include?(t) }.uniq[0...limit]
33
35
  end
34
36
 
35
37
  def taggable_suggestions(taggable, limit)
36
- all_suggestions(limit).where("taggings.taggable_type = ?", taggable.class)
38
+ all_suggestions(limit)
39
+ .where(taggings: { taggable_type: taggable.class.to_s })
37
40
  end
38
41
 
39
42
  def all_suggestions(limit)
@@ -1,6 +1,8 @@
1
- class Tagging < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Tagging < ApplicationRecord
2
4
  belongs_to :tag
3
- belongs_to :taggable, polymorphic: true
5
+ belongs_to :taggable, polymorphic: true, touch: true
4
6
 
5
7
  validates :taggable_id, presence: true
6
8
  validates :taggable_type, presence: true
data/app/models/user.rb CHANGED
@@ -1,4 +1,6 @@
1
- class User < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class User < ApplicationRecord
2
4
  include PagesCore::HasRoles
3
5
 
4
6
  attr_accessor :password, :confirm_password
@@ -21,9 +23,7 @@ class User < ActiveRecord::Base
21
23
 
22
24
  serialize :persistent_data
23
25
 
24
- validates :username,
25
- presence: true,
26
- uniqueness: { case_sensitive: false }
26
+ validates :username, presence: true, uniqueness: { case_sensitive: false }
27
27
 
28
28
  validates :name, presence: true
29
29
 
@@ -63,6 +63,7 @@ class User < ActiveRecord::Base
63
63
 
64
64
  def authenticate!(password)
65
65
  return false unless can_login? && valid_password?(password)
66
+
66
67
  rehash_password!(password) if password_needs_rehash?
67
68
  true
68
69
  end
@@ -73,6 +74,7 @@ class User < ActiveRecord::Base
73
74
 
74
75
  def mark_active!
75
76
  return if last_login_at && last_login_at > 10.minutes.ago
77
+
76
78
  update(last_login_at: Time.now.utc)
77
79
  end
78
80
 
@@ -81,7 +83,7 @@ class User < ActiveRecord::Base
81
83
  end
82
84
 
83
85
  def online?
84
- last_login_at && last_login_at > 15.minutes.ago ? true : false
86
+ last_login_at && last_login_at > 15.minutes.ago
85
87
  end
86
88
 
87
89
  def realname
@@ -92,6 +94,7 @@ class User < ActiveRecord::Base
92
94
 
93
95
  def confirm_password_must_match
94
96
  return if password.blank? || password == confirm_password
97
+
95
98
  errors.add(:confirm_password, "does not match")
96
99
  end
97
100
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class InvitePolicy < Policy
2
4
  def index?
3
5
  true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PageFilePolicy < Policy
2
4
  def index?
3
5
  true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PageImagePolicy < Policy
2
4
  def index?
3
5
  true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PagePolicy < Policy
2
4
  def index?
3
5
  true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Policy
2
4
  module DefaultPolicy
3
5
  def index
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class UserPolicy < Policy
2
4
  def index?
3
5
  true
@@ -1,28 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
- class AttachmentSerializer < ActiveModel::Serializer
4
+ class AttachmentResource
5
+ include Alba::Resource
3
6
  include Rails.application.routes.url_helpers
4
7
  include PagesCore::AttachmentsHelper
5
8
 
6
9
  attributes :id, :filename, :content_type, :content_hash, :content_length,
7
- :name, :description, :created_at, :updated_at, :url
10
+ :created_at, :updated_at
8
11
 
9
- def name
12
+ attribute :name do
10
13
  localized_attribute(:name)
11
14
  end
12
15
 
13
- def description
16
+ attribute :description do
14
17
  localized_attribute(:description)
15
18
  end
16
19
 
17
- def url
20
+ attribute :url do
18
21
  attachment_path(object)
19
22
  end
20
23
 
21
24
  private
22
25
 
23
26
  def localized_attribute(attr)
24
- object.locales.each_with_object({}) do |locale, hash|
25
- hash[locale] = object.localize(locale).send(attr)
27
+ object.locales.index_with do |locale|
28
+ object.localize(locale).send(attr)
26
29
  end
27
30
  end
28
31
  end
@@ -1,27 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
- class ImageSerializer < ActiveModel::Serializer
4
+ class ImageResource
5
+ include Alba::Resource
3
6
  include Rails.application.routes.url_helpers
4
7
  include DynamicImage::Helper
5
8
 
6
9
  attributes :id, :filename, :content_type, :content_hash, :content_length,
7
10
  :colorspace, :real_width, :real_height, :crop_width,
8
11
  :crop_height, :crop_start_x, :crop_start_y, :crop_gravity_x,
9
- :crop_gravity_y, :alternative, :caption, :created_at, :updated_at
10
- attributes :cropped_url, :uncropped_url, :original_url, :thumbnail_url
12
+ :crop_gravity_y, :created_at, :updated_at
11
13
 
12
- def alternative
14
+ attribute :alternative do
13
15
  localized_attribute(:alternative)
14
16
  end
15
17
 
16
- def caption
18
+ attribute :caption do
17
19
  localized_attribute(:caption)
18
20
  end
19
21
 
20
- def original_url
22
+ attribute :original_url do
21
23
  original_dynamic_image_path(object)
22
24
  end
23
25
 
24
- def thumbnail_url
26
+ attribute :thumbnail_url do
25
27
  dynamic_image_path(
26
28
  object,
27
29
  size: "500x",
@@ -29,7 +31,7 @@ module Admin
29
31
  )
30
32
  end
31
33
 
32
- def cropped_url
34
+ attribute :cropped_url do
33
35
  dynamic_image_path(
34
36
  object,
35
37
  size: "1200x1200",
@@ -38,7 +40,7 @@ module Admin
38
40
  )
39
41
  end
40
42
 
41
- def uncropped_url
43
+ attribute :uncropped_url do
42
44
  uncropped_dynamic_image_path(
43
45
  object,
44
46
  size: "2000x2000",
@@ -49,8 +51,8 @@ module Admin
49
51
  private
50
52
 
51
53
  def localized_attribute(attr)
52
- object.locales.each_with_object({}) do |locale, hash|
53
- hash[locale] = object.localize(locale).send(attr)
54
+ object.locales.index_with do |locale|
55
+ object.localize(locale).send(attr)
54
56
  end
55
57
  end
56
58
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class PageFileResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :page_id, :attachment_id, :position
8
+ one :attachment, resource: Admin::AttachmentResource
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class PageImageResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :page_id, :image_id, :position, :primary
8
+ one :image, resource: Admin::ImageResource
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class AttachmentResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :filename, :content_type, :content_length, :content_hash,
8
+ :created_at, :updated_at
9
+ end
10
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class PageImageResource
5
+ include Alba::Resource
6
+
7
+ attributes :primary
8
+
9
+ attribute :id do
10
+ object.image.id
11
+ end
12
+
13
+ attribute :name do
14
+ object.image.name
15
+ end
16
+
17
+ attribute :alternative do
18
+ object.image.alternative
19
+ end
20
+
21
+ attribute :caption do
22
+ object.image.caption
23
+ end
24
+
25
+ attribute :content_hash do
26
+ object.image.content_hash
27
+ end
28
+
29
+ attribute :content_type do
30
+ object.image.content_type
31
+ end
32
+
33
+ attribute :filename do
34
+ object.image.filename
35
+ end
36
+
37
+ attribute :size do
38
+ object.image.crop_size
39
+ end
40
+
41
+ attribute :created_at do
42
+ object.image.created_at
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class PageResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :locale
8
+ attributes(*PagesCore::Templates::TemplateConfiguration.all_blocks)
9
+ attributes :created_at, :published_at, :pinned, :template, :redirect_to,
10
+ :starts_at, :ends_at, :all_day
11
+
12
+ has_many :attachments, resource: Export::AttachmentResource
13
+
14
+ attribute :author_name do
15
+ object&.author&.name
16
+ end
17
+
18
+ attribute :path do
19
+ object.full_path || object.to_param
20
+ end
21
+
22
+ attribute :image do
23
+ image_resource(object.page_images.where(primary: true).try(:first))
24
+ end
25
+
26
+ attribute :images do
27
+ object.page_images.map { |image| image_resource(image) }
28
+ end
29
+
30
+ attribute :status do
31
+ object.status_label
32
+ end
33
+
34
+ private
35
+
36
+ def image_resource(image)
37
+ return nil unless image
38
+
39
+ Export::PageImageResource.new(image)
40
+ end
41
+ end
42
+ end
@@ -1,35 +1,29 @@
1
- class PageImageSerializer < ActiveModel::Serializer
1
+ # frozen_string_literal: true
2
+
3
+ class PageImageResource
4
+ include Alba::Resource
2
5
  include Rails.application.routes.url_helpers
3
6
  include DynamicImage::Helper
4
7
 
5
- attributes :id, :image_id, :primary, :filename
6
- attributes :alternative, :caption, :created_at, :url
7
-
8
- def name
9
- object.image.name
10
- end
8
+ attributes :id, :image_id, :primary
11
9
 
12
- def alternative
10
+ attribute :alternative do
13
11
  object.image.alternative
14
12
  end
15
13
 
16
- def caption
14
+ attribute :caption do
17
15
  object.image.caption
18
16
  end
19
17
 
20
- def filename
18
+ attribute :filename do
21
19
  object.image.filename
22
20
  end
23
21
 
24
- def size
25
- object.image.crop_size
26
- end
27
-
28
- def created_at
22
+ attribute :created_at do
29
23
  object.image.created_at
30
24
  end
31
25
 
32
- def url
26
+ attribute :url do
33
27
  dynamic_image_path(
34
28
  object.image,
35
29
  size: "2000x2000",
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PageResource
4
+ include Alba::Resource
5
+
6
+ attributes :id, :parent_page_id, :locale
7
+ attributes(*PagesCore::Templates::TemplateConfiguration.all_blocks)
8
+ attributes :published_at, :pinned
9
+
10
+ attribute :param do
11
+ object.to_param
12
+ end
13
+
14
+ attribute :image do
15
+ image_resource(object.page_images.where(primary: true).try(:first))
16
+ end
17
+
18
+ attribute :images do
19
+ object.page_images.map { |image| image_resource(image) }
20
+ end
21
+
22
+ attribute :pages do
23
+ object.pages.map { |p| PageResource.new(p) }
24
+ end
25
+
26
+ private
27
+
28
+ def image_resource(image)
29
+ return nil unless image
30
+
31
+ PageImageResource.new(image)
32
+ end
33
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class CreateUserService
3
5
  attr_reader :attributes, :invite
@@ -8,8 +10,8 @@ module PagesCore
8
10
  end
9
11
 
10
12
  class << self
11
- def call(*attrs)
12
- new(*attrs).call
13
+ def call(attrs, invite: nil)
14
+ new(attrs, invite: invite).call
13
15
  end
14
16
  end
15
17
 
@@ -28,6 +30,7 @@ module PagesCore
28
30
 
29
31
  def invite_attributes
30
32
  return {} unless invite
33
+
31
34
  { role_names: invite.role_names,
32
35
  creator: invite.user,
33
36
  activated: true }
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ class DestroyInviteService
5
+ attr_reader :invite
6
+
7
+ def initialize(invite:)
8
+ @invite = invite
9
+ end
10
+
11
+ class << self
12
+ def call(invite:)
13
+ new(invite: invite).call
14
+ end
15
+ end
16
+
17
+ def call
18
+ Invite.transaction do
19
+ invite.destroy
20
+ PagesCore::PubSub.publish(:destroy_invite, invite: invite)
21
+ invite
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class InviteService
3
5
  include Rails.application.routes.url_helpers
@@ -12,8 +14,8 @@ module PagesCore
12
14
  end
13
15
 
14
16
  class << self
15
- def call(*attrs)
16
- new(*attrs).call
17
+ def call(attrs, user:, host:, protocol: "http")
18
+ new(attrs, user: user, host: host, protocol: protocol).call
17
19
  end
18
20
  end
19
21
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  json.extract!(
2
4
  @image, :id, :filename, :content_type, :content_hash,
3
5
  :content_length, :colorspace, :real_width, :real_height, :crop_width,
@@ -9,7 +9,7 @@
9
9
  all_day: @page.all_day }) %>
10
10
  <% end %>
11
11
 
12
- <% if !@page.new_record? && @page.template_config.value(:tags) %>
12
+ <% if @page.template_config.value(:tags) %>
13
13
  <div class="field">
14
14
  <label>
15
15
  Tags
@@ -1,8 +1,4 @@
1
1
  <%= react_component("PageFiles",
2
2
  locale: @locale,
3
3
  locales: PagesCore.config.locales,
4
- csrf_token: form_authenticity_token,
5
- records: ActiveModel::Serializer::CollectionSerializer.new(
6
- @page.files,
7
- serializer: Admin::PageFileSerializer
8
- )) %>
4
+ records: @page.files.map { |pf| Admin::PageFileResource.new(pf).to_hash }) %>
@@ -1,8 +1,4 @@
1
1
  <%= react_component("PageImages",
2
2
  locale: @locale,
3
3
  locales: PagesCore.config.locales,
4
- csrf_token: form_authenticity_token,
5
- records: ActiveModel::Serializer::CollectionSerializer.new(
6
- @page.page_images,
7
- serializer: Admin::PageImageSerializer
8
- )) %>
4
+ records: @page.page_images.map { |pi| Admin::PageImageResource.new(pi).to_hash }) %>