pageflow 17.0.5 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +362 -35
  3. data/README.md +0 -1
  4. data/admins/pageflow/accounts.rb +16 -14
  5. data/admins/pageflow/entry.rb +68 -20
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +4 -4
  9. data/admins/pageflow/revisions.rb +5 -5
  10. data/admins/pageflow/site_root_entry.rb +64 -0
  11. data/admins/pageflow/sites.rb +12 -3
  12. data/admins/pageflow/translations.rb +75 -0
  13. data/admins/pageflow/user.rb +21 -35
  14. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  15. data/app/assets/javascripts/pageflow/dist/ui.js +2865 -257
  16. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  17. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +2 -1
  18. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +6 -0
  19. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
  20. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +7 -1
  21. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -1
  22. data/app/assets/stylesheets/pageflow/editor/files.scss +28 -16
  23. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +24 -0
  24. data/app/assets/stylesheets/pageflow/editor/info_box.scss +11 -3
  25. data/app/assets/stylesheets/pageflow/editor/list.scss +6 -4
  26. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  27. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  28. data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
  29. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  30. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  31. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
  32. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +8 -0
  33. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  34. data/app/assets/stylesheets/pageflow/ui/properties.scss +5 -0
  35. data/app/assets/stylesheets/pageflow/ui.scss +1 -0
  36. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  37. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  38. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  39. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  40. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  41. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  42. data/app/controllers/pageflow/application_controller.rb +19 -19
  43. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  44. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  45. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  46. data/app/controllers/pageflow/editor/entries_controller.rb +2 -1
  47. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  48. data/app/controllers/pageflow/editor/file_import_controller.rb +3 -3
  49. data/app/controllers/pageflow/editor/files_controller.rb +7 -6
  50. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  51. data/app/controllers/pageflow/entries_controller.rb +77 -17
  52. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  53. data/app/controllers/pageflow/files_controller.rb +1 -0
  54. data/app/controllers/pageflow/pages_controller.rb +4 -2
  55. data/app/controllers/pageflow/revisions_controller.rb +2 -1
  56. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  57. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  58. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  59. data/app/helpers/pageflow/admin/entries_helper.rb +1 -1
  60. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  61. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  62. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  63. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  64. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  65. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  66. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  67. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  68. data/app/helpers/pageflow/admin/widgets_helper.rb +3 -3
  69. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  70. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  71. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  72. data/app/helpers/pageflow/common_entry_seed_helper.rb +2 -4
  73. data/app/helpers/pageflow/editor/config_helper.rb +1 -1
  74. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  75. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  76. data/app/helpers/pageflow/entries_helper.rb +58 -34
  77. data/app/helpers/pageflow/entry_json_seed_helper.rb +3 -2
  78. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  79. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  80. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  81. data/app/helpers/pageflow/files_helper.rb +5 -4
  82. data/app/helpers/pageflow/folders_helper.rb +8 -5
  83. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  84. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  85. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  86. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  87. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  88. data/app/helpers/pageflow/overview_helper.rb +1 -1
  89. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  90. data/app/helpers/pageflow/pages_helper.rb +29 -15
  91. data/app/helpers/pageflow/public_i18n_helper.rb +1 -1
  92. data/app/helpers/pageflow/quota_helper.rb +4 -4
  93. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  94. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  95. data/app/helpers/pageflow/sites_helper.rb +3 -3
  96. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  97. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  98. data/app/helpers/pageflow/structured_data_helper.rb +1 -1
  99. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  100. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  101. data/app/helpers/pageflow/themes_helper.rb +1 -1
  102. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  103. data/app/helpers/pageflow/widgets_helper.rb +7 -6
  104. data/app/inputs/pageflow_permalink_input.rb +3 -2
  105. data/app/jobs/pageflow/application_job.rb +1 -0
  106. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  107. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  108. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  109. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  110. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  111. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  112. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  113. data/app/mailers/pageflow/user_mailer.rb +1 -0
  114. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +13 -1
  115. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  116. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  117. data/app/models/concerns/pageflow/output_source.rb +3 -3
  118. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  119. data/app/models/concerns/pageflow/reusable_file.rb +23 -23
  120. data/app/models/concerns/pageflow/serialization_blacklist.rb +1 -1
  121. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  122. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  123. data/app/models/concerns/pageflow/translatable.rb +62 -0
  124. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  125. data/app/models/pageflow/account.rb +6 -5
  126. data/app/models/pageflow/account_member_query.rb +1 -1
  127. data/app/models/pageflow/account_role_query.rb +1 -1
  128. data/app/models/pageflow/application_query.rb +1 -1
  129. data/app/models/pageflow/application_record.rb +1 -1
  130. data/app/models/pageflow/audio_file.rb +4 -4
  131. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  132. data/app/models/pageflow/authentication_token.rb +2 -2
  133. data/app/models/pageflow/chapter.rb +6 -1
  134. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  135. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  136. data/app/models/pageflow/customized_theme.rb +6 -6
  137. data/app/models/pageflow/draft_entry.rb +37 -9
  138. data/app/models/pageflow/edit_lock.rb +19 -21
  139. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  140. data/app/models/pageflow/entries_feed.rb +2 -2
  141. data/app/models/pageflow/entry.rb +44 -30
  142. data/app/models/pageflow/entry_at_revision.rb +5 -1
  143. data/app/models/pageflow/entry_duplicate.rb +8 -5
  144. data/app/models/pageflow/entry_publication.rb +2 -2
  145. data/app/models/pageflow/entry_role_query.rb +4 -4
  146. data/app/models/pageflow/entry_template.rb +4 -4
  147. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  148. data/app/models/pageflow/entry_translation_group.rb +42 -0
  149. data/app/models/pageflow/file_reuse.rb +2 -2
  150. data/app/models/pageflow/file_usage.rb +10 -3
  151. data/app/models/pageflow/folder.rb +2 -2
  152. data/app/models/pageflow/home_button.rb +7 -7
  153. data/app/models/pageflow/image_file.rb +20 -5
  154. data/app/models/pageflow/image_file_url_templates.rb +1 -1
  155. data/app/models/pageflow/invitation_form.rb +2 -1
  156. data/app/models/pageflow/managed_user_query.rb +1 -1
  157. data/app/models/pageflow/membership.rb +5 -5
  158. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  159. data/app/models/pageflow/null_user.rb +1 -1
  160. data/app/models/pageflow/overview_button.rb +1 -1
  161. data/app/models/pageflow/page.rb +7 -3
  162. data/app/models/pageflow/permalink.rb +23 -2
  163. data/app/models/pageflow/permalink_directory.rb +7 -0
  164. data/app/models/pageflow/permalink_redirect.rb +7 -0
  165. data/app/models/pageflow/positioned_file.rb +5 -5
  166. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  167. data/app/models/pageflow/potential_memberships.rb +5 -4
  168. data/app/models/pageflow/published_entry.rb +62 -11
  169. data/app/models/pageflow/revision.rb +24 -15
  170. data/app/models/pageflow/roles.rb +14 -18
  171. data/app/models/pageflow/site.rb +36 -3
  172. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  173. data/app/models/pageflow/sitemaps.rb +10 -1
  174. data/app/models/pageflow/storyline.rb +5 -2
  175. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  176. data/app/models/pageflow/text_track_file.rb +1 -1
  177. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  178. data/app/models/pageflow/theme_customization_file.rb +3 -2
  179. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  180. data/app/models/pageflow/url_template.rb +1 -1
  181. data/app/models/pageflow/used_file.rb +7 -3
  182. data/app/models/pageflow/user_name_query.rb +2 -2
  183. data/app/models/pageflow/video_file.rb +22 -15
  184. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  185. data/app/models/pageflow/widget.rb +4 -3
  186. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  187. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  188. data/app/policies/pageflow/account_policy.rb +3 -1
  189. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  190. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  191. data/app/policies/pageflow/application_policy.rb +2 -0
  192. data/app/policies/pageflow/entry_policy.rb +7 -1
  193. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  194. data/app/policies/pageflow/file_policy.rb +4 -7
  195. data/app/policies/pageflow/folder_policy.rb +18 -8
  196. data/app/policies/pageflow/membership_policy.rb +6 -4
  197. data/app/policies/pageflow/site_policy.rb +10 -3
  198. data/app/policies/pageflow/user_policy.rb +6 -4
  199. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  200. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  201. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  202. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  203. data/app/views/admin/entries/_form.html.erb +2 -1
  204. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  205. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  206. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  207. data/app/views/admin/sites/_fields.html.erb +14 -1
  208. data/app/views/admin/translations/_form.html.erb +31 -0
  209. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  210. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  211. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  212. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  213. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  214. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  215. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  216. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  217. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  218. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  219. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  220. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  221. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  222. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  223. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  224. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  225. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  226. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  227. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  228. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  229. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  230. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  231. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  232. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  233. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -1
  234. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  235. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  236. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  237. data/app/views/pageflow/editor/files/_file.json.jbuilder +5 -13
  238. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  239. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  240. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  241. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -3
  242. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  243. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  244. data/app/views/pageflow/files/_file.json.jbuilder +3 -3
  245. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  246. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  247. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  248. data/config/initializers/active_admin_patches.rb +3 -6
  249. data/config/initializers/admin_resource_tabs.rb +3 -0
  250. data/config/initializers/paperclip.rb +1 -0
  251. data/config/initializers/symmetric_encryption.rb +1 -1
  252. data/config/initializers/zencoder.rb +24 -13
  253. data/config/locales/de.yml +110 -4
  254. data/config/locales/en.yml +109 -7
  255. data/config/routes.rb +15 -13
  256. data/config/spring.rb +2 -1
  257. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  258. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  259. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  260. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  261. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  262. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  263. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  264. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  265. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  266. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  267. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  268. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  269. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  270. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  271. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  272. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  273. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  274. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  275. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  276. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  277. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  278. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +3912 -1486
  279. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +468 -1161
  280. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +28125 -22
  281. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +26589 -19
  282. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  283. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  284. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  285. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  286. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  287. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  288. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  289. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  290. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  291. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  292. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +2 -2
  293. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
  294. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -1
  295. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +2 -2
  296. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +1 -0
  297. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +2 -1
  298. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +60 -6
  299. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +16 -2
  300. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +21 -23
  301. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +16 -1
  302. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  303. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +12 -0
  304. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  305. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +19 -1
  306. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  307. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  308. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +2 -0
  309. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +17 -9
  310. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  311. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +25 -5
  312. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  313. data/entry_types/scrolled/config/locales/de.yml +614 -45
  314. data/entry_types/scrolled/config/locales/en.yml +586 -47
  315. data/entry_types/scrolled/config/routes.rb +18 -8
  316. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  317. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  318. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  319. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  320. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  321. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  322. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  323. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +16 -4
  324. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  325. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -4
  326. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +24 -22
  327. data/entry_types/scrolled/lib/pageflow_scrolled.rb +1 -1
  328. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +6 -5
  329. data/entry_types/scrolled/package/config/webpack.js +22 -0
  330. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  331. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1529 -0
  332. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  333. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +59 -0
  334. data/entry_types/scrolled/package/contentElements-editor.js +2075 -321
  335. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  336. data/entry_types/scrolled/package/contentElements-frontend.js +1019 -643
  337. data/entry_types/scrolled/package/editor.js +2086 -1091
  338. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-ebd22921.js → FloatingPortalRootProvider-51914be7.js} +1200 -1258
  339. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-9f76033e.js} +7 -8
  340. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +1932 -0
  341. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-788e9cdb.js +39 -0
  342. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-0345ce57.js} +36 -63
  343. data/entry_types/scrolled/package/frontend/{Viewer-1ecf3375.js → Viewer-cdc549cc.js} +15 -22
  344. data/entry_types/scrolled/package/frontend/{Wavesurfer-7d9cf1b7.js → Wavesurfer-1cdc3925.js} +54 -74
  345. data/entry_types/scrolled/package/frontend/{components-024a9893.js → components-96660ffd.js} +1791 -841
  346. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-eb670c2f.js} +11 -18
  347. data/entry_types/scrolled/package/frontend/index.css +1 -1
  348. data/entry_types/scrolled/package/frontend/index.js +517 -903
  349. data/entry_types/scrolled/package/frontend/{createSuper-d0f30da3.js → inherits-539844a6.js} +40 -56
  350. data/entry_types/scrolled/package/frontend/{useContentElementEditorState-4f4c3cf6.js → useContentElementEditorState-77fe6c79.js} +7 -8
  351. data/entry_types/scrolled/package/frontend/usePhonePlatform-c2ba875d.js +8 -0
  352. data/entry_types/scrolled/package/frontend-server.js +0 -1
  353. data/entry_types/scrolled/package/package.json +18 -10
  354. data/entry_types/scrolled/package/testHelpers.js +306 -70
  355. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  356. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  357. data/entry_types/scrolled/package/widgets/consentBar.js +47 -66
  358. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  359. data/entry_types/scrolled/package/widgets/defaultNavigation.js +177 -207
  360. data/entry_types/scrolled/package/widgets/excursionDialog.css +1 -0
  361. data/entry_types/scrolled/package/widgets/excursionDialog.js +109 -0
  362. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  363. data/entry_types/scrolled/package/widgets/excursionSheet.js +262 -0
  364. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  365. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +6 -9
  366. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  367. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +48 -0
  368. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  369. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +144 -0
  370. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  371. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +26 -9
  372. data/entry_types/scrolled/package/widgets-server.js +1 -0
  373. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  374. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  375. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  376. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  377. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  378. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  379. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  380. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  381. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  382. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  383. data/lib/generators/pageflow/resque/resque_generator.rb +6 -4
  384. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  385. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  386. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  387. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  388. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  389. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  390. data/lib/pageflow/ability_mixin.rb +25 -15
  391. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  392. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  393. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  394. data/lib/pageflow/additional_headers.rb +27 -0
  395. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  396. data/lib/pageflow/admin/tabs.rb +1 -1
  397. data/lib/pageflow/built_in_file_type.rb +1 -1
  398. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  399. data/lib/pageflow/built_in_widget_type.rb +2 -2
  400. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  401. data/lib/pageflow/configuration.rb +141 -18
  402. data/lib/pageflow/cutoff_modes.rb +39 -0
  403. data/lib/pageflow/editor_controller.rb +6 -10
  404. data/lib/pageflow/engine.rb +4 -5
  405. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  406. data/lib/pageflow/entry_export_import/entry_serialization.rb +5 -4
  407. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  408. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +1 -1
  409. data/lib/pageflow/entry_export_import.rb +3 -3
  410. data/lib/pageflow/entry_types.rb +2 -2
  411. data/lib/pageflow/feature.rb +1 -1
  412. data/lib/pageflow/features.rb +4 -6
  413. data/lib/pageflow/file_importers.rb +4 -4
  414. data/lib/pageflow/file_type.rb +3 -3
  415. data/lib/pageflow/file_types.rb +3 -3
  416. data/lib/pageflow/global_config_api.rb +5 -6
  417. data/lib/pageflow/help_entries.rb +7 -7
  418. data/lib/pageflow/help_entry.rb +1 -1
  419. data/lib/pageflow/hooks.rb +1 -1
  420. data/lib/pageflow/nested_revision_component.rb +9 -27
  421. data/lib/pageflow/news_item_api.rb +1 -1
  422. data/lib/pageflow/page_type.rb +2 -3
  423. data/lib/pageflow/page_types.rb +3 -3
  424. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  425. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  426. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  427. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  428. data/lib/pageflow/plugin.rb +1 -2
  429. data/lib/pageflow/quota.rb +9 -5
  430. data/lib/pageflow/quotas.rb +1 -1
  431. data/lib/pageflow/rails_version.rb +1 -0
  432. data/lib/pageflow/react.rb +1 -1
  433. data/lib/pageflow/revision_component.rb +8 -40
  434. data/lib/pageflow/revision_components.rb +16 -6
  435. data/lib/pageflow/seeds.rb +12 -16
  436. data/lib/pageflow/theme.rb +1 -1
  437. data/lib/pageflow/theme_customizations.rb +10 -10
  438. data/lib/pageflow/themes.rb +3 -3
  439. data/lib/pageflow/user_mixin.rb +6 -6
  440. data/lib/pageflow/version.rb +1 -1
  441. data/lib/pageflow/widget_type.rb +4 -4
  442. data/lib/pageflow/widget_types.rb +9 -9
  443. data/lib/pageflow/zencoder_api.rb +32 -42
  444. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  445. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  446. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  447. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  448. data/lib/pageflow.rb +7 -2
  449. data/lib/tasks/pageflow_tasks.rake +1 -1
  450. data/package/editor.js +954 -868
  451. data/package/frontend.js +113 -387
  452. data/package/package.json +2 -1
  453. data/package/testHelpers.js +10 -56
  454. data/package/ui.js +209 -251
  455. data/spec/factories/accounts.rb +37 -22
  456. data/spec/factories/audio_files.rb +2 -2
  457. data/spec/factories/authentication_tokens.rb +4 -4
  458. data/spec/factories/chapters.rb +4 -4
  459. data/spec/factories/draft_entries.rb +14 -6
  460. data/spec/factories/edit_locks.rb +1 -1
  461. data/spec/factories/entries.rb +28 -19
  462. data/spec/factories/entry_translation_groups.rb +6 -0
  463. data/spec/factories/file_usages.rb +2 -1
  464. data/spec/factories/folders.rb +1 -1
  465. data/spec/factories/image_files.rb +2 -2
  466. data/spec/factories/pages.rb +3 -3
  467. data/spec/factories/published_entries.rb +26 -8
  468. data/spec/factories/revisions.rb +1 -1
  469. data/spec/factories/sites.rb +6 -0
  470. data/spec/factories/test_multi_attachment_files.rb +1 -1
  471. data/spec/factories/text_track_files.rb +1 -1
  472. data/spec/factories/uploadable_files.rb +1 -1
  473. data/spec/factories/users.rb +6 -6
  474. data/spec/factories/video_files.rb +2 -2
  475. data/spec/factories/widgets.rb +1 -1
  476. data/spec/fixtures/7x15_rotated.jpg +0 -0
  477. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  478. metadata +98 -45
  479. data/config/initializers/revision_components.rb +0 -5
  480. data/config/locales/twitter_to_x.de.yml +0 -6
  481. data/config/locales/twitter_to_x.en.yml +0 -6
  482. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  483. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  484. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  485. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  486. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  487. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  488. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
