pages_core 3.5.1 → 3.6.0

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 (312) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +7 -13
  3. data/app/assets/javascripts/pages/{admin.es6.jsx → admin.jsx} +2 -4
  4. data/app/assets/javascripts/pages/admin/components.jsx +2 -0
  5. data/app/assets/javascripts/pages/admin/components/attachment.jsx +130 -0
  6. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +131 -0
  7. data/app/assets/javascripts/pages/admin/components/attachments.jsx +211 -0
  8. data/app/assets/javascripts/pages/admin/components/date_range_select.jsx +174 -0
  9. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +174 -0
  10. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +57 -0
  11. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +44 -0
  12. data/app/assets/javascripts/pages/admin/components/focal_point.jsx +82 -0
  13. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +124 -0
  14. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +496 -0
  15. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +301 -0
  16. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +171 -0
  17. data/app/assets/javascripts/pages/admin/components/modal.jsx +48 -0
  18. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +20 -0
  19. data/app/assets/javascripts/pages/admin/components/page_dates.jsx +58 -0
  20. data/app/assets/javascripts/pages/admin/components/page_files.jsx +14 -0
  21. data/app/assets/javascripts/pages/admin/components/page_images.jsx +16 -0
  22. data/app/assets/javascripts/pages/admin/components/{page_tree.es6.jsx → page_tree.jsx} +7 -37
  23. data/app/assets/javascripts/pages/admin/components/{page_tree_node.es6.jsx → page_tree_node.jsx} +32 -10
  24. data/app/assets/javascripts/pages/admin/components/page_tree_store.jsx +203 -0
  25. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +63 -0
  26. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +58 -0
  27. data/app/assets/javascripts/pages/admin/components/toast.jsx +37 -0
  28. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +52 -0
  29. data/app/assets/javascripts/pages/admin/features/{content_tabs.es6.jsx → content_tabs.jsx} +11 -2
  30. data/app/assets/javascripts/pages/admin/features/{edit_page.es6.jsx → edit_page.jsx} +7 -51
  31. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +14 -0
  32. data/app/assets/javascripts/pages/admin/features/{tag_editor.es6.jsx → tag_editor.jsx} +0 -0
  33. data/app/assets/javascripts/pages/admin/lib/{tree.es6.jsx → tree.jsx} +0 -0
  34. data/app/assets/javascripts/pages/{login_form.es6.jsx → login_form.jsx} +0 -0
  35. data/app/assets/stylesheets/pages/admin.scss +9 -13
  36. data/app/assets/stylesheets/pages/admin/components/archive.scss +6 -0
  37. data/app/assets/stylesheets/pages/admin/components/attachments.scss +130 -0
  38. data/app/assets/stylesheets/pages/admin/components/buttons.scss +18 -0
  39. data/app/assets/stylesheets/pages/admin/components/forms.scss +99 -21
  40. data/app/assets/stylesheets/pages/admin/components/header.scss +16 -28
  41. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +195 -0
  42. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +181 -0
  43. data/app/assets/stylesheets/pages/admin/components/image_uploader.scss +53 -0
  44. data/app/assets/stylesheets/pages/admin/components/links.scss +1 -1
  45. data/app/assets/stylesheets/pages/admin/components/list_table.scss +8 -5
  46. data/app/assets/stylesheets/pages/admin/components/login.scss +2 -8
  47. data/app/assets/stylesheets/pages/admin/components/modal.scss +91 -0
  48. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +12 -6
  49. data/app/assets/stylesheets/pages/admin/components/pagination.scss +34 -16
  50. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +9 -6
  51. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +20 -15
  52. data/app/assets/stylesheets/pages/admin/components/textarea.scss +1 -71
  53. data/app/assets/stylesheets/pages/admin/components/toast.scss +51 -0
  54. data/app/assets/stylesheets/pages/admin/components/toolbar.scss +108 -0
  55. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +9 -21
  56. data/app/assets/stylesheets/pages/admin/controllers/users.scss +2 -2
  57. data/app/assets/stylesheets/pages/admin/vars.scss +26 -4
  58. data/app/controller_dummies/admin/admin_controller.rb +0 -2
  59. data/app/controller_dummies/application_controller.rb +2 -4
  60. data/app/controller_dummies/attachments_controller.rb +2 -0
  61. data/app/controller_dummies/frontend_controller.rb +0 -2
  62. data/app/controller_dummies/images_controller.rb +0 -2
  63. data/app/controller_dummies/page_files_controller.rb +0 -2
  64. data/app/controller_dummies/pages_controller.rb +0 -2
  65. data/app/controller_dummies/sitemaps_controller.rb +0 -2
  66. data/app/controllers/admin/attachments_controller.rb +48 -0
  67. data/app/controllers/admin/categories_controller.rb +2 -5
  68. data/app/controllers/admin/images_controller.rb +25 -19
  69. data/app/controllers/admin/invites_controller.rb +16 -26
  70. data/app/controllers/admin/pages_controller.rb +50 -32
  71. data/app/controllers/admin/password_resets_controller.rb +11 -18
  72. data/app/controllers/admin/users_controller.rb +16 -22
  73. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +21 -14
  74. data/app/controllers/concerns/pages_core/authentication.rb +0 -2
  75. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -2
  76. data/app/controllers/concerns/pages_core/error_renderer.rb +33 -0
  77. data/app/controllers/concerns/pages_core/policies_helper.rb +9 -13
  78. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -5
  79. data/app/controllers/concerns/pages_core/process_titler.rb +1 -3
  80. data/app/controllers/concerns/pages_core/rss_controller.rb +0 -2
  81. data/app/controllers/errors_controller.rb +52 -26
  82. data/app/controllers/pages_core/admin_controller.rb +22 -13
  83. data/app/controllers/pages_core/attachments_controller.rb +36 -0
  84. data/app/controllers/pages_core/{application_controller.rb → base_controller.rb} +16 -5
  85. data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -24
  86. data/app/controllers/pages_core/frontend/pages_controller.rb +4 -8
  87. data/app/controllers/pages_core/frontend_controller.rb +0 -2
  88. data/app/controllers/pages_core/images_controller.rb +0 -2
  89. data/app/controllers/pages_core/sitemaps_controller.rb +3 -5
  90. data/app/controllers/sessions_controller.rb +3 -15
  91. data/app/formatters/pages_core/html_formatter.rb +60 -16
  92. data/app/formatters/pages_core/link_renderer.rb +15 -0
  93. data/app/helpers/admin/admin_helper.rb +0 -2
  94. data/app/helpers/admin/menu_helper.rb +2 -4
  95. data/app/helpers/admin/pages_helper.rb +47 -9
  96. data/app/helpers/application_helper.rb +0 -2
  97. data/app/helpers/frontend_helper.rb +0 -2
  98. data/app/helpers/pages_core/admin/admin_helper.rb +75 -20
  99. data/app/helpers/pages_core/admin/form_builder.rb +36 -0
  100. data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -8
  101. data/app/helpers/pages_core/admin/tag_editor_helper.rb +0 -2
  102. data/app/helpers/pages_core/application_helper.rb +1 -2
  103. data/app/helpers/pages_core/attachments_helper.rb +36 -0
  104. data/app/helpers/pages_core/form_builder.rb +7 -11
  105. data/app/helpers/pages_core/frontend_helper.rb +0 -6
  106. data/app/helpers/pages_core/head_tags_helper.rb +8 -4
  107. data/app/helpers/pages_core/images_helper.rb +0 -2
  108. data/app/helpers/pages_core/meta_tags_helper.rb +3 -5
  109. data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -3
  110. data/app/helpers/pages_core/page_path_helper.rb +14 -9
  111. data/app/jobs/pages_core/autopublish_job.rb +0 -2
  112. data/app/jobs/pages_core/sweep_cache_job.rb +0 -2
  113. data/app/mailers/admin_mailer.rb +3 -16
  114. data/app/models/attachment.rb +76 -0
  115. data/app/models/autopublisher.rb +3 -3
  116. data/app/models/category.rb +0 -3
  117. data/app/models/concerns/pages_core/has_roles.rb +1 -2
  118. data/app/models/concerns/pages_core/humanizable_param.rb +4 -4
  119. data/app/models/concerns/pages_core/page_model/attachments.rb +39 -0
  120. data/app/models/concerns/pages_core/page_model/autopublishable.rb +0 -2
  121. data/app/models/concerns/pages_core/page_model/dated_page.rb +59 -0
  122. data/app/models/concerns/pages_core/page_model/images.rb +12 -15
  123. data/app/models/concerns/pages_core/page_model/localizable.rb +10 -3
  124. data/app/models/concerns/pages_core/page_model/pathable.rb +8 -10
  125. data/app/models/concerns/pages_core/page_model/redirectable.rb +0 -2
  126. data/app/models/concerns/pages_core/page_model/sortable.rb +1 -3
  127. data/app/models/concerns/pages_core/page_model/status.rb +1 -3
  128. data/app/models/concerns/pages_core/page_model/templateable.rb +2 -4
  129. data/app/models/concerns/pages_core/page_model/tree.rb +24 -5
  130. data/app/models/concerns/pages_core/sweepable.rb +0 -2
  131. data/app/models/concerns/pages_core/taggable.rb +4 -3
  132. data/app/models/image.rb +1 -0
  133. data/app/models/invite.rb +0 -10
  134. data/app/models/page.rb +17 -21
  135. data/app/models/page_builder.rb +0 -2
  136. data/app/models/page_category.rb +0 -2
  137. data/app/models/page_exporter.rb +87 -0
  138. data/app/models/page_file.rb +24 -48
  139. data/app/models/page_image.rb +3 -37
  140. data/app/models/page_path.rb +0 -2
  141. data/app/models/password_reset_token.rb +0 -4
  142. data/app/models/role.rb +15 -2
  143. data/app/models/tag.rb +15 -6
  144. data/app/models/tagging.rb +1 -3
  145. data/app/models/user.rb +29 -25
  146. data/app/policies/page_file_policy.rb +13 -17
  147. data/app/policies/page_image_policy.rb +13 -17
  148. data/app/policies/page_policy.rb +26 -26
  149. data/app/policies/policy.rb +2 -8
  150. data/app/policies/user_policy.rb +32 -32
  151. data/app/serializers/admin/attachment_serializer.rb +29 -0
  152. data/app/serializers/admin/image_serializer.rb +53 -6
  153. data/app/serializers/admin/page_file_serializer.rb +6 -0
  154. data/app/serializers/admin/page_image_serializer.rb +1 -1
  155. data/app/serializers/page_export_serializer.rb +30 -0
  156. data/app/serializers/page_file_export_serializer.rb +4 -0
  157. data/app/serializers/page_image_export_serializer.rb +40 -0
  158. data/app/serializers/page_image_serializer.rb +2 -0
  159. data/app/services/pages_core/create_user_service.rb +36 -0
  160. data/app/services/pages_core/invite_service.rb +41 -0
  161. data/app/views/admin/images/show.json.jbuilder +6 -0
  162. data/app/views/admin/pages/_edit_content.html.erb +7 -0
  163. data/app/views/admin/pages/_edit_files.html.erb +8 -0
  164. data/app/views/admin/pages/_edit_images.html.erb +8 -95
  165. data/app/views/admin/pages/_edit_options.html.erb +7 -15
  166. data/app/views/admin/pages/_list_item.html.erb +50 -0
  167. data/app/views/admin/pages/deleted.html.erb +42 -0
  168. data/app/views/admin/pages/edit.html.erb +9 -94
  169. data/app/views/admin/pages/index.html.erb +9 -12
  170. data/app/views/admin/pages/new.html.erb +2 -1
  171. data/app/views/admin/pages/news.html.erb +59 -45
  172. data/app/views/admin/password_resets/show.html.erb +6 -9
  173. data/app/views/admin/users/_access_control.html.erb +4 -1
  174. data/app/views/admin/users/_list.html.erb +12 -7
  175. data/app/views/admin/users/edit.html.erb +5 -11
  176. data/app/views/admin/users/login.html.erb +58 -15
  177. data/app/views/admin/users/show.html.erb +1 -1
  178. data/app/views/admin_mailer/invite.text.erb +1 -1
  179. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  180. data/app/views/errors/401.html.erb +6 -0
  181. data/app/views/errors/403.html.erb +1 -1
  182. data/app/views/errors/500.html.erb +11 -6
  183. data/app/views/errors/500_critical.html.erb +1 -1
  184. data/app/views/feeds/pages.rss.builder +1 -3
  185. data/app/views/layouts/admin.html.erb +83 -83
  186. data/app/views/layouts/admin/_analytics.html.erb +1 -3
  187. data/app/views/layouts/admin/_header.html.erb +2 -2
  188. data/app/views/layouts/errors.html.erb +3 -7
  189. data/config/locales/en.yml +12 -0
  190. data/config/routes.rb +38 -55
  191. data/db/migrate/20111219033112_create_pages_tables.rb +6 -8
  192. data/db/migrate/20120627033112_rename_textbits.rb +1 -3
  193. data/db/migrate/20121010055412_drop_removed_tables.rb +1 -3
  194. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +1 -3
  195. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +1 -3
  196. data/db/migrate/20130303160632_remove_imagesets.rb +1 -3
  197. data/db/migrate/20130303161732_remove_sms_subscribers.rb +1 -3
  198. data/db/migrate/20130823133208_update_page_redirect_to.rb +1 -3
  199. data/db/migrate/20140203183900_create_roles.rb +1 -1
  200. data/db/migrate/20140414150500_change_locale_names.rb +1 -3
  201. data/db/migrate/20140604142100_remove_openid_url.rb +1 -1
  202. data/db/migrate/20140920231700_convert_images_to_dis.rb +1 -1
  203. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +1 -1
  204. data/db/migrate/20141004003100_create_password_reset_tokens.rb +1 -1
  205. data/db/migrate/20141006181300_remove_user_cruft.rb +1 -1
  206. data/db/migrate/20141007173000_create_invites.rb +1 -1
  207. data/db/migrate/20150204130800_update_delayed_job_table.rb +1 -1
  208. data/db/migrate/20150401131300_localize_images.rb +1 -1
  209. data/db/migrate/20150520174300_add_meta_image_to_page.rb +1 -1
  210. data/db/migrate/20150904164200_add_pinned_to_tags.rb +1 -1
  211. data/db/migrate/20151002174800_create_page_paths.rb +2 -2
  212. data/db/migrate/20151021103400_drop_binaries_table.rb +1 -1
  213. data/db/migrate/20151204151000_remove_page_content_order.rb +1 -1
  214. data/db/migrate/20160330220900_rename_pages_categories.rb +1 -1
  215. data/db/migrate/20160405202700_change_localization_limit.rb +1 -1
  216. data/db/migrate/20170716040500_remove_page_comments.rb +23 -0
  217. data/db/migrate/20170716213400_remove_sessions.rb +15 -0
  218. data/db/migrate/20180207134000_add_dates_to_pages.rb +11 -0
  219. data/db/migrate/20190211154800_create_attachments.rb +73 -0
  220. data/lib/pages_core.rb +6 -9
  221. data/lib/pages_core/admin_menu_item.rb +0 -2
  222. data/lib/pages_core/archive_finder.rb +21 -15
  223. data/lib/pages_core/attachment_embedder.rb +38 -0
  224. data/lib/pages_core/cache_sweeper.rb +14 -23
  225. data/lib/pages_core/configuration.rb +0 -2
  226. data/lib/pages_core/configuration/base.rb +0 -2
  227. data/lib/pages_core/configuration/pages.rb +2 -8
  228. data/lib/pages_core/digest_verifier.rb +70 -0
  229. data/lib/pages_core/engine.rb +6 -13
  230. data/lib/pages_core/extensions.rb +0 -3
  231. data/lib/pages_core/extensions/string_extensions.rb +0 -2
  232. data/lib/pages_core/page_path_constraint.rb +0 -2
  233. data/lib/pages_core/pages_plugin.rb +0 -2
  234. data/lib/pages_core/plugin.rb +0 -2
  235. data/lib/pages_core/pub_sub.rb +36 -0
  236. data/lib/pages_core/templates.rb +0 -2
  237. data/lib/pages_core/templates/block_configuration.rb +1 -3
  238. data/lib/pages_core/templates/configuration.rb +88 -10
  239. data/lib/pages_core/templates/configuration_handler.rb +6 -4
  240. data/lib/pages_core/templates/configuration_proxy.rb +4 -2
  241. data/lib/pages_core/templates/controller_actions.rb +0 -2
  242. data/lib/pages_core/templates/template_configuration.rb +41 -37
  243. data/lib/pages_core/version.rb +1 -3
  244. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +10 -17
  245. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +1 -2
  246. data/lib/rails/generators/pages_core/frontend/templates/{application.css.scss.erb → application.scss.erb} +0 -0
  247. data/lib/rails/generators/pages_core/frontend/templates/{base.css.scss.erb → base.scss.erb} +0 -0
  248. data/lib/rails/generators/pages_core/frontend/templates/{breakpoints.css.scss.erb → breakpoints.scss.erb} +0 -0
  249. data/lib/rails/generators/pages_core/frontend/templates/clearfix.scss.erb +7 -0
  250. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +0 -3
  251. data/lib/rails/generators/pages_core/install/install_generator.rb +4 -15
  252. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +1 -3
  253. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +0 -2
  254. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -5
  255. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +0 -2
  256. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +0 -2
  257. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +0 -2
  258. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +7 -15
  259. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +0 -2
  260. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -19
  261. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +2 -4
  262. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
  263. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +4 -13
  264. data/lib/tasks/pages.rake +0 -62
  265. data/lib/tasks/pages/cache.rake +6 -2
  266. data/lib/tasks/pages/export.rake +9 -0
  267. data/lib/tasks/pages/page_paths.rake +0 -2
  268. data/lib/tasks/pages/update.rake +0 -2
  269. data/template.rb +3 -3
  270. data/vendor/assets/javascripts/ReactCrop.min.js +1 -0
  271. data/vendor/assets/javascripts/reflux.min.js +1 -1
  272. data/vendor/assets/stylesheets/ReactCrop.css +167 -0
  273. metadata +200 -175
  274. data/app/assets/javascripts/pages/admin/components.es6.jsx +0 -1
  275. data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +0 -8
  276. data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +0 -161
  277. data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +0 -145
  278. data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +0 -90
  279. data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +0 -338
  280. data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +0 -124
  281. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +0 -21
  282. data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +0 -22
  283. data/app/assets/stylesheets/pages/admin/components/editable_image.scss +0 -18
  284. data/app/assets/stylesheets/pages/admin/components/images.scss +0 -155
  285. data/app/assets/stylesheets/pages/admin/print.scss +0 -17
  286. data/app/controllers/admin/page_comments_controller.rb +0 -61
  287. data/app/controllers/admin/page_files_controller.rb +0 -79
  288. data/app/controllers/admin/page_images_controller.rb +0 -111
  289. data/app/controllers/concerns/pages_core/add_comments_controller.rb +0 -67
  290. data/app/controllers/concerns/pages_core/exception_handler.rb +0 -137
  291. data/app/controllers/concerns/pages_core/search_pages_controller.rb +0 -40
  292. data/app/helpers/pages_core/login_helper.rb +0 -14
  293. data/app/indices/page_file_index.rb +0 -9
  294. data/app/indices/page_index.rb +0 -29
  295. data/app/indices/user_index.rb +0 -11
  296. data/app/models/concerns/pages_core/page_model/commentable.rb +0 -29
  297. data/app/models/concerns/pages_core/page_model/searchable.rb +0 -41
  298. data/app/models/page_comment.rb +0 -18
  299. data/app/serializers/page_tree_serializer.rb +0 -15
  300. data/app/views/admin/pages/_edit_comments.html.erb +0 -37
  301. data/app/views/admin/pages/_pagelisting.html.erb +0 -63
  302. data/app/views/admin/users/_login_form.html.erb +0 -47
  303. data/app/views/admin_mailer/comment_notification.text.erb +0 -7
  304. data/lib/pages_core/extensions/hash_extensions.rb +0 -23
  305. data/lib/pages_core/file_embedder.rb +0 -40
  306. data/lib/pages_core/paginates.rb +0 -102
  307. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +0 -8
  308. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +0 -12
  309. data/lib/tasks/db.rake +0 -96
  310. data/lib/tasks/pages/assets.rake +0 -65
  311. data/vendor/assets/javascripts/jquery.dimscreen.js +0 -77
  312. data/vendor/assets/javascripts/jquery.fieldselection.js +0 -59
