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
@@ -1,25 +1,35 @@
1
1
  PageflowScrolled::Engine.routes.draw do
2
2
  scope module: 'editor' do
3
3
  shallow do
4
- resources :chapters do
4
+ # Legacy path to support editor sessions that span the deploy that
5
+ # introduces the storylines resource above.
6
+ resources :chapters, only: [:create] do
5
7
  collection do
6
8
  put :order
7
9
  end
10
+ end
8
11
 
9
- resources :sections do
12
+ resources :storylines, only: [] do
13
+ resources :chapters, only: [:create, :update, :destroy] do
10
14
  collection do
11
15
  put :order
12
16
  end
13
17
 
14
- member do
15
- post :duplicate
16
- end
17
-
18
- resources :content_elements do
18
+ resources :sections, only: [:create, :update, :destroy] do
19
19
  collection do
20
- put :batch
21
20
  put :order
22
21
  end
22
+
23
+ member do
24
+ post :duplicate
25
+ end
26
+
27
+ resources :content_elements, only: [:create, :update, :destroy] do
28
+ collection do
29
+ put :batch
30
+ put :order
31
+ end
32
+ end
23
33
  end
24
34
  end
25
35
  end
@@ -11,10 +11,10 @@ module PageflowScrolled
11
11
  def initializer
12
12
  inject_into_file('config/initializers/pageflow.rb',
13
13
  after: "Pageflow.configure do |config|\n") do
14
- " config.plugin(PageflowScrolled.plugin)\n\n" \
15
- " config.for_entry_type(PageflowScrolled.entry_type) do |entry_type_config|\n" \
16
- " entry_type_config.plugin(ScrolledThemesPlugin.new)\n" \
17
- " end\n\n"
14
+ " config.plugin(PageflowScrolled.plugin)\n\n " \
15
+ "config.for_entry_type(PageflowScrolled.entry_type) do |entry_type_config|\n " \
16
+ "entry_type_config.plugin(ScrolledThemesPlugin.new)\n " \
17
+ "end\n\n"
18
18
  end
19
19
  end
20
20
 
@@ -30,11 +30,11 @@ module PageflowScrolled
30
30
  end
31
31
 
32
32
  def install_packages
33
- run 'yarn add css-loader style-loader' \
34
- ' mini-css-extract-plugin css-minimizer-webpack-plugin' \
35
- ' postcss postcss-preset-env postcss-loader' \
36
- ' postcss-import postcss-url postcss-flexbugs-fixes' \
37
- ' @fontsource/source-sans-pro'
33
+ run 'yarn add css-loader style-loader ' \
34
+ 'mini-css-extract-plugin css-minimizer-webpack-plugin ' \
35
+ 'postcss postcss-preset-env postcss-loader ' \
36
+ 'postcss-import postcss-url postcss-flexbugs-fixes ' \
37
+ '@fontsource/source-sans-pro'
38
38
  end
39
39
 
40
40
  def webpack_config
@@ -76,7 +76,7 @@ module PageflowScrolled
76
76
  module: {
77
77
  rules: [
78
78
  {
79
- test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg|mp3)$/,
79
+ test: /\\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg|mp3)$/,
80
80
  type: 'asset/resource'
81
81
  }
82
82
  ]
@@ -128,7 +128,7 @@ module PageflowScrolled
128
128
  def server_pack
129
129
  create_file 'app/javascript/packs/pageflow-scrolled-server.js', <<-JS
130
130
  import 'pageflow-scrolled/frontend-server';
131
- import 'pageflow-scrolled/contentElements-frontend';
131
+ import 'pageflow-scrolled/contentElements-server';
132
132
  import 'pageflow-scrolled/widgets-server';
133
133
  JS
134
134
  end
