pageflow 17.0.5 → 17.2.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 (636) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +342 -41
  3. data/README.md +3 -5
  4. data/admins/pageflow/accounts.rb +22 -20
  5. data/admins/pageflow/entry.rb +76 -26
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +15 -15
  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/images/pageflow/admin/icons/comment.svg +1 -0
  15. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  16. data/app/assets/javascripts/pageflow/dist/ui.js +4228 -900
  17. data/app/assets/javascripts/pageflow/editor/vendor.js +0 -1
  18. data/app/assets/javascripts/pageflow/ui.js +0 -1
  19. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  20. data/app/assets/stylesheets/pageflow/admin/entry_comments_indicator.scss +45 -0
  21. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +8 -0
  22. data/app/assets/stylesheets/pageflow/admin.scss +1 -0
  23. data/app/assets/stylesheets/pageflow/animations/spin.scss +9 -0
  24. data/app/assets/stylesheets/pageflow/animations.scss +1 -0
  25. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +27 -5
  26. data/app/assets/stylesheets/pageflow/editor/base.scss +11 -1
  27. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +20 -2
  28. data/app/assets/stylesheets/pageflow/editor/edit_configuration_view.scss +5 -0
  29. data/app/assets/stylesheets/pageflow/editor/file_folders.scss +127 -0
  30. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -2
  31. data/app/assets/stylesheets/pageflow/editor/file_meta_data_overlay.scss +45 -0
  32. data/app/assets/stylesheets/pageflow/editor/file_preview.scss +138 -0
  33. data/app/assets/stylesheets/pageflow/editor/file_references.scss +68 -0
  34. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +1 -1
  35. data/app/assets/stylesheets/pageflow/editor/file_stage_icons.scss +17 -0
  36. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +25 -32
  37. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +31 -48
  38. data/app/assets/stylesheets/pageflow/editor/file_type_pills.scss +73 -0
  39. data/app/assets/stylesheets/pageflow/editor/files.scss +242 -50
  40. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +161 -9
  41. data/app/assets/stylesheets/pageflow/editor/folder_breadcrumb.scss +40 -0
  42. data/app/assets/stylesheets/pageflow/editor/info_box.scss +23 -3
  43. data/app/assets/stylesheets/pageflow/editor/inputs/edit_defaults_button.scss +15 -0
  44. data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
  45. data/app/assets/stylesheets/pageflow/editor/list.scss +89 -37
  46. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  47. data/app/assets/stylesheets/pageflow/editor/manage_files.scss +9 -0
  48. data/app/assets/stylesheets/pageflow/editor/menu.scss +14 -0
  49. data/app/assets/stylesheets/pageflow/editor/move_to_folder_dialog.scss +83 -0
  50. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  51. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  52. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  53. data/app/assets/stylesheets/pageflow/mixins/pageflow.scss +9 -5
  54. data/app/assets/stylesheets/pageflow/ui/color_picker.scss +230 -0
  55. data/app/assets/stylesheets/pageflow/ui/forms.scss +38 -4
  56. data/app/assets/stylesheets/pageflow/ui/functions.scss +12 -2
  57. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +9 -8
  58. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  59. data/app/assets/stylesheets/pageflow/ui/input/text_area_input.scss +15 -0
  60. data/app/assets/stylesheets/pageflow/ui/overrides.scss +8 -0
  61. data/app/assets/stylesheets/pageflow/ui/properties.scss +34 -0
  62. data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -3
  63. data/app/assets/stylesheets/pageflow/ui.scss +4 -1
  64. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  65. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  66. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  67. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  68. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  69. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  70. data/app/controllers/pageflow/application_controller.rb +19 -19
  71. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  72. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  73. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  74. data/app/controllers/pageflow/editor/entries_controller.rb +3 -1
  75. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  76. data/app/controllers/pageflow/editor/file_folders_controller.rb +80 -0
  77. data/app/controllers/pageflow/editor/file_import_controller.rb +4 -3
  78. data/app/controllers/pageflow/editor/files_controller.rb +20 -10
  79. data/app/controllers/pageflow/editor/oembeds_controller.rb +21 -0
  80. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  81. data/app/controllers/pageflow/entries_controller.rb +85 -21
  82. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  83. data/app/controllers/pageflow/files_controller.rb +1 -0
  84. data/app/controllers/pageflow/pages_controller.rb +4 -2
  85. data/app/controllers/pageflow/review/comment_thread_reads_controller.rb +30 -0
  86. data/app/controllers/pageflow/review/comment_threads_controller.rb +60 -0
  87. data/app/controllers/pageflow/review/comments_controller.rb +53 -0
  88. data/app/controllers/pageflow/revisions_controller.rb +5 -1
  89. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  90. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  91. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  92. data/app/helpers/pageflow/admin/entries_helper.rb +41 -1
  93. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  94. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  95. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  96. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  97. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  98. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  99. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  100. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  101. data/app/helpers/pageflow/admin/widgets_helper.rb +5 -5
  102. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  103. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  104. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  105. data/app/helpers/pageflow/common_entry_seed_helper.rb +7 -7
  106. data/app/helpers/pageflow/editor/config_helper.rb +3 -1
  107. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  108. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  109. data/app/helpers/pageflow/entries_helper.rb +52 -46
  110. data/app/helpers/pageflow/entry_json_seed_helper.rb +7 -6
  111. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  112. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  113. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  114. data/app/helpers/pageflow/files_helper.rb +5 -4
  115. data/app/helpers/pageflow/folders_helper.rb +8 -5
  116. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  117. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  118. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  119. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  120. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  121. data/app/helpers/pageflow/overview_helper.rb +1 -1
  122. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  123. data/app/helpers/pageflow/pages_helper.rb +29 -15
  124. data/app/helpers/pageflow/public_i18n_helper.rb +10 -9
  125. data/app/helpers/pageflow/quota_helper.rb +4 -4
  126. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  127. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  128. data/app/helpers/pageflow/sites_helper.rb +3 -3
  129. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  130. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  131. data/app/helpers/pageflow/structured_data_helper.rb +5 -2
  132. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  133. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  134. data/app/helpers/pageflow/themes_helper.rb +2 -4
  135. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  136. data/app/helpers/pageflow/widgets_helper.rb +8 -6
  137. data/app/inputs/pageflow_permalink_input.rb +8 -3
  138. data/app/jobs/pageflow/application_job.rb +1 -0
  139. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  140. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  141. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  142. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  143. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  144. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  145. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  146. data/app/mailers/pageflow/user_mailer.rb +1 -0
  147. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +20 -1
  148. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  149. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  150. data/app/models/concerns/pageflow/output_source.rb +3 -3
  151. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  152. data/app/models/concerns/pageflow/reusable_file.rb +24 -24
  153. data/app/models/concerns/pageflow/serialization_blacklist.rb +3 -5
  154. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  155. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  156. data/app/models/concerns/pageflow/translatable.rb +62 -0
  157. data/app/models/concerns/pageflow/translated_attributes.rb +101 -0
  158. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  159. data/app/models/pageflow/account.rb +6 -5
  160. data/app/models/pageflow/account_member_query.rb +1 -1
  161. data/app/models/pageflow/account_role_query.rb +1 -1
  162. data/app/models/pageflow/application_query.rb +1 -1
  163. data/app/models/pageflow/application_record.rb +1 -1
  164. data/app/models/pageflow/audio_file.rb +4 -4
  165. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  166. data/app/models/pageflow/authentication_token.rb +2 -2
  167. data/app/models/pageflow/chapter.rb +6 -1
  168. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  169. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  170. data/app/models/pageflow/comment.rb +30 -0
  171. data/app/models/pageflow/comment_thread.rb +65 -0
  172. data/app/models/pageflow/comment_thread_read.rb +22 -0
  173. data/app/models/pageflow/customized_theme.rb +9 -8
  174. data/app/models/pageflow/draft_entry.rb +49 -9
  175. data/app/models/pageflow/edit_lock.rb +19 -21
  176. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  177. data/app/models/pageflow/entries_feed.rb +2 -2
  178. data/app/models/pageflow/entry.rb +46 -30
  179. data/app/models/pageflow/entry_at_revision.rb +14 -2
  180. data/app/models/pageflow/entry_comment_summary.rb +114 -0
  181. data/app/models/pageflow/entry_duplicate.rb +8 -5
  182. data/app/models/pageflow/entry_publication.rb +2 -2
  183. data/app/models/pageflow/entry_role_query.rb +4 -4
  184. data/app/models/pageflow/entry_template.rb +4 -4
  185. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  186. data/app/models/pageflow/entry_translation_group.rb +42 -0
  187. data/app/models/pageflow/file_folder.rb +74 -0
  188. data/app/models/pageflow/file_reuse.rb +5 -4
  189. data/app/models/pageflow/file_usage.rb +18 -3
  190. data/app/models/pageflow/folder.rb +2 -2
  191. data/app/models/pageflow/home_button.rb +7 -7
  192. data/app/models/pageflow/image_file.rb +44 -25
  193. data/app/models/pageflow/image_file_url_templates.rb +4 -4
  194. data/app/models/pageflow/invitation_form.rb +2 -1
  195. data/app/models/pageflow/legal_info.rb +38 -0
  196. data/app/models/pageflow/managed_user_query.rb +1 -1
  197. data/app/models/pageflow/membership.rb +5 -5
  198. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  199. data/app/models/pageflow/null_user.rb +1 -1
  200. data/app/models/pageflow/overview_button.rb +1 -1
  201. data/app/models/pageflow/page.rb +7 -3
  202. data/app/models/pageflow/permalink.rb +24 -2
  203. data/app/models/pageflow/permalink_directory.rb +7 -0
  204. data/app/models/pageflow/permalink_redirect.rb +7 -0
  205. data/app/models/pageflow/positioned_file.rb +5 -5
  206. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  207. data/app/models/pageflow/potential_memberships.rb +5 -4
  208. data/app/models/pageflow/published_entry.rb +62 -11
  209. data/app/models/pageflow/revision.rb +29 -16
  210. data/app/models/pageflow/roles.rb +14 -18
  211. data/app/models/pageflow/site.rb +46 -3
  212. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  213. data/app/models/pageflow/sitemaps.rb +10 -1
  214. data/app/models/pageflow/storyline.rb +5 -2
  215. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  216. data/app/models/pageflow/text_track_file.rb +1 -1
  217. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  218. data/app/models/pageflow/theme_customization_file.rb +3 -2
  219. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  220. data/app/models/pageflow/url_template.rb +1 -1
  221. data/app/models/pageflow/used_file.rb +13 -3
  222. data/app/models/pageflow/user_name_query.rb +2 -2
  223. data/app/models/pageflow/video_file.rb +22 -15
  224. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  225. data/app/models/pageflow/widget.rb +5 -4
  226. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  227. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  228. data/app/policies/pageflow/account_policy.rb +3 -1
  229. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  230. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  231. data/app/policies/pageflow/application_policy.rb +2 -0
  232. data/app/policies/pageflow/entry_policy.rb +7 -1
  233. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  234. data/app/policies/pageflow/file_policy.rb +4 -7
  235. data/app/policies/pageflow/folder_policy.rb +18 -8
  236. data/app/policies/pageflow/membership_policy.rb +6 -4
  237. data/app/policies/pageflow/site_policy.rb +10 -3
  238. data/app/policies/pageflow/user_policy.rb +6 -4
  239. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  240. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  241. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  242. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  243. data/app/views/admin/entries/_form.html.erb +2 -1
  244. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  245. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  246. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  247. data/app/views/admin/sites/_fields.html.erb +14 -1
  248. data/app/views/admin/translations/_form.html.erb +31 -0
  249. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  250. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  251. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  252. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  253. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  254. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  255. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  256. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  257. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  258. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  259. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  260. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  261. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  262. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  263. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  264. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  265. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  266. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  267. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  268. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  269. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  270. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  271. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  272. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  273. data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +0 -1
  274. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +5 -3
  275. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  276. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  277. data/app/views/pageflow/editor/entries/seed.json.erb +1 -0
  278. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  279. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  280. data/app/views/pageflow/editor/file_folders/_file_folder.json.jbuilder +5 -0
  281. data/app/views/pageflow/editor/file_folders/create.json.jbuilder +1 -0
  282. data/app/views/pageflow/editor/file_folders/index.json.jbuilder +3 -0
  283. data/app/views/pageflow/editor/files/_file.json.jbuilder +7 -14
  284. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  285. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  286. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +3 -0
  287. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  288. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +4 -3
  289. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  290. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  291. data/app/views/pageflow/files/_file.json.jbuilder +5 -3
  292. data/app/views/pageflow/image_files/_image_file.json.jbuilder +0 -1
  293. data/app/views/pageflow/review/comment_threads/_comment_thread.json.jbuilder +20 -0
  294. data/app/views/pageflow/review/comment_threads/create.json.jbuilder +2 -0
  295. data/app/views/pageflow/review/comment_threads/index.json.jbuilder +13 -0
  296. data/app/views/pageflow/review/comments/_comment.json.jbuilder +13 -0
  297. data/app/views/pageflow/review/comments/create.json.jbuilder +1 -0
  298. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  299. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  300. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  301. data/app/views/pageflow/structured_data/_entry.json.jbuilder +2 -3
  302. data/app/views/pageflow/video_files/_video_file.json.jbuilder +0 -1
  303. data/config/initializers/active_admin_patches.rb +3 -6
  304. data/config/initializers/admin_resource_tabs.rb +3 -0
  305. data/config/initializers/paperclip.rb +1 -0
  306. data/config/initializers/symmetric_encryption.rb +1 -1
  307. data/config/initializers/zencoder.rb +24 -13
  308. data/config/locales/de.yml +256 -12
  309. data/config/locales/en.yml +253 -15
  310. data/config/routes.rb +29 -13
  311. data/config/spring.rb +2 -1
  312. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  313. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  314. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  315. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  316. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  317. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  318. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  319. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  320. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  321. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  322. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  323. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  324. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  325. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  326. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  327. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  328. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  329. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  330. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  331. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  332. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  333. data/db/migrate/20251015000000_add_structured_data_type_name_to_revisions.rb +5 -0
  334. data/db/migrate/20251029142849_convert_legacy_social_embeds_to_unified_social_embed.rb +38 -0
  335. data/db/migrate/20251119083347_fix_main_storyline_positions.rb +16 -0
  336. data/db/migrate/20251119083348_ensure_scrolled_entries_have_excursion_storyline.rb +15 -0
  337. data/db/migrate/20260303000000_add_layout_version_to_revisions.rb +6 -0
  338. data/db/migrate/20260323000000_create_comment_threads_and_comments.rb +30 -0
  339. data/db/migrate/20260414000000_add_subject_range_to_comment_threads.rb +5 -0
  340. data/db/migrate/20260415000000_add_section_perma_id_to_comment_threads.rb +5 -0
  341. data/db/migrate/20260727000000_add_quote_to_comments.rb +5 -0
  342. data/db/migrate/20260728000000_create_file_folders.rb +17 -0
  343. data/db/migrate/20260805000000_add_attribute_translations_to_sites.rb +5 -0
  344. data/db/migrate/20260806000000_add_edited_at_to_comments.rb +5 -0
  345. data/db/migrate/20260810000000_create_pageflow_scrolled_lottie_files.rb +24 -0
  346. data/db/migrate/20260817000000_create_comment_thread_reads.rb +16 -0
  347. data/db/migrate/20260819000000_add_unread_comments_since_at_to_users.rb +18 -0
  348. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +12599 -5398
  349. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +1275 -4560
  350. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +20204 -22
  351. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +18657 -19
  352. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  353. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  354. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  355. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  356. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  357. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  358. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  359. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  360. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  361. data/entry_types/scrolled/app/assets/stylesheets/pageflow_scrolled/ui.scss +2 -0
  362. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  363. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +35 -5
  364. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +4 -5
  365. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +23 -2
  366. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +3 -3
  367. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +8 -5
  368. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +7 -3
  369. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +72 -10
  370. data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +28 -13
  371. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +41 -12
  372. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +23 -25
  373. data/entry_types/scrolled/app/helpers/pageflow_scrolled/sprockets_helper.rb +16 -0
  374. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +189 -3
  375. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  376. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +61 -7
  377. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file.rb +6 -0
  378. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file_url_templates.rb +16 -0
  379. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  380. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +20 -1
  381. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  382. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  383. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +15 -12
  384. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +45 -17
  385. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  386. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +34 -5
  387. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +1 -1
  388. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  389. data/entry_types/scrolled/config/configuration_schemas/pageflow-scrolled.json +414 -0
  390. data/entry_types/scrolled/config/locales/de.yml +1094 -78
  391. data/entry_types/scrolled/config/locales/en.yml +1083 -78
  392. data/entry_types/scrolled/config/routes.rb +18 -8
  393. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  394. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  395. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  396. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  397. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  398. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +2 -2
  399. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  400. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +67 -10
  401. data/entry_types/scrolled/lib/pageflow_scrolled/configuration_schemas.rb +91 -0
  402. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  403. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +2 -1
  404. data/entry_types/scrolled/lib/pageflow_scrolled/entry_file_reference_locations.rb +71 -0
  405. data/entry_types/scrolled/lib/pageflow_scrolled/entry_structured_data_types/faq_page.rb +58 -0
  406. data/entry_types/scrolled/lib/pageflow_scrolled/file_reference_locations.rb +69 -0
  407. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +222 -19
  408. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +2 -4
  409. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +76 -54
  410. data/entry_types/scrolled/lib/pageflow_scrolled/theme_options_default_scale.rb +35 -0
  411. data/entry_types/scrolled/lib/pageflow_scrolled.rb +14 -1
  412. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +24 -5
  413. data/entry_types/scrolled/package/config/configurationSchemas.js +70 -0
  414. data/entry_types/scrolled/package/config/rollup/configurationSchemas.js +19 -0
  415. data/entry_types/scrolled/package/config/webpack.js +94 -0
  416. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  417. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1795 -0
  418. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.css +1 -0
  419. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.js +219 -0
  420. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.css +1 -0
  421. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.js +244 -0
  422. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.css +1 -0
  423. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.js +823 -0
  424. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  425. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +109 -0
  426. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.css +1 -0
  427. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.js +277 -0
  428. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.css +1 -0
  429. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.js +244 -0
  430. data/entry_types/scrolled/package/contentElements-editor.js +3155 -583
  431. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  432. data/entry_types/scrolled/package/contentElements-frontend.js +3375 -1585
  433. data/entry_types/scrolled/package/editor.css +1 -0
  434. data/entry_types/scrolled/package/editor.js +8452 -2867
  435. data/entry_types/scrolled/package/entryState.js +1600 -0
  436. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-20c600de.js +1979 -0
  437. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-58189220.js +2538 -0
  438. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-035a99fa.js} +9 -15
  439. data/entry_types/scrolled/package/frontend/PhonePlatformContext-9da43797.js +33 -0
  440. data/entry_types/scrolled/package/frontend/Placeholder.module-bf0966b4.js +5267 -0
  441. data/entry_types/scrolled/package/frontend/Placeholder.module-d22a9335.js +4180 -0
  442. data/entry_types/scrolled/package/frontend/ThemeIcon-ab834849.js +754 -0
  443. data/entry_types/scrolled/package/frontend/ThemeIcon-f6cb3a8f.js +773 -0
  444. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-30fd1124.js +39 -0
  445. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-61c25224.js +72 -0
  446. data/entry_types/scrolled/package/frontend/Viewer-1074fd59.js +147 -0
  447. data/entry_types/scrolled/package/frontend/Viewer-1482ca34.js +480 -0
  448. data/entry_types/scrolled/package/frontend/Viewer-70504231.js +210 -0
  449. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-cc8d4072.js} +100 -135
  450. data/entry_types/scrolled/package/frontend/Wavesurfer-656e3c36.js +302 -0
  451. data/entry_types/scrolled/package/frontend/Wavesurfer-b753b838.js +385 -0
  452. data/entry_types/scrolled/package/frontend/commenting.css +1 -0
  453. data/entry_types/scrolled/package/frontend/extensions-167ae143.js +1455 -0
  454. data/entry_types/scrolled/package/frontend/extensions-2318f92b.js +5918 -0
  455. data/entry_types/scrolled/package/frontend/extensions-a461fd13.js +4890 -0
  456. data/entry_types/scrolled/package/frontend/extensions-c98269fd.js +1982 -0
  457. data/entry_types/scrolled/package/frontend/i18n-493cd2a6.js +93 -0
  458. data/entry_types/scrolled/package/frontend/i18n-e06cac14.js +100 -0
  459. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-2e5546f7.js} +39 -54
  460. data/entry_types/scrolled/package/frontend/index-de2b418d.js +130 -0
  461. data/entry_types/scrolled/package/frontend/index.css +1 -1
  462. data/entry_types/scrolled/package/frontend/index.js +1976 -1367
  463. data/entry_types/scrolled/package/frontend/inlineEditing.css +1 -0
  464. data/entry_types/scrolled/package/frontend/useContentElementEditorState-a084912e.js +25 -0
  465. data/entry_types/scrolled/package/frontend/useDelayedBoolean-a387d85b.js +24 -0
  466. data/entry_types/scrolled/package/frontend/usePhonePlatform-4ecb96d4.js +8 -0
  467. data/entry_types/scrolled/package/frontend/usePhonePlatform-ce9ff08d.js +8 -0
  468. data/entry_types/scrolled/package/frontend-server.js +20 -210
  469. data/entry_types/scrolled/package/package.json +22 -12
  470. data/entry_types/scrolled/package/review.css +1 -0
  471. data/entry_types/scrolled/package/review.js +3306 -0
  472. data/entry_types/scrolled/package/testHelpers.js +952 -239
  473. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  474. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  475. data/entry_types/scrolled/package/widgets/consentBar.js +275 -315
  476. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  477. data/entry_types/scrolled/package/widgets/defaultNavigation.js +961 -432
  478. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  479. data/entry_types/scrolled/package/widgets/excursionSheet.js +225 -0
  480. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  481. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +62 -32
  482. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  483. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +67 -0
  484. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  485. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +100 -0
  486. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  487. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +48 -26
  488. data/entry_types/scrolled/package/widgets-server.js +2 -0
  489. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  490. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  491. data/entry_types/scrolled/spec/factories/lottie_files.rb +29 -0
  492. data/entry_types/scrolled/spec/fixtures/animation.lottie +0 -0
  493. data/entry_types/scrolled/spec/fixtures/font.woff +0 -0
  494. data/entry_types/scrolled/spec/fixtures/font.woff2 +0 -0
  495. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  496. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  497. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  498. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  499. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  500. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  501. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  502. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  503. data/lib/generators/pageflow/resque/resque_generator.rb +4 -4
  504. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  505. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  506. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  507. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  508. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  509. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  510. data/lib/pageflow/ability_mixin.rb +25 -15
  511. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  512. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  513. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  514. data/lib/pageflow/additional_headers.rb +27 -0
  515. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  516. data/lib/pageflow/admin/tabs.rb +1 -1
  517. data/lib/pageflow/built_in_file_type.rb +1 -1
  518. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  519. data/lib/pageflow/built_in_widget_type.rb +2 -2
  520. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  521. data/lib/pageflow/configuration.rb +183 -18
  522. data/lib/pageflow/cutoff_modes.rb +39 -0
  523. data/lib/pageflow/deprecation.rb +19 -0
  524. data/lib/pageflow/editor_controller.rb +6 -10
  525. data/lib/pageflow/engine.rb +5 -6
  526. data/lib/pageflow/entries_controller_env_helper.rb +32 -2
  527. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  528. data/lib/pageflow/entry_export_import/entry_serialization.rb +9 -8
  529. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  530. data/lib/pageflow/entry_export_import/page_type_versions.rb +2 -2
  531. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +11 -1
  532. data/lib/pageflow/entry_export_import/revision_serialization.rb +3 -0
  533. data/lib/pageflow/entry_export_import.rb +3 -3
  534. data/lib/pageflow/entry_structured_data_types.rb +43 -0
  535. data/lib/pageflow/entry_type_configuration.rb +1 -0
  536. data/lib/pageflow/entry_types.rb +2 -2
  537. data/lib/pageflow/feature.rb +1 -1
  538. data/lib/pageflow/features.rb +4 -6
  539. data/lib/pageflow/file_importers.rb +4 -4
  540. data/lib/pageflow/file_type.rb +5 -5
  541. data/lib/pageflow/file_types.rb +4 -4
  542. data/lib/pageflow/global_config_api.rb +5 -6
  543. data/lib/pageflow/help_entries.rb +7 -7
  544. data/lib/pageflow/help_entry.rb +1 -1
  545. data/lib/pageflow/hooks.rb +1 -1
  546. data/lib/pageflow/nested_revision_component.rb +9 -27
  547. data/lib/pageflow/news_item_api.rb +1 -1
  548. data/lib/pageflow/oembed_providers.rb +42 -0
  549. data/lib/pageflow/page_type.rb +2 -3
  550. data/lib/pageflow/page_types.rb +3 -3
  551. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  552. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  553. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  554. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  555. data/lib/pageflow/plugin.rb +1 -2
  556. data/lib/pageflow/primary_domain_entry_redirect.rb +6 -0
  557. data/lib/pageflow/quota.rb +9 -5
  558. data/lib/pageflow/quotas.rb +1 -1
  559. data/lib/pageflow/rails_version.rb +14 -2
  560. data/lib/pageflow/react.rb +1 -1
  561. data/lib/pageflow/revision_component.rb +8 -40
  562. data/lib/pageflow/revision_components.rb +16 -6
  563. data/lib/pageflow/seeds.rb +12 -16
  564. data/lib/pageflow/theme.rb +1 -1
  565. data/lib/pageflow/theme_customizations.rb +10 -10
  566. data/lib/pageflow/themes.rb +44 -3
  567. data/lib/pageflow/user_mixin.rb +18 -6
  568. data/lib/pageflow/version.rb +1 -1
  569. data/lib/pageflow/widget_type.rb +4 -4
  570. data/lib/pageflow/widget_types.rb +9 -9
  571. data/lib/pageflow/zencoder_api.rb +32 -42
  572. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  573. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  574. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  575. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  576. data/lib/pageflow.rb +8 -2
  577. data/lib/tasks/pageflow_tasks.rake +1 -1
  578. data/package/config/eslint-rules/documented-in-toc.js +125 -0
  579. data/package/config/jest/index.js +0 -1
  580. data/package/config/webpack.js +0 -1
  581. data/package/config/webpack5.js +0 -1
  582. data/package/editor.js +4880 -2313
  583. data/package/frontend.js +710 -1223
  584. data/package/package.json +3 -1
  585. data/package/review.js +384 -0
  586. data/package/testHelpers.js +257 -243
  587. data/package/ui.js +1487 -813
  588. data/package/vendor/stubs/wysihtml5.js +2 -0
  589. data/spec/factories/accounts.rb +37 -22
  590. data/spec/factories/audio_files.rb +2 -2
  591. data/spec/factories/authentication_tokens.rb +4 -4
  592. data/spec/factories/chapters.rb +4 -4
  593. data/spec/factories/comment_thread_reads.rb +10 -0
  594. data/spec/factories/comment_threads.rb +10 -0
  595. data/spec/factories/comments.rb +9 -0
  596. data/spec/factories/draft_entries.rb +14 -6
  597. data/spec/factories/edit_locks.rb +1 -1
  598. data/spec/factories/entries.rb +28 -19
  599. data/spec/factories/entry_translation_groups.rb +6 -0
  600. data/spec/factories/file_folders.rb +8 -0
  601. data/spec/factories/file_usages.rb +2 -1
  602. data/spec/factories/folders.rb +1 -1
  603. data/spec/factories/image_files.rb +2 -2
  604. data/spec/factories/pages.rb +3 -3
  605. data/spec/factories/published_entries.rb +28 -8
  606. data/spec/factories/revisions.rb +1 -1
  607. data/spec/factories/sites.rb +6 -0
  608. data/spec/factories/test_multi_attachment_files.rb +1 -1
  609. data/spec/factories/text_track_files.rb +1 -1
  610. data/spec/factories/uploadable_files.rb +1 -1
  611. data/spec/factories/users.rb +6 -6
  612. data/spec/factories/video_files.rb +2 -2
  613. data/spec/factories/widgets.rb +1 -1
  614. data/spec/fixtures/7x15_rotated.jpg +0 -0
  615. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  616. metadata +266 -92
  617. data/app/assets/stylesheets/pageflow/editor/select_button.scss +0 -51
  618. data/config/initializers/revision_components.rb +0 -5
  619. data/config/locales/twitter_to_x.de.yml +0 -6
  620. data/config/locales/twitter_to_x.en.yml +0 -6
  621. data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +0 -55
  622. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  623. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  624. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  625. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  626. data/entry_types/scrolled/package/frontend/EditableInlineText.module-ebd22921.js +0 -5497
  627. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  628. data/entry_types/scrolled/package/frontend/Viewer-1ecf3375.js +0 -154
  629. data/entry_types/scrolled/package/frontend/Wavesurfer-7d9cf1b7.js +0 -333
  630. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  631. data/entry_types/scrolled/package/frontend/components-024a9893.js +0 -2853
  632. data/entry_types/scrolled/package/frontend/createSuper-d0f30da3.js +0 -115
  633. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
  634. data/entry_types/scrolled/package/frontend/useContentElementEditorState-4f4c3cf6.js +0 -52
  635. data/lib/generators/pageflow/resque/templates/resque_enqueue_after_commit_patch.rb +0 -25
  636. data/package/vendor/jquery.minicolors.js +0 -1108
