pageflow 15.8.0 → 16.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +183 -103
  3. data/README.md +0 -1
  4. data/Rakefile +1 -1
  5. data/admins/pageflow/accounts.rb +12 -16
  6. data/admins/pageflow/entry.rb +28 -26
  7. data/admins/pageflow/entry_templates.rb +5 -7
  8. data/admins/pageflow/sites.rb +53 -0
  9. data/app/assets/javascripts/pageflow/admin/entries.js +16 -7
  10. data/app/assets/javascripts/pageflow/dist/ui.js +298 -72
  11. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +10 -0
  12. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +6 -1
  13. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -0
  14. data/app/assets/stylesheets/pageflow/editor/help.scss +3 -3
  15. data/app/assets/stylesheets/pageflow/editor/info_box.scss +7 -0
  16. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +0 -5
  17. data/app/assets/stylesheets/pageflow/ui/forms.scss +1 -1
  18. data/app/controllers/pageflow/chapters_controller.rb +2 -2
  19. data/app/controllers/pageflow/editor/files_controller.rb +1 -1
  20. data/app/controllers/pageflow/entries_controller.rb +12 -2
  21. data/app/controllers/pageflow/feeds_controller.rb +18 -0
  22. data/app/controllers/pageflow/pages_controller.rb +2 -2
  23. data/app/controllers/pageflow/sitemaps_controller.rb +15 -0
  24. data/app/controllers/pageflow/storylines_controller.rb +2 -2
  25. data/app/helpers/pageflow/common_entry_seed_helper.rb +1 -1
  26. data/app/helpers/pageflow/embed_code_helper.rb +1 -1
  27. data/app/helpers/pageflow/entries_helper.rb +16 -15
  28. data/app/helpers/pageflow/feeds_helper.rb +66 -0
  29. data/app/helpers/pageflow/page_types_helper.rb +9 -9
  30. data/app/helpers/pageflow/sites_helper.rb +11 -0
  31. data/app/helpers/pageflow/social_share_helper.rb +2 -2
  32. data/app/inputs/pageflow_permalink_input.rb +15 -3
  33. data/app/models/concerns/pageflow/reusable_file.rb +3 -3
  34. data/app/models/pageflow/account.rb +13 -31
  35. data/app/models/pageflow/audio_file_url_templates.rb +2 -1
  36. data/app/models/pageflow/{cname_theming_request_scope.rb → cname_site_request_scope.rb} +3 -3
  37. data/app/models/pageflow/customized_theme.rb +1 -1
  38. data/app/models/pageflow/draft_entry.rb +1 -1
  39. data/app/models/pageflow/entries_feed.rb +32 -0
  40. data/app/models/pageflow/entry.rb +3 -4
  41. data/app/models/pageflow/entry_at_revision.rb +2 -2
  42. data/app/models/pageflow/entry_duplicate.rb +1 -1
  43. data/app/models/pageflow/entry_template.rb +4 -4
  44. data/app/models/pageflow/home_button.rb +7 -7
  45. data/app/models/pageflow/image_file.rb +14 -3
  46. data/app/models/pageflow/membership.rb +3 -2
  47. data/app/models/pageflow/other_file.rb +5 -0
  48. data/app/models/pageflow/other_file_url_templates.rb +16 -0
  49. data/app/models/pageflow/permalink.rb +3 -3
  50. data/app/models/pageflow/permalink_directory.rb +2 -2
  51. data/app/models/pageflow/published_entry.rb +8 -2
  52. data/app/models/pageflow/revision.rb +4 -0
  53. data/app/models/pageflow/site.rb +67 -0
  54. data/app/models/pageflow/sitemaps.rb +13 -0
  55. data/app/models/pageflow/theme_customization.rb +1 -1
  56. data/app/models/pageflow/used_file.rb +2 -2
  57. data/app/models/pageflow/video_file_url_templates.rb +3 -1
  58. data/app/models/pageflow/widget.rb +9 -1
  59. data/app/policies/pageflow/account_policy.rb +2 -2
  60. data/app/policies/pageflow/entry_policy.rb +2 -2
  61. data/app/policies/pageflow/entry_template_policy.rb +1 -1
  62. data/app/policies/pageflow/{theming_policy.rb → site_policy.rb} +13 -11
  63. data/app/views/admin/accounts/_entry_template_details.html.arb +1 -1
  64. data/app/views/admin/accounts/_form.html.erb +4 -22
  65. data/app/views/admin/accounts/_site_defaults_inline_help.html.erb +5 -0
  66. data/app/views/admin/entries/_form.html.erb +4 -13
  67. data/app/views/admin/entries/_permalink_inputs.html.erb +2 -3
  68. data/app/views/admin/entries/_site_input.html.erb +15 -0
  69. data/app/views/admin/entries/{entry_type_name_input.html.erb → entry_site_and_type_name_input.html.erb} +3 -0
  70. data/app/views/admin/entry_templates/_form.html.erb +5 -5
  71. data/app/views/admin/sites/_attributes_table.html.arb +12 -0
  72. data/app/views/admin/sites/_fields.html.erb +23 -0
  73. data/app/views/admin/sites/_form.html.erb +5 -0
  74. data/app/views/components/pageflow/admin/entries_tab.rb +1 -2
  75. data/app/views/components/pageflow/admin/entry_templates_tab.rb +10 -11
  76. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +8 -2
  77. data/app/views/components/pageflow/admin/features_tab.rb +1 -1
  78. data/app/views/components/pageflow/admin/sites_tab.rb +35 -0
  79. data/app/views/components/pageflow/admin/users_tab.rb +1 -2
  80. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -0
  81. data/app/views/pageflow/editor/entries/seed.json.erb +1 -1
  82. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  83. data/app/views/pageflow/entries/stylesheet.css.erb +1 -1
  84. data/app/views/pageflow/feeds/index.atom.builder +20 -0
  85. data/app/views/pageflow/sitemaps/index.xml.builder +9 -0
  86. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  87. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  88. data/config/initializers/admin_resource_tabs.rb +29 -12
  89. data/config/initializers/features.rb +1 -0
  90. data/config/initializers/paperclip.rb +4 -0
  91. data/config/locales/de.yml +42 -19
  92. data/config/locales/en.yml +45 -17
  93. data/config/routes.rb +3 -0
  94. data/config/spring.rb +1 -1
  95. data/db/migrate/20221215101134_rename_theming_to_site.rb +9 -0
  96. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +34 -0
  97. data/db/migrate/20221219203023_add_name_to_sites.rb +5 -0
  98. data/db/migrate/20230103155934_associate_theme_customizations_with_sites.rb +27 -0
  99. data/db/migrate/20230120092923_create_other_files.rb +23 -0
  100. data/db/migrate/20230323115745_add_feeds_enabled_to_sites.rb +5 -0
  101. data/db/migrate/20230323154323_add_sitemap_enabled_to_sites.rb +5 -0
  102. data/db/migrate/20230331103823_add_title_to_sites.rb +5 -0
  103. data/db/migrate/20230405103612_add_custom_feed_url_to_sites.rb +5 -0
  104. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +455 -119
  105. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +31 -8
  106. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +1 -1
  107. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +1 -1
  108. data/entry_types/paged/app/controllers/pageflow_paged/editor/entries_controller.rb +0 -2
  109. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  110. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  111. data/entry_types/paged/config/initializers/features.rb +0 -1
  112. data/entry_types/paged/lib/pageflow_paged/engine.rb +17 -1
  113. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  114. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +3 -4
  115. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +13 -6
  116. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -0
  117. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +11 -0
  118. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +42 -0
  119. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +3 -0
  120. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +31 -10
  121. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +9 -1
  122. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +3 -1
  123. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +23 -0
  124. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +6 -1
  125. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -5
  126. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +10 -0
  127. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +44 -41
  128. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_consent_vendors.json.jbuilder +16 -0
  129. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +8 -5
  130. data/entry_types/scrolled/config/initializers/features.rb +5 -0
  131. data/entry_types/scrolled/config/locales/consent_widget.de.yml +4 -0
  132. data/entry_types/scrolled/config/locales/consent_widget.en.yml +4 -0
  133. data/entry_types/scrolled/config/locales/de.yml +189 -8
  134. data/entry_types/scrolled/config/locales/en.yml +207 -2
  135. data/entry_types/scrolled/config/routes.rb +4 -0
  136. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +97 -5
  137. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  138. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +96 -0
  139. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +38 -0
  140. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +17 -1
  141. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -0
  142. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +6 -1
  143. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +1 -1
  144. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +1 -2
  145. data/entry_types/scrolled/package/contentElements-editor.js +307 -22
  146. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  147. data/entry_types/scrolled/package/contentElements-frontend.js +690 -71
  148. data/entry_types/scrolled/package/editor.js +616 -220
  149. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-c6672f27.js → EditableInlineText.module-fa9e3aff.js} +1669 -1674
  150. data/entry_types/scrolled/package/frontend/PhonePlatformContext-10a1d600.js +32 -0
  151. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-727cce0d.js +107 -0
  152. data/entry_types/scrolled/package/frontend/Viewer-169e14ca.js +154 -0
  153. data/entry_types/scrolled/package/frontend/{Viewer-6b05522f.js → Viewer-ee1aa590.js} +32 -161
  154. data/entry_types/scrolled/package/frontend/arrowRight-92a34ccc.js +77 -0
  155. data/entry_types/scrolled/package/frontend/{components-487daafa.js → components-4a09bfa3.js} +185 -45
  156. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-22e65f92.js → i18n-ddd92820.js} +162 -292
  157. data/entry_types/scrolled/package/frontend/index-02378634.js +118 -0
  158. data/entry_types/scrolled/package/frontend/index.css +1 -1
  159. data/entry_types/scrolled/package/frontend/index.js +375 -40
  160. data/entry_types/scrolled/package/frontend/useContentElementEditorState-63045393.js +52 -0
  161. data/entry_types/scrolled/package/package.json +2 -1
  162. data/entry_types/scrolled/package/testHelpers.js +9 -2
  163. data/entry_types/scrolled/package/values/colors.module.css +15 -0
  164. data/entry_types/scrolled/package/widgets/consentBar.css +1 -0
  165. data/entry_types/scrolled/package/widgets/consentBar.js +426 -0
  166. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  167. data/entry_types/scrolled/package/widgets/defaultNavigation.js +16 -9
  168. data/lib/generators/pageflow/resque/resque_generator.rb +1 -1
  169. data/lib/pageflow/ability_mixin.rb +21 -13
  170. data/lib/pageflow/active_admin_can_can_fix.rb +2 -2
  171. data/lib/pageflow/admin/attributes_table_rows.rb +1 -1
  172. data/lib/pageflow/admin/form_inputs.rb +1 -1
  173. data/lib/pageflow/admin/tabs.rb +1 -1
  174. data/lib/pageflow/built_in_file_type.rb +7 -0
  175. data/lib/pageflow/configuration/permissions.rb +3 -3
  176. data/lib/pageflow/configuration.rb +38 -17
  177. data/lib/pageflow/engine.rb +60 -39
  178. data/lib/pageflow/entry_export_import/entry_serialization.rb +1 -1
  179. data/lib/pageflow/entry_export_import/revision_serialization.rb +1 -1
  180. data/lib/pageflow/file_type.rb +2 -2
  181. data/lib/pageflow/global_config_api.rb +2 -2
  182. data/lib/pageflow/nested_revision_component.rb +23 -5
  183. data/lib/pageflow/primary_domain_entry_redirect.rb +7 -7
  184. data/lib/pageflow/rails_version.rb +19 -0
  185. data/lib/pageflow/seeds.rb +20 -17
  186. data/lib/pageflow/theme_customizations.rb +10 -10
  187. data/lib/pageflow/version.rb +1 -1
  188. data/lib/pageflow/widget_types.rb +4 -0
  189. data/package/config/webpack5.js +14 -0
  190. data/package/editor.js +148 -37
  191. data/package/frontend.js +26 -2
  192. data/package/testHelpers.js +1 -1
  193. data/package/ui.js +296 -71
  194. data/spec/factories/accounts.rb +5 -2
  195. data/spec/factories/draft_entries.rb +2 -2
  196. data/spec/factories/entries.rb +19 -5
  197. data/spec/factories/entry_templates.rb +1 -1
  198. data/spec/factories/permalink_directory.rb +1 -1
  199. data/spec/factories/published_entries.rb +2 -2
  200. data/spec/factories/sites.rb +12 -0
  201. data/vendor/assets/javascripts/iscroll.js +4 -7
  202. metadata +84 -59
  203. data/app/helpers/pageflow/admin/permalinks_helper.rb +0 -15
  204. data/app/helpers/pageflow/themings_helper.rb +0 -11
  205. data/app/models/pageflow/theming.rb +0 -30
  206. data/app/views/admin/accounts/_theming_defaults_inline_help.html.erb +0 -5
  207. data/app/views/admin/accounts/_theming_details.html.arb +0 -5
  208. data/app/views/pageflow/editor/themings/_theming.json.jbuilder +0 -1
  209. data/entry_types/scrolled/package/frontend/arrowRight-7e3d9dd5.js +0 -42
  210. data/spec/factories/themings.rb +0 -7
  211. /data/app/views/pageflow/entries/{_theming.css.erb → _site.css.erb} +0 -0
