pages_core 3.6.2 → 3.7.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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/Rakefile +3 -1
  4. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
  5. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
  6. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
  7. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
  8. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
  9. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
  10. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
  11. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
  12. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
  13. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
  14. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
  15. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
  17. data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
  18. data/app/assets/javascripts/pages/login_form.jsx +8 -8
  19. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  20. data/app/assets/stylesheets/pages/errors.css +2 -0
  21. data/app/controller_dummies/admin/admin_controller.rb +2 -0
  22. data/app/controller_dummies/application_controller.rb +2 -0
  23. data/app/controller_dummies/attachments_controller.rb +2 -0
  24. data/app/controller_dummies/frontend_controller.rb +2 -0
  25. data/app/controller_dummies/images_controller.rb +2 -0
  26. data/app/controller_dummies/page_files_controller.rb +2 -0
  27. data/app/controller_dummies/pages_controller.rb +2 -0
  28. data/app/controller_dummies/sitemaps_controller.rb +2 -0
  29. data/app/controllers/admin/attachments_controller.rb +4 -2
  30. data/app/controllers/admin/categories_controller.rb +2 -0
  31. data/app/controllers/admin/images_controller.rb +10 -5
  32. data/app/controllers/admin/invites_controller.rb +4 -1
  33. data/app/controllers/admin/pages_controller.rb +7 -19
  34. data/app/controllers/admin/password_resets_controller.rb +9 -5
  35. data/app/controllers/admin/users_controller.rb +10 -4
  36. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  37. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  38. data/app/controllers/concerns/pages_core/authentication.rb +4 -1
  39. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  40. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  41. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  42. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
  43. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  44. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  45. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  46. data/app/controllers/errors_controller.rb +5 -53
  47. data/app/controllers/pages_core/admin_controller.rb +7 -67
  48. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  49. data/app/controllers/pages_core/base_controller.rb +11 -17
  50. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  51. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
  52. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  53. data/app/controllers/pages_core/images_controller.rb +3 -1
  54. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  55. data/app/controllers/sessions_controller.rb +2 -0
  56. data/app/formatters/pages_core/html_formatter.rb +13 -63
  57. data/app/formatters/pages_core/image_embedder.rb +79 -0
  58. data/app/formatters/pages_core/link_renderer.rb +2 -0
  59. data/app/helpers/admin/admin_helper.rb +2 -0
  60. data/app/helpers/admin/menu_helper.rb +6 -4
  61. data/app/helpers/admin/pages_helper.rb +4 -57
  62. data/app/helpers/application_helper.rb +2 -0
  63. data/app/helpers/frontend_helper.rb +2 -0
  64. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  65. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  66. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  67. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  68. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  69. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  70. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  71. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  72. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  73. data/app/helpers/pages_core/application_helper.rb +3 -0
  74. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  75. data/app/helpers/pages_core/form_builder.rb +17 -13
  76. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  77. data/app/helpers/pages_core/head_tags_helper.rb +7 -2
  78. data/app/helpers/pages_core/images_helper.rb +3 -0
  79. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  80. data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
  81. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  82. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  83. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  84. data/app/mailers/admin_mailer.rb +4 -14
  85. data/app/models/attachment.rb +10 -8
  86. data/app/models/autopublisher.rb +3 -0
  87. data/app/models/category.rb +3 -1
  88. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  89. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  90. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  91. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  92. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  93. data/app/models/concerns/pages_core/page_model/images.rb +5 -1
  94. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  95. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  96. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  97. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  98. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  99. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  100. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  101. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  102. data/app/models/concerns/pages_core/taggable.rb +8 -2
  103. data/app/models/image.rb +14 -1
  104. data/app/models/invite.rb +3 -1
  105. data/app/models/invite_role.rb +5 -3
  106. data/app/models/page.rb +4 -3
  107. data/app/models/page_builder.rb +2 -0
  108. data/app/models/page_category.rb +3 -1
  109. data/app/models/page_exporter.rb +22 -9
  110. data/app/models/page_file.rb +3 -1
  111. data/app/models/page_image.rb +3 -1
  112. data/app/models/page_path.rb +13 -5
  113. data/app/models/password_reset_token.rb +3 -1
  114. data/app/models/role.rb +8 -5
  115. data/app/models/tag.rb +8 -6
  116. data/app/models/tagging.rb +4 -2
  117. data/app/models/user.rb +7 -4
  118. data/app/policies/invite_policy.rb +2 -0
  119. data/app/policies/page_file_policy.rb +2 -0
  120. data/app/policies/page_image_policy.rb +2 -0
  121. data/app/policies/page_policy.rb +2 -0
  122. data/app/policies/policy.rb +2 -0
  123. data/app/policies/user_policy.rb +2 -0
  124. data/app/serializers/admin/attachment_serializer.rb +4 -2
  125. data/app/serializers/admin/image_serializer.rb +4 -2
  126. data/app/serializers/admin/page_file_serializer.rb +2 -0
  127. data/app/serializers/admin/page_image_serializer.rb +2 -0
  128. data/app/serializers/page_export_serializer.rb +2 -0
  129. data/app/serializers/page_file_export_serializer.rb +2 -0
  130. data/app/serializers/page_image_export_serializer.rb +2 -0
  131. data/app/serializers/page_image_serializer.rb +2 -0
  132. data/app/serializers/page_serializer.rb +2 -0
  133. data/app/services/pages_core/create_user_service.rb +5 -2
  134. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  135. data/app/services/pages_core/invite_service.rb +2 -0
  136. data/app/views/admin/images/show.json.jbuilder +2 -0
  137. data/app/views/admin/pages/news.html.erb +1 -1
  138. data/app/views/errors/500.html.erb +2 -20
  139. data/app/views/errors/_generic_help.html.erb +1 -1
  140. data/app/views/feeds/pages.rss.builder +2 -0
  141. data/app/views/sitemaps/show.xml.builder +2 -0
  142. data/config/routes.rb +5 -5
  143. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  144. data/lib/pages_core.rb +10 -0
  145. data/lib/pages_core/admin_menu_item.rb +3 -0
  146. data/lib/pages_core/archive_finder.rb +12 -16
  147. data/lib/pages_core/attachment_embedder.rb +4 -6
  148. data/lib/pages_core/cache_sweeper.rb +10 -108
  149. data/lib/pages_core/configuration.rb +2 -0
  150. data/lib/pages_core/configuration/base.rb +5 -0
  151. data/lib/pages_core/configuration/pages.rb +4 -2
  152. data/lib/pages_core/digest_verifier.rb +5 -5
  153. data/lib/pages_core/engine.rb +52 -0
  154. data/lib/pages_core/extensions.rb +2 -0
  155. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  156. data/lib/pages_core/page_path_constraint.rb +2 -0
  157. data/lib/pages_core/pages_plugin.rb +3 -1
  158. data/lib/pages_core/plugin.rb +4 -52
  159. data/lib/pages_core/pub_sub.rb +2 -0
  160. data/lib/pages_core/static_cache.rb +26 -0
  161. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  162. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  163. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  164. data/lib/pages_core/templates.rb +5 -3
  165. data/lib/pages_core/templates/block_configuration.rb +3 -0
  166. data/lib/pages_core/templates/configuration.rb +5 -1
  167. data/lib/pages_core/templates/configuration_handler.rb +4 -2
  168. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  169. data/lib/pages_core/templates/controller_actions.rb +2 -0
  170. data/lib/pages_core/templates/template_configuration.rb +18 -13
  171. data/lib/pages_core/version.rb +3 -1
  172. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
  173. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  174. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  175. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  176. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  177. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  178. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  179. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  180. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  181. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  182. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
  183. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  184. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  185. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  186. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  187. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  188. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  189. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  190. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  191. data/lib/tasks/pages.rake +3 -2
  192. data/lib/tasks/pages/cache.rake +8 -5
  193. data/lib/tasks/pages/export.rake +3 -1
  194. data/lib/tasks/pages/page_paths.rake +2 -0
  195. data/template.rb +2 -0
  196. metadata +127 -77
  197. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  198. data/app/views/admin_mailer/error_report.html.erb +0 -70
  199. data/app/views/errors/500_critical.html.erb +0 -7
  200. data/app/views/errors/report.html.erb +0 -4
  201. data/config/removed_migrations.yml +0 -60
  202. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  203. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  204. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  205. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  206. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  207. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  208. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  209. data/db/migrate/20140203183900_create_roles.rb +0 -66
  210. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  211. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  212. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  213. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  214. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  215. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  216. data/db/migrate/20141007173000_create_invites.rb +0 -16
  217. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  218. data/db/migrate/20150401131300_localize_images.rb +0 -38
  219. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  220. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  221. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  222. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  223. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  224. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  225. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  226. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  227. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  228. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  229. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  230. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  231. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  232. data/lib/tasks/pages/update.rake +0 -17
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module HeadTagsHelper
3
5
  # Sets a document title.
