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
@@ -120,6 +120,20 @@ module Pageflow
120
120
  # @return [fileImporters]
121
121
  attr_reader :file_importers
122
122
 
123
+ # Used to register different structured data types for entries.
124
+ #
125
+ # @example
126
+ #
127
+ # config.entry_structured_data_types.register(:about_page, lambda do |entry|
128
+ # {
129
+ # '@type' => 'AboutPage',
130
+ # breadcrumb: entry.configuration['breadcrumb']
131
+ # }
132
+ # end)
133
+ #
134
+ # @return [EntryStructuredDataTypes]
135
+ attr_reader :entry_structured_data_types
136
+
123
137
  # Used to add new sections to the help dialog displayed in the
124
138
  # editor.
125
139
  #
@@ -187,8 +201,8 @@ module Pageflow
187
201
  attr_accessor :public_entry_request_scope
188
202
 
189
203
  # Either a lambda or an object with a `call` method taking an
190
- # {Entry} record and an {ActionDispatch::Request} object and
191
- # returning `nil` or a path to redirect to. Can be used in
204
+ # {PublishedEntry} record and an {ActionDispatch::Request} object
205
+ # and returning `nil` or a path to redirect to. Can be used in
192
206
  # conjuction with {PrimaryDomainEntryRedirect} to make sure
193
207
  # entries are accessed via their account's configured cname.
194
208
  #
@@ -208,18 +222,76 @@ module Pageflow
208
222
  # @return [String]
209
223
  attr_accessor :public_entry_cache_control_header
210
224
 
225
+ # Provide additional response headers for published entries.
226
+ #
227
+ # @example
228
+ #
229
+ # config.additional_public_entry_headers.register(
230
+ # {'Some' => 'value'}
231
+ # )
232
+ #
233
+ # config.additional_public_entry_headers.register(
234
+ # lambda do |_entry, request|
235
+ # {'Some' => request.headers['Other']}
236
+ # end
237
+ # )
238
+ #
239
+ # @return [AdditionalHeaders]
240
+ # @since 17.1
241
+ attr_reader :additional_public_entry_headers
242
+
211
243
  # Either a lambda or an object with a `call` method taking a
212
244
  # {Site} as paramater and returing a hash of options used to
213
- # construct the url of a published entry.
245
+ # construct the url of a site.
246
+ #
247
+ # Can be used to change the host of the url under which entries
248
+ # and feeds are available.
249
+ #
250
+ # If the option is not set, public_entry_url_options is used as a
251
+ # fallback.
252
+ #
253
+ # Example:
254
+ #
255
+ # config.site_url_options = lambda do |site|
256
+ # {host: "#{site.account.name}.example.com"}
257
+ # end
258
+ attr_accessor :site_url_options
259
+
260
+ # Either a hash, a lambda or an object with a `call` method
261
+ # returing a hash of options used to construct the url of a
262
+ # published entry.
214
263
  #
215
264
  # Can be used to change the host of the url under which entries
216
265
  # are available.
217
266
  #
267
+ # If site_url_options is blank, the lambda receives a {Site} as
268
+ # parameter. This case is only supported for legacy reasons.
269
+ # Prefer setting site_url_options instead.
270
+ #
218
271
  # Example:
219
272
  #
220
273
  # config.public_entry_url_options = lambda do |site|
221
274
  # {host: "#{site.account.name}.example.com"}
222
275
  # end
276
+ #
277
+ # If both site_url_options and public_entry_url_options are
278
+ # present, public_entry_url_options is called exclusively to
279
+ # construct url options for public entries. The lambda then
280
+ # receives a {PublishedEntry} to allow for entry specific url
281
+ # options.
282
+ #
283
+ # Example:
284
+ #
285
+ # config.site_url_options = lambda do |site|
286
+ # {host: "#{site.account.name}.example.com"}
287
+ # end
288
+ #
289
+ # config.public_entry_url_options = lambda do |entry|
290
+ # {
291
+ # host: "#{entry.site.account.name}.example.com",
292
+ # some_entry_specific_param: entry.id
293
+ # }
294
+ # end
223
295
  attr_accessor :public_entry_url_options
224
296
 
225
297
  # Either a lambda or an object with a `call` method taking a
@@ -227,6 +299,23 @@ module Pageflow
227
299
  # construct the embed url of a published entry.
228
300
  attr_accessor :entry_embed_url_options
229
301
 
