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
@@ -90,6 +90,13 @@ module Pageflow
90
90
  grouped_by_accounts: authorized?(:see, :accounts))
91
91
  end
92
92
 
93
+ searchable_select_options(text_attribute: :title,
94
+ scope: lambda do |params|
95
+ scope = EntryPolicy::Scope.new(current_user, Entry).resolve
96
+ scope = scope.where(site_id: params[:site_id]) if params[:site_id]
97
+ scope
98
+ end)
99
+
93
100
  searchable_select_options(name: :eligible_accounts,
94
101
  text_attribute: :name,
95
102
  scope: lambda do
@@ -141,7 +148,7 @@ module Pageflow
141
148
 
142
149
  collection_action :entry_site_and_type_name_input do
143
150
  account = Pageflow::Account.find(params[:account_id])
144
- @entry = Pageflow::Entry.new(account: account,
151
+ @entry = Pageflow::Entry.new(account:,
145
152
  type_name: params[:entry_type_name])
146
153
 
147
154
  apply_entry_defaults(@entry)
@@ -186,8 +193,8 @@ module Pageflow
186
193
  end
187
194
 
188
195
  show title: :title do |entry|
189
- render 'attributes_table', entry: entry
190
- render 'links', entry: entry
196
+ render('attributes_table', entry:)
197
+ render('links', entry:)
191
198
 
192
199
  tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(entry),
193
200
  i18n: 'pageflow.admin.resource_tabs',
@@ -205,12 +212,15 @@ module Pageflow
205
212
  helper Admin::FormHelper
206
213
  helper Admin::MembershipsHelper
207
214
  helper Admin::RevisionsHelper
215
+ helper Admin::EntryTranslationsHelper
208
216
 
209
217
  helper_method :account_policy_scope
210
218
  helper_method :site_policy_scope
211
219
 
212
220
  after_build do |entry|
221
+ handle_site_param(entry)
213
222
  apply_entry_defaults(entry)
223
+ handle_root_permalink(entry)
214
224
 
215
225
  if action_name == 'new' &&
216
226
  (default_entry_type = Pageflow.config.default_entry_type&.call(entry.account))
@@ -219,12 +229,29 @@ module Pageflow
219
229
  end
220
230
  end
221
231
 
232
+ after_create do |entry|
233
+ Pageflow.config.hooks.invoke(:entry_created, entry:) if entry.persisted?
234
+ end
235
+
222
236
  before_update do |entry|
223
237
  if entry.account_id_changed? && !authorized?(:update_site_on, resource)
224
238
  entry.site = entry.account.default_site
225
239
  end
226
240
  end
227
241
 
242
+ def create
243
+ create! do |success, _|
244
+ success.html do
245
+ case Pageflow.config.after_entry_create_redirect_to
246
+ when :admin
247
+ redirect_to admin_entry_path(resource)
248
+ when :editor
249
+ redirect_to pageflow.editor_entry_path(resource)
250
+ end
251
+ end
252
+ end
253
+ end
254
+
228
255
  def update
229
256
  update! do |success, _|
230
257
  success.html { redirect_to(admin_entry_path(resource, params.permit(:tab))) }
@@ -247,20 +274,41 @@ module Pageflow
247
274
  def permitted_params
248
275
  result = params.permit(entry: permitted_attributes)
249
276
 
250
- if result[:entry]
251
- permit_feature_states(result[:entry])
252
- end
277
+ permit_feature_states(result[:entry]) if result[:entry]
253
278
 
254
279
  result
255
280
  end
256
281
 
257
282
  private
258
283
 
284
+ def handle_site_param(entry)
285
+ return unless params[:site_id]
286
+
287
+ site = site_policy_scope.sites_allowed_for(
288
+ account_policy_scope.entry_creatable
289
+ ).find(params[:site_id])
290
+
291
+ entry.site = site
292
+ entry.account = site.account
293
+ end
294
+
259
295
  def apply_entry_defaults(entry)
260
296
  entry.account ||= account_policy_scope.entry_creatable.first || Account.first
261
297
  entry.site ||= entry.account.default_site
262
298
  end
263
299
 
300
+ def handle_root_permalink(entry)
301
+ return unless params[:at] == 'root'
302
+ return unless authorized?(:manage_root_entry, entry.site)
303
+
304
+ entry.build_permalink unless entry.permalink
305
+ entry.permalink.assign_attributes(
306
+ directory: entry.site.root_permalink_directory,
307
+ slug: '',
308
+ allow_root_path: '1'
309
+ )
310
+ end
311
+
264
312
  def account_policy_scope
265
313
  AccountPolicy::Scope.new(current_user, Account)
266
314
  end
@@ -269,7 +317,8 @@ module Pageflow
269
317
  SitePolicy::Scope.new(current_user, Site)
270
318
  end
271
319
 
272
- def permitted_attributes
320
+ # rubocop:todo Metrics/PerceivedComplexity
321
+ def permitted_attributes # rubocop:todo Metrics/AbcSize
273
322
  result = [:title, :type_name, {permalink_attributes: [:slug, :directory_id]}]
274
323
  target = if !params[:id] && current_user.admin?
275
324
  Account.first
@@ -281,26 +330,25 @@ module Pageflow
281
330
  result += Pageflow.config_for(target).admin_form_inputs.permitted_attributes_for(:entry)
282
331
  result += permitted_account_attributes
283
332
 
284
- if params[:id]
285
- result << :folder_id if authorized?(:configure_folder_for, resource)
286
- end
333
+ result << :folder_id if params[:id] && authorized?(:configure_folder_for, resource)
287
334
 
288
- if params[:id]
289
- accounts = resource.account
290
- else
291
- accounts = account_policy_scope.sites_accessible
292
- end
335
+ accounts = if params[:id]
336
+ resource.account
337
+ else
338
+ account_policy_scope.sites_accessible
339
+ end
293
340
 
294
341
  result += permitted_site_attributes(accounts)
295
342
 
296
343
  result
297
344
  end
345
+ # rubocop:enable Metrics/PerceivedComplexity
298
346
 
299
347
  def permit_feature_states(attributes)
300
- if params[:id] && authorized?(:update_feature_configuration_on, resource)
301
- feature_states = params[:entry][:feature_states].try(:permit!)
302
- attributes.merge!(feature_states: feature_states || {})
303
- end
348
+ return unless params[:id] && authorized?(:update_feature_configuration_on, resource)
349
+
350
+ feature_states = params[:entry][:feature_states].try(:permit!)
351
+ attributes.merge!(feature_states: feature_states || {})
304
352
  end
305
353
 
306
354
  def permitted_site_attributes(accounts)
@@ -322,7 +370,7 @@ module Pageflow
322
370
 
323
371
  def site_in_allowed_sites_for?(accounts)
324
372
  site_policy_scope.sites_allowed_for(accounts)
325
- .include?(Site.find(params[:entry][:site_id]))
373
+ .include?(Site.find(params[:entry][:site_id]))
326
374
  end
327
375
 
328
376
  def permitted_account_attributes
@@ -12,8 +12,9 @@ module Pageflow
12
12
  end
13
13
 
14
14
  controller do
15
- helper Pageflow::Admin::FormHelper
16
- helper Pageflow::Admin::WidgetsHelper
15
+ helper Admin::FormHelper
16
+ helper Admin::WidgetsHelper
17
+ helper Admin::LocalesHelper
17
18
 
18
19
  def index
19
20
  redirect_to redirect_path
@@ -58,8 +59,8 @@ module Pageflow
58
59
  private
59
60
 
60
61
  def page_title(rest_verb, entry_type_name)
61
- "#{I18n.t('pageflow.admin.entry_templates.page_title.' + rest_verb)} "\
62
- "#{I18n.t('activerecord.values.pageflow/entry.type_names.' + entry_type_name)}"
62
+ "#{I18n.t("pageflow.admin.entry_templates.page_title.#{rest_verb}")} " \
63
+ "#{I18n.t("activerecord.values.pageflow/entry.type_names.#{entry_type_name}")}"
63
64
  end
64
65
 
65
66
  def permitted_params
@@ -79,8 +80,8 @@ module Pageflow
79
80
  :default_publisher,
80
81
  :default_keywords,
81
82
  :default_locale,
82
- share_providers: {},
83
- configuration: {}
83
+ {share_providers: {},
84
+ configuration: {}}
84
85
  ]
85
86
  end
86
87
 
@@ -106,7 +107,7 @@ module Pageflow
106
107
  end
107
108
 
108
109
  def true_false_strings_to_booleans_or_numbers(hash)
109
- hash&.map { |k, v| [k, to_boolean_or_number(v)] }&.to_h
110
+ hash&.transform_values { |v| to_boolean_or_number(v) }
110
111
  end
111
112
 
112
113
  def to_boolean_or_number(value)
@@ -129,8 +130,8 @@ module Pageflow
129
130
  end
130
131
 
131
132
  def widgets_params
132
- (params[:widgets].try(:permit!).to_h || {}).map do |role, type_name|
133
- {role: role, type_name: type_name}
133
+ params[:widgets].try(:permit!).to_h.map do |role, type_name|
134
+ {role:, type_name:}
134
135
  end
135
136
  end
136
137
  end
@@ -57,7 +57,7 @@ module Pageflow
57
57
  def restrict_attributes(attributes)
58
58
  if params[:folder] && params[:folder][:account_id] &&
59
59
  AccountPolicy::Scope.new(current_user, Account)
60
- .folder_addable.exists?(params[:folder][:account_id]) &&
60
+ .folder_addable.exists?(params[:folder][:account_id]) &&
61
61
  action_name.to_sym == :create
62
62
 
63
63
  attributes
@@ -80,8 +80,8 @@ module Pageflow
80
80
  belongs_to :account, parent_class: Pageflow::Account, polymorphic: true
81
81
  belongs_to :user, parent_class: User, polymorphic: true
82
82
 
83
- helper Pageflow::Admin::MembershipsHelper
84
- helper Pageflow::Admin::FormHelper
83
+ helper Admin::MembershipsHelper
84
+ helper Admin::FormHelper
85
85
 
86
86
  def index
87
87
  if params[:user_id].present?
@@ -119,10 +119,10 @@ module Pageflow
119
119
  end
120
120
  end
121
121
 
122
- def redirect_path
122
+ def redirect_path # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
123
123
  if params[:user_id].present? && authorized?(:redirect_to_user, resource.user)
124
124
  tab = resource.entity_type == 'Pageflow::Account' ? 'accounts' : 'entries'
125
- admin_user_path(params[:user_id], tab: tab)
125
+ admin_user_path(params[:user_id], tab:)
126
126
  elsif params[:user_id].present? && authorized?(:index, resource.user)
127
127
  admin_users_path
128
128
  elsif params[:account_id].present? && authorized?(:read, resource.entity)
@@ -1,18 +1,18 @@
1
1
  module Pageflow
2
- ActiveAdmin.register Revision, :as => 'Revision' do
2
+ ActiveAdmin.register Revision, as: 'Revision' do
3
3
  menu false
4
4
 
5
5
  actions :edit, :update, :show
6
6
 
7
- form :partial => 'form'
7
+ form partial: 'form'
8
8
 
9
- member_action :restore, :method => :post do
9
+ member_action :restore, method: :post do
10
10
  revision = Revision.find(params[:id])
11
11
  entry = revision.entry
12
12
  authorize!(:restore, entry)
13
13
 
14
14
  entry.edit_lock.acquire(current_user)
15
- revision.entry.restore(revision: revision, creator: current_user)
15
+ revision.entry.restore(revision:, creator: current_user)
16
16
  entry.edit_lock.release(current_user)
17
17
  redirect_to(admin_entry_path(entry), notice: I18n.t('pageflow.admin.revisions.restored'))
18
18
  end
@@ -20,7 +20,7 @@ module Pageflow
20
20
  controller do
21
21
  include EditLocking
22
22
 
23
- helper Pageflow::Admin::FormHelper
23
+ helper Admin::FormHelper
24
24
 
25
25
  def permitted_params
26
26
  params.permit(revision: [:published_until])
@@ -0,0 +1,64 @@
1
+ module Pageflow
2
+ ActiveAdmin.register_page 'Site Root Entry' do
3
+ menu false
4
+
5
+ breadcrumb do
6
+ breadcrumb_links.first(1)
7
+ end
8
+
9
+ page_action :choose, method: [:get, :post] do
10
+ @page_title = t('pageflow.admin.site_root_entry.title')
11
+
12
+ @site_root_entry_form = SiteRootEntryForm.new(
13
+ permitted_params[:site_root_entry_form],
14
+ @site
15
+ )
16
+
17
+ if request.post? && @site_root_entry_form.save
18
+ redirect_to(admin_entry_path(@site_root_entry_form.entry),
19
+ notice: t('pageflow.admin.site_root_entry.chosen'))
20
+ end
21
+ end
22
+
23
+ controller do
24
+ helper Admin::FormHelper
25
+
26
+ before_action :find_site
27
+ before_action :authorize_manage_root_entry!
28
+ before_action :ensure_root_permalink_directory
29
+ before_action :ensure_no_root_entry
30
+
31
+ def index
32
+ redirect_to(admin_account_name_setup_path)
33
+ end
34
+
35
+ private
36
+
37
+ def find_site
38
+ @site = Site.find(params[:site_id])
39
+ end
40
+
41
+ def authorize_manage_root_entry!
42
+ authorize!(:manage_root_entry, @site)
43
+ end
44
+
45
+ def ensure_root_permalink_directory
46
+ return if @site.root_permalink_directory.present?
47
+
48
+ redirect_to(admin_root_path,
49
+ alert: t('pageflow.admin.site_root_entry.root_permalink_directory_required'))
50
+ end
51
+
52
+ def ensure_no_root_entry
53
+ return if @site.root_entry.blank?
54
+
55
+ redirect_to(admin_root_path,
56
+ alert: t('pageflow.admin.site_root_entry.root_entry_exists'))
57
+ end
58
+
59
+ def permitted_params
60
+ params.permit(site_root_entry_form: [:entry_id])
61
+ end
62
+ end
63
+ end
64
+ end
@@ -6,7 +6,7 @@ module Pageflow
6
6
  actions :index, :show, :new, :edit, :create, :update
7
7
 
8
8
  show do
9
- render 'attributes_table', site: site
9
+ render('attributes_table', site:)
10
10
 
11
11
  tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(site),
12
12
  i18n: 'pageflow.admin.resource_tabs',
@@ -29,12 +29,21 @@ module Pageflow
29
29
  :copyright_link_url,
30
30
  :copyright_link_label,
31
31
  :privacy_link_url,
32
- :home_url
32
+ :home_url,
33
+ :cutoff_mode_name,
34
+ :custom_404_entry_id
33
35
  ] + permitted_admin_form_input_params
