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,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderApi
3
4
  class Error < StandardError; end
4
5
  class RecoverableError < Error; end
@@ -6,13 +7,11 @@ module Pageflow
6
7
 
7
8
  def create_job(definition)
8
9
  with_exception_translation do
9
- response = Zencoder::Job.create(:input => definition.input_s3_url,
10
- :outputs => definition.outputs)
11
- if response.success?
12
- response.body['id']
13
- else
14
- raise translate_zencoder_errors(response.errors)
15
- end
10
+ response = Zencoder::Job.create(input: definition.input_s3_url,
11
+ outputs: definition.outputs)
12
+ raise translate_zencoder_errors(response.errors) unless response.success?
13
+
14
+ response.body['id']
16
15
  end
17
16
  end
18
17
 
@@ -20,15 +19,13 @@ module Pageflow
20
19
  with_exception_translation do
21
20
  response = Zencoder::Job.progress(job_id)
22
21
 
23
- if response.success?
24
- {
25
- :state => response.body["state"],
26
- :progress => response.body["progress"],
27
- :finished => response.body["state"] == 'finished'
28
- }
29
- else
30
- raise translate_zencoder_errors(response.errors)
31
- end
22
+ raise translate_zencoder_errors(response.errors) unless response.success?
23
+
24
+ {
25
+ state: response.body['state'],
26
+ progress: response.body['progress'],
27
+ finished: response.body['state'] == 'finished'
28
+ }
32
29
  end
33
30
  end
34
31
 
@@ -37,31 +34,26 @@ module Pageflow
37
34
  get_details(job_id)
38
35
  end
39
36
 
40
- def get_details(job_id)
37
+ def get_details(job_id) # rubocop:todo Metrics/AbcSize
41
38
  with_exception_translation do
42
39
  response = Zencoder::Job.details(job_id)
43
40
 
44
- if response.success?
45
- input_details = response.body['job']['input_media_file']
46
- outputs_details = response.body['job']['output_media_files']
41
+ raise translate_zencoder_errors(response.errors) unless response.success?
47
42
 
48
- output_presences = outputs_details.inject({}) do |presences, output|
49
- if output['label'].present?
50
- presences[output['label'].to_sym] = output['state']
51
- end
52
- presences
53
- end
43
+ input_details = response.body['job']['input_media_file']
44
+ outputs_details = response.body['job']['output_media_files']
54
45
 
55
- {
56
- format: input_details['format'],
57
- duration_in_ms: input_details['duration_in_ms'],
58
- width: input_details['width'],
59
- height: input_details['height'],
60
- output_presences: output_presences
61
- }
62
- else
63
- raise translate_zencoder_errors(response.errors)
46
+ output_presences = outputs_details.each_with_object({}) do |output, presences|
47
+ presences[output['label'].to_sym] = output['state'] if output['label'].present?
64
48
  end
49
+
50
+ {
51
+ format: input_details['format'],
52
+ duration_in_ms: input_details['duration_in_ms'],
53
+ width: input_details['width'],
54
+ height: input_details['height'],
55
+ output_presences:
56
+ }
65
57
  end
66
58
  end
67
59
 
@@ -72,13 +64,11 @@ module Pageflow
72
64
  private
73
65
 
74
66
  def with_exception_translation
75
- begin
76
- yield
77
- rescue Timeout::Error
78
- raise RecoverableError, 'Zencoder timed out.'
79
- rescue Zencoder::HTTPError => e
80
- raise RecoverableError, e.message
81
- end
67
+ yield
68
+ rescue Timeout::Error
69
+ raise RecoverableError, 'Zencoder timed out.'
70
+ rescue Zencoder::HTTPError => e
71
+ raise RecoverableError, e.message
82
72
  end
83
73
 
84
74
  def translate_zencoder_errors(errors)
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderAudioOutputDefinition < ZencoderOutputDefinition
3
4
  attr_reader :audio_file
4
5
 
@@ -23,11 +24,11 @@ module Pageflow
23
24
 
24
25
  def m4a_definition