302
+ # Define strategies to determine whether entries should be cut off
303
+ # (e.g., to preview paywalled premium content).
304
+ #
305
+ # @example
306
+ #
307
+ # config.cutoff_modes.register(
308
+ # 'subscription_header',
309
+ # lambda do |_entry, request|
310
+ # # Set by some proxy handling user authentication
311
+ # request.headers['X-Subscription'] != 'Premium'
312
+ # end
313
+ # )
314
+ #
315
+ # @return [CutoffModes]
316
+ # @since 17.1
317
+ attr_reader :cutoff_modes
318
+
230
319
  # Either a lambda or an object with a `call` method taking a hash
231
320
  # of theme option overrides and an {EntryAtRevision} and returning
232
321
  # a transformed hash of overrides. Can be used to filter overrides
@@ -239,6 +328,14 @@ module Pageflow
239
328
  # files based on feature flags and other entry or account traits.
240
329
  attr_accessor :transform_theme_customization_files
241
330
 
331
+ # Where to redirect after creating an entry.
332
+ #
333
+ # Possible values:
334
+ #
335
+ # `:admin`: Go to entry admin page (default)
336
+ # `:editor`: Open created entry in editor
337
+ attr_accessor :after_entry_create_redirect_to
338
+
242
339
  # Submit video/audio encoding jobs only after the user has
243
340
  # explicitly confirmed in the editor. Can either be set to a
244
341
  # boolean or a lambda that is passed the file and returns a
@@ -324,8 +421,7 @@ module Pageflow
324
421
  # If you set these to <tt>nil</tt> or <tt>""</tt> the meta tag won't be included.
325
422
  # @since 0.10
326
423
  attr_accessor :default_keywords_meta_tag
327
- attr_accessor :default_author_meta_tag
328
- attr_accessor :default_publisher_meta_tag
424
+ attr_accessor :default_author_meta_tag, :default_publisher_meta_tag
329
425
 
330
426
  # Share provider defaults.
331
427
  #
@@ -381,6 +477,29 @@ module Pageflow
381
477
  # @since 12.2
382
478
  attr_accessor :news
383
479
 
480
+ # URL to a form that is used to translate an entry via an external service.
481
+ #
482
+ # @example
483
+ #
484
+ # config.entry_translator_url = lambda do |entry|
485
+ # Rails.application.routes.url_helpers.some_custom_route(entry)
486
+ # end
487
+ # @since 17.1
488
+ attr_accessor :entry_translator_url
489
+
490
+ # Registry for oEmbed providers that can be used to resolve URLs.
491
+ #
492
+ # @example
493
+ #
494
+ # config.oembed_providers.register(
495
+ # :bluesky,
496
+ # endpoint: 'https://bsky.app/oembed.{format}',
497
+ # url_patterns: ['https://bsky.app/profile/*/post/*']
498
+ # )
499
+ # @since 17.2
500
+ # @return [OembedProviders]
501
+ attr_reader :oembed_providers
502
+
384
503
  def initialize(target_type_name = nil)
385
504
  @target_type_name = target_type_name
386
505
 
@@ -418,6 +537,13 @@ module Pageflow
418
537
  @file_types = FileTypes.new
419
538
  @widget_types = WidgetTypes.new
420
539
  @file_importers = FileImporters.new
540
+ @entry_structured_data_types = EntryStructuredDataTypes.new
541
+ @entry_structured_data_types.register(:article, lambda do |_entry|
542
+ {
543
+ '@type' => 'Article',
544
+ articleSection: 'longform'
545
+ }
546
+ end, default: true)
421
547
  @help_entries = HelpEntries.new
422
548
  @revision_components = RevisionComponents.new
423
549
 
@@ -425,14 +551,16 @@ module Pageflow
425
551
  @css_rendered_thumbnail_styles = Defaults::CSS_RENDERED_THUMBNAIL_STYLES.dup
426
552
 
427
553
  @site_request_scope = CnameSiteRequestScope.new
428
- @public_entry_request_scope = lambda { |entries, request| entries }
429
- @public_entry_redirect = ->(_entry, _request) { nil }
430
- @public_entry_url_options = Pageflow::SitesHelper::DEFAULT_PUBLIC_ENTRY_OPTIONS
554
+ @public_entry_request_scope = ->(entries, _request) { entries }
555
+ @public_entry_redirect = ->(_entry, _request) {}
556
+ @additional_public_entry_headers = AdditionalHeaders.new
431
557
  @entry_embed_url_options = {protocol: 'https'}