@@ -1,14 +1,14 @@
1
1
  module Pageflow
2
2
  class HomeButton
3
- attr_reader :revision, :theming
3
+ attr_reader :revision, :site
4
4
 
5
- def initialize(revision, theming)
5
+ def initialize(revision, site)
6
6
  @revision = revision
7
- @theming = theming
7
+ @site = site
8
8
  end
9
9
 
10
10
  def url
11
- revision.configuration['home_url'].presence || theming_home_button_url
11
+ revision.configuration['home_url'].presence || site_home_button_url
12
12
  end
13
13
 
14
14
  def enabled?
@@ -27,9 +27,9 @@ module Pageflow
27
27
 
28
28
  private
29
29
 
30
- def theming_home_button_url
31
- if theming.home_url.present?
32
- options = Pageflow.config.theming_url_options(theming) || {}
30
+ def site_home_button_url
31
+ if site.home_url.present?
32
+ options = Pageflow.config.site_url_options(site) || {}
33
33
  Pageflow::Engine.routes.url_for(options.merge(controller: 'pageflow/entries',
34
34
  action: 'index',
35
35
  only_path: !options[:host]))
@@ -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
@@ -14,7 +14,7 @@ module Pageflow
14
14
  format: /\A[0-9a-zA-Z_-]+\z/,
