pages_core 3.12.3 → 3.12.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/assets/builds/pages_core/admin-dist.js +1 -44
  4. data/app/assets/builds/pages_core/admin-dist.js.map +3 -3
  5. data/app/assets/builds/pages_core/admin.css +79 -46
  6. data/app/assets/stylesheets/pages_core/admin/components/attachments.css +3 -4
  7. data/app/assets/stylesheets/pages_core/admin/components/forms.css +17 -16
  8. data/app/assets/stylesheets/pages_core/admin/components/image_editor.css +8 -4
  9. data/app/assets/stylesheets/pages_core/admin/components/image_grid.css +1 -1
  10. data/app/assets/stylesheets/pages_core/admin/components/list_table.css +11 -3
  11. data/app/assets/stylesheets/pages_core/admin/components/modal.css +9 -5
  12. data/app/assets/stylesheets/pages_core/admin/components/page_tree.css +5 -1
  13. data/app/assets/stylesheets/pages_core/admin/components/toast.css +2 -2
  14. data/app/assets/stylesheets/pages_core/admin/controllers/pages.css +4 -2
  15. data/app/assets/stylesheets/pages_core/admin/vars.css +2 -1
  16. data/app/controllers/admin/calendars_controller.rb +2 -2
  17. data/app/controllers/admin/categories_controller.rb +3 -3
  18. data/app/controllers/admin/news_controller.rb +6 -6
  19. data/app/controllers/admin/pages_controller.rb +12 -11
  20. data/app/controllers/admin/users_controller.rb +1 -1
  21. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +15 -17
  22. data/app/controllers/pages_core/admin_controller.rb +2 -2
  23. data/app/controllers/pages_core/base_controller.rb +1 -8
  24. data/app/controllers/pages_core/frontend/pages_controller.rb +13 -5
  25. data/app/controllers/pages_core/frontend_controller.rb +12 -7
  26. data/app/helpers/admin/menu_helper.rb +2 -0
  27. data/app/helpers/admin/pages_helper.rb +1 -4
  28. data/app/helpers/pages_core/admin/admin_helper.rb +0 -1
  29. data/app/helpers/pages_core/admin/content_tabs_helper.rb +9 -2
  30. data/app/helpers/pages_core/application_helper.rb +2 -3
  31. data/app/helpers/pages_core/frontend_helper.rb +1 -1
  32. data/app/helpers/pages_core/head_tags_helper.rb +15 -46
  33. data/app/helpers/pages_core/images_helper.rb +76 -21
  34. data/app/helpers/pages_core/locales_helper.rb +9 -0
  35. data/app/helpers/pages_core/open_graph_tags_helper.rb +3 -5
  36. data/app/helpers/pages_core/page_path_helper.rb +1 -1
  37. data/app/javascript/components/Attachments/Attachment.tsx +55 -52
  38. data/app/javascript/components/Attachments/AttachmentEditor.tsx +45 -50
  39. data/app/javascript/components/Attachments/Placeholder.tsx +1 -2
  40. data/app/javascript/components/Attachments.jsx +69 -57
  41. data/app/javascript/components/DateRangeSelect.jsx +94 -54
  42. data/app/javascript/components/EditableImage.tsx +20 -16
  43. data/app/javascript/components/FileUploadButton.tsx +12 -12
  44. data/app/javascript/components/ImageCropper/FocalPoint.tsx +22 -20
  45. data/app/javascript/components/ImageCropper/Image.tsx +20 -16
  46. data/app/javascript/components/ImageCropper/Toolbar.tsx +35 -27
  47. data/app/javascript/components/ImageCropper/useCrop.ts +105 -91
  48. data/app/javascript/components/ImageCropper.tsx +34 -25
  49. data/app/javascript/components/ImageEditor/Form.tsx +32 -43
  50. data/app/javascript/components/ImageEditor.tsx +29 -21
  51. data/app/javascript/components/ImageGrid/DragElement.tsx +6 -4
  52. data/app/javascript/components/ImageGrid/GridImage.tsx +56 -52
  53. data/app/javascript/components/ImageGrid/Placeholder.tsx +1 -1
  54. data/app/javascript/components/ImageGrid.jsx +132 -101
  55. data/app/javascript/components/ImageUploader.tsx +59 -55
  56. data/app/javascript/components/Modal.tsx +2 -4
  57. data/app/javascript/components/PageDates.jsx +25 -20
  58. data/app/javascript/components/PageFiles.jsx +7 -5
  59. data/app/javascript/components/PageImages.tsx +9 -7
  60. data/app/javascript/components/PageTree/Draggable.tsx +46 -40
  61. data/app/javascript/components/PageTree/Node.tsx +111 -95
  62. data/app/javascript/components/PageTree/types.ts +9 -9
  63. data/app/javascript/components/PageTree.tsx +44 -29
  64. data/app/javascript/components/RichTextArea.jsx +51 -37
  65. data/app/javascript/components/RichTextToolbarButton.tsx +8 -5
  66. data/app/javascript/components/TagEditor/AddTagForm.tsx +11 -10
  67. data/app/javascript/components/TagEditor/Tag.tsx +10 -8
  68. data/app/javascript/components/TagEditor.tsx +15 -10
  69. data/app/javascript/components/Toast.tsx +3 -7
  70. data/app/javascript/components/drag/draggedOrder.ts +17 -16
  71. data/app/javascript/components/drag/types.ts +12 -12
  72. data/app/javascript/components/drag/useDragCollection.ts +36 -42
  73. data/app/javascript/components/drag/useDragUploader.ts +3 -2
  74. data/app/javascript/components/drag.ts +5 -4
  75. data/app/javascript/controllers/LoginController.ts +0 -1
  76. data/app/javascript/controllers/MainController.ts +6 -2
  77. data/app/javascript/controllers/PageOptionsController.js +7 -2
  78. data/app/javascript/features/RichText.tsx +9 -7
  79. data/app/javascript/index.ts +5 -3
  80. data/app/javascript/lib/Tree.ts +27 -24
  81. data/app/javascript/lib/copyToClipboard.ts +5 -4
  82. data/app/javascript/lib/readyHandler.ts +4 -4
  83. data/app/javascript/lib/request.ts +7 -3
  84. data/app/javascript/stores/useModalStore.ts +3 -3
  85. data/app/javascript/stores/useToastStore.ts +14 -12
  86. data/app/javascript/types.ts +22 -22
  87. data/app/models/concerns/pages_core/page_model/templateable.rb +1 -1
  88. data/app/views/admin/calendars/show.html.erb +1 -1
  89. data/app/views/admin/news/index.html.erb +1 -1
  90. data/app/views/admin/pages/_edit_files.html.erb +1 -1
  91. data/app/views/admin/pages/_edit_images.html.erb +1 -1
  92. data/app/views/admin/pages/_list_item.html.erb +1 -1
  93. data/app/views/admin/pages/_search_bar.html.erb +1 -1
  94. data/app/views/admin/pages/deleted.html.erb +2 -2
  95. data/app/views/admin/pages/edit.html.erb +3 -3
  96. data/app/views/admin/pages/index.html.erb +4 -4
  97. data/app/views/admin/pages/new.html.erb +1 -1
  98. data/app/views/admin/pages/search.html.erb +3 -3
  99. data/app/views/feeds/pages.rss.builder +2 -2
  100. data/app/views/layouts/admin/_page_header.html.erb +4 -4
  101. data/app/views/layouts/admin.html.erb +1 -2
  102. data/config/locales/en.yml +1 -0
  103. data/lib/pages_core/pages_plugin.rb +5 -3
  104. data/lib/rails/generators/pages_core/frontend/templates/application.html.erb +15 -13
  105. data/lib/tasks/pages/reports.rake +26 -0
  106. metadata +32 -4
  107. data/app/helpers/pages_core/admin/deprecated_admin_helper.rb +0 -40
  108. data/app/views/pages_core/_google_analytics.html.erb +0 -8
