pageflow 16.0.0 → 16.1.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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +210 -33
  3. data/README.md +0 -1
  4. data/Rakefile +1 -1
  5. data/admins/pageflow/entry.rb +0 -1
  6. data/admins/pageflow/sites.rb +3 -0
  7. data/app/assets/javascripts/pageflow/dist/ui.js +298 -72
  8. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +10 -0
  9. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +6 -1
  10. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -0
  11. data/app/assets/stylesheets/pageflow/editor/help.scss +3 -3
  12. data/app/assets/stylesheets/pageflow/editor/info_box.scss +7 -0
  13. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +0 -5
  14. data/app/assets/stylesheets/pageflow/ui/forms.scss +1 -1
  15. data/app/controllers/pageflow/chapters_controller.rb +2 -2
  16. data/app/controllers/pageflow/editor/files_controller.rb +1 -1
  17. data/app/controllers/pageflow/entries_controller.rb +10 -0
  18. data/app/controllers/pageflow/feeds_controller.rb +18 -0
  19. data/app/controllers/pageflow/pages_controller.rb +2 -2
  20. data/app/controllers/pageflow/sitemaps_controller.rb +15 -0
  21. data/app/controllers/pageflow/storylines_controller.rb +2 -2
  22. data/app/helpers/pageflow/entries_helper.rb +2 -1
  23. data/app/helpers/pageflow/feeds_helper.rb +66 -0
  24. data/app/helpers/pageflow/page_types_helper.rb +9 -9
  25. data/app/inputs/pageflow_permalink_input.rb +15 -3
  26. data/app/models/concerns/pageflow/reusable_file.rb +3 -3
  27. data/app/models/pageflow/account.rb +8 -0
  28. data/app/models/pageflow/audio_file_url_templates.rb +2 -1
  29. data/app/models/pageflow/draft_entry.rb +1 -1
  30. data/app/models/pageflow/entries_feed.rb +32 -0
  31. data/app/models/pageflow/image_file.rb +14 -3
  32. data/app/models/pageflow/membership.rb +3 -2
  33. data/app/models/pageflow/other_file.rb +5 -0
  34. data/app/models/pageflow/other_file_url_templates.rb +16 -0
  35. data/app/models/pageflow/published_entry.rb +6 -0
  36. data/app/models/pageflow/revision.rb +4 -0
  37. data/app/models/pageflow/site.rb +8 -0
  38. data/app/models/pageflow/sitemaps.rb +13 -0
  39. data/app/models/pageflow/used_file.rb +2 -2
  40. data/app/models/pageflow/video_file_url_templates.rb +3 -1
  41. data/app/models/pageflow/widget.rb +9 -1
  42. data/app/views/admin/entries/_permalink_inputs.html.erb +1 -2
  43. data/app/views/admin/sites/_attributes_table.html.arb +3 -0
  44. data/app/views/admin/sites/_fields.html.erb +6 -0
  45. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +8 -2
  46. data/app/views/components/pageflow/admin/sites_tab.rb +3 -0
  47. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -0
  48. data/app/views/pageflow/feeds/index.atom.builder +20 -0
  49. data/app/views/pageflow/sitemaps/index.xml.builder +9 -0
  50. data/config/initializers/features.rb +1 -0
  51. data/config/initializers/paperclip.rb +4 -0
  52. data/config/locales/de.yml +27 -6
  53. data/config/locales/en.yml +30 -4
  54. data/config/routes.rb +3 -0
  55. data/config/spring.rb +1 -1
  56. data/db/migrate/20230120092923_create_other_files.rb +23 -0
  57. data/db/migrate/20230323115745_add_feeds_enabled_to_sites.rb +5 -0
  58. data/db/migrate/20230323154323_add_sitemap_enabled_to_sites.rb +5 -0
  59. data/db/migrate/20230331103823_add_title_to_sites.rb +5 -0
  60. data/db/migrate/20230405103612_add_custom_feed_url_to_sites.rb +5 -0
  61. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +445 -109
  62. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +26 -3
  63. data/entry_types/paged/app/controllers/pageflow_paged/editor/entries_controller.rb +0 -2
  64. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  65. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  66. data/entry_types/paged/config/initializers/features.rb +0 -1
  67. data/entry_types/paged/lib/pageflow_paged/engine.rb +17 -1
  68. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  69. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +3 -4
  70. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +13 -6
  71. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -0
  72. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +11 -0
  73. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +42 -0
  74. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +3 -0
  75. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +31 -10
  76. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +9 -1
  77. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +3 -1
  78. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +23 -0
  79. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +6 -1
  80. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -5
  81. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +10 -0
  82. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +44 -41
  83. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_consent_vendors.json.jbuilder +16 -0
  84. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +3 -0
  85. data/entry_types/scrolled/config/initializers/features.rb +5 -0
  86. data/entry_types/scrolled/config/locales/consent_widget.de.yml +4 -0
  87. data/entry_types/scrolled/config/locales/consent_widget.en.yml +4 -0
  88. data/entry_types/scrolled/config/locales/de.yml +189 -8
  89. data/entry_types/scrolled/config/locales/en.yml +207 -2
  90. data/entry_types/scrolled/config/routes.rb +4 -0
  91. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +97 -5
  92. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  93. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +96 -0
  94. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +38 -0
  95. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +17 -1
  96. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -0
  97. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +6 -1
  98. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +1 -2
  99. data/entry_types/scrolled/package/contentElements-editor.js +307 -22
  100. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  101. data/entry_types/scrolled/package/contentElements-frontend.js +690 -71
  102. data/entry_types/scrolled/package/editor.js +616 -220
  103. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-14c7b097.js → EditableInlineText.module-fa9e3aff.js} +1669 -1674
  104. data/entry_types/scrolled/package/frontend/PhonePlatformContext-10a1d600.js +32 -0
  105. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-727cce0d.js +107 -0
  106. data/entry_types/scrolled/package/frontend/Viewer-169e14ca.js +154 -0
  107. data/entry_types/scrolled/package/frontend/{Viewer-b6becc57.js → Viewer-ee1aa590.js} +32 -161
  108. data/entry_types/scrolled/package/frontend/arrowRight-92a34ccc.js +77 -0
  109. data/entry_types/scrolled/package/frontend/{components-b3160dd7.js → components-4a09bfa3.js} +185 -45
  110. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-f6093cc6.js → i18n-ddd92820.js} +149 -107
  111. data/entry_types/scrolled/package/frontend/index-02378634.js +118 -0
  112. data/entry_types/scrolled/package/frontend/index.css +1 -1
  113. data/entry_types/scrolled/package/frontend/index.js +206 -54
  114. data/entry_types/scrolled/package/frontend/useContentElementEditorState-63045393.js +52 -0
  115. data/entry_types/scrolled/package/package.json +2 -1
  116. data/entry_types/scrolled/package/testHelpers.js +9 -2
  117. data/entry_types/scrolled/package/values/colors.module.css +15 -0
  118. data/entry_types/scrolled/package/widgets/consentBar.css +1 -0
  119. data/entry_types/scrolled/package/widgets/consentBar.js +426 -0
  120. data/entry_types/scrolled/package/widgets/defaultNavigation.css +1 -1
  121. data/lib/generators/pageflow/resque/resque_generator.rb +1 -1
  122. data/lib/pageflow/ability_mixin.rb +5 -5
  123. data/lib/pageflow/active_admin_can_can_fix.rb +2 -2
  124. data/lib/pageflow/built_in_file_type.rb +7 -0
  125. data/lib/pageflow/configuration.rb +21 -0
  126. data/lib/pageflow/engine.rb +60 -39
  127. data/lib/pageflow/entry_export_import/revision_serialization.rb +1 -1
  128. data/lib/pageflow/file_type.rb +2 -2
  129. data/lib/pageflow/global_config_api.rb +2 -2
  130. data/lib/pageflow/nested_revision_component.rb +23 -5
  131. data/lib/pageflow/rails_version.rb +19 -0
  132. data/lib/pageflow/seeds.rb +10 -7
  133. data/lib/pageflow/version.rb +1 -1
  134. data/lib/pageflow/widget_types.rb +4 -0
  135. data/package/config/webpack5.js +14 -0
  136. data/package/editor.js +141 -30
  137. data/package/frontend.js +26 -2
  138. data/package/testHelpers.js +1 -1
  139. data/package/ui.js +296 -71
  140. data/spec/factories/entries.rb +17 -3
  141. data/spec/factories/sites.rb +3 -0
  142. data/vendor/assets/javascripts/iscroll.js +4 -7
  143. metadata +65 -49
  144. data/app/helpers/pageflow/admin/permalinks_helper.rb +0 -15
  145. data/entry_types/scrolled/package/frontend/arrowRight-78a7cee4.js +0 -42
