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
@@ -1,18 +1,29 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
- class ApplicationController < ActionController::Base
2
+ class BaseController < ActionController::Base
5
3
  include PagesCore::Authentication
6
4
  include PagesCore::DomainBasedCache
7
- include PagesCore::ExceptionHandler
5
+ include PagesCore::ErrorRenderer
8
6
  include PagesCore::ProcessTitler
9
7
  include PagesCore::PoliciesHelper
10
8
 
11
- before_action :set_locale
9
+ before_action :set_locale, :configure_error_reporting
12
10
  after_action :set_content_language_header
13
11
 
14
12
  protected
15
13
 
14
+ # Configures additional report data if Sentry is installed
15
+ def configure_error_reporting
16
+ return unless Object.const_defined?("Raven")
17
+ if logged_in?
18
+ Raven.user_context(user_id: current_user.id,
19
+ user_email: current_user.email)
20
+ else
21
+ Raven.user_context({})
22
+ end
23
+ Raven.tags_context(locale: locale)
24
+ Raven.extra_context(params: params.to_unsafe_h)
25
+ end
26
+
16
27
  # Sets @locale from params[:locale], with I18n.default_locale as fallback
17
28
  def set_locale
18
29
  legacy_locales = {
@@ -1,37 +1,18 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Frontend
5
3
  class PageFilesController < ::FrontendController
6
- before_action :find_page_file, only: [:show, :edit, :update, :destroy]
4
+ include PagesCore::AttachmentsHelper
7
5
 
8
- def show
9
- unless modified?(@page_file)
10
- render(text: "304 Not Modified", status: 304) && return
11
- end
6
+ before_action :find_page_file, only: %i[show]
12
7
 
13
- if @page_file.updated_at?
14
- response.headers["Last-Modified"] = @page_file.updated_at.httpdate
8
+ def show
9
+ if stale?(etag: @page_file, last_modified: @page_file.updated_at)
10
+ redirect_to attachment_path(@page_file.attachment)
15
11
  end
16
-
17
- send_data(@page_file.data,
18
- filename: @page_file.filename,
19
- type: @page_file.content_type,
20
- disposition: "attachment")
21
12
  end
22
13
 
23
14
  private
24
15
 
25
- def modified?(page_file)
26
- return true unless if_modified_since && page_file.updated_at?
27
- page_file.updated_at > if_modified_since
28
- end
29
-
30
- def if_modified_since
31
- return nil if request.env["HTTP_IF_MODIFIED_SINCE"].blank?
32
- Time.rfc2822(request.env["HTTP_IF_MODIFIED_SINCE"])
33
- end
34
-
35
16
  def find_page_file
36
17
  @page_file = PageFile.find(params[:id])
37
18
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Frontend
5
3
  class PagesController < ::FrontendController
@@ -7,17 +5,15 @@ module PagesCore
7
5
  include PagesCore::Templates::ControllerActions
8
6
  include PagesCore::HeadTagsHelper
9
7
 
10
- include PagesCore::AddCommentsController
11
8
  include PagesCore::PreviewPagesController
12
9
  include PagesCore::RssController
13
- include PagesCore::SearchPagesController
14
10
 
15
11
  caches_page :index if PagesCore.config(:page_cache)
16
12
 
17
13
  before_action :load_root_pages
18
14
  before_action :find_page_by_path, only: [:show]
19
- before_action :find_page, only: [:show, :preview, :add_comment]
20
- before_action :require_page, only: [:show, :preview, :add_comment]
15
+ before_action :find_page, only: %i[show preview]
16
+ before_action :require_page, only: %i[show preview]
21
17
  before_action :canonicalize_url, only: [:show]
22
18
  after_action :cache_page_request, only: [:show]
23
19
 
@@ -50,7 +46,7 @@ module PagesCore
50
46
  return if @page.redirects?
51
47
  return if request.path == canonical_path(@page)
52
48
  # Don't canonicalize if any unknown params are present
53
- return if (params.keys - %w(controller action path locale id)).any?
49
+ return if (params.keys - %w[controller action path locale id]).any?
54
50
  redirect_to(canonical_path(@page), status: :moved_permanently)
55
51
  end
56
52
 
@@ -99,7 +95,7 @@ module PagesCore
99
95
 
100
96
  def find_page_by_path
101
97
  return unless params[:path]
102
- @page ||= PagePath.get(locale, params[:path]).try(&:page)
98
+ @page = PagePath.get(locale, params[:path]).try(&:page)
103
99
  end
104
100
 
105
101
  def find_page
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  # Abstract controller for all frontend controllers.
4
2
  module PagesCore
5
3
  class FrontendController < ::ApplicationController
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class ImagesController < ::ApplicationController
5
3
  include DynamicImage::Controller
@@ -1,7 +1,5 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
- class SitemapsController < ApplicationController
2
+ class SitemapsController < ::ApplicationController
5
3
  include PagesCore::PagePathHelper
6
4
  caches_page :show
7
5
 
@@ -43,10 +41,10 @@ module PagesCore
43
41
  end
44
42
 
45
43
  def pages
46
- ([Page.root.localize(I18n.default_locale)] +
44
+ ([Page.root.try(:localize, I18n.default_locale)] +
47
45
  locales.flat_map do |locale|
48
46
  Page.published.localized(locale)
49
- end).uniq
47
+ end).compact.uniq
50
48
  end
51
49
 
52
50
  def page_record_url(record)
@@ -1,23 +1,21 @@
1
- # encoding: utf-8
2
-
3
1
  class SessionsController < ::ApplicationController
4
2
  def create
5
3
  user = find_user(params[:username], params[:password])
6
4
  authenticate!(user) if user
7
5
 
8
6
  if logged_in?
9
- redirect_to success_url
7
+ redirect_to admin_default_url
10
8
  else
11
9
  flash[:notice] = "The provided email address and password combination " \
12
10
  "was not valid"
13
- redirect_to login_url
11
+ redirect_to login_admin_users_url
14
12
  end
15
13
  end
16
14
 
17
15
  def destroy
18
16
  flash[:notice] = "You have been logged out"
19
17
  deauthenticate!
20
- redirect_to login_url
18
+ redirect_to login_admin_users_url
21
19
  end
22
20
 
23
21
  protected
@@ -25,14 +23,4 @@ class SessionsController < ::ApplicationController
25
23
  def find_user(username, password)
26
24
  User.authenticate(username, password: password) if username && password
27
25
  end
28
-
29
- def success_url
30
- # TODO: Validate URL
31
- params[:success_url] || admin_default_url
32
- end
33
-
34
- def login_url
35
- # TODO: Validate URL
36
- params[:login_url] || login_admin_users_url
37
- end
38
26
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  class HtmlFormatter
5
3
  include ActionView::Helpers::AssetTagHelper
@@ -18,7 +16,7 @@ module PagesCore
18
16
  end
19
17
 
20
18
  def to_html
21
- string = parse_images(parse_files(@string))
19
+ string = parse_images(parse_files(parse_attachments(@string)))
22
20
  if @options[:shorten] && string.length > @options[:shorten]
23
21
  string = string[0..@options[:shorten]] + "..."
24
22
  end
@@ -28,22 +26,26 @@ module PagesCore
28
26
 
29
27
  private
30
28
 
29
+ def attachment_expression
30
+ /\[attachment:([\d,]+)\]/
31
+ end
32
+
31
33
  def file_expression
32
34
  /\[file:([\d,]+)\]/
33
35
  end
34
36
 
35
37
  def image_expression
36
- /\[image:(\d+)([\s="\-\w]*)?\]/
38
+ /\[image:(\d+)([^\]]*)?\]/
37
39
  end
38
40
 
39
- def embed_image(id, size:, class_name:)
41
+ def embed_image(id, size:, class_name:, link:)
40
42
  image = Image.find(id).localize(I18n.locale)
41
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)
42
46
  content_tag(:figure,
43
- dynamic_image_tag(image,
44
- size: size,
45
- crop: false,
46
- upscale: false) + image_caption(image),
47
+ (link ? link_to(image_tag, link) : image_tag) +
48
+ image_caption(image),
47
49
  class: class_name)
48
50
  rescue ActiveRecord::RecordNotFound
49
51
  nil
@@ -57,24 +59,62 @@ module PagesCore
57
59
  end
58
60
  end
59
61
 
62
+ def find_attachment(id)
63
+ Attachment.find(id).localize(I18n.locale)
64
+ rescue ActiveRecord::RecordNotFound
65
+ nil
66
+ end
67
+
68
+ def find_attachments(str)
69
+ str.match(attachment_expression)[1]
70
+ .split(",")
71
+ .map { |id| find_attachment(id) }
72
+ .compact
73
+ end
74
+
75
+ def find_file(id)
76
+ PageFile.find(id).localize(I18n.locale)
77
+ rescue ActiveRecord::RecordNotFound
78
+ nil
79
+ end
80
+
60
81
  def find_files(str)
61
82
  str.match(file_expression)[1]
62
- .split(",")
63
- .map { |id| PageFile.find(id).localize(I18n.locale) }
83
+ .split(",")
84
+ .map { |id| find_file(id) }
85
+ .compact
86
+ end
87
+
88
+ def parse_attachments(string)
89
+ string.gsub(attachment_expression).each do |str|
90
+ PagesCore.config.attachment_embedder.new(
91
+ find_attachments(str)
92
+ ).to_html
93
+ end
64
94
  end
65
95
 
66
96
  def parse_files(string)
67
97
  string.gsub(file_expression).each do |str|
68
- PagesCore.config.file_embedder.new(find_files(str)).to_html
98
+ PagesCore.config.attachment_embedder.new(
99
+ find_files(str).map(&:attachment)
100
+ ).to_html
69
101
  end
70
102
  end
71
103
 
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
+
72
115
  def parse_images(string)
73
116
  string.gsub(image_expression).each do |str|
74
- id = str.match(image_expression)[1]
75
- options = str.match(image_expression)[2]
76
- class_name = (Regexp.last_match(1) if options =~ /class="([\s\-\w]+)"/)
77
- embed_image(id, size: embed_image_size(options), class_name: class_name)
117
+ parse_image(str)
78
118
  end
79
119
  end
80
120
 
@@ -92,5 +132,9 @@ module PagesCore
92
132
  "portrait"
93
133
  end
94
134
  end
135
+
136
+ def link_to(content, href)
137
+ content_tag(:a, content, href: href)
138
+ end
95
139
  end
96
140
  end
@@ -0,0 +1,15 @@
1
+ module PagesCore
2
+ class LinkRenderer < WillPaginate::ActionView::LinkRenderer
3
+ def previous_page
4
+ num = @collection.current_page > 1 &&
5
+ @collection.current_page - 1
6
+ previous_or_next_page(num, "Previous", "previous")
7
+ end
8
+
9
+ def next_page
10
+ num = @collection.current_page < total_pages &&
11
+ @collection.current_page + 1
12
+ previous_or_next_page(num, "Next", "next")
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Admin
4
2
  module AdminHelper
5
3
  include PagesCore::Admin::AdminHelper
@@ -1,17 +1,15 @@
1
- # encoding: utf-8
2
-
3
1
  module Admin
4
2
  module MenuHelper
5
3
  def header_tabs(group)
6
4
  content_tag :ul, class: group.to_s do
7
- menu_items_for(group).map do |item|
5
+ safe_join(menu_items_for(group).map do |item|
8
6
  content_tag :li do
9
7
  path = instance_eval(&item.path)
10
8
  link_to(item.label,
11
9
  path,
12
10
  class: (current_menu_item?(item) ? "current" : ""))
13
11
  end
14
- end.join.html_safe
12
+ end)
15
13
  end
16
14
  end
17
15
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Admin
4
2
  module PagesHelper
5
3
  def available_templates_for_select
@@ -16,32 +14,60 @@ module Admin
16
14
  "[file:#{file.id}]"
17
15
  end
18
16
 
17
+ def news_section_name(page, news_pages)
18
+ if news_pages.select { |p| p.name == page.name }.length > 1
19
+ page_name(page, include_parents: true)
20
+ else
21
+ page_name(page)
22
+ end
23
+ end
24
+
19
25
  def page_authors(page)
20
26
  ([page.author] + User.activated).uniq
21
27
  end
22
28
 
23
29
  def page_block_field(form, block_name, block_options)
24
30
  labelled_field(
25
- form.send(
26
- block_options[:size] == :field ? :text_field : :text_area,
27
- block_name,
28
- page_block_field_options(block_options)
29
- ),
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,
30
36
  block_options[:title],
31
37
  errors: form.object.errors[block_name],
32
38
  description: block_options[:description]
33
39
  )
34
40
  end
35
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
+
36
62
  def page_name(page, options = {})
37
63
  page_names = if options[:include_parents]
38
- [page.ancestors, page].flatten
64
+ page.self_and_ancestors.reverse
39
65
  else
40
66
  [page]
41
67
  end
42
68
  safe_join(
43
69
  page_names.map { |p| page_name_with_fallback(p) },
44
- " &raquo; ".html_safe
70
+ raw(" &raquo; ")
45
71
  )
46
72
  end
47
73
 
@@ -57,6 +83,18 @@ module Admin
57
83
 
58
84
  private
59
85
 
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
+ def nested_array?(array)
95
+ array.present? && array.first.is_a?(Array)
96
+ end
97
+
60
98
  def page_block_classes(class_name, block_options = {})
61
99
  [class_name, block_options[:class]].join(" ").strip
62
100
  end