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
@@ -5,7 +5,7 @@ module Pageflow
5
5
  true => 'enabled',
6
6
  false => 'disabled',
7
7
  nil => 'default'
8
- }
8
+ }.freeze
9
9
 
10
10
  extend ActiveSupport::Concern
11
11
 
@@ -21,7 +21,7 @@ module Pageflow
21
21
 
22
22
  def feature_state(name)
23
23
  state = own_feature_state(name)
24
- state == nil ? inherited_feature_state(name) : state
24
+ state.nil? ? inherited_feature_state(name) : state
25
25
  end
26
26
 
27
27
  def own_feature_state(name)
@@ -32,6 +32,8 @@ module Pageflow
32
32
  Pageflow.config.features.enabled_by_default?(name)
33
33
  end
34
34
 
35
+ # rubocop:todo Metrics/PerceivedComplexity
36
+ # rubocop:todo Metrics/CyclomaticComplexity
35
37
  def feature_states=(states)
36
38
  boolean_states = states.each_with_object({}) do |(key, value), result|
37
39
  if value == true || value == STATE_MAPPING[true]
@@ -44,9 +46,11 @@ module Pageflow
44
46
  end
45
47
 
46
48
  self.features_configuration = features_configuration
47
- .merge(boolean_states)
48
- .reject { |_, value| value.nil? }
49
+ .merge(boolean_states)
50
+ .compact
49
51
  end
52
+ # rubocop:enable Metrics/CyclomaticComplexity
53
+ # rubocop:enable Metrics/PerceivedComplexity
50
54
 
51
55
  def features_configuration
