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,17 +1,17 @@
1
1
  module Pageflow
2
- class EditLock < ApplicationRecord
2
+ class EditLock < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  scope :active, (lambda do
4
4
  time = Time.now - EditLock.time_to_live
5
5
  where('pageflow_edit_locks.updated_at >= ?', time)
6
6
  end)
7
7
 
8
- class Error < RuntimeError
8
+ class Error < RuntimeError # rubocop:todo Style/Documentation
9
9
  def code
10
10
  self.class.name.split('::').last.underscore
11
11
  end
12
12
  end
13
13
 
14
- class HeldByOtherUserError < Error
14
+ class HeldByOtherUserError < Error # rubocop:todo Style/Documentation
15
15
  attr_reader :user
16
16
 
17
17
  def initialize(user)
@@ -23,7 +23,7 @@ module Pageflow
23
23
  class NotHeldError < Error; end
24
24
 
25
25
  belongs_to :user
26
- belongs_to :entry, :inverse_of => :edit_lock
26
+ belongs_to :entry, inverse_of: :edit_lock
27
27
 
28
28
  def self.time_to_live
29
29
  timer_tolerance = 2.3
@@ -45,33 +45,32 @@ module Pageflow
45
45
  def acquire(current_user, options = {})
46
46
  verify!(current_user, options)
47
47
  rescue Error
48
- if options[:force] || timed_out?
49
- entry.create_edit_lock(:user => current_user)
50
- else
51
- raise
52
- end
48
+ raise unless options[:force] || timed_out?
49
+
50
+ entry.create_edit_lock(user: current_user)
53
51
  end
54
52
 
55
53
  def release(current_user)
56
- if user == current_user
57
- destroy
58
- end
54
+ return unless user == current_user
55
+
56
+ destroy
59
57
  end
60
58
 
61
59
  def verify!(current_user, options)
62
- raise HeldByOtherUserError.new(user) unless held_by?(current_user)
60
+ raise HeldByOtherUserError, user unless held_by?(current_user)
63
61
  raise HeldByOtherSessionError unless matches?(options[:id])
62
+
64
63
  touch
65
64
  end
66
65
 
67
- class Null
66
+ class Null # rubocop:todo Style/Documentation
68
67
  attr_reader :entry
69
68
 
70
69
  def initialize(entry)
71
70
  @entry = entry
72
71
  end
73
72
 
74
- def held_by?(user)
73
+ def held_by?(_user)
75
74
  false
76
75
  end
77
76
 
@@ -79,15 +78,14 @@ module Pageflow
79
78
  true
80
79
  end
81
80
 
82
- def acquire(user, options = {})
83
- entry.create_edit_lock!(:user => user)
81
+ def acquire(user, _options = {})
82
+ entry.create_edit_lock!(user:)
84
83
  end
85
84
 
86
- def release(user)
87
- end
85
+ def release(user); end
88
86
 
89
- def verify!(user, options = {})
90
- raise NotHeldError.new
87
+ def verify!(_user, _options = {})
88
+ raise NotHeldError
91
89
  end
92
90
  end
93
91
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class EncodingConfirmation
2
+ class EncodingConfirmation # rubocop:todo Style/Documentation
3
3
  class QuotaExceededError < RuntimeError
4
4
  end
5
5
 
@@ -29,7 +29,7 @@ module Pageflow
29
29
  end
30
30
 
31
31
  def assumed_quota
32
- @assumed_quota ||= encoding_quota.assume(files: files)
32
+ @assumed_quota ||= encoding_quota.assume(files:)
33
33
  end
34
34
 
35
35
  def files
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
2
  # @api private
3
- EntriesFeed = Struct.new(:title, :locale, :custom_url, :root_url, :entries) do
3
+ EntriesFeed = Struct.new(:title, :locale, :custom_url, :root_url, :entries) do # rubocop:disable Lint/StructNewOverride
4
4
  def updated_at
5
5
  entries.map(&:published_at).max
6
6
  end