@@ -11,6 +11,10 @@ PageflowScrolled::Engine.routes.draw do
11
11
  put :order
12
12
  end
13
13
 
14
+ member do
15
+ post :duplicate
16
+ end
17
+
14
18
  resources :content_elements do
15
19
  collection do
16
20
  put :batch
@@ -30,10 +30,71 @@ module PageflowScrolled
30
30
  end
31
31
 
32
32
  def install_packages
33
- run 'yarn add postcss-url@^8.0.0 @fontsource/source-sans-pro'
33
+ if defined?(Shakapacker)
34
+ run 'yarn add css-loader style-loader' \
35
+ ' mini-css-extract-plugin css-minimizer-webpack-plugin' \
36
+ ' postcss postcss-preset-env postcss-loader' \
37
+ ' postcss-import postcss-url postcss-flexbugs-fixes' \
38
+ ' @fontsource/source-sans-pro'
39
+ else
40
+ run 'yarn add postcss-url@^8.0.0 @fontsource/source-sans-pro'
41
+ end
42
+ end
43
+
44
+ def webpack_config
45
+ return unless defined?(Shakapacker)
46
+
47
+ gsub_file(
48
+ 'config/webpack/webpack.config.js',
49
+ "const { generateWebpackConfig } = require('shakapacker')",
50
+ "const { generateWebpackConfig, merge, mergeWithRules } = require('shakapacker')"
51
+ )
52
+
53
+ gsub_file(
54
+ 'config/webpack/webpack.config.js',
55
+ 'const webpackConfig = generateWebpackConfig()',
56
+ <<~JS
57
+ const webpackConfig = merge(
58
+ generateWebpackConfig({
59
+ resolve: {
60
+ extensions: ['.css']
61
+ }
62
+ }),
63
+ require('pageflow/config/webpack5'),
64
+ require('pageflow-scrolled/config/webpack')
65
+ )
66
+ JS
67
+ )
68
+
69
+ gsub_file(
70
+ 'config/webpack/webpack.config.js',
71
+ 'module.exports = webpackConfig',
72
+ <<~JS
73
+ // Extend file rule to include mp3 extension
74
+ module.exports = mergeWithRules({
75
+ module: {
76
+ rules: {
77
+ test: 'replace',
78
+ type: 'match'
79
+ },
80
+ },
81
+ })(webpackConfig, {
82
+ module: {
83
+ rules: [
84
+ {
85
+ test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg|mp3)$/,
86
+ type: 'asset/resource'
87
+ }
88
+ ]
89
+ }
90
+ })
91
+ JS
92
+ )
34
93
  end