52
56
  self[:features_configuration] || {}
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module OutputSource
2
+ module OutputSource # rubocop:todo Style/Documentation
3
3
  STATE_MAPPING = {
4
4
  true => 'finished',
5
5
  false => 'skipped'
@@ -36,7 +36,7 @@ module Pageflow
36
36
 
37
37
  self[:output_presences] = output_presences
38
38
  .merge(boolean_presences)
39
- .reject { |_key, value| value.nil? }
39
+ .compact
40
40
  end
41
41
 
42
42
  def output_presences
@@ -55,7 +55,7 @@ module Pageflow
55
55
  [label.to_s, true]
56
56
  end
57
57
 
58
- Hash[pairs]
58
+ pairs.to_h
59
59
  end
60
60
  end
61
61
  end
@@ -4,7 +4,8 @@ module Pageflow
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- belongs_to :permalink, optional: true
7
+ belongs_to :permalink, optional: true, dependent: :destroy
8
+ has_many :permalink_redirects, dependent: :destroy
8
9
 
9
10
  accepts_nested_attributes_for :permalink, update_only: true
10
11
  end
@@ -1,21 +1,22 @@
1
1
  module Pageflow
2
- module ReusableFile
2
+ module ReusableFile # rubocop:todo Style/Documentation
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
6
  belongs_to :uploader, class_name: 'User', optional: true
7
7
  belongs_to :entry, optional: true
8
- belongs_to :parent_file, polymorphic: true, foreign_type: :parent_file_model_type, optional: true
8
+ belongs_to :parent_file, polymorphic: true, foreign_type: :parent_file_model_type,
9
+ optional: true
9
10
 
10
- has_many :usages, :as => :file, :class_name => 'Pageflow::FileUsage', :dependent => :destroy
11
+ has_many :usages, as: :file, class_name: 'Pageflow::FileUsage', dependent: :destroy
11
12
  has_one :import,
12
13
  as: :file,
13
14
  class_name: 'Pageflow::FileImport',
14
15
  required: false,
15
16
  dependent: :destroy
16
- has_many :using_revisions, :through => :usages, :source => :revision
17
- has_many :using_entries, :through => :using_revisions, :source => :entry
18
- has_many :using_accounts, :through => :using_entries, :source => :account
17
+ has_many :using_revisions, through: :usages, source: :revision
18
+ has_many :using_entries, through: :using_revisions, source: :entry
19
+ has_many :using_accounts, through: :using_entries, source: :account
19
20
 
20
21
  validate :parent_allows_type_for_nesting, :parent_belongs_to_same_entry
21
22
 
@@ -25,30 +26,29 @@ module Pageflow
25
26
  end
26
27
 
27
28
  def parent_allows_type_for_nesting
28
- if parent_file.present?
29
- parent_class = parent_file.class
30
- file_type_of_parent = Pageflow.config.file_types.find_by_model!(parent_class)
31
- models_of_nested_file_types = file_type_of_parent.nested_file_types.map(&:model)
32
- unless models_of_nested_file_types.include?(self.class)
33
- errors.add(:base, 'File type of provided parent file does not permit nesting files of '\
34
- "type #{self.class.name}")
35
- end
36
- end
29
+ return unless parent_file.present?
30
+
31
+ parent_class = parent_file.class
32
+ file_type_of_parent = Pageflow.config.file_types.find_by_model!(parent_class)
33
+ models_of_nested_file_types = file_type_of_parent.nested_file_types.map(&:model)
34
+ return if models_of_nested_file_types.include?(self.class)
35
+
36
+ errors.add(:base, 'File type of provided parent file does not permit nesting files of ' \
37
+ "type #{self.class.name}")
37
38
  end
38
39
 
39
40
  def parent_belongs_to_same_entry
40
- if parent_file.present?
41
- unless parent_file.using_entries.include?(entry)
42
- errors.add(:base, 'Parent file does not belong to same entry as nested file')
43
- end
44
- end
41
+ return unless parent_file.present?
42
+ return if parent_file.using_entries.include?(entry)
43
+
44
+ errors.add(:base, 'Parent file does not belong to same entry as nested file')
45
45
  end
46
46
 
47
47
  def nested_files(model)
48
48
  model_table_name = model.table_name
49
49
  model
50
50
  .select("#{model_table_name}.*")
51
- .where("#{model_table_name}.parent_file_id = #{id} AND "\
51
+ .where("#{model_table_name}.parent_file_id = #{id} AND " \
52
52
  "#{model_table_name}.parent_file_model_type = '#{self.class.name}'")
53
53
  end
54
54
 
@@ -65,7 +65,6 @@ module Pageflow
65
65
  "#{super}-#{state}"
66
66
  end
67
67
 
68
-
69
68
  # The following are method defaults for file types that do not require processing/encoding.
70
69
  # They are overwritten with default values in UploadableFile for files that are uploaded
71
70
  # through the editor.
@@ -131,7 +130,8 @@ module Pageflow
131
130
  raise 'Not implemented!'
132
131
  end
133
132
 
134
- # Gets called to trigger the `file_uploaded` event in the upload state machine of UploadableFile.
133
+ # Gets called to trigger the `file_uploaded` event in the upload state
134
+ # machine of UploadableFile.
135
135
  # Files that are not uploaded through the editor (and therefore not using the
136
136
  # upload state machine of UploadableFile) can overwrite this method to trigger whatever
137
137
  # the file does (i.e. processing/transcoding), depending on the including class'
@@ -7,7 +7,7 @@ module Pageflow
7
7
  options[:except] = Array(options[:except])
8
8
  options[:except].concat(blacklist_for_serialization)
9
9
 
10
- super(options)
10
+ super
11
11
  end
12
12
 
13
13
  private
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module Suspendable
2
+ module Suspendable # rubocop:todo Style/Documentation
3
3
  def active_for_authentication?
4
4
  super && !suspended?
5
5
  end
@@ -10,14 +10,16 @@ module Pageflow
10
10
 
11
11
  def suspend!
12
12
  return if suspended?
13
+
13
14
  self.suspended_at = Time.zone.now
14
- save(:validate => false)
15
+ save(validate: false)
15
16
  end
16
17
 
17
18
  def unsuspend!
18
19
  return unless suspended?
20
+
19
21
  self.suspended_at = nil
20
- save(:validate => false)
22
+ save(validate: false)
21
23
  end
22
24
  end
23
25
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module ThemeReferencer
2
+ module ThemeReferencer # rubocop:todo Style/Documentation
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
@@ -0,0 +1,62 @@
1
+ module Pageflow
2
+ # @api private
3
+ module Translatable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ belongs_to(:translation_group,
8
+ optional: true,
9
+ class_name: 'EntryTranslationGroup')
10
+
11
+ has_many(:translations,
12
+ through: :translation_group,
13
+ source: :entries)
14
+
15
+ after_destroy do
16
+ if translation_group&.single_item_or_empty?
17
+ translation_group.destroy
18
+ elsif default_translation?
19
+ translation_group.update(default_translation: nil)
20
+ end
21
+ end
22
+ end
23
+
24
+ def mark_as_translation_of(entry)
25
+ transaction do
26
+ ensure_translation_group(entry)
27
+
28
+ if !entry.translation_group
29
+ entry.update!(translation_group:)
30
+ elsif entry.translation_group != translation_group
31
+ entry.translation_group.merge_into(translation_group)
32
+ end
33
+ end
34
+ end
35
+
36
+ def remove_from_translation_group
37
+ if translation_group.entries.count <= 2
38
+ translation_group.destroy
39
+ else
40
+ translation_group.update(default_translation: nil) if default_translation?
41
+ update!(translation_group: nil)
42
+ end
43
+ end
44
+
45
+ def mark_as_default_translation
46
+ translation_group.update!(default_translation: self)
47
+ end
48
+
49
+ def default_translation?
50
+ translation_group&.default_translation == self
51
+ end
52
+
53
+ private
54
+
55
+ def ensure_translation_group(other_entry)
56
+ return if translation_group
57
+
58
+ update!(translation_group: other_entry.translation_group ||
59
+ build_translation_group(default_translation: self))
60
+ end
61
+ end
62
+ end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- module UploadableFile
2
+ module UploadableFile # rubocop:todo Style/Documentation
3
3
  extend ActiveSupport::Concern
4
4
  include ReusableFile
5
5
 
@@ -20,7 +20,7 @@ module Pageflow
20
20
  ))