558
+ @cutoff_modes = CutoffModes.new
432
559
 
433
560
  @transform_theme_customization_overrides = ->(overrides, _entry) { overrides }
434
561
  @transform_theme_customization_files = ->(files, _entry) { files }
435
562
 
563
+ @after_entry_create_redirect_to = :admin
436
564
  @confirm_encoding_jobs = false
437
565
  @default_published_until_duration_in_months = 12
438
566
 
@@ -442,7 +570,8 @@ module Pageflow
442
570
 
443
571
  @available_locales = [:en, :de]
444
572
  @available_public_locales = PublicI18n.available_locales
445
- @available_share_providers = [:email, :facebook, :linked_in, :twitter, :telegram, :whats_app]
573
+ @available_share_providers = [:email, :facebook, :linked_in, :bluesky, :threads, :twitter,
574
+ :telegram, :whats_app]
446
575
 
447
576
  @public_https_mode = :prevent
448
577
 
@@ -452,7 +581,7 @@ module Pageflow
452
581
 
453
582
  @default_share_providers = @available_share_providers
454
583
 
455
- @authorize_user_deletion = lambda { |_user| true }
584
+ @authorize_user_deletion = ->(_user) { true }
456
585
 
457
586
  @available_file_licenses = [
458
587
  :cc_by_4, :cc_by_sa_4, :cc_by_nc_4, :cc_by_nc_sa_4, :cc_by_nd_4, :cc_by_nc_nd_4
@@ -467,6 +596,13 @@ module Pageflow
467
596
  @permissions = Permissions.new
468
597
 
469
598
  @edit_lock_polling_interval = 15.seconds
599
+
600
+ @oembed_providers = OembedProviders.new
601
+ @oembed_providers.register(
602
+ :bluesky,
603
+ endpoint: 'https://embed.bsky.app/oembed',
604
+ url_patterns: ['https://bsky.app/profile/*/post/*']
605
+ )
470
606
  end
471
607
 
472
608
  # Activate a plugin.
@@ -489,18 +625,25 @@ module Pageflow
489
625
 
490
626
  # @deprecated Use `config.page_types.register` instead.
491
627
  def register_page_type(page_type)
492
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#register_page_type is deprecated. Use config.page_types.register instead.', caller)
628
+ Pageflow::Deprecation.warn(
629
+ 'Pageflow::Configuration#register_page_type is deprecated. ' \
630
+ 'Use config.page_types.register instead.'
631
+ )
493
632
  page_types.register(page_type)
494
633
  end
495
634
 
496
635
  # @deprecated Pageflow now supports direct uploads to S3 via signed post requests.
497
636
  # Please change your forms accordingly.
498
637
  def paperclip_filesystem_root
499
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller)
638
+ Pageflow::Deprecation.warn(
639
+ 'Pageflow::Configuration#paperclip_filesystem_root is deprecated.'
640
+ )
500
641
  end
501
642
 
502
643
  def paperclip_filesystem_root=(_val)
503
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller)
644
+ Pageflow::Deprecation.warn(
645
+ 'Pageflow::Configuration#paperclip_filesystem_root is deprecated.'
646
+ )
504
647
  end
505
648
 
506
649
  # Scope configuration to entries of a certain entry type or access
@@ -542,11 +685,27 @@ module Pageflow
542
685
  end
543
686
 
544
687
  # @api private
545
- def site_url_options(site)
546
- options = public_entry_url_options
688
+ def site_url_options_for(site)
689
+ options = site_url_options ||
690
+ public_entry_url_options ||
691
+ Pageflow::SitesHelper::DEFAULT_SITE_URL_OPTIONS
692
+
547
693
  options.respond_to?(:call) ? options.call(site) : options
548
694
  end
549
695
 
696
+ # @api private
697
+ def public_entry_url_options_for(entry)
698
+ return site_url_options_for(entry.site) unless public_entry_url_options
699
+
700
+ options = public_entry_url_options
701
+
702
+ if options.respond_to?(:call)
703
+ options.call(site_url_options ? entry : entry.site)
704
+ else
705
+ options
706
+ end
707
+ end
708
+
550
709
  # @api private
551
710
  def enable_features(names)
552
711
  features.enable(names, FeatureLevelConfiguration.new(self))
@@ -568,7 +727,13 @@ module Pageflow
568
727
  delegate :page_types, to: :config