@@ -187,8 +187,8 @@ module Pageflow
187
187
  attr_accessor :public_entry_request_scope
188
188
 
189
189
  # 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
190
+ # {PublishedEntry} record and an {ActionDispatch::Request} object
191
+ # and returning `nil` or a path to redirect to. Can be used in
192
192
  # conjuction with {PrimaryDomainEntryRedirect} to make sure
193
193
  # entries are accessed via their account's configured cname.
194
194
  #
@@ -208,18 +208,76 @@ module Pageflow
208
208
  # @return [String]
209
209
  attr_accessor :public_entry_cache_control_header
210
210
 
211
+ # Provide additional response headers for published entries.
212
+ #
213
+ # @example
214
+ #
215
+ # config.additional_public_entry_headers.register(
216
+ # {'Some' => 'value'}
217
+ # )
218
+ #
219
+ # config.additional_public_entry_headers.register(
220
+ # lambda do |_entry, request|
221
+ # {'Some' => request.headers['Other']}
222
+ # end
223
+ # )
224
+ #
225
+ # @return [AdditionalHeaders]
226
+ # @since 17.1
227
+ attr_reader :additional_public_entry_headers
228
+
211
229
  # Either a lambda or an object with a `call` method taking a
212
230
  # {Site} as paramater and returing a hash of options used to
