pageflow 17.0.5 → 17.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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +362 -35
  3. data/README.md +0 -1
  4. data/admins/pageflow/accounts.rb +16 -14
  5. data/admins/pageflow/entry.rb +68 -20
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +4 -4
  9. data/admins/pageflow/revisions.rb +5 -5
  10. data/admins/pageflow/site_root_entry.rb +64 -0
  11. data/admins/pageflow/sites.rb +12 -3
  12. data/admins/pageflow/translations.rb +75 -0
  13. data/admins/pageflow/user.rb +21 -35
  14. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  15. data/app/assets/javascripts/pageflow/dist/ui.js +2865 -257
  16. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  17. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +2 -1
  18. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +6 -0
  19. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
  20. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +7 -1
  21. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -1
  22. data/app/assets/stylesheets/pageflow/editor/files.scss +28 -16
  23. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +24 -0
  24. data/app/assets/stylesheets/pageflow/editor/info_box.scss +11 -3
  25. data/app/assets/stylesheets/pageflow/editor/list.scss +6 -4
  26. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  27. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  28. data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
  29. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  30. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  31. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
  32. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +8 -0
  33. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  34. data/app/assets/stylesheets/pageflow/ui/properties.scss +5 -0
  35. data/app/assets/stylesheets/pageflow/ui.scss +1 -0
  36. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  37. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  38. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  39. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  40. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  41. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  42. data/app/controllers/pageflow/application_controller.rb +19 -19
  43. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  44. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  45. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  46. data/app/controllers/pageflow/editor/entries_controller.rb +2 -1
  47. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  48. data/app/controllers/pageflow/editor/file_import_controller.rb +3 -3
  49. data/app/controllers/pageflow/editor/files_controller.rb +7 -6
  50. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  51. data/app/controllers/pageflow/entries_controller.rb +77 -17
  52. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  53. data/app/controllers/pageflow/files_controller.rb +1 -0
  54. data/app/controllers/pageflow/pages_controller.rb +4 -2
  55. data/app/controllers/pageflow/revisions_controller.rb +2 -1
  56. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  57. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  58. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  59. data/app/helpers/pageflow/admin/entries_helper.rb +1 -1
  60. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  61. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  62. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  63. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  64. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  65. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  66. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  67. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  68. data/app/helpers/pageflow/admin/widgets_helper.rb +3 -3
  69. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  70. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  71. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  72. data/app/helpers/pageflow/common_entry_seed_helper.rb +2 -4
  73. data/app/helpers/pageflow/editor/config_helper.rb +1 -1
  74. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  75. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  76. data/app/helpers/pageflow/entries_helper.rb +58 -34
  77. data/app/helpers/pageflow/entry_json_seed_helper.rb +3 -2
  78. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  79. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  80. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  81. data/app/helpers/pageflow/files_helper.rb +5 -4
  82. data/app/helpers/pageflow/folders_helper.rb +8 -5
  83. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  84. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  85. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  86. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  87. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  88. data/app/helpers/pageflow/overview_helper.rb +1 -1
  89. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  90. data/app/helpers/pageflow/pages_helper.rb +29 -15
  91. data/app/helpers/pageflow/public_i18n_helper.rb +1 -1
  92. data/app/helpers/pageflow/quota_helper.rb +4 -4
  93. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  94. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  95. data/app/helpers/pageflow/sites_helper.rb +3 -3
  96. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  97. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  98. data/app/helpers/pageflow/structured_data_helper.rb +1 -1
  99. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  100. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  101. data/app/helpers/pageflow/themes_helper.rb +1 -1
  102. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  103. data/app/helpers/pageflow/widgets_helper.rb +7 -6
  104. data/app/inputs/pageflow_permalink_input.rb +3 -2
  105. data/app/jobs/pageflow/application_job.rb +1 -0
  106. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  107. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  108. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  109. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  110. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  111. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  112. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  113. data/app/mailers/pageflow/user_mailer.rb +1 -0
  114. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +13 -1
  115. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  116. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  117. data/app/models/concerns/pageflow/output_source.rb +3 -3
  118. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  119. data/app/models/concerns/pageflow/reusable_file.rb +23 -23
  120. data/app/models/concerns/pageflow/serialization_blacklist.rb +1 -1
  121. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  122. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  123. data/app/models/concerns/pageflow/translatable.rb +62 -0
  124. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  125. data/app/models/pageflow/account.rb +6 -5
  126. data/app/models/pageflow/account_member_query.rb +1 -1
  127. data/app/models/pageflow/account_role_query.rb +1 -1
  128. data/app/models/pageflow/application_query.rb +1 -1
  129. data/app/models/pageflow/application_record.rb +1 -1
  130. data/app/models/pageflow/audio_file.rb +4 -4
  131. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  132. data/app/models/pageflow/authentication_token.rb +2 -2
  133. data/app/models/pageflow/chapter.rb +6 -1
  134. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  135. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  136. data/app/models/pageflow/customized_theme.rb +6 -6
  137. data/app/models/pageflow/draft_entry.rb +37 -9
  138. data/app/models/pageflow/edit_lock.rb +19 -21
  139. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  140. data/app/models/pageflow/entries_feed.rb +2 -2
  141. data/app/models/pageflow/entry.rb +44 -30
  142. data/app/models/pageflow/entry_at_revision.rb +5 -1
  143. data/app/models/pageflow/entry_duplicate.rb +8 -5
  144. data/app/models/pageflow/entry_publication.rb +2 -2
  145. data/app/models/pageflow/entry_role_query.rb +4 -4
  146. data/app/models/pageflow/entry_template.rb +4 -4
  147. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  148. data/app/models/pageflow/entry_translation_group.rb +42 -0
  149. data/app/models/pageflow/file_reuse.rb +2 -2
  150. data/app/models/pageflow/file_usage.rb +10 -3
  151. data/app/models/pageflow/folder.rb +2 -2
  152. data/app/models/pageflow/home_button.rb +7 -7
  153. data/app/models/pageflow/image_file.rb +20 -5
  154. data/app/models/pageflow/image_file_url_templates.rb +1 -1
  155. data/app/models/pageflow/invitation_form.rb +2 -1
  156. data/app/models/pageflow/managed_user_query.rb +1 -1
  157. data/app/models/pageflow/membership.rb +5 -5
  158. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  159. data/app/models/pageflow/null_user.rb +1 -1
  160. data/app/models/pageflow/overview_button.rb +1 -1
  161. data/app/models/pageflow/page.rb +7 -3
  162. data/app/models/pageflow/permalink.rb +23 -2
  163. data/app/models/pageflow/permalink_directory.rb +7 -0
  164. data/app/models/pageflow/permalink_redirect.rb +7 -0
  165. data/app/models/pageflow/positioned_file.rb +5 -5
  166. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  167. data/app/models/pageflow/potential_memberships.rb +5 -4
  168. data/app/models/pageflow/published_entry.rb +62 -11
  169. data/app/models/pageflow/revision.rb +24 -15
  170. data/app/models/pageflow/roles.rb +14 -18
  171. data/app/models/pageflow/site.rb +36 -3
  172. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  173. data/app/models/pageflow/sitemaps.rb +10 -1
  174. data/app/models/pageflow/storyline.rb +5 -2
  175. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  176. data/app/models/pageflow/text_track_file.rb +1 -1
  177. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  178. data/app/models/pageflow/theme_customization_file.rb +3 -2
  179. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  180. data/app/models/pageflow/url_template.rb +1 -1
  181. data/app/models/pageflow/used_file.rb +7 -3
  182. data/app/models/pageflow/user_name_query.rb +2 -2
  183. data/app/models/pageflow/video_file.rb +22 -15
  184. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  185. data/app/models/pageflow/widget.rb +4 -3
  186. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  187. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  188. data/app/policies/pageflow/account_policy.rb +3 -1
  189. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  190. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  191. data/app/policies/pageflow/application_policy.rb +2 -0
  192. data/app/policies/pageflow/entry_policy.rb +7 -1
  193. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  194. data/app/policies/pageflow/file_policy.rb +4 -7
  195. data/app/policies/pageflow/folder_policy.rb +18 -8
  196. data/app/policies/pageflow/membership_policy.rb +6 -4
  197. data/app/policies/pageflow/site_policy.rb +10 -3
  198. data/app/policies/pageflow/user_policy.rb +6 -4
  199. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  200. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  201. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  202. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  203. data/app/views/admin/entries/_form.html.erb +2 -1
  204. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  205. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  206. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  207. data/app/views/admin/sites/_fields.html.erb +14 -1
  208. data/app/views/admin/translations/_form.html.erb +31 -0
  209. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  210. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  211. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  212. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  213. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  214. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  215. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  216. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  217. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  218. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  219. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  220. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  221. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  222. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  223. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  224. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  225. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  226. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  227. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  228. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  229. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  230. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  231. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  232. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  233. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -1
  234. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  235. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  236. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  237. data/app/views/pageflow/editor/files/_file.json.jbuilder +5 -13
  238. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  239. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  240. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  241. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -3
  242. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  243. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  244. data/app/views/pageflow/files/_file.json.jbuilder +3 -3
  245. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  246. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  247. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  248. data/config/initializers/active_admin_patches.rb +3 -6
  249. data/config/initializers/admin_resource_tabs.rb +3 -0
  250. data/config/initializers/paperclip.rb +1 -0
  251. data/config/initializers/symmetric_encryption.rb +1 -1
  252. data/config/initializers/zencoder.rb +24 -13
  253. data/config/locales/de.yml +110 -4
  254. data/config/locales/en.yml +109 -7
  255. data/config/routes.rb +15 -13
  256. data/config/spring.rb +2 -1
  257. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  258. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  259. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  260. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  261. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  262. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  263. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  264. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  265. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  266. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  267. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  268. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  269. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  270. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  271. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  272. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  273. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  274. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  275. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  276. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  277. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  278. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +3912 -1486
  279. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +468 -1161
  280. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +28125 -22
  281. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +26589 -19
  282. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  283. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  284. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  285. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  286. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  287. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  288. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  289. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  290. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  291. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  292. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +2 -2
  293. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
  294. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -1
  295. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +2 -2
  296. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +1 -0
  297. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +2 -1
  298. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +60 -6
  299. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +16 -2
  300. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +21 -23
  301. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +16 -1
  302. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  303. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +12 -0
  304. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  305. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +19 -1
  306. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  307. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  308. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +2 -0
  309. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +17 -9
  310. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  311. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +25 -5
  312. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  313. data/entry_types/scrolled/config/locales/de.yml +614 -45
  314. data/entry_types/scrolled/config/locales/en.yml +586 -47
  315. data/entry_types/scrolled/config/routes.rb +18 -8
  316. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  317. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  318. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  319. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  320. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  321. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  322. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  323. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +16 -4
  324. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  325. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -4
  326. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +24 -22
  327. data/entry_types/scrolled/lib/pageflow_scrolled.rb +1 -1
  328. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +6 -5
  329. data/entry_types/scrolled/package/config/webpack.js +22 -0
  330. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  331. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1529 -0
  332. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  333. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +59 -0
  334. data/entry_types/scrolled/package/contentElements-editor.js +2075 -321
  335. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  336. data/entry_types/scrolled/package/contentElements-frontend.js +1019 -643
  337. data/entry_types/scrolled/package/editor.js +2086 -1091
  338. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-ebd22921.js → FloatingPortalRootProvider-51914be7.js} +1200 -1258
  339. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-9f76033e.js} +7 -8
  340. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +1932 -0
  341. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-788e9cdb.js +39 -0
  342. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-0345ce57.js} +36 -63
  343. data/entry_types/scrolled/package/frontend/{Viewer-1ecf3375.js → Viewer-cdc549cc.js} +15 -22
  344. data/entry_types/scrolled/package/frontend/{Wavesurfer-7d9cf1b7.js → Wavesurfer-1cdc3925.js} +54 -74
  345. data/entry_types/scrolled/package/frontend/{components-024a9893.js → components-96660ffd.js} +1791 -841
  346. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-eb670c2f.js} +11 -18
  347. data/entry_types/scrolled/package/frontend/index.css +1 -1
  348. data/entry_types/scrolled/package/frontend/index.js +517 -903
  349. data/entry_types/scrolled/package/frontend/{createSuper-d0f30da3.js → inherits-539844a6.js} +40 -56
  350. data/entry_types/scrolled/package/frontend/{useContentElementEditorState-4f4c3cf6.js → useContentElementEditorState-77fe6c79.js} +7 -8
  351. data/entry_types/scrolled/package/frontend/usePhonePlatform-c2ba875d.js +8 -0
  352. data/entry_types/scrolled/package/frontend-server.js +0 -1
  353. data/entry_types/scrolled/package/package.json +18 -10
  354. data/entry_types/scrolled/package/testHelpers.js +306 -70
  355. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  356. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  357. data/entry_types/scrolled/package/widgets/consentBar.js +47 -66
  358. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  359. data/entry_types/scrolled/package/widgets/defaultNavigation.js +177 -207
  360. data/entry_types/scrolled/package/widgets/excursionDialog.css +1 -0
  361. data/entry_types/scrolled/package/widgets/excursionDialog.js +109 -0
  362. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  363. data/entry_types/scrolled/package/widgets/excursionSheet.js +262 -0
  364. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  365. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +6 -9
  366. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  367. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +48 -0
  368. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  369. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +144 -0
  370. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  371. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +26 -9
  372. data/entry_types/scrolled/package/widgets-server.js +1 -0
  373. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  374. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  375. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  376. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  377. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  378. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  379. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  380. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  381. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  382. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  383. data/lib/generators/pageflow/resque/resque_generator.rb +6 -4
  384. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  385. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  386. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  387. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  388. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  389. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  390. data/lib/pageflow/ability_mixin.rb +25 -15
  391. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  392. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  393. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  394. data/lib/pageflow/additional_headers.rb +27 -0
  395. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  396. data/lib/pageflow/admin/tabs.rb +1 -1
  397. data/lib/pageflow/built_in_file_type.rb +1 -1
  398. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  399. data/lib/pageflow/built_in_widget_type.rb +2 -2
  400. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  401. data/lib/pageflow/configuration.rb +141 -18
  402. data/lib/pageflow/cutoff_modes.rb +39 -0
  403. data/lib/pageflow/editor_controller.rb +6 -10
  404. data/lib/pageflow/engine.rb +4 -5
  405. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  406. data/lib/pageflow/entry_export_import/entry_serialization.rb +5 -4
  407. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  408. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +1 -1
  409. data/lib/pageflow/entry_export_import.rb +3 -3
  410. data/lib/pageflow/entry_types.rb +2 -2
  411. data/lib/pageflow/feature.rb +1 -1
  412. data/lib/pageflow/features.rb +4 -6
  413. data/lib/pageflow/file_importers.rb +4 -4
  414. data/lib/pageflow/file_type.rb +3 -3
  415. data/lib/pageflow/file_types.rb +3 -3
  416. data/lib/pageflow/global_config_api.rb +5 -6
  417. data/lib/pageflow/help_entries.rb +7 -7
  418. data/lib/pageflow/help_entry.rb +1 -1
  419. data/lib/pageflow/hooks.rb +1 -1
  420. data/lib/pageflow/nested_revision_component.rb +9 -27
  421. data/lib/pageflow/news_item_api.rb +1 -1
  422. data/lib/pageflow/page_type.rb +2 -3
  423. data/lib/pageflow/page_types.rb +3 -3
  424. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  425. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  426. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  427. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  428. data/lib/pageflow/plugin.rb +1 -2
  429. data/lib/pageflow/quota.rb +9 -5
  430. data/lib/pageflow/quotas.rb +1 -1
  431. data/lib/pageflow/rails_version.rb +1 -0
  432. data/lib/pageflow/react.rb +1 -1
  433. data/lib/pageflow/revision_component.rb +8 -40
  434. data/lib/pageflow/revision_components.rb +16 -6
  435. data/lib/pageflow/seeds.rb +12 -16
  436. data/lib/pageflow/theme.rb +1 -1
  437. data/lib/pageflow/theme_customizations.rb +10 -10
  438. data/lib/pageflow/themes.rb +3 -3
  439. data/lib/pageflow/user_mixin.rb +6 -6
  440. data/lib/pageflow/version.rb +1 -1
  441. data/lib/pageflow/widget_type.rb +4 -4
  442. data/lib/pageflow/widget_types.rb +9 -9
  443. data/lib/pageflow/zencoder_api.rb +32 -42
  444. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  445. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  446. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  447. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  448. data/lib/pageflow.rb +7 -2
  449. data/lib/tasks/pageflow_tasks.rake +1 -1
  450. data/package/editor.js +954 -868
  451. data/package/frontend.js +113 -387
  452. data/package/package.json +2 -1
  453. data/package/testHelpers.js +10 -56
  454. data/package/ui.js +209 -251
  455. data/spec/factories/accounts.rb +37 -22
  456. data/spec/factories/audio_files.rb +2 -2
  457. data/spec/factories/authentication_tokens.rb +4 -4
  458. data/spec/factories/chapters.rb +4 -4
  459. data/spec/factories/draft_entries.rb +14 -6
  460. data/spec/factories/edit_locks.rb +1 -1
  461. data/spec/factories/entries.rb +28 -19
  462. data/spec/factories/entry_translation_groups.rb +6 -0
  463. data/spec/factories/file_usages.rb +2 -1
  464. data/spec/factories/folders.rb +1 -1
  465. data/spec/factories/image_files.rb +2 -2
  466. data/spec/factories/pages.rb +3 -3
  467. data/spec/factories/published_entries.rb +26 -8
  468. data/spec/factories/revisions.rb +1 -1
  469. data/spec/factories/sites.rb +6 -0
  470. data/spec/factories/test_multi_attachment_files.rb +1 -1
  471. data/spec/factories/text_track_files.rb +1 -1
  472. data/spec/factories/uploadable_files.rb +1 -1
  473. data/spec/factories/users.rb +6 -6
  474. data/spec/factories/video_files.rb +2 -2
  475. data/spec/factories/widgets.rb +1 -1
  476. data/spec/fixtures/7x15_rotated.jpg +0 -0
  477. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  478. metadata +98 -45
  479. data/config/initializers/revision_components.rb +0 -5
  480. data/config/locales/twitter_to_x.de.yml +0 -6
  481. data/config/locales/twitter_to_x.en.yml +0 -6
  482. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  483. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  484. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  485. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  486. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  487. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  488. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
