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
@@ -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"