213
- # construct the url of a published entry.
231
+ # construct the url of a site.
232
+ #
233
+ # Can be used to change the host of the url under which entries
234
+ # and feeds are available.
235
+ #
236
+ # If the option is not set, public_entry_url_options is used as a
237
+ # fallback.
238
+ #
239
+ # Example:
240
+ #
241
+ # config.site_url_options = lambda do |site|
242
+ # {host: "#{site.account.name}.example.com"}
243
+ # end
244
+ attr_accessor :site_url_options
245
+
246
+ # Either a hash, a lambda or an object with a `call` method
247
+ # returing a hash of options used to construct the url of a
248
+ # published entry.
214
249
  #
215
250
  # Can be used to change the host of the url under which entries
216
251
  # are available.
217
252
  #
253
+ # If site_url_options is blank, the lambda receives a {Site} as
254
+ # parameter. This case is only supported for legacy reasons.
255
+ # Prefer setting site_url_options instead.
256
+ #
218
257
  # Example:
219
258
  #
220
259
  # config.public_entry_url_options = lambda do |site|
221
260
  # {host: "#{site.account.name}.example.com"}
222
261
  # end
262
+ #
263
+ # If both site_url_options and public_entry_url_options are
264
+ # present, public_entry_url_options is called exclusively to
265
+ # construct url options for public entries. The lambda then
266
+ # receives a {PublishedEntry} to allow for entry specific url
267
+ # options.
268
+ #
269
+ # Example:
270
+ #
271
+ # config.site_url_options = lambda do |site|
272
+ # {host: "#{site.account.name}.example.com"}
273
+ # end
274
+ #
275
+ # config.public_entry_url_options = lambda do |entry|
276
+ # {
277
+ # host: "#{entry.site.account.name}.example.com",
278
+ # some_entry_specific_param: entry.id
279
+ # }
280
+ # end
223
281
  attr_accessor :public_entry_url_options
