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
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module UsersHelper
3
+ module UsersHelper # rubocop:todo Style/Documentation
4
4
  include QuotaHelper
5
5
 
6
6
  def users_quota_state(account)
@@ -11,13 +11,15 @@ module Pageflow
11
11
  }
12
12
 
13
13
  render('pageflow/admin/users/quota_state',
14
- account: account,
15
- quota: quota,
16
- data_attributes: data_attributes)
14
+ account:,
15
+ quota:,
16
+ data_attributes:)
17
17
  end
18
18
 
19
19
  def collection_for_user_roles
20
- User.roles_accessible_by(current_ability).index_by { |role| t(role, :scope => 'pageflow.admin.users.roles') }
20
+ User.roles_accessible_by(current_ability).index_by do |role|
21
+ t(role, scope: 'pageflow.admin.users.roles')
22
+ end
21
23
  end
22
24
 
23
25
  def delete_own_user_section
@@ -1,11 +1,11 @@
1
1
  module Pageflow
2
2
  module Admin
3
- module WidgetsHelper
3
+ module WidgetsHelper # rubocop:todo Style/Documentation
4
4
  def admin_widgets_fields(form, config)
5
5
  render('pageflow/admin/widgets/fields',
6
6
  widgets: form.object.widgets.resolve(config, include_placeholders: true),
7
- form: form,
8
- config: config)
7
+ form:,
8
+ config:)
9
9
  end
10
10
 
11
11
  def admin_widget_types_collection_for_role(config, role)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module AssetUrlsHelper
2
+ module AssetUrlsHelper # rubocop:todo Style/Documentation
3
3
  include RenderJsonHelper
4
4
 
5
5
  def editor_asset_urls
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module AudioFilesHelper
2
+ module AudioFilesHelper # rubocop:todo Style/Documentation
3
3
  include RevisionFileHelper
4
4
 
5
5
  def audio_file_audio_tag(audio_file_perma_id, options = {})
@@ -10,6 +10,7 @@ module Pageflow
10
10
 
11
11
  audio_file = find_file_in_entry(AudioFile, audio_file_perma_id)
12
12
  return unless audio_file
13
+
13
14
  content_tag(:audio, options) do
14
15
  audio_file_sources(audio_file, url_options).each do |source|
15
16
  concat(tag(:source, source.slice(:src, :type)))
@@ -20,14 +21,16 @@ module Pageflow
20
21
  def audio_file_script_tag(audio_file_perma_id, options = {})
21
22
  audio_file = find_file_in_entry(AudioFile, audio_file_perma_id)
22
23
  return unless audio_file
24
+
23
25
  render('pageflow/audio_files/script_tag',
24
- audio_file: audio_file,
26
+ audio_file:,
25
27
  audio_file_sources: audio_file_sources(audio_file, options))
26
28
  end
27
29
 
28
30
  def audio_file_non_js_link(entry, audio_file_perma_id)
29
31
  audio_file = find_file_in_entry(AudioFile, audio_file_perma_id)
30
32
  return unless audio_file
33
+
31
34
  link_to(t('pageflow.audio.open'), short_audio_file_path(entry, audio_file))
32
35
  end
33
36
 
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module BackgroundImageHelper
2
+ module BackgroundImageHelper # rubocop:todo Style/Documentation
3
3
  include RevisionFileHelper
4
4
 
5
5
  def background_image_div(configuration, property_base_name, options = {})
@@ -24,7 +24,7 @@ module Pageflow
24
24
  ".load_all_images .#{css_class}, .load_image.#{css_class}"
25
25
  end
26
26
 
27
- class Div
27
+ class Div # rubocop:todo Style/Documentation
28
28
  attr_reader :configuration, :property_base_name, :options
29
29
 
30
30
  delegate :content_tag, to: :@template
@@ -71,7 +71,7 @@ module Pageflow
71
71
 
72
72
  def background_position(coord)
73
73
  property_name = "#{property_base_name}_#{coord}"
74
- configuration.key?(property_name) ? "#{configuration[property_name]}%" : "50%"
74
+ configuration.key?(property_name) ? "#{configuration[property_name]}%" : '50%'
75
75
  end
76
76
 
77
77
  def file_type