@@ -30,6 +32,7 @@ module PagesCore
30
32
  def feed_tags(options = {})
31
33
  feeds = Page.enabled_feeds(@locale, options)
32
34
  return unless feeds.any?
35
+
33
36
  feed_tags = [
34
37
  rss_link_tag(PagesCore.config(:site_name),
35
38
  pages_url(@locale, format: :rss))
@@ -72,7 +75,7 @@ module PagesCore
72
75
  safe_join(
73
76
  [
74
77
  "<!doctype html>\n<html lang=\"#{I18n.locale}\">".html_safe,
75
- content_tag(:head) do
78
+ tag.head do
76
79
  safe_join(head_tag_contents(block_output), "\n")
77
80
  end
78
81
  ]
@@ -110,7 +113,7 @@ module PagesCore
110
113
  [
111
114
  tag(:meta, charset: "utf-8"),
112
115
  tag(:meta, "http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
113
- content_tag(:title, document_title),
116
+ tag.title(document_title),
114
117
  meta_description_tag, meta_keywords_tag,
115
118
  (tag(:link, rel: "image_src", href: meta_image) if meta_image?),
116
119
  open_graph_tags,
@@ -121,11 +124,13 @@ module PagesCore
121
124
 
122
125
  def meta_description_tag
123
126
  return unless meta_description?
127
+
124
128
  tag(:meta, name: "description", content: meta_description)
125
129
  end
126
130
 
127
131
  def meta_keywords_tag
128
132
  return unless meta_keywords?
133
+
129
134
  tag(:meta, name: "keywords", content: meta_keywords)
130
135
  end
131
136
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ImagesHelper
3
5
  include DynamicImage::Helper
@@ -28,6 +30,7 @@ module PagesCore
28
30
  def extract_alt_text(record_or_array)
29
31
  record = extract_dynamic_image_record(record_or_array)
30
32
  return {} unless record.alternative?
33
+
31
34
  { alt: record.alternative }
32
35
  end
33
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module MetaTagsHelper
3
5
  # Sets a default image to use for meta tags. Supports
@@ -72,7 +74,7 @@ module PagesCore
72
74
  @meta_keywords = Array(args.first).join(", ")
73
75
  else
74
76
  keywords = @meta_keywords
75
- keywords ||= @page.tag_list if @page && @page.tags.any?
77
+ keywords ||= @page.tag_list if @page&.tags&.any?
76
78
  strip_tags(keywords)
77
79
  end
78
80
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module OpenGraphTagsHelper
3
5
  def open_graph_properties
@@ -37,12 +39,12 @@ module PagesCore
37
39
 
38
40
  def default_open_graph_properties
39
41
  {
40
- type: "website",
41
- site_name: PagesCore.config(:site_name),
42
- title: default_open_graph_title,
43
- image: (meta_image if meta_image?),
42
+ type: "website",
43
+ site_name: PagesCore.config(:site_name),
44
+ title: default_open_graph_title,
45
+ image: (meta_image if meta_image?),
44
46
  description: default_open_graph_description,
45
- url: request.url
47
+ url: request.url
46
48
  }
47
49
  end
48
50
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PagePathHelper
3
5
  def page_path(locale, page, options = {})
@@ -6,17 +8,19 @@ module PagesCore
6
8
 
7
9
  (PagesCore.config.localizations? ? "/#{locale}/" : "/") +
8
10
  escape_page_path(p.full_path) +
11
+ (html_format?(options) ? "" : ".#{options[:format]}") +
9
12
  paginated_section(options)
10
13
  end
11
14
  end
12
15
 
13
16
  def page_url(page_or_locale, page = nil, opts = {})
14
17
  locale, page = page_url_locale_and_page(page_or_locale, page, opts)
18
+
15
19
  page.localize(locale) do |p|
16
- if p.redirects?
17
- p.redirect_path(locale: locale)
20
+ if p.redirects? && html_format?(opts)
21
+ page_redirect_url(locale, p)
18
22
  elsif p.full_path
19
- "#{request.protocol}#{request.host_with_port}" + page_path(locale, p)
23
+ base_page_url + page_path(locale, p, opts)
20
24
  else
21
25
  super(locale, p, opts)
22
26
  end
@@ -25,12 +29,28 @@ module PagesCore
25
29
 
26
30
  private
27
31
 
32
+ def page_redirect_url(locale, page)
33
+ redirect = page.redirect_path(locale: locale)
34
+ return redirect if redirect =~ %r{^https?://}
35
+
36
+ base_page_url + redirect
37
+ end
38
+
39
+ def base_page_url
40
+ "#{request.protocol}#{request.host_with_port}"
41
+ end
42
+
43
+ def html_format?(opts)
44
+ opts[:format].blank? || opts[:format].to_sym == :html
45
+ end
46
+
28
47
  def escape_page_path(path)
29
48
  path.split("/").map { |s| CGI.escape(s) }.join("/")
30
49
  end
31
50
 
32
51
  def page_url_locale_and_page(page_or_locale, page, opts)
33
52
  return [page_or_locale, page] if page
53
+
34
54
  ActiveSupport::Deprecation.warn(
35
55
  "Calling page_url without locale is deprecated"
36
56
  )
@@ -39,6 +59,7 @@ module PagesCore
39
59
 
40
60
  def paginated_section(opts)
41
61
  return "" unless opts[:page]
62
+
42
63
  "/page/#{opts[:page]}"
43
64
  end
44
65
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
- class AutopublishJob < ActiveJob::Base
4
+ class AutopublishJob < ApplicationJob
3
5
  queue_as :pages_core
4
6
 
5
7
  def perform
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
- class SweepCacheJob < ActiveJob::Base
4
+ class SweepCacheJob < ApplicationJob
3
5
  queue_as :pages_core
4
6
 
5
7
  def perform
6
- PagesCore::CacheSweeper.sweep!
8
+ PagesCore::StaticCache.handler.sweep_now!
7
9
  end
8
10
  end
9
11
  end
@@ -1,17 +1,7 @@
1
- class AdminMailer < ActionMailer::Base
2
- default from: proc { "\"Pages\" <support@anyone.no>" }
1
+ # frozen_string_literal: true
3
2
 
4
- def error_report(error_report, from, description)
5
- @error_report = error_report
6
- @from = from
7
- @description = description
8
- short_message = @error_report[:message].gsub(/[\s\n]+/, " ")[0..80]
9
- mail(
10
- to: "system+error@anyone.no",
11
- from: "\"Error reports\" <system+error@anyone.no>",
12
- subject: "[#{PagesCore.config(:site_name)}] Error: #{short_message}"
13
- )
14
- end
3
+ class AdminMailer < ApplicationMailer
4
+ default from: proc { "\"Pages\" <support@anyone.no>" }
15
5
 
16
6
  def password_reset(user, url)
17
7
  @user = user
@@ -26,7 +16,7 @@ class AdminMailer < ActionMailer::Base
26
16
  @invite = invite
27
17
  @url = url
28
18
  mail(
29
- to: @invite.email,
19
+ to: @invite.email,
30
20
  subject: "#{PagesCore.config(:site_name)} has invited you to Pages"
31
21
  )
32
22
  end
@@ -1,4 +1,6 @@
1
- class Attachment < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Attachment < ApplicationRecord
2
4
  include Dis::Model
3
5
  include PagesCore::Sweepable
4
6
 
@@ -25,12 +27,12 @@ class Attachment < ActiveRecord::Base
25
27
 
26
28
  def formats
27
29
  {
28
- "audio/mpeg" => :mp3,
29
- "image/gif" => :gif,
30
- "image/jpeg" => :jpg,
31
- "image/jpg" => :jpg,
32
- "image/pjpeg" => :jpg,
33
- "image/png" => :png,
30
+ "audio/mpeg" => :mp3,
31
+ "image/gif" => :gif,
32
+ "image/jpeg" => :jpg,
33
+ "image/jpg" => :jpg,
34
+ "image/pjpeg" => :jpg,
35
+ "image/png" => :png,
34
36
  "application/pdf" => :pdf
35
37
  }
36
38
  end
@@ -52,7 +54,7 @@ class Attachment < ActiveRecord::Base
52
54
 
53
55
  def filename_extension
54
56
  if filename_extension?
55
- filename.match(/\.([^\.]+)$/)[1]
57
+ filename.match(/\.([^.]+)$/)[1]
56
58
  else
57
59
  ""
58
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Autopublisher
2
4
  class << self
3
5
  def run!(_options = {})
@@ -13,6 +15,7 @@ class Autopublisher
13
15
 
14
16
  def queue!
15
17
  return unless queued_pages.any?
18
+
16
19
  PagesCore::AutopublishJob
17
20
  .set(wait_until: queued_pages.first.published_at)
18
21
  .perform_later
@@ -1,4 +1,6 @@
1
- class Category < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Category < ApplicationRecord
2
4
  has_many :page_categories, dependent: :destroy
3
5
  has_many :pages, through: :page_categories
4
6
  validates :name, presence: true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module HasRoles
3
5
  extend ActiveSupport::Concern
@@ -1,17 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module HumanizableParam
3
5
  include ActiveSupport::Inflector
4
6
  extend ActiveSupport::Concern
5
7
 
6
8
  def humanized_param(slug)
7
- return id.to_s unless slug && slug.present?
9
+ return id.to_s unless slug&.present?
10
+
8
11
  "#{id}-" + transliterate(slug)
9
12
  .downcase
10
- .gsub(/[\[\{]/, "(")
11
- .gsub(/[\]\}]/, ")")
12
- .gsub(/[^[[:alnum:]]()\-]+/, "-")
13
- .gsub(/[\-]{2,}/, "-")
14
- .gsub(/(^\-|\-$)/, "")
13
+ .gsub(/[\[{]/, "(")
14
+ .gsub(/}\]/, ")")
15
+ .gsub(/[^[[:alnum:]]()-]+/, "-")
16
+ .gsub(/-{2,}/, "-")
17
+ .gsub(/(^-|-$)/, "")
15
18
  end
16
19
  end
17
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module Attachments
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module Autopublishable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module DatedPage
@@ -14,25 +16,21 @@ module PagesCore
14
16
  module ClassMethods
15
17
  end
16
18
 
17
- # Finds the page's next sibling by date. Returns nil if there isn't one.
19
+ # Finds the page's next sibling by date. Returns nil if there
20
+ # isn't one.
18
21
  def next_sibling_by_date
19
- siblings = siblings_by_date
20
- return unless siblings.any?
21
-
22
- siblings[(siblings.to_a.index(self) + 1)...siblings.length]
23
- .try(&:first)
22
+ siblings_by_date.where("starts_at >= ?", starts_at)&.first
24
23
  end
25
24
 
26
- # Finds the page's previous sibling by date. Returns nil if there isn't one.
25
+ # Finds the page's previous sibling by date. Returns nil if
26
+ # there isn't one.
27
27
  def previous_sibling_by_date
28
- siblings = siblings_by_date
29
- return unless siblings.any?
30
-
31
- siblings[0...siblings.to_a.index(self)].try(&:last)
28
+ siblings_by_date.where("starts_at < ?", starts_at)&.last
32
29
  end
33
30
 
34
31
  def upcoming?
35
32
  return false unless ends_at?
33
+
36
34
  ends_at > Time.zone.now
37
35
  end
38
36
 
@@ -53,6 +51,8 @@ module PagesCore
53
51
 
54
52
  def siblings_by_date
55
53
  siblings.reorder("starts_at ASC, pages.id DESC")
54
+ .where
55
+ .not(id: id)
56
56
  end
57
57
  end
58
58
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module Images
@@ -16,7 +18,9 @@ module PagesCore
16
18
  after_save :update_primary_image
17
19
 
18
20
  accepts_nested_attributes_for :page_images,
19
- reject_if: proc { |a| a["image_id"].blank? },
21
+ reject_if: proc { |a|
22
+ a["image_id"].blank?
23
+ },
20
24
  allow_destroy: true
21
25
  end
22
26
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module Localizable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PageModel
3
5
  module Pathable
@@ -6,43 +8,32 @@ module PagesCore
6
8
  included do
7
9
  has_many :page_paths, dependent: :destroy
8
10
 
9
- validates :path_segment, format: { with: /\A[[[:alnum:]]\-_]*\z/ }
11
+ validates :path_segment, format: { with: /\A[[[:alnum:]]-_]*\z/ }
10
12
  validate :path_segment_cannot_be_routable
11
13
  before_validation :ensure_no_path_segment_on_deletion
12
14
  after_save :ensure_path_segment
13
15
  after_save :associate_page_path
14
16
  end
15
17
 
16
- def full_path(last_segment = nil)
17
- last_segment ||= path_segment
18
- return nil unless full_path?(last_segment)
19
- if parent
20
- [parent.full_path, last_segment].join("/")
21
- else
22
- last_segment
23
- end
18
+ def full_path
19
+ generate_full_path
24
20
  end
25
21
 
26
- def full_path?(last_segment = nil)
27
- last_segment ||= path_segment
28
- if parent
29
- parent.full_path? && last_segment.present?
30
- else
31
- last_segment.present?
32
- end
22
+ def full_path?
23
+ path_segment.present? && pathable?
33
24
  end
34
25
 
35
26
  def ensure_path_segment
36
27
  return if deleted? || path_segment? || !name?
37
- if path_collision?(generated_path_segment)
38
- update path_segment: "#{generated_path_segment}-#{id}"
39
- else
40
- update path_segment: generated_path_segment
41
- end
28
+
29
+ segment = generated_path_segment
30
+ segment = "#{segment}-#{id}" if path_collision?(segment)
31
+ update(path_segment: segment)
42
32
  end
43
33
 
44
34
  def pathable?
45
35
  return true unless parent
36
+
46
37
  parent.full_path?
47
38
  end
48
39
 
@@ -50,18 +41,27 @@ module PagesCore
50
41
 
51
42
  def associate_page_path
52
43
  return if deleted? || !full_path?
44
+
53
45
  PagePath.build(self)
54
46
  end
55
47
 
56
48
  def ensure_no_path_segment_on_deletion
57
49
  return unless deleted?
50
+
58
51
  self.path_segment = nil
59
52
  end
60
53
 
54
+ def generate_full_path(last_segment = nil)
55
+ last_segment ||= path_segment
56
+ return nil unless last_segment.present? && pathable?
57
+
58
+ [parent&.full_path, last_segment].compact.join("/")
59
+ end
60
+
61
61
  def generated_path_segment
62
- transliterated_name.gsub(/[^[[:alnum:]]\-_]+/, "-")
63
- .gsub(/[\-]{2,}/, "-")
64
- .gsub(/(^\-|\-$)/, "")
62
+ transliterated_name.gsub(/[^[[:alnum:]]-_]+/, "-")
63
+ .gsub(/-{2,}/, "-")
64
+ .gsub(/(^-|-$)/, "")
65
65
  .mb_chars
66
66
  .downcase
67
67
  end
@@ -81,12 +81,13 @@ module PagesCore
81
81
 
82
82
  def path_collision?(path_segment)
83
83
  sibling_path_segments.include?(path_segment) ||
84
- page_path_matches_routes?(full_path(path_segment))
84
+ page_path_matches_routes?(generate_full_path(path_segment))
85
85
  end
86
86
 
87
87
  def path_segment_cannot_be_routable
88
88
  return unless full_path?
89
89
  return unless page_path_matches_routes?(full_path)
90
+
90
91
  errors.add(:path_segment, "can't match an existing URL")
91
92
  end
92
93