569
728
  delegate :themes, to: :config
570
729
  delegate :widget_types, to: :config
730
+ delegate :entry_structured_data_types, to: :config
571
731
  delegate :public_entry_cache_control_header=, to: :config
732
+ delegate :additional_public_entry_headers, to: :config
733
+ delegate :cutoff_modes, to: :config
734
+ delegate :entry_translator_url=, to: :config
735
+ delegate :public_entry_redirect=, to: :config
736
+ delegate :public_entry_url_options=, to: :config
572
737
 
573
738
  delegate :for_entry_type, to: :config
574
739
  end
@@ -580,11 +745,11 @@ module Pageflow
580
745
  @entry_type_config = config.get_entry_type_config(entry_type)
581
746
  end
582
747
 
583
- def method_missing(method, *args)
748
+ def method_missing(method, *)
584
749
  if @config.respond_to?(method)
585
- @config.send(method, *args)
750
+ @config.send(method, *)
586
751
  elsif @entry_type_config.respond_to?(method)
587
- @entry_type_config.send(method, *args)
752
+ @entry_type_config.send(method, *)
588
753
  else
589
754
  super
590
755
  end
@@ -0,0 +1,39 @@
1
+ module Pageflow
2
+ # Register strategies to determine whether only the part of an entry
3
+ # before some cutoff point should be rendered (e.g., to preview
4
+ # paywalled premium content).
5
+ # @since 17.1
6
+ class CutoffModes
7
+ # @api private
8
+ def initialize
9
+ @modes = {}
10
+ end
11
+
12
+ # Register callable to determine whether only the part of an entry
13
+ # before some cutoff point should be rendered (e.g., to preview
14
+ # paywalled premium content). Cutoff modes can then be enabled per
15
+ # site.
16
+ #
17
+ # @param name [String]
18
+ # Referenced in sites.
19
+ # @param enabled [#call]
20
+ # Take {EntryAtRevision} and {ActionDispatch::Request} and
21
+ # return true if the entry shall be cut off.
22
+ def register(name, enabled)
23
+ @modes[name.to_s] = Mode.new(name, enabled)
24
+ end
25
+
26
+ # @api private
27
+ def enabled_for?(entry, request)
28
+ !!@modes[entry.site.cutoff_mode_name]&.enabled&.call(entry, request)
29
+ end
30
+
31
+ # @api private
32
+ def names
33
+ @modes.keys
34
+ end
35
+
36
+ # @api private
37
+ Mode = Struct.new(:name, :enabled)
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/deprecation'
4
+ require 'pageflow/version'
5
+
6
+ module Pageflow
7
+ # @api private
8
+ module Deprecation
9
+ module_function
10
+
11
+ def warn(message, callstack = nil)
12
+ deprecator.warn(message, callstack || caller_locations(2))
13
+ end
14
+
15
+ def deprecator
16
+ @deprecator ||= ActiveSupport::Deprecation.new(Pageflow::VERSION, 'Pageflow')
17
+ end
18
+ end
19
+ end
@@ -13,19 +13,15 @@ module Pageflow
13
13
  before_action :authenticate_user!
14
14
 
15
15
  before_action do
16
- begin
17
- @entry = DraftEntry.find(params[:entry_id])
18
- rescue ActiveRecord::RecordNotFound
19
- head :not_found
20
- end
16
+ @entry = DraftEntry.find(params[:entry_id])
17
+ rescue ActiveRecord::RecordNotFound
18
+ head :not_found
21
19
  end
22
20
 
23
21
  before_action do
24
- begin
25
- Ability.new(current_user).authorize!(:update, @entry.to_model)
26
- rescue CanCan::AccessDenied
27
- head :forbidden
28
- end
22
+ Ability.new(current_user).authorize!(:update, @entry.to_model)
23
+ rescue CanCan::AccessDenied
24
+ head :forbidden
29
25
  end
30
26
 
31
27
  before_action :verify_edit_lock
@@ -22,11 +22,10 @@ require 'jquery-layout-rails'
22
22
  require 'backbone-rails'
23
23
  require 'marionette-rails'
24
24
  require 'jquery-fileupload-rails'
25
- require 'jquery-minicolors-rails'
26
- require 'wysihtml/rails'
27
25
  require 'i18n-js'
28
26
  require 'http_accept_language'
29
27
  require 'pageflow-public-i18n'
28
+ require 'oembed'
30
29
 
