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
@@ -2,11 +2,15 @@ require 'cancan'
2
2
  require 'state_machines'
3
3
 
4
4
  module Pageflow
5
+ # @api private
5
6
  class ApplicationController < ActionController::Base
6
7
  layout 'pageflow/application'
7
8
 
8
9
  before_action do
9
- I18n.locale = current_user.try(:locale) || locale_from_accept_language_header || I18n.default_locale
10
+ I18n.locale =
11
+ current_user.try(:locale) ||
12
+ locale_from_accept_language_header ||
13
+ I18n.default_locale
10
14
  end
11
15
 
12
16
  # Prevent CSRF attacks by raising an exception.
@@ -22,15 +26,9 @@ module Pageflow
22
26
 
23
27
  rescue_from ActiveRecord::RecordNotFound do |exception|
24
28
  debug_log_with_backtrace(exception)
29
+
25
30
  respond_to do |format|
26
- format.html do
27
- begin
28
- render file: Rails.public_path.join('pageflow', 'error_pages', '404.html'), status: :not_found
29
- rescue ActionView::MissingTemplate => exception
30
- debug_log_with_backtrace(exception)
31
- head :not_found
32
- end
33
- end
31
+ format.html { render_static_404_error_page }
34
32
  format.any { head :not_found }
35
33
  end
36
34
  end
@@ -38,7 +36,7 @@ module Pageflow
38
36
  rescue_from CanCan::AccessDenied do |exception|
39
37
  debug_log_with_backtrace(exception)
40
38
  respond_to do |format|
41
- format.html { redirect_to main_app.admin_root_path, :alert => t('pageflow.unauthorized') }
39
+ format.html { redirect_to main_app.admin_root_path, alert: t('pageflow.unauthorized') }
42
40
  format.any(:json, :css) { head :forbidden }
43
41
  end
44
42
  end
@@ -46,7 +44,9 @@ module Pageflow
46
44
  rescue_from StateMachines::InvalidTransition do |exception|
47
45
  debug_log_with_backtrace(exception)
48
46
  respond_to do |format|
49
- format.html { redirect_to main_app.admin_root_path, :alert => t('pageflow.invalid_transition') }
47
+ format.html do
48
+ redirect_to main_app.admin_root_path, alert: t('pageflow.invalid_transition')
49
+ end
50
50
  format.json { head :bad_request }
51
51
  end
52
52
  end
@@ -57,18 +57,18 @@ module Pageflow
57
57
  @current_ability ||= Ability.new(current_user)
58
58
  end
59
59
 
60
- def after_sign_in_path_for(resource_or_scope)
61
- root_url(:protocol => 'http')
62
- end
63
-
64
- def after_sign_out_path_for(resource_or_scope)
65
- root_url(:protocol => 'http')
66
- end
67
-
68
60
  def locale_from_accept_language_header
69
61
  http_accept_language.compatible_language_from(I18n.available_locales)
70
62
  end
71
63
 
64
+ def render_static_404_error_page
65
+ render file: Rails.public_path.join('pageflow', 'error_pages', '404.html'),
66
+ status: :not_found
67
+ rescue ActionView::MissingTemplate => e
68
+ debug_log_with_backtrace(e)
69
+ head :not_found
70
+ end
71
+
72
72
  def debug_log_with_backtrace(exception)
73
73
  Rails.logger.debug exception
74
74
  backtrace = ''
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ChaptersController < Pageflow::ApplicationController
3
4
  respond_to :json
4
5
 
@@ -67,8 +68,8 @@ module Pageflow
67
68
  configuration = params.require(:chapter)[:configuration].try(:permit!) || {}
68
69
 
69
70
  params.require(:chapter)
70
- .permit(:position, :title)
71
- .merge(configuration: configuration)
71
+ .permit(:position, :title)
72
+ .merge(configuration:)
72
73
  end
73
74
  end
74
75
  end
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class EditLocksController < Pageflow::ApplicationController
3
4
  before_action :authenticate_user!
4
5
 
@@ -11,7 +12,7 @@ module Pageflow
11
12
 
