pageflow 16.0.0 → 16.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +210 -33
  3. data/README.md +0 -1
  4. data/Rakefile +1 -1
  5. data/admins/pageflow/entry.rb +0 -1
  6. data/admins/pageflow/sites.rb +3 -0
  7. data/app/assets/javascripts/pageflow/dist/ui.js +298 -72
  8. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +10 -0
  9. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +6 -1
  10. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -0
  11. data/app/assets/stylesheets/pageflow/editor/help.scss +3 -3
  12. data/app/assets/stylesheets/pageflow/editor/info_box.scss +7 -0
  13. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +0 -5
  14. data/app/assets/stylesheets/pageflow/ui/forms.scss +1 -1
  15. data/app/controllers/pageflow/chapters_controller.rb +2 -2
  16. data/app/controllers/pageflow/editor/files_controller.rb +1 -1
  17. data/app/controllers/pageflow/entries_controller.rb +10 -0
  18. data/app/controllers/pageflow/feeds_controller.rb +18 -0
  19. data/app/controllers/pageflow/pages_controller.rb +2 -2
  20. data/app/controllers/pageflow/sitemaps_controller.rb +15 -0
  21. data/app/controllers/pageflow/storylines_controller.rb +2 -2
  22. data/app/helpers/pageflow/entries_helper.rb +2 -1
  23. data/app/helpers/pageflow/feeds_helper.rb +66 -0
  24. data/app/helpers/pageflow/page_types_helper.rb +9 -9
  25. data/app/inputs/pageflow_permalink_input.rb +15 -3
  26. data/app/models/concerns/pageflow/reusable_file.rb +3 -3
  27. data/app/models/pageflow/account.rb +8 -0
  28. data/app/models/pageflow/audio_file_url_templates.rb +2 -1
  29. data/app/models/pageflow/draft_entry.rb +1 -1
  30. data/app/models/pageflow/entries_feed.rb +32 -0
  31. data/app/models/pageflow/image_file.rb +14 -3
  32. data/app/models/pageflow/membership.rb +3 -2
  33. data/app/models/pageflow/other_file.rb +5 -0
  34. data/app/models/pageflow/other_file_url_templates.rb +16 -0
  35. data/app/models/pageflow/published_entry.rb +6 -0
  36. data/app/models/pageflow/revision.rb +4 -0
  37. data/app/models/pageflow/site.rb +8 -0
  38. data/app/models/pageflow/sitemaps.rb +13 -0
  39. data/app/models/pageflow/used_file.rb +2 -2
  40. data/app/models/pageflow/video_file_url_templates.rb +3 -1
  41. data/app/models/pageflow/widget.rb +9 -1
  42. data/app/views/admin/entries/_permalink_inputs.html.erb +1 -2
  43. data/app/views/admin/sites/_attributes_table.html.arb +3 -0
  44. data/app/views/admin/sites/_fields.html.erb +6 -0
  45. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +8 -2
  46. data/app/views/components/pageflow/admin/sites_tab.rb +3 -0
  47. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -0
  48. data/app/views/pageflow/feeds/index.atom.builder +20 -0
  49. data/app/views/pageflow/sitemaps/index.xml.builder +9 -0
  50. data/config/initializers/features.rb +1 -0
  51. data/config/initializers/paperclip.rb +4 -0
  52. data/config/locales/de.yml +27 -6
  53. data/config/locales/en.yml +30 -4
  54. data/config/routes.rb +3 -0
  55. data/config/spring.rb +1 -1
  56. data/db/migrate/20230120092923_create_other_files.rb +23 -0
  57. data/db/migrate/20230323115745_add_feeds_enabled_to_sites.rb +5 -0
  58. data/db/migrate/20230323154323_add_sitemap_enabled_to_sites.rb +5 -0
  59. data/db/migrate/20230331103823_add_title_to_sites.rb +5 -0
  60. data/db/migrate/20230405103612_add_custom_feed_url_to_sites.rb +5 -0
  61. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +445 -109
  62. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +26 -3
  63. data/entry_types/paged/app/controllers/pageflow_paged/editor/entries_controller.rb +0 -2
  64. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  65. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  66. data/entry_types/paged/config/initializers/features.rb +0 -1
  67. data/entry_types/paged/lib/pageflow_paged/engine.rb +17 -1
  68. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  69. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +3 -4
  70. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +13 -6
  71. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -0
  72. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +11 -0
  73. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +42 -0
  74. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +3 -0
  75. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +31 -10
  76. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +9 -1
  77. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +3 -1
  78. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +23 -0
  79. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +6 -1
  80. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -5
  81. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +10 -0
  82. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +44 -41
  83. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_consent_vendors.json.jbuilder +16 -0
  84. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +3 -0
  85. data/entry_types/scrolled/config/initializers/features.rb +5 -0
  86. data/entry_types/scrolled/config/locales/consent_widget.de.yml +4 -0
  87. data/entry_types/scrolled/config/locales/consent_widget.en.yml +4 -0
  88. data/entry_types/scrolled/config/locales/de.yml +189 -8
  89. data/entry_types/scrolled/config/locales/en.yml +207 -2
  90. data/entry_types/scrolled/config/routes.rb +4 -0
  91. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +97 -5
  92. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  93. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +96 -0
  94. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +38 -0
  95. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +17 -1
  96. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -0
  97. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +6 -1
  98. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +1 -2
  99. data/entry_types/scrolled/package/contentElements-editor.js +307 -22
  100. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  101. data/entry_types/scrolled/package/contentElements-frontend.js +690 -71
  102. data/entry_types/scrolled/package/editor.js +616 -220
  103. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-14c7b097.js → EditableInlineText.module-fa9e3aff.js} +1669 -1674
  104. data/entry_types/scrolled/package/frontend/PhonePlatformContext-10a1d600.js +32 -0
  105. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-727cce0d.js +107 -0
  106. data/entry_types/scrolled/package/frontend/Viewer-169e14ca.js +154 -0
  107. data/entry_types/scrolled/package/frontend/{Viewer-b6becc57.js → Viewer-ee1aa590.js} +32 -161
  108. data/entry_types/scrolled/package/frontend/arrowRight-92a34ccc.js +77 -0
  109. data/entry_types/scrolled/package/frontend/{components-b3160dd7.js → components-4a09bfa3.js} +185 -45
  110. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-f6093cc6.js → i18n-ddd92820.js} +149 -107
  111. data/entry_types/scrolled/package/frontend/index-02378634.js +118 -0
  112. data/entry_types/scrolled/package/frontend/index.css +1 -1
  113. data/entry_types/scrolled/package/frontend/index.js +206 -54
  114. data/entry_types/scrolled/package/frontend/useContentElementEditorState-63045393.js +52 -0
  115. data/entry_types/scrolled/package/package.json +2 -1
  116. data/entry_types/scrolled/package/testHelpers.js +9 -2
  117. data/entry_types/scrolled/package/values/colors.module.css +15 -0
  118. data/entry_types/scrolled/package/widgets/consentBar.css +1 -0
  119. data/entry_types/scrolled/package/widgets/consentBar.js +426 -0
  120. data/entry_types/scrolled/package/widgets/defaultNavigation.css +1 -1
  121. data/lib/generators/pageflow/resque/resque_generator.rb +1 -1
  122. data/lib/pageflow/ability_mixin.rb +5 -5
  123. data/lib/pageflow/active_admin_can_can_fix.rb +2 -2
  124. data/lib/pageflow/built_in_file_type.rb +7 -0
  125. data/lib/pageflow/configuration.rb +21 -0
  126. data/lib/pageflow/engine.rb +60 -39
  127. data/lib/pageflow/entry_export_import/revision_serialization.rb +1 -1
  128. data/lib/pageflow/file_type.rb +2 -2
  129. data/lib/pageflow/global_config_api.rb +2 -2
  130. data/lib/pageflow/nested_revision_component.rb +23 -5
  131. data/lib/pageflow/rails_version.rb +19 -0
  132. data/lib/pageflow/seeds.rb +10 -7
  133. data/lib/pageflow/version.rb +1 -1
  134. data/lib/pageflow/widget_types.rb +4 -0
  135. data/package/config/webpack5.js +14 -0
  136. data/package/editor.js +141 -30
  137. data/package/frontend.js +26 -2
  138. data/package/testHelpers.js +1 -1
  139. data/package/ui.js +296 -71
  140. data/spec/factories/entries.rb +17 -3
  141. data/spec/factories/sites.rb +3 -0
  142. data/vendor/assets/javascripts/iscroll.js +4 -7
  143. metadata +65 -49
  144. data/app/helpers/pageflow/admin/permalinks_helper.rb +0 -15
  145. data/entry_types/scrolled/package/frontend/arrowRight-78a7cee4.js +0 -42