25
26
  {
26
- :label => 'm4a',
27
- :format => 'm4a',
28
- :path => audio_file.m4a.path,
29
- :public => 1,
30
- :headers => {
27
+ label: 'm4a',
28
+ format: 'm4a',
29
+ path: audio_file.m4a.path,
30
+ public: 1,
31
+ headers: {
31
32
  'Content-Type' => 'audio/mp4'
32
33
  }
33
34
  }
@@ -35,19 +36,19 @@ module Pageflow
35
36
 
36
37
  def mp3_definition
37
38
  {
38
- :label => 'mp3',
39
- :format => 'mp3',
40
- :path => audio_file.mp3.path,
41
- :public => 1
39
+ label: 'mp3',
40
+ format: 'mp3',
41
+ path: audio_file.mp3.path,
42
+ public: 1
42
43
  }
43
44
  end
44
45
 
45
46
  def ogg_definition
46
47
  {
47
- :label => 'ogg',
48
- :format => 'ogg',
49
- :path => audio_file.ogg.path,
50
- :public => 1
48
+ label: 'ogg',
49
+ format: 'ogg',
50
+ path: audio_file.ogg.path,
51
+ public: 1
51
52
  }
52
53
  end
53
54
  end
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderMetaDataOutputDefinition < ZencoderOutputDefinition
3
4
  attr_reader :file
4
5
 
@@ -14,8 +15,8 @@ module Pageflow
14
15
  def outputs
15
16
  [
16
17
  {
17
- :label => 'stub',
18
- :clip_length => 1
18
+ label: 'stub',
19
+ clip_length: 1
19
20
  }
20
21
  ]
21
22
  end
@@ -1,6 +1,8 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderOutputDefinition
3
- cattr_accessor :default_output_bucket_name, :default_sftp_host, :default_akamai_host, :default_akamai_credentials
4
+ cattr_accessor :default_output_bucket_name, :default_sftp_host, :default_akamai_host,
5
+ :default_akamai_credentials
4
6
 
5
7
  attr_accessor :options
6
8
 
@@ -9,11 +11,11 @@ module Pageflow
9
11
  end
10
12
 
11
13
  def input_s3_url
12
- raise "Not implemented"
14
+ raise 'Not implemented'
13
15
  end
14
16
 
15
17
  def outputs
16
- raise "Not implemented"
18
+ raise 'Not implemented'
17
19
  end
18
20
 
19
21
  def ==(other)
@@ -21,9 +23,9 @@ module Pageflow
21
23
  other.input_s3_url == input_s3_url &&
22
24
  other.outputs == outputs
23
25
  end
24
- alias_method :eql?, :==
26
+ alias eql? ==
25
27
 
26
- protected
28
+ protected
27
29
 
28
30
  def transferable(definition)
29
31
  if akamai_configured?
@@ -42,9 +44,7 @@ module Pageflow
42
44
  end
43
45
 
44
46
  def with_credentials(definition)
45
- if akamai_configured?
46
- definition[:credentials] = akamai_credentials
47
- end
47
+ definition[:credentials] = akamai_credentials if akamai_configured?
48
48
 
49
49
  definition
50
50
  end
@@ -58,7 +58,7 @@ module Pageflow
58
58
  end
59
59
 
60
60
  def sftp_url(path)
61
- "#{File.join(sftp_host, path)}"
61
+ File.join(sftp_host, path).to_s
62
62
  end
63
63
 
64
64
  def sftp_host
@@ -70,7 +70,7 @@ module Pageflow
70
70
  end
71
71
 
72
72
  def akamai_url(path)
73
- "#{File.join(akamai_host, path)}"
73
+ File.join(akamai_host, path).to_s
74
74
  end
75
75
 
76
76
  def akamai_host
@@ -89,11 +89,12 @@ module Pageflow
89
89
 
90
90
  def sftp_transfer_definition(definition)
91
91
  return unless sftp_configured?
92
+
92
93
  {
93
- :label => "sftp_transfer_#{definition[:label]}",
94
- :source => definition[:label],
95
- :type => 'transfer-only',
96
- :url => sftp_url(definition[:path])
94
+ label: "sftp_transfer_#{definition[:label]}",
95
+ source: definition[:label],
96
+ type: 'transfer-only',
97
+ url: sftp_url(definition[:path])
97
98
  }
98
99
  end
99
100
 
@@ -105,6 +106,7 @@ module Pageflow
105
106
 
106
107
  def sftp_definition(source_defintion)
107
108
  return unless sftp_configured?
109
+
108
110
  source_defintion.dup.tap do |definiton|
109
111
  definiton[:label] = "sftp_#{definiton[:label]}"
110
112
  definiton[:url] = sftp_url(definiton.delete(:path))
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderVideoOutputDefinition < ZencoderOutputDefinition
3
4
  cattr_accessor :skip_hls, :skip_smil
4
5
 
@@ -35,6 +36,7 @@ module Pageflow
35
36
 
36
37
  def mp4_highdef_definitions
37
38
  return [] unless video_file.encode_highdef?
39
+
38
40
  [transferable(mp4_4k_definition), transferable(mp4_fullhd_definition)]
39
41
  end
40
42
 
@@ -43,15 +45,15 @@ module Pageflow
43
45
  label: '4k',
44
46
  prepare_for_segmenting: ['hls', 'dash'],
45
47
  path: video_file.mp4_4k.path,
46
- video_bitrate: 22000,
47
- decoder_bitrate_cap: 24420,
48
- decoder_buffer_size: 36631,
48
+ video_bitrate: 22_000,
49
+ decoder_bitrate_cap: 24_420,
50
+ decoder_buffer_size: 36_631,
49
51
  audio_bitrate: 320,
50
- size: '3839x2160',
52
+ size: size(3839, 2160),
51
53
  skip: {
52
54
  min_size: MIN_SIZE_FOR_4K
53
55
  },
54
- public: 1,
56
+ public: 1
55
57
  }
