pageflow 17.0.5 → 17.2.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 (636) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +342 -41
  3. data/README.md +3 -5
  4. data/admins/pageflow/accounts.rb +22 -20
  5. data/admins/pageflow/entry.rb +76 -26
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +15 -15
  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/images/pageflow/admin/icons/comment.svg +1 -0
  15. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  16. data/app/assets/javascripts/pageflow/dist/ui.js +4228 -900
  17. data/app/assets/javascripts/pageflow/editor/vendor.js +0 -1
  18. data/app/assets/javascripts/pageflow/ui.js +0 -1
  19. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  20. data/app/assets/stylesheets/pageflow/admin/entry_comments_indicator.scss +45 -0
  21. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +8 -0
  22. data/app/assets/stylesheets/pageflow/admin.scss +1 -0
  23. data/app/assets/stylesheets/pageflow/animations/spin.scss +9 -0
  24. data/app/assets/stylesheets/pageflow/animations.scss +1 -0
  25. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +27 -5
  26. data/app/assets/stylesheets/pageflow/editor/base.scss +11 -1
  27. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +20 -2
  28. data/app/assets/stylesheets/pageflow/editor/edit_configuration_view.scss +5 -0
  29. data/app/assets/stylesheets/pageflow/editor/file_folders.scss +127 -0
  30. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -2
  31. data/app/assets/stylesheets/pageflow/editor/file_meta_data_overlay.scss +45 -0
  32. data/app/assets/stylesheets/pageflow/editor/file_preview.scss +138 -0
  33. data/app/assets/stylesheets/pageflow/editor/file_references.scss +68 -0
  34. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +1 -1
  35. data/app/assets/stylesheets/pageflow/editor/file_stage_icons.scss +17 -0
  36. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +25 -32
  37. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +31 -48
  38. data/app/assets/stylesheets/pageflow/editor/file_type_pills.scss +73 -0
  39. data/app/assets/stylesheets/pageflow/editor/files.scss +242 -50
  40. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +161 -9
  41. data/app/assets/stylesheets/pageflow/editor/folder_breadcrumb.scss +40 -0
  42. data/app/assets/stylesheets/pageflow/editor/info_box.scss +23 -3
  43. data/app/assets/stylesheets/pageflow/editor/inputs/edit_defaults_button.scss +15 -0
  44. data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
  45. data/app/assets/stylesheets/pageflow/editor/list.scss +89 -37
  46. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  47. data/app/assets/stylesheets/pageflow/editor/manage_files.scss +9 -0
  48. data/app/assets/stylesheets/pageflow/editor/menu.scss +14 -0
  49. data/app/assets/stylesheets/pageflow/editor/move_to_folder_dialog.scss +83 -0
  50. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  51. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  52. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  53. data/app/assets/stylesheets/pageflow/mixins/pageflow.scss +9 -5
  54. data/app/assets/stylesheets/pageflow/ui/color_picker.scss +230 -0
  55. data/app/assets/stylesheets/pageflow/ui/forms.scss +38 -4
  56. data/app/assets/stylesheets/pageflow/ui/functions.scss +12 -2
  57. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +9 -8
  58. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  59. data/app/assets/stylesheets/pageflow/ui/input/text_area_input.scss +15 -0
  60. data/app/assets/stylesheets/pageflow/ui/overrides.scss +8 -0
  61. data/app/assets/stylesheets/pageflow/ui/properties.scss +34 -0
  62. data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -3
  63. data/app/assets/stylesheets/pageflow/ui.scss +4 -1
  64. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  65. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  66. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  67. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  68. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  69. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  70. data/app/controllers/pageflow/application_controller.rb +19 -19
  71. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  72. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  73. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  74. data/app/controllers/pageflow/editor/entries_controller.rb +3 -1
  75. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  76. data/app/controllers/pageflow/editor/file_folders_controller.rb +80 -0
  77. data/app/controllers/pageflow/editor/file_import_controller.rb +4 -3
  78. data/app/controllers/pageflow/editor/files_controller.rb +20 -10
  79. data/app/controllers/pageflow/editor/oembeds_controller.rb +21 -0
  80. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  81. data/app/controllers/pageflow/entries_controller.rb +85 -21
  82. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  83. data/app/controllers/pageflow/files_controller.rb +1 -0
  84. data/app/controllers/pageflow/pages_controller.rb +4 -2
  85. data/app/controllers/pageflow/review/comment_thread_reads_controller.rb +30 -0
  86. data/app/controllers/pageflow/review/comment_threads_controller.rb +60 -0
  87. data/app/controllers/pageflow/review/comments_controller.rb +53 -0
  88. data/app/controllers/pageflow/revisions_controller.rb +5 -1
  89. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  90. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  91. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  92. data/app/helpers/pageflow/admin/entries_helper.rb +41 -1
  93. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  94. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  95. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  96. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  97. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  98. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  99. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  100. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  101. data/app/helpers/pageflow/admin/widgets_helper.rb +5 -5
  102. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  103. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  104. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  105. data/app/helpers/pageflow/common_entry_seed_helper.rb +7 -7
  106. data/app/helpers/pageflow/editor/config_helper.rb +3 -1
  107. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  108. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  109. data/app/helpers/pageflow/entries_helper.rb +52 -46
  110. data/app/helpers/pageflow/entry_json_seed_helper.rb +7 -6
  111. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  112. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  113. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  114. data/app/helpers/pageflow/files_helper.rb +5 -4
  115. data/app/helpers/pageflow/folders_helper.rb +8 -5
  116. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  117. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  118. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  119. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  120. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  121. data/app/helpers/pageflow/overview_helper.rb +1 -1
  122. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  123. data/app/helpers/pageflow/pages_helper.rb +29 -15
  124. data/app/helpers/pageflow/public_i18n_helper.rb +10 -9
  125. data/app/helpers/pageflow/quota_helper.rb +4 -4
  126. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  127. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  128. data/app/helpers/pageflow/sites_helper.rb +3 -3
  129. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  130. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  131. data/app/helpers/pageflow/structured_data_helper.rb +5 -2
  132. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  133. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  134. data/app/helpers/pageflow/themes_helper.rb +2 -4
  135. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  136. data/app/helpers/pageflow/widgets_helper.rb +8 -6
  137. data/app/inputs/pageflow_permalink_input.rb +8 -3
  138. data/app/jobs/pageflow/application_job.rb +1 -0
  139. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  140. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  141. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  142. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  143. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  144. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  145. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  146. data/app/mailers/pageflow/user_mailer.rb +1 -0
  147. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +20 -1
  148. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  149. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  150. data/app/models/concerns/pageflow/output_source.rb +3 -3
  151. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  152. data/app/models/concerns/pageflow/reusable_file.rb +24 -24
  153. data/app/models/concerns/pageflow/serialization_blacklist.rb +3 -5
  154. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  155. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  156. data/app/models/concerns/pageflow/translatable.rb +62 -0
  157. data/app/models/concerns/pageflow/translated_attributes.rb +101 -0
  158. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  159. data/app/models/pageflow/account.rb +6 -5
  160. data/app/models/pageflow/account_member_query.rb +1 -1
  161. data/app/models/pageflow/account_role_query.rb +1 -1
  162. data/app/models/pageflow/application_query.rb +1 -1
  163. data/app/models/pageflow/application_record.rb +1 -1
  164. data/app/models/pageflow/audio_file.rb +4 -4
  165. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  166. data/app/models/pageflow/authentication_token.rb +2 -2
  167. data/app/models/pageflow/chapter.rb +6 -1
  168. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  169. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  170. data/app/models/pageflow/comment.rb +30 -0
  171. data/app/models/pageflow/comment_thread.rb +65 -0
  172. data/app/models/pageflow/comment_thread_read.rb +22 -0
  173. data/app/models/pageflow/customized_theme.rb +9 -8
  174. data/app/models/pageflow/draft_entry.rb +49 -9
  175. data/app/models/pageflow/edit_lock.rb +19 -21
  176. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  177. data/app/models/pageflow/entries_feed.rb +2 -2
  178. data/app/models/pageflow/entry.rb +46 -30
  179. data/app/models/pageflow/entry_at_revision.rb +14 -2
  180. data/app/models/pageflow/entry_comment_summary.rb +114 -0
  181. data/app/models/pageflow/entry_duplicate.rb +8 -5
  182. data/app/models/pageflow/entry_publication.rb +2 -2
  183. data/app/models/pageflow/entry_role_query.rb +4 -4
  184. data/app/models/pageflow/entry_template.rb +4 -4
  185. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  186. data/app/models/pageflow/entry_translation_group.rb +42 -0
  187. data/app/models/pageflow/file_folder.rb +74 -0
  188. data/app/models/pageflow/file_reuse.rb +5 -4
  189. data/app/models/pageflow/file_usage.rb +18 -3
  190. data/app/models/pageflow/folder.rb +2 -2
  191. data/app/models/pageflow/home_button.rb +7 -7
  192. data/app/models/pageflow/image_file.rb +44 -25
  193. data/app/models/pageflow/image_file_url_templates.rb +4 -4
  194. data/app/models/pageflow/invitation_form.rb +2 -1
  195. data/app/models/pageflow/legal_info.rb +38 -0
  196. data/app/models/pageflow/managed_user_query.rb +1 -1
  197. data/app/models/pageflow/membership.rb +5 -5
  198. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  199. data/app/models/pageflow/null_user.rb +1 -1
  200. data/app/models/pageflow/overview_button.rb +1 -1
  201. data/app/models/pageflow/page.rb +7 -3
  202. data/app/models/pageflow/permalink.rb +24 -2
  203. data/app/models/pageflow/permalink_directory.rb +7 -0
  204. data/app/models/pageflow/permalink_redirect.rb +7 -0
  205. data/app/models/pageflow/positioned_file.rb +5 -5
  206. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  207. data/app/models/pageflow/potential_memberships.rb +5 -4
  208. data/app/models/pageflow/published_entry.rb +62 -11
  209. data/app/models/pageflow/revision.rb +29 -16
  210. data/app/models/pageflow/roles.rb +14 -18
  211. data/app/models/pageflow/site.rb +46 -3
  212. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  213. data/app/models/pageflow/sitemaps.rb +10 -1
  214. data/app/models/pageflow/storyline.rb +5 -2
  215. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  216. data/app/models/pageflow/text_track_file.rb +1 -1
  217. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  218. data/app/models/pageflow/theme_customization_file.rb +3 -2
  219. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  220. data/app/models/pageflow/url_template.rb +1 -1
  221. data/app/models/pageflow/used_file.rb +13 -3
  222. data/app/models/pageflow/user_name_query.rb +2 -2
  223. data/app/models/pageflow/video_file.rb +22 -15
  224. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  225. data/app/models/pageflow/widget.rb +5 -4
  226. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  227. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  228. data/app/policies/pageflow/account_policy.rb +3 -1
  229. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  230. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  231. data/app/policies/pageflow/application_policy.rb +2 -0
  232. data/app/policies/pageflow/entry_policy.rb +7 -1
  233. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  234. data/app/policies/pageflow/file_policy.rb +4 -7
  235. data/app/policies/pageflow/folder_policy.rb +18 -8
  236. data/app/policies/pageflow/membership_policy.rb +6 -4
  237. data/app/policies/pageflow/site_policy.rb +10 -3
  238. data/app/policies/pageflow/user_policy.rb +6 -4
  239. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  240. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  241. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  242. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  243. data/app/views/admin/entries/_form.html.erb +2 -1
  244. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  245. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  246. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  247. data/app/views/admin/sites/_fields.html.erb +14 -1
  248. data/app/views/admin/translations/_form.html.erb +31 -0
  249. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  250. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  251. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  252. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  253. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  254. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  255. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  256. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  257. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  258. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  259. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  260. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  261. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  262. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  263. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  264. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  265. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  266. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  267. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  268. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  269. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  270. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  271. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  272. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  273. data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +0 -1
  274. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +5 -3
  275. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  276. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  277. data/app/views/pageflow/editor/entries/seed.json.erb +1 -0
  278. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  279. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  280. data/app/views/pageflow/editor/file_folders/_file_folder.json.jbuilder +5 -0
  281. data/app/views/pageflow/editor/file_folders/create.json.jbuilder +1 -0
  282. data/app/views/pageflow/editor/file_folders/index.json.jbuilder +3 -0
  283. data/app/views/pageflow/editor/files/_file.json.jbuilder +7 -14
  284. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  285. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  286. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +3 -0
  287. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  288. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +4 -3
  289. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  290. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  291. data/app/views/pageflow/files/_file.json.jbuilder +5 -3
  292. data/app/views/pageflow/image_files/_image_file.json.jbuilder +0 -1
  293. data/app/views/pageflow/review/comment_threads/_comment_thread.json.jbuilder +20 -0
  294. data/app/views/pageflow/review/comment_threads/create.json.jbuilder +2 -0
  295. data/app/views/pageflow/review/comment_threads/index.json.jbuilder +13 -0
  296. data/app/views/pageflow/review/comments/_comment.json.jbuilder +13 -0
  297. data/app/views/pageflow/review/comments/create.json.jbuilder +1 -0
  298. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  299. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  300. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  301. data/app/views/pageflow/structured_data/_entry.json.jbuilder +2 -3
  302. data/app/views/pageflow/video_files/_video_file.json.jbuilder +0 -1
  303. data/config/initializers/active_admin_patches.rb +3 -6
  304. data/config/initializers/admin_resource_tabs.rb +3 -0
  305. data/config/initializers/paperclip.rb +1 -0
  306. data/config/initializers/symmetric_encryption.rb +1 -1
  307. data/config/initializers/zencoder.rb +24 -13
  308. data/config/locales/de.yml +256 -12
  309. data/config/locales/en.yml +253 -15
  310. data/config/routes.rb +29 -13
  311. data/config/spring.rb +2 -1
  312. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  313. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  314. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  315. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  316. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  317. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  318. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  319. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  320. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  321. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  322. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  323. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  324. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  325. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  326. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  327. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  328. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  329. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  330. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  331. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  332. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  333. data/db/migrate/20251015000000_add_structured_data_type_name_to_revisions.rb +5 -0
  334. data/db/migrate/20251029142849_convert_legacy_social_embeds_to_unified_social_embed.rb +38 -0
  335. data/db/migrate/20251119083347_fix_main_storyline_positions.rb +16 -0
  336. data/db/migrate/20251119083348_ensure_scrolled_entries_have_excursion_storyline.rb +15 -0
  337. data/db/migrate/20260303000000_add_layout_version_to_revisions.rb +6 -0
  338. data/db/migrate/20260323000000_create_comment_threads_and_comments.rb +30 -0
  339. data/db/migrate/20260414000000_add_subject_range_to_comment_threads.rb +5 -0
  340. data/db/migrate/20260415000000_add_section_perma_id_to_comment_threads.rb +5 -0
  341. data/db/migrate/20260727000000_add_quote_to_comments.rb +5 -0
  342. data/db/migrate/20260728000000_create_file_folders.rb +17 -0
  343. data/db/migrate/20260805000000_add_attribute_translations_to_sites.rb +5 -0
  344. data/db/migrate/20260806000000_add_edited_at_to_comments.rb +5 -0
  345. data/db/migrate/20260810000000_create_pageflow_scrolled_lottie_files.rb +24 -0
  346. data/db/migrate/20260817000000_create_comment_thread_reads.rb +16 -0
  347. data/db/migrate/20260819000000_add_unread_comments_since_at_to_users.rb +18 -0
  348. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +12599 -5398
  349. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +1275 -4560
  350. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +20204 -22
  351. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +18657 -19
  352. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  353. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  354. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  355. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  356. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  357. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  358. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  359. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  360. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  361. data/entry_types/scrolled/app/assets/stylesheets/pageflow_scrolled/ui.scss +2 -0
  362. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  363. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +35 -5
  364. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +4 -5
  365. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +23 -2
  366. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +3 -3
  367. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +8 -5
  368. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +7 -3
  369. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +72 -10
  370. data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +28 -13
  371. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +41 -12
  372. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +23 -25
  373. data/entry_types/scrolled/app/helpers/pageflow_scrolled/sprockets_helper.rb +16 -0
  374. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +189 -3
  375. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  376. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +61 -7
  377. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file.rb +6 -0
  378. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file_url_templates.rb +16 -0
  379. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  380. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +20 -1
  381. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  382. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  383. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +15 -12
  384. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +45 -17
  385. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  386. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +34 -5
  387. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +1 -1
  388. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  389. data/entry_types/scrolled/config/configuration_schemas/pageflow-scrolled.json +414 -0
  390. data/entry_types/scrolled/config/locales/de.yml +1094 -78
  391. data/entry_types/scrolled/config/locales/en.yml +1083 -78
  392. data/entry_types/scrolled/config/routes.rb +18 -8
  393. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  394. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  395. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  396. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  397. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  398. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +2 -2
  399. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  400. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +67 -10
  401. data/entry_types/scrolled/lib/pageflow_scrolled/configuration_schemas.rb +91 -0
  402. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  403. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +2 -1
  404. data/entry_types/scrolled/lib/pageflow_scrolled/entry_file_reference_locations.rb +71 -0
  405. data/entry_types/scrolled/lib/pageflow_scrolled/entry_structured_data_types/faq_page.rb +58 -0
  406. data/entry_types/scrolled/lib/pageflow_scrolled/file_reference_locations.rb +69 -0
  407. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +222 -19
  408. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +2 -4
  409. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +76 -54
  410. data/entry_types/scrolled/lib/pageflow_scrolled/theme_options_default_scale.rb +35 -0
  411. data/entry_types/scrolled/lib/pageflow_scrolled.rb +14 -1
  412. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +24 -5
  413. data/entry_types/scrolled/package/config/configurationSchemas.js +70 -0
  414. data/entry_types/scrolled/package/config/rollup/configurationSchemas.js +19 -0
  415. data/entry_types/scrolled/package/config/webpack.js +94 -0
  416. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  417. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1795 -0
  418. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.css +1 -0
  419. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.js +219 -0
  420. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.css +1 -0
  421. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.js +244 -0
  422. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.css +1 -0
  423. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.js +823 -0
  424. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  425. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +109 -0
  426. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.css +1 -0
  427. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.js +277 -0
  428. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.css +1 -0
  429. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.js +244 -0
  430. data/entry_types/scrolled/package/contentElements-editor.js +3155 -583
  431. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  432. data/entry_types/scrolled/package/contentElements-frontend.js +3375 -1585
  433. data/entry_types/scrolled/package/editor.css +1 -0
  434. data/entry_types/scrolled/package/editor.js +8452 -2867
  435. data/entry_types/scrolled/package/entryState.js +1600 -0
  436. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-20c600de.js +1979 -0
  437. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-58189220.js +2538 -0
  438. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-035a99fa.js} +9 -15
  439. data/entry_types/scrolled/package/frontend/PhonePlatformContext-9da43797.js +33 -0
  440. data/entry_types/scrolled/package/frontend/Placeholder.module-bf0966b4.js +5267 -0
  441. data/entry_types/scrolled/package/frontend/Placeholder.module-d22a9335.js +4180 -0
  442. data/entry_types/scrolled/package/frontend/ThemeIcon-ab834849.js +754 -0
  443. data/entry_types/scrolled/package/frontend/ThemeIcon-f6cb3a8f.js +773 -0
  444. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-30fd1124.js +39 -0
  445. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-61c25224.js +72 -0
  446. data/entry_types/scrolled/package/frontend/Viewer-1074fd59.js +147 -0
  447. data/entry_types/scrolled/package/frontend/Viewer-1482ca34.js +480 -0
  448. data/entry_types/scrolled/package/frontend/Viewer-70504231.js +210 -0
  449. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-cc8d4072.js} +100 -135
  450. data/entry_types/scrolled/package/frontend/Wavesurfer-656e3c36.js +302 -0
  451. data/entry_types/scrolled/package/frontend/Wavesurfer-b753b838.js +385 -0
  452. data/entry_types/scrolled/package/frontend/commenting.css +1 -0
  453. data/entry_types/scrolled/package/frontend/extensions-167ae143.js +1455 -0
  454. data/entry_types/scrolled/package/frontend/extensions-2318f92b.js +5918 -0
  455. data/entry_types/scrolled/package/frontend/extensions-a461fd13.js +4890 -0
  456. data/entry_types/scrolled/package/frontend/extensions-c98269fd.js +1982 -0
  457. data/entry_types/scrolled/package/frontend/i18n-493cd2a6.js +93 -0
  458. data/entry_types/scrolled/package/frontend/i18n-e06cac14.js +100 -0
  459. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-2e5546f7.js} +39 -54
  460. data/entry_types/scrolled/package/frontend/index-de2b418d.js +130 -0
  461. data/entry_types/scrolled/package/frontend/index.css +1 -1
  462. data/entry_types/scrolled/package/frontend/index.js +1976 -1367
  463. data/entry_types/scrolled/package/frontend/inlineEditing.css +1 -0
  464. data/entry_types/scrolled/package/frontend/useContentElementEditorState-a084912e.js +25 -0
  465. data/entry_types/scrolled/package/frontend/useDelayedBoolean-a387d85b.js +24 -0
  466. data/entry_types/scrolled/package/frontend/usePhonePlatform-4ecb96d4.js +8 -0
  467. data/entry_types/scrolled/package/frontend/usePhonePlatform-ce9ff08d.js +8 -0
  468. data/entry_types/scrolled/package/frontend-server.js +20 -210
  469. data/entry_types/scrolled/package/package.json +22 -12
  470. data/entry_types/scrolled/package/review.css +1 -0
  471. data/entry_types/scrolled/package/review.js +3306 -0
  472. data/entry_types/scrolled/package/testHelpers.js +952 -239
  473. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  474. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  475. data/entry_types/scrolled/package/widgets/consentBar.js +275 -315
  476. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  477. data/entry_types/scrolled/package/widgets/defaultNavigation.js +961 -432
  478. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  479. data/entry_types/scrolled/package/widgets/excursionSheet.js +225 -0
  480. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  481. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +62 -32
  482. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  483. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +67 -0
  484. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  485. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +100 -0
  486. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  487. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +48 -26
  488. data/entry_types/scrolled/package/widgets-server.js +2 -0
  489. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  490. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  491. data/entry_types/scrolled/spec/factories/lottie_files.rb +29 -0
  492. data/entry_types/scrolled/spec/fixtures/animation.lottie +0 -0
  493. data/entry_types/scrolled/spec/fixtures/font.woff +0 -0
  494. data/entry_types/scrolled/spec/fixtures/font.woff2 +0 -0
  495. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  496. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  497. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  498. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  499. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  500. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  501. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  502. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  503. data/lib/generators/pageflow/resque/resque_generator.rb +4 -4
  504. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  505. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  506. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  507. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  508. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  509. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  510. data/lib/pageflow/ability_mixin.rb +25 -15
  511. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  512. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  513. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  514. data/lib/pageflow/additional_headers.rb +27 -0
  515. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  516. data/lib/pageflow/admin/tabs.rb +1 -1
  517. data/lib/pageflow/built_in_file_type.rb +1 -1
  518. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  519. data/lib/pageflow/built_in_widget_type.rb +2 -2
  520. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  521. data/lib/pageflow/configuration.rb +183 -18
  522. data/lib/pageflow/cutoff_modes.rb +39 -0
  523. data/lib/pageflow/deprecation.rb +19 -0
  524. data/lib/pageflow/editor_controller.rb +6 -10
  525. data/lib/pageflow/engine.rb +5 -6
  526. data/lib/pageflow/entries_controller_env_helper.rb +32 -2
  527. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  528. data/lib/pageflow/entry_export_import/entry_serialization.rb +9 -8
  529. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  530. data/lib/pageflow/entry_export_import/page_type_versions.rb +2 -2
  531. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +11 -1
  532. data/lib/pageflow/entry_export_import/revision_serialization.rb +3 -0
  533. data/lib/pageflow/entry_export_import.rb +3 -3
  534. data/lib/pageflow/entry_structured_data_types.rb +43 -0
  535. data/lib/pageflow/entry_type_configuration.rb +1 -0
  536. data/lib/pageflow/entry_types.rb +2 -2
  537. data/lib/pageflow/feature.rb +1 -1
  538. data/lib/pageflow/features.rb +4 -6
  539. data/lib/pageflow/file_importers.rb +4 -4
  540. data/lib/pageflow/file_type.rb +5 -5
  541. data/lib/pageflow/file_types.rb +4 -4
  542. data/lib/pageflow/global_config_api.rb +5 -6
  543. data/lib/pageflow/help_entries.rb +7 -7
  544. data/lib/pageflow/help_entry.rb +1 -1
  545. data/lib/pageflow/hooks.rb +1 -1
  546. data/lib/pageflow/nested_revision_component.rb +9 -27
  547. data/lib/pageflow/news_item_api.rb +1 -1
  548. data/lib/pageflow/oembed_providers.rb +42 -0
  549. data/lib/pageflow/page_type.rb +2 -3
  550. data/lib/pageflow/page_types.rb +3 -3
  551. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  552. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  553. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  554. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  555. data/lib/pageflow/plugin.rb +1 -2
  556. data/lib/pageflow/primary_domain_entry_redirect.rb +6 -0
  557. data/lib/pageflow/quota.rb +9 -5
  558. data/lib/pageflow/quotas.rb +1 -1
  559. data/lib/pageflow/rails_version.rb +14 -2
  560. data/lib/pageflow/react.rb +1 -1
  561. data/lib/pageflow/revision_component.rb +8 -40
  562. data/lib/pageflow/revision_components.rb +16 -6
  563. data/lib/pageflow/seeds.rb +12 -16
  564. data/lib/pageflow/theme.rb +1 -1
  565. data/lib/pageflow/theme_customizations.rb +10 -10
  566. data/lib/pageflow/themes.rb +44 -3
  567. data/lib/pageflow/user_mixin.rb +18 -6
  568. data/lib/pageflow/version.rb +1 -1
  569. data/lib/pageflow/widget_type.rb +4 -4
  570. data/lib/pageflow/widget_types.rb +9 -9
  571. data/lib/pageflow/zencoder_api.rb +32 -42
  572. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  573. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  574. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  575. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  576. data/lib/pageflow.rb +8 -2
  577. data/lib/tasks/pageflow_tasks.rake +1 -1
  578. data/package/config/eslint-rules/documented-in-toc.js +125 -0
  579. data/package/config/jest/index.js +0 -1
  580. data/package/config/webpack.js +0 -1
  581. data/package/config/webpack5.js +0 -1
  582. data/package/editor.js +4880 -2313
  583. data/package/frontend.js +710 -1223
  584. data/package/package.json +3 -1
  585. data/package/review.js +384 -0
  586. data/package/testHelpers.js +257 -243
  587. data/package/ui.js +1487 -813
  588. data/package/vendor/stubs/wysihtml5.js +2 -0
  589. data/spec/factories/accounts.rb +37 -22
  590. data/spec/factories/audio_files.rb +2 -2
  591. data/spec/factories/authentication_tokens.rb +4 -4
  592. data/spec/factories/chapters.rb +4 -4
  593. data/spec/factories/comment_thread_reads.rb +10 -0
  594. data/spec/factories/comment_threads.rb +10 -0
  595. data/spec/factories/comments.rb +9 -0
  596. data/spec/factories/draft_entries.rb +14 -6
  597. data/spec/factories/edit_locks.rb +1 -1
  598. data/spec/factories/entries.rb +28 -19
  599. data/spec/factories/entry_translation_groups.rb +6 -0
  600. data/spec/factories/file_folders.rb +8 -0
  601. data/spec/factories/file_usages.rb +2 -1
  602. data/spec/factories/folders.rb +1 -1
  603. data/spec/factories/image_files.rb +2 -2
  604. data/spec/factories/pages.rb +3 -3
  605. data/spec/factories/published_entries.rb +28 -8
  606. data/spec/factories/revisions.rb +1 -1
  607. data/spec/factories/sites.rb +6 -0
  608. data/spec/factories/test_multi_attachment_files.rb +1 -1
  609. data/spec/factories/text_track_files.rb +1 -1
  610. data/spec/factories/uploadable_files.rb +1 -1
  611. data/spec/factories/users.rb +6 -6
  612. data/spec/factories/video_files.rb +2 -2
  613. data/spec/factories/widgets.rb +1 -1
  614. data/spec/fixtures/7x15_rotated.jpg +0 -0
  615. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  616. metadata +266 -92
  617. data/app/assets/stylesheets/pageflow/editor/select_button.scss +0 -51
  618. data/config/initializers/revision_components.rb +0 -5
  619. data/config/locales/twitter_to_x.de.yml +0 -6
  620. data/config/locales/twitter_to_x.en.yml +0 -6
  621. data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +0 -55
  622. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  623. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  624. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  625. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  626. data/entry_types/scrolled/package/frontend/EditableInlineText.module-ebd22921.js +0 -5497
  627. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  628. data/entry_types/scrolled/package/frontend/Viewer-1ecf3375.js +0 -154
  629. data/entry_types/scrolled/package/frontend/Wavesurfer-7d9cf1b7.js +0 -333
  630. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  631. data/entry_types/scrolled/package/frontend/components-024a9893.js +0 -2853
  632. data/entry_types/scrolled/package/frontend/createSuper-d0f30da3.js +0 -115
  633. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
  634. data/entry_types/scrolled/package/frontend/useContentElementEditorState-4f4c3cf6.js +0 -52
  635. data/lib/generators/pageflow/resque/templates/resque_enqueue_after_commit_patch.rb +0 -25
  636. data/package/vendor/jquery.minicolors.js +0 -1108