@@ -5,6 +5,7 @@ module PageflowPaged
5
5
  include WithoutControllerNamespacePartialPathPrefix
6
6
 
7
7
  helper Pageflow::FeedsHelper
8
+ helper Pageflow::HreflangLinksHelper
8
9
  helper Pageflow::MetaTagsHelper
9
10
  helper Pageflow::StructuredDataHelper
10
11
  helper Pageflow::PublicI18nHelper
@@ -7,7 +7,7 @@ module PageflowPaged
7
7
  def page_background_asset(page)
8
8
  render('pageflow_paged/page_background_asset/element',
9
9
  entry: @entry,
10
- page: page)
10
+ page:)
11
11
  end
12
12
  end
13
13
  end
@@ -5,24 +5,24 @@ module PageflowPaged
5
5
 
6
6
  def third_party_embed_opt_in(entry:, vendor_name:, message:)
7
7
  link_html = third_party_embed_privacy_link(
8
- entry: entry,
8
+ entry:,
9
9
  text: t('pageflow.public.third_party_embed_consent.opt_in.more_information'),
10
- vendor_name: vendor_name
10
+ vendor_name:
11
11
  )
12
12
 
13
13
  render('pageflow_paged/third_party_embed_consent/opt_in',
14
- message: message,
15
- vendor_name: vendor_name,
16
- link_html: link_html)
14
+ message:,
15
+ vendor_name:,
16
+ link_html:)
17
17
  end