224
282
 
225
283
  # Either a lambda or an object with a `call` method taking a
@@ -227,6 +285,23 @@ module Pageflow
227
285
  # construct the embed url of a published entry.
228
286
  attr_accessor :entry_embed_url_options
229
287
 
288
+ # Define strategies to determine whether entries should be cut off
289
+ # (e.g., to preview paywalled premium content).
290
+ #
291
+ # @example
292
+ #
293
+ # config.cutoff_modes.register(
294
+ # 'subscription_header',
295
+ # lambda do |_entry, request|
296
+ # # Set by some proxy handling user authentication
297
+ # request.headers['X-Subscription'] != 'Premium'
298
+ # end
299
+ # )
300
+ #
301
+ # @return [CutoffModes]
302
+ # @since 17.1
303
+ attr_reader :cutoff_modes
304
+
230
305
  # Either a lambda or an object with a `call` method taking a hash
231
306
  # of theme option overrides and an {EntryAtRevision} and returning
232
307
  # a transformed hash of overrides. Can be used to filter overrides
@@ -239,6 +314,14 @@ module Pageflow
239
314
  # files based on feature flags and other entry or account traits.
240
315
  attr_accessor :transform_theme_customization_files
241
316
 
317
+ # Where to redirect after creating an entry.
318
+ #
319
+ # Possible values:
320
+ #
321
+ # `:admin`: Go to entry admin page (default)
322
+ # `:editor`: Open created entry in editor
323
+ attr_accessor :after_entry_create_redirect_to
324
+
242
325
  # Submit video/audio encoding jobs only after the user has