@@ -0,0 +1,15 @@
1
+ module Pageflow
2
+ # @api private
3
+ class SitemapsController < Pageflow::ApplicationController
4
+ def index
5
+ site = Site.for_request(request).first!
6
+ return head 404 unless site.sitemap_enabled?
7
+
8
+ @entries = Sitemaps.entries_for(site: site)
9
+
10
+ respond_to do |format|
11
+ format.xml
12
+ end
13
+ end
14
+ end
15
+ end
@@ -31,7 +31,7 @@ module Pageflow
31
31
 
32
32
  authorize!(:update, storyline)
33
33
  verify_edit_lock!(storyline.entry)
34
- storyline.update_attributes(storyline_params)
34
+ storyline.update(storyline_params)
35
35
 
36
36
  respond_with(storyline)
37
37
  end
@@ -42,7 +42,7 @@ module Pageflow
42
42
  authorize!(:edit_outline, entry.to_model)
43
43
  verify_edit_lock!(entry)
44
44
  params.require(:ids).each_with_index do |id, index|
45
- entry.storylines.update(id, position: index)
45
+ entry.storylines.find(id).update(position: index)
46
46
  end
47
47
 
48
48
  head :no_content
@@ -1,7 +1,8 @@
1
1
  module Pageflow
2
2
  module EntriesHelper
