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,13 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# All admin controllers inherit Admin::AdminController, which provides layout,
|
|
2
4
|
# authorization and other common code for the Admin set of controllers.
|
|
3
5
|
module PagesCore
|
|
4
6
|
class AdminController < ::ApplicationController
|
|
7
|
+
include PagesCore::Admin::PersistentParams
|
|
8
|
+
|
|
5
9
|
protect_from_forgery with: :exception
|
|
6
10
|
|
|
7
11
|
before_action :set_i18n_locale
|
|
8
12
|
before_action :require_authentication
|
|
9
|
-
before_action :restore_persistent_params
|
|
10
|
-
after_action :save_persistent_params
|
|
11
13
|
|
|
12
14
|
layout "admin"
|
|
13
15
|
|
|
@@ -36,29 +38,14 @@ module PagesCore
|
|
|
36
38
|
# If not, renders the login screen.
|
|
37
39
|
def require_authentication
|
|
38
40
|
return if logged_in?
|
|
41
|
+
|
|
39
42
|
if User.count < 1
|
|
40
|
-
redirect_to(new_admin_user_url)
|
|
43
|
+
redirect_to(new_admin_user_url)
|
|
41
44
|
else
|
|
42
|
-
redirect_to(login_admin_users_url)
|
|
45
|
+
redirect_to(login_admin_users_url)
|
|
43
46
|
end
|
|
44
47
|
end
|
|
45
48
|
|
|
46
|
-
# Loads persistent params from user model and merges with session.
|
|
47
|
-
def restore_persistent_params
|
|
48
|
-
return unless current_user && current_user.persistent_data?
|
|
49
|
-
session[:persistent_params] ||= {}
|
|
50
|
-
session[:persistent_params] = current_user.persistent_data.merge(
|
|
51
|
-
session[:persistent_params]
|
|
52
|
-
)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# Saves persistent params from session to User model if applicable.
|
|
56
|
-
def save_persistent_params
|
|
57
|
-
return unless current_user && session[:persistent_params]
|
|
58
|
-
current_user.persistent_data = session[:persistent_params]
|
|
59
|
-
current_user.save
|
|
60
|
-
end
|
|
61
|
-
|
|
62
49
|
def secure_compare(compare, other)
|
|
63
50
|
return false unless compare && other
|
|
64
51
|
return false unless compare.bytesize == other.bytesize
|
|
@@ -69,52 +56,5 @@ module PagesCore
|
|
|
69
56
|
other.each_byte { |byte| res |= byte ^ l.shift }
|
|
70
57
|
res.zero?
|
|
71
58
|
end
|
|
72
|
-
|
|
73
|
-
# --- HELPERS ---
|
|
74
|
-
|
|
75
|
-
# Add a stylesheet
|
|
76
|
-
def add_stylesheet(css_file)
|
|
77
|
-
@admin_stylesheets ||= []
|
|
78
|
-
@admin_stylesheets << "admin/#{css_file}"
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def persistent_params(namespace)
|
|
82
|
-
session[:persistent_params] ||= {}
|
|
83
|
-
session[:persistent_params][namespace] ||= {}
|
|
84
|
-
session[:persistent_params][namespace]
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def coerce_persistent_param(value)
|
|
88
|
-
case value
|
|
89
|
-
when "true"
|
|
90
|
-
true
|
|
91
|
-
when "false"
|
|
92
|
-
false
|
|
93
|
-
else
|
|
94
|
-
value
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Get a persistent param
|
|
99
|
-
def persistent_param(key, default = nil, options = {})
|
|
100
|
-
key = key.to_s
|
|
101
|
-
namespace = options[:namespace] || self.class.to_s
|
|
102
|
-
|
|
103
|
-
value = coerce_persistent_param(
|
|
104
|
-
if params.key?(key)
|
|
105
|
-
params[key]
|
|
106
|
-
elsif persistent_params(namespace).key?(key)
|
|
107
|
-
persistent_params(namespace)[key]
|
|
108
|
-
else
|
|
109
|
-
default
|
|
110
|
-
end
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
if !value.nil? || options[:preserve_nil]
|
|
114
|
-
persistent_params(namespace)[key.to_s] = value
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
value
|
|
118
|
-
end
|
|
119
59
|
end
|
|
120
60
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
class AttachmentsController < ::ApplicationController
|
|
3
5
|
before_action :verify_signed_params
|
|
4
6
|
before_action :find_attachment, only: %i[show download]
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
static_cache :show, permanent: true
|
|
7
9
|
|
|
8
10
|
def show
|
|
9
11
|
send_attachment
|
|
@@ -20,12 +22,14 @@ module PagesCore
|
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def send_attachment(disposition: "inline")
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
filename: @attachment.filename,
|
|
26
|
-
type: @attachment.content_type,
|
|
27
|
-
disposition: disposition)
|
|
25
|
+
unless stale?(etag: @attachment, last_modified: @attachment.updated_at)
|
|
26
|
+
return
|
|
28
27
|
end
|
|
28
|
+
|
|
29
|
+
send_data(@attachment.data,
|
|
30
|
+
filename: @attachment.filename,
|
|
31
|
+
type: @attachment.content_type,
|
|
32
|
+
disposition: disposition)
|
|
29
33
|
end
|
|
30
34
|
|
|
31
35
|
def verify_signed_params
|
|
@@ -1,41 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
class BaseController < ActionController::Base
|
|
3
5
|
include PagesCore::Authentication
|
|
4
|
-
include PagesCore::DomainBasedCache
|
|
5
6
|
include PagesCore::ErrorRenderer
|
|
7
|
+
include PagesCore::ErrorReporting
|
|
6
8
|
include PagesCore::ProcessTitler
|
|
7
9
|
include PagesCore::PoliciesHelper
|
|
10
|
+
include PagesCore::StaticCacheController
|
|
8
11
|
|
|
9
|
-
before_action :set_locale
|
|
12
|
+
before_action :set_locale
|
|
10
13
|
after_action :set_content_language_header
|
|
11
14
|
|
|
12
15
|
protected
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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)
|
|
17
|
+
def append_info_to_payload(payload)
|
|
18
|
+
super
|
|
19
|
+
payload[:remote_ip] = request.remote_ip
|
|
20
|
+
payload.merge!(current_user_context)
|
|
25
21
|
end
|
|
26
22
|
|
|
27
23
|
# Sets @locale from params[:locale], with I18n.default_locale as fallback
|
|
28
24
|
def set_locale
|
|
29
|
-
legacy_locales = {
|
|
30
|
-
"nor" => "nb",
|
|
31
|
-
"eng" => "en"
|
|
32
|
-
}
|
|
25
|
+
legacy_locales = { "nor" => "nb", "eng" => "en" }
|
|
33
26
|
@locale = params[:locale] || I18n.default_locale.to_s
|
|
34
27
|
@locale = legacy_locales[@locale] if legacy_locales[@locale]
|
|
35
28
|
end
|
|
36
29
|
|
|
37
30
|
def set_content_language_header
|
|
38
31
|
return unless locale
|
|
32
|
+
|
|
39
33
|
headers["Content-Language"] = locale.to_s
|
|
40
34
|
end
|
|
41
35
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module Frontend
|
|
3
5
|
class PageFilesController < ::FrontendController
|
|
@@ -6,9 +8,11 @@ module PagesCore
|
|
|
6
8
|
before_action :find_page_file, only: %i[show]
|
|
7
9
|
|
|
8
10
|
def show
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
unless stale?(etag: @page_file, last_modified: @page_file.updated_at)
|
|
12
|
+
return
|
|
11
13
|
end
|
|
14
|
+
|
|
15
|
+
redirect_to attachment_path(@page_file.attachment)
|
|
12
16
|
end
|
|
13
17
|
|
|
14
18
|
private
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module Frontend
|
|
3
5
|
class PagesController < ::FrontendController
|
|
@@ -13,7 +15,7 @@ module PagesCore
|
|
|
13
15
|
before_action :find_page, only: %i[show preview]
|
|
14
16
|
before_action :require_page, only: %i[show preview]
|
|
15
17
|
before_action :canonicalize_url, only: [:show]
|
|
16
|
-
|
|
18
|
+
static_cache :index, :show
|
|
17
19
|
|
|
18
20
|
def index
|
|
19
21
|
respond_to do |format|
|
|
@@ -45,11 +47,8 @@ module PagesCore
|
|
|
45
47
|
return if request.path == canonical_path(@page)
|
|
46
48
|
# Don't canonicalize if any unknown params are present
|
|
47
49
|
return if (params.keys - %w[controller action path locale id]).any?
|
|
48
|
-
redirect_to(canonical_path(@page), status: :moved_permanently)
|
|
49
|
-
end
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
@page_cache_disabled = true
|
|
51
|
+
redirect_to(canonical_path(@page), status: :moved_permanently)
|
|
53
52
|
end
|
|
54
53
|
|
|
55
54
|
def render(*args)
|
|
@@ -80,20 +79,13 @@ module PagesCore
|
|
|
80
79
|
template = page_template(@page)
|
|
81
80
|
run_template_actions_for(template, @page)
|
|
82
81
|
return if @already_rendered
|
|
83
|
-
render template: "pages/templates/#{template}"
|
|
84
|
-
end
|
|
85
82
|
|
|
86
|
-
|
|
87
|
-
def cache_page_request
|
|
88
|
-
return if @page_cache_disabled || !PagesCore.config(:page_cache)
|
|
89
|
-
return if response.status&.to_i != 200
|
|
90
|
-
return unless @page && @locale
|
|
91
|
-
|
|
92
|
-
self.class.cache_page(response.body, request.path)
|
|
83
|
+
render template: "pages/templates/#{template}"
|
|
93
84
|
end
|
|
94
85
|
|
|
95
86
|
def find_page_by_path
|
|
96
87
|
return unless params[:path]
|
|
88
|
+
|
|
97
89
|
@page = PagePath.get(locale, params[:path]).try(&:page)
|
|
98
90
|
end
|
|
99
91
|
|
|
@@ -103,7 +95,7 @@ module PagesCore
|
|
|
103
95
|
end
|
|
104
96
|
|
|
105
97
|
def render_published_page(page)
|
|
106
|
-
if page
|
|
98
|
+
if page&.published?
|
|
107
99
|
@page = page
|
|
108
100
|
render_page
|
|
109
101
|
else
|
|
@@ -113,11 +105,13 @@ module PagesCore
|
|
|
113
105
|
|
|
114
106
|
def redirect_page(page)
|
|
115
107
|
return false unless page.redirects?
|
|
108
|
+
|
|
116
109
|
redirect_to(page.redirect_path(locale: locale))
|
|
117
110
|
end
|
|
118
111
|
|
|
119
112
|
def require_page
|
|
120
113
|
return if @page
|
|
114
|
+
|
|
121
115
|
render_error 404
|
|
122
116
|
end
|
|
123
117
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# Abstract controller for all frontend controllers.
|
|
2
4
|
module PagesCore
|
|
3
5
|
class FrontendController < ::ApplicationController
|
|
@@ -32,6 +34,7 @@ module PagesCore
|
|
|
32
34
|
I18n.locale = locale_param
|
|
33
35
|
rescue I18n::InvalidLocale
|
|
34
36
|
raise if Rails.application.config.consider_all_requests_local
|
|
37
|
+
|
|
35
38
|
render_error 404
|
|
36
39
|
end
|
|
37
40
|
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
class SitemapsController < ::ApplicationController
|
|
3
5
|
include PagesCore::PagePathHelper
|
|
4
|
-
|
|
6
|
+
static_cache :show
|
|
5
7
|
|
|
6
8
|
def show
|
|
7
9
|
@entries = formatted_entries
|
|
@@ -42,13 +44,13 @@ module PagesCore
|
|
|
42
44
|
|
|
43
45
|
def pages
|
|
44
46
|
([Page.root.try(:localize, I18n.default_locale)] +
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
locales.flat_map do |locale|
|
|
48
|
+
Page.published.localized(locale).includes(:parent)
|
|
49
|
+
end).compact.uniq
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def page_record_url(record)
|
|
51
|
-
if record ==
|
|
53
|
+
if record == root_page && record.locale == I18n.default_locale
|
|
52
54
|
root_url
|
|
53
55
|
else
|
|
54
56
|
page_url(record.locale, record)
|
|
@@ -68,5 +70,9 @@ module PagesCore
|
|
|
68
70
|
def records
|
|
69
71
|
pages
|
|
70
72
|
end
|
|
73
|
+
|
|
74
|
+
def root_page
|
|
75
|
+
@root_page ||= Page.root
|
|
76
|
+
end
|
|
71
77
|
end
|
|
72
78
|
end
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
class HtmlFormatter
|
|
3
|
-
include ActionView::Helpers::AssetTagHelper
|
|
4
|
-
include PagesCore::ImagesHelper
|
|
5
|
-
include Rails.application.routes.url_helpers
|
|
6
|
-
|
|
7
5
|
class << self
|
|
8
6
|
def to_html(string, options = {})
|
|
9
7
|
new(string, options).to_html
|
|
@@ -16,12 +14,9 @@ module PagesCore
|
|
|
16
14
|
end
|
|
17
15
|
|
|
18
16
|
def to_html
|
|
19
|
-
string = parse_images(parse_files(parse_attachments(@string)))
|
|
20
|
-
if @options[:shorten] && string.length > @options[:shorten]
|
|
21
|
-
string = string[0..@options[:shorten]] + "..."
|
|
22
|
-
end
|
|
17
|
+
string = shorten(parse_images(parse_files(parse_attachments(@string))))
|
|
23
18
|
string += " #{@options[:append]}" if @options[:append]
|
|
24
|
-
RedCloth.new(string).to_html.html_safe
|
|
19
|
+
fix_markup(RedCloth.new(string).to_html).html_safe
|
|
25
20
|
end
|
|
26
21
|
|
|
27
22
|
private
|
|
@@ -34,31 +29,6 @@ module PagesCore
|
|
|
34
29
|
/\[file:([\d,]+)\]/
|
|
35
30
|
end
|
|
36
31
|
|
|
37
|
-
def image_expression
|
|
38
|
-
/\[image:(\d+)([^\]]*)?\]/
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def embed_image(id, size:, class_name:, link:)
|
|
42
|
-
image = Image.find(id).localize(I18n.locale)
|
|
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)
|
|
46
|
-
content_tag(:figure,
|
|
47
|
-
(link ? link_to(image_tag, link) : image_tag) +
|
|
48
|
-
image_caption(image),
|
|
49
|
-
class: class_name)
|
|
50
|
-
rescue ActiveRecord::RecordNotFound
|
|
51
|
-
nil
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def embed_image_size(str)
|
|
55
|
-
if str =~ /size="(\d*x\d*)"/
|
|
56
|
-
Regexp.last_match(1)
|
|
57
|
-
else
|
|
58
|
-
"2000x2000"
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
32
|
def find_attachment(id)
|
|
63
33
|
Attachment.find(id).localize(I18n.locale)
|
|
64
34
|
rescue ActiveRecord::RecordNotFound
|
|
@@ -85,6 +55,10 @@ module PagesCore
|
|
|
85
55
|
.compact
|
|
86
56
|
end
|
|
87
57
|
|
|
58
|
+
def fix_markup(str)
|
|
59
|
+
Nokogiri::HTML.fragment(str).to_html
|
|
60
|
+
end
|
|
61
|
+
|
|
88
62
|
def parse_attachments(string)
|
|
89
63
|
string.gsub(attachment_expression).each do |str|
|
|
90
64
|
PagesCore.config.attachment_embedder.new(
|
|
@@ -101,40 +75,16 @@ module PagesCore
|
|
|
101
75
|
end
|
|
102
76
|
end
|
|
103
77
|
|
|
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
|
-
|
|
115
78
|
def parse_images(string)
|
|
116
|
-
|
|
117
|
-
parse_image(str)
|
|
118
|
-
end
|
|
79
|
+
PagesCore::ImageEmbedder.new(string).embed
|
|
119
80
|
end
|
|
120
81
|
|
|
121
|
-
def
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def image_class_name(image)
|
|
127
|
-
if image.size.x == image.size.y
|
|
128
|
-
"square"
|
|
129
|
-
elsif image.size.x > image.size.y
|
|
130
|
-
"landscape"
|
|
131
|
-
else
|
|
132
|
-
"portrait"
|
|
82
|
+
def shorten(string)
|
|
83
|
+
unless @options[:shorten] && string.length > @options[:shorten]
|
|
84
|
+
return string
|
|
133
85
|
end
|
|
134
|
-
end
|
|
135
86
|
|
|
136
|
-
|
|
137
|
-
content_tag(:a, content, href: href)
|
|
87
|
+
"#{string[0..@options[:shorten]]}..."
|
|
138
88
|
end
|
|
139
89
|
end
|
|
140
90
|
end
|