12
13
  entry.snapshot(creator: current_user) unless entry.feature_state('no_edit_lock_snapshot')
13
14
 
14
- respond_with(entry.reload.edit_lock, :location => entry_edit_lock_url(entry))
15
+ respond_with(entry.reload.edit_lock, location: entry_edit_lock_url(entry))
15
16
  end
16
17
 
17
18
  def update
@@ -30,7 +31,7 @@ module Pageflow
30
31
  protected
31
32
 
32
33
  def edit_lock_params
33
- params.permit(:edit_lock => [:force, :id]).fetch(:edit_lock, {})
34
+ params.permit(edit_lock: [:force, :id]).fetch(:edit_lock, {})
34
35
  end
35
36
  end
36
37
  end
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Editor
3
+ # @api private
3
4
  class EncodingConfirmationsController < Pageflow::ApplicationController
4
5
  respond_to :json
5
6
 
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Editor
3
+ # @api private
3
4
  class EntriesController < Pageflow::ApplicationController
4
5
  layout 'pageflow/editor'
5
6
 
@@ -50,7 +51,7 @@ module Pageflow
50
51
  :share_url, :share_image_id, :share_image_x, :share_image_y,
51
52
  :locale, :author, :publisher, :keywords, :theme_name,
52
53
  share_providers: {})
53
- .merge(configuration: configuration)
54
+ .merge(configuration:)
54
55
  end
55
56
  end
56
57
  end
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Editor
3
+ # @api private
3
4
  class EntryPublicationsController < Pageflow::ApplicationController
4
5
  respond_to :json
5
6
 
@@ -26,7 +26,7 @@ module Pageflow
26
26
 
27
27
  FileImportJob.perform_later(file_import.id, file_importer_credentials)
28
28
 
29
- {file: file, source_url: file_params[:url]}
29
+ {file:, source_url: file_params[:url]}
30
30
  end
31
31
  end
32
32
 
@@ -54,12 +54,12 @@ module Pageflow
54
54
 
55
55
  def files_params
56
56
  params
57
- .permit(files: [:file_name,
57
+ .permit(files: [:display_name,
58
58
  :rights,
59
59
  :content_type,
60
60
  :file_size,
61
61
  :url,
62
- configuration: [:alt, :source_url]])
62
+ {configuration: [:alt, :source_url]}])
63
63
  .require(:files)
64
64
  end
65
65
 
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Editor
3
+ # @api private
3
4
  class FilesController < Pageflow::ApplicationController
4
5
  respond_to :json
5
6
 
@@ -91,10 +92,10 @@ module Pageflow
91
92
  private
92
93
 
93
94
  def create_params
94
- file_params.permit(:file_name, :content_type, :file_size)
95
- .merge(file_configuration_params)
96
- .merge(file_parent_file_params)
97
- .merge(file_custom_params)
95
+ file_params.permit(:display_name, :content_type, :file_size)
96
+ .merge(file_configuration_params)
97
+ .merge(file_parent_file_params)
98
+ .merge(file_custom_params)
98
99
  end
99
100
 
100
101
  def file_reuse_params
@@ -102,7 +103,7 @@ module Pageflow
102
103
  end
103
104
 
104
105
  def update_params
105
- file_configuration_params
106
+ file_configuration_params.merge(file_params.permit(:display_name))
106
107
  end
107
108
 
108
109
  def file_configuration_params
@@ -110,7 +111,7 @@ module Pageflow
110
111
 
111
112
  file_params
112
113
  .permit(:rights)
113
- .merge(configuration: configuration)
114
+ .merge(configuration:)
114
115
  end
115
116
 
116
117
  def file_parent_file_params
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Editor
3
+ # @api private
3
4
  class WidgetsController < Pageflow::ApplicationController
4
5
  respond_to :json
5
6
 
@@ -6,21 +6,35 @@ module Pageflow
6
6
  include EntryPasswordProtection
7
7
 
8
8
  def index
9
- site = Site.for_request(request).with_home_url.first!
9
+ site = Site.for_request(request).first!
10
10
 