@@ -80,7 +80,7 @@ module Pageflow
80
80
  end
81
81
  end
82
82
 
83
- class DivWithSizeAttributes < Div
83
+ class DivWithSizeAttributes < Div # rubocop:todo Style/Documentation
84
84
  include RevisionFileHelper
85
85
 
86
86
  def data_attributes
@@ -93,7 +93,8 @@ module Pageflow
93
93
 
94
94
  def inline_style
95
95
  if options[:spanning]
96
- "padding-top: #{padding_top}%; width: 100%; background-position: 0 0" # fix me (yet disables background_position option)
96
+ "padding-top: #{padding_top}%; width: 100%; " \
97
+ 'background-position: 0 0' # fix me (yet disables background_position option)
97
98
  else
98
99
  super
99
100
  end
@@ -110,7 +111,7 @@ module Pageflow
110
111
  end
111
112
 
112
113
  def file
113
- @file ||= (find_file || :none)
114
+ @file ||= find_file || :none
114
115
  @file == :none ? nil : @file
115
116
  end
116
117
 
@@ -18,7 +18,7 @@ module Pageflow
18
18
  json.file_model_types { config_file_model_types_seed(json, config) }
19
19
  end
20
20
 
21
- class PageTypesSeed
21
+ class PageTypesSeed # rubocop:todo Style/Documentation
22
22
  attr_reader :config
23
23
 
24
24
  def initialize(config)
@@ -58,9 +58,7 @@ module Pageflow
58
58
  def condition(candidate)
59
59
  result = candidate[:unless] || candidate[:if]
60
60
 
61
- if result
62
- result[:negated] = !!candidate[:unless]
63
- end
61
+ result[:negated] = !!candidate[:unless] if result
64
62
 
65
63
  result
66
64
  end
@@ -5,7 +5,7 @@ module Pageflow
5
5
  include RenderJsonHelper
6
6
 
7
7
  def editor_config_seeds(entry)
8
- render_json_partial('pageflow/editor/config/seeds', entry: entry)
8
+ render_json_partial('pageflow/editor/config/seeds', entry:)
9
9
  end
10
10
  end
11
11
  end