@@ -0,0 +1,38 @@
1
+ module PagesCore
2
+ class AttachmentEmbedder
3
+ include ActionView::Helpers::AssetTagHelper
4
+
5
+ attr_reader :attachments
6
+
7
+ def initialize(attachments)
8
+ @attachments = Array(attachments)
9
+ end
10
+
11
+ def to_html
12
+ embed_attachments(attachments.map { |f| embed_attachment(f) })
13
+ end
14
+
15
+ def embed_attachments(embedded_attachments)
16
+ embedded_attachments.join(", ")
17
+ end
18
+
19
+ def embed_attachment(attachment)
20
+ content_tag(
21
+ :a,
22
+ attachment.name,
23
+ class: "file",
24
+ href: attachment_path(attachment)
25
+ )
26
+ end
27
+
28
+ private
29
+
30
+ def attachment_path(attachment)
31
+ Rails.application.routes.url_helpers.attachment_path(
32
+ attachment.digest,
33
+ attachment,
34
+ format: attachment.filename_extension
35
+ )
36
+ end
37
+ end
38
+ end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class CacheSweeper
5
3
  class << self
@@ -20,15 +18,11 @@ module PagesCore
20
18
  # Returns the configuration. Accepts a block, ie:
21
19
  #
22
20
  # PagesCore::CacheSweeper.config do |c|