@@ -9,9 +9,9 @@ module Admin
9
9
  require_authorization object: Page
10
10
 
11
11
  def index
12
- @archive_finder = archive_finder(@news_pages, @locale)
12
+ @archive_finder = archive_finder(@news_pages, content_locale)
13
13
  unless @year
14
- redirect_to(admin_news_index_path(@locale,
14
+ redirect_to(admin_news_index_path(content_locale,
15
15
  (@archive_finder.latest_year ||
16
16
  Time.zone.now.year)))
17
17
  return
@@ -32,11 +32,11 @@ module Admin
32
32
 
33
33
  def find_news_pages
34
34
  @news_pages = Page.news_pages
35
- .in_locale(@locale)
36
- .reorder("parent_page_id ASC, position ASC")
35
+ .in_locale(content_locale)
36
+ .sort { |a, b| b.children.count <=> a.children.count }
37
37
  return if @news_pages.any?
38
38
 
39
- redirect_to(admin_pages_url(@locale))
39
+ redirect_to(admin_pages_url(content_locale))
40
40
  end
41
41
 
42
42
  def find_year_and_month
@@ -48,7 +48,7 @@ module Admin
48
48
  def require_news_pages
49
49
  return if Page.news_pages.any?
50
50
 
51
- redirect_to(admin_pages_url(@locale))
51
+ redirect_to(admin_pages_url(content_locale))
52
52
  end
53
53
 
54
54
  def latest_year
@@ -10,11 +10,11 @@ module Admin
10
10
  require_authorization
11
11
 
12
12
  def index
13
- @pages = Page.admin_list(@locale)
13
+ @pages = Page.admin_list(content_locale)
14
14
  end
15
15
 
16
16
  def deleted
17
- @pages = Page.deleted.by_updated_at.in_locale(@locale)
17
+ @pages = Page.deleted.by_updated_at.in_locale(content_locale)
18
18
  end
19
19
 
20
20
  def search
@@ -22,27 +22,28 @@ module Admin
22
22
 
23
23
  @search_documents =
24
24
  SearchDocument.where(searchable_type: "Page")
25
- .search(search_query, locale: @locale)
25
+ .search(search_query, locale: content_locale)
26
26
  .paginate(per_page: 50, page: params[:page])
27
27
  end
28
28
 
29
29
  def show
30
- redirect_to edit_admin_page_url(@locale, @page)
30
+ redirect_to edit_admin_page_url(content_locale, @page)
31
31
  end
32
32
 
33
33
  def new
34
34
  build_params = params[:page] ? page_params : nil
35
- @page = build_page(@locale, build_params)
35
+ @page = build_page(content_locale, build_params)
36
36
  @page.parent = Page.find_by(id: params[:parent])
37
37
  end
38
38
 
39
39
  def edit; end
40
40
 
41
41
  def create
42
- @page = build_page(@locale, page_params, param_categories).tap(&:save)
42
+ @page = build_page(content_locale, page_params,
43
+ param_categories).tap(&:save)
43
44
  if @page.valid?
44
45
  respond_with_page(@page) do
45
- redirect_to(edit_admin_page_url(@locale, @page))
46
+ redirect_to(edit_admin_page_url(content_locale, @page))
46
47
  end
47
48
  else
48
49
  render action: :new
@@ -54,7 +55,7 @@ module Admin
54
55
  @page.categories = param_categories
55
56
  respond_with_page(@page) do
56
57
  flash[:notice] = t("pages_core.changes_saved")
57
- redirect_to edit_admin_page_url(@locale, @page)
58
+ redirect_to edit_admin_page_url(content_locale, @page)
58
59
  end
59
60
  else
60
61
  render action: :edit
@@ -64,12 +65,12 @@ module Admin
64
65
  def move
65
66
  parent = params[:parent_id] ? Page.find(params[:parent_id]) : nil
66
67
  @page.update(parent: parent, position: params[:position])
67
- respond_with_page(@page) { redirect_to admin_pages_url(@locale) }
68
+ respond_with_page(@page) { redirect_to admin_pages_url(content_locale) }
68
69
  end
69
70
 
70
71
  def destroy
71
72
  Page.find(params[:id]).flag_as_deleted!
72
- redirect_to admin_pages_url(@locale)
73
+ redirect_to admin_pages_url(content_locale)
73
74
  end
74
75
 
75
76
  private
@@ -110,7 +111,7 @@ module Admin
110
111
  end
111
112
 
112
113
  def find_page
113
- @page = Page.find(params[:id]).localize(@locale)
114
+ @page = Page.find(params[:id]).localize(content_locale)
114
115
  end
115
116
 
116
117
  def find_categories
@@ -48,7 +48,7 @@ module Admin
48
48
  flash[:notice] = "Your changed to #{@user.name} were saved."
49
49
  redirect_to admin_users_url
50
50
  else
51
- flash.now[:error] = "There were problems saving your changes."
51
+ flash.now[:error] = t("pages_core.problems_saving")
52
52
  render action: :edit
53
53
  end
54
54
  end
@@ -4,23 +4,6 @@ module PagesCore
4
4
  module PreviewPagesController
5
5
  extend ActiveSupport::Concern
6
6
 
7
- included do
8
- before_action :disable_xss_protection, only: [:preview]
9
- end
10
-
11
- def preview
12
- redirect_to(page_url(@locale, @page)) && return unless logged_in?
13
-
14
- @preview = true
15
- @page.attributes = page_params.merge(
16
- status: 2,
17
- published_at: Time.zone.now,
18
- locale: @locale,
19
- redirect_to: nil
20
- )
21
- render_page
22
- end
23
-
24
7
  def preview?
25
8
  @preview || false
26
9
  end
@@ -45,5 +28,20 @@ module PagesCore
45
28
  Page.localized_attributes + permitted_page_attributes
46
29
  )
47
30
  end
31
+
32
+ def preview_page(page)
33
+ redirect_to(page_url(content_locale, page)) && return unless logged_in?
34
+
35
+ disable_xss_protection
36
+
37
+ @preview = true
38
+ page.attributes = page_params.merge(
39
+ status: 2,
40
+ published_at: Time.zone.now,
41
+ locale: content_locale,
42
+ redirect_to: nil
43
+ )
44
+ render_page
45
+ end
48
46
  end
49
47
  end
@@ -24,9 +24,9 @@ module PagesCore
24
24
 
25
25
  def redirect
26
26
  if Page.news_pages.any?
27
- redirect_to news_admin_pages_url(@locale)
27
+ redirect_to news_admin_pages_url(content_locale)
28
28
  else
29
- redirect_to admin_pages_url(@locale)
29
+ redirect_to admin_pages_url(content_locale)
30
30
  end
31
31
  end
32
32
 
@@ -5,11 +5,11 @@ module PagesCore
5
5
  include PagesCore::Authentication
6
6
  include PagesCore::ErrorRenderer
7
7
  include PagesCore::ErrorReporting
8
+ include PagesCore::LocalesHelper
8
9
  include PagesCore::ProcessTitler
9
10
  include PagesCore::PoliciesHelper
10
11
  include PagesCore::StaticCacheController
11
12
 
12
- before_action :set_locale
13
13
  after_action :set_content_language_header
14
14
 
15
15
  protected
@@ -20,13 +20,6 @@ module PagesCore
20
20
  payload.merge!(current_user_context)
21
21
  end
22
22
 
23
- # Sets @locale from params[:locale], with I18n.default_locale as fallback
24
- def set_locale
25
- legacy_locales = { "nor" => "nb", "eng" => "en" }
26
- @locale = params[:locale] || I18n.default_locale.to_s
27
- @locale = legacy_locales[@locale] if legacy_locales[@locale]
28
- end
29
-
30
23
  def set_content_language_header
31
24
  return unless locale
32
25
 
@@ -27,6 +27,10 @@ module PagesCore
27
27
  end
28
28
  end
29
29
 
30
+ def preview
31
+ preview_page(@page)
32
+ end
33
+
30
34
  def show
31
35
  respond_to do |format|
32
36
  format.html { render_published_page(@page) }
@@ -64,10 +68,6 @@ module PagesCore
64
68
  super
65
69
  end
66
70
 
67
- def page_param
68
- params[:page].is_a?(String) ? params[:page] : 1
69
- end
70
-
71
71
  def page_template(page)
72
72
  if PagesCore::Templates.names.include?(page.template)
73
73
  page.template
@@ -98,7 +98,7 @@ module PagesCore
98
98
 
99
99
  def find_page
100
100
  @page ||= Page.find_by(id: params[:id]) || unique_page(params[:id])
101
- @page.locale = @locale || I18n.default_locale.to_s if @page
101
+ @page.locale = content_locale if @page
102
102
  end
103
103
 
104
104
  def render_published_page(page)
@@ -110,6 +110,14 @@ module PagesCore
110
110
  end
111
111
  end
112
112
 
113
+ def redirect_to_parent_or_root(page)
114
+ if page.parent
115
+ redirect_to page_url(locale, page.parent)
116
+ else
117
+ redirect_to root_url
118
+ end
119
+ end
120
+
113
121
  def redirect_page(page)
114
122
  return false unless page.redirects?
115
123
 
@@ -6,6 +6,7 @@ module PagesCore
6
6
  include ApplicationHelper
7
7
 
8
8
  before_action :set_i18n_locale
9
+ helper_method :page_param
9
10
 
10
11
  # Loads @root_pages and @rss_feeds. To automatically load these in your
11
12
  # own controllers, add the following line to your controller definition:
@@ -13,21 +14,25 @@ module PagesCore
13
14
  # before_action :load_root_pages
14
15
  #
15
16
  def load_root_pages
16
- @root_pages = Page.roots.localized(@locale).published
17
- @rss_feeds = Page.where(feed_enabled: true).localized(@locale).published
17
+ @root_pages = Page.roots.localized(content_locale).published
18
+ @rss_feeds = Page.where(feed_enabled: true)
19
+ .localized(content_locale)
20
+ .published
18
21
  end
19
22
 
20
23
  private
21
24
 
22
25
  def legacy_locales
23
- {
24
- "nor" => "nb",
25
- "eng" => "en"
26
- }
26
+ { "nor" => "nb",
27
+ "eng" => "en" }
28
+ end
29
+
30
+ def page_param
31
+ params[:page].is_a?(String) ? params[:page] : 1
27
32
  end
28
33
 
29
34
  def set_i18n_locale
30
- locale_param = params[:locale] || I18n.default_locale
35
+ locale_param = content_locale
31
36
  if legacy_locales[locale_param]
32
37
  locale_param = legacy_locales[locale_param]
33
38
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Admin
4
4
  module MenuHelper
5
+ include PagesCore::LocalesHelper
6
+
5
7
  def header_tabs(group)
6
8
  tag.ul(class: group.to_s) do
7
9
  safe_join(menu_items_for(group).map do |item|
@@ -53,10 +53,7 @@ module Admin
53
53
  else
54
54
  [page]
55
55
  end
56
- safe_join(
57
- page_names.map { |p| page_name_with_fallback(p) },
58
- raw(" &raquo; ")
59
- )
56
+ safe_join(page_names.map { |p| page_name_with_fallback(p) }, " » ")
60
57
  end
61
58
 
62
59
  def page_published_status(page)
@@ -4,7 +4,6 @@ module PagesCore
4
4
  module Admin
5
5
  module AdminHelper
6
6
  include PagesCore::Admin::ContentTabsHelper
7
- include PagesCore::Admin::DeprecatedAdminHelper
8
7
  include PagesCore::Admin::DateRangeHelper
9
8
  include PagesCore::Admin::ImageUploadsHelper
10
9
  include PagesCore::Admin::LocalesHelper
@@ -3,8 +3,15 @@
3
3
  module PagesCore
4
4
  module Admin
5
5
  module ContentTabsHelper
6
- def content_tab(name, options = {}, &block)
6
+ def content_tabs
7
7
  @content_tabs ||= []
8
+ end
9
+
10
+ def content_tabs?
11
+ content_tabs.any?
12
+ end
13
+
14
+ def content_tab(name, options = {}, &block)
8
15
  return unless block_given?
9
16
 
10
17
  tab = {
@@ -13,7 +20,7 @@ module PagesCore
13
20
  options: options,
14
21
  content: capture(&block)
15
22
  }
16
- @content_tabs << tab
23
+ content_tabs.push(tab)
17
24
  content_tab_tag(tab[:key], tab[:content])
18
25
  end
19
26
 
@@ -22,13 +22,12 @@ module PagesCore
22
22
  end
23
23
 
24
24
  def unique_page(page_name, &block)
25
- locale = @locale || I18n.default_locale.to_s
26
25
  page = Page.where(unique_name: page_name).first
27
26
  if page && block_given?
28
- output = capture(page.localize(locale), &block)
27
+ output = capture(page.localize(content_locale), &block)
29
28
  concat(output)
30
29
  end
31
- page&.localize(locale)
30
+ page&.localize(content_locale)
32
31
  end
33
32
 
34
33
  private
@@ -3,7 +3,7 @@
3
3
  module PagesCore
4
4
  module FrontendHelper
5
5
  def root_pages
6
- @root_pages ||= Page.roots.localized(@locale).published
6
+ @root_pages ||= Page.roots.localized(content_locale).published
7
7
  end
8
8
 
9
9
  def root_page
@@ -10,13 +10,10 @@ module PagesCore
10
10
  if args.any?
11
11
  @document_title = args.first
12
12
  else
13
- safe_join(
14
- [@document_title, PagesCore.config(:site_name)].compact.uniq,
15
- " - "
16
- )
13
+ safe_join([@document_title, PagesCore.config(:site_name)].compact.uniq,
14
+ " - ")
17
15
  end
18
16
  end
19
- alias page_title document_title
20
17
 
21
18
  # Returns true if document title has been set.
22
19
  def document_title?
@@ -30,28 +27,19 @@ module PagesCore
30
27
  # feed_tags include_hidden: true
31
28
  #
32
29
  def feed_tags(options = {})
33
- feeds = Page.enabled_feeds(@locale, options)
30
+ feeds = Page.enabled_feeds(content_locale, options)
34
31
  return unless feeds.any?
35
32
 
36
33
  feed_tags = [
37
34
  rss_link_tag(PagesCore.config(:site_name),
38
- pages_url(@locale, format: :rss))
35
+ pages_url(content_locale, format: :rss))
39
36
  ] + feeds.map do |page|
40
37
  rss_link_tag("#{PagesCore.config(:site_name)}: #{page.name}",
41
- page_url(@locale, page, format: :rss))
38
+ page_url(content_locale, page, format: :rss))
42
39
  end