35
94
 
36
95
  def webpack_environment
96
+ return if defined?(Shakapacker)
97
+
37
98
  inject_into_file('config/webpack/environment.js',
38
99
  before: "module.exports = environment\n") do
39
100
  "environment.config.merge(require('pageflow/config/webpack'))\n" \
@@ -53,6 +114,8 @@ module PageflowScrolled
53
114
  end
54
115
 
55
116
  def webpacker_yml
117
+ return if defined?(Shakapacker)
118
+
56
119
  gsub_file('config/webpacker.yml',
57
120
  'extract_css: false',
58
121
  'extract_css: true')
@@ -64,10 +127,29 @@ module PageflowScrolled
64
127
  end
65
128
 
66
129
  def postcss_config
67
- inject_into_file('postcss.config.js',
68
- after: "require('postcss-import'),\n") do
69
- " // Make relative urls in fontsource packages work\n" \
70
- " require('postcss-url')({url: 'rebase'}),\n"
130
+ if defined?(Shakapacker)
131
+ create_file 'postcss.config.js', <<~JS
132
+ module.exports = {
133
+ plugins: [
134
+ require('postcss-import'),
135
+ // Make relative urls in fontsource packages work
136
+ require('postcss-url')({url: 'rebase'}),
137
+ require('postcss-flexbugs-fixes'),
138
+ require('postcss-preset-env')({
139
+ autoprefixer: {
140
+ flexbox: 'no-2009'
141
+ },
142
+ stage: 3
143
+ })
144
+ ]
145
+ }
146
+ JS
147
+ else
148
+ inject_into_file('postcss.config.js',
149
+ after: "require('postcss-import'),\n") do
150
+ " // Make relative urls in fontsource packages work\n" \
151
+ " require('postcss-url')({url: 'rebase'}),\n"
152
+ end
71
153
  end