11
- redirect_to(site.home_url, allow_other_host: true)
11
+ entry = PublishedEntry.find_by_permalink(
12
+ directory: '',
13
+ slug: '',
14
+ scope: site.entries
15
+ )
16
+
17
+ if entry
18
+ handle_public_entry_request(entry)
19
+ elsif site.home_url.present?
20
+ redirect_to(site.home_url, allow_other_host: true)
21
+ else
22
+ raise ActiveRecord::RecordNotFound
23
+ end
12
24
  end
13
25
 
14
26
  def show
15
27
  respond_to do |format|
16
28
  format.html do
17
- entry = find_by_permalink || find_by_slug
29
+ entry = find_by_permalink
18
30
 
19
- return if redirect_according_to_entry_redirect(entry)
20
- return if redirect_according_to_public_https_mode
21
- return unless check_entry_password_protection(entry)
31
+ return if !entry && redirect_according_to_permalink_redirect
22
32
 
23
- delegate_to_entry_type_frontend_app!(entry)
33
+ entry ||= find_by_slug!
34
+
35
+ handle_public_entry_request(entry)
36
+ rescue ActiveRecord::RecordNotFound
37
+ render_custom_or_static_404_error_page
24
38
  end
25
39
  end
26
40
  end
@@ -49,7 +63,7 @@ module Pageflow
49
63
  entry = PublishedEntry.find(params[:id], entry_request_scope)
50
64
  index = params[:page_index].split('-').first.to_i
51
65
 
52
- redirect_to(short_entry_path(entry.to_model, :anchor => entry.pages[index].try(:perma_id)))
66
+ redirect_to(short_entry_path(entry.to_model, anchor: entry.pages[index].try(:perma_id)))
53
67
  end
54
68
 
55
69
  protected
@@ -62,7 +76,7 @@ module Pageflow
62
76
  )
63
77
  end
64
78
 
65
- def find_by_slug
79
+ def find_by_slug!
66
80
  PublishedEntry.find(params[:id], entry_request_scope)
67
81
  end
68
82
 
@@ -70,22 +84,52 @@ module Pageflow
70
84
  Pageflow.config.public_entry_request_scope.call(Entry, request)
71
85
  end
72
86
 
87
+ def handle_public_entry_request(entry)
88
+ return if redirect_according_to_entry_redirect(entry)
89
+ return if redirect_according_to_public_https_mode
90
+ return unless check_entry_password_protection(entry)
91
+
92
+ delegate_to_entry_type_frontend_app!(entry)
93
+ end
94
+
95
+ def redirect_according_to_permalink_redirect
96
+ entry = PublishedEntry.find_by_permalink_redirect(
97
+ directory: params[:directory],
98
+ slug: params[:id],
99
+ site: Site.for_request(request)
100
+ )
101
+
102
+ return false unless entry
103
+
104
+ redirect_to(EntriesHelper::PrettyUrl.build(pageflow, entry),
105
+ status: :moved_permanently,
106
+ allow_other_host: true)
107
+ true
108
+ end
109
+
73
110
  def redirect_according_to_entry_redirect(entry)
74
- return unless (redirect_location = entry_redirect(entry))
111
+ return false unless (redirect_location = entry_redirect(entry))
75
112
 
76
113
  redirect_to(redirect_location, status: :moved_permanently, allow_other_host: true)
114
+ true
77
115
  end
78
116
 
79
117
  def entry_redirect(entry)
80
118
  Pageflow.config.public_entry_redirect.call(entry, request)
81
119
  end
82
120
 
83
- def delegate_to_entry_type_frontend_app!(entry)
84
- EntriesControllerEnvHelper.add_entry_info_to_env(request.env, entry: entry, mode: :published)
121
+ def delegate_to_entry_type_frontend_app!(entry, override_status: nil)
122
+ EntriesControllerEnvHelper.add_entry_info_to_env(request.env, entry:, mode: :published)
123
+
124
+ delegate_to_rack_app!(entry.entry_type.frontend_app) do |result|
125
+ status, headers, body = result
126
+ config = Pageflow.config_for(entry)
85
127
 