@@ -23,7 +23,7 @@ module Pageflow
23
23
  site
24
24
  .entries
25
25
  .published_without_password_protection
26
- .where(pageflow_revisions: {locale: locale})
26
+ .where(pageflow_revisions: {locale:})
27
27
  .order('first_published_at DESC')
28
28
  )
29
29
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Entry < ApplicationRecord
2
+ class Entry < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  class PasswordMissingError < StandardError
4
4
  end
5
5
 
@@ -7,9 +7,11 @@ module Pageflow
7
7
  include EntryPublicationStates
8
8
  include Permalinkable
9
9
  include SerializationBlacklist
10
+ include Translatable
10
11
 
11
12
  extend FriendlyId
12
- friendly_id :slug_candidates, :use => [:finders, :slugged]
13
+
14
+ friendly_id :slug_candidates, use: [:finders, :slugged]
13
15
 
14
16
  belongs_to :account, counter_cache: true
15
17
  belongs_to :folder, optional: true
@@ -17,11 +19,13 @@ module Pageflow
17
19
 
18
20
  has_many :revisions, -> { order('frozen_at DESC') }
19
21
 
20
- has_many :chapters, -> { order('pageflow_chapters.position ASC') }, :through => :revisions
21
- has_many :pages, -> { order('pageflow_chapters.position ASC, pageflow_pages.position ASC') }, :through => :chapters
22
+ has_many :chapters, -> { order('pageflow_chapters.position ASC') }, through: :revisions
23
+ has_many :pages, lambda {
24
+ order('pageflow_chapters.position ASC, pageflow_pages.position ASC')
25
+ }, through: :chapters
22
26
 
23
27
  has_many :memberships, as: :entity, dependent: :destroy
24
- has_many :users, :through => :memberships, :class_name => '::User'
28
+ has_many :users, through: :memberships, class_name: '::User'
25
29
 
26
30
  has_many :image_files
27
31
  has_many :video_files
@@ -32,11 +36,11 @@ module Pageflow
32
36
  has_one :draft, -> { editable }, class_name: 'Revision', inverse_of: :entry
33
37
  has_one :published_revision, -> { published }, class_name: 'Revision', inverse_of: :entry
34
38
 
35
- has_one :edit_lock, :dependent => :destroy
39
+ has_one :edit_lock, dependent: :destroy
36
40
 
37
41
  has_secure_password validations: false
38
42
 
39
- validates :account, :site, :presence => true
43
+ validates :account, :site, presence: true
40
44
  validates :title, presence: true
41
45
  validate :entry_type_is_available_for_account
42
46
  validate :folder_belongs_to_same_account
@@ -52,7 +56,7 @@ module Pageflow
52
56
 
53
57
  after_create unless: :skip_draft_creation do
54
58
  create_draft!
55
- draft.storylines.create!(configuration: {main: true})
59
+ create_default_revision_components
56
60
  entry_template.copy_defaults_to(draft)
57
61
  end
58
62
 
@@ -74,8 +78,8 @@ module Pageflow
74
78
  account.feature_state(name)
75
79
  end
76
80
 
77
- def publish(options = {})
78
- ActiveRecord::Base.transaction do
81
+ def publish(options = {}) # rubocop:todo Metrics/AbcSize
82
+ transaction do
79
83
  self.first_published_at ||= Time.now
80
84
  update_password!(options.slice(:password, :password_protected))
81
85
 
@@ -94,25 +98,30 @@ module Pageflow
94
98
  end
95
99
 
96
100
  def snapshot(options)
97
- draft.copy do |revision|
98
- revision.creator = options[:creator]
99
- revision.frozen_at = Time.now
100
- revision.snapshot_type = options.fetch(:type, 'auto')
101
+ transaction do
102
+ draft.copy do |revision|
103
+ revision.creator = options[:creator]
104
+ revision.frozen_at = Time.now
105
+ revision.snapshot_type = options.fetch(:type, 'auto')
106
+ end
101
107
  end
102
108
  end
103
109
 
104
110
  def restore(options)