34
36
  end
35
37
 
36
38
  controller do
37
- helper Pageflow::Admin::FormHelper
39
+ helper Admin::CutoffModesHelper
40
+ helper Admin::FormHelper
41
+ helper Admin::SitesHelper
42
+ helper Pageflow::PublicI18n::LocalesHelper
43
+
44
+ before_create do |site|
45
+ site.build_root_permalink_directory
46
+ end
38
47
 
39
48
  def index
40
49
  redirect_to admin_account_path(parent, tab: 'sites')
@@ -0,0 +1,75 @@
1
+ module Pageflow
2
+ ActiveAdmin.register Entry, as: 'Translations' do
3
+ menu false
4
+ belongs_to :entry
5
+
6
+ actions :new, :create, :destroy
7
+
8
+ searchable_select_options(name: :potential_entry_translations,
9
+ scope: lambda do |_params|
10
+ authorize!(:manage_translations, parent)
11
+ PotentialEntryTranslations.for(parent).resolve
12
+ end,
13
+ text_attribute: :title,
14
+ display_text: lambda do |entry|
15
+ if entry.translation_group
16
+ entry.translation_group
17
+ .entries
18
+ .order('title ASC')
19
+ .map(&:title)
20
+ .join(' / ')
21
+ .presence
22
+ else
23
+ entry.title
24
+ end
25
+ end)
26
+
27
+ form partial: 'form'
28
+
29
+ member_action :default, method: :put do
30
+ entry = Entry.find(params[:id])
31
+
32
+ authorize!(:manage_translations, entry)
33
+ entry.mark_as_default_translation
34
+
35
+ redirect_to(admin_entry_path(parent, tab: 'translations'))
36
+ end
37
+
38
+ controller do
39
+ helper Admin::FormHelper
40
+
41
+ def index
42
+ redirect_to admin_entry_path(parent, tab: 'translations')
43
+ end
44
+
45
+ def create
46
+ entry = Entry.find(params.require(:entry)[:id])
47
+
48
+ authorize!(:manage_translations, parent)
49
+ authorize!(:manage_translations, entry)
50
+ parent.mark_as_translation_of(entry)
51
+
52
+ redirect_to(admin_entry_path(parent, tab: 'translations'))
53
+ end
54
+
55
+ def destroy
56
+ entry = Entry.find(params[:id])
57
+
58
+ authorize!(:manage_translations, entry)
59
+ entry.remove_from_translation_group
60
+
61
+ redirect_to(admin_entry_path(parent, tab: 'translations'))
62
+ end
63
+
64
+ protected
65
+
66
+ def authorized?(action, subject = nil)
67
+ if subject.is_a?(Entry) && subject.new_record?
68
+ super(:manage_translations, parent)
69
+ else
70
+ super
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -38,21 +38,7 @@ module Pageflow
38
38
 