72
154
  end
73
155
 
@@ -96,6 +178,7 @@ module PageflowScrolled
96
178
  import 'pageflow-scrolled/frontend-server';
97
179
  import 'pageflow-scrolled/contentElements-frontend';
98
180
  import 'pageflow-scrolled/widgets/defaultNavigation';
181
+ import 'pageflow-scrolled/widgets/consentBar';
99
182
  JS
100
183
  end
101
184
 
@@ -108,6 +191,15 @@ module PageflowScrolled
108
191
  JS
109
192
  end
110
193
 
194
+ def consent_bar_widget_packs
195
+ widget_dir = 'app/javascript/packs/pageflow-scrolled/widgets'
196
+
197
+ create_file File.join(widget_dir, 'consentBar.js'), <<-JS
198
+ import 'pageflow-scrolled/widgets/consentBar';
199
+ import 'pageflow-scrolled/widgets/consentBar.css';
200
+ JS
201
+ end
202
+
111
203
  def default_font_pack
112
204
  create_file 'app/javascript/packs/fonts/sourceSansPro.css', <<-CSS
113
205
  @import "@fontsource/source-sans-pro/400.css";
@@ -32,7 +32,7 @@ module PageflowScrolled
32
32
  entry.revision,
33
33
  content_element_type_names
34
34
  ),
35
- options
35
+ **options
36
36
  )
37
37
  end
38
38
 
@@ -44,12 +44,108 @@ module PageflowScrolled
44
44
  # @since 15.7
45
45
  attr_reader :additional_frontend_seed_data
46
46
 