56
58
  end
57
59
 
@@ -64,11 +66,11 @@ module Pageflow
64
66
  decoder_bitrate_cap: 6660,
65
67
  decoder_buffer_size: 9990,
66
68
  audio_bitrate: 192,
67
- size: '1919x1080',
69
+ size: size(1919, 1080),
68
70
  skip: {
69
71
  min_size: MIN_SIZE_FOR_FULLHD
70
72
  },
71
- public: 1,
73
+ public: 1
72
74
  }
73
75
  end
74
76
 
@@ -81,8 +83,8 @@ module Pageflow
81
83
  decoder_bitrate_cap: 3410,
82
84
  decoder_buffer_size: 7326,
83
85
  audio_bitrate: 128,
84
- size: '1280x720',
85
- public: 1,
86
+ size: size(1280, 720),
87
+ public: 1
86
88
  }
87
89
  end
88
90
 
@@ -96,7 +98,7 @@ module Pageflow
96
98
  decoder_buffer_size: 2557,
97
99
  audio_bitrate: 64,
98
100
  audio_channels: 1,
99
- size: '853x480',
101
+ size: size(853, 480),
100
102
  public: 1
101
103
  }
102
104
  end
@@ -111,7 +113,7 @@ module Pageflow
111
113
  decoder_buffer_size: 924,
112
114
  audio_bitrate: 64,
113
115
  audio_channels: 1,
114
- size: '640x360',
116
+ size: size(640, 360),
115
117
  public: 1,
116
118
  h264_profile: 'baseline'
117
119
  }
@@ -123,7 +125,8 @@ module Pageflow
123
125
  non_transferable(dash_high_definition),
124
126
  non_transferable(dash_medium_definition),
125
127
  non_transferable(dash_low_definition),
126
- non_transferable(dash_playlist_definition)
128
+ non_transferable(dash_playlist_definition),
129
+ non_transferable(dash_playlist_high_and_up_definition)
127
130
  ]
128
131
  end
129
132
 
@@ -144,7 +147,8 @@ module Pageflow
144
147
  non_transferable(hls_high_definition),
145
148
  non_transferable(hls_medium_definition),
146
149
  non_transferable(hls_low_definition),
147
- non_transferable(hls_playlist_definition)
150
+ non_transferable(hls_playlist_definition),
151
+ non_transferable(hls_playlist_high_and_up_definition)
148
152
  ]
149
153
  end
150
154
 
@@ -228,46 +232,47 @@ module Pageflow
228
232
  end
229
233
 
230
234
  def dash_playlist_definition
231
- {
235
+ Playlist.build(
232
236
  label: 'dash-playlist',
233
- streams: dash_stream_definitions,
234
- allow_skipped_sources: true,
235
- type: 'playlist',
236
- streaming_delivery_format: 'dash',
237
- path: video_file.dash_playlist.path,
238
- public: 1
239
- }
237
+ attachment: video_file.dash_playlist,
238
+ format: 'dash'
239
+ ) do |streams|
240
+ streams.from(dash_low_definition)
241
+ streams.from(dash_medium_definition)
242
+ streams.from(dash_high_definition)
243
+
244
+ if video_file.encode_highdef?
245
+ streams.from(dash_fullhd_definition)
246
+ streams.from(dash_4k_definition)
247
+ end
248
+ end
240
249
  end
241
250
 