15
15
  uniqueness: {scope: :directory})
16
16
 
17
- validate :belongs_to_same_theming_as_entry
17
+ validate :belongs_to_same_site_as_entry
18
18
 
19
19
  private
20
20
 
@@ -30,8 +30,8 @@ module Pageflow
30
30
  slug.nil?
31
31
  end
32
32
 
33
- def belongs_to_same_theming_as_entry
34
- return if !directory || !entry || entry.theming_id == directory.theming_id
33
+ def belongs_to_same_site_as_entry
34
+ return if !directory || !entry || entry.site_id == directory.site_id
35
35
 
36
36
  errors.add(:directory, :invalid)
37
37
  end
@@ -1,10 +1,10 @@
1
1
  module Pageflow
2
2
  # @api private
3
3
  class PermalinkDirectory < ApplicationRecord
4
- belongs_to :theming
4
+ belongs_to :site
5
5
 
6
6
  validates(:path,
7
7
  format: %r{\A([0-9a-zA-Z-]+/)*\z},
8
- uniqueness: {scope: :theming_id})
8
+ uniqueness: {scope: :site_id})
9
9
  end
10
10
  end
@@ -55,12 +55,18 @@ 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,
61
67
  entry.cache_key,
62
68
  revision.cache_key,
63
- theming.cache_key
69
+ site.cache_key
64
70
  ].compact.join('-')
