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
@@ -4075,7 +4075,7 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
4075
4075
  };
4076
4076
 
4077
4077
  player.targetVolume = function () {
4078
- return settings.get('volume') * volumeFactor;
4078
+ return (options.ignoreVolumeSetting ? 1 : settings.get('volume')) * volumeFactor;
4079
4079
  };
4080
4080
 
4081
4081
  function listenToVolumeSetting() {
@@ -4446,7 +4446,21 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
4446
4446
  mediaPlayer.volumeFading = volumeFading;
4447
4447
  mediaPlayer.loadWaiting = loadWaiting;
4448
4448
  mediaPlayer.hooks = hooks;
4449
- mediaPlayer.asyncPlay = asyncPlay;
4449
+ mediaPlayer.asyncPlay = asyncPlay; // Replacement for Underscore's throttle, because scrolled entries
4450
+ // don't have Underscore anymore
4451
+
4452
+ function throttle(func, timeFrame) {
4453
+ var lastTime = 0;
4454
+ return function (options) {
4455
+ var now = new Date();
4456
+ func = func.bind(this);
4457
+
4458
+ if (now - lastTime >= timeFrame) {
4459
+ func(options);
4460
+ lastTime = now;
4461
+ }
4462
+ };
4463
+ }
4450
4464
 
4451
4465
  var mediaEvents = function mediaEvents(player, context) {
4452
4466
  function triggerMediaEvent(name) {
@@ -4466,6 +4480,9 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
4466
4480
  player.on('timeupdate', function () {
4467
4481
  triggerMediaEvent('timeupdate');
4468
4482
  });
4483
+ player.on('timeupdate', throttle(function () {
4484
+ triggerMediaEvent('timeupdate_throttled');
4485
+ }, 5000));
4469
4486
  player.on('pause', function () {
4470
4487
  triggerMediaEvent('pause');
4471
4488
  });
@@ -4984,6 +5001,9 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
4984
5001
  player.on('timeupdate', function () {
4985
5002
  triggerMediaEvent('timeupdate');
4986
5003
  });
5004
+ player.on('timeupdate', throttle(function () {
5005
+ triggerMediaEvent('timeupdate_throttled');
5006
+ }, 5000));
4987
5007
  player.on('pause', function () {
4988
5008
  triggerMediaEvent('pause');
4989
5009
  });
@@ -5125,11 +5145,13 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
5125
5145
  nativeCaptions: !isAudio && browser.has('iphone platform'),
5126
5146
  // Only used by pageflow-scrolled
5127
5147
  vhs: {
5128
- useBandwidthFromLocalStorage: true
5148
+ useBandwidthFromLocalStorage: true,
5149
+ usePlayerObjectFit: true
5129
5150
  }
5130
5151
  },
5131
5152
  bufferUnderrunWaiting: true,
5132
5153
  fallbackToMutedAutoplay: !isAudio,
5154
+ ignoreVolumeSetting: true,
5133
5155
  volumeFading: true,
5134
5156
  hooks: {},
5135
5157
  mediaEvents: true,
@@ -5358,6 +5380,7 @@ this.pageflow_paged.frontend = (function (exports, jqueryUi, $, Backbone, _, Vid
5358
5380
  tagName: type
5359
5381
  });
5360
5382
  mediaEl.setAttribute('src', blankSources[type].src);
5383
+ player.muted(true);
5361
5384
  this.unAllocatedPlayers[type].push(player);
5362
5385
  return player;
5363
5386
  }
@@ -6,8 +6,6 @@ module PageflowPaged
6
6
 
7
7
  skip_before_action :verify_edit_lock, only: :partials
8
8
 
9
- helper_method :render_to_string
10
-
11
9
  def partials
12
10
  I18n.locale = @entry.locale
13
11
  render action: 'partials', layout: false
@@ -4,6 +4,7 @@ module PageflowPaged
4
4
  include Pageflow::EntriesControllerEnvHelper
5
5
  include WithoutControllerNamespacePartialPathPrefix
6
6
 
7
+ helper Pageflow::FeedsHelper
7
8
  helper Pageflow::MetaTagsHelper
8
9
  helper Pageflow::StructuredDataHelper
9
10
  helper Pageflow::PublicI18nHelper
@@ -12,6 +12,7 @@
12
12
 
13
13
  <%= tag :link, :rel => 'icon', :href => image_path("pageflow/themes/#{@entry.theme.directory_name}/favicon.ico"), :type => 'image/ico' %>
14
14
  <%= meta_tags_for_entry(@entry) %>
15
+ <%= feed_link_tags_for_entry(@entry) %>
15
16
  <% end %>
16
17
  <% end %>
17
18
 
@@ -2,7 +2,6 @@ Pageflow.configure do |config|
2
2
  config.for_entry_type(PageflowPaged.entry_type) do |entry_type_config|
3
3
  entry_type_config.features.register('highdef_background_images')
4
4
  entry_type_config.features.register('force_best_video_quality')
5
- entry_type_config.features.register('force_fullhd_video_quality')
6
5
 
7
6
  entry_type_config.features.register('auto_change_page')
8
7
  entry_type_config.features.register('delayed_text_fade_in')
@@ -1,9 +1,25 @@
1
+ require 'pageflow/rails_version'
2
+
1
3
  module PageflowPaged
2
4
  # Rails integration
3
5
  class Engine < ::Rails::Engine
4
6
  isolate_namespace PageflowPaged
5
7
 
6
- config.paths.add('lib', eager_load: true)
8
+ if Pageflow::RailsVersion.experimental?
9
+ lib = root.join('lib')
10
+
11
+ config.autoload_paths << lib
12
+ config.eager_load_paths << lib
13
+
14
+ initializer 'pageflow_paged.autoloading' do
15
+ Rails.autoloaders.main.ignore(
16
+ lib.join('tasks')
17
+ )
18
+ end
19
+ else
20
+ config.paths.add('lib', eager_load: true)
21
+ end
22
+
7
23
  config.i18n.load_path += Dir[config.root.join('config', 'locales', '**', '*.yml').to_s]
8
24
 
9
25
  initializer 'pageflow_paged.assets.precompile' do |app|
@@ -14,7 +14,7 @@ module PageflowScrolled
14
14
 
15
15
  def update
16
16
  chapter = Chapter.all_for_revision(@entry.draft).find(params[:id])
17
- chapter.update_attributes(chapter_params)
17
+ chapter.update(chapter_params)
18
18
 
19
19
  head :no_content
20
20
  rescue ActiveRecord::RecordNotFound
@@ -35,7 +35,7 @@ module PageflowScrolled
35
35
  chapters = Chapter.all_for_revision(@entry.draft)
36
36
 
37
37
  params.require(:ids).each_with_index do |id, index|
38
- chapters.update(id, storyline_id: storyline.id, position: index)
38
+ chapters.find(id).update(storyline_id: storyline.id, position: index)
39
39
  end
40
40
 
41
41
  head :no_content
@@ -27,7 +27,7 @@ module PageflowScrolled
27
27
 
28
28
  def update
29
29
  content_element = ContentElement.all_for_revision(@entry.draft).find(params[:id])
30
- content_element.update_attributes(content_element_params)
30
+ content_element.update(content_element_params)
31
31
 
32
32
  head :no_content
33
33
  rescue ActiveRecord::RecordNotFound
@@ -48,9 +48,8 @@ module PageflowScrolled
48
48
  storyline = section.chapter.storyline
49
49
 
50
50
  params.require(:ids).each_with_index do |id, index|
51
- storyline.content_elements.update(id,
52
- section_id: section.id,
53
- position: index)
51
+ storyline.content_elements.find(id).update(section_id: section.id,
52
+ position: index)
54
53
  end
55
54
 
56
55
  head :no_content
@@ -6,16 +6,24 @@ module PageflowScrolled
6
6
 
7
7
  def create
8
8
  chapter = Chapter.all_for_revision(@entry.draft).find(params[:chapter_id])
9
- section = chapter.sections.create(section_params)
9
+ section = chapter.create_section(section_params)
10
10
 
11
- render partial: 'pageflow_scrolled/sections/section',
11
+ render partial: 'pageflow_scrolled/editor/sections/section_with_content_elements',
12
12
  locals: {section: section},
13
13
  status: :created
14
14
  end
15
15
 
16
+ def duplicate
17
+ section = Section.all_for_revision(@entry.draft).find(params[:id])
18
+
19
+ render partial: 'pageflow_scrolled/editor/sections/section_with_content_elements',
20
+ locals: {section: section.chapter.duplicate_section(section)},
21
+ status: :created
22
+ end
23
+
16
24
  def update
17
25
  section = Section.all_for_revision(@entry.draft).find(params[:id])
18
- section.update_attributes(section_params)
26
+ section.update(section_params)
19
27
 
20
28
  head :no_content
21
29
  rescue ActiveRecord::RecordNotFound
@@ -36,9 +44,8 @@ module PageflowScrolled
36
44
  storyline = chapter.storyline
37
45
 
38
46
  params.require(:ids).each_with_index do |id, index|
39
- storyline.sections.update(id,
40
- chapter_id: chapter.id,
41
- position: index)
47
+ storyline.sections.find(id).update(chapter_id: chapter.id,
48
+ position: index)
42
49
  end
43
50
 
44
51
  head :no_content
@@ -4,10 +4,12 @@ module PageflowScrolled
4
4
  include Pageflow::EntriesControllerEnvHelper
5
5
 
6
6
  helper Pageflow::EntriesHelper
7
+ helper Pageflow::FeedsHelper
7
8
  helper Pageflow::WidgetsHelper
8
9
  helper Pageflow::SocialShareHelper
9
10
  helper Pageflow::MetaTagsHelper
10
11
  helper Pageflow::StructuredDataHelper
12
+ helper Pageflow::TextDirectionHelper
11
13
  helper FaviconHelper
12
14
 
13
15
  def show
@@ -0,0 +1,11 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ module CacheHelper
4
+ def cache_scrolled_entry(entry:, widget_scope:, &block)
5
+ condition =
6
+ widget_scope == :published &&
7
+ entry.feature_state('scrolled_entry_fragment_caching')
8
+ cache_if(condition, [entry, :head_and_body, widget_scope], &block)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,42 @@
1
+ module PageflowScrolled
2
+ module Editor
3
+ # Render editor seed data for scrolled entries.
4
+ #
5
+ # @api private
6
+ module EntryJsonSeedHelper
7
+ include PageflowScrolled::EntryJsonSeedHelper
8
+
9
+ def scrolled_entry_editor_json_seed(json, scrolled_entry)
10
+ json.key_format!(camelize: :lower)
11
+ entry_config = Pageflow.config_for(scrolled_entry)
12
+
13
+ scrolled_entry_editor_legacy_typography_variants_seed(json, entry_config)
14
+ scrolled_entry_editor_consent_vendor_host_matchers_seed(json, entry_config)
15
+
16
+ scrolled_entry_json_seed(json,
17
+ scrolled_entry,
18
+ skip_files: true,
19
+ skip_i18n: true,
20
+ include_unused_additional_seed_data: true)
21
+ end
22
+
23
+ private
24
+
25
+ def scrolled_entry_editor_legacy_typography_variants_seed(json, entry_config)
26
+ json.legacy_typography_variants(
27
+ entry_config
28
+ .legacy_typography_variants
29
+ .deep_transform_keys { |key| key.to_s.camelize(:lower) }
30
+ )
31
+ end
32
+
33
+ def scrolled_entry_editor_consent_vendor_host_matchers_seed(json, entry_config)
34
+ json.consent_vendor_host_matchers(
35
+ entry_config
36
+ .consent_vendor_host_matchers
37
+ .transform_keys { |regexp| regexp.inspect[1..-2] }
38
+ )
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,6 +6,8 @@ module PageflowScrolled
6
6
  include ReactServerSideRenderingHelper
7
7
  include Pageflow::WidgetsHelper
8
8
  include Pageflow::StructuredDataHelper
9
+ include Pageflow::TextDirectionHelper
10
+ include PageflowScrolled::CacheHelper
9
11
  include FaviconHelper
10
12
  include PacksHelper
11
13
  include WebpackPublicPathHelper
@@ -17,6 +19,7 @@ module PageflowScrolled
17
19
  :@widget_scope => :editor,
18
20
  :@skip_ssr => true,
19
21
  :@skip_structured_data => true,
22
+ :@skip_feed_link_tags => true,
20
23
  :@seed_options => {
21
24
  skip_collections: true,
22
25
  include_unused_additional_seed_data: true,
@@ -2,22 +2,43 @@ module PageflowScrolled
2
2
  # @api private
3
3
  module PacksHelper
4
4
  def scrolled_frontend_javascript_packs_tag(entry, options)
5
- javascript_packs_with_chunks_tag(
6
- *scrolled_frontend_packs(entry, options)
7
- )
5
+ if defined?(Shakapacker)
6
+ javascript_pack_tag(
7
+ *scrolled_frontend_packs(entry, **options),
8
+ defer: false
9
+ )
10
+ else
11
+ javascript_packs_with_chunks_tag(
12
+ *scrolled_frontend_packs(entry, **options)
13
+ )
14
+ end
8
15
  end
9
16
 
10
17
  def scrolled_frontend_stylesheet_packs_tag(entry, options)
11
- stylesheet_packs_with_chunks_tag(
12
- *scrolled_frontend_packs(entry, options),
13
- media: 'all'
14
- )
18
+ if defined?(Shakapacker)
19
+ stylesheet_pack_tag(
20
+ *scrolled_frontend_packs(entry, **options),
21
+ media: 'all'
22
+ )
23
+ else
24
+ stylesheet_packs_with_chunks_tag(
25
+ *scrolled_frontend_packs(entry, **options),
26
+ media: 'all'
27
+ )
28
+ end
15
29
  end
16
30
 
17
31
  def scrolled_editor_javascript_packs_tag(entry)
18
- javascript_packs_with_chunks_tag(
19
- *scrolled_editor_packs(entry)
20
- )
32
+ if defined?(Shakapacker)
33
+ javascript_pack_tag(
34
+ *scrolled_editor_packs(entry),
35
+ defer: false
36
+ )
37
+ else
38
+ javascript_packs_with_chunks_tag(
39
+ *scrolled_editor_packs(entry)
40
+ )
41
+ end
21
42
  end
22
43
 
23
44
  def scrolled_frontend_packs(entry, widget_scope:)
@@ -32,6 +32,9 @@ module PageflowScrolled
32
32
 
33
33
  # see https://github.com/reactjs/react-rails/issues/970#issuecomment-476338244
34
34
  class WebpackerSplitChunksManifestContainer < React::ServerRendering::WebpackerManifestContainer
35
+ CLIENT_EXEC =
36
+ %r{__webpack_exec__\("./node_modules/webpack-dev-server\/client\/index\.js[^"]*"\),}
37
+
35
38
  def find_asset(logical_path)
36
39
  asset_paths = manifest.lookup_pack_with_chunks(logical_path, type: :javascript)
37
40
 
@@ -46,7 +49,12 @@ module PageflowScrolled
46
49
  asset_path.slice!("#{ds.protocol}://#{ds.host_with_port}")
47
50
  dev_server_asset =
48
51
  URI.open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read
49
- dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
52
+
53
+ # Remove webpack-dev-server client code that tries to
54
+ # interact with browser globals:
55
+ dev_server_asset.sub!(CLIENT_REQUIRE, '//\0') # for Webpack 4
56
+ dev_server_asset.sub!(CLIENT_EXEC, '/*\0*/') # for Webpack 5
57
+
50
58
  dev_server_asset
51
59
  end
52
60
  else
@@ -6,9 +6,11 @@ module PageflowScrolled
6
6
  theme_file_role: nil,
7
7
  theme_file_style: :resized,
8
8
  relative_url: false)
9
+ prefix = defined?(Shakapacker) ? 'static' : 'media'
10
+
9
11
  path =
10
12
  theme.files.dig(theme_file_role, theme_file_style) ||
11
- asset_pack_path("media/pageflow-scrolled/themes/#{theme.name}/#{path}")
13
+ asset_pack_path("#{prefix}/pageflow-scrolled/themes/#{theme.name}/#{path}")
12
14
 
13
15
  if relative_url
14
16
  URI.parse(path).path
@@ -16,6 +16,23 @@ module PageflowScrolled
16
16
  attr_accessor :revision # used on :create to lazily create storyline
17
17
  before_validation :ensure_storyline, on: :create
18
18
 
19
+ def create_section(attributes = {})
20
+ shift_section_positions(from: attributes[:position])
21
+
22
+ section = sections.create!(attributes)
23
+ section.content_elements.create!(type_name: 'textBlock')
24
+
25
+ section
26
+ end
27
+
28
+ def duplicate_section(section)
29
+ shift_section_positions(from: section.position + 1)
30
+
31
+ section.duplicate do |new_section|
32
+ new_section.position = section.position + 1
33
+ end
34
+ end
35
+
19
36
  def self.all_for_revision(revision)
20
37
  joins(storyline: :revision)
21
38
  .where(pageflow_scrolled_storylines: {revision_id: revision})
@@ -23,6 +40,12 @@ module PageflowScrolled
23
40
 
24
41
  private
25
42
 
43
+ def shift_section_positions(from:)
44
+ sections
45
+ .where('position >= ?', from)
46
+ .update_all('position = position + 1')
47
+ end
48
+
26
49
  def ensure_storyline
27
50
  return if storyline.present?
28
51
  unless Storyline.all_for_revision(revision).exists?
@@ -1,5 +1,10 @@
1
1
  <%= stylesheet_link_tag 'pageflow_paged/editor', media: 'all' %>
2
- <%= stylesheet_packs_with_chunks_tag 'pageflow-scrolled-frontend' %>
2
+
3
+ <% if defined?(Shakapacker) %>
4
+ <%= stylesheet_pack_tag 'pageflow-scrolled-frontend' %>
5
+ <% else %>
6
+ <%= stylesheet_packs_with_chunks_tag 'pageflow-scrolled-frontend' %>
7
+ <% end %>
3
8
 
4
9
  <%= scrolled_theme_properties_style_tag(entry.theme) %>
5
10
  <%= scrolled_theme_stylesheet_pack_tags(entry.theme) %>
@@ -1,5 +1 @@
1
- scrolled_entry_json_seed(json,
2
- entry,
3
- skip_files: true,
4
- skip_i18n: true,
5
- include_unused_additional_seed_data: true)
1
+ scrolled_entry_editor_json_seed(json, entry)
@@ -0,0 +1,10 @@
1
+ json.key_format!(camelize: :lower)
2
+
3
+ json.partial! 'pageflow_scrolled/sections/section', section: section
4
+
5
+ json.content_elements do
6
+ json.array!(section.content_elements) do |content_element|
7
+ json.partial! 'pageflow_scrolled/content_elements/content_element',
8
+ content_element: content_element
9
+ end
10
+ end
@@ -1,58 +1,61 @@
1
- <!DOCTYPE html>
2
- <%= content_tag(:html, lang: @entry.locale) do %>
3
- <head>
4
- <title><%= pretty_entry_title(@entry) %></title>
1
+ <%= cache_scrolled_entry(entry: @entry, widget_scope: @widget_scope) do %>
2
+ <!DOCTYPE html>
3
+ <%= content_tag(:html, lang: @entry.locale, dir: text_direction(@entry.locale)) do %>
4
+ <head>
5
+ <title><%= pretty_entry_title(@entry) %></title>
5
6
 
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
7
+ <meta charset="utf-8" />
8
+ <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
8
9
 
9
10
 
10
- <%= social_share_meta_tags_for(@entry) %>
11
- <%= meta_tags_for_entry(@entry) %>
11
+ <%= social_share_meta_tags_for(@entry) %>
12
+ <%= meta_tags_for_entry(@entry) %>
13
+ <%= feed_link_tags_for_entry(@entry) unless @skip_feed_link_tags%>
12
14
 
13
- <%= scrolled_favicons_for_entry(@entry, entry_mode: @widget_scope) %>
15
+ <%= scrolled_favicons_for_entry(@entry, entry_mode: @widget_scope) %>
14
16
 
15
- <%= javascript_include_tag 'pageflow_scrolled/legacy' %>
16
- <%= scrolled_frontend_stylesheet_packs_tag(@entry, widget_scope: @widget_scope) %>
17
+ <%= javascript_include_tag 'pageflow_scrolled/legacy' %>
18
+ <%= scrolled_frontend_stylesheet_packs_tag(@entry, widget_scope: @widget_scope) %>
17
19
 
18
- <%= scrolled_theme_properties_style_tag(@entry.theme) %>
19
- <%= scrolled_theme_stylesheet_pack_tags(@entry.theme) %>
20
+ <%= scrolled_theme_properties_style_tag(@entry.theme) %>
21
+ <%= scrolled_theme_stylesheet_pack_tags(@entry.theme) %>
20
22
 
21
- <%= render_widget_head_fragments(@entry, scope: @widget_scope) %>
23
+ <%= render_widget_head_fragments(@entry, scope: @widget_scope) %>
22
24
 
23
- <% if Rails.env.development? %>
24
- <script>
25
- try {
26
- if (window.top !== window) {
27
- window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.top.__REACT_DEVTOOLS_GLOBAL_HOOK__;
25
+ <% if Rails.env.development? %>
26
+ <script>
27
+ try {
28
+ if (window.top !== window) {
29
+ window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.top.__REACT_DEVTOOLS_GLOBAL_HOOK__;
30
+ }
31
+ } catch (e) {
32
+ console.warn('unable to connect to top frame for connecting dev tools');
28
33
  }
29
- } catch (e) {
30
- console.warn('unable to connect to top frame for connecting dev tools');
31
- }
32
- </script>
33
- <% end %>
34
+ </script>
35
+ <% end %>
34
36
 
35
- <% ssr_html = @skip_ssr ? '' : render_scrolled_entry(@entry) %>
37
+ <% ssr_html = @skip_ssr ? '' : render_scrolled_entry(@entry) %>
36
38
 
37
- <% if !@skip_ssr && (params[:frontend] == 'v2' || @entry.feature_state('frontend_v2')) %>
38
- <%= generated_media_queries_tags_for(ssr_html) %>
39
- <% end %>
40
- </head>
41
- <body>
42
- <%= structured_data_for_entry(@entry) unless @skip_structured_data %>
39
+ <% if !@skip_ssr && (params[:frontend] == 'v2' || @entry.feature_state('frontend_v2')) %>
40
+ <%= generated_media_queries_tags_for(ssr_html) %>
41
+ <% end %>
42
+ </head>
43
+ <body>
44
+ <%= structured_data_for_entry(@entry) unless @skip_structured_data %>
43
45
 
44
- <%= render 'pageflow_scrolled/entries/global_notices' %>
46
+ <%= render 'pageflow_scrolled/entries/global_notices' %>
45
47
 
46
- <div id="fullscreenRoot"></div>
47
- <div id="root"><%= ssr_html %></div>
48
+ <div id="fullscreenRoot"></div>
49
+ <div id="root"><%= ssr_html %></div>
48
50
 
49
- <div id='template-widget-container'>
50
- <%= render_widgets(@entry, scope: @widget_scope, insert_point: :bottom_of_entry) %>
51
- </div>
51
+ <div id='template-widget-container'>
52
+ <%= render_widgets(@entry, scope: @widget_scope, insert_point: :bottom_of_entry) %>
53
+ </div>
52
54
 
53
- <%= scrolled_webpack_public_path_script_tag %>
54
- <%= scrolled_frontend_javascript_packs_tag(@entry, widget_scope: @widget_scope) %>
55
+ <%= scrolled_webpack_public_path_script_tag %>
56
+ <%= scrolled_frontend_javascript_packs_tag(@entry, widget_scope: @widget_scope) %>
55
57
 
56
- <%= scrolled_entry_json_seed_script_tag(@entry, @seed_options || {}) %>
57
- </body>
58
+ <%= scrolled_entry_json_seed_script_tag(@entry, @seed_options || {}) %>
59
+ </body>
60
+ <% end %>
58
61
  <% end %>
@@ -0,0 +1,16 @@
1
+ content_element_vendors =
2
+ entry_config.content_element_consent_vendors.by_content_element_id(entry)
3
+
4
+ json.content_element_consent_vendors(content_element_vendors)
5
+
6
+ I18n.with_locale(entry.locale) do
7
+ json.consent_vendors do
8
+ json.array!(content_element_vendors.values.uniq) do |name|
9
+ json.name name
10
+ json.display_name t("pageflow_scrolled.consent_vendors.#{name}.name")
11
+ json.description t("pageflow_scrolled.consent_vendors.#{name}.description")
12
+ json.opt_in_prompt t("pageflow_scrolled.consent_vendors.#{name}.opt_in_prompt")
13
+ json.paradigm 'lazy opt-in'
14
+ end
15
+ end
16
+ end
@@ -39,6 +39,9 @@ json.config do
39
39
  self,
40
40
  include_unused: options[:include_unused_additional_seed_data])
41
41
  )
42
+
43
+ json.partial! 'pageflow_scrolled/entry_json_seed/consent_vendors',
44
+ entry: entry, entry_config: entry_config
42
45
  end
43
46
 
44
47
  unless options[:skip_i18n]
@@ -0,0 +1,5 @@
1
+ Pageflow.configure do |config|
2
+ config.for_entry_type(PageflowScrolled.entry_type) do |entry_type_config|
3
+ entry_type_config.features.register('hls_instead_of_dash')
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ de:
2
+ pageflow:
3
+ consentBar:
4
+ widget_type_name: "Consent-Leiste"
@@ -0,0 +1,4 @@
1
+ en:
2
+ pageflow:
3
+ consentBar:
4
+ widget_type_name: "Consent bar"