105
- restored_revision = options.fetch(:revision)
106
- draft.update!(:frozen_at => Time.now, :creator => options[:creator], :snapshot_type => 'before_restore')
107
-
108
- restored_revision.copy do |revision|
109
- revision.restored_from = restored_revision
110
- revision.frozen_at = nil
111
- revision.snapshot_type = nil
112
- revision.published_at = nil
113
- revision.published_until = nil
114
- revision.password_protected = nil
115
- revision.noindex = nil
111
+ transaction do
112
+ restored_revision = options.fetch(:revision)
113
+ draft.update!(frozen_at: Time.now, creator: options[:creator],
114
+ snapshot_type: 'before_restore')
115
+
116
+ restored_revision.copy do |revision|
117
+ revision.restored_from = restored_revision
118
+ revision.frozen_at = nil
119
+ revision.snapshot_type = nil
120
+ revision.published_at = nil
121
+ revision.published_until = nil
122
+ revision.password_protected = nil
123
+ revision.noindex = nil
124
+ end
116
125
  end
117
126
  end
118
127
 
@@ -151,19 +160,24 @@ module Pageflow
151
160
  private
152
161
 
153
162
  def folder_belongs_to_same_account
154
- errors.add(:folder, :must_be_same_account) if folder.present? && folder.account_id != account_id
163
+ return unless folder.present? && folder.account_id != account_id
164
+
165
+ errors.add(:folder,
166
+ :must_be_same_account)
155
167
  end
156
168
 
157
169
  def entry_type_is_available_for_account
158
170
  return if Pageflow.config_for(account).entry_types.map(&:name).include?(type_name)
159
171
 
160
- errors.add(:type_name, :must_be_available_for_account, type_name: type_name)
172
+ errors.add(:type_name, :must_be_available_for_account, type_name:)
173
+ end
174
+
175
+ def create_default_revision_components
176
+ Pageflow.config_for(self).revision_components.create_defaults(draft)
161
177
  end
162
178
 
163
179
  def update_password!(options)
164
- if options[:password].present?
165
- self.password = options[:password]
166
- end
180
+ self.password = options[:password] if options[:password].present?
167
181
 
168
182
  if options[:password_protected]
169
183
  raise PasswordMissingError if password_digest.blank?
@@ -45,7 +45,7 @@ module Pageflow
45
45
  end
46
46
 
47
47
  def theme
48
- @theme ||= CustomizedTheme.find(entry: entry, theme: revision.theme)
48
+ @theme ||= CustomizedTheme.find(entry: self, theme: revision.theme)
49
49
  end
50
50
 
51
51
  def home_button
@@ -67,5 +67,9 @@ module Pageflow
67
67
  def emphasize_new_pages
68
68
  revision.configuration['emphasize_new_pages']
69
69
  end
70
+
71
+ def self.wrap_all_drafts(entries)
72
+ entries.includes(:draft).map { |entry| new(entry, entry.draft) }
73
+ end
70
74
  end
71
75
  end
@@ -1,11 +1,13 @@
1
1
  module Pageflow
2
- class EntryDuplicate < Struct.new(:original_entry)
2
+ EntryDuplicate = Struct.new(:original_entry) do
3
3
  def create!
4
- create_entry
4
+ ActiveRecord::Base.transaction do
5
+ create_entry
5
6
 
6
- copy_permalink
7
- copy_draft
8
- copy_memberships
7
+ copy_permalink
8
+ copy_draft
9
+ copy_memberships
10
+ end
9
11
 
10
12
  new_entry
11
13
  end
@@ -47,6 +49,7 @@ module Pageflow
47
49
  account: original_entry.account,
48
50
  site: original_entry.site,
49
51
  features_configuration: original_entry.features_configuration,
52
+ perma_id_counter: original_entry.perma_id_counter,
50
53
 
51
54
  skip_draft_creation: true
52
55
  }
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class EntryPublication
2
+ class EntryPublication # rubocop:todo Style/Documentation
3
3
  attr_reader :entry, :attributes, :quota, :user