@@ -4,9 +4,9 @@ module PageflowScrolled
4
4
  include Pageflow::RenderJsonHelper
5
5
  include PageflowScrolled::EntryJsonSeedHelper
6
6
 
7
- def render_scrolled_entry(entry)
7
+ def render_scrolled_entry(entry, options = {})
8
8
  seed_json = render_json do |json|
9
- scrolled_entry_json_seed(json, entry)
9
+ scrolled_entry_json_seed(json, entry, options)
10
10
  end
11
11
 
12
12
  ReactServerSideRenderingHelper.renderer.render('Root', "{seed: #{seed_json}}", {})
@@ -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
 
@@ -0,0 +1,16 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ module SprocketsHelper
4
+ def scrolled_sprockets_asset_tags(entry, entry_mode:)
5
+ tags = []
6
+
7
+ if Pageflow.config_for(entry).include_legacy_frontend_javascript
8
+ tags << javascript_include_tag('pageflow_scrolled/legacy')
9
+ end
10
+
11
+ tags << stylesheet_link_tag('pageflow_scrolled/ui', media: 'all') if entry_mode != :published
12
+
13
+ safe_join(tags)
14
+ end
15
+ end
16
+ end
@@ -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
@@ -30,6 +32,7 @@ module PageflowScrolled
30
32
  ].flatten