43
40
  safe_join(feed_tags, "\n")
44
41
  end
45
42
 
46
- # Outputs Google Analytics tracking code.
47
- #
48
- # google_analytics_tags "UA-12345678-1"
49
- #
50
- def google_analytics_tags(account_id)
51
- render(partial: "pages_core/google_analytics",
52
- locals: { account_id: account_id })
53
- end
54
-
55
43
  # Outputs a HTML5 doctype and head tags, with document title
56
44
  # and relevant meta tags. Takes a block which will be placed
57
45
  # inside <head>.
@@ -66,14 +54,7 @@ module PagesCore
66
54
  # The block output must be captured first
67
55
  block_output = block_given? ? capture(&block) : nil
68
56
 
69
- safe_join(
70
- [
71
- "<!doctype html>\n<html lang=\"#{I18n.locale}\">".html_safe,
72
- tag.head do
73
- safe_join(head_tag_contents(block_output), "\n")
74
- end
75
- ]
76
- )
57
+ tag.head { safe_join(head_tag_contents(block_output), "\n") }
77
58
  end
78
59
 
79
60
  # Generates a link to an RSS feed.
@@ -87,30 +68,18 @@ module PagesCore
87
68
  href: href)
88
69
  end
89
70
 
90
- # Outputs Typekit tags.
91
- #
92
- # typekit_tags "aadgrag"
93
- #
94
- def typekit_tags(kit_id)
95
- safe_join([
96
- javascript_include_tag("http://use.typekit.com/#{kit_id}.js"),
97
- javascript_tag("try{Typekit.load();}catch(e){}")
98
- ], "\n")
99
- end
100
-
101
71
  private