21
21
 
22
22
  validates_attachment_presence :attachment_on_s3
23
- validates_attachment_file_name :attachment_on_s3, matches: %r{^[^\/\\]+\.[\w]{3,4}$}
23
+ validates_attachment_file_name :attachment_on_s3, matches: %r{^[^/\\]+\.\w{3,4}$}
24
24
  do_not_validate_attachment_file_type :attachment_on_s3
25
25
 
26
26
  state_machine initial: 'uploading' do
@@ -76,9 +76,9 @@ module Pageflow
76
76
  end
77
77
 
78
78
  def url
79
- if attachment.present?
80
- attachment.url
81
- end
79
+ return unless attachment.present?
80
+
81
+ attachment.url
82
82
  end
83
83
 
84
84
  def basename
@@ -109,7 +109,7 @@ module Pageflow
109
109
  file_uploaded!
110
110
  end
111
111
 
112
- module ClassMethods
112
+ module ClassMethods # rubocop:todo Style/Documentation
113
113
  def processing_state_machine(&block)
114
114
  state_machine do
115
115
  extend StateMachineJob::Macro
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Account < ApplicationRecord
2
+ class Account < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include FeatureTarget
4
4
  include SerializationBlacklist
5
5
 
@@ -10,17 +10,18 @@ module Pageflow
10
10
  has_many :entry_memberships, through: :entries, source: :memberships
11
11
 
12
12
  has_many :sites, dependent: :destroy
13
- belongs_to :default_site, :class_name => 'Site'
13
+ belongs_to :default_site, class_name: 'Site'
14
14
 
15
- validates :default_site, :presence => true
15
+ validates :default_site, presence: true
16
16
 
17
- accepts_nested_attributes_for :default_site, :update_only => true
17
+ accepts_nested_attributes_for :default_site, update_only: true
18
18
 
19
- scope :with_landing_page, -> { where.not(:landing_page_name => '') }
19
+ scope :with_landing_page, -> { where.not(landing_page_name: '') }
20
20
 
21
21
  def build_default_site(*args)
22
22
  super.tap do |site|
23
23
  site.account = self
24
+ site.build_root_permalink_directory
24
25
  end
25
26
  end
26
27
 
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
2
  # Query accounts for members, e.g. based on role
3
3
  class AccountMemberQuery < ApplicationQuery
4
- class Scope < ApplicationQuery::Scope
4
+ class Scope < ApplicationQuery::Scope # rubocop:todo Style/Documentation
5
5
  # Account whose members we scope
6
6
  # @return [Pageflow::Account]