31
33
 
32
34
  content_tag('style', raw(<<~CSS), data: {theme: ''})
35
+ #{scrolled_theme_font_face_rules(theme)}
33
36
  :root {
34
37
  #{declarations.join("\n")}
35
38
  }
@@ -39,6 +42,23 @@ module PageflowScrolled
39
42
  CSS
40
43
  end
41
44
 
45
+ def scrolled_theme_font_face_rules(theme)
46
+ scrolled_theme_font_faces(theme).filter_map(&:generate).join("\n")
47
+ end
48
+
49
+ def scrolled_theme_font_preload_link_tags(theme)
50
+ safe_join(
51
+ scrolled_theme_font_faces(theme).filter_map(&:preload_source).map do |source|
52
+ tag.link(rel: 'preload',
53
+ as: 'font',
54
+ type: source[:type],
55
+ href: source[:url],
56
+ crossorigin: 'anonymous',
57
+ data: {theme: ''})
58
+ end
59
+ )
60
+ end
61
+
42
62
  def scrolled_theme_typography_rules(theme)
43
63
  RuleSet.new(prefix: 'typography').generate(theme.options.fetch(:typography, {}))
44
64
  end
@@ -50,6 +70,159 @@ module PageflowScrolled
50
70
 
51
71
  private
52
72
 