23
- # c.observe += [:store, :store_test]
24
21
  # c.patterns += [/^\/arkiv(.*)$/, /^\/tests(.*)$/]
25
22
  # end
26
23
  def config
27
24
  @configuration ||= default_config
28
- if block_given?
29
- yield @configuration
30
- extend_observed_models!
31
- end
25
+ yield @configuration if block_given?
32
26
  @configuration
33
27
  end
34
28
 
@@ -59,24 +53,14 @@ module PagesCore
59
53
  # Returns the default configuration.
60
54
  def default_config
61
55
  OpenStruct.new(cache_path: ActionController::Base.page_cache_directory,
62
- observe: [Page, PageComment, Image],
63
56
  patterns: [%r{^/index\.[\w]+$},
64
57
  %r{^/sitemap\.[\w]+$},
65
58
  %r{^/pages/[\w]{2,3}[/\.](.*)$},
66
59
  %r{^/[\w]{2,3}/(.*)$}])
67
60
  end
68
61
 
69
- def extend_observed_models!
70
- config.observe.each do |klass|
71
- if klass.is_a?(Symbol) || klass.is_a?(String)
72
- klass = klass.to_s.camelize.constantize
73
- end
74
- klass.send(:include, PagesCore::Sweepable)
75
- end
76
- end
77
-
78
62
  def visible_dir?(dir)