31
30
  require 'pageflow_paged'
32
31
  require 'pageflow_scrolled'
@@ -35,8 +34,8 @@ require 'symmetric-encryption'
35
34
  require 'pageflow/rails_version'
36
35
 
37
36
  if Gem::Specification.find_all_by_name('pageflow-react', '>= 0.0').any?
38
- fail('The pageflow-react gem has been merged into the pageflow gem. ' \
39
- 'See the pageflow changelog for update instructions.')
37
+ raise('The pageflow-react gem has been merged into the pageflow gem. ' \
38
+ 'See the pageflow changelog for update instructions.')
40
39
  end
41
40
 
42
41
  module Pageflow
@@ -92,14 +91,14 @@ module Pageflow
92
91
 
93
92
  # Precompile additional assets.
94
93
  initializer 'pageflow.assets.precompile' do |app|
95
- app.config.assets.precompile += %w(
94
+ app.config.assets.precompile += %w[
96
95
  pageflow/application_with_simulated_media_queries.css
97
96
  pageflow/print_view.css
98
97
  pageflow/lt_ie9.js pageflow/lt_ie9.css pageflow/ie9.js pageflow/ie9.css
99
98
  pageflow/vendor.js
100
99
  pageflow/editor/vendor.js
101
100
  video-js.swf vjs.eot vjs.svg vjs.ttf vjs.woff
102
- )
101
+ ]
103
102
 
104
103
  app.config.assets.precompile << lambda do |path, _filename|
105
104
  Pageflow.config.themes.any? do |theme|
@@ -28,9 +28,39 @@ module Pageflow
28
28
  EntriesControllerEnvHelper.get_pageflow_hash(env)['entry_mode']
29
29
  end
30
30
 
31
+ # Returns `true` if the entry is being rendered as an embed. The
32
+ # information will be placed in the request env by the Pageflow
33
+ # engine before delegating to the entry type's frontend app.
34
+ #
35
+ # Use {EntriesControllerTestHelper} to set up the request
36
+ # environment in controller tests.
37
+ def get_embed_from_env(env = request.env)
38
+ EntriesControllerEnvHelper.get_pageflow_hash(env)['embed']
39
+ end
40
+
41
+ # Returns the locale of the signed in user, i.e. the locale any
42
+ # user interface displayed on top of the entry shall use. Returns
43
+ # `nil` for published entries since those are not rendered for a
44
+ # specific user. Entry types are expected to render the entry
45
+ # itself in the locale of the entry, no matter which locale is
46
+ # returned here.
47
+ #
48
+ # Use {EntriesControllerTestHelper} to set up the request
49
+ # environment in controller tests.
50
+ #
51
+ # @since 17.2
52
+ def get_ui_locale_from_env(env = request.env)
53
+ EntriesControllerEnvHelper.get_pageflow_hash(env)['ui_locale']
54
+ end
55
+
31
56
  # @api private
32
- def self.add_entry_info_to_env(env, entry:, mode: nil)
33
- env['pageflow'] = {'published_entry' => entry, 'entry_mode' => mode}
57
+ def self.add_entry_info_to_env(env, entry:, mode: nil, embed: false, ui_locale: nil)
58
+ env['pageflow'] = {
59
+ 'published_entry' => entry,
60
+ 'entry_mode' => mode,
61
+ 'embed' => embed,
62
+ 'ui_locale' => ui_locale
63
+ }
34
64
  end
35
65
 
36
66
  # @api private
@@ -36,7 +36,7 @@ module Pageflow
36
36
 
37
37
  def each_reusable_file(entry, &block)
38
38
  Pageflow.config.file_types.each do |file_type|
39
- file_type.model.where(entry: entry).each(&block)
39
+ file_type.model.where(entry:).each(&block)
40
40
  end
41
41
  end
42
42
 
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module EntryExportImport
3
+ # @api private
3
4
  module EntrySerialization
4
5
  extend self
5
6
 
@@ -13,10 +14,10 @@ module Pageflow
13
14
  # to prevent it from showing up in Active Admin JSON exports.
14
15
  # It is included separately as part of the entry export.
15
16
  'entry' => entry