@@ -0,0 +1,56 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 20.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 -50 951.9 338.9" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill:#fff;}
7
+ .st1{fill:#fff;stroke:#fff;}
8
+ </style>
9
+ <title>Element 1</title>
10
+ <g id="Ebene_2">
11
+ <g id="Ebene_1-2">
12
+ <path class="st0" d="M106.3,238.9l-86.7-86.7C-3.7,129-2,105.3,3.4,89.5c3.8-10.6,9.7-20.2,17.4-28.4l6.5,6.5
13
+ C20.5,74.8,15.3,83.4,12,92.8c-6.6,19.3-1.8,37.1,14,52.9l80.2,80.2l39.1-39.1l6.5,6.5L106.3,238.9z"/>
14
+ <path class="st0" d="M104.2,234.5c-23.2-23.2-21.8-46.8-16.5-62.4c3.6-10.5,9.4-20,17-28.1l42.3-42.3l6.5,6.5l-42.3,42.3
15
+ c-6.6,7.2-11.7,15.7-14.9,24.9c-6.3,19-1.5,36.8,14.3,52.6L104.2,234.5z"/>
16
+ <path class="st0" d="M61.3,193.9c-23.2-23.2-21.8-46.8-16.5-62.4c3.6-10.5,9.4-20,17-28.1l84-84l6.5,6.5l-84,84
17
+ c-6.6,7.2-11.7,15.7-14.9,24.9c-6.4,19.1-1.5,36.8,14.4,52.7L61.3,193.9z"/>
18
+ <path class="st0" d="M151.6,110.1l-6.5-6.5c6.7-7.2,11.8-15.7,15-25c6.4-19.1,1.6-36.9-14.3-52.7S112.1,5.4,92.6,12.2
19
+ C83.1,15.7,74.4,21,67,27.8L25.1,69.7l-6.5-6.5l41.9-41.9c8.3-7.8,18.1-13.8,28.8-17.7c16-5.6,39.9-7.5,63.1,15.8
20
+ s21.7,46.8,16.4,62.5C165.1,92.4,159.2,102,151.6,110.1z"/>
21
+ <path class="st0" d="M151.2,194l-6.5-6.5l3.2,3.2l-3.3-3.2c6.5-7.1,11.5-15.5,14.6-24.6c6.2-18.9,1.3-36.5-14.6-52.4l6.5-6.5
22
+ c23.2,23.2,21.9,46.6,16.8,62.1C164.5,176.5,158.7,186,151.2,194z"/>
23
+ <path class="st0" d="M102.2,69.6"/>
24
+ <path class="st0" d="M106.8,224.7"/>
25
+ <path class="st1" d="M239.2,70.9c0-1.8,0.9-2.8,2.7-2.8h24.5c14.1,0,24.3,9.2,24.3,23.7s-10.2,24.1-24.3,24.1H247V144
26
+ c0.2,1.4-0.8,2.6-2.2,2.8c-0.2,0-0.3,0-0.5,0H242c-1.8,0-2.7-1-2.7-2.8L239.2,70.9z M265.4,109c10.5,0,17.4-6.4,17.4-17.1
27
+ s-6.8-16.8-17.2-16.8H247V109H265.4z"/>
28
+ <path class="st1" d="M326.5,70.4c0.3-1.4,1.6-2.3,3-2.2h3.7c1.4-0.1,2.7,0.9,3,2.2l27.1,73.2c0.6,2-0.2,3.2-2.2,3.2h-2.5
29
+ c-1.5,0.1-2.8-0.8-3.1-2.2l-8.4-22.8h-31.5l-8.3,22.8c-0.3,1.4-1.7,2.4-3.1,2.2h-2.4c-2.1,0-2.9-1.2-2.4-3.2L326.5,70.4z
30
+ M344.9,115l-10.4-28.5c-1.2-3.7-2.9-10.3-2.9-10.3h-0.2c0,0-1.8,6.6-3,10.3L317.8,115H344.9z"/>
31
+ <path class="st1" d="M449.2,130.2c-1.9,6.2-16.6,18-32.8,18c-21.6,0-38.6-17.4-38.6-40.6c0-22.9,17-40.7,39.7-40.7
32
+ c13.4,0,22.5,5.2,25.9,7.5c1.1,0.6,1.5,2.1,0.9,3.2c-0.1,0.2-0.3,0.4-0.4,0.6l-1,1.4c-0.6,1.2-2.1,1.6-3.3,1
33
+ c-0.2-0.1-0.3-0.2-0.5-0.3c-6.4-4-13.7-6.2-21.3-6.2c-19,0-31.9,14.7-31.9,33.2c0,19.2,13.3,33.6,31.2,33.6
34
+ c15.8,0,24.9-11.5,24.9-11.5v-13.2h-19.6c-1.5,0-2.8-1.3-2.8-2.8V112c0-1.5,1.3-2.8,2.8-2.8h24.1c1.5,0,2.7,1.2,2.7,2.7
35
+ c0,0,0,0,0,0L449.2,130.2"/>
36
+ <path class="st1" d="M474.2,70.9c0-1.8,0.9-2.8,2.7-2.8h38.8c1.4-0.2,2.6,0.9,2.8,2.3c0,0.2,0,0.4,0,0.5v1.3
37
+ c0.2,1.4-0.9,2.6-2.3,2.8c-0.2,0-0.4,0-0.5,0h-33.8v28.7H509c1.8,0,2.8,0.9,2.8,2.7v1.4c0.2,1.4-0.9,2.6-2.3,2.8
38
+ c-0.2,0-0.4,0-0.5,0h-27.1v29.2h35.8c1.4-0.2,2.6,0.9,2.8,2.3c0,0.2,0,0.4,0,0.5v1.3c0.2,1.4-0.9,2.6-2.3,2.8c-0.2,0-0.4,0-0.5,0
39
+ h-40.9c-1.8,0-2.7-1-2.7-2.8L474.2,70.9z"/>
40
+ <path class="st1" d="M543.5,70.9c0-1.8,0.9-2.8,2.7-2.8h35.9c1.4-0.2,2.6,0.9,2.8,2.3c0,0.2,0,0.4,0,0.5v1.3
41
+ c0.2,1.4-0.9,2.6-2.3,2.8c-0.2,0-0.4,0-0.5,0h-30.9v29.6h26.2c1.3-0.2,2.5,0.7,2.7,2c0,0.2,0,0.5,0,0.7v1.4c0,1.8-0.9,2.8-2.7,2.8
42
+ h-26.2V144c0.2,1.4-0.8,2.6-2.2,2.8c-0.2,0-0.3,0-0.5,0h-2.3c-1.8,0-2.7-1-2.7-2.8V70.9z"/>
43
+ <path class="st1" d="M606.6,70.9c0-1.8,0.9-2.8,2.7-2.8h2.3c1.4-0.1,2.6,0.9,2.7,2.3c0,0.2,0,0.3,0,0.5v68.9H648
44
+ c1.4-0.2,2.6,0.9,2.8,2.3c0,0.2,0,0.4,0,0.5v1.3c0.2,1.4-0.9,2.6-2.3,2.8c-0.2,0-0.4,0-0.5,0h-38.7c-1.8,0-2.7-1-2.7-2.8
45
+ L606.6,70.9z"/>
46
+ <path class="st1" d="M699.6,66.8c23.1,0,40.1,17.6,40.1,40.2c0,23.1-17,41.2-40.1,41.2S659.5,130,659.5,107
47
+ C659.5,84.4,676.6,66.8,699.6,66.8z M699.6,140.9c18.5,0,32-14.8,32-33.9c0-18.7-13.5-32.9-32-32.9s-32,14.2-32,32.9
48
+ C667.6,126.1,681.2,140.9,699.6,140.9z"/>
49
+ <path class="st1" d="M756.7,71.2c-0.5-1.9,0.5-3,2.5-3h2.5c1.5-0.1,2.8,1,3,2.5l14.7,58.7c1,4,1.8,8.4,1.8,8.4h0.2
50
+ c0,0,0.8-4.4,1.9-8.4l16.3-58.8c0.3-1.4,1.6-2.4,3-2.3h2.6c1.5-0.1,2.8,0.9,3,2.3l16.1,58.8c0.8,2.8,1.5,5.6,2,8.4h0.2
51
+ c0,0,0.7-4.4,1.7-8.4l15.3-58.7c0.2-1.5,1.5-2.5,3-2.5h2.5c1.9,0,2.9,1.1,2.3,3l-19.5,73.3c-0.3,1.5-1.6,2.5-3.1,2.4h-4.2
52
+ c-1.5,0.1-2.8-0.9-3.1-2.4l-14.5-53c-1.5-5-2.8-11.8-2.8-11.8h-0.3c0,0-1.3,6.7-2.8,11.8l-14.7,53c-0.3,1.4-1.6,2.4-3,2.4h-4.4
53
+ c-1.5,0.1-2.8-1-3-2.5L756.7,71.2z"/>
54
+ </g>
55
+ </g>
56
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 20.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="-50 -50 272.07254 338.90793" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill:#fff;}
7
+ </style>
8
+ <title>Pageflow</title>
9
+ <path class="st0" d="M106.3,238.9l-86.7-86.7C-3.7,129-2,105.3,3.4,89.5c3.8-10.6,9.7-20.2,17.4-28.4l6.5,6.5
10
+ C20.5,74.8,15.3,83.4,12,92.8c-6.6,19.3-1.8,37.1,14,52.9l80.2,80.2l39.1-39.1l6.5,6.5L106.3,238.9z"/>
11
+ <path class="st0" d="M104.2,234.5c-23.2-23.2-21.8-46.8-16.5-62.4c3.6-10.5,9.4-20,17-28.1l42.3-42.3l6.5,6.5l-42.3,42.3
12
+ c-6.6,7.2-11.7,15.7-14.9,24.9c-6.3,19-1.5,36.8,14.3,52.6L104.2,234.5z"/>
13
+ <path class="st0" d="M61.3,193.9c-23.2-23.2-21.8-46.8-16.5-62.4c3.6-10.5,9.4-20,17-28.1l84-84l6.5,6.5l-84,84
14
+ c-6.6,7.2-11.7,15.7-14.9,24.9c-6.4,19.1-1.5,36.8,14.4,52.7L61.3,193.9z"/>
15
+ <path class="st0" d="M151.6,110.1l-6.5-6.5c6.7-7.2,11.8-15.7,15-25c6.4-19.1,1.6-36.9-14.3-52.7S112.1,5.4,92.6,12.2
16
+ C83.1,15.7,74.4,21,67,27.8L25.1,69.7l-6.5-6.5l41.9-41.9c8.3-7.8,18.1-13.8,28.8-17.7c16-5.6,39.9-7.5,63.1,15.8
17
+ s21.7,46.8,16.4,62.5C165.1,92.4,159.2,102,151.6,110.1z"/>
18
+ <path class="st0" d="M151.2,194l-6.5-6.5l3.2,3.2l-3.3-3.2c6.5-7.1,11.5-15.5,14.6-24.6c6.2-18.9,1.3-36.5-14.6-52.4l6.5-6.5
19
+ c23.2,23.2,21.9,46.6,16.8,62.1C164.5,176.5,158.7,186,151.2,194z"/>
20
+ <path class="st0" d="M102.2,69.6"/>
21
+ <path class="st0" d="M106.8,224.7"/>
22
+ </svg>
@@ -9,17 +9,32 @@ class ScrolledThemesPlugin
9
9
  widget: '"Source Sans Pro", sans-serif'
10
10
  },