243
326
  # explicitly confirmed in the editor. Can either be set to a
244
327
  # boolean or a lambda that is passed the file and returns a
@@ -324,8 +407,7 @@ module Pageflow
324
407
  # If you set these to <tt>nil</tt> or <tt>""</tt> the meta tag won't be included.
325
408
  # @since 0.10
326
409
  attr_accessor :default_keywords_meta_tag
327
- attr_accessor :default_author_meta_tag
328
- attr_accessor :default_publisher_meta_tag
410
+ attr_accessor :default_author_meta_tag, :default_publisher_meta_tag
329
411
 
330
412
  # Share provider defaults.
331
413
  #
@@ -381,6 +463,16 @@ module Pageflow
381
463
  # @since 12.2
382
464
  attr_accessor :news
383
465
 
466
+ # URL to a form that is used to translate an entry via an external service.
467
+ #
468
+ # @example
469
+ #
470
+ # config.entry_translator_url = lambda do |entry|
471
+ # Rails.application.routes.url_helpers.some_custom_route(entry)
472
+ # end
473
+ # @since 17.1
474
+ attr_accessor :entry_translator_url
475
+
384
476
  def initialize(target_type_name = nil)
385
477
  @target_type_name = target_type_name
386
478
 
@@ -425,14 +517,16 @@ module Pageflow
425
517
  @css_rendered_thumbnail_styles = Defaults::CSS_RENDERED_THUMBNAIL_STYLES.dup