18
18
 
19
19
  def third_party_embed_opt_out_info(entry)
20
20
  link_html = third_party_embed_privacy_link(
21
- entry: entry,
21
+ entry:,
22
22
  text: t('pageflow.public.third_party_embed_consent.opt_out_info.prompt_link')
23
23
  )
24
24
 
25
- render('pageflow_paged/third_party_embed_consent/opt_out_info', link_html: link_html)
25
+ render('pageflow_paged/third_party_embed_consent/opt_out_info', link_html:)
26
26
  end
27
27
 
28
28
  def third_party_embed_privacy_link(entry:, text:, vendor_name: nil)
@@ -0,0 +1 @@
1
+ # Pageflow Paged does not use editor JSON seed
@@ -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
+ <%= hreflang_link_tags_for_entry(@entry) %>
15
16
  <%= feed_link_tags_for_entry(@entry) %>
16
17
  <% end %>
17
18
  <% end %>
@@ -7,6 +7,10 @@ module PageflowPaged
7
7
  end
8
8
 
9
9
  config.features.enable_by_default('paged_entry_type')
10
+
11
+ config.for_entry_type(PageflowPaged.entry_type) do |c|
12
+ c.revision_components.register(Pageflow::Storyline, create_defaults: true)
13
+ end
10
14
  end
