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,27 +1,40 @@
1
1
  module Pageflow
2
- module PagesHelper
2
+ module PagesHelper # rubocop:todo Style/Documentation
3
3
  def render_page_template(page, locals = {})
4
4
  page_type = Pageflow.config.page_types.find_by_name!(page.template)
5
5
 
6
6
  render(template: page_type.template_path,
7
- locals: locals.merge(page: page,
7
+ locals: locals.merge(page:,
8
8
  configuration: page.configuration))
9
9
  end
10
10
 
11
- def page_css_class(page)
11
+ # rubocop:todo Metrics/PerceivedComplexity
12
+ # rubocop:todo Metrics/CyclomaticComplexity
13
+ def page_css_class(page) # rubocop:todo Metrics/AbcSize
12
14
  classes = ['page']
13
15
  classes << 'invert' if page.configuration['invert']
14
16
  classes << 'hide_title' if page.configuration['hide_title']
15
- classes << "text_position_#{page.configuration['text_position']}" if page.configuration['text_position'].present?
16
- classes << "scroll_indicator_mode_#{page.configuration['scroll_indicator_mode']}" if page.configuration['scroll_indicator_mode'].present?
17
- classes << "scroll_indicator_orientation_#{page.configuration['scroll_indicator_orientation']}" if page.configuration['scroll_indicator_orientation'].present?
18
- classes << "delayed_text_fade_in_#{page.configuration['delayed_text_fade_in']}" if page.configuration['delayed_text_fade_in'].present?
17
+ if page.configuration['text_position'].present?
18
+ classes << "text_position_#{page.configuration['text_position']}"
19
+ end
20
+ if page.configuration['scroll_indicator_mode'].present?
21
+ classes << "scroll_indicator_mode_#{page.configuration['scroll_indicator_mode']}"
22
+ end
23
+ if page.configuration['scroll_indicator_orientation'].present?
24
+ classes <<
25
+ "scroll_indicator_orientation_#{page.configuration['scroll_indicator_orientation']}"
26
+ end
27
+ if page.configuration['delayed_text_fade_in'].present?
28
+ classes << "delayed_text_fade_in_#{page.configuration['delayed_text_fade_in']}"
29
+ end
19
30
  classes << 'chapter_beginning' if page.position == 0
20
31
  classes << 'first_page' if page.is_first
21
- classes << 'no_text_content' if !page_has_content(page)
32
+ classes << 'no_text_content' unless page_has_content(page)
22
33
  classes << 'hide_logo' if page.configuration['hide_logo']
23
34
  classes.join(' ')
24
35
  end
36
+ # rubocop:enable Metrics/CyclomaticComplexity
37
+ # rubocop:enable Metrics/PerceivedComplexity
25
38
 
26
39
  def page_default_content(page)
27
40
  safe_join([
@@ -56,7 +69,7 @@ module Pageflow
56
69
 
57
70
  # @api private
58
71
  def page_has_content(page)
59
- has_title = ['title','subtitle','tagline'].any? do |attribute|
72
+ has_title = ['title', 'subtitle', 'tagline'].any? do |attribute|
60
73
  page.configuration[attribute].present?
61
74
  end
62
75
 
@@ -70,14 +83,14 @@ module Pageflow
70
83
  classes << 'chapter_beginning' if page.position == 0
71
84
  classes << 'emphasized' if page.configuration['emphasize_in_navigation']
72
85
  classes << "chapter_#{page.chapter.position}"
73
- page.chapter.position % 2 == 0 ? classes << 'chapter_even' : classes << 'chapter_odd'
86
+ classes << (page.chapter.position.even? ? 'chapter_even' : 'chapter_odd')
74
87
  classes.join(' ')
75
88
  end
76
89
 
77
90
  def shadow_div(options = {})
78
91
  style = options[:opacity] ? "opacity: #{options[:opacity] / 100.0};" : nil
79
- content_tag(:div, '', :class => 'shadow_wrapper') do
80
- content_tag(:div, '', :class => 'shadow', :style => style)
92
+ content_tag(:div, '', class: 'shadow_wrapper') do
93
+ content_tag(:div, '', class: 'shadow', style:)
81
94
  end
82
95
  end
83
96
 
@@ -89,11 +102,12 @@ module Pageflow
89
102
  end
90
103
 
91
104
  def page_thumbnail_image_class(page, hero)
92
- file_thumbnail_css_class(page_thumbnail_file(page), hero ? :link_thumbnail_large : :link_thumbnail)
105
+ file_thumbnail_css_class(page_thumbnail_file(page),
106
+ hero ? :link_thumbnail_large : :link_thumbnail)
93
107
  end
94
108
 
95
- def page_thumbnail_url(page, *args)
96
- page_thumbnail_file(page).thumbnail_url(*args)
109
+ def page_thumbnail_url(page, *)
110
+ page_thumbnail_file(page).thumbnail_url(*)
97
111
  end
98
112
 
99
113
  def page_thumbnail_file(page)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module PublicI18nHelper
2
+ module PublicI18nHelper # rubocop:todo Style/Documentation
3
3
  def public_i18n_javascript_tag(entry)
4
4
  render('pageflow/public_i18n/javascript_tag',
5
5
  entry_locale: entry.locale,
@@ -1,11 +1,11 @@
1
1
  module Pageflow
2
- module QuotaHelper
2
+ module QuotaHelper # rubocop:todo Style/Documentation
3
3
  def quota_state_description(name, account)
4
4
  description = Pageflow.config.quotas.get(name, account).state_description
5
5
 
6
- if description
7
- content_tag(:p, description, class: 'quota_state_description')
8
- end
6
+ return unless description
7
+
8
+ content_tag(:p, description, class: 'quota_state_description')
9
9
  end
10
10
  end
11
11
  end
@@ -3,14 +3,17 @@ module Pageflow
3
3
  module RenderJsonHelper
4
4
  # Renders `image_files/_image_file.json.jbuilder` when given a
5
5
  # collection of `ImageFile` records.
6
- def render_json_seed(records, options = {})
6
+ def render_json_seed(records, _options = {}) # rubocop:todo Metrics/AbcSize
7
7
  if records.respond_to?(:to_model)
8
8
  name = records.to_model.class.model_name.to_s.split('::').last.underscore.downcase
9
- render_json_partial(['pageflow/editor', name.pluralize, name.singularize] * '/', name.singularize.to_sym => records)
9
+ render_json_partial(['pageflow/editor', name.pluralize, name.singularize].join('/'),
10
+ name.singularize.to_sym => records)
10
11
  else
11
12
  return '[]'.html_safe if records.empty?
13
+
12
14
  name = records.first.to_model.class.model_name.to_s.split('::').last.underscore.downcase
13
- render_json_partial(['pageflow/editor', name.pluralize, name.singularize] * '/', :collection => records, :as => name.singularize.to_sym)
15
+ render_json_partial(['pageflow/editor', name.pluralize, name.singularize].join('/'),
16
+ collection: records, as: name.singularize.to_sym)
14
17
  end
15
18
  end
16
19
 
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module RevisionFileHelper
2
+ module RevisionFileHelper # rubocop:todo Style/Documentation
3
3
  # Instead of finding a file directly by its ID (stored in configuration hashes for example),
4
4
  # finds the file by its usages perma_id within the scope of the revisions usages.
5
5
  # The @entry instance variable (of type DraftEntry or PublishedEntry)
@@ -21,6 +21,7 @@ module Pageflow
21
21
  # @returns UsedFile
22
22
  def find_file_in_entry(file_type, file_perma_id, entry = @entry)
23
23
  raise 'No entry of type PublishedEntry or DraftEntry set.' unless entry.present?
24
+
24
25
  entry.find_file_by_perma_id(file_type, file_perma_id)
25
26
  end
26
27
  end
@@ -1,11 +1,11 @@
1
1
  module Pageflow
2
- module SitesHelper
3
- DEFAULT_PUBLIC_ENTRY_OPTIONS = lambda do |site|
2
+ module SitesHelper # rubocop:todo Style/Documentation
3
+ DEFAULT_SITE_URL_OPTIONS = lambda do |site|
4
4
  site.cname.present? ? {host: site.cname} : nil
5
5
  end
6
6
 
7
7
  def pretty_site_url(site)
8
- pageflow.public_root_url(Pageflow.config.site_url_options(site))
8
+ pageflow.public_root_url(Pageflow.config.site_url_options_for(site))
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module SocialShareHelper
2
+ module SocialShareHelper # rubocop:todo Style/Documentation
3
3
  include EntriesHelper
4
4
  include PagesHelper
5
5
  include RevisionFileHelper
@@ -39,8 +39,13 @@ module Pageflow
39
39
  end
40
40
 
41
41
  def social_share_page_description(entry, page)
42
- return social_share_sanitize(page.configuration['text']) if page.configuration['text'].present?
43
- return social_share_sanitize(page.configuration['description']) if page.configuration['description'].present?
42
+ if page.configuration['text'].present?
43
+ return social_share_sanitize(page.configuration['text'])
44
+ end
45
+ if page.configuration['description'].present?
46
+ return social_share_sanitize(page.configuration['description'])
47
+ end
48
+
44
49
  social_share_entry_description(entry)
45
50
  end
46
51
 
@@ -48,23 +53,31 @@ module Pageflow
48
53
  return social_share_sanitize(entry.summary) if entry.summary.present?
49
54
 
50
55
  entry.pages.each do |page|
51
- return social_share_sanitize(page.configuration['text']) if page.configuration['text'].present?
56
+ if page.configuration['text'].present?
57
+ return social_share_sanitize(page.configuration['text'])
58
+ end
52
59
  end
53
60
  ''
54
61
  end
55
62
 
56
- def social_share_entry_image_tags(entry)
63
+ # rubocop:todo Metrics/AbcSize
64
+ def social_share_entry_image_tags(entry) # rubocop:todo Metrics/MethodLength
57
65
  share_images = []
58
66
  image_file = find_file_in_entry(ImageFile, entry.share_image_id, entry)
59
67
 
60
68
  if image_file
61
- image_url = image_file.thumbnail_url(:medium)
62
- share_images.push(image_url: image_url, width: image_file.width, height: image_file.height)
69
+ image_url = image_file.thumbnail_url(
70
+ image_file.output_present?(:social) ? :social : :medium
71
+ )
72
+
73
+ share_images.push(image_url:, width: image_file.width, height: image_file.height)
63
74
  else
64
75
  entry.pages.each do |page|
65
76
  break if share_images.size >= 4
77
+
66
78
  thumbnail_file = page_thumbnail_file(page)
67
79
  next unless thumbnail_file.present?
80
+
68
81
  image_url = thumbnail_file.thumbnail_url(:medium)
69
82
  thumbnail_width = 1200
70
83
  thumbnail_height = 630
@@ -72,15 +85,16 @@ module Pageflow
72
85
  thumbnail_width = thumbnail_file.file.width
73
86
  thumbnail_height = thumbnail_file.file.height
74
87
  end
75
- share_images.push(image_url: image_url,
88
+ share_images.push(image_url:,
76
89
  width: thumbnail_width,
77
90
  height: thumbnail_height)
78
91
  share_images.uniq!
79
92
  end
80
93
  end
81
94
 
82
- render 'pageflow/social_share/image_tags', share_images: share_images
95
+ render 'pageflow/social_share/image_tags', share_images:
83
96
  end
97
+ # rubocop:enable Metrics/AbcSize
84
98
 
85
99
  def social_share_normalize_protocol(url)
86
100
  url.gsub(%r{^//}, 'https://')
@@ -89,7 +103,7 @@ module Pageflow
89
103
  private
90
104
 
91
105
  def social_share_sanitize(text)
92
- HTMLEntities.new.decode(strip_tags(text.gsub(/<br ?\/?>|&nbsp;/, ' ').squish))
106
+ HTMLEntities.new.decode(strip_tags(text.gsub(%r{<br ?/?>|&nbsp;}, ' ').squish))
93
107
  end
94
108
  end
95
109
  end
@@ -1,19 +1,21 @@
1
1
  module Pageflow
2
- module SocialShareLinksHelper
2
+ module SocialShareLinksHelper # rubocop:todo Style/Documentation
3
3
  include SocialShareHelper
4
4
 
5
5
  PROVIDER_URL_TEMPLATES = {
6
- email: 'mailto:?body=%{url}',
7
- facebook: 'http://www.facebook.com/sharer/sharer.php?u=%{url}',
8
- google: 'https://plus.google.com/share?url=%{url}',
9
- linked_in: 'https://www.linkedin.com/shareArticle?mini=true&url=%{url}',
10
- telegram: 'tg://msg?text=%{url}',
11
- twitter: 'https://x.com/intent/post?url=%{url}',
12
- whats_app: 'WhatsApp://send?text=%{url}'
6
+ bluesky: 'https://bsky.app/intent/compose?text=%<url>s',
7
+ email: 'mailto:?body=%<url>s',
8
+ facebook: 'http://www.facebook.com/sharer/sharer.php?u=%<url>s',
9
+ google: 'https://plus.google.com/share?url=%<url>s',
10
+ linked_in: 'https://www.linkedin.com/shareArticle?mini=true&url=%<url>s',
11
+ telegram: 'tg://msg?text=%<url>s',
12
+ threads: 'https://threads.net/intent/post?text=%<url>s',
13
+ twitter: 'https://x.com/intent/post?url=%<url>s',
14
+ whats_app: 'WhatsApp://send?text=%<url>s'
13
15
  }.freeze
14
16
 
15
17
  def social_share_link(provider, entry, &block)
16
- block ||= ->() {}
18
+ block ||= -> {}
17
19
  page_share_link_url = social_share_link_url(provider, social_share_page_url(entry, 'permaId'))
18
20
  data_attributes = entry.share_url.present? ? {} : {share_page: page_share_link_url}
19
21
 
@@ -33,6 +35,7 @@ module Pageflow
33
35
 
34
36
  def social_share_link_url(provider, url)
35
37
  return nil if url.blank?
38
+
36
39
  encoded_url = ERB::Util.url_encode(url)
37
40
  format(PROVIDER_URL_TEMPLATES[provider], url: encoded_url)
38
41
  end
@@ -8,7 +8,7 @@ module Pageflow
8
8
  def structured_data_for_entry(entry)
9
9
  content_tag(:script, type: 'application/ld+json') do
10
10
  render_json_partial('pageflow/structured_data/entry',
11
- entry: entry,
11
+ entry:,
12
12
  meta_data: meta_tags_data_for_entry(entry))
13
13
  end
14
14
  end
@@ -1,13 +1,17 @@
1
1
  module Pageflow
2
- class StubPageConfiguration
2
+ class StubPageConfiguration # rubocop:todo Style/Documentation
3
3
  attr_reader :template
4
4
 
5
5
  def initialize(template)
6
6
  @template = template
7
7
  end
8
8
 
9
- def method_missing(name, *args)
10
- template.tag(:span, :data => {:property => name})
9
+ def method_missing(name, *_args)
10
+ template.tag(:span, data: {property: name})
11
+ end
12
+
13
+ def respond_to_missing?(_name, _include_private = false)
14
+ true
11
15
  end
12
16
  end
13
17
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module TextDirectionHelper
2
+ module TextDirectionHelper # rubocop:todo Style/Documentation
3
3
  def text_direction(locale)
4
4
  PublicI18n.text_direction(locale)
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module ThemesHelper
2
+ module ThemesHelper # rubocop:todo Style/Documentation
3
3
  include RenderJsonHelper
4
4
 
5
5
  def themes_options_json_seed(config = Pageflow.config)
@@ -1,8 +1,10 @@
1
1
  module Pageflow
2
- module VideoFilesHelper
2
+ module VideoFilesHelper # rubocop:todo Style/Documentation
3
3
  include RevisionFileHelper
4
4
 
5
- def mobile_poster_image_div(config = {})
5
+ # rubocop:todo Metrics/PerceivedComplexity
6
+ # rubocop:todo Metrics/CyclomaticComplexity
7
+ def mobile_poster_image_div(config = {}) # rubocop:todo Metrics/AbcSize
6
8
  classes = ['background', 'background_image']
7
9
  position = {x: 50, y: 50}
8
10
 
@@ -26,10 +28,15 @@ module Pageflow
26
28
  class: classes.join(' '),
27
29
  style: "background-position: #{position[:x]}% #{position[:y]}%;")
28
30
  end
31
+ # rubocop:enable Metrics/CyclomaticComplexity
32
+ # rubocop:enable Metrics/PerceivedComplexity
29
33
 
30
34
  def poster_image_tag(video_file_perma_id, poster_image_perma_id = nil, options = {})
31
35
  video_file = find_file_in_entry(VideoFile, video_file_perma_id)
32
- poster = poster_image_perma_id.present? ? find_file_in_entry(ImageFile, poster_image_perma_id) : nil
36
+ poster = if poster_image_perma_id.present?
37
+ find_file_in_entry(ImageFile,
38
+ poster_image_perma_id)
39
+ end
33
40
 
34
41
  if poster&.ready?
35
42
  options = options.merge('data-src' => poster.attachment.url(:medium))
@@ -42,14 +49,17 @@ module Pageflow
42
49
  image_tag('', options)
43
50
  end
44
51
 
45
- def video_file_video_tag(video_file, options = {})
52
+ # rubocop:todo Metrics/AbcSize
53
+ # rubocop:todo Metrics/PerceivedComplexity
54
+ # rubocop:todo Metrics/CyclomaticComplexity
55
+ def video_file_video_tag(video_file, options = {}) # rubocop:todo Metrics/MethodLength
46
56
  defaults = {
47
57
  crossorigin: 'anonymous',
48
58
  class: [
49
59
  'player video-js video-viewport vjs-default-skin',
50
60
  options.delete(:class)
51
61
  ].compact * ' ',
52
- preload: options.delete(:preload) ? 'metadata' : 'none'
62
+ preload: options.delete(:preload) ? 'metadata' : 'none'
53
63
  }
54
64
 
55
65
  options.reverse_merge! defaults
@@ -58,7 +68,10 @@ module Pageflow
58
68
  poster_image_id = options.delete(:poster_image_id)
59
69
  poster = poster_image_id.present? ? find_file_in_entry(ImageFile, poster_image_id) : nil
60
70
  mobile_poster_image_id = options.delete(:mobile_poster_image_id)
61
- mobile_poster = mobile_poster_image_id.present? ? find_file_in_entry(ImageFile, mobile_poster_image_id) : nil
71
+ mobile_poster = if mobile_poster_image_id.present?
72
+ find_file_in_entry(ImageFile,
73
+ mobile_poster_image_id)
74
+ end
62
75
 
63
76
  options[:data] = {}
64
77
 
@@ -81,14 +94,17 @@ module Pageflow
81
94
  end
82
95
 
83
96
  render('pageflow/video_files/video_tag',
84
- video_file: video_file,
85
- options: options,
86
- url_options: url_options)
97
+ video_file:,
98
+ options:,
99
+ url_options:)
87
100
  end
101
+ # rubocop:enable Metrics/CyclomaticComplexity
102
+ # rubocop:enable Metrics/PerceivedComplexity
103
+ # rubocop:enable Metrics/AbcSize
88
104
 
89
105
  # @deprecated
90
106
  def lookup_video_tag(video_id, poster_image_id, options = {})
91
- video_file_script_tag(video_id, options.merge(poster_image_id: poster_image_id))
107
+ video_file_script_tag(video_id, options.merge(poster_image_id:))
92
108
  end
93
109
 
94
110
  def video_file_script_tag(video_file_perma_id, options = {})
@@ -102,9 +118,9 @@ module Pageflow
102
118
  end
103
119
 
104
120
  render('pageflow/video_files/script_tag',
105
- script_tag_data: script_tag_data,
106
- video_file: video_file,
107
- options: options)
121
+ script_tag_data:,
122
+ video_file:,
123
+ options:)
108
124
  end
109
125
 
110
126
  def video_file_non_js_link(entry, video_file_perma_id)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module WidgetsHelper
2
+ module WidgetsHelper # rubocop:todo Style/Documentation
3
3
  include RenderJsonHelper
4
4
 
5
5
  def render_widget_head_fragments(entry, options = {})
@@ -21,21 +21,22 @@ module Pageflow
21
21
  end
22
22
 
23
23
  def present_widgets_css_class(entry)
24
- entry.resolve_widgets.map do |widget|
24
+ entry.resolve_widgets.map { |widget|
25
25
  "widget_#{widget.widget_type.name}_present"
26
- end.push('widgets_present').join(' ')
26
+ }.push('widgets_present').join(' ')
27
27
  end
28
28
 
29
29
  def widget_types_json_seeds(config)
30
- config.widget_types.each_with_object({}) do |widget_type, result|
30
+ config.widget_types.each_with_object({}) { |widget_type, result|
31
31
  widget_type.roles.each do |role|
32
32
  result[role] ||= []
33
33
  result[role] << {
34
34
  name: widget_type.name,
35
- translationKey: widget_type.translation_key
35
+ translationKey: widget_type.translation_key,
36
+ insertPoint: widget_type.insert_point
36
37
  }
37
38
  end
38
- end.to_json.html_safe
39
+ }.to_json.html_safe
39
40
  end
40
41
 
41
42
  def widgets_json_seeds(entry)
@@ -1,3 +1,4 @@
1
+ # @api private
1
2
  class PageflowPermalinkInput
2
3
  include Formtastic::Inputs::Base
3
4
  include Formtastic::Inputs::Base::Stringish
@@ -27,10 +28,10 @@ class PageflowPermalinkInput
27
28
  end
28
29
 
29
30
  def permalink_inputs_html
30
- return '' if options[:site].permalink_directories.empty?
31
+ return '' if options[:site].permalink_directories.empty? || options[:only_root]
31
32
 
32
33
  builder.select(:directory_id, directory_select_options) <<
33
- builder.text_field(:slug, placeholder: options[:slug_placeholder])
34
+ builder.text_field(:slug, data: {placeholder: options[:slug_placeholder]})
34
35
  end
35
36
 
36
37
  def error_keys
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ApplicationJob < ActiveJob::Base
3
4
  # Most jobs are safe to ignore if the underlying records are no longer available
4
5
  discard_on ActiveJob::DeserializationError
@@ -11,7 +11,7 @@ module Pageflow
11
11
  reusable_file.attachments_for_export.each do |attachment|
12
12
  archive_path = AttachmentFiles.archive_path(reusable_file,
13
13
  attachment,
14
- exported_id: exported_id)
14
+ exported_id:)
15
15
 
16
16
  archive.extract_to_tempfile(archive_path) do |tempfile|
17
17
  # Paperclip skips post processing anyway since the name of
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class PollMetaDataFromZencoderJob < PollZencoderJob
3
4
  def perform_with_result(file, _options)
4
5
  super(file, skip_post_processing: true)
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class PollZencoderJob < ApplicationJob
3
4
  queue_as :resizing
4
5
 
@@ -23,10 +24,10 @@ module Pageflow
23
24
  def poll_zencoder(file, api)
24
25
  info = api.get_info(file.job_id)
25
26
 
26
- file.encoding_progress = info[:finished] ? 100 : info[:progress];
27
+ file.encoding_progress = info[:finished] ? 100 : info[:progress]
27
28
  file.encoding_error_message = nil
28
29
 
29
- if info[:state] === 'failed'
30
+ if info[:state] == 'failed'
30
31
  throw(:halt, :error)
31
32
  elsif !info[:finished]
32
33
  throw(:halt, :pending)
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ProcessImageOrTextTrackJob < ApplicationJob
3
4
  queue_as :resizing
4
5
 
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class PruneAutoSnapshotsJob < ApplicationJob
3
4
  queue_as :prune
4
5
 
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class RequestMetaDataFromZencoderJob < ApplicationJob
3
4
  queue_as :default
4
5
 
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class SubmitFileToZencoderJob < ApplicationJob
3
4
  queue_as :default
4
5
 
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class UserMailer < ActionMailer::Base
3
4
  def invitation(options)
4
5
  @user = options[:user]
@@ -10,7 +10,19 @@ module Pageflow
10
10
  end
11
11
 
12
12
  def ensure_perma_id
13
- self.perma_id ||= (self.class.maximum(:perma_id) || 0) + 1
13
+ return if perma_id.present?
14
+
15
+ entry = entry_for_auto_generated_perma_id
16
+
17
+ entry.with_lock do
18
+ entry.increment!(:perma_id_counter)
19
+ self.perma_id = entry.perma_id_counter
20
+ end
21
+ end
22
+
23
+ def entry_for_auto_generated_perma_id
24
+ raise NotImplementedError,
25
+ "#{self.class.name} must implement #entry_for_auto_generated_perma_id"
14
26
  end
15
27
  end
16
28
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module EntryPublicationStates
2
+ module EntryPublicationStates # rubocop:todo Style/Documentation
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
@@ -38,6 +38,10 @@ module Pageflow
38
38
  published? && published_revision.password_protected?
39
39
  end
40
40
 
41
+ def published_without_password_protection?
42
+ published? && !published_revision.password_protected?
43
+ end
44
+
41
45
  def published?
42
46
  published_revision.present?
43
47
  end
@@ -54,7 +58,7 @@ module Pageflow
54
58
  !!revisions.publications.first&.noindex
55
59
  end
56
60
 
57
- module ClassMethods
61
+ module ClassMethods # rubocop:todo Style/Documentation
58
62
  def with_publication_state(state)
59
63
  case state
60
64
  when 'published_with_password_protection'
@@ -64,7 +68,7 @@ module Pageflow
64
68
  when 'not_published'
65
69
  not_published
66
70
  else
67
- fail(ArgumentError, "Unknown publication state #{state}")
71
+ raise(ArgumentError, "Unknown publication state #{state}")
68
72
  end
69
73
  end
70
74
  end