@@ -11,7 +11,7 @@ module Pageflow
11
11
  inner = Pageflow.config.file_types.map { |file_type|
12
12
  json = render_json_partial(partial: 'pageflow/editor/files/file',
13
13
  collection: entry.find_files(file_type.model),
14
- locals: {file_type: file_type},
14
+ locals: {file_type:},
15
15
  as: :file)
16
16
 
17
17
  %("#{file_type.collection_name}": #{json})
@@ -1,17 +1,17 @@
1
1
  module Pageflow
2
- module EmbedCodeHelper
2
+ module EmbedCodeHelper # rubocop:todo Style/Documentation
3
3
  def embed_code_entry_snippet(entry)
4
4
  Pageflow::EmbedCodeHelper::EntrySnippet.new(pageflow, entry)
5
5
  end
6
6
 
7
- class EntrySnippet
7
+ class EntrySnippet # rubocop:todo Style/Documentation
8
8
  def initialize(routes, entry)
9
9
  @routes = routes
10
10
  @entry = entry
11
11
  end
12
12
 
13
13
  def call
14
- %'<iframe src="#{url(entry)}" allowfullscreen></iframe>'
14
+ %(<iframe src="#{url(entry)}" allowfullscreen></iframe>)
15
15
  end
16
16
 
17
17
  private
@@ -1,10 +1,10 @@
1
1
  module Pageflow
2
- module EntriesHelper
2
+ module EntriesHelper # rubocop:todo Style/Documentation
3
3
  def pretty_entry_title(entry)
4
4
  return entry.title if entry.site.title == ' '
5
5
 
6
6
  [entry.title,
7
- entry.site.title.presence || entry.site.cname_domain.presence].compact.join(' - ')
7
+ entry.site.display_title].compact.join(' - ')
8
8
  end
9
9
 
10
10
  def pretty_entry_url(entry, options = {})
@@ -15,7 +15,7 @@ module Pageflow
15
15
  module PrettyUrl
16
16
  extend self
17
17
 
18
- def build(routes, entry, options)
18
+ def build(routes, entry, options = {})
19
19
  with_custom_canonical_url_prefix(entry) ||
20
20
  default(routes, entry, options)
21
21
  end
@@ -24,32 +24,44 @@ module Pageflow
24
24
 
25
25
  def with_custom_canonical_url_prefix(entry)
26
26
  return if entry.site.canonical_entry_url_prefix.blank?
27
+
27
28
  entry = ensure_entry_with_revision(entry)
28
29
 
29
30
  [
30
31
  entry.site.canonical_entry_url_prefix.gsub(':locale', entry.locale),
31
- entry.to_param,
32
+ entry_suffix(entry),
32
33
  entry.site.trailing_slash_in_canonical_urls ? '/' : ''
33
34
  ].join
34
35
  end
35
36
 
37
+ def entry_suffix(entry)
38
+ if entry.permalink.present?
39
+ entry_permalink_parts(entry).join
40
+ else
41
+ entry.to_param
42
+ end
43
+ end
44
+
36
45
  def default(routes, entry, options)
37
46
  params =
38
47
  options
39
48
  .reverse_merge(trailing_slash: entry.site.trailing_slash_in_canonical_urls)
40
- .reverse_merge(Pageflow.config.site_url_options(entry.site) || {})
49
+ .reverse_merge(Pageflow.config_for(entry).public_entry_url_options_for(entry) || {})
41
50
 
42
51
  if entry.permalink.present?
43
- routes.permalink_url(
44
- entry.permalink.directory&.path || '',
45
- entry.permalink.slug,
46
- params
47
- )
52
+ routes.permalink_url(*entry_permalink_parts(entry), params)
48
53
  else
49
54
  routes.short_entry_url(entry.to_model, params)
50
55
  end
51
56
  end
52
57
 
58
+ def entry_permalink_parts(entry)
59
+ [
60
+ entry.permalink.directory&.path || '',
61
+ entry.permalink.slug
62
+ ]
63
+ end
64
+
53
65
  def ensure_entry_with_revision(entry)
54
66
  if entry.is_a?(EntryAtRevision)
55
67
  entry
@@ -61,58 +73,71 @@ module Pageflow
61
73
 
62
74
  def entry_privacy_link_url(entry)
63
75
  return unless entry.site.privacy_link_url.present?
76
+ return entry.site.privacy_link_url if entry.site.privacy_link_url.start_with?('javascript:')
77
+
64
78
  "#{entry.site.privacy_link_url}?lang=#{entry.locale}"
65
79
  end
66
80
 
67
81
  def entry_file_rights(entry)
68
- rights = Pageflow.config.file_types.map do |file_type|
82
+ rights = Pageflow.config.file_types.map { |file_type|
69
83
  entry.find_files(file_type.model).map do |file|
70
84
  file.rights.presence || entry.account.default_file_rights.presence
71
85
  end
72
- end.flatten.compact.sort.uniq
86
+ }.flatten.compact.sort.uniq
73
87
 
74
88
  if rights.any?
75
89
  content_tag :p, class: 'rights' do
76
- I18n.t('pageflow.helpers.entries.image_rights') + ": " + rights * ', '
90
+ "#{I18n.t('pageflow.helpers.entries.image_rights')}: #{rights * ', '}"
77
91
  end
78
92
  else
79
93
  ''
80
94
  end
81
95
  end
82
96
 
83
- def entry_global_links(entry)
97
+ # rubocop:todo Metrics/PerceivedComplexity
98
+ # rubocop:todo Metrics/CyclomaticComplexity
99
+ def entry_global_links(entry) # rubocop:todo Metrics/AbcSize
84
100
  links = []
85
101
 
86
102
  if entry.site.imprint_link_label.present? && entry.site.imprint_link_url.present?
87
- links << link_to(raw(entry.site.imprint_link_label),
88
- entry.site.imprint_link_url,
89
- target: '_blank',
90
- tabindex: 2,
91
- class: 'legal')
103
+ links << link_to(
104
+ raw(entry.site.imprint_link_label),
105
+ entry.site.imprint_link_url,
106
+ target: entry.site.imprint_link_url.start_with?('javascript:') ? nil : '_blank',
107
+ tabindex: 2,
108
+ class: 'legal'
109
+ )
92
110
  end
93
111
 
94
112
  if entry.site.copyright_link_label.present? && entry.site.copyright_link_url.present?
95
- links << link_to(raw(entry.site.copyright_link_label),
96
- entry.site.copyright_link_url,
97
- target: '_blank',
98
- tabindex: 2,
99
- class: 'copy')
113
+ links << link_to(
114
+ raw(entry.site.copyright_link_label),
115
+ entry.site.copyright_link_url,
116
+ target: entry.site.copyright_link_url.start_with?('javascript:') ? nil : '_blank',
117
+ tabindex: 2,
118
+ class: 'copy'
119
+ )
100
120
  end
101
121
 
102
122
  if entry.site.privacy_link_url.present?
103
- links << link_to(I18n.t('pageflow.public.privacy_notice'),
104
- entry_privacy_link_url(entry),
105
- target: '_blank',
106
- tabindex: 2,
107
- class: 'privacy')
123
+ links << link_to(
124
+ I18n.t('pageflow.public.privacy_notice'),
125
+ entry_privacy_link_url(entry),
126
+ target: entry.site.privacy_link_url.start_with?('javascript:') ? nil : '_blank',
127
+ tabindex: 2,
128
+ class: 'privacy'
129
+ )
108
130
  end
109
131
 
110
132
  if links.any?
111
- content_tag(:span, I18n.t('pageflow.helpers.entries.global_links'), class: 'hidden') + safe_join(links, ''.html_safe)
133
+ content_tag(:span, I18n.t('pageflow.helpers.entries.global_links'),
134
+ class: 'hidden') + safe_join(links, ''.html_safe)
112
135
  else
113
136
  ''
114
137
  end
115
138
  end
139
+ # rubocop:enable Metrics/CyclomaticComplexity
140
+ # rubocop:enable Metrics/PerceivedComplexity
116
141
 
117
142
  def entry_theme_stylesheet_link_tag(entry)
118
143
  stylesheet_link_tag(entry.theme.stylesheet_path,
@@ -156,15 +181,14 @@ module Pageflow
156
181
 
157
182
  def entry_header_css_class(entry)
158
183
  css_class = 'header'
159
- if entry.pages.any? && entry.pages.first.configuration['invert']
160
- css_class += ' invert'
161
- end
184
+ css_class += ' invert' if entry.pages.any? && entry.pages.first.configuration['invert']
162
185
  css_class
163
186
  end
164
187
 
165
188
  def entry_summary(entry)
166
189
  return '' if entry.summary.blank?
167
- strip_tags(entry.summary.gsub(/<br ?\/?>/, ' ').squish)
190
+
191
+ strip_tags(entry.summary.gsub(%r{<br ?/?>}, ' ').squish)
168
192
  end
169
193
  end
170
194
  end
@@ -9,7 +9,7 @@ module Pageflow
9
9
 
10
10
  def entry_json_seed(entry)
11
11
  sanitize_json(render_json_partial('pageflow/entry_json_seed/entry',
12
- entry: entry)).html_safe
12
+ entry:)).html_safe
13
13
  end