242
- def dash_stream_definitions
243
- [
244
- {
245
- source: 'dash-low',
246
- path: video_file.dash_low.url_relative_to(video_file.dash_playlist)
247
- },
248
- {
249
- source: 'dash-medium',
250
- path: video_file.dash_medium.url_relative_to(video_file.dash_playlist)
251
- },
252
- {
253
- source: 'dash-high',
254
- path: video_file.dash_high.url_relative_to(video_file.dash_playlist)
255
- }
256
- ] + dash_highdef_stream_definitions
251
+ def dash_playlist_high_and_up_definition
252
+ Playlist.build(
253
+ label: 'dash-playlist-high-and-up',
254
+ attachment: video_file.dash_playlist_high_and_up,
255
+ format: 'dash'
256
+ ) do |streams|
257
+ streams.from(dash_high_definition)
258
+
259
+ if video_file.encode_highdef?
260
+ streams.from(dash_fullhd_definition)
261
+ streams.from(dash_4k_definition)
262
+ end
263
+ end
257
264
  end
258
265
 
259
- def dash_highdef_stream_definitions
260
- return [] unless video_file.encode_highdef?
261
- [
262
- {
263
- source: 'dash-fullhd',
264
- path: video_file.dash_fullhd.url_relative_to(video_file.dash_playlist)
265
- },
266
- {
267
- source: 'dash-4k',
268
- path: video_file.dash_4k.url_relative_to(video_file.dash_playlist)
269
- }
270
- ]
266
+ def dash_playlist_fullhd_and_up_definition
267
+ Playlist.build(
268
+ label: 'dash-playlist-fullhd-and-up',
269
+ attachment: video_file.dash_playlist_fullhd_and_up,
270
+ format: 'dash',
271
+ min_size: MIN_SIZE_FOR_FULLHD
272
+ ) do |streams|
273
+ streams.from(dash_fullhd_definition)
274
+ streams.from(dash_4k_definition)
275
+ end
271
276
  end
272
277
 
273
278
  def hls_low_definition
@@ -336,50 +341,47 @@ module Pageflow
336
341
  end
337
342
 
338
343
  def hls_playlist_definition
339
- {
344
+ Playlist.build(
340
345
  label: 'hls-playlist',
341
- streams: hls_stream_definitions,
342
- allow_skipped_sources: true,
343
- type: 'playlist',
344
- path: video_file.hls_playlist.path,
345
- public: 1
346
- }
346
+ attachment: video_file.hls_playlist,
347
+ format: 'hls'
348
+ ) do |streams|
349
+ streams.from(hls_medium_definition, bandwidth: 1769)
350
+ streams.from(hls_low_definition, bandwidth: 619)
351
+ streams.from(hls_high_definition, bandwidth: 3538)
352
+
353
+ if video_file.encode_highdef?
354
+ streams.from(hls_fullhd_definition, bandwidth: 8575)
355
+ streams.from(hls_4k_definition, bandwidth: 32_000)
356
+ end
357
+ end
347
358
  end
348
359
 
349
- def hls_stream_definitions
350
- [
351
- {
352
- source: 'hls-medium',
353
- path: video_file.hls_medium.url_relative_to(video_file.hls_playlist),
354
- bandwidth: 1769
355
- },
356
- {
357
- source: 'hls-low',
358
- path: video_file.hls_low.url_relative_to(video_file.hls_playlist),
359
- bandwidth: 619
360
- },
361
- {
362
- source: 'hls-high',
363
- path: video_file.hls_high.url_relative_to(video_file.hls_playlist),
364
- bandwidth: 3538
365
- }
366
- ] + hls_highdef_stream_definitions
360
+ def hls_playlist_high_and_up_definition
361
+ Playlist.build(
362
+ label: 'hls-playlist-high-and-up',
363
+ attachment: video_file.hls_playlist_high_and_up,
364
+ format: 'hls'
365
+ ) do |streams|
366
+ streams.from(hls_high_definition, bandwidth: 3538)
367
+
368
+ if video_file.encode_highdef?
369
+ streams.from(hls_fullhd_definition, bandwidth: 8575)
370
+ streams.from(hls_4k_definition, bandwidth: 32_000)
371
+ end
372
+ end
367
373
  end
368
374
 