39
39
  show do |user|
40
40
  div do
41
- attributes_table_for user do
42
- row :last_name, class: 'last_name'
43
- row :first_name, class: 'first_name'
44
- row :email, class: 'email'
45
-
46
- row :created_at
47
- row :last_sign_in_at
48
- boolean_status_tag_row :suspended?
49
- row :locale do
50
- I18n.t('language', locale: user.locale)
51
- end
52
- if authorized?(:see_admin_status, user)
53
- boolean_status_tag_row(:admin?, 'admin warning')
54
- end
55
- end
41
+ render('attributes_table', user:)
56
42
 
57
43
  para do
58
44
  link_to I18n.t('pageflow.admin.users.resend_invitation'),
@@ -133,23 +119,19 @@ module Pageflow
133
119
  collection_action 'me', title: I18n.t('pageflow.admin.users.account'), method: [:get, :patch] do
134
120
  @user = User.find(current_user.id)
135
121
 
136
- if request.patch?
137
- if @user.update_with_password(user_profile_params)
138
- Pageflow.config.hooks.invoke(:user_changed, @user)
122
+ if request.patch? && @user.update_with_password(user_profile_params)
123
+ Pageflow.config.hooks.invoke(:user_changed, @user)
139
124
 
140
- bypass_sign_in @user, scope: :user
141
- redirect_to admin_root_path, notice: I18n.t('pageflow.admin.users.me.updated')
142
- end
125
+ bypass_sign_in @user, scope: :user
126
+ redirect_to admin_root_path, notice: I18n.t('pageflow.admin.users.me.updated')
143
127
  end