@@ -17,7 +17,7 @@ module Pageflow
17
17
  # last_name: 'Doe')
18
18
  # end
19
19
  module Seeds
20
- DEFAULT_USER_PASSWORD = '!Pass123'
20
+ DEFAULT_USER_PASSWORD = '!Pass123'.freeze
21
21
 
22
22
  # Create an {Account} with a default {Site} if no account by
23
23
  # that name exists.
@@ -26,7 +26,7 @@ module Pageflow
26
26
  # @option attributes [String] :name required
27
27
  # @yield [account] a block to be called before the account is saved
28
28
  # @return [Account] newly created account
29
- def account(attributes, &block)
29
+ def account(attributes)
30
30
  Account.find_or_create_by!(attributes.slice(:name)) do |account|
31
31
  account.attributes = attributes.reverse_merge(name: 'Pageflow')
32
32
 
@@ -52,7 +52,7 @@ module Pageflow
52
52
  # @param [Hash] attributes further attributes to override defaults
53
53
  # @yield [site] a block which is passed the newly built site
54
54
  # @return [Site] newly built site
55
- def build_default_site_for(account, attributes = {}, &block)
55
+ def build_default_site_for(account, attributes = {}, &)
56
56
  default_attributes = {
57
57
  imprint_link_label: 'Impressum',
58
58
  imprint_link_url: 'http://example.com/impressum.html',
@@ -60,7 +60,7 @@ module Pageflow
60
60
  copyright_link_url: 'http://www.example.com/copyright.html'
61
61
  }