11
15
  end
12
16
  end
@@ -1,6 +1,6 @@
1
1
  module PageflowPaged
2
2
  module React
3
- class PageType < Pageflow::PageType
3
+ class PageType < Pageflow::PageType # rubocop:todo Style/Documentation
4
4
  attr_reader :name, :component_name, :file_types
5
5
 
6
6
  def initialize(name, options)
@@ -1,6 +1,6 @@
1
1
  module PageflowPaged
2
2
  module React
3
- class WidgetType < Pageflow::WidgetType
3
+ class WidgetType < Pageflow::WidgetType # rubocop:todo Style/Documentation
4
4
  attr_reader :name, :role, :options
5
5
 
6
6
  def initialize(name, role, options = {})
@@ -19,8 +19,8 @@ module PageflowPaged
19
19
 
20
20
  def render(template, entry)
21
21
  template.render(File.join('pageflow_paged', 'react', 'widget'),
22
- entry: entry,
23
- name: name,
22
+ entry:,
23
+ name:,
24
24
  server_rendering: options[:server_rendering])
25
25
  end
26
26
  end
@@ -12,7 +12,7 @@ module PageflowPaged
12
12
  frontend_app: PageflowPaged::EntriesController.action(:show),
13
13
  configuration: PageflowPaged::Configuration,