86
- delegate_to_rack_app!(entry.entry_type.frontend_app) do |_status, headers, _body|
87
128
  allow_iframe_for_embed(headers)
88
- apply_cache_control(entry, headers)
129
+ apply_additional_headers(entry, config, headers)
130
+ apply_cache_control(entry, config, headers)
131
+
132
+ [override_status || status, headers, body]
89
133
  end
90
134
  end
91
135
 
@@ -93,13 +137,29 @@ module Pageflow
93
137
  headers.except!('X-Frame-Options') if params[:embed]
94
138
  end
95
139
 
96
- def apply_cache_control(entry, headers)
97
- config = Pageflow.config_for(entry)
98
-
140
+ def apply_cache_control(entry, config, headers)
99
141
  return if config.public_entry_cache_control_header.blank?
100
142
  return if entry.password_protected?
101
143
 
102
144
  headers['Cache-Control'] = config.public_entry_cache_control_header
103
145
  end
146
+
147
+ def apply_additional_headers(entry, config, headers)
148
+ headers.merge!(
149
+ config.additional_public_entry_headers.for(entry, request)
150
+ )
151
+ end
152
+
153
+ def render_custom_or_static_404_error_page
154
+ site = Site.for_request(request).first
155
+
156
+ if site&.custom_404_entry&.published_without_password_protection?
157
+ entry = PublishedEntry.new(site.custom_404_entry)
158
+ delegate_to_entry_type_frontend_app!(entry, override_status: 404)
159
+ else
160
+ # Fallback to ApplicationController's handler method
161
+ render_static_404_error_page
162
+ end
163
+ end
104
164
  end
105
165
  end
@@ -6,7 +6,7 @@ module Pageflow
6
6
  return head 404 unless site.feeds_enabled?
7
7
 
8
8
  @feed = EntriesFeed.for(
9
- site: site,
9
+ site:,
10
10
  locale: params[:locale]
11
11
  )
12
12
 
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class FilesController < Pageflow::ApplicationController
3
4
  include PublicHttpsMode
4
5
  include EntryPasswordProtection
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class PagesController < Pageflow::ApplicationController
3
4
  respond_to :json
4
5
 
@@ -43,7 +44,7 @@ module Pageflow
43
44
 
44
45
  authorize!(:destroy, page)
45
46
  verify_edit_lock!(page.chapter.entry)
46
- page.chapter.entry.snapshot(:creator => current_user)
47
+ page.chapter.entry.snapshot(creator: current_user)
47
48
 
48
49
  page.destroy
49
50
 
@@ -54,7 +55,8 @@ module Pageflow
54
55
 
55
56
  def page_params
56
57
  configuration = params.require(:page)[:configuration].try(:permit!) || {}
57
- params.require(:page).permit(:template, :position, :title).merge(:configuration => configuration)
58
+ params.require(:page).permit(:template, :position,
59
+ :title).merge(configuration:)
58
60
  end
59
61
  end
60
62
  end
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class RevisionsController < Pageflow::ApplicationController
3
4
  include ControllerDelegation
4
5
  include QuotaVerification
@@ -38,7 +39,7 @@ module Pageflow
38
39
  end
39
40
 
40
41
  def delegate_to_entry_type_frontend_app!(entry)
41
- EntriesControllerEnvHelper.add_entry_info_to_env(request.env, entry: entry, mode: :preview)
42
+ EntriesControllerEnvHelper.add_entry_info_to_env(request.env, entry:, mode: :preview)
42
43
  delegate_to_rack_app!(entry.entry_type.frontend_app)
43
44
  end
44
45
  end
@@ -5,7 +5,7 @@ module Pageflow
5
5
  site = Site.for_request(request).first!
6
6
  return head 404 unless site.sitemap_enabled?
7
7
 
8
- @entries = Sitemaps.entries_for(site: site)
8
+ @entries = Sitemaps.entries_for(site:)
9
9
 
10
10
  respond_to do |format|