3
3
  def pretty_entry_title(entry)
4
- [entry.title, entry.site.cname_domain.presence].compact.join(' - ')
4
+ [entry.title,
5
+ entry.site.title.presence || entry.site.cname_domain.presence].compact.join(' - ')
5
6
  end
6
7
 
7
8
  def pretty_entry_url(entry, options = {})
@@ -0,0 +1,66 @@
1
+ module Pageflow
2
+ # Helpers to render alternate links to atom feeds.
3
+ #
4
+ # @since 16.1
5
+ module FeedsHelper
6
+ # Render alternate links to atom feed of entries in the same site
7
+ # using the same locale.
8
+ def feed_link_tags_for_entry(entry)
9
+ return '' unless entry.site.feeds_enabled?
10
+
11
+ href =
12
+ entry.site.custom_feed_url.presence&.gsub(':locale', entry.locale) ||
13
+ pageflow.feed_url(
14
+ {
15
+ locale: entry.locale,
16
+ format: 'atom'
17
+ }.merge(Pageflow.config.site_url_options(entry.site) || {})
18
+ )
19
+
20
+ tag(:link,
21
+ rel: 'alternate',
22
+ type: 'application/atom+xml',
23
+ title: 'Feed',
24
+ href: href)
25
+ end
26
+
27
+ # @api private
28
+ def feed_entry_content(entry)
29
+ FeedContent.new(self, entry).build
30
+ end
31
+
32
+ # @api private
33
+ FeedContent = Struct.new(:template, :entry) do
34
+ def build
35
+ [image_html, summary_html, link_html].compact.join
36
+ end
37
+
38
+ private
39
+
40
+ def image_html
41
+ return if entry.thumbnail_file.blank?
42
+
43
+ template.content_tag(
44
+ :p,
45
+ template.tag(
46
+ :img,
47
+ src: entry.thumbnail_file.thumbnail_url(:thumbnail_large),
48
+ width: 560, height: 315
49
+ )
50
+ )
51
+ end
52
+
53
+ def summary_html
54
+ template.content_tag(:p, template.raw(entry.summary))
55
+ end
56
+
57
+ def link_html
58
+ template.content_tag(
59
+ :p,
60
+ template.link_to(template.t('pageflow.public.read_more'),
61
+ template.social_share_entry_url(entry))
62
+ )
63
+ end
64
+ end
65
+ end
66
+ end
@@ -17,16 +17,16 @@ module Pageflow
17
17
  def page_type_templates(entry)
