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.
- checksums.yaml +4 -4
- data/README.md +0 -1
- data/Rakefile +3 -1
- data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
- data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
- data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
- data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
- data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
- data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
- data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
- data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
- data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
- data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
- data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
- data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
- data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
- data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
- data/app/assets/javascripts/pages/login_form.jsx +8 -8
- data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
- data/app/assets/stylesheets/pages/errors.css +2 -0
- data/app/controller_dummies/admin/admin_controller.rb +2 -0
- data/app/controller_dummies/application_controller.rb +2 -0
- data/app/controller_dummies/attachments_controller.rb +2 -0
- data/app/controller_dummies/frontend_controller.rb +2 -0
- data/app/controller_dummies/images_controller.rb +2 -0
- data/app/controller_dummies/page_files_controller.rb +2 -0
- data/app/controller_dummies/pages_controller.rb +2 -0
- data/app/controller_dummies/sitemaps_controller.rb +2 -0
- data/app/controllers/admin/attachments_controller.rb +4 -2
- data/app/controllers/admin/categories_controller.rb +2 -0
- data/app/controllers/admin/images_controller.rb +10 -5
- data/app/controllers/admin/invites_controller.rb +4 -1
- data/app/controllers/admin/pages_controller.rb +7 -19
- data/app/controllers/admin/password_resets_controller.rb +9 -5
- data/app/controllers/admin/users_controller.rb +10 -4
- data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
- data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
- data/app/controllers/concerns/pages_core/authentication.rb +4 -1
- data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
- data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
- data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
- data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
- data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
- data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
- data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
- data/app/controllers/errors_controller.rb +5 -53
- data/app/controllers/pages_core/admin_controller.rb +7 -67
- data/app/controllers/pages_core/attachments_controller.rb +10 -6
- data/app/controllers/pages_core/base_controller.rb +11 -17
- data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
- data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
- data/app/controllers/pages_core/frontend_controller.rb +3 -0
- data/app/controllers/pages_core/images_controller.rb +3 -1
- data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
- data/app/controllers/sessions_controller.rb +2 -0
- data/app/formatters/pages_core/html_formatter.rb +13 -63
- data/app/formatters/pages_core/image_embedder.rb +79 -0
- data/app/formatters/pages_core/link_renderer.rb +2 -0
- data/app/helpers/admin/admin_helper.rb +2 -0
- data/app/helpers/admin/menu_helper.rb +6 -4
- data/app/helpers/admin/pages_helper.rb +4 -57
- data/app/helpers/application_helper.rb +2 -0
- data/app/helpers/frontend_helper.rb +2 -0
- data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
- data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
- data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
- data/app/helpers/pages_core/admin/form_builder.rb +8 -0
- data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
- data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
- data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
- data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
- data/app/helpers/pages_core/application_helper.rb +3 -0
- data/app/helpers/pages_core/attachments_helper.rb +31 -27
- data/app/helpers/pages_core/form_builder.rb +17 -13
- data/app/helpers/pages_core/frontend_helper.rb +3 -3
- data/app/helpers/pages_core/head_tags_helper.rb +7 -2
- data/app/helpers/pages_core/images_helper.rb +3 -0
- data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
- data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
- data/app/helpers/pages_core/page_path_helper.rb +24 -3
- data/app/jobs/pages_core/autopublish_job.rb +3 -1
- data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
- data/app/mailers/admin_mailer.rb +4 -14
- data/app/models/attachment.rb +10 -8
- data/app/models/autopublisher.rb +3 -0
- data/app/models/category.rb +3 -1
- data/app/models/concerns/pages_core/has_roles.rb +2 -0
- data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
- data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
- data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
- data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
- data/app/models/concerns/pages_core/page_model/images.rb +5 -1
- data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
- data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
- data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
- data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
- data/app/models/concerns/pages_core/page_model/status.rb +2 -0
- data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
- data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
- data/app/models/concerns/pages_core/sweepable.rb +4 -2
- data/app/models/concerns/pages_core/taggable.rb +8 -2
- data/app/models/image.rb +14 -1
- data/app/models/invite.rb +3 -1
- data/app/models/invite_role.rb +5 -3
- data/app/models/page.rb +4 -3
- data/app/models/page_builder.rb +2 -0
- data/app/models/page_category.rb +3 -1
- data/app/models/page_exporter.rb +22 -9
- data/app/models/page_file.rb +3 -1
- data/app/models/page_image.rb +3 -1
- data/app/models/page_path.rb +13 -5
- data/app/models/password_reset_token.rb +3 -1
- data/app/models/role.rb +8 -5
- data/app/models/tag.rb +8 -6
- data/app/models/tagging.rb +4 -2
- data/app/models/user.rb +7 -4
- data/app/policies/invite_policy.rb +2 -0
- data/app/policies/page_file_policy.rb +2 -0
- data/app/policies/page_image_policy.rb +2 -0
- data/app/policies/page_policy.rb +2 -0
- data/app/policies/policy.rb +2 -0
- data/app/policies/user_policy.rb +2 -0
- data/app/serializers/admin/attachment_serializer.rb +4 -2
- data/app/serializers/admin/image_serializer.rb +4 -2
- data/app/serializers/admin/page_file_serializer.rb +2 -0
- data/app/serializers/admin/page_image_serializer.rb +2 -0
- data/app/serializers/page_export_serializer.rb +2 -0
- data/app/serializers/page_file_export_serializer.rb +2 -0
- data/app/serializers/page_image_export_serializer.rb +2 -0
- data/app/serializers/page_image_serializer.rb +2 -0
- data/app/serializers/page_serializer.rb +2 -0
- data/app/services/pages_core/create_user_service.rb +5 -2
- data/app/services/pages_core/destroy_invite_service.rb +25 -0
- data/app/services/pages_core/invite_service.rb +2 -0
- data/app/views/admin/images/show.json.jbuilder +2 -0
- data/app/views/admin/pages/news.html.erb +1 -1
- data/app/views/errors/500.html.erb +2 -20
- data/app/views/errors/_generic_help.html.erb +1 -1
- data/app/views/feeds/pages.rss.builder +2 -0
- data/app/views/sitemaps/show.xml.builder +2 -0
- data/config/routes.rb +5 -5
- data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
- data/lib/pages_core.rb +10 -0
- data/lib/pages_core/admin_menu_item.rb +3 -0
- data/lib/pages_core/archive_finder.rb +12 -16
- data/lib/pages_core/attachment_embedder.rb +4 -6
- data/lib/pages_core/cache_sweeper.rb +10 -108
- data/lib/pages_core/configuration.rb +2 -0
- data/lib/pages_core/configuration/base.rb +5 -0
- data/lib/pages_core/configuration/pages.rb +4 -2
- data/lib/pages_core/digest_verifier.rb +5 -5
- data/lib/pages_core/engine.rb +52 -0
- data/lib/pages_core/extensions.rb +2 -0
- data/lib/pages_core/extensions/string_extensions.rb +3 -1
- data/lib/pages_core/page_path_constraint.rb +2 -0
- data/lib/pages_core/pages_plugin.rb +3 -1
- data/lib/pages_core/plugin.rb +4 -52
- data/lib/pages_core/pub_sub.rb +2 -0
- data/lib/pages_core/static_cache.rb +26 -0
- data/lib/pages_core/static_cache/null_handler.rb +17 -0
- data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
- data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
- data/lib/pages_core/templates.rb +5 -3
- data/lib/pages_core/templates/block_configuration.rb +3 -0
- data/lib/pages_core/templates/configuration.rb +5 -1
- data/lib/pages_core/templates/configuration_handler.rb +4 -2
- data/lib/pages_core/templates/configuration_proxy.rb +2 -0
- data/lib/pages_core/templates/controller_actions.rb +2 -0
- data/lib/pages_core/templates/template_configuration.rb +18 -13
- data/lib/pages_core/version.rb +3 -1
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
- data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
- data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
- data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
- data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
- data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
- data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
- data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
- data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
- data/lib/tasks/pages.rake +3 -2
- data/lib/tasks/pages/cache.rake +8 -5
- data/lib/tasks/pages/export.rake +3 -1
- data/lib/tasks/pages/page_paths.rake +2 -0
- data/template.rb +2 -0
- metadata +127 -77
- data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
- data/app/views/admin_mailer/error_report.html.erb +0 -70
- data/app/views/errors/500_critical.html.erb +0 -7
- data/app/views/errors/report.html.erb +0 -4
- data/config/removed_migrations.yml +0 -60
- data/db/migrate/20120627033112_rename_textbits.rb +0 -17
- data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
- data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
- data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
- data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
- data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
- data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
- data/db/migrate/20140203183900_create_roles.rb +0 -66
- data/db/migrate/20140414150500_change_locale_names.rb +0 -11
- data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
- data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
- data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
- data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
- data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
- data/db/migrate/20141007173000_create_invites.rb +0 -16
- data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
- data/db/migrate/20150401131300_localize_images.rb +0 -38
- data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
- data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
- data/db/migrate/20151002174800_create_page_paths.rb +0 -10
- data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
- data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
- data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
- data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
- data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
- data/db/migrate/20170716213400_remove_sessions.rb +0 -15
- data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
- data/db/migrate/20190211154800_create_attachments.rb +0 -73
- data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
- data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
- 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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
41
|
-
site_name:
|
|
42
|
-
title:
|
|
43
|
-
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:
|
|
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
|
-
|
|
20
|
+
if p.redirects? && html_format?(opts)
|
|
21
|
+
page_redirect_url(locale, p)
|
|
18
22
|
elsif p.full_path
|
|
19
|
-
|
|
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,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
|
-
class SweepCacheJob <
|
|
4
|
+
class SweepCacheJob < ApplicationJob
|
|
3
5
|
queue_as :pages_core
|
|
4
6
|
|
|
5
7
|
def perform
|
|
6
|
-
PagesCore::
|
|
8
|
+
PagesCore::StaticCache.handler.sweep_now!
|
|
7
9
|
end
|
|
8
10
|
end
|
|
9
11
|
end
|
data/app/mailers/admin_mailer.rb
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
default from: proc { "\"Pages\" <support@anyone.no>" }
|
|
1
|
+
# frozen_string_literal: true
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
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:
|
|
19
|
+
to: @invite.email,
|
|
30
20
|
subject: "#{PagesCore.config(:site_name)} has invited you to Pages"
|
|
31
21
|
)
|
|
32
22
|
end
|
data/app/models/attachment.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
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"
|
|
29
|
-
"image/gif"
|
|
30
|
-
"image/jpeg"
|
|
31
|
-
"image/jpg"
|
|
32
|
-
"image/pjpeg"
|
|
33
|
-
"image/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(/\.([
|
|
57
|
+
filename.match(/\.([^.]+)$/)[1]
|
|
56
58
|
else
|
|
57
59
|
""
|
|
58
60
|
end
|
data/app/models/autopublisher.rb
CHANGED
|
@@ -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
|
data/app/models/category.rb
CHANGED
|
@@ -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
|
|
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(
|
|
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 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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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|
|
|
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 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:]]
|
|
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
|
|
17
|
-
|
|
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?
|
|
27
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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(
|
|
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?(
|
|
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
|
|