11
11
  format.xml
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class StorylinesController < Pageflow::ApplicationController
3
4
  respond_to :json
4
5
 
@@ -0,0 +1,12 @@
1
+ module Pageflow
2
+ module Admin
3
+ # @api private
4
+ module CutoffModesHelper
5
+ def cutoff_modes_collection(config)
6
+ config.cutoff_modes.names.map do |name|
7
+ [t(name, scope: 'pageflow.cutoff_modes'), name]
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module EntriesHelper
3
+ module EntriesHelper # rubocop:todo Style/Documentation
4
4
  def admin_entry_title(entry)
5
5
  if entry.title.blank?
6
6
  I18n.t('pageflow.admin.entries.default_title', id: entry.id)
@@ -0,0 +1,18 @@
1
+ module Pageflow
2
+ module Admin
3
+ # @api private
4
+ module EntryTranslationsHelper
5
+ include Pageflow::PublicI18n::LocalesHelper
6
+
7
+ def entry_translation_display_locale(entry)
8
+ display_locale = public_locale_name_for((entry.published_revision || entry.draft).locale)
9
+
10
+ if entry.default_translation?
11
+ t('pageflow.admin.entry_translations.default_translation', display_locale:)
12
+ else
13
+ display_locale
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module FeaturesHelper
3
+ module FeaturesHelper # rubocop:todo Style/Documentation
4
4
  def feature_state_select_tag(feature_target, feature_name)
5
5
  own_state = feature_target.own_feature_state(feature_name)
6
6
  inherited_state = feature_target.inherited_feature_state(feature_name)
@@ -1,13 +1,13 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module FormHelper
3
+ module FormHelper # rubocop:todo Style/Documentation
4
4
  # Using semantic_form_for directly causes Formtastic deprecation
5
5
  # warnings regarding `input_class_finder` and
6
6
  # `action_class_finder`. `active_admin_form_for` causes issues
7
7
  # in `erb` templates (see
8
8
  # https://github.com/activeadmin/activeadmin/issues/3916).
9
- def admin_form_for(resource, options = {}, &block)
10
- semantic_form_for(resource, options.merge(builder: ActiveAdmin::FormBuilder), &block)
9
+ def admin_form_for(resource, options = {}, &)
10
+ semantic_form_for(resource, options.merge(builder: ActiveAdmin::FormBuilder), &)
11
11
  end
12
12
  end
13
13
  end
@@ -1,9 +1,17 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module LocalesHelper
3
+ module LocalesHelper # rubocop:todo Style/Documentation
4
+ include Pageflow::PublicI18n::LocalesHelper
5
+
4
6
  def available_locales_collection
5
7
  Pageflow.config.available_locales.map do |locale|
6
- [I18n.t('language', locale: locale), locale.to_s]
8
+ [I18n.t('language', locale:), locale.to_s]
9
+ end
10
+ end
11
+
12
+ def available_public_locales_collection
13
+ Pageflow.config.available_public_locales.map do |locale|
14
+ [public_locale_name_for(locale), locale.to_s]
7
15
  end
8
16
  end
9
17
  end
@@ -1,22 +1,22 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module MembershipsHelper
4
- def membership_user_select(f, parent)
5
- if f.object.persisted?
6
- membership_disabled_select(f, :user, f.object.user, :formal_name)
3
+ module MembershipsHelper # rubocop:todo Style/Documentation
4
+ def membership_user_select(form, parent)
5
+ if form.object.persisted?
6
+ membership_disabled_select(form, :user, form.object.user, :formal_name)
7
7
  elsif parent.is_a?(User)
8
- membership_disabled_select(f, :user, parent, :formal_name)
8
+ membership_disabled_select(form, :user, parent, :formal_name)
9
9
  else
10
10
  parent_type = parent.class.model_name.singular_route_key
11
- membership_select(f, :user, parent, :"potential_users_for_#{parent_type}")
11
+ membership_select(form, :user, parent, :"potential_users_for_#{parent_type}")
12
12
  end
13
13
  end
14
14
 