14
14
  editor_app: PageflowPaged::Engine,
15
- editor_fragment_renderer: editor_fragment_renderer)
15
+ editor_fragment_renderer:)
16
16
  end
17
17
 
18
18
  private
@@ -5,11 +5,13 @@ module PageflowScrolled
5
5
  include Pageflow::EditorController
6
6
 
7
7
  def create
8
- chapter = Chapter.create(chapter_params.merge(revision: @entry.draft))
8
+ chapter = find_storyline.chapters.create(chapter_params)
9
9
 
10
10
  render partial: 'pageflow_scrolled/chapters/chapter',
11
- locals: {chapter: chapter},
11
+ locals: {chapter:},
12
12
  status: :created
13
+ rescue ActiveRecord::RecordNotFound
14
+ head :not_found
13
15
  end
14
16
 
15
17
  def update
@@ -49,7 +51,7 @@ module PageflowScrolled
49
51
  configuration = params.require(:chapter)[:configuration].try(:permit!) || {}
50
52
  params.require(:chapter)
51
53
  .permit(:position)
52
- .merge(configuration: configuration)
54
+ .merge(configuration:)
53
55
  end
54
56
 
55
57
  def find_storyline
@@ -9,7 +9,7 @@ module PageflowScrolled
9
9
  content_element = section.content_elements.create(content_element_params)
10
10
 
11
11
  render partial: 'pageflow_scrolled/content_elements/content_element',
12
- locals: {content_element: content_element},
12
+ locals: {content_element:},
13
13
  status: :created
14
14
  end
15
15
 
@@ -64,7 +64,7 @@ module PageflowScrolled
64
64
  params.require(:content_element)
65
65
  .transform_keys(&:underscore)
66
66
  .permit(:type_name, :position)
67
- .merge(configuration: configuration)
67
+ .merge(configuration:)
68
68
  end
69
69
  end
70
70
  end
@@ -9,7 +9,7 @@ module PageflowScrolled
9
9
  section = chapter.create_section(section_params)
10
10
 
11
11
  render partial: 'pageflow_scrolled/editor/sections/section_with_content_elements',
12
- locals: {section: section},
12
+ locals: {section:},
13
13
  status: :created
14
14
  end
15
15
 
@@ -59,7 +59,7 @@ module PageflowScrolled
59
59
  configuration = params.require(:section)[:configuration].try(:permit!) || {}
60
60
  params.require(:section)
61
61
  .permit(:position)
62
- .merge(configuration: configuration)
62
+ .merge(configuration:)
63
63
  end
64
64
  end
65
65
  end
@@ -5,6 +5,7 @@ module PageflowScrolled
5
5
 
6
6
  helper Pageflow::EntriesHelper
7
7
  helper Pageflow::FeedsHelper
8
+ helper Pageflow::HreflangLinksHelper
8
9
  helper Pageflow::WidgetsHelper
9
10
  helper Pageflow::SocialShareHelper
10
11
  helper Pageflow::MetaTagsHelper
@@ -19,7 +20,7 @@ module PageflowScrolled
19
20
 
20
21
  render(
21
22
  locals: {
22
- entry: entry,
23
+ entry:,
23
24
  widget_scope: get_entry_mode_from_env
24
25
  }
25
26
  )
@@ -1,11 +1,11 @@
1
1
  module PageflowScrolled
2
2
  # @api private
3
3
  module CacheHelper
4
- def cache_scrolled_entry(entry:, widget_scope:, &block)
4
+ def cache_scrolled_entry(entry:, widget_scope:, &)
5
5
  condition =
6
6
  widget_scope == :published &&
7
7
  entry.feature_state('scrolled_entry_fragment_caching')
8
- cache_if(condition, [entry, :head_and_body, widget_scope], &block)
8
+ cache_if(condition, [entry, :head_and_body, widget_scope], &)
9
9
  end
10
10
  end
11
11
  end
@@ -17,6 +17,7 @@ module PageflowScrolled
17
17
  scrolled_entry,
18
18
  skip_files: true,
19
19
  skip_i18n: true,
20
+ include_hidden_sections: true,
20
21
  include_unused_additional_seed_data: true)
21
22
  end
22
23
 
@@ -15,11 +15,12 @@ module PageflowScrolled
15
15
  def scrolled_editor_iframe_seed_html_script_tag(entry)