4
4
 
5
5
  def initialize(entry, attributes, published_entries_quota, user)
@@ -17,7 +17,7 @@ module Pageflow
17
17
  assumed_quota.verify_not_exceeded!
18
18
  entry.publish(attributes.merge(creator: user))
19
19
 
20
- Pageflow.config.hooks.invoke(:entry_published, entry: entry)
20
+ Pageflow.config.hooks.invoke(:entry_published, entry:)
21
21
  end
22
22
 
23
23
  private
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
- class EntryRoleQuery < ApplicationQuery
3
- class Scope < Scope
2
+ class EntryRoleQuery < ApplicationQuery # rubocop:todo Style/Documentation
3
+ class Scope < Scope # rubocop:todo Style/Documentation
4
4
  attr_reader :user, :scope
5
5
 
6
6
  def initialize(user, scope, table_alias_prefix: nil)
@@ -68,14 +68,14 @@ module Pageflow
68
68
  def entry_account_membership_has_at_least_role(role)
69
69
  membership_has_at_least_role(
70
70
  table_alias: table_alias_for('entry_account'),
71
- role: role
71
+ role:
72
72
  )
73
73
  end
74
74
 
75
75
  def entry_membership_has_at_least_role(role)
76
76
  membership_has_at_least_role(
77
77
  table_alias: table_alias_for('entry'),
78
- role: role
78
+ role:
79
79
  )
80
80
  end
81
81
 
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class EntryTemplate < ApplicationRecord
2
+ class EntryTemplate < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include ThemeReferencer
4
4
  include SerializedConfiguration
5
5
 
@@ -55,8 +55,8 @@ module Pageflow
55
55
  publisher: default_publisher.presence || Pageflow.config.default_publisher_meta_tag,
56
56
  keywords: default_keywords.presence || Pageflow.config.default_keywords_meta_tag,
57
57
  share_providers: default_share_providers,
58
- theme_name: theme_name,
59
- configuration: configuration,
58
+ theme_name:,
59
+ configuration:,
60
60
  locale: default_locale
61
61
  )
62
62
  end
@@ -66,7 +66,7 @@ module Pageflow
66
66
  end
67
67
 
68
68
  def hashify_provider_array(arr)
69
- Hash[arr.reject(&:blank?).map { |v| [v.to_s, true] }]
69
+ arr.reject(&:blank?).to_h { |v| [v.to_s, true] }
70
70
  end
71
71
  end
72
72
  end
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
2
  # @api private
3
3
  class EntryTitleOrAccountNameQuery < 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
@@ -19,7 +19,7 @@ module Pageflow
19
19
  attr_reader :term, :scope
20
20
 
21
21
  def word_conditions(term)