14
14
 
15
15
  def entry_attributes_seed(entry)
@@ -23,7 +23,8 @@ module Pageflow
23
23
  def entry_theme_seed(entry)
24
24
  theme = entry.theme
25
25
  {
26
- change_to_parent_page_at_storyline_boundary: theme.change_to_parent_page_at_storyline_boundary?,
26
+ change_to_parent_page_at_storyline_boundary:
27
+ theme.change_to_parent_page_at_storyline_boundary?,
27
28
  page_change_by_scrolling: theme.page_change_by_scrolling?,
28
29
  hide_text_on_swipe: theme.hide_text_on_swipe?
29
30
  }
@@ -14,14 +14,14 @@ module Pageflow
14
14
  {
15
15
  locale: entry.locale,
16
16
  format: 'atom'
17
- }.merge(Pageflow.config.site_url_options(entry.site) || {})
17
+ }.merge(Pageflow.config.site_url_options_for(entry.site) || {})
18
18
  )
19
19
 
20
20
  tag(:link,
21
21
  rel: 'alternate',
22
22
  type: 'application/atom+xml',
23
23
  title: 'Feed',
24
- href: href)
24
+ href:)
25
25
  end
26
26
 
27
27
  # @api private
@@ -37,10 +37,10 @@ module Pageflow
37
37
  end