7
7
  attr_reader :account
@@ -59,7 +59,7 @@ module Pageflow
59
59
  @user
60
60
  .memberships
61
61
  .where(role: Roles.at_least(role))
62
- .where('(entity_id = :account_id AND '\
62
+ .where('(entity_id = :account_id AND ' \
63
63
  "entity_type = 'Pageflow::Account')",
64
64
  account_id: @account.id)
65
65
  .any?
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
2
  # Abstraction layer for Pageflow's query interface
3
3
  class ApplicationQuery
4
- class Scope
4
+ class Scope # rubocop:todo Style/Documentation
5
5
  protected
6
6
 
7
7
  # @api private
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ApplicationRecord < ActiveRecord::Base
2
+ class ApplicationRecord < ActiveRecord::Base # rubocop:todo Style/Documentation
3
3
  self.abstract_class = true
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class AudioFile < ApplicationRecord
2
+ class AudioFile < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include UploadableFile
4
4
  include MediaEncodingStateMachine
5
5
 
@@ -21,15 +21,15 @@ module Pageflow
21
21
  end
22
22
 
23
23
  def m4a
24
- ZencoderAttachment.new(self, "audio.m4a")
24
+ ZencoderAttachment.new(self, 'audio.m4a')
25
25
  end
26
26
 
27
27
  def mp3
28
- ZencoderAttachment.new(self, "audio.mp3")
28
+ ZencoderAttachment.new(self, 'audio.mp3')
29
29
  end
30
30
 
31
31
  def ogg
32
- ZencoderAttachment.new(self, "audio.ogg")
32
+ ZencoderAttachment.new(self, 'audio.ogg')
33
33
  end
34
34
 
35
35
  def output_definition
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class AudioFileUrlTemplates
2
+ class AudioFileUrlTemplates # rubocop:todo Style/Documentation
3
3
  def call
4
4
  {
5
5
  original: url_template(:attachment, :original),
@@ -4,7 +4,7 @@ module Pageflow
4
4
  # AuthenticationToken stores the tokens with expiry time against user and provider
5
5
  class AuthenticationToken < ApplicationRecord
6
6
  belongs_to :user, class_name: 'User'
7
- default_scope -> { where(['expiry_time > :expiry', expiry: Time.zone.now]) }
7
+ default_scope -> { where(['expiry_time > :expiry', {expiry: Time.zone.now}]) }
8
8
 
9
9
  def auth_token
10
10
  SymmetricEncryption.decrypt(read_attribute(:auth_token))
@@ -31,7 +31,7 @@ module Pageflow
31
31
 
32
32
  def self.find_auth_token(current_user, provider)
33
33
  where(user_id: current_user.id,
34
- provider: provider)
34
+ provider:)
35
35
  end
36
36
  end
37
37
  end
@@ -1,7 +1,8 @@
1
1
  module Pageflow
2
- class Chapter < ApplicationRecord
2
+ class Chapter < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include SerializedConfiguration
4
4
  include NestedRevisionComponent
5
+ include AutoGeneratedPermaId
5
6
 
6
7
  belongs_to :storyline, touch: true
7
8
  has_many :pages, -> { order('position ASC') }, dependent: :destroy, inverse_of: :chapter
@@ -15,5 +16,9 @@ module Pageflow
15
16
  def pages
16
17
  super.tap { |p| p.first.is_first = true if is_first && p.present? }
17
18
  end
19
+
20
+ def entry_for_auto_generated_perma_id
21
+ storyline.revision.entry
22
+ end
18
23
  end
19
24
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ChapterScaffold
2
+ class ChapterScaffold # rubocop:todo Style/Documentation
3
3
  def initialize(chapter, options)
4
4
  @chapter = chapter
5
5
  @options = options
@@ -8,9 +8,7 @@ module Pageflow
8
8
  delegate :save!, to: :@chapter
9
9
 
10
10
  def build
11
- if @options[:depth] == 'page'
12
- @page = @chapter.pages.build(template: 'background_image')
13
- end
11
+ @page = @chapter.pages.build(template: 'background_image') if @options[:depth] == 'page'
14
12
 
15
13
  self
16
14
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class CnameSiteRequestScope
2
+ class CnameSiteRequestScope # rubocop:todo Style/Documentation
3
3
  def call(sites, request)
4
4
  sites.where(<<-SQL, host: request.host)
5
5
  cname = :host OR
@@ -11,8 +11,8 @@ module Pageflow
11
11
 
12
12
  def self.find(entry:, theme:)
13
13
  build(
14
- entry: entry,
15
- theme: theme,
14
+ entry:,
15
+ theme:,
16
16
  theme_customization: Pageflow.theme_customizations.get(
17
17
  site: entry.site,
18
18
  entry_type_name: entry.type_name
@@ -26,13 +26,13 @@ module Pageflow
26
26
  new(theme,
27
27
  config.transform_theme_customization_overrides.call(
28
28
  theme_customization.overrides,
29
- entry: entry,
30
- theme: theme
29
+ entry:,
30
+ theme:
31
31
  ),
32
32
  config.transform_theme_customization_files.call(
33
33
  theme_customization.selected_files.transform_values(&:urls),
34
- entry: entry,
35
- theme: theme
34
+ entry:,
35
+ theme:
36
36
  ))
37
37
  end
38
38
  end
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Pageflow
2
4
  # A merged view of an entry and its draft revision
3
5
  class DraftEntry < EntryAtRevision
@@ -14,20 +16,35 @@ module Pageflow
14
16
  entry.title
15
17
  end
16
18
 
19
+ def translations(scope = -> { self }, **)
20
+ return [] unless entry.translation_group
21
+
22
+ PublishedEntry.wrap_all_drafts(
23
+ entry.translation_group.entries.instance_exec(&scope)
24
+ )
25
+ end
26
+
27
+ def cutoff_mode_enabled_for?(_request)
28
+ false
29
+ end
30
+
17
31
  def create_file!(file_type, attributes)
18
32
  check_foreign_key_custom_attributes(file_type.custom_attributes, attributes)
19
33
 
20
- file = file_type.model.create!(attributes.except(:configuration)) do |f|
21
- f.entry = entry
22
- end
34
+ file = file_type.model.create!(
35
+ attributes
36
+ .except(:configuration, :display_name)
37
+ .merge(file_name: generate_file_name(attributes[:display_name]))
38
+ ) { |f| f.entry = entry }
23
39
 
24
- usage = revision.file_usages.create_with_lock!(file: file,
25
- configuration: attributes[:configuration])
40
+ usage = revision.file_usages.create!(file:,
41
+ configuration: attributes[:configuration],
42
+ display_name: attributes[:display_name])
26
43
  UsedFile.new(file, usage)
27
44
  end
28
45
 
29
- def remove_file(file)
30
- draft.file_usages.where(file: file).destroy_all
46
+ def remove_file(file) # rubocop:todo Metrics/AbcSize
47
+ draft.file_usages.where(file:).destroy_all
31
48
 
32
49
  file.file_type.nested_file_types.each do |nested_file_type|
33
50
  nested_file_ids = file.nested_files(nested_file_type.model).map(&:id)
@@ -44,7 +61,8 @@ module Pageflow
44
61
 
45
62
  def use_file(file)
46
63
  draft.file_usages.create!(file: file.to_model,
47
- configuration: file.configuration)
64
+ configuration: file.configuration,
65
+ display_name: file.display_name)
48
66
  end
49
67
 
50
68
  def save!
@@ -77,6 +95,10 @@ module Pageflow
77
95
  draft.cache_key
78
96
  end
79
97
 
98
+ def published_revision?
99
+ false
100
+ end
101
+
80
102
  private
81
103
 
82
104
  def check_foreign_key_custom_attributes(custom_attributes, attributes)
@@ -93,8 +115,14 @@ module Pageflow
93
115
  end
94
116
  end
95
117
 
118
+ def generate_file_name(file_name)
119
+ return nil if file_name.blank?
120
+
121
+ "#{SecureRandom.alphanumeric(8).downcase}#{File.extname(file_name)}"
122
+ end
123
+
96
124
  def file_is_used(file_type, file_id)
97
- draft.file_usages.where(file_type: file_type, file_id: file_id).exists?
125
+ draft.file_usages.where(file_type:, file_id:).exists?
98
126
  end
99
127
  end
100
128
  end