102
72
 
103
73
  def head_tag_contents(block_output)
104
- [
105
- tag.meta(charset: "utf-8"),
106
- tag.meta("http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
107
- tag.title(document_title),
108
- meta_description_tag, meta_keywords_tag,
109
- (tag.link(rel: "image_src", href: meta_image) if meta_image?),
110
- open_graph_tags,
111
- csrf_meta_tags,
112
- block_output
113
- ]
74
+ [tag.meta(charset: "utf-8"),
75
+ tag.meta("http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
76
+ tag.title(document_title),
77
+ meta_description_tag,
78
+ meta_keywords_tag,
79
+ (tag.link(rel: "image_src", href: meta_image) if meta_image?),
80
+ open_graph_tags,
81
+ csrf_meta_tags,
82
+ block_output]
114
83
  end
115
84
 
116
85
  def meta_description_tag
@@ -5,10 +5,8 @@ module PagesCore
5
5
  include DynamicImage::Helper
6
6
 
7
7
  def dynamic_image_tag(record_or_array, options = {})
8
- super(
9
- record_or_array,
10
- extract_alt_text(record_or_array).merge(options)
11
- )
8
+ super(record_or_array,
9
+ extract_alt_text(record_or_array).merge(options))
12
10
  end
13
11
 
14
12
  def image_caption(image, caption: nil)
@@ -32,25 +30,51 @@ module PagesCore
32
30
  def image_figure(image, opts = {})
33
31
  class_name = ["image", image_class_name(image), opts[:class_name]].compact
34
32
  image_tag = image_figure_image_tag(image,
35
- size: opts[:size], ratio:
36
- opts[:ratio])
33
+ size: opts[:size],
34
+ ratio: opts[:ratio])
37
35
  content = opts[:link] ? image_link_to(image_tag, opts[:link]) : image_tag
38
36
  tag.figure(content + image_caption(image, caption: opts[:caption]),
39
37
  class: class_name)
40
38
  end
41
39
 
40
+ # Renders an image figure tag with caption.
41
+ #
42
+ # ==== Options
43
+ # * <tt>:caption</tt>: Override caption with a string, or set to false to
44
+ # disable captions.
45
+ # * <tt>:class_name</tt>: Class name to add to figure tag.
46
+ # * <tt>:link</tt>: Link target for image.
47
+ # * <tt>:ratio</tt>: Ratio to constrain image by.
48
+ # * <tt>:sizes</tt>: Sizes attribute for image tag, default: "100vw".
49
+ def picture(image, opts = {})
50
+ class_name = ["image", image_class_name(image), opts[:class_name]].compact
51
+ pict = picture_tag(image, ratio: opts[:ratio], sizes: opts[:sizes])
52
+ content = opts[:link] ? image_link_to(pict, opts[:link]) : pict
53
+ tag.figure(content + image_caption(image, caption: opts[:caption]),
54
+ class: class_name)
55
+ end
56
+
57
+ def picture_tag(image, ratio: nil, sizes: "100vw")
58
+ tag.picture do
59
+ safe_join(
60
+ [webp_source(image, ratio: ratio, sizes: sizes || "100vw"),
61
+ dynamic_image_tag(image,
62
+ size: image_size(1050, ratio),
63
+ crop: (ratio ? true : false),
64
+ sizes: sizes,
65
+ srcset: srcset(image, ratio: ratio))]
66
+ )
67
+ end
68
+ end
69
+
42
70
  def original_dynamic_image_tag(record_or_array, options = {})
43
- super(
44
- record_or_array,
45
- extract_alt_text(record_or_array).merge(options)
46
- )
71
+ super(record_or_array,
72
+ extract_alt_text(record_or_array).merge(options))
47
73
  end
48
74
 
49
75
  def uncropped_dynamic_image_tag(record_or_array, options = {})
50
- super(
51
- record_or_array,
52
- extract_alt_text(record_or_array).merge(options)
53
- )
76
+ super(record_or_array,
77
+ extract_alt_text(record_or_array).merge(options))
54
78
  end
55
79
 
56
80
  private
@@ -72,13 +96,10 @@ module PagesCore
72
96
  end
73
97
 
74
98
  def image_class_name(image)
75
- if image.size.x == image.size.y
76
- "square"
77
- elsif image.size.x > image.size.y
78
- "landscape"
79
- else
80
- "portrait"
81
- end
99
+ return "square" if image.size.x == image.size.y
100
+ return "landscape" if image.size.x > image.size.y
101
+
102
+ "portrait"
82
103
  end
83
104
 
84
105
  def image_figure_image_tag(image, size: nil, ratio: nil)
@@ -91,5 +112,39 @@ module PagesCore
91
112
  def image_link_to(content, href)
92
113
  tag.a(content, href: href)
93
114
  end
115
+
116
+ def image_size(width, ratio)
117
+ return "#{width}x" unless ratio
118
+
119
+ "#{width}x#{(width / ratio).round}"
120
+ end
121
+
122
+ def image_widths(image)
123
+ [233, 350, 700, 1050, 1400, 2100, 2800].select do |w|
124
+ image.size.x >= w
125
+ end
126
+ end
127
+
128
+ def srcset(image, ratio: nil, format: nil)
129
+ image_widths(image).map do |width|
130
+ options = { size: image_size(width, ratio),
131
+ crop: (ratio ? true : false) }
132
+ options[:format] = format if format
133
+
134
+ "#{dynamic_image_path(image, options)} #{width}w"
135
+ end.join(", ")
136
+ end
137
+
138
+ def webp_source(image, ratio: nil, sizes: "100vw")
139
+ return unless webp_compatible?(image)
140
+
141
+ tag.source(type: "image/webp",
142
+ srcset: srcset(image, ratio: ratio, format: :webp),
143
+ sizes: sizes)
144
+ end
145
+
146
+ def webp_compatible?(image)
147
+ image.content_type != "image/gif"
148
+ end
94
149
  end
95
150
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module LocalesHelper
5
+ def content_locale
6
+ params[:locale] || I18n.default_locale.to_s
7
+ end
8
+ end
9
+ end
@@ -11,7 +11,7 @@ module PagesCore
11
11
  properties = default_open_graph_properties.merge(open_graph_properties)
12
12
  safe_join(
13
13
  properties
14
- .delete_if { |_, content| content.nil? }
14
+ .compact
15
15
  .map do |name, content|
16
16
  tag.meta(property: "og:#{name}", content: content)
17
17
  end,
@@ -38,14 +38,12 @@ module PagesCore
38
38
  end
39
39
 
40
40
  def default_open_graph_properties
41
- {
42
- type: "website",
41
+ { type: "website",
43
42
  site_name: PagesCore.config(:site_name),
44
43
  title: default_open_graph_title,
45
44
  image: (meta_image if meta_image?),
46
45
  description: default_open_graph_description,
47
- url: request.url
48
- }
46
+ url: request.url }
49
47
  end
50
48
  end
51
49
  end
@@ -54,7 +54,7 @@ module PagesCore
54
54
  ActiveSupport::Deprecation.warn(
55
55
  "Calling page_url without locale is deprecated"
56
56
  )
57
- [(opts[:locale] || @locale), page_or_locale]
57
+ [(opts[:locale] || content_locale), page_or_locale]
58
58
  end
59
59
 
60
60
  def paginated_section(opts)