47
+ # Determine which vendors a content element will require consent
48
+ # for. Based on the vendor name returned here, the following
49
+ # translations will be used in consent UI components.
50
+ #
51
+ # pageflow_scrolled.consent_vendors.#{name}.name
52
+ # pageflow_scrolled.consent_vendors.#{name}.description
53
+ # pageflow_scrolled.consent_vendors.#{name}.opt_in_prompt
54
+ #
55
+ # @example
56
+ #
57
+ # config.content_element_consent_vendors.register(
58
+ # lambda |configuration:| do
59
+ # if configuration['provider'] == 'youtube'
60
+ # 'youtube'
61
+ # else
62
+ # 'vimeo'
63
+ # end
64
+ # end,
65
+ # content_element_type_name: 'videoEmbed'
66
+ # )
67
+ #
68
+ # @return [ContentElementConsentVendors]
69
+ # @since 16.1
70
+ attr_reader :content_element_consent_vendors
71
+
72
+ # Mapping from URL hosts to consent vendor names. Used for iframe
73
+ # embed opt-in.
74
+ #
75
+ # @exmaple
76
+ #
77
+ # entry_type_config.consent_vendor_host_matchers = {
78
+ # /\.some-vendor\.com$/ => 'someVendor'
79
+ # }
80
+ #
81
+ # @return [Hash<RegExp, String>]
82
+ # @since 16.1
83
+ attr_accessor :consent_vendor_host_matchers
84
+
85
+ # Migrate typography variants to palette colors. Before palette
86
+ # colors for text blocks and headings were introduced, it was
87
+ # already possible to color text by defining typography variants
88
+ # that only differ by text color. Now that color can be configured
89
+ # independently, those typography variants have become
90
+ # redundant. This option allows mapping each of those legacy
91
+ # typography variants to a palette color and a different
92
+ # typography variant that does not change color. Legacy typography
93
+ # variants are not displayed in the editor typography variant list
94
+ # box. When an element that uses a legacy typography variant is
95
+ # selected in the editor, the typography variant and palette color
96
+ # from the mapping can be shown as currently selected instead. To
97
+ # make this work, the corresponding Backbome model needs to be
98
+ # wrapped using Entry#createLegacyTypographyVariantDelegator.
99
+ #
100
+ # @example
101
+ #
102
+ # config.themes.register(
103
+ # :custom,
104
+ # typography: {
105
+ # # Replaced by default variant and palette color
106
+ # 'textBlock-paragraph-accent' => {
107
+ # color: 'var(--theme-accent-color)'
108
+ # },
109
+ # 'textBlock-paragraph-lg' => {
110
+ # font_size: '28px',
111
+ # },
112
+ # # Replaced by lg variant and palette color
113
+ # 'textBlock-paragraph-lgAccent' => {
114
+ # font_size: '28px',
115
+ # color: 'var(--theme-accent-color)'
116
+ # },
117
+ # },
118
+ # properties: {
119
+ # root: {
120
+ # accent_color: '#e10028',
121
+ # palette_color_accent: 'var(--theme-accent-color)'
122
+ # }
123
+ # }
124
+ # )
125
+ #
126
+ # config.legacy_typography_variants = {
127
+ # 'accent' => {
128
+ # palette_color: 'accent'
129
+ # },
130
+ # 'lgAccent' => {
131
+ # variant: 'lg',
132
+ # palette_color: 'accent'
133
+ # }
134
+ # }
135
+ #
136
+ # @since 16.1
137
+ attr_accessor :legacy_typography_variants
138
+
47
139
  def initialize(*)
48
140
  super
49
141
  @additional_frontend_packs = AdditionalPacks.new
50
142
  @additional_editor_packs = AdditionalPacks.new
51
143
 
52
144
  @additional_frontend_seed_data = AdditionalSeedData.new
145
+ @content_element_consent_vendors = ContentElementConsentVendors.new
146
+ @consent_vendor_host_matchers = {}
147
+
148
+ @legacy_typography_variants = {}
53
149
  end
54
150
  end
55
151
  end
@@ -0,0 +1,38 @@
1
+ module PageflowScrolled
2
+ # Register consent vendors based on content element configuration
3
+ # data.
4
+ class ContentElementConsentVendors
5
+ # @api private
6
+ def initialize
7
+ @callables = {}
8
+ end
9
+
10
+ # Register callable to determine consent vendor from configuration
11
+ # attributes for a content element type.
12
+ #
13
+ # @param callable [#call]
14
+ # Receives configuration keyword argument and returns
15
+ # @param content_element_type_name [String]
16
+ def register(callable, content_element_type_name:)
17
+ @callables[content_element_type_name] = callable
18
+ end
19
+
20
+ # @api private
21
+ def by_content_element_id(entry)
22
+ content_elements_with_consent_vendor(entry).each_with_object({}) { |content_element, result|
23
+ next unless @callables[content_element.type_name]
24
+
25
+ result[content_element.id] = @callables[content_element.type_name].call(
26
+ entry: entry,
27
+ configuration: content_element.configuration
28
+ )
29
+ }.compact
30
+ end
31
+
32
+ private
33
+
34
+ def content_elements_with_consent_vendor(entry)
35
+ ContentElement.all_for_revision(entry.revision).where(type_name: @callables.keys)
36
+ end
37
+ end
38
+ end
@@ -1,11 +1,27 @@
1
1
  require 'rails'
2
+ require 'pageflow/rails_version'
2
3
 
3
4
  module PageflowScrolled
4
5
  # Rails integration
5
6
  class Engine < ::Rails::Engine
6
7
  isolate_namespace PageflowScrolled
7
8
 