65
71
  end
66
72
 
@@ -68,7 +74,7 @@ module Pageflow
68
74
  [
69
75
  entry.cache_version,
70
76
  revision.cache_version,
71
- theming.cache_version
77
+ site.cache_version
72
78
  ].compact.join('-').presence
73
79
  end
74
80
 
@@ -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
@@ -0,0 +1,67 @@
1
+ module Pageflow
2
+ class Site < ApplicationRecord
3
+ belongs_to :account
4
+
5
+ has_many :entry_templates, dependent: :destroy
6
+ has_many :entries
7
+ has_many :permalink_directories, -> { order('path ASC') }
8
+
9
+ scope :with_home_url, -> { where.not(home_url: '') }
10
+ scope :for_request, ->(request) { Pageflow.config.site_request_scope.call(all, request) }
11
+
12
+ validates :account, :presence => true
13
+
14
+ delegate :enabled_feature_names, to: :account
15
+
16
+ def display_name
17
+ name.presence || I18n.t('pageflow.admin.sites.default_name')
18
+ end
19
+
20
+ def name_with_account_prefix
21
+ [account.name, name].compact.join(' - ')
22
+ end
23
+
24
+ def host
25
+ Pageflow.config.site_url_options(self)&.dig(:host)
26
+ end
27
+
28
+ def cname_domain
29
+ cname.split('.').pop(2).join('.')
30
+ end
31
+
32
+ def first_paged_entry_template
33
+ entry_templates.find_or_initialize_by(entry_type_name: 'paged')
34
+ end
35
+
36
+ def existing_and_potential_entry_templates
37
+ entry_type_names = Pageflow.config_for(account).entry_types.map(&:name)
38
+
39
+ allowed_existing_entry_templates =
40
+ entry_templates.where(entry_type_name: entry_type_names)
41
+
42
+ free_type_names =
43
+ entry_type_names - allowed_existing_entry_templates.map(&:entry_type_name)
44
+
45
+ potential_entry_templates = free_type_names.map do |type_name|
46
+ entry_templates.build(entry_type_name: type_name)
47
+ end
48
+
49
+ allowed_existing_entry_templates + potential_entry_templates
50
+ end
51
+
52
+ # @deprecated Depending on what you need this for, consider
53
+ # scoping your code to an entry type or look at a specific entry's
54
+ # theme name.
55
+ def theme_name
56
+ first_paged_entry_template.theme_name
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
66
+ end
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
@@ -4,7 +4,7 @@ module Pageflow
4
4
  #