426
518
 
427
519
  @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
520
+ @public_entry_request_scope = ->(entries, _request) { entries }
521
+ @public_entry_redirect = ->(_entry, _request) {}
522
+ @additional_public_entry_headers = AdditionalHeaders.new
431
523
  @entry_embed_url_options = {protocol: 'https'}
524
+ @cutoff_modes = CutoffModes.new
432
525
 
433
526
  @transform_theme_customization_overrides = ->(overrides, _entry) { overrides }
434
527
  @transform_theme_customization_files = ->(files, _entry) { files }
435
528
 
529
+ @after_entry_create_redirect_to = :admin
436
530
  @confirm_encoding_jobs = false
437
531
  @default_published_until_duration_in_months = 12
438
532
 
@@ -442,7 +536,8 @@ module Pageflow
442
536
 
443
537
  @available_locales = [:en, :de]
444
538
  @available_public_locales = PublicI18n.available_locales
445
- @available_share_providers = [:email, :facebook, :linked_in, :twitter, :telegram, :whats_app]
539
+ @available_share_providers = [:email, :facebook, :linked_in, :bluesky, :threads, :twitter,
540
+ :telegram, :whats_app]
446
541
 
447
542
  @public_https_mode = :prevent
448
543
 
@@ -452,7 +547,7 @@ module Pageflow
452
547
 
453
548
  @default_share_providers = @available_share_providers
454
549
 
455
- @authorize_user_deletion = lambda { |_user| true }
550
+ @authorize_user_deletion = ->(_user) { true }
456
551
 
457
552
  @available_file_licenses = [
458
553
  :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
@@ -489,18 +584,26 @@ module Pageflow
489
584
 
490
585
  # @deprecated Use `config.page_types.register` instead.
491
586
  def register_page_type(page_type)
492
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#register_page_type is deprecated. Use config.page_types.register instead.', caller)
587
+ ActiveSupport::Deprecation.warn(
588
+ 'Pageflow::Configuration#register_page_type is deprecated. ' \
589
+ 'Use config.page_types.register instead.',
590
+ caller
591
+ )
493
592
  page_types.register(page_type)
494
593
  end
495
594
 
496
595
  # @deprecated Pageflow now supports direct uploads to S3 via signed post requests.
497
596
  # Please change your forms accordingly.
498
597
  def paperclip_filesystem_root
499
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller)
598
+ ActiveSupport::Deprecation.warn(
599
+ 'Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller
600
+ )
500
601
  end
