pageflow 16.0.0 → 16.1.0

Sign up to get free protection for your applications and to get access to all the features.
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(