15
- def membership_entity_select(f, parent, entity_type)
15
+ def membership_entity_select(form, parent, entity_type)
16
16
  if entity_type == 'Pageflow::Entry'
17
- membership_entry_select(f, parent)
17
+ membership_entry_select(form, parent)
18
18
  else
19
- membership_account_select(f, parent)
19
+ membership_account_select(form, parent)
20
20
  end
21
21
  end
22
22
 
@@ -35,41 +35,41 @@ module Pageflow
35
35
 
36
36
  private
37
37
 
38
- def membership_entry_select(f, parent)
39
- if f.object.persisted?
40
- membership_disabled_select(f, :entity, f.object.entity, :title)
38
+ def membership_entry_select(form, parent)
39
+ if form.object.persisted?
40
+ membership_disabled_select(form, :entity, form.object.entity, :title)
41
41
  elsif parent.is_a?(Entry)
42
- membership_disabled_select(f, :entity, parent, :title)
42
+ membership_disabled_select(form, :entity, parent, :title)
43
43
  else
44
- membership_select(f, :entry, parent, :potential_entries_for_user)
44
+ membership_select(form, :entry, parent, :potential_entries_for_user)
45
45
  end
46
46
  end
47
47
 
48
- def membership_account_select(f, parent)
49
- if f.object.persisted?
50
- membership_disabled_select(f, :entity, f.object.entity, :name)
48
+ def membership_account_select(form, parent)
49
+ if form.object.persisted?
50
+ membership_disabled_select(form, :entity, form.object.entity, :name)
51
51
  elsif parent.is_a?(Account)
52
- membership_disabled_select(f, :entity, parent, :name)
52
+ membership_disabled_select(form, :entity, parent, :name)
53
53
  else
54
- membership_select(f, :entity, parent, :potential_accounts_for_user)
54
+ membership_select(form, :entity, parent, :potential_accounts_for_user)
55
55
  end
56
56
  end
57
57
 
58
- def membership_select(f, name, parent, collection_name)
59
- f.input(name,
60
- as: :searchable_select,
61
- ajax: {resource: Membership,
62
- collection_name: collection_name,
63
- params: {parent_id: parent.id}},
64
- include_blank: false)
58
+ def membership_select(form, name, parent, collection_name)
59
+ form.input(name,
60
+ as: :searchable_select,
61
+ ajax: {resource: Membership,
62
+ collection_name:,
63
+ params: {parent_id: parent.id}},
64
+ include_blank: false)
65
65
  end
66
66
 
67
- def membership_disabled_select(f, name, record, text_method)
68
- f.input(name,
69
- as: :searchable_select,
70
- collection: [[record.send(text_method), record.id]],
71
- include_blank: false,
72
- input_html: {disabled: true})
67
+ def membership_disabled_select(form, name, record, text_method)
68
+ form.input(name,
69
+ as: :searchable_select,
70
+ collection: [[record.send(text_method), record.id]],
71
+ include_blank: false,
72
+ input_html: {disabled: true})
73
73
  end
74
74
  end
75
75
  end
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module RevisionsHelper
3
+ module RevisionsHelper # rubocop:todo Style/Documentation
4
4
  def revision_css_class(revision)
5
5
  css_classes = []
6
6
  css_classes << 'published' if revision.published?
@@ -0,0 +1,22 @@
1
+ module Pageflow
2
+ module Admin
3
+ # @api private
4
+ module SitesHelper
5
+ def site_home_url_hint(site)
6
+ if site&.persisted?
7
+ if (root_entry = site.root_entry)
8
+ t('pageflow.admin.sites.home_url_with_root_entry_hint_html',
9
+ entry_title: root_entry.title,
10
+ entry_url: admin_entry_path(root_entry))
11
+ else
12
+ t('pageflow.admin.sites.home_url_hint_html',
13
+ choose_url: admin_site_root_entry_choose_path(site_id: site),
14
+ new_url: new_admin_entry_path(site_id: site, at: 'root'))
15
+ end
16
+ else
17
+ t('pageflow.admin.sites.home_url_new_site_hint')
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end