16
- .as_json(except: [:folder_id, :password_digest, :users_count])
17
- .merge('features_configuration' => entry.features_configuration,
18
- 'draft' => RevisionSerialization.dump(entry.draft),
19
- 'last_publication' => dump_publication(publication))
17
+ .as_json(except: [:folder_id, :password_digest, :users_count])
18
+ .merge('features_configuration' => entry.features_configuration,
19
+ 'draft' => RevisionSerialization.dump(entry.draft),
20
+ 'last_publication' => dump_publication(publication))
20
21
  }
21
22
  end
22
23
 
@@ -50,18 +51,18 @@ module Pageflow
50
51
 
51
52
  def import_draft(entry_data, options, entry, file_mappings)
52
53
  RevisionSerialization.import(entry_data['draft'],
53
- entry: entry,
54
+ entry:,
54
55
  creator: options[:creator],
55
- file_mappings: file_mappings)
56
+ file_mappings:)
56
57
  end
57
58
 
58
59
  def import_last_publication(entry_data, options, entry, file_mappings)
59
60
  return unless entry_data['last_publication']
60
61
 
61
62
  RevisionSerialization.import(entry_data['last_publication'],
62
- entry: entry,
63
+ entry:,
63
64
  creator: options[:creator],
64
- file_mappings: file_mappings)
65
+ file_mappings:)
65
66
  end
66
67
  end
67
68
  end
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module EntryExportImport
3
+ # @api private
3
4
  class FileMappings
4
5
  def initialize
5
6
  @file_mappings = {}
@@ -7,8 +7,8 @@ module Pageflow
7
7
  class IncompatibleVersionsError < StandardError; end
8
8
 
9
9
  def dump
10
- Pageflow.config.page_types.each_with_object({}) do |page_type, version_requirements|
11
- version_requirements[page_type.name] = page_type.export_version
10
+ Pageflow.config.page_types.to_h do |page_type|
11
+ [page_type.name, page_type.export_version]
12
12
  end
13
13
  end
14
14
 
@@ -19,6 +19,7 @@ module Pageflow
19
19
 
20
20
  create_widgets(revision, data['widgets'])
21
21
  create_revision_components(revision, data['components'])
22
+ create_file_folders(revision, data['file_folders'])
22
23
  create_files(revision, data['file_usages'])
23
24
 
24
25
  revision
@@ -31,6 +32,7 @@ module Pageflow
31
32
 
32
33
  def create_revision(data)
33
34
  revision_attributes = data.except('storylines',
35
+ 'file_folders',
34
36
  'file_usages',
35
37
  'widgets',
36
38
  'components',
@@ -40,7 +42,7 @@ module Pageflow
40
42
  revision_attributes['theme_name'] = 'default'
41
43
  end
42
44
 
43
- entry.revisions.create!(revision_attributes.merge(creator: creator)) do |revision|
45
+ entry.revisions.create!(revision_attributes.merge(creator:)) do |revision|
44
46
  revision.published_until = Time.now if revision.published?
45
47
  end
46
48
  end
@@ -51,6 +53,14 @@ module Pageflow
51
53
  end
52
54
  end
53
55
 
56
+ # File usages refer to their folder by perma id, so folders have to
57
+ # exist before the usages which point at them are created.
58
+ def create_file_folders(revision, file_folders_data)
59
+ file_folders_data.each do |file_folder_data|
60
+ revision.file_folders.create!(file_folder_data.except(*DEFAULT_REMOVAL_COLUMNS))
61
+ end
62
+ end
63
+
54
64
  def create_revision_components(revision, revision_components_data)
55
65
  revision_components_data.each do |component_data|
56
66
  nested_compontents_data = component_data.delete('components')
@@ -10,6 +10,9 @@ module Pageflow
10
10
  widgets: {
11
11
  except: [:subject_id, :subject_type]
12
12
  },
13
+ file_folders: {
14
+ except: [:revision_id]
15
+ },
13
16
  file_usages: {
14
17
  except: [:revision_id],
15
18
  include: {
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module EntryExportImport
2
+ module EntryExportImport # rubocop:todo Style/Documentation
3
3
  extend self
4
4
 
5
5
  def export(entry, archive_file_path)
@@ -30,9 +30,9 @@ module Pageflow
30
30
  def extract_entry(archive, creator, file_mappings)
31
31
  archive.extract_to_tempfile('entry.json') do |tempfile|
32
32
  EntrySerialization.import(JSON.parse(tempfile.read),
33
- creator: creator,
33
+ creator:,
34
34
  account: creator.accounts.first,
35
- file_mappings: file_mappings)
35
+ file_mappings:)
36
36
  end
37
37
  end
38
38