5
5
  # @since 15.7
6
6
  class ThemeCustomization < ApplicationRecord
7
- belongs_to :account
7
+ belongs_to :site
8
8
 
9
9
  serialize :overrides, JSON
10
10
  serialize :selected_file_ids, JSON
@@ -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
@@ -29,7 +29,7 @@ module Pageflow
29
29
  entry_creatable
30
30
  end
31
31
 
32
- def themings_accessible
32
+ def sites_accessible
33
33
  entry_creatable
34
34
  end
35
35
 
@@ -62,7 +62,7 @@ module Pageflow
62
62
  publish?
63
63
  end
64
64
 
65
- def update_theming_on_entry_of?
65
+ def update_site_on_entry_of?
66
66
  publish?
67
67
  end
68
68
 
@@ -127,9 +127,9 @@ module Pageflow
127
127
  publish_on_account_of?
128
128
  end
129
129
 
130
- def update_theming_on?
130
+ def update_site_on?
131
131
  user.admin? ||
132
- (!permissions_config.only_admins_may_update_theming &&
132
+ (!permissions_config.only_admins_may_update_site &&
133
133
  publish_on_account_of?)
134
134
  end
135
135
 
@@ -16,7 +16,7 @@ module Pageflow
16
16
  private
17
17
 
18
18
  def allows?(roles)
19
- @user.memberships.where(role: roles, entity: @entry_template.account).any?
19
+ @user.memberships.where(role: roles, entity: @entry_template.site.account).any?
20
20
  end
21
21
  end
22
22
  end
@@ -1,5 +1,5 @@
1
1
  module Pageflow
2
- class ThemingPolicy < ApplicationPolicy
2
+ class SitePolicy < ApplicationPolicy
3
3
  class Scope < Scope
4
4
  attr_reader :user, :scope
5
5
 
@@ -8,7 +8,7 @@ module Pageflow
8
8
  @scope = scope
9
9
  end
10
10
 
11
- def themings_allowed_for(accounts)
11
+ def sites_allowed_for(accounts)
12
12
  if user.admin?
13
13
  scope.all
14
14
  else
@@ -23,7 +23,7 @@ module Pageflow
23
23
  def publisher_memberships_for_accounts(user, accounts_ids)
24
24
  sanitize_sql_array(['LEFT OUTER JOIN pageflow_memberships ON ' \
25
25
  'pageflow_memberships.user_id = :user_id AND ' \
26
- 'pageflow_themings.account_id IN (:accounts_ids) AND ' \
26
+ 'pageflow_sites.account_id IN (:accounts_ids) AND ' \
27
27
  'pageflow_memberships.entity_id IN (:accounts_ids) AND ' \
28
28
  'pageflow_memberships.entity_type = \'Pageflow::Account\' AND ' \
29
29
  'pageflow_memberships.role IN (\'publisher\', \'manager\')',
@@ -35,19 +35,21 @@ module Pageflow
35
35
  end
36
36
  end
37
37
 
38
- def initialize(user, theming)
38
+ attr_reader :user
39
+
40
+ def initialize(user, site)
39
41
  @user = user
40
- @theming = theming
42
+ @account_role_query = AccountRoleQuery.new(user, site.account)
41
43
  end
42
44
 
43
- def edit?
44
- allows?(%w(publisher manager))
45
+ def read?
46
+ @user.admin? ||
47
+ (@account_role_query.has_at_least_role?(:manager) &&
48
+ Pageflow.config.allow_multiaccount_users)
45
49
  end
46
50
 
47
- private
48
-
49
- def allows?(roles)
50
- @user.memberships.where(role: roles, entity: @theming.account).any?
51
+ def update?
52
+ read?
51
53
  end
52
54
  end
53
55
  end
@@ -1,7 +1,7 @@
1
1
  h5(entry_template.translated_entry_type_name)
2
2
 
3
3
  extensible_attributes_table_for(entry_template,
4
- Pageflow.config_for(entry_template.account)
4
+ Pageflow.config_for(entry_template.site.account)
5
5
  .admin_attributes_table_rows.for(:entry_template)) do
6
6
  row :theme, class: 'theme' do
7
7
  entry_template.theme_name
@@ -10,29 +10,11 @@
10
10
  <% end %>
11
11
  <% end %>
12
12
 
13
- <%= f.semantic_fields_for :default_theming do |theming| %>
14
- <%= f.inputs do %>
15
- <%= theming.input :cname, hint: t('pageflow.admin.themings.cname_hint') %>
16
- <%= theming.input :additional_cnames, hint: t('pageflow.admin.themings.additional_cnames_hint') %>
17
- <%= theming.input :home_url, hint: t('pageflow.admin.themings.home_url_hint') %>
13
+ <% if resource.new_record? %>
14
+ <%= f.semantic_fields_for :default_site do |site| %>
15
+ <%= render 'admin/sites/fields', f: site, account_config: account_config %>
18
16
  <% end %>
19
-
20
- <%= f.inputs do %>
21
- <%= theming.input :imprint_link_label %>
22
- <%= theming.input :imprint_link_url %>
23
- <%= theming.input :copyright_link_label %>
24
- <%= theming.input :copyright_link_url %>
25
- <%= theming.input :privacy_link_url %>
26
-
27
- <% account_config.admin_form_inputs.find_all_for(:theming).each do |form_input| %>
28
- <%= form_input.build(theming) %>
29
- <% end %>
30
- <% end %>
31
- <% end %>
32
-
33
- <p>
34
- <%= t('pageflow.admin.accounts.entry_template_hint') %>
35
- </p>
17
+ <% end %>
36
18
 
37
19
  <%= f.actions do %>
38
20
  <%= f.action(:submit) %>
@@ -0,0 +1,5 @@
1
+ <li class="inline_help_item">
2
+ <p>
3
+ <%= t('pageflow.admin.accounts.site_defaults_inline_help') %>
4
+ </p>
5
+ </li>
@@ -1,7 +1,7 @@
1
1
  <%= admin_form_for([:admin, resource]) do |f| %>
2
2
  <%= f.inputs do %>
3
3
  <%= f.input(:title,
4
- hint: @entry.theming.permalink_directories.blank? &&
4
+ hint: @entry.site.permalink_directories.blank? &&
5
5
  I18n.t('pageflow.admin.entries.title_hint')) %>
6
6
 
7
7
  <% if authorized?(:update_account_on, resource) &&
@@ -16,18 +16,9 @@
16
16
  input_html: {class: 'entry_account_input'}) %>
17
17
  <%end %>
18
18
 
19
- <% if authorized?(:update_theming_on, resource) && !resource.new_record? %>
20
- <%= f.input(:theming,
21
- as: :searchable_select,
22
- ajax: {
23
- resource: Pageflow::Entry,
24
- collection_name: :eligible_themings,
25
- params: {
26
- entry_id: resource.id
27
- }
28
- },
29
- include_blank: false) %>
30
- <% end %>
19
+ <%= render('admin/entries/site_input',
20
+ entry: resource,
21
+ form: f) %>
31
22
 
32
23
  <%= f.fields_for(:permalink, @entry.permalink || Pageflow::Permalink.new) do |permalink| %>
33
24
  <%= render('admin/entries/permalink_inputs',
@@ -1,6 +1,5 @@
1
1
  <%= form.input(:permalink,
2
2
  as: :pageflow_permalink,
3
- base_url: pretty_theming_url(entry.theming),
4
- directory_collection: collection_for_permalink_directories(entry.theming,
5
- form.object),
3
+ base_url: pretty_site_url(entry.site),
4
+ site: entry.site,
6
5
  slug_placeholder: entry.default_permalink_slug) %>
@@ -0,0 +1,15 @@
1
+ <% if authorized?(:update_site_on, entry) %>
2
+ <%= form.input(:site,
3
+ as: :searchable_select,
4
+ ajax: {
5
+ resource: Pageflow::Entry,
6
+ collection_name: :eligible_sites,
7
+ params: {
8
+ account_id: entry.account_id
9
+ }
10
+ },
11
+ include_blank: false,
12
+ wrapper_html: {
13
+ style: ('display: none' if site_policy_scope.sites_allowed_for(entry.account).one?)
14
+ }) %>
15
+ <% end %>
@@ -1,4 +1,7 @@
1
1
  <%= fields_for(:entry, @entry, builder: ActiveAdmin::FormBuilder) do |form| %>
2
+ <%= render('admin/entries/site_input',
3
+ entry: @entry,
4
+ form: form) %>
2
5
  <%= render('pageflow/admin/entries/entry_type_name_input',
3
6
  form: form,
4
7
  entry_types: Pageflow.config_for(@entry.account).entry_types) %>
@@ -4,7 +4,7 @@
4
4
 
5
5
  <%= f.inputs do %>
6
6
  <%= f.semantic_errors :entry_type_name %>
7
- <%= render('admin/accounts/theming_defaults_inline_help') %>
7
+ <%= render('admin/accounts/site_defaults_inline_help') %>
8
8
  <%= f.hidden_field :entry_type_name, value: entry_type_name %>
9
9
  <%= f.input :default_locale,
10
10
  as: :select,
@@ -12,15 +12,15 @@
12
12
  collection: Pageflow.config.available_public_locales.map{ |locale|
13
13
  [t('pageflow.public._language', locale: locale), locale.to_s]
14
14
  },
15
- hint: t('pageflow.admin.themings.default_locale_hint') %>
15
+ hint: t('pageflow.admin.sites.default_locale_hint') %>
16
16
  <%= f.input :default_author,
17
- hint: t('pageflow.admin.themings.default_author_hint'),
17
+ hint: t('pageflow.admin.sites.default_author_hint'),
18
18
  placeholder: Pageflow.config.default_author_meta_tag %>
19
19
  <%= f.input :default_publisher,
20
- hint: t('pageflow.admin.themings.default_publisher_hint'),
20
+ hint: t('pageflow.admin.sites.default_publisher_hint'),
21
21
  placeholder: Pageflow.config.default_publisher_meta_tag %>
22
22
  <%= f.input :default_keywords,
23
- hint: t('pageflow.admin.themings.default_keywords_hint'),
23
+ hint: t('pageflow.admin.sites.default_keywords_hint'),
24
24
  placeholder: Pageflow.config.default_keywords_meta_tag %>
25
25
  <%= render('admin/accounts/share_providers_label') %>
26
26
  <%= f.semantic_fields_for :share_providers,
@@ -0,0 +1,12 @@
1
+ extensible_attributes_table_for(site,
2
+ Pageflow.config_for(site.account)
3
+ .admin_attributes_table_rows.for(:site)) do
4
+ row :title
5
+ row :host, class: 'host'
6
+ row :account, class: 'account' do
7
+ link_to(site.account.name,
8
+ admin_account_path(site.account, tab: 'sites'))
9
+ end
10
+ row :feeds_enabled
11
+ row :sitemap_enabled
12
+ end
@@ -0,0 +1,23 @@
1
+ <%= f.inputs do %>
2
+ <%= f.input :title, hint: t('pageflow.admin.sites.title_hint') %>
3
+ <%= f.input :cname, hint: t('pageflow.admin.sites.cname_hint') %>
4
+ <%= f.input :additional_cnames, hint: t('pageflow.admin.sites.additional_cnames_hint') %>
5
+ <%= f.input :home_url, hint: t('pageflow.admin.sites.home_url_hint') %>
6
+ <% end %>
7
+
8
+ <%= f.inputs do %>
9
+ <%= f.input :imprint_link_label %>
10
+ <%= f.input :imprint_link_url %>
11
+ <%= f.input :copyright_link_label %>
12
+ <%= f.input :copyright_link_url %>
13
+ <%= f.input :privacy_link_url %>
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
+
20
+ <% account_config.admin_form_inputs.find_all_for(:site).each do |form_input| %>
21
+ <%= form_input.build(f) %>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= admin_form_for [:admin, parent, resource] do |f| %>
2
+ <%= f.inputs :name %>
3
+ <%= render 'fields', f: f, account_config: Pageflow.config_for(resource.account) %>
4
+ <%= f.actions :submit, :cancel %>
5
+ <% end %>
@@ -1,8 +1,7 @@
1
1
  module Pageflow
2
2
  module Admin
3
3
  class EntriesTab < ViewComponent
4
- def build(theming)
5
- account = theming.account
4
+ def build(account)
6
5
  embedded_index_table(account.entries,
7
6
  blank_slate_text: I18n.t('pageflow.admin.entries.no_members')) do
8
7
  table_for_collection(sortable: true, class: 'entries', i18n: Pageflow::Entry) do