79
- !(dir =~ /^\./) && File.directory?(File.join(config.cache_path, dir))
63
+ dir !~ /^\./ && File.directory?(File.join(config.cache_path, dir))
80
64
  end
81
65
 
82
66
  def sweep_dir(cache_dir)
@@ -116,10 +100,17 @@ module PagesCore
116
100
  PagesCore.config.locales.keys.map(&:to_s)).uniq
117
101
  end
118
102
 
119
- def page_path_files
120
- @page_path_files ||= PagePath.all.flat_map do |p|
121
- ["/#{p.path}.html"] +
122
- locales.map { |l| "/#{l}/#{p.path}.html" }
103
+ def page_path?(relative)
104
+ return false unless relative =~ /\.html$/
105
+ page_paths.each do |p|
106
+ return true if relative.start_with?(p)
107
+ end
108
+ false
109
+ end
110
+
111
+ def page_paths
112
+ @page_paths ||= PagePath.all.flat_map do |p|
113
+ ["/#{p.path}"] + locales.map { |l| "/#{l}/#{p.path}" }
123
114
  end
124
115
  end
125
116
 
@@ -133,7 +124,7 @@ module PagesCore
133
124
 
134
125
  def sweep_file?(path)
135
126
  relative = path.gsub(Regexp.new("^#{cache_dir}"), "")
