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,5 +1,5 @@
1
1
  module Pageflow
2
- class Revision < ApplicationRecord
2
+ class Revision < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include SerializedConfiguration
4
4
 
5
5
  PAGE_ORDER = [
@@ -30,11 +30,11 @@ module Pageflow
30
30
  has_many :file_usages, dependent: :destroy
31
31
 
32
32
  has_many :image_files, -> { extending WithFileUsageExtension },
33
- :through => :file_usages, :source => :file, :source_type => 'Pageflow::ImageFile'
33
+ through: :file_usages, source: :file, source_type: 'Pageflow::ImageFile'
34
34
  has_many :video_files, -> { extending WithFileUsageExtension },
35
- :through => :file_usages, :source => :file, :source_type => 'Pageflow::VideoFile'
35
+ through: :file_usages, source: :file, source_type: 'Pageflow::VideoFile'
36
36
  has_many :audio_files, -> { extending WithFileUsageExtension },
37
- :through => :file_usages, :source => :file, :source_type => 'Pageflow::AudioFile'
37
+ through: :file_usages, source: :file, source_type: 'Pageflow::AudioFile'
38
38
 
39
39
  scope(:published,
40
40
  lambda do
@@ -71,7 +71,11 @@ module Pageflow
71
71
  scope :frozen, -> { where('frozen_at IS NOT NULL') }
72
72
 
73
73
  scope :publications, -> { where('published_at IS NOT NULL') }
74
- scope :publications_and_user_snapshots, -> { where('published_at IS NOT NULL OR snapshot_type = "user"') }
74
+ scope :publications_and_user_snapshots, lambda {
75
+ where(
76
+ 'published_at IS NOT NULL OR snapshot_type = "user"'
77
+ )
78
+ }
75
79
  scope :user_snapshots, -> { where(snapshot_type: 'user') }
76
80
  scope :auto_snapshots, -> { where(snapshot_type: 'auto') }
77
81
 
@@ -100,6 +104,7 @@ module Pageflow
100
104
  def find_file_by_perma_id(model, perma_id)
101
105
  file = files(model).find_by(pageflow_file_usages: {file_perma_id: perma_id})
102
106
  return unless file
107
+
103
108
  UsedFile.new(file)
104
109
  end
105
110
 
@@ -140,7 +145,7 @@ module Pageflow
140
145
  end
141
146
 
142
147
  def published?
143
- (published_at.present? && Time.now >= published_at) &&
148
+ published_at.present? && Time.now >= published_at &&
144
149
  (published_until.blank? || Time.now < published_until)
145
150
  end
146
151
 
@@ -163,7 +168,7 @@ module Pageflow
163
168
  # Public interface for copying a revision
164
169
  #
165
170
  # @since 15.1
166
- def copy(&block)
171
+ def copy
167
172
  revision = dup
168
173
 
169
174
  yield(revision) if block_given?
@@ -172,15 +177,15 @@ module Pageflow
172
177
  widget.copy_to(revision)
173
178
  end
174
179
 
175
- file_usages.each do |file_usage|
176
- file_usage.copy_to(revision)
177
- end
180
+ revision.save!
178
181
 
179
- find_revision_components.each do |revision_component|
180
- revision_component.copy_to(revision)
181
- end
182
+ NestedRevisionComponentCopy.new(
183
+ from: self,
184
+ to: revision
185
+ ).perform_for(
186
+ revision_components: Pageflow.config.revision_components.to_a + [FileUsage]
187
+ )
182
188
 
183
- revision.save!
184
189
  revision
185
190
  end
186
191
 
@@ -190,8 +195,12 @@ module Pageflow
190
195
  end
191
196
  end
192
197
 
198
+ def entry_for_auto_generated_perma_id
199
+ entry
200
+ end
201
+
193
202
  def self.depublish_all
194
- published.update_all(:published_until => Time.now)
203
+ published.update_all(published_until: Time.now)
195
204
  end
196
205
 
197
206
  def configuration
@@ -1,33 +1,29 @@
1
1
  module Pageflow
2
- module Roles
2
+ module Roles # rubocop:todo Style/Documentation
3
3
  module_function
4
4
 
5
5
  def at_least(role_uncasted)
6
6
  role = role_uncasted.to_sym
7
- if role == :member
8
- %w(member previewer editor publisher manager)
9
- elsif role == :previewer
10
- %w(previewer editor publisher manager)
11
- elsif role == :editor
12
- %w(editor publisher manager)
13
- elsif role == :publisher
14
- %w(publisher manager)
15
- elsif role == :manager
16
- %w(manager)
17
- end
7
+ {
8
+ member: %w[member previewer editor publisher manager],
9
+ previewer: %w[previewer editor publisher manager],
10
+ editor: %w[editor publisher manager],
11
+ publisher: %w[publisher manager],
12
+ manager: %w[manager]
13
+ }[role]
18
14
  end
19
15
 
20
16
  def high(user, entry)
21
17
  roles = [:none, :member, :previewer, :editor, :publisher, :manager]
22
18
 
23
- account_membership = Membership.where(user: user, entity: entry.account).first
19
+ account_membership = Membership.where(user:, entity: entry.account).first
24
20
  account_role = account_membership ? account_membership.role : :none
25
21
 
26
- if user.entries.include?(entry)
27
- entry_role = Membership.where(user: user, entity: entry).first.role
28
- else
29
- entry_role = :none
30
- end
22
+ entry_role = if user.entries.include?(entry)
23
+ Membership.where(user:, entity: entry).first.role
24
+ else
25
+ :none
26
+ end
31
27
 
32
28
  if roles.find_index(account_role.to_sym) > roles.find_index(entry_role.to_sym)
33
29
  account_role.to_sym
@@ -1,6 +1,7 @@
1
1
  module Pageflow
2
- class Site < ApplicationRecord
2
+ class Site < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  belongs_to :account
4
+ belongs_to :custom_404_entry, class_name: 'Entry', optional: true
4
5
 
5
6
  has_many :entry_templates, dependent: :destroy
6
7
  has_many :entries
@@ -9,7 +10,9 @@ module Pageflow
9
10
  scope :with_home_url, -> { where.not(home_url: '') }
10
11
  scope :for_request, ->(request) { Pageflow.config.site_request_scope.call(all, request) }
11
12
 
12
- validates :account, :presence => true
13
+ validates :account, presence: true
14
+ validates_inclusion_of :cutoff_mode_name, in: :available_cutoff_mode_names, allow_blank: true
15
+ validate :custom_404_entry_belongs_to_same_site
13
16
 
14
17
  delegate :enabled_feature_names, to: :account
15
18
 
@@ -22,13 +25,31 @@ module Pageflow
22
25
  end
23
26
 
24
27
  def host
25
- Pageflow.config.site_url_options(self)&.dig(:host)
28
+ Pageflow.config.site_url_options_for(self)&.dig(:host)
29
+ end
30
+
31
+ def display_title
32
+ title.presence || cname_domain.presence
26
33
  end
27
34
 
28
35
  def cname_domain
29
36
  cname.split('.').pop(2).join('.')
30
37
  end
31
38
 
39
+ def build_root_permalink_directory
40
+ permalink_directories.build(path: '')
41
+ end
42
+
43
+ def root_entry
44
+ return unless root_permalink_directory
45
+
46
+ root_permalink_directory.permalinks.find_by_slug('')&.entry
47
+ end
48
+
49
+ def root_permalink_directory
50
+ permalink_directories.find_by_path('')
51
+ end
52
+
32
53
  def first_paged_entry_template
33
54
  entry_templates.find_or_initialize_by(entry_type_name: 'paged')
34
55
  end
@@ -63,5 +84,17 @@ module Pageflow
63
84
  def self.ransackable_associations(_auth_object = nil)
64
85
  %w[account]
65
86
  end
87
+
88
+ private
89
+
90
+ def available_cutoff_mode_names
91
+ Pageflow.config_for(account).cutoff_modes.names
92
+ end
93
+
94
+ def custom_404_entry_belongs_to_same_site
95
+ return unless custom_404_entry.present?
96
+
97
+ errors.add(:custom_404_entry, :must_belong_to_same_site) if custom_404_entry.site_id != id
98
+ end
66
99
  end
67
100
  end
@@ -0,0 +1,27 @@
1
+ module Pageflow
2
+ # @api private
3
+ class SiteRootEntryForm
4
+ include ActiveModel::Model
5
+
6
+ attr_accessor :entry_id
7
+
8
+ validates :entry, presence: true
9
+
10
+ def initialize(attributes, site)
11
+ super(attributes)
12
+ @site = site
13
+ end
14
+
15
+ def save
16
+ return false unless valid?
17
+
18
+ entry.permalink.update(allow_root_path: true,
19
+ directory: @site.permalink_directories.find_by_path(''),
20
+ slug: '')
21
+ end
22
+
23
+ def entry
24
+ @entry ||= @site.entries.find_by_id(entry_id)
25
+ end
26
+ end
27
+ end
@@ -5,9 +5,18 @@ module Pageflow
5
5
  PublishedEntry.wrap_all(
6
6
  site
7
7
  .entries
8
+ .preload(:account,
9
+ permalink: :directory,
10
+ translation_group: {
11
+ publicly_visible_entries: [
12
+ :account,
13
+ :published_revision,
14
+ {permalink: :directory}
15
+ ]
16
+ })
8
17
  .published_without_password_protection
9
18
  .published_without_noindex
10
- .order('first_published_at DESC')
19
+ .order(first_published_at: :desc)
11
20
  )
12
21
  end
13
22
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Storyline < ApplicationRecord
2
+ class Storyline < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include SerializedConfiguration
4
4
  include RevisionComponent
5
5
 
@@ -11,7 +11,10 @@ module Pageflow
11
11
  has_many :pages, through: :chapters
12
12
 
13
13
  nested_revision_components :chapters
14
-
15
14
  delegate :entry, to: :revision
15
+
16
+ def self.create_defaults(draft)
17
+ create!(revision: draft, configuration: {main: true})
18
+ end
16
19
  end
17
20
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class StorylineScaffold
2
+ class StorylineScaffold # rubocop:todo Style/Documentation
3
3
  def initialize(storyline, options)
4
4
  @storyline = storyline
5
5
  @options = options
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class TextTrackFile < ApplicationRecord
2
+ class TextTrackFile < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include UploadableFile
4
4
  include ImageAndTextTrackProcessingStateMachine
5
5
 
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class TextTrackFileUrlTemplates
2
+ class TextTrackFileUrlTemplates # rubocop:todo Style/Documentation
3
3
  def call
4
4
  {
5
5
  vtt: UrlTemplate.from_attachment(example_file.attachment, :vtt)
@@ -20,6 +20,7 @@ module Pageflow
20
20
  class AttachmentContentTypeValidator < Paperclip::Validators::AttachmentContentTypeValidator
21
21
  def validate_whitelist(record, attribute, value)
22
22
  return if value =~ record.options_from_entry_type[:content_type]
23
+
23
24
  record.errors.add(attribute, :invalid)
24
25
  end
25
26
 
@@ -39,9 +40,9 @@ module Pageflow
39
40
  # A hash of urls based on the styles that were defined when
40
41
  # registering the entry type.
41
42
  def urls
42
- styles_from_options.map { |style, _|
43
+ styles_from_options.to_h do |style, _|
43
44
  [style, attachment.url(style)]
44
- }.to_h
45
+ end
45
46
  end
46
47
 
47
48
  # @api private
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ThumbnailFileResolver < Struct.new(:entry, :candidates, :configuration)
2
+ ThumbnailFileResolver = Struct.new(:entry, :candidates, :configuration) do
3
3
  def find_thumbnail
4
4
  candidates.detect do |candidate|
5
5
  condition = candidate[:unless] || candidate[:if]
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module UrlTemplate
2
+ module UrlTemplate # rubocop:todo Style/Documentation
3
3
  extend self
4
4
 
5
5
  def from_attachment(attachment, *style)
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class UsedFile < SimpleDelegator
2
+ class UsedFile < SimpleDelegator # rubocop:todo Style/Documentation
3
3
  def initialize(file, usage = nil)
4
4
  super(file)
5
5
  @file = file
@@ -11,8 +11,8 @@ module Pageflow
11
11
  end
12
12
 
13
13
  def update!(attributes)
14
- super(attributes.except(:configuration))
15
- @usage.update!(attributes.slice(:configuration))
14
+ super(attributes.except(:configuration, :display_name))
15
+ @usage.update!(attributes.slice(:configuration, :display_name))
16
16
  end
17
17
 
18
18
  def usage_id
@@ -23,6 +23,10 @@ module Pageflow
23
23
  @usage.perma_id
24
24
  end
25
25
 
26
+ def display_name
27
+ @usage.display_name
28
+ end
29
+
26
30
  def cache_key
27
31
  [@file.cache_key, @usage.cache_key].join('-')
28
32
  end
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
2
  # @api private
3
3
  class UserNameQuery < ApplicationQuery
4
- class Scope < Scope
4
+ class Scope < Scope # rubocop:todo Style/Documentation
5
5
  def initialize(term, scope)
6
6
  @term = term
7
7
  @scope = scope
@@ -16,7 +16,7 @@ module Pageflow
16
16
  attr_reader :term, :scope
17
17
 
18
18
  def word_conditions(term)
19
- term.split(' ').map { |word|
19
+ term.split.map { |word|
20
20
  word_condition(word)
21
21
  }.join(' AND ')
22
22
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class VideoFile < ApplicationRecord
2
+ class VideoFile < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include UploadableFile
4
4
  include MediaEncodingStateMachine
5
5
  include OutputSource
@@ -9,8 +9,8 @@ module Pageflow
9
9
  has_attached_file(:poster, Pageflow.config.paperclip_s3_default_options
10
10
  .merge(default_url: ':pageflow_placeholder',
11
11
  styles: Pageflow.config.thumbnail_styles
12
- .merge(medium: ['1920x1920>', :JPG],
13
- large: ['1024x1024>', :JPG],
12
+ .merge(medium: ['1024x1024>', :JPG],
13
+ large: ['1920x1920>', :JPG],
14
14
  ultra: ['3840x3840>', :JPG],
15
15
  print: ['300x300>', :JPG]),
16
16
  convert_options: {
@@ -21,22 +21,21 @@ module Pageflow
21
21
  }))
22
22
 
23
23
  has_attached_file(:thumbnail, Pageflow.config.paperclip_s3_default_options
24
- .merge(:default_url => ':pageflow_placeholder',
25
- :default_style => :thumbnail,
26
- :styles => Pageflow.config.thumbnail_styles
27
- .merge(:medium => ['1920x1920>', :JPG],
28
- :large => ['1024x1024>', :JPG]),
29
- :convert_options => {
30
- :medium => "-quality 60 -interlace Plane",
31
- :large => "-quality 60 -interlace Plane"
24
+ .merge(default_url: ':pageflow_placeholder',
25
+ default_style: :thumbnail,
26
+ styles: Pageflow.config.thumbnail_styles
27
+ .merge(medium: ['1024x1024>', :JPG],
28
+ large: ['1920x1920>', :JPG]),
29
+ convert_options: {
30
+ medium: '-quality 60 -interlace Plane',
31
+ large: '-quality 60 -interlace Plane'
32
32
  }))
33
33
 
34
-
35
34
  do_not_validate_attachment_file_type(:poster)
36
35
  do_not_validate_attachment_file_type(:thumbnail)
37
36
 
38
- def thumbnail_url(*args)
39
- poster.url(*args)
37
+ def thumbnail_url(*)
38
+ poster.url(*)
40
39
  end
41
40
 
42
41
  def attachment_s3_url
@@ -111,6 +110,10 @@ module Pageflow
111
110
  ZencoderAttachment.new(self, 'dash/manifest.mpd')
112
111
  end
113
112
 
113
+ def dash_playlist_high_and_up
114
+ ZencoderAttachment.new(self, 'dash/manifest-high-and-up.mpd')
115
+ end
116
+
114
117
  def hls_playlist
115
118
  if Pageflow.config.zencoder_options[:hls_smil_suffix].present?
116
119
  ZencoderAttachment.new(self,
@@ -125,6 +128,10 @@ module Pageflow
125
128
  end
126
129
  end
127
130
 
131
+ def hls_playlist_high_and_up
132
+ ZencoderAttachment.new(self, 'hls-playlist-high-and-up.m3u8', host: :hls)
133
+ end
134
+
128
135
  def smil
129
136
  ZencoderAttachment.new(self, 'hls-playlist.smil')
130
137
  end
@@ -143,7 +150,7 @@ module Pageflow
143
150
 
144
151
  def externally_generated_outputs
145
152
  if Pageflow.config.zencoder_options[:hls_smil_suffix].present?
146
- %w(hls-playlist)
153
+ %w[hls-playlist]
147
154
  else
148
155
  []
149
156
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class VideoFileUrlTemplates
2
+ class VideoFileUrlTemplates # rubocop:todo Style/Documentation
3
3
  def call
4
4
  {
5
5
  original: url_template(:attachment, :original),
@@ -7,10 +7,12 @@ module Pageflow
7
7
  high: url_template(:mp4_high),
8
8
  medium: url_template(:mp4_medium),
9
9
  fullhd: url_template(:mp4_fullhd),
10
- :'4k' => url_template(:mp4_4k),
10
+ '4k': url_template(:mp4_4k),
11
11
 
12
- :'hls-playlist' => url_template(:hls_playlist),
13
- :'dash-playlist' => url_template(:dash_playlist),
12
+ 'hls-playlist': url_template(:hls_playlist),
13
+ 'hls-playlist-high-and-up': url_template(:hls_playlist_high_and_up),
14
+ 'dash-playlist': url_template(:dash_playlist),
15
+ 'dash-playlist-high-and-up': url_template(:dash_playlist_high_and_up),
14
16
 
15
17
  poster_medium: url_template(:poster, :medium),
16
18
  poster_large: url_template(:poster, :large),
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Widget < ApplicationRecord
2
+ class Widget < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include SerializedConfiguration
4
4
 
5
5
  belongs_to :subject, polymorphic: true, touch: true
@@ -85,7 +85,7 @@ module Pageflow
85
85
 
86
86
  def defaults_by_role
87
87
  config.widget_types.defaults_by_role.each_with_object({}) do |(role, widget_type), result|
88
- result[role] = Widget.new(role: role, type_name: widget_type.name,
88
+ result[role] = Widget.new(role:, type_name: widget_type.name,
89
89
  subject: nil,
90
90
  configuration:
91
91
  config.widget_types.default_configuration(role))
@@ -94,8 +94,9 @@ module Pageflow
94
94
 
95
95
  def placeholders_by_role
96
96
  return {} unless options[:include_placeholders]
97
+
97
98
  config.widget_types.roles.each_with_object({}) do |role, result|
98
- result[role] = Widget.new(role: role, type_name: nil, subject: nil)
99
+ result[role] = Widget.new(role:, type_name: nil, subject: nil)
99
100
  end
100
101
  end
101
102
 
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module WithFileUsageExtension
2
+ module WithFileUsageExtension # rubocop:todo Style/Documentation
3
3
  def with_usage_id
4
4
  select("#{table_name}.*, pageflow_file_usages.id AS usage_id")
5
5
  end
@@ -1,7 +1,7 @@
1
1
  require 'uri'
2
2
 
3
3
  module Pageflow
4
- class ZencoderAttachment
4
+ class ZencoderAttachment # rubocop:todo Style/Documentation
5
5
  cattr_accessor :default_options
6
6
  self.default_options = {
7
7
  path: '/:zencoder_asset_version/:pageflow_s3_root/:class/:id_partition/:zencoder_filename',
@@ -45,20 +45,20 @@ module Pageflow
45
45
  url_options)
46
46
  end
47
47
 
48
- def url_relative_to(attachment)
49
- dir_path = File.dirname(URI.parse(attachment.url).path)
48
+ def relative_path_to(other_path)
49
+ dir_path = File.dirname(path)
50
50
 
51
- unless URI.parse(url).path.start_with?(dir_path)
52
- raise("Could not generate relative url for #{url} based on #{attachment.url}.")
51
+ unless URI.parse(other_path).path.start_with?(dir_path)
52
+ raise("Could not generate relative path for #{other_path} based on #{url}.")
53
53
  end
54
54
 
55
- url.split("#{dir_path}/", 2).last
55
+ other_path.split("#{dir_path}/", 2).last
56
56
  end
57
57
 
58
58
  private
59
59
 
60
60
  def ensure_default_protocol(url, url_options)
61
- url =~ %r'^//' ? [url_options[:default_protocol], url].compact.join(':') : url
61
+ url =~ %r{^//} ? [url_options[:default_protocol], url].compact.join(':') : url
62
62
  end
63
63
 
64
64
  def url_pattern(url_options)
@@ -66,7 +66,7 @@ module Pageflow
66
66
  end
67
67
 
68
68
  def base_url(url_options)
69
- case (url_options[:host] || options[:host])
69
+ case url_options[:host] || options[:host]
70
70
  when :hls
71
71
  options[:hls_url]
72
72
  when :hls_origin
@@ -1,5 +1,7 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class AccountPolicy < ApplicationPolicy
4
+ # @api private
3
5
  class Scope < Scope
4
6
  attr_reader :user, :scope, :query
5
7
 
@@ -111,7 +113,7 @@ module Pageflow
111
113
  end
112
114
 
113
115
  def see_badge_belonging_to?
114
- (@account.entries & user.entries).any? ||
116
+ @account.entries.intersect?(user.entries) ||
115
117
  query.has_at_least_role?(:previewer) ||
116
118
  user.admin?
117
119
  end
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
+ # @api private
3
4
  class AdminOnlyTabPolicy
4
5
  attr_reader :user, :tab
5
6
 
@@ -1,5 +1,6 @@
1
1
  module Pageflow
2
2
  module Admin
3
+ # @api private
3
4
  class EntryTabPolicy
4
5
  attr_reader :user, :tab, :query
5
6
 
@@ -1,5 +1,7 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ApplicationPolicy
4
+ # @api private
3
5
  class Scope
4
6
  protected
5
7
 
@@ -1,5 +1,7 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class EntryPolicy < ApplicationPolicy
4
+ # @api private
3
5
  class Scope < Scope
4
6
  attr_reader :user, :scope, :query
5
7
 
@@ -99,7 +101,11 @@ module Pageflow
99
101
  end
100
102
 
101
103
  def duplicate?
102
- publish?
104
+ query.has_at_least_role?(:publisher)
105
+ end
106
+
107
+ def manage_translations?
108
+ query.has_at_least_account_role?(:publisher)
103
109
  end
104
110
 
105
111
  def manage?
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class EntryTemplatePolicy < ApplicationPolicy
3
4
  def initialize(user, entry_template)
4
5
  @user = user
@@ -10,7 +11,7 @@ module Pageflow
10
11
  end
11
12
 
12
13
  def update?
13
- allows?(%w(publisher manager))
14
+ allows?(%w[publisher manager])
14
15
  end
15
16
 
16
17
  private