501
602
 
502
603
  def paperclip_filesystem_root=(_val)
503
- ActiveSupport::Deprecation.warn('Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller)
604
+ ActiveSupport::Deprecation.warn(
605
+ 'Pageflow::Configuration#paperclip_filesystem_root is deprecated.', caller
606
+ )
504
607
  end
505
608
 
506
609
  # Scope configuration to entries of a certain entry type or access
@@ -542,11 +645,27 @@ module Pageflow
542
645
  end
543
646
 
544
647
  # @api private
545
- def site_url_options(site)
546
- options = public_entry_url_options
648
+ def site_url_options_for(site)
649
+ options = site_url_options ||
650
+ public_entry_url_options ||
651
+ Pageflow::SitesHelper::DEFAULT_SITE_URL_OPTIONS
652
+
547
653
  options.respond_to?(:call) ? options.call(site) : options
548
654
  end
549
655
 
656
+ # @api private
657
+ def public_entry_url_options_for(entry)
658
+ return site_url_options_for(entry.site) unless public_entry_url_options
659
+
660
+ options = public_entry_url_options
661
+
662
+ if options.respond_to?(:call)
663
+ options.call(site_url_options ? entry : entry.site)
664
+ else
665
+ options
666
+ end
667
+ end
668
+
550
669
  # @api private
551
670
  def enable_features(names)
552
671
  features.enable(names, FeatureLevelConfiguration.new(self))
@@ -569,6 +688,10 @@ module Pageflow
569
688
  delegate :themes, to: :config
570
689
  delegate :widget_types, to: :config
571
690
  delegate :public_entry_cache_control_header=, to: :config
691
+ delegate :additional_public_entry_headers, to: :config
692
+ delegate :cutoff_modes, to: :config
693
+ delegate :entry_translator_url=, to: :config
694
+ delegate :public_entry_url_options=, to: :config
572
695
 
573
696
  delegate :for_entry_type, to: :config
574
697
  end
@@ -580,11 +703,11 @@ module Pageflow
580
703
  @entry_type_config = config.get_entry_type_config(entry_type)
581
704
  end
582
705
 
583
- def method_missing(method, *args)
706
+ def method_missing(method, *)
584
707
  if @config.respond_to?(method)
585
- @config.send(method, *args)
708
+ @config.send(method, *)
586
709
  elsif @entry_type_config.respond_to?(method)
587
- @entry_type_config.send(method, *args)
710
+ @entry_type_config.send(method, *)
588
711
  else
589
712
  super
590
713
  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
@@ -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
@@ -23,7 +23,6 @@ require 'backbone-rails'
23
23
  require 'marionette-rails'
24
24
  require 'jquery-fileupload-rails'
25
25
  require 'jquery-minicolors-rails'
26
- require 'wysihtml/rails'
27
26
  require 'i18n-js'
28
27
  require 'http_accept_language'
29
28
  require 'pageflow-public-i18n'
@@ -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|
@@ -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
 
@@ -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 = {}
@@ -40,7 +40,7 @@ module Pageflow
40
40
  revision_attributes['theme_name'] = 'default'
41
41
  end
42
42
 
43
- entry.revisions.create!(revision_attributes.merge(creator: creator)) do |revision|
43
+ entry.revisions.create!(revision_attributes.merge(creator:)) do |revision|
44
44
  revision.published_until = Time.now if revision.published?
45
45
  end
46
46
  end
@@ -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
 
@@ -25,8 +25,8 @@ module Pageflow
25
25
  end
26
26
 
27
27
  # @api private
28
- def each(&block)
29
- @entry_types_by_name.values.each(&block)
28
+ def each(&)
29
+ @entry_types_by_name.values.each(&)
30
30
  end
31
31
 
32
32
  # @api private
@@ -33,7 +33,7 @@ module Pageflow
33
33
  #
34
34
  # @param config [Configuration]
35
35
  def enable(config)
36
- @block.call(config) if @block
36
+ @block&.call(config)
37
37
  end
38
38
  end
39
39
  end
@@ -27,10 +27,8 @@ module Pageflow
27
27
  #
28
28
  # @overload register(feature)
29
29
  # @param feature [String]
30
- def register(feature, &block)
31
- if feature.is_a?(String)
32
- return register(Feature.new(feature, &block))
33
- end
30
+ def register(feature, &)
31
+ return register(Feature.new(feature, &)) if feature.is_a?(String)
34
32
 
35
33
  if @features.key?(feature.name)
36
34
  raise(ArgumentError, "Feature #{feature.name} is already registered.")
@@ -85,8 +83,8 @@ module Pageflow
85
83
  end
86
84
  end
87
85
 
88
- def each(&block)
89
- @features.values.each(&block)
86
+ def each(&)
87
+ @features.values.each(&)
90
88
  end
91
89
  end
92
90
  end
@@ -16,8 +16,8 @@ module Pageflow
16
16
  @file_importers = {}
17
17
  end
18
18
 
19
- def each(&block)
20
- @file_importers.values.each(&block)
19
+ def each(&)
20
+ @file_importers.values.each(&)
21
21
  end
22
22
 
23
23
  def find_by_name!(name)
@@ -26,8 +26,8 @@ module Pageflow
26
26
  end
27
27
  end
28
28
 
29
- def fetch_by_name(name, &block)
30
- @file_importers.fetch(name, &block)
29
+ def fetch_by_name(name, &)
30
+ @file_importers.fetch(name, &)
31
31
  end
32
32
  end
33
33
  end
@@ -123,11 +123,11 @@ module Pageflow
123
123
  @css_background_image_class_prefix || model.model_name.singular
124
124
  end
125
125
 
126
- def css_background_image_urls_for(file, **options)
126
+ def css_background_image_urls_for(file, **)
127
127
  if call_arity(css_background_image_urls) == 1
128
128
  css_background_image_urls.call(file)
129
129
  else
130
- css_background_image_urls.call(file, **options)
130
+ css_background_image_urls.call(file, **)
131
131
  end
132
132
  end
133
133
 
@@ -137,7 +137,7 @@ module Pageflow
137
137
  end
138
138
 
139
139
  # @api private
140
- alias_method :short_name, :param_key
140
+ alias short_name param_key
141
141
 
142
142
  # @api private
143
143
  def type_name
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class FileTypes
2
+ class FileTypes # rubocop:todo Style/Documentation
3
3
  include Enumerable
4
4
 
5
5
  def initialize
@@ -14,10 +14,10 @@ module Pageflow
14
14
  @file_types = []
15
15
  end
16
16
 
17
- def each(&block)
17
+ def each(&)
18
18
  first_level_file_types = trigger_lazy_loading_of_file_types
19
19
  lower_level_file_types = search_for_nested_file_types(first_level_file_types)
20
- (first_level_file_types + lower_level_file_types).uniq(&:model).each(&block)
20
+ (first_level_file_types + lower_level_file_types).uniq(&:model).each(&)
21
21
  end
22
22
 
23
23
  def find_by_collection_name!(collection_name)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module GlobalConfigApi
2
+ module GlobalConfigApi # rubocop:todo Style/Documentation
3
3
  # The global configuration.
4
4
  #
5
5
  # Note that all features have been activated for this
@@ -11,11 +11,10 @@ module Pageflow
11
11
  # @return [Configuration]
12
12
  def config(options = {})
13
13
  unless @config
14
- if options[:ignore_not_configured]
15
- return Configuration.new
16
- else
17
- raise('Pageflow has not been configured yet')
18
- end
14
+ return Configuration.new if options[:ignore_not_configured]
15
+
16
+ raise('Pageflow has not been configured yet')
17
+
19
18
  end
20
19
  @config
21
20
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class HelpEntries
2
+ class HelpEntries # rubocop:todo Style/Documentation
3
3
  include Enumerable
4
4
 
5
5
  def initialize
@@ -24,18 +24,18 @@ module Pageflow
24
24
  collection = find_collection(options[:parent])
25
25
 
26
26
  collection << help_entry
27
- collection.sort_by! { |help_entry| -help_entry.priority }
27
+ collection.sort_by! { |entry| -entry.priority }
28
28
  end
29
29
 
30
30
  # @api private
31
31
  def flat
32
- map do |help_entry|
33
- [help_entry, help_entry.children]
34
- end.flatten
32
+ map { |entry|
33
+ [entry, entry.children]
34
+ }.flatten
35
35
  end
36
36
 
37
- def each(&block)
38
- @help_entries.each(&block)
37
+ def each(&)
38
+ @help_entries.each(&)
39
39
  end
40
40
 
41
41
  private
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class HelpEntry
2
+ class HelpEntry # rubocop:todo Style/Documentation
3
3
  attr_reader :name, :children
4
4
 
5
5
  def initialize(name, options)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Hooks
2
+ class Hooks # rubocop:todo Style/Documentation
3
3
  def initialize
4
4
  @subscribers = Hash.new do |hash, key|
5
5
  hash[key] = []