16
16
  html = render(template: 'pageflow_scrolled/entries/show',
17
17
  locals: {
18
- entry: entry,
18
+ entry:,
19
19
  widget_scope: :editor,
20
20
  skip_ssr: true,
21
21
  skip_structured_data: true,
22
22
  skip_feed_link_tags: true,
23
+ skip_hreflang_link_tags: true,
23
24
  seed_options: {
24
25
  skip_collections: true,
25
26
  include_unused_additional_seed_data: true,
@@ -9,6 +9,7 @@ module PageflowScrolled
9
9
  include Pageflow::EntriesHelper
10
10
  include Pageflow::MetaTagsHelper
11
11
  include Pageflow::SocialShareLinksHelper
12
+ include Pageflow::PublicI18n::LocalesHelper
12
13
  include PageflowScrolled::I18nHelper
13
14
  include PageflowScrolled::ThemesHelper
14
15
 
@@ -23,17 +24,70 @@ module PageflowScrolled
23
24
  end
24
25
 
25
26
  def scrolled_entry_json_seed(json, scrolled_entry, options = {})
26
- main_storyline = Storyline.all_for_revision(scrolled_entry.revision).first
27
- main_storyline ||= Storyline.new
27
+ revision = scrolled_entry.revision
28
+ sections = scrolled_entry_json_seed_sections(scrolled_entry, options)
28
29
 
29
30
  json.partial!('pageflow_scrolled/entry_json_seed/entry',
30
- chapters: main_storyline.chapters,
31
31
  entry: scrolled_entry,
32
32
  entry_config: Pageflow.config_for(scrolled_entry),
33
- sections: main_storyline.sections,
34
- content_elements: main_storyline.content_elements,
33
+ storylines: scrolled_entry_json_seed_storylines(revision),
34
+ chapters: scrolled_entry_json_seed_chapters(revision, options),
35
+ sections:,
36
+ content_elements: scrolled_entry_json_seed_content_elements(revision, sections),
35
37
  widgets: scrolled_entry.resolve_widgets(insert_point: :react),
36
- options: options)
38
+ options:)
39
+ end
40
+
41
+ private
42
+
43
+ def scrolled_entry_json_seed_storylines(revision)
44
+ Storyline.all_for_revision(revision)
45
+ end
46
+
47
+ def scrolled_entry_json_seed_sections(scrolled_entry, options)
48
+ main_storyline = Storyline.all_for_revision(scrolled_entry.revision).first || Storyline.new
49
+
50
+ sections =
51
+ if scrolled_entry.cutoff_mode_enabled_for?(request)
52
+ main_storyline.sections_before_cutoff_section
53
+ else
54
+ Section.all_for_revision(scrolled_entry.revision)
55
+ end
56
+
57
+ return sections if options[:include_hidden_sections]
58
+
59
+ sections.reject { |section| section.configuration['hidden'] }
60
+ end
61
+
62
+ def scrolled_entry_json_seed_chapters(revision, options)
63
+ chapters = Chapter.all_for_revision(revision)
64
+ return chapters if options[:include_hidden_sections]
65
+
66
+ has_visible_sections, has_hidden_sections =
67
+ scrolled_entry_json_seed_chapter_section_visibilites(revision)
68
+
69
+ chapters.reject do |chapter|
70
+ has_hidden_sections[chapter.id] && !has_visible_sections[chapter.id]
71
+ end
72
+ end
73
+
74
+ def scrolled_entry_json_seed_chapter_section_visibilites(revision)
75
+ has_visible_sections = {}
76
+ has_hidden_sections = {}
77
+
78
+ Section.all_for_revision(revision).each do |section|
79
+ if section.configuration['hidden']
80
+ has_hidden_sections[section.chapter_id] = true
81
+ else
82
+ has_visible_sections[section.chapter_id] = true
83
+ end
84
+ end
85
+
86
+ [has_visible_sections, has_hidden_sections]
87
+ end
88
+
89
+ def scrolled_entry_json_seed_content_elements(revision, sections)
90
+ ContentElement.all_for_revision(revision).where(section: sections)
37
91
  end
38
92
  end
39
93
  end
@@ -22,6 +22,13 @@ module PageflowScrolled
22
22
  )
23
23
  end
24
24
 
25
+ def scrolled_editor_stylesheet_packs_tag(entry)
26
+ stylesheet_pack_tag(
27
+ *scrolled_editor_stylesheet_packs(entry),
28
+ media: 'all'
29
+ )
30
+ end
31
+
25
32
  def scrolled_frontend_packs(entry, widget_scope:)
26
33
  ['pageflow-scrolled-frontend'] +
27
34
  scrolled_additional_frontend_packs(entry, widget_scope) +
@@ -30,17 +37,24 @@ module PageflowScrolled
30
37
 
31
38
  def scrolled_editor_packs(entry)
32
39
  ['pageflow-scrolled-editor'] +
33
- Pageflow.config_for(entry).additional_editor_packs.paths +
40
+ Pageflow.config_for(entry).additional_editor_packs.paths(entry) +
41
+ Pageflow.config_for(entry).additional_frontend_packs.paths(entry) +
34
42
  scrolled_frontend_widget_type_packs(entry, :editor)
35
43
  end
36
44
 
45
+ def scrolled_editor_stylesheet_packs(entry)
46
+ Pageflow.config_for(entry).additional_editor_packs.stylesheet_paths(entry) +
47
+ Pageflow.config_for(entry).additional_frontend_packs.paths(entry)
48
+ end
49
+
37
50
  private
38
51
 
39
52
  def scrolled_additional_frontend_packs(entry, widget_scope)
40
53
  additional_packs = Pageflow.config_for(entry).additional_frontend_packs
41
- return additional_packs.paths if widget_scope == :editor
54
+ return additional_packs.paths(entry) if widget_scope == :editor
42
55
 
43
56
  additional_packs.paths_for_content_element_types(
57
+ entry,
44
58
  ContentElement.select_used_type_names(
45
59
  entry.revision,
46
60
  additional_packs.content_element_type_names
@@ -33,35 +33,33 @@ module PageflowScrolled
33
33
  # see https://github.com/reactjs/react-rails/issues/970#issuecomment-476338244
34
34
  class WebpackerSplitChunksManifestContainer < React::ServerRendering::WebpackerManifestContainer
35
35
  CLIENT_EXEC =
36
- %r{__webpack_exec__\("./node_modules/webpack-dev-server\/client\/index\.js[^"]*"\),}
36
+ %r{__webpack_exec__\("./node_modules/webpack-dev-server/client/index\.js[^"]*"\),}
37
37
 
38
- def find_asset(logical_path)
38
+ def find_asset(logical_path) # rubocop:todo Metrics/AbcSize
39
39
  asset_paths = manifest.lookup_pack_with_chunks(logical_path, type: :javascript)
40
40
 
41
41
  asset_contents =
42
- begin
43
- if Webpacker.dev_server.running?
44
- ds = Webpacker.dev_server
45
- asset_paths.map do |asset_path|
46
- # Remove the protocol and host from the asset
47
- # path. Sometimes webpacker includes this, sometimes
48
- # it does not
49
- asset_path.slice!("#{ds.protocol}://#{ds.host_with_port}")
50
- dev_server_asset =
51
- URI.open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read
42
+ if Webpacker.dev_server.running?
43
+ ds = Webpacker.dev_server
44
+ asset_paths.map do |asset_path|
45
+ # Remove the protocol and host from the asset
46
+ # path. Sometimes webpacker includes this, sometimes
47
+ # it does not
48
+ asset_path.slice!("#{ds.protocol}://#{ds.host_with_port}")
49
+ dev_server_asset =
50
+ URI.open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read # rubocop:disable Security/Open
52
51
 
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
52
+ # Remove webpack-dev-server client code that tries to
53
+ # interact with browser globals:
54
+ dev_server_asset.sub!(CLIENT_REQUIRE, '//\0') # for Webpack 4
55
+ dev_server_asset.sub!(CLIENT_EXEC, '/*\0*/') # for Webpack 5
57
56
 
58
- dev_server_asset
59
- end
60
- else
61
- asset_paths.map do |asset_path|
62
- full_path = ::Rails.root.join('public', asset_path[1..-1])
63
- File.read(full_path)
64
- end
57
+ dev_server_asset
58
+ end
59
+ else
60
+ asset_paths.map do |asset_path|
61
+ full_path = ::Rails.root.join('public', asset_path[1..])
62
+ File.read(full_path)
65
63
  end
66
64
  end
67
65
 
@@ -6,9 +6,11 @@ module PageflowScrolled
6
6
  theme_file_role: nil,
7
7
  theme_file_style: :resized,
8
8
  relative_url: false)
9
+ theme_directory, path = extract_theme_directory_from_scrolled_theme_asset_path(theme, path)
10
+
9
11
  path =
10
12
  theme.files.dig(theme_file_role, theme_file_style) ||
11
- asset_pack_path("static/pageflow-scrolled/themes/#{theme.name}/#{path}")
13
+ asset_pack_path("static/pageflow-scrolled/themes/#{theme_directory}/#{path}")
12
14
 
13
15
  if relative_url
14
16
  URI.parse(path).path
@@ -108,6 +110,7 @@ module PageflowScrolled
108
110
 
109
111
  def selector(rule_name)
110
112
  return ':root' if rule_name == :root
113
+
111
114
  ".#{@prefix}-#{rule_name.to_s.camelize(:lower)}"
112
115
  end
113
116
  end
@@ -122,5 +125,17 @@ module PageflowScrolled
122
125
  end
123
126
  end
124
127
  end
128
+
129
+ def extract_theme_directory_from_scrolled_theme_asset_path(theme, path)
130
+ if path.starts_with?('../shared/')
131
+ ['shared', path.gsub!('../shared/', '')]
132
+ elsif path.starts_with?('../')
133
+ raise(ArgumentError,
134
+ 'Upward navigation to other directory than the shared ' \
135
+ 'theme directory not allowed in theme asset path.')
136
+ else
137
+ [theme.name, path]
138
+ end
139
+ end
125
140
  end
126
141
  end
@@ -1,5 +1,10 @@
1
1
  module PageflowScrolled
2
- class Chapter < Pageflow::ApplicationRecord
2
+ class Chapter < Pageflow::ApplicationRecord # rubocop:todo Style/Documentation
3
+ POSITION_ORDER = [
4
+ 'pageflow_scrolled_storylines.position ASC',
5
+ 'pageflow_scrolled_chapters.position ASC'
6
+ ].join(',')
7
+
3
8
  include Pageflow::SerializedConfiguration
4
9
  include Pageflow::AutoGeneratedPermaId
5
10
  include Pageflow::NestedRevisionComponent
@@ -13,8 +18,9 @@ module PageflowScrolled
13
18
 
14
19
  nested_revision_components :sections
15
20
 
16
- attr_accessor :revision # used on :create to lazily create storyline
17
- before_validation :ensure_storyline, on: :create
21
+ def entry_for_auto_generated_perma_id
22
+ storyline.revision.entry
23
+ end
18
24
 
19
25
  def create_section(attributes = {})
20
26
  shift_section_positions(from: attributes[:position])
@@ -26,16 +32,19 @@ module PageflowScrolled
26
32
  end
27
33
 
28
34
  def duplicate_section(section)
29
- shift_section_positions(from: section.position + 1)
35
+ transaction do
36
+ shift_section_positions(from: section.position + 1)
30
37
 
31
- section.duplicate do |new_section|
32
- new_section.position = section.position + 1
38
+ section.duplicate do |new_section|
39
+ new_section.position = section.position + 1
40
+ end
33
41
  end
34
42
  end
35
43
 
36
44
  def self.all_for_revision(revision)
37
45
  joins(storyline: :revision)
38
46
  .where(pageflow_scrolled_storylines: {revision_id: revision})
47
+ .order(POSITION_ORDER)
39
48
  end
40
49
 
41
50
  private
@@ -45,13 +54,5 @@ module PageflowScrolled
45
54
  .where('position >= ?', from)
46
55
  .update_all('position = position + 1')
47
56
  end
48
-
49
- def ensure_storyline
50
- return if storyline.present?
51
- unless Storyline.all_for_revision(revision).exists?
52
- Storyline.create!(revision: revision, configuration: {main: true})
53
- end
54
- self.storyline = Storyline.all_for_revision(revision).first
55
- end
56
57
  end
57
58
  end
@@ -1,15 +1,27 @@
1
1
  module PageflowScrolled
2
2
  # @api private
3
3
  class ContentElement < Pageflow::ApplicationRecord
4
+ POSITION_ORDER = [
5
+ 'pageflow_scrolled_storylines.position ASC',
6
+ 'pageflow_scrolled_chapters.position ASC',
7
+ 'pageflow_scrolled_sections.position ASC',
8
+ 'pageflow_scrolled_content_elements.position ASC'
9
+ ].join(',')
10
+
4
11
  include Pageflow::SerializedConfiguration
5
12
  include Pageflow::AutoGeneratedPermaId
6
13
  include Pageflow::NestedRevisionComponent
7
14
 
8
15
  belongs_to :section
9
16
 
17
+ def entry_for_auto_generated_perma_id
18
+ section.chapter.storyline.revision.entry
19
+ end
20
+
10
21
  def self.all_for_revision(revision)
11
22
  joins(section: {chapter: {storyline: :revision}})
12
23
  .where(pageflow_scrolled_storylines: {revision_id: revision})
24
+ .order(POSITION_ORDER)
13
25
  end
14
26
 
15
27
  def self.select_used_type_names(revision, type_names)
@@ -1,5 +1,11 @@
1
1
  module PageflowScrolled
2
- class Section < Pageflow::ApplicationRecord
2
+ class Section < Pageflow::ApplicationRecord # rubocop:todo Style/Documentation
3
+ POSITION_ORDER = [
4
+ 'pageflow_scrolled_storylines.position ASC',
5
+ 'pageflow_scrolled_chapters.position ASC',
6
+ 'pageflow_scrolled_sections.position ASC'
7
+ ].join(',')
8
+
3
9
  include Pageflow::SerializedConfiguration
4
10
  include Pageflow::AutoGeneratedPermaId
5
11
  include Pageflow::NestedRevisionComponent
@@ -12,9 +18,14 @@ module PageflowScrolled
12
18
 
13
19
  nested_revision_components :content_elements
14
20
 
21
+ def entry_for_auto_generated_perma_id
22
+ chapter.storyline.revision.entry
23
+ end
24
+
15
25
  def self.all_for_revision(revision)
16
26
  joins(chapter: {storyline: :revision})
17
27
  .where(pageflow_scrolled_storylines: {revision_id: revision})
28
+ .order(POSITION_ORDER)
18
29
  end
19
30
  end
20
31
  end
@@ -1,5 +1,5 @@
1
1
  module PageflowScrolled
2
- class Storyline < Pageflow::ApplicationRecord
2
+ class Storyline < Pageflow::ApplicationRecord # rubocop:todo Style/Documentation
3
3
  SECTIONS_ORDER = [
4
4
  'pageflow_scrolled_chapters.position ASC',
5
5
  'pageflow_scrolled_sections.position ASC'
@@ -27,5 +27,23 @@ module PageflowScrolled
27
27
  through: :sections
28
28
 
29
29
  nested_revision_components :chapters
30
+
31
+ def sections_before_cutoff_section
32
+ sections_before(cutoff_section)
33
+ end
34
+
35
+ def self.create_defaults(draft)
36
+ create!(revision: draft, configuration: {main: true})
37
+ end
38
+
39
+ private
40
+
41
+ def sections_before(section)
42
+ section ? sections[0...sections.index(section)] : sections
43
+ end
44
+
45
+ def cutoff_section
46
+ sections.find_by_perma_id(revision.configuration['cutoff_section_perma_id'])
47
+ end
30
48
  end
31
49
  end
@@ -9,3 +9,4 @@
9
9
 
10
10
  <%= scrolled_webpack_public_path_script_tag %>
11
11
  <%= scrolled_editor_javascript_packs_tag(entry) %>
12
+ <%= scrolled_editor_stylesheet_packs_tag(entry) %>
@@ -1,10 +1,10 @@
1
1
  json.key_format!(camelize: :lower)
2
2
 
3
- json.partial! 'pageflow_scrolled/sections/section', section: section
3
+ json.partial!('pageflow_scrolled/sections/section', section:)
4
4
 
5
5
  json.content_elements do
6
6
  json.array!(section.content_elements) do |content_element|
7
7
  json.partial! 'pageflow_scrolled/content_elements/content_element',
8
- content_element: content_element
8
+ content_element:
9
9
  end
10
10
  end
@@ -6,9 +6,11 @@
6
6
 
7
7
  <meta charset="utf-8" />
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">
9
+ <meta name="robots" content="max-image-preview:large">
9
10
 
10
11
  <%= social_share_meta_tags_for(entry) %>
11
12
  <%= meta_tags_for_entry(entry) %>
13
+ <%= hreflang_link_tags_for_entry(entry) unless local_assigns[:skip_hreflang_link_tags] %>
12
14
  <%= feed_link_tags_for_entry(entry) unless local_assigns[:skip_feed_link_tags] %>
13
15
 
14
16
  <%= scrolled_favicons_for_entry(entry, entry_mode: widget_scope) %>