144
128
  end
145
129
 
146
130
  collection_action 'delete_me',
147
131
  title: I18n.t('pageflow.admin.users.account'), method: [:get, :delete] do
148
- if request.delete?
149
- if authorized?(:delete_own_user, current_user) &&
150
- current_user.destroy_with_password(params.require(:user)[:current_password])
151
- redirect_to admin_root_path, notice: I18n.t('pageflow.admin.users.me.updated')
152
- end
132
+ if request.delete? && authorized?(:delete_own_user, current_user) &&
133
+ current_user.destroy_with_password(params.require(:user)[:current_password])
134
+ redirect_to admin_root_path, notice: I18n.t('pageflow.admin.users.me.updated')
153
135
  end
154
136
  end
155
137
 
@@ -157,30 +139,34 @@ module Pageflow
157
139
  user = InvitedUser.find(params[:id])
158
140
  authorize!(:read, user)
159
141
  user.send_invitation!
160
- redirect_back fallback_location: admin_user_path(user), notice: I18n.t('pageflow.admin.users.resent_invitation')
142
+ redirect_back fallback_location: admin_user_path(user),
143
+ notice: I18n.t('pageflow.admin.users.resent_invitation')
161
144
  end
162
145
 
163
146
  member_action :suspend, method: :post do
164
147
  user = User.find(params[:id])