73
+ def scrolled_theme_font_faces(theme)
74
+ theme.options.fetch(:font_faces, []).map do |face|
75
+ FontFaceRule.new(face, theme:) { |path| scrolled_theme_asset_path(theme, path) }
76
+ end
77
+ end
78
+
79
+ # @api private
80
+ class FontFaceRule
81
+ FORMATS = {
82
+ '.woff2' => 'woff2',
83
+ '.woff' => 'woff',
84
+ '.ttf' => 'truetype',
85
+ '.otf' => 'opentype'
86
+ }.freeze
87
+
88
+ MIME_TYPES = {
89
+ 'woff2' => 'font/woff2',
90
+ 'woff' => 'font/woff',
91
+ 'truetype' => 'font/ttf',
92
+ 'opentype' => 'font/otf'
93
+ }.freeze
94
+
95
+ WEIGHT_PATTERN = /\A(normal|bold|\d{1,4}( \d{1,4})?)\z/
96
+ STYLE_PATTERN = /\A(normal|italic)\z/
97
+ FORMAT_PATTERN = /\A(woff2?|truetype|opentype|embedded-opentype|svg)(-variations)?\z/
98
+ UNICODE_RANGE_PATTERN = /\A\s*U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?
99
+ (\s*,\s*U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?)*\s*\z/xi
100
+
101
+ # Quotes and backslashes would allow breaking out of the quoted
102
+ # strings family names and urls are interpolated into.
103
+ UNSAFE_IN_FAMILY = /["'\\[[:cntrl:]]]/
104
+ UNSAFE_IN_URL = /["'\\\s]/
105
+
106
+ ABSOLUTE_URL = %r{\A((https?:)?//|/|data:)}
107
+
108
+ def initialize(face, theme:, &resolve_path)
109
+ @face = face
110
+ @theme = theme
111
+ @resolve_path = resolve_path
112
+ end
113
+
114
+ def generate
115
+ return unless valid?
116
+
117
+ <<~CSS
118
+ @font-face {
119
+ #{declarations.join("\n ")}
120
+ }
121
+ CSS
122
+ end
123
+
124
+ # Only the first source is preloaded since the browser downloads
125
+ # exactly one of the alternative formats.
126
+ def preload_source
127
+ return unless valid? && face[:preload]
128
+
129
+ source = sources_with_safe_urls.first
130
+
131
+ {url: source[:url], type: mime_type(source)}
132
+ end
133
+
134
+ private
135
+
136
+ attr_reader :face, :theme
137
+
138
+ def valid?
139
+ family.present? && sources_with_safe_urls.any?
140
+ end
141
+
142
+ def declarations
143
+ [
144
+ %(font-family: "#{family}";),
145
+ "src: #{source_values.join(', ')};",
146
+ 'font-display: swap;',
147
+ *descriptors
148
+ ]
149
+ end
150
+
151
+ def family
152
+ @family ||= face[:family].to_s.gsub(UNSAFE_IN_FAMILY, '').strip
153
+ end
154
+
155
+ def source_values
156
+ sources_with_safe_urls.map { |source| source_value(source) }
157
+ end
158
+
159
+ def sources_with_safe_urls
160
+ @sources_with_safe_urls ||= sources.reject { |source| source[:url].match?(UNSAFE_IN_URL) }
161
+ end
162
+
163
+ def sources
164
+ if face[:file_role]
165
+ sources_from_files
166
+ else
167
+ sources_from_src
168
+ end
169
+ end
170
+
171
+ def sources_from_files
172
+ Array(face[:file_role]).compact.filter_map do |role|
173
+ url = theme.files.dig(role.to_sym, :original)
174
+ {url: url.to_s, format: face[:format]} if url
175
+ end
176
+ end
177
+
178
+ def sources_from_src
179
+ Array(face[:src]).filter_map do |src|
180
+ src = {url: src} unless src.is_a?(Hash)
181
+ next if src[:url].blank?
182
+
183
+ {url: resolve_url(src[:url]), format: src.fetch(:format, face[:format])}
184
+ end
185
+ end
186
+
187
+ def resolve_url(url)
188
+ return url.to_s if url.to_s.match?(ABSOLUTE_URL)
189
+
190
+ @resolve_path.call(url).to_s
191
+ end
192
+
193
+ def source_value(source)
194
+ format = source_format(source)
195
+
196
+ return %(url("#{source[:url]}")) unless format
197
+
198
+ %(url("#{source[:url]}") format("#{format}"))
199
+ end
200
+
201
+ def mime_type(source)
202
+ MIME_TYPES[source_format(source).to_s.delete_suffix('-variations')]
203
+ end
204
+
205
+ def source_format(source)
206
+ [source[:format], FORMATS[extension(source[:url])]].find do |candidate|
207
+ candidate.to_s.match?(FORMAT_PATTERN)
208
+ end
209
+ end
210
+
211
+ def extension(url)
212
+ File.extname(url.split(/[?#]/).first.to_s).downcase
213
+ end
214
+
215
+ def descriptors
216
+ [
217
+ ['font-weight', face[:weight], WEIGHT_PATTERN],
218
+ ['font-style', face[:style], STYLE_PATTERN],
219
+ ['unicode-range', face[:unicode_range], UNICODE_RANGE_PATTERN]
220
+ ].filter_map do |property, value, pattern|
221
+ "#{property}: #{value.to_s.strip};" if value.to_s.match?(pattern)
222
+ end
223
+ end
224
+ end
225
+
53
226
  BREAKPOINTS = {
54
227
  sm: '640px',
55
228
  md: '768px',
@@ -81,8 +254,8 @@ module PageflowScrolled
81
254
  private
82
255
 
83
256
  def extract_breakpoint_declarations!(declarations)
84
- BREAKPOINTS.keys.each_with_object({}) { |breakpoint_name, result|
85
- result[breakpoint_name] = declarations.delete(breakpoint_name)
257
+ BREAKPOINTS.keys.to_h { |breakpoint_name|
258
+ [breakpoint_name, declarations.delete(breakpoint_name)]
86
259
  }.compact
87
260
  end
88
261
 
@@ -108,6 +281,7 @@ module PageflowScrolled
108
281
 
109
282
  def selector(rule_name)
110
283
  return ':root' if rule_name == :root
284
+
111
285
  ".#{@prefix}-#{rule_name.to_s.camelize(:lower)}"
112
286
  end
113
287
  end
@@ -122,5 +296,17 @@ module PageflowScrolled
122
296
  end
123
297
  end
124
298
  end
299
+
300
+ def extract_theme_directory_from_scrolled_theme_asset_path(theme, path)
301
+ if path.starts_with?('../shared/')
302
+ ['shared', path.sub('../shared/', '')]
303
+ elsif path.starts_with?('../')
304
+ raise(ArgumentError,
305
+ 'Upward navigation to other directory than the shared ' \
306
+ 'theme directory not allowed in theme asset path.')
307
+ else
308
+ [theme.name, path]
309
+ end
310
+ end
125
311
  end
126
312
  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)
@@ -21,15 +33,16 @@ module PageflowScrolled
21
33
 
22
34
  # @api private
23
35
  class Batch
24
- def initialize(section, items)
36
+ def initialize(section, items, comment_thread_subject_ranges: nil)
25
37
  @section = section
26
38
  @storyline = section.chapter.storyline
27
39
  @items = items
40
+ @comment_thread_subject_ranges = comment_thread_subject_ranges
28
41
  end
29
42
 
30
43
  def save!
31
44
  ContentElement.transaction do
32
- @items.map.with_index { |item, index|
45
+ result = @items.map.with_index { |item, index|
33
46
  if item[:_delete]
34
47
  @section.content_elements.delete(item[:id])
35
48
  nil
@@ -37,6 +50,10 @@ module PageflowScrolled
37
50
  create_or_update(item, index)
38
51
  end
39
52
  }.compact
53
+
54
+ update_subject_ranges
55
+ reconcile_section_perma_ids
56
+ result
40
57
  end
41
58
  end
42
59
 
@@ -48,11 +65,48 @@ module PageflowScrolled
48
65
  position: index
49
66
  }.merge(item.slice(:type_name, :configuration))
50
67
 
51
- if item[:id]
52
- @storyline.content_elements.update(item[:id], attributes)
53
- else
54
- @section.content_elements.create(attributes)
55
- end
68
+ content_element = if item[:id]
69
+ @storyline.content_elements.update(item[:id], attributes)
70
+ else
71
+ @section.content_elements.create(attributes)
72
+ end
73
+
74
+ migrate_comment_threads(content_element, item[:migrate_comment_threads])
75
+ content_element
76
+ end
77
+
78
+ def migrate_comment_threads(content_element, thread_ids)
79
+ Pageflow::CommentThread.migrate_to_subject(
80
+ revision: @storyline.revision,
81
+ subject_type: 'ContentElement',
82
+ subject_id: content_element.perma_id,
83
+ thread_ids:
84
+ )
85
+ end
86
+
87
+ def update_subject_ranges
88
+ return if @comment_thread_subject_ranges.blank?
89
+
90
+ Pageflow::CommentThread.update_subject_ranges_for(
91
+ revision: @storyline.revision,
92
+ subject_type: 'ContentElement',
93
+ subject_id: @section.content_elements.pluck(:perma_id),
94
+ ranges: @comment_thread_subject_ranges
95
+ )
96
+ end
97
+
98
+ # A comment thread's section follows its content element. Reconcile
99
+ # the section perma id of threads on this section's content elements
100
+ # so threads stay relocatable to the right section once their
101
+ # content element is deleted — e.g. after a content element was
102
+ # moved here from another section.
103
+ def reconcile_section_perma_ids
104
+ Pageflow::CommentThread.update_section_perma_id_for(
105
+ revision: @storyline.revision,
106
+ subject_type: 'ContentElement',
107
+ subject_id: @section.content_elements.pluck(:perma_id),
108
+ section_perma_id: @section.perma_id
109
+ )
56
110
  end
57
111
  end
58
112
  end
@@ -0,0 +1,6 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ class LottieFile < Pageflow::ApplicationRecord
4
+ include Pageflow::UploadableFile
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ class LottieFileUrlTemplates
4
+ def call
5
+ {
6
+ original: Pageflow::UrlTemplate.from_attachment(example_file.attachment, :original)
7
+ }
8
+ end
9
+
10
+ private
11
+
12
+ def example_file
13
+ @example_file ||= LottieFile.new(id: 0, file_name: ':basename.:extension')
14
+ end
15
+ end
16
+ end
@@ -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,24 @@ 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
+ create!(revision: draft, position: 1)
38
+ end
39
+
40
+ private
41
+
42
+ def sections_before(section)
43
+ section ? sections[0...sections.index(section)] : sections
44
+ end
45
+
46
+ def cutoff_section
47
+ sections.find_by_perma_id(revision.configuration['cutoff_section_perma_id'])
48
+ end
30
49
  end
31
50
  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
@@ -1,4 +1,4 @@
1
- <%= cache_scrolled_entry(entry: entry, widget_scope: widget_scope) do %>
1
+ <%= cache_scrolled_entry(entry: entry, entry_mode: entry_mode) do %>
2
2
  <!DOCTYPE html>
3
3
  <%= content_tag(:html, lang: entry.locale, dir: text_direction(entry.locale)) do %>
4
4
  <head>
@@ -6,20 +6,26 @@
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">
10
+ <% if seed_options[:load_commenting] %>
11
+ <%= csrf_meta_tags %>
12
+ <% end %>
9
13
 
10
14
  <%= social_share_meta_tags_for(entry) %>
11
15
  <%= meta_tags_for_entry(entry) %>
16
+ <%= hreflang_link_tags_for_entry(entry) unless local_assigns[:skip_hreflang_link_tags] %>
12
17
  <%= feed_link_tags_for_entry(entry) unless local_assigns[:skip_feed_link_tags] %>
13
18
 
14
- <%= scrolled_favicons_for_entry(entry, entry_mode: widget_scope) %>
19
+ <%= scrolled_favicons_for_entry(entry, entry_mode: entry_mode) %>
15
20
 
16
- <%= javascript_include_tag 'pageflow_scrolled/legacy' %>
17
- <%= scrolled_frontend_stylesheet_packs_tag(entry, widget_scope: widget_scope) %>
21
+ <%= scrolled_sprockets_asset_tags(entry, entry_mode: entry_mode) %>
22
+ <%= scrolled_frontend_stylesheet_packs_tag(entry, entry_mode: entry_mode, seed_options: seed_options) %>
18
23
 
24
+ <%= scrolled_theme_font_preload_link_tags(entry.theme) %>
19
25
  <%= scrolled_theme_properties_style_tag(entry.theme) %>
20
26
  <%= scrolled_theme_stylesheet_pack_tags(entry.theme) %>
21
27
 
22
- <%= render_widget_head_fragments(entry, scope: widget_scope) %>
28
+ <%= render_widget_head_fragments(entry, scope: entry_mode) %>
23
29
 
24
30
  <% if Rails.env.development? %>
25
31
  <script>
@@ -33,11 +39,8 @@
33
39
  </script>
34
40
  <% end %>
35
41
 
36
- <% ssr_html = local_assigns[:skip_ssr] ? '' : render_scrolled_entry(entry) %>
42
+ <% ssr_html = local_assigns[:skip_ssr] ? '' : render_scrolled_entry(entry, seed_options) %>
37
43
 
38
- <% if !local_assigns[:skip_ssr] && (params[:frontend] == 'v2' || entry.feature_state('frontend_v2')) %>
39
- <%= generated_media_queries_tags_for(ssr_html) %>
40
- <% end %>
41
44
  </head>
42
45
  <body>
43
46
  <%= structured_data_for_entry(entry) unless local_assigns[:skip_structured_data] %>
@@ -48,13 +51,13 @@
48
51
  <div id="root"><%= ssr_html %></div>
49
52
 
50
53
  <div id='template-widget-container'>
51
- <%= render_widgets(entry, scope: widget_scope, insert_point: :bottom_of_entry) %>
54
+ <%= render_widgets(entry, scope: entry_mode, insert_point: :bottom_of_entry) %>
52
55
  </div>
53
56
 
54
57
  <%= scrolled_webpack_public_path_script_tag %>
55
- <%= scrolled_frontend_javascript_packs_tag(entry, widget_scope: widget_scope) %>
58
+ <%= scrolled_frontend_javascript_packs_tag(entry, entry_mode: entry_mode) %>
56
59
 
57
- <%= scrolled_entry_json_seed_script_tag(entry, local_assigns[:seed_options] || {}) %>
60
+ <%= scrolled_entry_json_seed_script_tag(entry, seed_options) %>
58
61
  </body>
59
62
  <% end %>
60
63
  <% end %>