38
38
 
39
39
  def rules_for_file(file_type, file)
40
- file_type.css_background_image_urls_for(file, entry: entry).map do |name, url|
40
+ file_type.css_background_image_urls_for(file, entry:).map do |name, url|
41
41
  {
42
42
  prefix: rule_prefix(file_type, name),
43
- file: file,
43
+ file:,
44
44
  url: url_for_breakpoint(file_type, url)
45
45
  }
46
46
  end
@@ -1,18 +1,19 @@
1
1
  module Pageflow
2
- module FileThumbnailsHelper
2
+ module FileThumbnailsHelper # rubocop:todo Style/Documentation
3
3
  def file_thumbnails_css(revision)
4
4
  render(partial: 'pageflow/file_types/thumbnails',
5
5
  collection: Pageflow.config.file_types.with_thumbnail_support,
6
6
  as: :file_type,
7
7
  locals: {
8
- revision: revision,
8
+ revision:,
9
9
  styles: Pageflow.config.css_rendered_thumbnail_styles
10
10
  })
11
11
  end
12
12
 
13
13
  def file_thumbnail_css_class(file, style)
14
14
  return if file.blank?
15
- [file.to_model.class.model_name.singular, style, file.perma_id] * '_'
15
+
16
+ [file.to_model.class.model_name.singular, style, file.perma_id].join('_')
16
17
  end
17
18
  end
18
19
  end
@@ -11,7 +11,7 @@ module Pageflow
11
11
  if file.width && file.height
12
12
  "#{file.width} x #{file.height}px"
13
13
  else
14
- "-"
14
+ '-'
15
15
  end
16
16
  end
17
17
 
@@ -22,9 +22,10 @@ module Pageflow
22
22
  minutes = (total_seconds / 60) % 60
23
23
  hours = total_seconds / (60 * 60)
24
24
 
25
- format("%02d:%02d:%02d", hours, minutes, seconds)
25
+ format('%<hours>02d:%<minutes>02d:%<seconds>02d', hours:, minutes:,
26
+ seconds:)
26
27
  else
27
- "-"
28
+ '-'
28
29
  end
29
30
  end
30
31
 
@@ -37,7 +38,7 @@ module Pageflow
37
38
  Pageflow.config.file_types.each do |file_type|
38
39
  json.set!(file_type.collection_name) do
39
40
  json.array!(entry.find_files(file_type.model)) do |file|
40
- json.partial!('pageflow/files/file', file: file, file_type: file_type)
41
+ json.partial!('pageflow/files/file', file:, file_type:)
41
42
  end
42
43
  end
43
44
  end
@@ -1,8 +1,11 @@
1
1
  module Pageflow
2
- module FoldersHelper
2
+ module FoldersHelper # rubocop:todo Style/Documentation
3
3
  def collection_for_folders(current_account, current_folder = nil)
4
- accounts = AccountPolicy::Scope.new(current_user, Pageflow::Account)
5
- .entry_creatable.includes(:folders).where('pageflow_folders.id IS NOT NULL')
4
+ accounts = AccountPolicy::Scope
5
+ .new(current_user, Pageflow::Account)
6
+ .entry_creatable
7
+ .includes(:folders)
8
+ .where('pageflow_folders.id IS NOT NULL')
6
9
  .order(:name, 'pageflow_folders.name')
7
10
 
