pageflow 15.8.0 → 16.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +183 -103
  3. data/README.md +0 -1
  4. data/Rakefile +1 -1
  5. data/admins/pageflow/accounts.rb +12 -16
  6. data/admins/pageflow/entry.rb +28 -26
  7. data/admins/pageflow/entry_templates.rb +5 -7
  8. data/admins/pageflow/sites.rb +53 -0
  9. data/app/assets/javascripts/pageflow/admin/entries.js +16 -7
  10. data/app/assets/javascripts/pageflow/dist/ui.js +298 -72
  11. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +10 -0
  12. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +6 -1
  13. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -0
  14. data/app/assets/stylesheets/pageflow/editor/help.scss +3 -3
  15. data/app/assets/stylesheets/pageflow/editor/info_box.scss +7 -0
  16. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +0 -5
  17. data/app/assets/stylesheets/pageflow/ui/forms.scss +1 -1
  18. data/app/controllers/pageflow/chapters_controller.rb +2 -2
  19. data/app/controllers/pageflow/editor/files_controller.rb +1 -1
  20. data/app/controllers/pageflow/entries_controller.rb +12 -2
  21. data/app/controllers/pageflow/feeds_controller.rb +18 -0
  22. data/app/controllers/pageflow/pages_controller.rb +2 -2
  23. data/app/controllers/pageflow/sitemaps_controller.rb +15 -0
  24. data/app/controllers/pageflow/storylines_controller.rb +2 -2
  25. data/app/helpers/pageflow/common_entry_seed_helper.rb +1 -1
  26. data/app/helpers/pageflow/embed_code_helper.rb +1 -1
  27. data/app/helpers/pageflow/entries_helper.rb +16 -15
  28. data/app/helpers/pageflow/feeds_helper.rb +66 -0
  29. data/app/helpers/pageflow/page_types_helper.rb +9 -9
  30. data/app/helpers/pageflow/sites_helper.rb +11 -0
  31. data/app/helpers/pageflow/social_share_helper.rb +2 -2
  32. data/app/inputs/pageflow_permalink_input.rb +15 -3
  33. data/app/models/concerns/pageflow/reusable_file.rb +3 -3
  34. data/app/models/pageflow/account.rb +13 -31
  35. data/app/models/pageflow/audio_file_url_templates.rb +2 -1
  36. data/app/models/pageflow/{cname_theming_request_scope.rb → cname_site_request_scope.rb} +3 -3
  37. data/app/models/pageflow/customized_theme.rb +1 -1
  38. data/app/models/pageflow/draft_entry.rb +1 -1
  39. data/app/models/pageflow/entries_feed.rb +32 -0
  40. data/app/models/pageflow/entry.rb +3 -4
  41. data/app/models/pageflow/entry_at_revision.rb +2 -2
  42. data/app/models/pageflow/entry_duplicate.rb +1 -1
  43. data/app/models/pageflow/entry_template.rb +4 -4
  44. data/app/models/pageflow/home_button.rb +7 -7
  45. data/app/models/pageflow/image_file.rb +14 -3
  46. data/app/models/pageflow/membership.rb +3 -2
  47. data/app/models/pageflow/other_file.rb +5 -0
  48. data/app/models/pageflow/other_file_url_templates.rb +16 -0
  49. data/app/models/pageflow/permalink.rb +3 -3
  50. data/app/models/pageflow/permalink_directory.rb +2 -2
  51. data/app/models/pageflow/published_entry.rb +8 -2
  52. data/app/models/pageflow/revision.rb +4 -0
  53. data/app/models/pageflow/site.rb +67 -0
  54. data/app/models/pageflow/sitemaps.rb +13 -0
  55. data/app/models/pageflow/theme_customization.rb +1 -1
  56. data/app/models/pageflow/used_file.rb +2 -2
  57. data/app/models/pageflow/video_file_url_templates.rb +3 -1
  58. data/app/models/pageflow/widget.rb +9 -1
  59. data/app/policies/pageflow/account_policy.rb +2 -2
  60. data/app/policies/pageflow/entry_policy.rb +2 -2
  61. data/app/policies/pageflow/entry_template_policy.rb +1 -1
  62. data/app/policies/pageflow/{theming_policy.rb → site_policy.rb} +13 -11
  63. data/app/views/admin/accounts/_entry_template_details.html.arb +1 -1
  64. data/app/views/admin/accounts/_form.html.erb +4 -22
  65. data/app/views/admin/accounts/_site_defaults_inline_help.html.erb +5 -0
  66. data/app/views/admin/entries/_form.html.erb +4 -13
  67. data/app/views/admin/entries/_permalink_inputs.html.erb +2 -3
  68. data/app/views/admin/entries/_site_input.html.erb +15 -0
  69. data/app/views/admin/entries/{entry_type_name_input.html.erb → entry_site_and_type_name_input.html.erb} +3 -0
  70. data/app/views/admin/entry_templates/_form.html.erb +5 -5
  71. data/app/views/admin/sites/_attributes_table.html.arb +12 -0
  72. data/app/views/admin/sites/_fields.html.erb +23 -0
  73. data/app/views/admin/sites/_form.html.erb +5 -0
  74. data/app/views/components/pageflow/admin/entries_tab.rb +1 -2
  75. data/app/views/components/pageflow/admin/entry_templates_tab.rb +10 -11
  76. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +8 -2
  77. data/app/views/components/pageflow/admin/features_tab.rb +1 -1
  78. data/app/views/components/pageflow/admin/sites_tab.rb +35 -0
  79. data/app/views/components/pageflow/admin/users_tab.rb +1 -2
  80. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -0
  81. data/app/views/pageflow/editor/entries/seed.json.erb +1 -1
  82. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  83. data/app/views/pageflow/entries/stylesheet.css.erb +1 -1
  84. data/app/views/pageflow/feeds/index.atom.builder +20 -0
  85. data/app/views/pageflow/sitemaps/index.xml.builder +9 -0
  86. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  87. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  88. data/config/initializers/admin_resource_tabs.rb +29 -12
  89. data/config/initializers/features.rb +1 -0
  90. data/config/initializers/paperclip.rb +4 -0
  91. data/config/locales/de.yml +42 -19
  92. data/config/locales/en.yml +45 -17
  93. data/config/routes.rb +3 -0
  94. data/config/spring.rb +1 -1
  95. data/db/migrate/20221215101134_rename_theming_to_site.rb +9 -0
  96. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +34 -0
  97. data/db/migrate/20221219203023_add_name_to_sites.rb +5 -0
  98. data/db/migrate/20230103155934_associate_theme_customizations_with_sites.rb +27 -0
  99. data/db/migrate/20230120092923_create_other_files.rb +23 -0
  100. data/db/migrate/20230323115745_add_feeds_enabled_to_sites.rb +5 -0
  101. data/db/migrate/20230323154323_add_sitemap_enabled_to_sites.rb +5 -0
  102. data/db/migrate/20230331103823_add_title_to_sites.rb +5 -0
  103. data/db/migrate/20230405103612_add_custom_feed_url_to_sites.rb +5 -0
  104. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +455 -119
  105. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +31 -8
  106. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +1 -1
  107. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +1 -1
  108. data/entry_types/paged/app/controllers/pageflow_paged/editor/entries_controller.rb +0 -2
  109. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  110. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  111. data/entry_types/paged/config/initializers/features.rb +0 -1
  112. data/entry_types/paged/lib/pageflow_paged/engine.rb +17 -1
  113. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  114. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +3 -4
  115. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +13 -6
  116. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -0
  117. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +11 -0
  118. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +42 -0
  119. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +3 -0
  120. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +31 -10
  121. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +9 -1
  122. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +3 -1
  123. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +23 -0
  124. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +6 -1
  125. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -5
  126. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +10 -0
  127. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +44 -41
  128. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_consent_vendors.json.jbuilder +16 -0
  129. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +8 -5
  130. data/entry_types/scrolled/config/initializers/features.rb +5 -0
  131. data/entry_types/scrolled/config/locales/consent_widget.de.yml +4 -0
  132. data/entry_types/scrolled/config/locales/consent_widget.en.yml +4 -0
  133. data/entry_types/scrolled/config/locales/de.yml +189 -8
  134. data/entry_types/scrolled/config/locales/en.yml +207 -2
  135. data/entry_types/scrolled/config/routes.rb +4 -0
  136. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +97 -5
  137. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  138. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +96 -0
  139. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +38 -0
  140. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +17 -1
  141. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -0
  142. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +6 -1
  143. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +1 -1
  144. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +1 -2
  145. data/entry_types/scrolled/package/contentElements-editor.js +307 -22
  146. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  147. data/entry_types/scrolled/package/contentElements-frontend.js +690 -71
  148. data/entry_types/scrolled/package/editor.js +616 -220
  149. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-c6672f27.js → EditableInlineText.module-fa9e3aff.js} +1669 -1674
  150. data/entry_types/scrolled/package/frontend/PhonePlatformContext-10a1d600.js +32 -0
  151. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-727cce0d.js +107 -0
  152. data/entry_types/scrolled/package/frontend/Viewer-169e14ca.js +154 -0
  153. data/entry_types/scrolled/package/frontend/{Viewer-6b05522f.js → Viewer-ee1aa590.js} +32 -161
  154. data/entry_types/scrolled/package/frontend/arrowRight-92a34ccc.js +77 -0
  155. data/entry_types/scrolled/package/frontend/{components-487daafa.js → components-4a09bfa3.js} +185 -45
  156. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-22e65f92.js → i18n-ddd92820.js} +162 -292
  157. data/entry_types/scrolled/package/frontend/index-02378634.js +118 -0
  158. data/entry_types/scrolled/package/frontend/index.css +1 -1
  159. data/entry_types/scrolled/package/frontend/index.js +375 -40
  160. data/entry_types/scrolled/package/frontend/useContentElementEditorState-63045393.js +52 -0
  161. data/entry_types/scrolled/package/package.json +2 -1
  162. data/entry_types/scrolled/package/testHelpers.js +9 -2
  163. data/entry_types/scrolled/package/values/colors.module.css +15 -0
  164. data/entry_types/scrolled/package/widgets/consentBar.css +1 -0
  165. data/entry_types/scrolled/package/widgets/consentBar.js +426 -0
  166. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  167. data/entry_types/scrolled/package/widgets/defaultNavigation.js +16 -9
  168. data/lib/generators/pageflow/resque/resque_generator.rb +1 -1
  169. data/lib/pageflow/ability_mixin.rb +21 -13
  170. data/lib/pageflow/active_admin_can_can_fix.rb +2 -2
  171. data/lib/pageflow/admin/attributes_table_rows.rb +1 -1
  172. data/lib/pageflow/admin/form_inputs.rb +1 -1
  173. data/lib/pageflow/admin/tabs.rb +1 -1
  174. data/lib/pageflow/built_in_file_type.rb +7 -0
  175. data/lib/pageflow/configuration/permissions.rb +3 -3
  176. data/lib/pageflow/configuration.rb +38 -17
  177. data/lib/pageflow/engine.rb +60 -39
  178. data/lib/pageflow/entry_export_import/entry_serialization.rb +1 -1
  179. data/lib/pageflow/entry_export_import/revision_serialization.rb +1 -1
  180. data/lib/pageflow/file_type.rb +2 -2
  181. data/lib/pageflow/global_config_api.rb +2 -2
  182. data/lib/pageflow/nested_revision_component.rb +23 -5
  183. data/lib/pageflow/primary_domain_entry_redirect.rb +7 -7
  184. data/lib/pageflow/rails_version.rb +19 -0
  185. data/lib/pageflow/seeds.rb +20 -17
  186. data/lib/pageflow/theme_customizations.rb +10 -10
  187. data/lib/pageflow/version.rb +1 -1
  188. data/lib/pageflow/widget_types.rb +4 -0
  189. data/package/config/webpack5.js +14 -0
  190. data/package/editor.js +148 -37
  191. data/package/frontend.js +26 -2
  192. data/package/testHelpers.js +1 -1
  193. data/package/ui.js +296 -71
  194. data/spec/factories/accounts.rb +5 -2
  195. data/spec/factories/draft_entries.rb +2 -2
  196. data/spec/factories/entries.rb +19 -5
  197. data/spec/factories/entry_templates.rb +1 -1
  198. data/spec/factories/permalink_directory.rb +1 -1
  199. data/spec/factories/published_entries.rb +2 -2
  200. data/spec/factories/sites.rb +12 -0
  201. data/vendor/assets/javascripts/iscroll.js +4 -7
  202. metadata +84 -59
  203. data/app/helpers/pageflow/admin/permalinks_helper.rb +0 -15
  204. data/app/helpers/pageflow/themings_helper.rb +0 -11
  205. data/app/models/pageflow/theming.rb +0 -30
  206. data/app/views/admin/accounts/_theming_defaults_inline_help.html.erb +0 -5
  207. data/app/views/admin/accounts/_theming_details.html.arb +0 -5
  208. data/app/views/pageflow/editor/themings/_theming.json.jbuilder +0 -1
  209. data/entry_types/scrolled/package/frontend/arrowRight-7e3d9dd5.js +0 -42
  210. data/spec/factories/themings.rb +0 -7
  211. /data/app/views/pageflow/entries/{_theming.css.erb → _site.css.erb} +0 -0
@@ -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
@@ -42,7 +42,7 @@ module PageflowScrolled
42
42
  :video_files,
43
43
  :audio_files,
44
44
  :text_track_files)) do |created_entry|
45
- created_entry.theming = attributes.fetch(:account).default_theming
45
+ created_entry.site = attributes.fetch(:account).default_site
46
46
 
47
47
  say_creating_scrolled_entry(created_entry)
48
48
  yield(created_entry) if block_given?
@@ -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(