8
- config.paths.add('lib', eager_load: true)
9
+ if Pageflow::RailsVersion.experimental?
10
+ lib = root.join('lib')
11
+
12
+ config.autoload_paths << lib
13
+ config.eager_load_paths << lib
14
+
15
+ initializer 'pageflow_scrolled.autoloading' do
16
+ Rails.autoloaders.main.ignore(
17
+ lib.join('generators'),
18
+ lib.join('tasks')
19
+ )
20
+ end
21
+ else
22
+ config.paths.add('lib', eager_load: true)
23
+ end
24
+
9
25
  config.i18n.load_path += Dir[config.root.join('config', 'locales', '**', '*.yml').to_s]
10
26
 
11
27
  initializer 'pageflow_scrolled.assets.precompile' do |app|
@@ -10,25 +10,49 @@ module PageflowScrolled
10
10
  c.file_types.register(Pageflow::BuiltInFileType.image)
11
11
  c.file_types.register(Pageflow::BuiltInFileType.video)
12
12
  c.file_types.register(Pageflow::BuiltInFileType.audio)
13
+ c.file_types.register(Pageflow::BuiltInFileType.other)
13
14
 
14
15
  c.revision_components.register(Storyline)
15
16
 
16
17
  c.widget_types.register(ReactWidgetType.new(name: 'defaultNavigation',
17
18
  role: 'header'),
18
19
  default: true)
20
+ c.widget_types.register(ReactWidgetType.new(name: 'consentBar',
21
+ role: 'consent'),
22
+ default: true)
19
23
 
20
24
  c.features.register('datawrapper_chart_embed_opt_in')
21
25
  c.features.enable_by_default('datawrapper_chart_embed_opt_in')
22
26
  c.features.register('iframe_embed_content_element')
27
+ c.features.register('image_gallery_content_element')
23
28
  c.features.register('frontend_v2')
29
+ c.features.register('scrolled_entry_fragment_caching')
24
30
 
25
31
  c.additional_frontend_seed_data.register(
26
32
  'frontendVersion',
27
33
  FRONTEND_VERSION_SEED_DATA
28
34
  )
35
+
36
+ c.content_element_consent_vendors.register(
37
+ IFRAME_EMBED_CONSENT_VENDOR,
38
+ content_element_type_name: 'iframeEmbed'
39
+ )
29
40
  end
30
41
  end
31
42
 
43
+ IFRAME_EMBED_CONSENT_VENDOR = lambda do |configuration:, entry:, **|
44
+ return unless configuration['requireConsent']
45
+
46
+ uri = URI.parse(configuration['source'])
47
+ host_matchers = Pageflow.config_for(entry).consent_vendor_host_matchers
48
+
49
+ host_matchers.detect do |matcher, _|
50
+ uri.host =~ matcher
51
+ end&.last
52
+ rescue URI::InvalidURIError
53
+ nil
54
+ end
55
+
32
56
  FRONTEND_VERSION_SEED_DATA = lambda do |request:, entry:, **|
33
57
  if request.params[:frontend] == 'v2' || entry.feature_state('frontend_v2')
34
58
  2
@@ -8,9 +8,10 @@ module PageflowScrolled
8
8
  #
9
9
  # @since 15.7
10
10
  class ReactWidgetType < Pageflow::WidgetType
11
- def initialize(role:, name:)
11
+ def initialize(role:, name:, enabled_in_editor: true)
12
12
  @role = role
13
13
  @name = name
14
+ @enabled_in_editor = enabled_in_editor
14
15
  end
15
16
 
16
17
  attr_reader :name
@@ -23,6 +24,10 @@ module PageflowScrolled
23
24
  [@role]
24
25
  end
25
26
 
27
+ def enabled_in_editor?
28
+ @enabled_in_editor
29
+ end
30
+
26
31
  def render(*)
27
32
  ''
28
33
  end
@@ -33,8 +33,7 @@ namespace :pageflow_scrolled do
33
33
 
34
34
  account = seeds.account(name: 'storybook-seed') do |account_in_progress|
35
35
  account_in_progress.features_configuration =
36
- account_in_progress.features_configuration.merge('scrolled_entry_type' => true,
37
- 'frontend_v2' => true)
36
+ account_in_progress.features_configuration.merge('scrolled_entry_type' => true)
38
37
  end
39
38
 
40
39
  seeds.sample_scrolled_entry(