18
18
  safe_join(Pageflow.config.page_types.map do |page_type|
19
19
  content_tag(:script,
20
- render_to_string(template: page_type.template_path,
21
- locals: {
22
- configuration: {},
23
- page: Page.new,
24
- entry: entry,
20
+ render(template: page_type.template_path,
21
+ locals: {
22
+ configuration: {},
23
+ page: Page.new,
24
+ entry: entry,
25
25
 
26
- # Required by RevisionFileHelper#find_file_in_entry
27
- :@entry => entry
28
- },
29
- layout: false).to_str,
26
+ # Required by RevisionFileHelper#find_file_in_entry
27
+ :@entry => entry
28
+ },
29
+ layout: false).to_str,
30
30
  type: 'text/html', data: {template: "#{page_type.name}_page"})
31
31
  end)
32
32
  end
@@ -27,9 +27,9 @@ class PageflowPermalinkInput
27
27
  end
28
28
 
29
29
  def permalink_inputs_html
30
- return '' if options[:directory_collection].empty?
30
+ return '' if options[:site].permalink_directories.empty?
31
31
 
32
- builder.select(:directory_id, options[:directory_collection]) <<
32
+ builder.select(:directory_id, directory_select_options) <<
33
33
  builder.text_field(:slug, placeholder: options[:slug_placeholder])
34
34
  end
35
35
 
@@ -38,10 +38,22 @@ class PageflowPermalinkInput
38
38
  end
39
39
 
40
40
  def wrapper_html_options
41
- if options[:directory_collection].empty?
41
+ if options[:site].permalink_directories.empty?
42
42
  super.merge(style: 'display: none')
43
+ elsif options[:site].permalink_directories.one?
44
+ result = super
45
+ result.merge(class: "#{result[:class]} no_directories")
43
46
  else
44
47
  super
45
48
  end
46
49
  end
50
+
51
+ def directory_select_options
52
+ template.options_from_collection_for_select(
53
+ options[:site].permalink_directories,
54
+ 'id',
55
+ 'path',
56
+ builder.object.directory_id
57
+ )
58
+ end
47
59
  end
@@ -30,8 +30,8 @@ module Pageflow
30
30
  file_type_of_parent = Pageflow.config.file_types.find_by_model!(parent_class)
31
31
  models_of_nested_file_types = file_type_of_parent.nested_file_types.map(&:model)
32
32
  unless models_of_nested_file_types.include?(self.class)
33
- errors[:base] << 'File type of provided parent file does not permit nesting files of '\
34
- "type #{self.class.name}"
33
+ errors.add(:base, 'File type of provided parent file does not permit nesting files of '\
34
+ "type #{self.class.name}")
35
35
  end
36
36
  end
37
37
  end
@@ -39,7 +39,7 @@ module Pageflow
39
39
  def parent_belongs_to_same_entry
40
40
  if parent_file.present?
41
41
  unless parent_file.using_entries.include?(entry)
42
- errors[:base] << 'Parent file does not belong to same entry as nested file'
42
+ errors.add(:base, 'Parent file does not belong to same entry as nested file')
43
43
  end
44
44
  end
45
45
  end
@@ -27,5 +27,13 @@ module Pageflow
27
27
  def blacklist_for_serialization
28
28
  [:features_configuration]
29
29
  end
30
+
31
+ def self.ransackable_attributes(_auth_object)
32
+ %w[id name]
33
+ end
34
+
35
+ def self.ransackable_associations(_auth_object)
36
+ []
37
+ end
30
38
  end
31
39
  end
@@ -2,6 +2,7 @@ module Pageflow
2
2
  class AudioFileUrlTemplates
3
3
  def call