22
- term.split(' ').map { |word|
22
+ term.split.map { |word|
23
23
  word_condition(word)
24
24
  }.join(' AND ')
25
25
  end
@@ -0,0 +1,42 @@
1
+ module Pageflow
2
+ # @api private
3
+ class EntryTranslationGroup < ApplicationRecord
4
+ has_many :entries,
5
+ -> { order(title: :asc) },
6
+ foreign_key: 'translation_group_id',
7
+ dependent: :nullify
8
+
9
+ has_many :published_entries,
10
+ -> { published },
11
+ foreign_key: 'translation_group_id',
12
+ class_name: 'Entry'
13
+
14
+ has_many :publicly_visible_entries,
15
+ -> { published_without_password_protection.published_without_noindex },
16
+ foreign_key: 'translation_group_id',
17
+ class_name: 'Entry'
18
+
19
+ has_many :entries_published_without_password_protection,
20
+ -> { published_without_password_protection },
21
+ foreign_key: 'translation_group_id',
22
+ class_name: 'Entry'
23
+
24
+ has_many :entries_published_without_noindex,
25
+ -> { published_without_noindex },
26
+ foreign_key: 'translation_group_id',
27
+ class_name: 'Entry'
28
+
29
+ belongs_to :default_translation,
30
+ class_name: 'Entry',
31
+ optional: true
32
+
33
+ def merge_into(translation_group)
34
+ entries.update_all(translation_group_id: translation_group.id)
35
+ destroy
36
+ end
37
+
38
+ def single_item_or_empty?
39
+ !entries.many?
40
+ end
41
+ end
42
+ end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class FileReuse
2
+ class FileReuse # rubocop:todo Style/Documentation
3
3
  attr_accessor :source_entry, :destination_entry, :file_type, :file
4
4
 
5
5
  def initialize(destination_entry, source_entry, file_type, file_id)
@@ -9,7 +9,7 @@ module Pageflow
9
9
  @file = source_entry.find_file(file_type.model, file_id)
10
10
  end
11
11
 
12
- def save!
12
+ def save! # rubocop:todo Metrics/AbcSize
13
13
  destination_entry.use_file(file)
14
14
 
15
15
  file_type.nested_file_types.each do |nested_file_type|
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class FileUsage < ApplicationRecord
2
+ class FileUsage < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include SerializedConfiguration
4
4
  include RevisionComponent
5
5
 
@@ -7,8 +7,15 @@ module Pageflow
7
7
 
8
8
  belongs_to :file, polymorphic: true
9
9
 
10
- def copy_to(revision)
11
- revision.file_usages << dup
10
+ validate :display_name_extension_matches
11
+
12
+ private
13
+
14
+ def display_name_extension_matches
15
+ return if display_name.blank? || file.blank?
16
+ return if File.extname(display_name) == File.extname(file.file_name.to_s)
17
+
18
+ errors.add(:display_name, 'extension mismatch')
12
19
  end
13
20
  end
14
21
  end
@@ -1,8 +1,8 @@
1
1
  module Pageflow
2
- class Folder < ApplicationRecord
2
+ class Folder < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  belongs_to :account
4
4
  has_many :entries
5
5
 
6
- validates :account, :name, :presence => true
6
+ validates :account, :name, presence: true
7
7
  end
8
8
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class HomeButton
2
+ class HomeButton # rubocop:todo Style/Documentation
3
3
  attr_reader :revision, :site
4
4
 
5
5
  def initialize(revision, site)
@@ -28,12 +28,12 @@ module Pageflow
28
28
  private
29
29
 
30
30
  def site_home_button_url
31
- if site.home_url.present?
32
- options = Pageflow.config.site_url_options(site) || {}
33
- Pageflow::Engine.routes.url_for(options.merge(controller: 'pageflow/entries',
34
- action: 'index',
35
- only_path: !options[:host]))
36
- end
31
+ return unless site.home_url.present?
32
+
33
+ options = Pageflow.config.site_url_options_for(site) || {}
34
+ Pageflow::Engine.routes.url_for(options.merge(controller: 'pageflow/entries',
35
+ action: 'index',
36
+ only_path: !options[:host]))
37
37
  end
38
38
  end
39
39
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ImageFile < ApplicationRecord
2
+ class ImageFile < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  include UploadableFile
4
4
  include ImageAndTextTrackProcessingStateMachine
5
5
  include OutputSource
@@ -14,11 +14,12 @@ module Pageflow
14
14
 
15
15
  before_attachment_on_s3_post_process :save_image_dimensions
16
16
 
17
- def thumbnail_url(*args)
17
+ def thumbnail_url(*)
18
18
  unless ready?
19
- return Pageflow::PaperclipInterpolations::Support.pageflow_placeholder(attachment, *args)
19
+ return Pageflow::PaperclipInterpolations::Support.pageflow_placeholder(attachment, *)
20
20
  end
21
- attachment.url(*args)
21
+
22
+ attachment.url(*)
22
23
  end
23
24
 
24
25
  def original_url
@@ -59,6 +60,7 @@ module Pageflow
59
60
  format: panorama_format,
60
61
  convert_options: '-quality 90 -interlace Plane'}
61
62
  )
63
+ .merge(social_image_styles)
62
64
  end
63
65
 