165
148
  authorize!(:suspend, user)
166
149
  user.suspend!
167
- redirect_back fallback_location: admin_user_path(user), notice: I18n.t('pageflow.admin.users.suspended')
150
+ redirect_back fallback_location: admin_user_path(user),
151
+ notice: I18n.t('pageflow.admin.users.suspended')
168
152
  end
169
153
 
170
154
  member_action :unsuspend, method: :post do
171
155
  user = User.find(params[:id])
172
156
  authorize!(:suspend, user)
173
157
  user.unsuspend!
174
- redirect_back fallback_location: admin_user_path(user), notice: I18n.t('pageflow.admin.users.unsuspended')
158
+ redirect_back fallback_location: admin_user_path(user),
159
+ notice: I18n.t('pageflow.admin.users.unsuspended')
175
160
  end
176
161
 
177
162
  controller do
178
- include Pageflow::QuotaVerification
179
- helper Pageflow::Admin::FormHelper
180
- helper Pageflow::Admin::LocalesHelper
181
- helper Pageflow::Admin::MembershipsHelper
182
- helper Pageflow::Admin::UsersHelper
183
- helper Pageflow::QuotaHelper
163
+ include QuotaVerification
164
+
165
+ helper Admin::FormHelper
166
+ helper Admin::LocalesHelper
167
+ helper Admin::MembershipsHelper
168
+ helper Admin::UsersHelper
169
+ helper QuotaHelper
184
170
 