369
- def hls_highdef_stream_definitions
370
- return [] unless video_file.encode_highdef?
371
- [
372
- {
373
- source: 'hls-fullhd',
374
- path: video_file.hls_fullhd.url_relative_to(video_file.hls_playlist),
375
- bandwidth: 8575
376
- },
377
- {
378
- source: 'hls-4k',
379
- path: video_file.hls_4k.url_relative_to(video_file.hls_playlist),
380
- bandwidth: 32000
381
- }
382
- ]
375
+ def hls_playlist_fullhd_and_up_definition
376
+ Playlist.build(
377
+ label: 'hls-playlist-fullhd-and-up',
378
+ attachment: video_file.hls_playlist_fullhd_and_up,
379
+ format: 'hls',
380
+ min_size: MIN_SIZE_FOR_FULLHD
381
+ ) do |streams|
382
+ streams.from(hls_fullhd_definition, bandwidth: 8575)
383
+ streams.from(hls_4k_definition, bandwidth: 32_000)
384
+ end
383
385
  end
384
386
 
385
387
  def smil_definitions
@@ -457,7 +459,7 @@ module Pageflow
457
459
  smil_fullhd_stream_definitions,
458
460
  {
459
461
  path: video_file.mp4_4k.url(host: :hls_origin, default_protocol: 'http'),
460
- bandwidth: 32000
462
+ bandwidth: 32_000
461
463
  }
462
464
  ].flatten
463
465
  end
@@ -472,6 +474,15 @@ module Pageflow
472
474
  result
473
475
  end
474
476
 
477
+ def size(max, min)
478
+ if video_file.width && video_file.height &&
479
+ video_file.width < video_file.height
480
+ "#{min}x#{max}"
481
+ else
482
+ "#{max}x#{min}"
483
+ end
484
+ end
485
+
475
486
  def thumbnails_definition(url_helper)
476
487
  {
477
488
  thumbnails: [
@@ -491,5 +502,46 @@ module Pageflow
491
502
  ]
492
503
  }
493
504
  end
505
+
506
+ # @api private
507
+ class Playlist
508
+ def self.build(**args)
509
+ builder = new(**args)
510
+ yield builder
511
+ builder.build_definition
512
+ end
513
+
514
+ def initialize(label:, attachment:, format:, min_size: nil)
515
+ @label = label
516
+ @attachment = attachment
517
+ @format = format
518
+ @min_size = min_size
519
+ @streams = []
520
+ end
521
+
522
+ def from(source_definition, bandwidth: nil)
523
+ @streams << {
524
+ source: source_definition[:label],
525
+ path: @attachment.relative_path_to(source_definition[:path]),
526
+ bandwidth:
527
+ }.compact
528
+ end
529
+
530
+ def build_definition
531
+ definition = {
532
+ label: @label,
533
+ streams: @streams,
534
+ allow_skipped_sources: true,
535
+ type: 'playlist',
536
+ path: @attachment.path,
537
+ public: 1
538
+ }
539
+
540
+ definition[:streaming_delivery_format] = @format if @format == 'dash'
541
+ definition[:skip] = {min_size: @min_size} if @min_size
542
+
543
+ definition
544
+ end
545
+ end
494
546
  end
495
547
  end
data/lib/pageflow.rb CHANGED
@@ -3,7 +3,7 @@ require 'pageflow/global_config_api'
3
3
  require 'pageflow/news_item_api'
4
4
  require 'pageflow/version'
5
5
 
6
- module Pageflow
6
+ module Pageflow # rubocop:todo Style/Documentation
7
7
  extend GlobalConfigApi
8
8
  extend NewsItemApi
9
9
 
@@ -29,7 +29,12 @@ module Pageflow
29
29
 
30
30
  def self.active_admin_settings(config)
31
31
  config.before_action do
32
- I18n.locale = current_user.try(:locale) || http_accept_language.compatible_language_from(I18n.available_locales) || I18n.default_locale
32
+ I18n.locale =
33
+ current_user.try(:locale) ||
34
+ http_accept_language.compatible_language_from(
35
+ I18n.available_locales
36
+ ) ||
37
+ I18n.default_locale
33
38
  end
34
39
  end
35
40
 
@@ -24,7 +24,7 @@ namespace :pageflow do
24
24
 
25
25
  namespace :prune_auto_snapshots_jobs do
26
26
  desc 'Enqueue jobs to destroy old auto snapshot revisions'
27
- task :enqueue => :environment do
27
+ task enqueue: :environment do
28
28
  options = {
29
29
  created_before: ENV['CREATED_BEFORE'] ? Time.parse(ENV['CREATED_BEFORE']) : 1.month.ago,
30
30
  keep_count: ENV.fetch('KEEP_COUNT', 20)