64
66
  def url
@@ -81,9 +83,22 @@ module Pageflow
81
83
 
82
84
  def save_image_dimensions
83
85
  geo = Paperclip::Geometry.from_file(attachment.queued_for_write[:original])
86
+ geo.auto_orient
87
+
84
88
  self.width = geo.width
85
89
  self.height = geo.height
86
90
  rescue Paperclip::Errors::NotIdentifiedByImageMagickError
91
+ # Ignore files that can't be processed by ImageMagick
92
+ end
93
+
94
+ def social_image_styles
95
+ if output_present?(:social)
96
+ {social: {geometry: '1024x1024>',
97
+ format: :jpg,
98
+ convert_options: '-quality 70 -interlace Plane'}}
99
+ else
100
+ {}
101
+ end
87
102
  end
88
103
 
89
104
  def style_defaults
@@ -95,7 +110,7 @@ module Pageflow
95
110
  end
96
111
 
97
112
  def set_output_presences
98
- self.output_presences = {webp: true} if entry&.feature_state('webp_images')
113
+ self.output_presences = {webp: true, social: true} if entry&.feature_state('webp_images')
99
114
  end
100
115
  end
101
116
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ImageFileUrlTemplates
2
+ class ImageFileUrlTemplates # rubocop:todo Style/Documentation
3
3
  def call
4
4
  styles.each_with_object({}) do |style, result|
5
5
  result[style] = replace_extension_with_placeholder(
@@ -22,6 +22,7 @@ module Pageflow
22
22
 
23
23
  def save
24
24
  return false unless valid?
25
+
25
26
  Pageflow.config.quotas.get(:users, initial_account).verify_available!
26
27
 
27
28
  membership.save!
@@ -33,7 +34,7 @@ module Pageflow
33
34
 
34
35
  def existing_member
35
36
  @existing_member ||=
36
- initial_account && initial_account.users.find_by_email(user.email)
37
+ initial_account&.users&.find_by_email(user.email)
37
38
  end
38
39
 
39
40
  def initial_account
@@ -1,7 +1,7 @@
1
1
  module Pageflow
2
2
  # @api private
3
3
  class ManagedUserQuery < ApplicationQuery
4
- class Scope < Scope
4
+ class Scope < Scope # rubocop:todo Style/Documentation
5
5
  def initialize(current_user, scope)
6
6
  @current_user = current_user
7
7
  @scope = scope
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Membership < ApplicationRecord
2
+ class Membership < ApplicationRecord # rubocop:todo Style/Documentation
3
3
  belongs_to :user
4
4
  belongs_to :entity, polymorphic: true
5
5
  belongs_to :entry,
@@ -15,17 +15,17 @@ module Pageflow
15
15
  validates :user_id, uniqueness: {scope: [:entity_type, :entity_id]}
16
16
  validate :account_membership_exists, if: :on_entry?
17
17
  validates :role,
18
- inclusion: {in: %w(previewer editor publisher manager)},
18
+ inclusion: {in: %w[previewer editor publisher manager]},
19
19
  if: :on_entry?
20
20
  validates :role,
21
- inclusion: {in: %w(member previewer editor publisher manager)},
21
+ inclusion: {in: %w[member previewer editor publisher manager]},
22
22
  if: :on_account?
23
23
 
24
24
  scope :on_entries, -> { where(entity_type: 'Pageflow::Entry') }
25
25
  scope :on_accounts, -> { where(entity_type: 'Pageflow::Account') }
26
26
  scope :as_manager, -> { where(role: :manager) }
27
- scope :as_publisher_or_above, -> { where(role: %w(publisher manager)) }
28
- scope :as_previewer_or_above, -> { where(role: %w(previewer editor publisher manager)) }
27
+ scope :as_publisher_or_above, -> { where(role: %w[publisher manager]) }
28
+ scope :as_previewer_or_above, -> { where(role: %w[previewer editor publisher manager]) }
29
29
 
30
30
  after_create do
31
31
  entity.increment!(:users_count)