136
- pattern_match?(relative) || page_path_files.include?(relative)
127
+ pattern_match?(relative) || page_path?(relative)
137
128
  end
138
129
  end
139
130
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require "pages_core/configuration/base"
4
2
  require "pages_core/configuration/pages"
5
3
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Configuration
5
3
  class Base
@@ -1,6 +1,4 @@
1
- # encoding: utf-8
2
-
3
- require "pages_core/file_embedder"
1
+ require "pages_core/attachment_embedder"
4
2
 
5
3
  module PagesCore
6
4
  module Configuration
@@ -15,12 +13,8 @@ module PagesCore
15
13
  setting :rss_fulltext, :boolean, true
16
14
  setting :image_fallback_url, :string
17
15
  setting :default_author, :string
18
- setting :comment_notifications, :array, []
19
- setting :close_comments_after, :integer
20
- setting :comment_honeypot, :boolean, false
21
- setting :recaptcha, :boolean, false
22
16
  setting :error_404_layout, :string
23
- setting :file_embedder, :object, PagesCore::FileEmbedder
17
+ setting :attachment_embedder, :object, PagesCore::AttachmentEmbedder
24
18
  end
25
19
  end
26
20
  end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ # = Digest Verifier
5
+ #
6
+ # ==== Usage
7
+ #
8
+ # verifier = PagesCore::DigestVerifier.new("super secret!")
9
+ #
10
+ # digest = verifier.generate("foo")
11
+ #
12
+ # digest.verify("foo", digest)
13
+ # # => true
14
+ # digest.verify("bar", digest)
15
+ # # => raises PagesCore::Errors::InvalidSignature
16
+ #
17
+ # Credit where credit is due: adapted and simplified from
18
+ # +ActiveSupport::MessageVerifier+, since we don't need to handle
19
+ # arbitrary data structures and ship the serialized data to the client.
20
+ class DigestVerifier
21
+ class InvalidSignatureError < StandardError; end
22
+
23
+ def initialize(secret, options = {})
24
+ @secret = secret
25
+ @digest = options[:digest] || "SHA1"
26
+ end
27
+
28
+ # Generates a digest for a string.
29
+ def generate(data)
30
+ generate_digest(data)
31
+ end
32
+
33
+ # Verifies that <tt>digest</tt> is valid for <tt>data</tt>.
34
+ # Raises a +PagesCore::DigestVerifier::InvalidSignatureError+ error if not.
35
+ def verify(data, digest)
36
+ unless valid_digest?(data, digest)
37
+ raise PagesCore::DigestVerifier::InvalidSignatureError
38
+ end
39
+
40
+ true
41
+ end
42
+
43
+ private
44
+
45
+ def secure_compare(a, b)
46
+ return false unless a.bytesize == b.bytesize
47
+
48
+ l = a.unpack "C#{a.bytesize}"
49
+
50
+ res = 0
51
+ b.each_byte { |byte| res |= byte ^ l.shift }
52
+ res.zero?
53
+ end
54
+
55
+ def generate_digest(data)
56
+ require "openssl" unless defined?(OpenSSL)
57
+ OpenSSL::HMAC.hexdigest(
58
+ OpenSSL::Digest.const_get(@digest).new,
59
+ @secret,
60
+ data
61
+ )
62
+ end
63
+
64
+ def valid_digest?(data, digest)
65
+ data.present? &&
66
+ digest.present? &&
67
+ secure_compare(digest, generate_digest(data))
68
+ end
69
+ end
70
+ end
@@ -1,19 +1,9 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class Engine < Rails::Engine
5
3
  # config.autoload_paths += Dir["#{config.root}/lib/"]