4
4
  {
5
+ original: url_template(:attachment, :original),
5
6
  m4a: url_template(:m4a),
6
7
  mp3: url_template(:mp3),
7
8
  ogg: url_template(:ogg),
@@ -17,7 +18,7 @@ module Pageflow
17
18
 
18
19
  def example_file
19
20
  @example_file ||= AudioFile.new(id: 0,
20
- file_name: ':basename.mp3',
21
+ file_name: ':basename.:extension',
21
22
  peak_data_file_name: 'audio.json')
22
23
  end
23
24
  end
@@ -52,7 +52,7 @@ module Pageflow
52
52
  end
53
53
 
54
54
  def update_meta_data!(attributes)
55
- draft.update_attributes!(attributes)
55
+ draft.update!(attributes)
56
56
  end
57
57
 
58
58
  def self.find(id)
@@ -0,0 +1,32 @@
1
+ module Pageflow
2
+ # @api private
3
+ EntriesFeed = Struct.new(:title, :locale, :custom_url, :root_url, :entries) do
4
+ def updated_at
5
+ entries.map(&:published_at).max
6
+ end
7
+
8
+ class << self
9
+ def for(site:, locale:)
10
+ new(
11
+ site.title.presence || site.host,
12
+ locale,
13
+ site.custom_feed_url&.gsub(':locale', locale),
14
+ site.canonical_entry_url_prefix&.gsub(':locale', locale),
15
+ find_entries(site, locale)
16
+ )
17
+ end
18
+
19
+ private
20
+
21
+ def find_entries(site, locale)
22
+ Pageflow::PublishedEntry.wrap_all(
23
+ site
24
+ .entries
25
+ .published_without_password_protection
26
+ .where(pageflow_revisions: {locale: locale})
27
+ .order('first_published_at DESC')
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
@@ -9,7 +9,7 @@ module Pageflow
9
9
  'processed_attachments'
10
10
  end
11
11
 
12
- after_attachment_on_s3_post_process :save_image_dimensions
12
+ before_attachment_on_s3_post_process :save_image_dimensions
13
13
 
14
14
  def thumbnail_url(*args)
15
15
  unless ready?
@@ -49,10 +49,10 @@ module Pageflow
49
49
  ultra: {geometry: '3840x3840>',
50
50
  format: :JPG,
51
51
  convert_options: '-quality 90 -interlace Plane'},
52
- panorama_medium: {geometry: '1024x1024^',
52
+ panorama_medium: {geometry: ImageFile.scale_down_to_cover(1024, 1024),
53
53
  format: panorama_format,
54
54
  convert_options: '-quality 90 -interlace Plane'},
55
- panorama_large: {geometry: '1920x1080^',
55
+ panorama_large: {geometry: ImageFile.scale_down_to_cover(1920, 1080),
56
56
  format: panorama_format,
57
57
  convert_options: '-quality 90 -interlace Plane'}
58
58
  )
@@ -63,6 +63,17 @@ module Pageflow
63
63
  end
64
64
  # <- UploadableFile-overrides
65
65
 
66
+ def self.scale_down_to_cover(width, height)
67
+ lambda do |image_file|
68
+ if image_file.width.present? && image_file.height.present? &&
69
+ (image_file.width <= width || image_file.height <= height)
70
+ '100%'
71
+ else
72
+ "#{width}x#{height}^"
73
+ end
74
+ end
75
+ end
76
+
66
77
  private
67
78
 
68
79
  def save_image_dimensions
@@ -38,8 +38,9 @@ module Pageflow
38
38
  private
39
39
 
40
40
  def account_membership_exists
41
- errors[:base] << 'Entry Membership misses presupposed Membership on account of entry' if
42
- user.present? && !user.accounts.include?(entity.account)
41
+ return if user.blank? || user.accounts.include?(entity.account)
42
+
43
+ errors.add(:base, 'Entry Membership misses presupposed Membership on account of entry')
43
44
  end
44
45
 
45
46
  def on_entry?
@@ -0,0 +1,5 @@
1
+ module Pageflow
2
+ class OtherFile < ApplicationRecord
3
+ include UploadableFile
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ module Pageflow
2
+ # @api private
3
+ class OtherFileUrlTemplates
4
+ def call
5
+ {
6
+ original: UrlTemplate.from_attachment(example_file.attachment, :original)
7
+ }
8
+ end
9
+
10
+ private
11
+
12
+ def example_file
13
+ @example_file ||= OtherFile.new(id: 0, file_name: ':basename.:extension')
14
+ end
15
+ end
16
+ end
@@ -55,6 +55,12 @@ module Pageflow
55
55
  )
56
56
  end
57
57
 
58
+ def self.wrap_all(scope)
59
+ scope
60
+ .includes(:published_revision)
61
+ .map { |entry| new(entry) }
62
+ end
63
+
58
64
  def cache_key
59
65
  [
60
66
  self.class.model_name.cache_key,
@@ -232,5 +232,9 @@ module Pageflow
232
232
  def available_themes
233
233
  @available_themes ||= Pageflow.config_for(entry).themes
234
234
  end
235
+
236
+ def self.ransackable_attributes(_auth_object)
237
+ %w[published_at]
238
+ end
235
239
  end
236
240
  end
@@ -55,5 +55,13 @@ module Pageflow
55
55
  def theme_name
56
56
  first_paged_entry_template.theme_name
57
57
  end
58
+
59
+ def self.ransackable_attributes(_auth_object)
60
+ %w[name]
61
+ end
62
+
63
+ def self.ransackable_associations(_auth_object)
64
+ %w[account]
65
+ end
58
66
  end
59
67
  end
@@ -0,0 +1,13 @@
1
+ module Pageflow
2
+ # @api private
3
+ module Sitemaps
4
+ def self.entries_for(site:)
5
+ PublishedEntry.wrap_all(
6
+ site
7
+ .entries
8
+ .published_without_password_protection
9
+ .order('first_published_at DESC')
10
+ )
11
+ end
12
+ end
13
+ end
@@ -10,9 +10,9 @@ module Pageflow
10
10
  @usage.configuration
11
11
  end
12
12
 
13
- def update_attributes!(attributes)
13
+ def update!(attributes)
14
14
  super(attributes.except(:configuration))
15
- @usage.update_attributes!(attributes.slice(:configuration))
15
+ @usage.update!(attributes.slice(:configuration))
16
16
  end
17
17
 
18
18
  def usage_id
@@ -2,6 +2,8 @@ module Pageflow
2
2
  class VideoFileUrlTemplates
3
3
  def call
4
4
  {
5
+ original: url_template(:attachment, :original),
6
+
5
7
  high: url_template(:mp4_high),
6
8
  medium: url_template(:mp4_medium),
7
9
  fullhd: url_template(:mp4_fullhd),
@@ -26,7 +28,7 @@ module Pageflow
26
28
 
27
29
  def example_file
28
30
  @example_file ||= VideoFile.new(id: 0).tap do |video_file|
29
- video_file.file_name = ':basename.mp4'
31
+ video_file.file_name = ':basename.:extension'
30
32
  video_file.output_presences = {':pageflow_hls_qualities' => true}
31
33
  video_file.poster_file_name = video_file.zencoder_poster.original_filename
32
34
  end
@@ -72,7 +72,15 @@ module Pageflow
72
72
  end
73
73
 
74
74
  def from_db_by_role
75
- Widget.all.index_by(&:role)
75
+ reject_unknown_widget_types(Widget.all)
76
+ .index_by(&:role)
77
+ end
78
+
79
+ def reject_unknown_widget_types(widgets)
80
+ widgets.select do |widget|
81
+ widget.type_name.blank? ||
82
+ config.widget_types.type_name?(widget.type_name)
83
+ end
76
84
  end
77
85
 
78
86
  def defaults_by_role
@@ -1,6 +1,5 @@
1
1
  <%= form.input(:permalink,
2
2
  as: :pageflow_permalink,
3
3
  base_url: pretty_site_url(entry.site),
4
- directory_collection: collection_for_permalink_directories(entry.site,
5
- form.object),
4
+ site: entry.site,
6
5
  slug_placeholder: entry.default_permalink_slug) %>
@@ -1,9 +1,12 @@
1
1
  extensible_attributes_table_for(site,
2
2
  Pageflow.config_for(site.account)
3
3
  .admin_attributes_table_rows.for(:site)) do
4
+ row :title
4
5
  row :host, class: 'host'
5
6
  row :account, class: 'account' do
6
7
  link_to(site.account.name,
7
8
  admin_account_path(site.account, tab: 'sites'))
8
9
  end
10
+ row :feeds_enabled
11
+ row :sitemap_enabled
9
12
  end
@@ -1,4 +1,5 @@
1
1
  <%= f.inputs do %>
2
+ <%= f.input :title, hint: t('pageflow.admin.sites.title_hint') %>
2
3
  <%= f.input :cname, hint: t('pageflow.admin.sites.cname_hint') %>
3
4
  <%= f.input :additional_cnames, hint: t('pageflow.admin.sites.additional_cnames_hint') %>
4
5
  <%= f.input :home_url, hint: t('pageflow.admin.sites.home_url_hint') %>
@@ -11,6 +12,11 @@
11
12
  <%= f.input :copyright_link_url %>
12
13
  <%= f.input :privacy_link_url %>
13
14
 
15
+ <%= f.input :feeds_enabled, hint: t('pageflow.admin.sites.feeds_hint',
16
+ site_host: @site&.persisted? ? @site.host : '<host>') %>
17
+ <%= f.input :sitemap_enabled, hint: t('pageflow.admin.sites.sitemap_hint',
18
+ site_host: @site&.persisted? ? @site.host : '<host>') %>
19
+
14
20
  <% account_config.admin_form_inputs.find_all_for(:site).each do |form_input| %>
15
21
  <%= form_input.build(f) %>
16
22
  <% end %>
@@ -78,8 +78,14 @@ module Pageflow
78
78
  #
79
79
  # This is also the reason we can not use SimpleDelegator here
80
80
  # and also delegate_missing in Rails 5 would not work.
81
- def method_missing(method, *args, &block)
82
- @context.public_send(method, *args, &block)
81
+ def method_missing(method, *args, **kwargs, &block)
82
+ # Required for Ruby 2.6. Remove together with
83
+ # Pageflow::RailsVersion.experimental? conditionals.
84
+ if kwargs.present?
85
+ @context.public_send(method, *args, **kwargs, &block)
86
+ else
87
+ @context.public_send(method, *args, &block)
88
+ end
83
89
  end
84
90
  # rubocop:enable Style/MethodMissing
85
91
  end
@@ -9,6 +9,9 @@ module Pageflow
9
9
  link_to(site.display_name,
10
10
  admin_account_site_path(site.account, site))
11
11
  end
12
+ column :title do |site|
13
+ site.title.presence || '-'
14
+ end
12
15
  column :host do |site|
13
16
  site.host.presence || '-'
14
17
  end
@@ -1,6 +1,7 @@
1
1
  json.key_format!(camelize: :lower)
2
2
  json.call(Pageflow.config,
3
3
  :confirm_encoding_jobs,
4
+ :default_published_until_duration_in_months,
4
5
  :available_locales,
5
6
  :available_public_locales,
6
7
  :available_text_track_kinds,
@@ -0,0 +1,20 @@
1
+ atom_feed language: @feed.locale,
2
+ root_url: @feed.root_url,
3
+ url: @feed.custom_url do |feed|
4
+ feed.title(@feed.title)
5
+ feed.updated(@feed.updated_at&.utc)
6
+
7
+ @feed.entries.each do |entry|
8
+ feed.entry(entry,
9
+ url: social_share_entry_url(entry),
10
+ published: entry.first_published_at.utc,
11
+ updated: entry.published_at.utc) do |feed_entry|
12
+ feed_entry.title(entry.title)
13
+ feed_entry.content(feed_entry_content(entry), type: 'html')
14
+
15
+ feed_entry.author do |author|
16
+ author.name(entry.author)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ xml.instruct!
2
+ xml.urlset xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9' do
3
+ @entries.each do |entry|
4
+ xml.url do
5
+ xml.loc(social_share_entry_url(entry))
6
+ xml.lastmod(entry.published_at.utc.xmlschema)
7
+ end
8
+ end
9
+ end
@@ -1,4 +1,5 @@
1
1
  Pageflow.configure do |config|
2
2
  config.features.register('highdef_video_encoding')
3
+ config.features.register('force_fullhd_video_quality')
3
4
  config.features.register('selectable_themes')
4
5
  end
@@ -1,3 +1,7 @@
1
+ require 'pageflow/paperclip_processors/vtt'
2
+ require 'pageflow/paperclip_processors/audio_waveform'
3
+ require 'pageflow/paperclip_processors/noop'
4
+
1
5
  Paperclip.interpolates(:pageflow_s3_root) do |_attachment, _style|
2
6
  Pageflow.config.paperclip_s3_root
3
7
  end