11
11
  custom_theme_icons: <%= @custom_theme_icons %>,
12
- colors: {
13
- accent: '#e10028',
14
- widget: {
15
- surface: '#fff',
16
- on_surface: '#000',
17
- primary: '#00375a',
18
- on_primary: '#fff',
19
- secondary: '#c2c2c2',
20
- on_seconday: '#000',
21
- background: 'rgba(255, 255, 255, 0.95)',
22
- on_background: '#000'
12
+ properties: {
13
+ root: {
14
+ accent_color: '#e10028',
15
+ widget_surface_color: '#fff',
16
+ widget_on_surface_color: '#000',
17
+ widget_primary_color: '#00375a',
18
+ widget_on_primary_color: '#fff',
19
+ widget_secondary_color: '#c2c2c2',
20
+ widget_on_seconday_color: '#000',
21
+ widget_background_color: 'rgb(255 255 255 / .95)',
22
+ widget_on_background_color: '#000',
23
+ },
24
+
25
+ dark: {
26
+ accent_color: '#ff8097',
27
+ widget_surface_color: '#000',
28
+ widget_surface_backdrop_blur: '5px',
29
+ widget_surface_opacity: '70%',
30
+ widget_on_surface_color: '#eee',
31
+ widget_primary_color: '#fff',
32
+ widget_on_primary_color: '#000',
33
+ widget_background_color: 'rgb(0 0 0 / .65)',
34
+ widget_background_backdrop_blur: '5px',
35
+ widget_on_background_color: '#eee',
36
+ default_navigation_separator_color: 'rgb(255 255 255 / .1)',
37
+ default_navigation_progress_bar_background_color: 'rgb(0 0 0 / .5)',
23
38
  }
24
39
  },
25
40
  logo_alt_text: 'Pageflow',
@@ -8,8 +8,14 @@ module PageflowScrolled
8
8
 
9
9
  # content_element_type_names option only takes effect for frontend
10
10
  # packs.
11
- def register(path, content_element_type_names: [])
12
- @packs << AdditionalPack.new(path, content_element_type_names)
11
+ def register(path, content_element_type_names: [], stylesheet: false, if: nil, unless: nil)
12
+ @packs << AdditionalPack.new(
13
+ path,
14
+ content_element_type_names,
15
+ stylesheet,
16
+ binding.local_variable_get(:if),
17
+ binding.local_variable_get(:unless)
18
+ )
13
19
  end
14
20
 
15
21
  # @api private
@@ -20,19 +26,32 @@ module PageflowScrolled
20
26
  end
21
27
 
22
28
  # @api private
23
- def paths
24
- @packs.map(&:path)
29
+ def paths(entry)
30
+ packs_matching_conditions(entry).map(&:path)
25
31
  end
26
32
 
27
33
  # @api private
28
- def paths_for_content_element_types(type_names)
29
- @packs.reject { |pack|
34
+ def stylesheet_paths(entry)
35
+ packs_matching_conditions(entry).select(&:stylesheet).map(&:path)
36
+ end
37
+
38
+ # @api private
39
+ def paths_for_content_element_types(entry, type_names)
40
+ packs_matching_conditions(entry).reject { |pack|
30
41
  pack.content_element_type_names.present? &&
31
- (pack.content_element_type_names & type_names).empty?
42
+ !pack.content_element_type_names.intersect?(type_names)
32
43
  }.map(&:path)
33
44
  end
34
45
 
35
46
  # @api private
36
- AdditionalPack = Struct.new(:path, :content_element_type_names)
47
+ AdditionalPack = Struct.new(:path, :content_element_type_names, :stylesheet, :if, :unless)
48
+
49
+ private
50
+
51
+ def packs_matching_conditions(entry)
52
+ @packs
53
+ .select { |pack| !pack.if || pack.if.call(entry:) }
54
+ .select { |pack| !pack.unless || !pack.unless.call(entry:) }
55
+ end
37
56
  end
38
57
  end
@@ -19,8 +19,8 @@ module PageflowScrolled
19
19
 
20
20
  # @api private
21
21
  def for(entry, request, options = {})
22
- items_for_entry(entry, options).each_with_object({}) do |item, result|
23
- result[item.name] = item.callable.call(entry: entry, request: request, foo: 1)
22
+ items_for_entry(entry, options).to_h do |item|
23
+ [item.name, item.callable.call(entry:, request:, foo: 1)]
24
24
  end
25
25
  end
26
26
 
@@ -0,0 +1,27 @@
1
+ module PageflowScrolled
2
+ # Register additional theme customization files that shall be
3
+ # included in theme assets seed data.
4
+ class AdditionalThemeAssets
5
+ # @api private
6
+ def initialize
7
+ @assets = []
8
+ end
9
+
10
+ # Register additional theme customization files and specify style
11
+ # that shall be used.
12
+ def register(theme_file_role:, theme_file_style: :resized)
13
+ @assets << AdditionalThemeAsset.new(
14
+ theme_file_role,
15
+ theme_file_style
16
+ )
17
+ end
18
+
19
+ # @api private
20
+ def each(&)
21
+ @assets.each(&)
22
+ end
23
+
24
+ # @api private
25
+ AdditionalThemeAsset = Struct.new(:theme_file_role, :theme_file_style)
26
+ end
27
+ end
@@ -10,7 +10,7 @@ module PageflowScrolled
10
10
  # @example
11
11
  #
12
12
  # config.additional_frontend_packs.register(
13
- # pageflow-scrolled/contentElements/some-pack',
13
+ # 'pageflow-scrolled/contentElements/some-pack',
14
14
  # content_element_type_names: ['someType']
15
15
  # )
16
16
  #
@@ -23,7 +23,7 @@ module PageflowScrolled
23
23
  # @example
24
24
  #
25
25
  # config.additional_editor_packs.register(
26
- # pageflow-scrolled/contentElements/some-pack'
26
+ # 'pageflow-scrolled/contentElements/some-pack'
27
27
  # )
28
28
  #
29
29
  # @return [AdditionalPacks]
@@ -36,14 +36,45 @@ module PageflowScrolled
36
36
  # @example
37
37
  #
38
38
  # config.additional_frontend_seed_data.register(
39
- # pageflow-scrolled/contentElements/some-pack',
40
- # ->(entry, request) { {some: 'data'}}
39
+ # 'someData',
40
+ # ->(entry:, request:, **) { {some: 'data'}}
41
41
  # )
42
42
  #
43
43
  # @return [AdditionalSeedData]
44
44
  # @since 15.7
45
45
  attr_reader :additional_frontend_seed_data
46
46
 
47
+ # Include paths of additional theme customization files in theme
48
+ # assets seed data.
49
+ #
50
+ # @example
51
+ #
52
+ # config.additional_theme_assets.register(theme_file_role: :footer_logo)
53
+ #
54
+ # @return [AdditionalThemeAssets]
55
+ # @since 17.1
56
+ attr_reader :additional_theme_assets
57
+
58
+ # Paths or globs of JSON files to read configuration schemas
59
+ # from. Schemas describe the shape of configuration data of content
60
+ # elements, sections and other models. Used to find file references
61
+ # without going through the editor.
62
+ #
63
+ # @example
64
+ #
65
+ # config.configuration_schema_load_path += Dir[
66
+ # MyEngine.root.join('config', 'configuration_schemas', '*.json').to_s
67
+ # ]
68
+ #
69
+ # @return [Array<String>]
70
+ # @since 17.2
71
+ attr_accessor :configuration_schema_load_path
72
+
73
+ # @api private
74
+ def configuration_schemas
75
+ @configuration_schemas ||= ConfigurationSchemas.load(configuration_schema_load_path)
76
+ end
77
+
47
78
  # Determine which vendors a content element will require consent
48
79
  # for. Based on the vendor name returned here, the following
49
80
  # translations will be used in consent UI components.
@@ -69,18 +100,32 @@ module PageflowScrolled
69
100
  # @since 16.1
70
101
  attr_reader :content_element_consent_vendors
71
102
 
72
- # Mapping from URL hosts to consent vendor names. Used for iframe
73
- # embed opt-in.
103
+ # Mapping from URL host+path patterns to consent vendor names.
104
+ # Used for iframe embed opt-in.
74
105
  #
75
106
  # @exmaple
76
107
  #
77
- # entry_type_config.consent_vendor_host_matchers = {
78
- # /\.some-vendor\.com$/ => 'someVendor'
108
+ # entry_type_config.consent_vendor_url_matchers = {
109
+ # /\.some-vendor\.com\// => 'someVendor',
110
+ # /google\.com\/maps\/embed/ => 'googleMaps'
79
111
  # }
80
112
  #
81
113
  # @return [Hash<RegExp, String>]
114
+ # @since 17.2
115
+ attr_accessor :consent_vendor_url_matchers
116
+
117
+ # @deprecated Use {#consent_vendor_url_matchers=} instead.
118
+ # Rewrites trailing `$` in patterns to `/` and merges
119
+ # into {#consent_vendor_url_matchers}.
82
120
  # @since 16.1
83
- attr_accessor :consent_vendor_host_matchers
121
+ def consent_vendor_host_matchers=(matchers)
122
+ rewritten = matchers.transform_keys do |key|
123
+ source = key.source.sub(/\$$/, '/')
124
+ Regexp.new(source, key.options)
125
+ end
126
+
127
+ @consent_vendor_url_matchers.merge!(rewritten)
128
+ end
84
129
 
85
130
  # Migrate typography variants to palette colors. Before palette
86
131
  # colors for text blocks and headings were introduced, it was
@@ -136,16 +181,28 @@ module PageflowScrolled
136
181
  # @since 16.1
137
182
  attr_accessor :legacy_typography_variants
138
183
 
184
+ # Whether to include the legacy JavaScript Sprockets asset
185
+ # (`pageflow_scrolled/legacy`) in the head of published entries and
186
+ # previews. Defaults to `true`. Set to `false` once no code relies
187
+ # on the legacy bundle anymore.
188
+ #
189
+ # @since 17.2
190
+ attr_accessor :include_legacy_frontend_javascript
191
+
139
192
  def initialize(*)
140
193
  super
141
194
  @additional_frontend_packs = AdditionalPacks.new
142
195
  @additional_editor_packs = AdditionalPacks.new
143
196
 
144
197
  @additional_frontend_seed_data = AdditionalSeedData.new
198
+ @additional_theme_assets = AdditionalThemeAssets.new
199
+ @configuration_schema_load_path = []
145
200
  @content_element_consent_vendors = ContentElementConsentVendors.new
146
- @consent_vendor_host_matchers = {}
201
+ @consent_vendor_url_matchers = {}
147
202
 
148
203
  @legacy_typography_variants = {}
204
+
205
+ @include_legacy_frontend_javascript = true
149
206
  end
150
207
  end
151
208
  end
@@ -0,0 +1,91 @@
1
+ module PageflowScrolled
2
+ # Look up schemas describing the shape of configuration data by the
3
+ # subject they apply to.
4
+ class ConfigurationSchemas
5
+ # Read schemas from JSON files. Each file contains either a single
6
+ # schema or an array of schemas.
7
+ #
8
+ # @param load_path [Array<String>] Paths or globs of JSON files.
9
+ #
10
+ # @api private
11
+ def self.load(load_path)
12
+ new(load_path.flat_map { |path| Dir[path] }.uniq.sort.flat_map { |file| documents_in(file) })
13
+ end
14
+
15
+ # Configuration objects are rebuilt for each request, so parsing
16
+ # results outlive them.
17
+ #
18
+ # @api private
19
+ def self.documents_in(file)
20
+ mtime = File.mtime(file)
21
+ cached_mtime, documents = cache[file]
22
+
23
+ return documents if cached_mtime == mtime
24
+
25
+ cache[file] = [mtime, Array.wrap(JSON.parse(File.read(file)))]
26
+ cache[file].last
27
+ end
28
+
29
+ # @api private
30
+ def self.cache
31
+ @cache ||= {}
32
+ end
33
+
34
+ # @api private
35
+ def initialize(documents)
36
+ @documents = documents
37
+ end
38
+
39
+ # @api private
40
+ def find(model:, type_name: nil)
41
+ by_subject[[model, type_name]]
42
+ end
43
+
44
+ # @api private
45
+ def find_by_id(id)
46
+ by_id[id]
47
+ end
48
+
49
+ # @api private
50
+ def type_names(model:)
51
+ by_subject.keys.filter_map { |subject_model, type_name| type_name if subject_model == model }
52
+ end
53
+
54
+ private
55
+
56
+ def by_subject
57
+ @by_subject ||= @documents.each_with_object({}) do |document, result|
58
+ subject = document['x-subject']
59
+ next unless subject
60
+
61
+ key = [subject['model'], subject['typeName']]
62
+ result[key] = result.key?(key) ? merge(result[key], document) : document
63
+ end
64
+ end
65
+
66
+ def merge(document, other)
67
+ document.merge(other) do |key, value, other_value|
68
+ if %w[properties $defs].include?(key)
69
+ merge_disjoint(value, other_value, key)
70
+ else
71
+ other_value
72
+ end
73
+ end
74
+ end
75
+
76
+ def merge_disjoint(value, other_value, key)
77
+ duplicates = value.keys & other_value.keys
78
+
79
+ if duplicates.any?
80
+ raise(ArgumentError,
81
+ "Conflicting #{key} in configuration schemas: #{duplicates.join(', ')}")
82
+ end
83
+
84
+ value.merge(other_value)
85
+ end
86
+
87
+ def by_id
88
+ @by_id ||= @documents.index_by { |document| document['$id'] }
89
+ end
90
+ end
91
+ end
@@ -23,7 +23,7 @@ module PageflowScrolled
23
23
  next unless @callables[content_element.type_name]
24
24
 
25
25
  result[content_element.id] = @callables[content_element.type_name].call(
26
- entry: entry,
26
+ entry:,
27
27
  configuration: content_element.configuration
28
28
  )
29
29
  }.compact
@@ -21,7 +21,8 @@ module PageflowScrolled
21
21
  config.i18n.load_path += Dir[config.root.join('config', 'locales', '**', '*.yml').to_s]
22
22
 
23
23
  initializer 'pageflow_scrolled.assets.precompile' do |app|
24
- app.config.assets.precompile += %w[pageflow_scrolled/legacy.js]
24
+ app.config.assets.precompile += %w[pageflow_scrolled/legacy.js
25
+ pageflow_scrolled/ui.css]
25
26
  end
26
27
  end
27
28
  end
@@ -0,0 +1,71 @@
1
+ module PageflowScrolled
2
+ # Describe the places where the configurations of an entry can
3
+ # reference files.
4
+ #
5
+ # @api private
6
+ class EntryFileReferenceLocations
7
+ def initialize(entry_config, content_elements, include_unused: false)
8
+ @entry_config = entry_config
9
+ @content_elements = content_elements
10
+ @include_unused = include_unused
11
+ end
12
+
13
+ def content_element_locations
14
+ content_element_type_names.each_with_object({}) do |type_name, result|
15
+ schema = schemas.find(model: 'contentElement', type_name:)
16
+
17
+ if schema
18
+ result[type_name] = locations.for(schema)
19
+ else
20
+ log_missing_schema(type_name)
21
+ end
22
+ end
23
+ end
24
+
25
+ def section_locations
26
+ locations_for(model: 'section')
27
+ end
28
+
29
+ def entry_locations
30
+ locations_for(model: 'entry')
31
+ end
32
+
33
+ private
34
+
35
+ def locations_for(model:)
36
+ schema = schemas.find(model:)
37
+
38
+ unless schema
39
+ raise("Missing configuration schema for #{model}. Configuration schemas are " \
40
+ 'generated by the JavaScript build or by running ' \
41
+ 'yarn build-configuration-schemas inside the scrolled package.')
42
+ end
43
+
44
+ locations.for(schema)
45
+ end
46
+
47
+ # Content elements of any type can be added in the editor without
48
+ # reloading the seed.
49
+ def content_element_type_names
50
+ if @include_unused
51
+ schemas.type_names(model: 'contentElement')
52
+ else
53
+ @content_elements.map(&:type_name).uniq
54
+ end
55
+ end
56
+
57
+ def log_missing_schema(type_name)
58
+ return unless @entry_config.features.enabled?('file_rights_from_references')
59
+
60
+ Rails.logger.warn("Missing configuration schema for content element type '#{type_name}'")
61
+ end
62
+
63
+ def schemas
64
+ @schemas ||= @entry_config.configuration_schemas
65
+ end
66
+
67
+ def locations
68
+ @locations ||= FileReferenceLocations.new(schemas)
69
+ end
70
+ end
71
+ end