8
11
  option_groups_from_collection_for_select(accounts,
@@ -23,9 +26,9 @@ module Pageflow
23
26
  account_folders[0][:account_id] == current_account.id
24
27
  end
25
28
 
26
- folders_array.map(&:to_a).map do |account_folders|
29
+ folders_array.map(&:to_a).map { |account_folders|
27
30
  account_folders.map(&:id)
28
- end.flatten
31
+ }.flatten
29
32
  end
30
33
  end
31
34
  end
@@ -11,9 +11,9 @@ module Pageflow
11
11
  render('pageflow/help_entries/menu', help_entries: config.help_entries)
12
12
  end
13
13
 
14
- def help_entry_li(help_entry, &block)
14
+ def help_entry_li(help_entry, &)
15
15
  css_class = help_entry.children.present? ? 'expandable' : nil
16
- content_tag(:li, class: css_class, &block)
16
+ content_tag(:li, class: css_class, &)
17
17
  end
18
18
  end
19
19
  end
@@ -0,0 +1,37 @@
1
+ module Pageflow
2
+ # Helpers to render alternate links to translations of an entry.
3
+ #
4
+ # @since 17.1
5
+ module HreflangLinksHelper
6
+ include SocialShareHelper
7
+
8
+ # Render alternate links to all published entries that have been
9
+ # marked as translations of the given entry.
10
+ def hreflang_link_tags_for_entry(entry)
11
+ safe_join(
12
+ translations_for_hreflang_links(entry).each_with_object([]) do |translation, links|
13
+ links << hreflang_link_tag(translation)
14
+
15
+ if translation.default_translation?
16
+ links << hreflang_link_tag(translation, hreflang: 'x-default')
17
+ end
18
+ end
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ def translations_for_hreflang_links(entry)
25
+ entry.translations(
26
+ -> { preload(:site, :account, :translation_group, permalink: :directory) }
27
+ )
28
+ end
29
+
30
+ def hreflang_link_tag(entry, hreflang: entry.locale)
31
+ tag('link',
32
+ rel: 'alternate',
33
+ hreflang:,
34
+ href: social_share_entry_url(entry))
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module InfoBoxHelper
2
+ module InfoBoxHelper # rubocop:todo Style/Documentation
3
3
  def info_box(configuration)
4
4
  css_classes = ['add_info_box']
5
5
 
@@ -9,23 +9,19 @@ module Pageflow
9
9
  css_classes << 'empty'
10
10
  end
11
11
 
12
- if configuration['additional_title'].blank?
13
- css_classes << 'title_empty'
14
- end
12
+ css_classes << 'title_empty' if configuration['additional_title'].blank?
15
13
 
16
- if configuration['additional_description'].blank?
17
- css_classes << 'description_empty'
18
- end
14
+ css_classes << 'description_empty' if configuration['additional_description'].blank?
19
15
 
20
16
  render('pageflow/pages/info_box',
21
- configuration: configuration,
17
+ configuration:,
22
18
  css_class: css_classes * ' ')
23
19
  end
24
20
 
25
21
  def info_box_title(title)
26
- if title.present?
27
- content_tag(:h3, title)
28
- end
22
+ return unless title.present?
23
+
24
+ content_tag(:h3, title)
29
25
  end
30
26
  end
31
27
  end
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
- module MediaQueryHelper
3
- def media_query(condition, &block)
4
- content = capture(&block)
2
+ module MediaQueryHelper # rubocop:todo Style/Documentation
3
+ def media_query(condition, &)
4
+ content = capture(&)
5
5
 
6
6
  if condition == :default
7
7
  content
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module NavigationBarHelper
2
+ module NavigationBarHelper # rubocop:todo Style/Documentation
3
3
  def navigation_bar_css_class(entry, options = {})
4
4
  [
5
5
  options[:class],
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module OverviewHelper
2
+ module OverviewHelper # rubocop:todo Style/Documentation
3
3
  def overview_page_description(page)
4
4
  if page.configuration['description'].present?
5
5
  raw(page.configuration['description'])
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module PageTypesHelper
2
+ module PageTypesHelper # rubocop:todo Style/Documentation
3
3
  include RenderJsonHelper
4
4
 
5
5
  def page_type_json_seeds(config)
@@ -9,9 +9,9 @@ module Pageflow
9
9
  end
10
10
 
11
11
  def page_type_json_seed(json, page_type)
12
- if page_type.json_seed_template
13
- json.partial!(template: page_type.json_seed_template, locals: {page_type: page_type})
14
- end
12
+ return unless page_type.json_seed_template
13
+
14
+ json.partial!(template: page_type.json_seed_template, locals: {page_type:})
15
15
  end
16
16
 
17
17
  def page_type_templates(entry)
@@ -24,7 +24,7 @@ module Pageflow
24
24
  locals: {
25
25
  configuration: {},
26
26
  page: Page.new,
27
- entry: entry
27
+ entry:
28
28
  },
29
29
  layout: false).to_str,
30
30
  type: 'text/html', data: {template: "#{page_type.name}_page"})