6
4
  # config.autoload_paths += Dir["#{config.root}/lib/pages_core/**/"]
7
5
  # config.eager_load_paths += Dir["#{config.root}/lib/pages_core/**/"]
8
6
 
9
- initializer :active_job do |_config|
10
- ActiveJob::Base.queue_adapter = if Rails.env.test?
11
- :test
12
- else
13
- :delayed_job
14
- end
15
- end
16
-
17
7
  initializer :append_migrations do |app|
18
8
  unless app.root.to_s.match root.to_s
19
9
  config.paths["db/migrate"].expanded.each do |expanded_path|
@@ -24,15 +14,18 @@ module PagesCore
24
14
 
25
15
  # Enable asset precompilation
26
16
  initializer :assets do |_config|
27
- Rails.application.config.assets.precompile += %w(
17
+ Rails.application.config.assets.precompile += %w[
28
18
  pages/admin.js
29
19
  pages/admin.css
30
- pages/admin/print.css
31
20
  pages/errors.css
32
21
  pages/*.gif
33
22
  pages/*.png
34
23
  pages/*.jpg
35
- )
24
+ ]
25
+ end
26
+
27
+ initializer :enable_recursive_serialization do |_app|
28
+ ActiveModelSerializers.config.default_includes = "**"
36
29
  end
37
30
 
38
31
  initializer :handle_exceptions do |app|
@@ -1,4 +1 @@
1
- # encoding: utf-8
2
-
3
- require "pages_core/extensions/hash_extensions"
4
1
  require "pages_core/extensions/string_extensions"
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Extensions
5
3
  module StringExtensions
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class PagePathConstraint
5
3
  def matches?(request)
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class PagesPlugin < Plugin
5
3
  class << self
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  # module PagesGallery
4
2
  # class Plugin < PagesCore::Plugin
5
3
  # paths['db/migrate'] = 'template/db/migrate'
@@ -0,0 +1,36 @@
1
+ module PagesCore
2
+ module PubSub
3
+ class << self
4
+ def publish(name, payload = {})
5
+ payload_struct = OpenStruct.new(payload)
6
+ subscribers.select { |s| s.name == name }
7
+ .each { |s| s.call(payload_struct) }
8
+ end
9
+
10
+ def subscribe(name, &block)
11
+ subscriber = PagesCore::PubSub::Subscriber.new(name, block)
12
+ subscribers << subscriber
13
+ subscriber
14
+ end
15
+
16
+ def subscribers
17
+ @subscribers ||= []
18
+ end
19
+
20
+ def unsubscribe(subscriber)
21
+ @subscribers = subscribers.reject { |s| s == subscriber }
22
+ end
23
+ end
24
+
25
+ class Subscriber
26
+ attr_reader :name, :callback
27
+
28
+ delegate :call, to: :callback
29
+
30
+ def initialize(name, callback)
31
+ @name = name
32
+ @callback = callback
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require "pages_core/templates/block_configuration"
4
2
  require "pages_core/templates/configuration_proxy"
5
3
  require "pages_core/templates/configuration_handler"
@@ -1,12 +1,10 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Templates
5
3
  # Configuration for the blocks on an individual template
6
4
  class BlockConfiguration
7
5
  attr_reader :name, :title, :description, :optional, :enforced
8
6
  def small?
9
- (@size == :small) ? true : false
7
+ @size == :small
10
8
  end
11
9
 
12
10
  def large?
@@ -1,7 +1,85 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Templates
3
+ # = Template configuration
4
+ #
5
+ # Configuration DSL for the page templates. Can be accessed through
6
+ # +PagesCore::Templates.configure+.
7
+ #
8
+ # PagesCore::Templates.configure do |config|
9
+ # # Configuration goes here
10
+ # end
11
+ #
12
+ # == Configuring templates
13
+ #
14
+ # Defaults for all templates can be configured with:
15
+ #
16
+ # config.default do |default|
17
+ # default.enabled_blocks %i[name headline body]
18
+ # default.files :disabled
19
+ # end
20
+ #
21
+ # Individual template configurations override the defaults.
22
+ #
23
+ # config.template(:article, :article_alt) do |t|
24
+ # t.enabled_blocks %i[name headline excerpt body boxout]
25
+ # t.files :enabled
26
+ # end
27
+ #
28
+ # == Options
29
+ #
30
+ # [blocks]
31
+ # Yields the block configuration.
32
+ # [enabled_blocks]
33
+ # List of enabled blocks. Default: +%i[headline excerpt body]+
34
+ # [template]
35
+ # Template for all pages, unless overridden with +sub_template+.
36
+ # It will attempt to guess based on the parent page if set to
37
+ # +:autodetect+, which is the default value. Pass the +:root+
38
+ # option to set template at root level.
39
+ # [image]
40
+ # Enable images. Default: +:enabled+
41
+ # [files]
42
+ # Enable file uploads. Default: +:disabled+
43
+ # [tags]
44
+ # Enable tags. Default: +:disabled+
45
+ # [dates]
46
+ # Enable dates. Default: +:disabled+
47
+ # [sub_template]
48
+ # Children of the page will automatically have this template if
49
+ # configured. Defaults to +nil+, which fall back to the behaviour
50
+ # of +template+.
51
+ #
52
+ # == Block configuration
53
+ #
54
+ # Blocks can be configured at top level, or per template:
55
+ #
56
+ # config.default do |default|
57
+ # default.blocks do |block|
58
+ # block.byline("Byline", size: :field)
59
+ # block.embed("Video embed", size: :small, description: "Embed code")
60
+ # end
61
+ # default.enabled_blocks %i[headline byline body embed]
62
+ # end
63
+ #
64
+ # Valid sizes for text blocks are +:field+ (single line), +:small+
65
+ # and +:large+.
66
+ #
67
+ # === Select blocks
68
+ #
69
+ # Blocks can also be selects:
70
+ #
71
+ # block.foobar("Foobar", type: :select, options: %w[Foo Bar Baz])
72
+ #
73
+ # Pass a hash for multiple localizations:
74
+ #
75
+ # block.foobar("Foobar", type: :select,
76
+ # options: { en: %w[Foo Bar Baz],
77
+ # nb: %w[Fuu Baer Baez] })
78
+ #
79
+ # Options can be set at runtime using a Proc:
80
+ #
81
+ # block.foobar("Foobar", type: :select,
82
+ # options: -> { FooBar.template_options })
5
83
  class Configuration < PagesCore::Templates::ConfigurationHandler
6
84
  handle :default do |instance, name, *args|
7
85
  if name == :blocks
@@ -14,20 +92,20 @@ module PagesCore
14
92
  end
15
93
 
16
94
  def valid_template_options
17
- [
18
- :template, :image, :images, :files, :text_filter, :blocks,
19
- :enabled_blocks, :sub_template, :comments, :comments_allowed, :tags
20
- ]
95
+ %i[template image images files text_filter blocks
96
+ enabled_blocks sub_template tags dates]
21
97
  end
22
98
 
23
99
  def configure_block(tpl_name, block_name, title = false, options = {})
24
100
  block_name = block_name.to_sym
25
- title ||= block_name.to_s.humanize
26
- options[:title] = title
101
+ opts = {
102
+ title: title || block_name.to_s.humanize,
103
+ localized: true
104
+ }.merge(options)
27
105
  if tpl_name == :_defaults
28
- set([:default, :blocks, block_name], options)
106
+ set([:default, :blocks, block_name], opts)
29
107
  else
30
- set([:templates, tpl_name, :blocks, block_name], options)
108
+ set([:templates, tpl_name, :blocks, block_name], opts)
31
109
  end
32
110
  end
33
111