pageflow 16.0.0 → 16.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 (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