185
171
  def scoped_collection
186
172
  super.includes(account_memberships: :entity)
@@ -90,6 +90,9 @@ jQuery(function($) {
90
90
  var accountSelect = $('#entry_account_id', this);
91
91
  var siteSelect = $('#entry_site_id', this);
92
92
  var titleInput = $('#entry_title', this);
93
+ var permalinkDirectorySelect = $('#entry_permalink_attributes_directory_id', this);
94
+
95
+ var isRootPermalink = $(this).attr('data-root-permalink') === 'true';
93
96
 
94
97
  function updateSiteAndEntryTypeInput() {
95
98
  var selectedAccountId = accountSelect.val();
@@ -114,17 +117,36 @@ jQuery(function($) {
114
117
  function updatePermalinkInput() {
115
118
  fetchPermalinkInput(function(response) {
116
119
  $('#entry_permalink_attributes_permalink_input').replaceWith(response);
120
+
121
+ permalinkDirectorySelect = $('#entry_permalink_attributes_directory_id');
122
+ permalinkDirectorySelect.on('change', updateSlugPlaceholder);
117
123
  });
118
124
  }
119
125
 
120
- function updateSlugPlaceholder() {
126
+ function updateSlugPlaceholderData() {
121
127
  fetchPermalinkInput(function(response) {
122
- $('#entry_permalink_attributes_permalink_input input[placeholder]')
123
- .attr('placeholder',
124
- $(response).find('input[placeholder]').attr('placeholder'));
128
+ $('#entry_permalink_attributes_slug')
129
+ .attr('data-placeholder',
130
+ $(response).find('input[data-placeholder]').attr('data-placeholder'));
131
+
132
+ updateSlugPlaceholder();
125
133
  });
126
134
  }
127
135
 
136
+ function updateSlugPlaceholder() {
137
+ var slugInput = $('#entry_permalink_attributes_slug');
138
+ var rootDirectorySelected =
139
+ permalinkDirectorySelect[0] &&
140
+ !permalinkDirectorySelect[0].selectedOptions[0].text;
141
+
142
+ slugInput.attr(
143
+ 'placeholder',
144
+ isRootPermalink && rootDirectorySelected ?
145
+ '' :
146
+ slugInput.attr('data-placeholder')
147
+ );
148
+ }
149
+
128
150
  function fetchPermalinkInput(callback) {
129
151
  $.get('/admin/entries/permalink_inputs' +
130
152
  '?entry[account_id]=' + accountSelect.val() +
@@ -138,7 +160,10 @@ jQuery(function($) {
138
160
  accountSelect.on('change', updatePermalinkInput);
139
161
  siteSelect.on('change', updatePermalinkInput);
140
162
 
141
- titleInput.on('change keyup', debounce(updateSlugPlaceholder, 300));
163
+ titleInput.on('change keyup', debounce(updateSlugPlaceholderData, 300));
164
+ permalinkDirectorySelect.on('change', updateSlugPlaceholder);
165
+
166
+ updateSlugPlaceholder();
142
167
  });
143
168
  });
144
169