62
62
 
63
- account.build_default_site(default_attributes.merge(attributes), &block)
63
+ account.build_default_site(default_attributes.merge(attributes), &)
64
64
  end
65
65
 
66
66
  # Create a {User} if none with the given email exists yet.
@@ -69,7 +69,7 @@ module Pageflow
69
69
  # @option attributes [String] :email required
70
70
  # @yield [user] a block to be called before the user is saved
71
71
  # @return [User] newly created user
72
- def user(attributes, &block)
72
+ def user(attributes)
73
73
  default_attributes = {
74
74
  password: default_user_password,
75
75
  first_name: 'Elliot',
@@ -146,9 +146,7 @@ module Pageflow
146
146
  (attributes[:account].present? && attributes[:entity].present?)
147
147
  say_attribute_precedence(':entity', ':entry and :account')
148
148
  end
149
- unless attributes[:entity].present?
150
- entry_or_account_attributes_specified attributes
151
- end
149
+ entry_or_account_attributes_specified attributes unless attributes[:entity].present?
152
150
 
153
151
  if attributes[:entity].is_a?(Entry) || attributes[:entry].present?
154
152
  entry = attributes[:entity] || attributes[:entry]
@@ -173,14 +171,14 @@ module Pageflow
173
171
  end
174
172
 
175
173
  def say_creating_user(user)
176
- say(<<-END)
174
+ say(<<-TEXT)
177
175
 
178
176
  user with login:
179
177
 
180
178
  email: #{user.email}
181
179
  password: #{user.password}
182
180
 
183
- END
181
+ TEXT
184
182
  end
185
183
 
186
184
  def say_creating_entry(entry)
@@ -188,13 +186,13 @@ END
188
186
  end
189
187
 
190
188
  def say_creating_membership(membership)
191
- say(" -- '#{membership.role}' membership for user '#{membership.user.email}' on " +
189
+ say(" -- '#{membership.role}' membership for user '#{membership.user.email}' on " \
192
190
  "#{membership.entity_type == 'Pageflow::Entry' ? 'entry' : 'account'} " +
193
- %|'#{if membership.entity_type == "Pageflow::Entry"
191
+ %('#{if membership.entity_type == 'Pageflow::Entry'
194
192
  membership.entity.title
195
193
  else
196
194
  membership.entity.name
197
- end}'\n|)
195
+ end}'\n))
198
196
  end
199
197
 
200
198
  def say_attribute_precedence(subject, object)
@@ -208,9 +206,7 @@ END
208
206
  def entry_or_account_attributes_specified(attributes)
209
207
  if attributes[:entry].present? || attributes[:account].present?
210
208
  attributes[:entity] = attributes[:entry]
211
- if attributes[:account].present?
212
- say_attribute_precedence(':entry', ':account')
213
- end
209
+ say_attribute_precedence(':entry', ':account') if attributes[:account].present?
214
210
  else
215
211
  attributes[:entity] = attributes[:account]
216
212
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class Theme
2
+ class Theme # rubocop:todo Style/Documentation
3
3
  attr_reader :name, :directory_name, :options
4
4
 
5
5
  def initialize(name, options = {})
@@ -8,8 +8,8 @@ module Pageflow
8
8
  # a specific site.
9
9
  def update(site:, entry_type_name:, overrides: {}, file_ids: {})
10
10
  ThemeCustomization
11
- .find_or_initialize_by(site: site, entry_type_name: entry_type_name)
12
- .update!(overrides: overrides, selected_file_ids: file_ids)
11
+ .find_or_initialize_by(site:, entry_type_name:)
12
+ .update!(overrides:, selected_file_ids: file_ids)
13
13
  end
14
14
 
15
15
  # Construct an entry that uses the given overrides and files in
@@ -19,15 +19,15 @@ module Pageflow
19
19
  def preview(site:, entry:, overrides: {}, file_ids: {})
20
20
  theme_customization =
21
21
  ThemeCustomization
22
- .find_or_initialize_by(site: site, entry_type_name: entry.type_name)
22
+ .find_or_initialize_by(site:, entry_type_name: entry.type_name)
23
23
 
24
- theme_customization.assign_attributes(overrides: overrides, selected_file_ids: file_ids)
24
+ theme_customization.assign_attributes(overrides:, selected_file_ids: file_ids)
25
25
 
26
- theme = CustomizedTheme.build(entry: entry,
26
+ theme = CustomizedTheme.build(entry: PublishedEntry.new(entry, entry.draft),
27
27
  theme: entry.draft.theme,
28
- theme_customization: theme_customization)
28
+ theme_customization:)
29
29
 
30
- PublishedEntry.new(entry, entry.draft, theme: theme)
30
+ PublishedEntry.new(entry, entry.draft, theme:)
31
31
  end
32
32
 
33
33
  # Get customization for entry type and site.
@@ -35,7 +35,7 @@ module Pageflow
35
35
  # @return [ThemeCustomization]
36
36
  def get(site:, entry_type_name:)
37
37
  ThemeCustomization
38
- .find_or_initialize_by(site: site, entry_type_name: entry_type_name)
38
+ .find_or_initialize_by(site:, entry_type_name:)
39
39
  end
40
40
 
41
41
  # Upload a file that shall be used to customize a theme. Uploading
@@ -46,9 +46,9 @@ module Pageflow
46
46
  def upload_file(site:, entry_type_name:, type_name:, attachment:)
47
47
  theme_customization_file =
48
48
  ThemeCustomization
49
- .find_or_create_by(site: site, entry_type_name: entry_type_name)
49
+ .find_or_create_by(site:, entry_type_name:)
50
50
  .uploaded_files
51
- .build(type_name: type_name)
51
+ .build(type_name:)
52
52
 
53
53
  # Assign attachment in separate step to make sure theme
54
54
  # customization association (which is used to look up Paperclip
@@ -1,9 +1,50 @@
1
1
  module Pageflow
2
- class Themes
2
+ class Themes # rubocop:todo Style/Documentation
3
3
  include Enumerable
4
4
 
5
5
  def initialize
6
6
  @themes = HashWithIndifferentAccess.new
7
+ @default_options = {}
8
+ @options_transforms = []
9
+ end
10
+
11
+ # Register default options that apply to all themes. Can be called
12
+ # multiple times to accumulate defaults from different sources
13
+ # (gem, plugins, host app). Later calls override earlier ones for
14
+ # the same keys. Theme options always take precedence over defaults.
15
+ #
16
+ # @param options [Hash]
17
+ # Default options to deep merge into accumulated defaults.
18
+ #
19
+ # @since 17.2
20
+ def register_default_options(options)
21
+ @default_options = @default_options.deep_merge(options)
22
+ end
23
+
24
+ # Register a transform that can conditionally modify theme options.
25
+ # Transforms run after defaults are merged with theme options, so
26
+ # they can inspect what the theme defines and add conditional defaults.
27
+ #
28
+ # @param callable [#call]
29
+ # Receives merged options hash, returns transformed options.
30
+ # Use for conditional defaults based on what theme defines.
31
+ #
32
+ # @since 17.2
33
+ def register_options_transform(callable)
34
+ @options_transforms << callable
35
+ end
36
+
37
+ # Apply all registered defaults to theme options.
38
+ #
39
+ # @api private
40
+ def apply_default_options(options, entry:)
41
+ # First merge hash defaults under theme options (theme wins)
42
+ result = @default_options.deep_merge(options)
43
+
44
+ # Then apply callable transforms (they can see theme options)
45
+ @options_transforms.reduce(result) do |opts, transform|
46
+ transform.call(opts, entry:)
47
+ end
7
48
  end
8
49
 
9
50
  # Register a theme and supply theme options.
@@ -52,8 +93,8 @@ module Pageflow
52
93
  map(&:name)
53
94
  end
54
95
 
55
- def each(&block)
56
- @themes.values.each(&block)
96
+ def each(&)
97
+ @themes.values.each(&)
57
98
  end
58
99
  end
59
100
  end
@@ -23,10 +23,22 @@ module Pageflow
23
23
 
24
24
  has_many :revisions, class_name: 'Pageflow::Revision', foreign_key: :creator_id
25
25
 
26
+ has_many :comment_thread_reads,
27
+ dependent: :destroy,
28
+ class_name: 'Pageflow::CommentThreadRead'
29
+
26
30
  validates :first_name, :last_name, presence: true
27
31
  validates_inclusion_of :locale, in: Pageflow.config.available_locales.map(&:to_s)
28
32
 
29
33
  scope :admins, -> { where(admin: true) }
34
+
35
+ before_create :ensure_unread_comments_since_at
36
+ end
37
+
38
+ # Comments predating a user are not new to them. Without a baseline,
39
+ # joining would mean facing every comment ever written as unread.
40
+ def ensure_unread_comments_since_at
41
+ self.unread_comments_since_at ||= Time.current
30
42
  end
31
43
 
32
44
  def admin?
@@ -34,11 +46,11 @@ module Pageflow
34
46
  end
35
47
 
36
48
  def full_name
37
- [first_name, last_name] * ' '
49
+ [first_name, last_name].join(' ')
38
50
  end
39
51
 
40
52
  def formal_name
41
- [last_name, first_name] * ', '
53
+ [last_name, first_name].join(', ')
42
54
  end
43
55
 
44
56
  def locale
@@ -47,7 +59,7 @@ module Pageflow
47
59
 
48
60
  def update_with_password(attributes)
49
61
  if needs_password?(attributes)
50
- super(attributes)
62
+ super
51
63
  else
52
64
  # remove the virtual current_password attribute update_without_password
53
65
  # doesn't know how to ignore it
@@ -66,11 +78,11 @@ module Pageflow
66
78
  end
67
79
 
68
80
  # Configure devise to send emails using ActiveJob.
69
- def send_devise_notification(notification, *args)
70
- devise_mailer.send(notification, self, *args).deliver_later
81
+ def send_devise_notification(notification, *)
82
+ devise_mailer.send(notification, self, *).deliver_later
71
83
  end
72
84
 
73
- module ClassMethods
85
+ module ClassMethods # rubocop:todo Style/Documentation
74
86
  def ransackable_attributes(_auth_object = nil)
75
87
  %w[first_name last_name email]
76
88
  end
@@ -1,3 +1,3 @@
1
1
  module Pageflow
2
- VERSION = '17.0.5'.freeze
2
+ VERSION = '17.2.0'.freeze
3
3
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class WidgetType
2
+ class WidgetType # rubocop:todo Style/Documentation
3
3
  class NotFoundError < RuntimeError
4
4
  end
5
5
 
@@ -44,7 +44,7 @@ module Pageflow
44
44
 
45
45
  # Override to return html as string.
46
46
  def render(template, entry)
47
- template.render(File.join('pageflow', name, 'widget'), entry: entry)
47
+ template.render(File.join('pageflow', name, 'widget'), entry:)
48
48
  end
49
49
 
50
50
  # Override instead of render_head_fragment to use the widget
@@ -56,11 +56,11 @@ module Pageflow
56
56
 
57
57
  # Override to return html that should be placed in the head
58
58
  # element of the page. Not supported inside the editor.
59
- def render_head_fragment(template, entry)
59
+ def render_head_fragment(_template, _entry)
60
60
  ''
61
61
  end
62
62
 
63
- class Null < WidgetType
63
+ class Null < WidgetType # rubocop:todo Style/Documentation
64
64
  def initialize(role)
65
65
  @role = role
66
66
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class WidgetTypes
2
+ class WidgetTypes # rubocop:todo Style/Documentation
3
3
  include Enumerable
4
4
 
5
5
  attr_reader :defaults_by_role
@@ -10,10 +10,10 @@ module Pageflow
10
10
 
11
11
  def register(widget_type, options = {})
12
12
  @widget_types[widget_type.name] = widget_type
13
- if options[:default]
14
- widget_type.roles.each do |role|
15
- defaults_by_role[role] = widget_type
16
- end
13
+ return unless options[:default]
14
+
15
+ widget_type.roles.each do |role|
16
+ defaults_by_role[role] = widget_type
17
17
  end
18
18
  end
19
19
 
@@ -27,8 +27,8 @@ module Pageflow
27
27
  @default_configurations = {}
28
28
  end
29
29
 
30
- def each(&block)
31
- @widget_types.values.each(&block)
30
+ def each(&)
31
+ @widget_types.values.each(&)
32
32
  end
33
33
 
34
34
  def find_by_name!(name)
@@ -37,8 +37,8 @@ module Pageflow
37
37
  end
38
38
  end
39
39
 
40
- def fetch_by_name(name, &block)
41
- @widget_types.fetch(name, &block)
40
+ def fetch_by_name(name, &)
41
+ @widget_types.fetch(name, &)
42
42
  end
43
43
 
44
44
  def type_name?(name)
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderApi
3
4
  class Error < StandardError; end
4
5
  class RecoverableError < Error; end
@@ -6,13 +7,11 @@ module Pageflow
6
7
 
7
8
  def create_job(definition)
8
9
  with_exception_translation do
9
- response = Zencoder::Job.create(:input => definition.input_s3_url,
10
- :outputs => definition.outputs)
11
- if response.success?
12
- response.body['id']
13
- else
14
- raise translate_zencoder_errors(response.errors)
15
- end
10
+ response = Zencoder::Job.create(input: definition.input_s3_url,
11
+ outputs: definition.outputs)
12
+ raise translate_zencoder_errors(response.errors) unless response.success?
13
+
14
+ response.body['id']
16
15
  end
17
16
  end
18
17
 
@@ -20,15 +19,13 @@ module Pageflow
20
19
  with_exception_translation do
21
20
  response = Zencoder::Job.progress(job_id)
22
21
 
23
- if response.success?
24
- {
25
- :state => response.body["state"],
26
- :progress => response.body["progress"],
27
- :finished => response.body["state"] == 'finished'
28
- }
29
- else
30
- raise translate_zencoder_errors(response.errors)
31
- end
22
+ raise translate_zencoder_errors(response.errors) unless response.success?
23
+
24
+ {
25
+ state: response.body['state'],
26
+ progress: response.body['progress'],
27
+ finished: response.body['state'] == 'finished'
28
+ }
32
29
  end
33
30
  end
34
31
 
@@ -37,31 +34,26 @@ module Pageflow
37
34
  get_details(job_id)
38
35
  end
39
36
 
40
- def get_details(job_id)
37
+ def get_details(job_id) # rubocop:todo Metrics/AbcSize
41
38
  with_exception_translation do
42
39
  response = Zencoder::Job.details(job_id)
43
40
 
44
- if response.success?
45
- input_details = response.body['job']['input_media_file']
46
- outputs_details = response.body['job']['output_media_files']
41
+ raise translate_zencoder_errors(response.errors) unless response.success?
47
42
 
48
- output_presences = outputs_details.inject({}) do |presences, output|
49
- if output['label'].present?
50
- presences[output['label'].to_sym] = output['state']
51
- end
52
- presences
53
- end
43
+ input_details = response.body['job']['input_media_file']
44
+ outputs_details = response.body['job']['output_media_files']
54
45
 
55
- {
56
- format: input_details['format'],
57
- duration_in_ms: input_details['duration_in_ms'],
58
- width: input_details['width'],
59
- height: input_details['height'],
60
- output_presences: output_presences
61
- }
62
- else
63
- raise translate_zencoder_errors(response.errors)
46
+ output_presences = outputs_details.each_with_object({}) do |output, presences|
47
+ presences[output['label'].to_sym] = output['state'] if output['label'].present?
64
48
  end
49
+
50
+ {
51
+ format: input_details['format'],
52
+ duration_in_ms: input_details['duration_in_ms'],
53
+ width: input_details['width'],
54
+ height: input_details['height'],
55
+ output_presences:
56
+ }
65
57
  end
66
58
  end
67
59
 
@@ -72,13 +64,11 @@ module Pageflow
72
64
  private
73
65
 
74
66
  def with_exception_translation
75
- begin
76
- yield
77
- rescue Timeout::Error
78
- raise RecoverableError, 'Zencoder timed out.'
79
- rescue Zencoder::HTTPError => e
80
- raise RecoverableError, e.message
81
- end
67
+ yield
68
+ rescue Timeout::Error
69
+ raise RecoverableError, 'Zencoder timed out.'
70
+ rescue Zencoder::HTTPError => e
71
+ raise RecoverableError, e.message
82
72
  end
83
73
 
84
74
  def translate_zencoder_errors(errors)
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderAudioOutputDefinition < ZencoderOutputDefinition
3
4
  attr_reader :audio_file
4
5
 
@@ -23,11 +24,11 @@ module Pageflow
23
24
 
24
25
  def m4a_definition
25
26
  {
26
- :label => 'm4a',
27
- :format => 'm4a',
28
- :path => audio_file.m4a.path,
29
- :public => 1,
30
- :headers => {
27
+ label: 'm4a',
28
+ format: 'm4a',
29
+ path: audio_file.m4a.path,
30
+ public: 1,
31
+ headers: {
31
32
  'Content-Type' => 'audio/mp4'
32
33
  }
33
34
  }
@@ -35,19 +36,19 @@ module Pageflow
35
36
 
36
37
  def mp3_definition
37
38
  {
38
- :label => 'mp3',
39
- :format => 'mp3',
40
- :path => audio_file.mp3.path,
41
- :public => 1
39
+ label: 'mp3',
40
+ format: 'mp3',
41
+ path: audio_file.mp3.path,
42
+ public: 1
42
43
  }
43
44
  end
44
45
 
45
46
  def ogg_definition
46
47
  {
47
- :label => 'ogg',
48
- :format => 'ogg',
49
- :path => audio_file.ogg.path,
50
- :public => 1
48
+ label: 'ogg',
49
+ format: 'ogg',
50
+ path: audio_file.ogg.path,
51
+ public: 1
51
52
  }
52
53
  end
53
54
  end
@@ -1,4 +1,5 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderMetaDataOutputDefinition < ZencoderOutputDefinition
3
4
  attr_reader :file
4
5
 
@@ -14,8 +15,8 @@ module Pageflow
14
15
  def outputs
15
16
  [
16
17
  {
17
- :label => 'stub',
18
- :clip_length => 1
18
+ label: 'stub',
19
+ clip_length: 1
19
20
  }
20
21
  ]
21
22
  end
@@ -1,6 +1,8 @@
1
1
  module Pageflow
2
+ # @api private
2
3
  class ZencoderOutputDefinition
3
- cattr_accessor :default_output_bucket_name, :default_sftp_host, :default_akamai_host, :default_akamai_credentials
4
+ cattr_accessor :default_output_bucket_name, :default_sftp_host, :default_akamai_host,
5
+ :default_akamai_credentials
4
6
 
5
7
  attr_accessor :options
6
8
 
@@ -9,11 +11,11 @@ module Pageflow
9
11
  end
10
12
 
11
13
  def input_s3_url
12
- raise "Not implemented"
14
+ raise 'Not implemented'
13
15
  end
14
16
 
15
17
  def outputs
16
- raise "Not implemented"
18
+ raise 'Not implemented'
17
19
  end
18
20
 
19
21
  def ==(other)
@@ -21,9 +23,9 @@ module Pageflow
21
23
  other.input_s3_url == input_s3_url &&
22
24
  other.outputs == outputs
23
25
  end
24
- alias_method :eql?, :==
26
+ alias eql? ==
25
27
 
26
- protected
28
+ protected
27
29
 
28
30
  def transferable(definition)
29
31
  if akamai_configured?
@@ -42,9 +44,7 @@ module Pageflow
42
44
  end
43
45
 
44
46
  def with_credentials(definition)
45
- if akamai_configured?
46
- definition[:credentials] = akamai_credentials
47
- end
47
+ definition[:credentials] = akamai_credentials if akamai_configured?
48
48
 
49
49
  definition
50
50
  end
@@ -58,7 +58,7 @@ module Pageflow
58
58
  end
59
59
 
60
60
  def sftp_url(path)
61
- "#{File.join(sftp_host, path)}"
61
+ File.join(sftp_host, path).to_s
62
62
  end
63
63
 
64
64
  def sftp_host
@@ -70,7 +70,7 @@ module Pageflow
70
70
  end
71
71
 
72
72
  def akamai_url(path)
73
- "#{File.join(akamai_host, path)}"
73
+ File.join(akamai_host, path).to_s
74
74
  end
75
75
 
76
76
  def akamai_host
@@ -89,11 +89,12 @@ module Pageflow
89
89
 
90
90
  def sftp_transfer_definition(definition)
91
91
  return unless sftp_configured?
92
+
92
93
  {
93
- :label => "sftp_transfer_#{definition[:label]}",
94
- :source => definition[:label],
95
- :type => 'transfer-only',
96
- :url => sftp_url(definition[:path])
94
+ label: "sftp_transfer_#{definition[:label]}",
95
+ source: definition[:label],
96
+ type: 'transfer-only',
97
+ url: sftp_url(definition[:path])
97
98
  }
98
99
  end
99
100
 
@@ -105,6 +106,7 @@ module Pageflow
105
106
 
106
107
  def sftp_definition(source_defintion)
107
108
  return unless sftp_configured?
109
+
108
110
  source_defintion.dup.tap do |definiton|
109
111
  definiton[:label] = "sftp_#{definiton[:label]}"
110
112
  definiton[:url] = sftp_url(definiton.delete(:path))