pageflow 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (145) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/images/pageflow/audio_loop_pictogram.png +0 -0
  3. data/app/assets/images/pageflow/audio_loop_pictogram_small.png +0 -0
  4. data/app/assets/images/pageflow/ov-internal_links.png +0 -0
  5. data/app/assets/images/pageflow/placeholder_link_thumbnail.jpg +0 -0
  6. data/app/assets/images/pageflow/placeholder_link_thumbnail_large.jpg +0 -0
  7. data/app/assets/images/pageflow/placeholder_thumbnail.jpg +0 -0
  8. data/app/assets/javascripts/pageflow/audio_player.js +5 -0
  9. data/app/assets/javascripts/pageflow/editor/api.js +4 -0
  10. data/app/assets/javascripts/pageflow/editor/api/file_type.js +32 -0
  11. data/app/assets/javascripts/pageflow/editor/api/file_types.js +73 -0
  12. data/app/assets/javascripts/pageflow/editor/base.js +5 -0
  13. data/app/assets/javascripts/pageflow/editor/collections/file_usages_collection.js +13 -1
  14. data/app/assets/javascripts/pageflow/editor/collections/files_collection.js +54 -0
  15. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +2 -14
  16. data/app/assets/javascripts/pageflow/editor/initializers/error_listener.js +8 -0
  17. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +5 -3
  18. data/app/assets/javascripts/pageflow/editor/initializers/setup_file_types.js +21 -0
  19. data/app/assets/javascripts/pageflow/editor/models/audio_file.js +1 -15
  20. data/app/assets/javascripts/pageflow/editor/models/encoded_file.js +32 -0
  21. data/app/assets/javascripts/pageflow/editor/models/entry.js +29 -63
  22. data/app/assets/javascripts/pageflow/editor/models/file_stage.js +7 -6
  23. data/app/assets/javascripts/pageflow/editor/models/hosted_file.js +20 -0
  24. data/app/assets/javascripts/pageflow/editor/models/image_file.js +8 -31
  25. data/app/assets/javascripts/pageflow/editor/models/mixins/file_with_type.js +3 -0
  26. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +11 -5
  27. data/app/assets/javascripts/pageflow/editor/models/mixins/transient_references.js +5 -0
  28. data/app/assets/javascripts/pageflow/editor/models/other_entry.js +9 -3
  29. data/app/assets/javascripts/pageflow/editor/models/page.js +9 -11
  30. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +65 -0
  31. data/app/assets/javascripts/pageflow/editor/models/video_file.js +1 -14
  32. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +2 -9
  33. data/app/assets/javascripts/pageflow/editor/templates/file_item.jst.ejs +1 -1
  34. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +4 -0
  35. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +23 -0
  36. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +4 -0
  37. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +4 -0
  38. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +4 -0
  39. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +4 -0
  40. data/app/assets/javascripts/pageflow/editor/views/embedded/page_link_embedded_view.js +1 -1
  41. data/app/assets/javascripts/pageflow/editor/views/explorer_file_item_view.js +2 -0
  42. data/app/assets/javascripts/pageflow/editor/views/file_item_view.js +8 -1
  43. data/app/assets/javascripts/pageflow/editor/views/file_stage_item_view.js +8 -1
  44. data/app/assets/javascripts/pageflow/editor/views/files_explorer_view.js +11 -43
  45. data/app/assets/javascripts/pageflow/editor/views/files_view.js +11 -21
  46. data/app/assets/javascripts/pageflow/editor/views/input_view.js +1 -1
  47. data/app/assets/javascripts/pageflow/editor/views/inputs/file_input_view.js +6 -0
  48. data/app/assets/javascripts/pageflow/editor/views/inputs/select_input_view.js +5 -0
  49. data/app/assets/javascripts/pageflow/editor/views/mixins/selectable_view.js +7 -5
  50. data/app/assets/javascripts/pageflow/editor/views/uploader_view.js +15 -5
  51. data/app/assets/javascripts/pageflow/page_types/audio.js +1 -1
  52. data/app/assets/javascripts/pageflow/page_types/audio_loop.js +90 -0
  53. data/app/assets/javascripts/pageflow/page_types/video.js +1 -1
  54. data/app/assets/javascripts/pageflow/ready.js +17 -2
  55. data/app/assets/javascripts/pageflow/video_player/player_buffered_patch.js +13 -2
  56. data/app/assets/stylesheets/pageflow/mixins/pageflow.css.scss +9 -0
  57. data/app/assets/stylesheets/pageflow/mixins/shadow.css.scss +12 -1
  58. data/app/assets/stylesheets/pageflow/overview.css.scss +3 -3
  59. data/app/assets/stylesheets/pageflow/page_types.css.scss +2 -0
  60. data/app/assets/stylesheets/pageflow/page_types/audio.css.scss +2 -13
  61. data/app/assets/stylesheets/pageflow/page_types/audio_loop.css.scss +0 -0
  62. data/app/assets/stylesheets/pageflow/page_types/video.css.scss +4 -0
  63. data/app/assets/stylesheets/pageflow/player_controls.css.scss +72 -6
  64. data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +3 -0
  65. data/app/assets/stylesheets/pageflow/themes/default/overview.css.scss +3 -0
  66. data/app/controllers/pageflow/editor/files_controller.rb +11 -24
  67. data/app/controllers/pageflow/{video_files_controller.rb → files_controller.rb} +6 -2
  68. data/app/helpers/pageflow/audio_files_helper.rb +40 -0
  69. data/app/helpers/pageflow/file_thumbnails_helper.rb +18 -0
  70. data/app/helpers/pageflow/pages_helper.rb +3 -24
  71. data/app/jobs/pageflow/upload_file_to_s3_job.rb +2 -2
  72. data/app/models/concerns/pageflow/hosted_file.rb +93 -0
  73. data/app/models/pageflow/audio_file.rb +1 -12
  74. data/app/models/pageflow/draft_entry.rb +2 -11
  75. data/app/models/pageflow/image_file.rb +14 -14
  76. data/app/models/pageflow/page.rb +7 -24
  77. data/app/models/pageflow/published_entry.rb +3 -2
  78. data/app/models/pageflow/revision.rb +7 -0
  79. data/app/models/pageflow/thumbnail_file_resolver.rb +33 -0
  80. data/app/models/pageflow/video_file.rb +10 -34
  81. data/app/models/pageflow/zencoder_attachment.rb +2 -2
  82. data/app/state_machines/pageflow/encoded_file_state_machine.rb +8 -20
  83. data/app/state_machines/pageflow/image_file_state_machine.rb +4 -0
  84. data/app/views/pageflow/audio_files/_audio_file.html.erb +1 -0
  85. data/app/views/pageflow/audio_files/_script_tag.html.erb +3 -0
  86. data/app/views/pageflow/config/_editor_seeds.json.jbuilder +1 -0
  87. data/app/views/pageflow/editor/audio_files/_audio_file.json.jbuilder +0 -6
  88. data/app/views/pageflow/editor/files/_file.json.jbuilder +16 -0
  89. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  90. data/app/views/pageflow/editor/files/index.json.jbuilder +4 -1
  91. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -8
  92. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +0 -8
  93. data/app/views/pageflow/entries/_entry.html.erb +2 -2
  94. data/app/views/pageflow/entries/_multimedia_alert.html.erb +14 -7
  95. data/app/views/pageflow/entries/_social_meta_tags.html.erb +1 -1
  96. data/app/views/pageflow/entries/edit.html.erb +6 -4
  97. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +1 -1
  98. data/app/views/pageflow/entries/navigation/_page.html.erb +2 -2
  99. data/app/views/pageflow/entries/overview/_chapter.html.erb +3 -1
  100. data/app/views/pageflow/entries/overview/_entry.html.erb +2 -1
  101. data/app/views/pageflow/entries/overview/_page.html.erb +1 -1
  102. data/app/views/pageflow/entries/show.css.erb +1 -21
  103. data/app/views/pageflow/entries/show.json.jbuilder +8 -3
  104. data/app/views/pageflow/file_types/_thumbnails.css.erb +7 -0
  105. data/app/views/pageflow/files/show.html.erb +1 -0
  106. data/app/views/pageflow/page_types/_page_type.json.jbuilder +4 -0
  107. data/app/views/pageflow/pages/templates/_audio.html.erb +6 -5
  108. data/app/views/pageflow/pages/templates/_audio_loop.html.erb +34 -0
  109. data/app/views/pageflow/video_files/_video_file.html.erb +1 -0
  110. data/config/initializers/page_type_helpers.rb +2 -2
  111. data/config/initializers/paperclip.rb +32 -0
  112. data/config/initializers/zencoder.rb +3 -3
  113. data/config/locales/activerecord.de.yml +3 -2
  114. data/config/locales/pageflow/audio.de.yml +4 -0
  115. data/config/locales/pageflow/editor/errors.de.yml +6 -0
  116. data/config/routes.rb +4 -10
  117. data/lib/generators/pageflow/initializer/templates/pageflow.rb +2 -1
  118. data/lib/pageflow.rb +5 -3
  119. data/lib/pageflow/ability_mixin.rb +2 -2
  120. data/lib/pageflow/built_in_page_type.rb +40 -7
  121. data/lib/pageflow/configuration.rb +17 -0
  122. data/lib/pageflow/file_type.rb +60 -0
  123. data/lib/pageflow/file_types.rb +25 -0
  124. data/lib/pageflow/page_type.rb +31 -0
  125. data/lib/pageflow/version.rb +1 -1
  126. data/lib/pageflow/zencoder_video_output_definition.rb +3 -3
  127. data/spec/factories/audio_files.rb +2 -2
  128. data/spec/factories/hosted_files.rb +35 -0
  129. data/spec/factories/video_files.rb +2 -2
  130. metadata +37 -18
  131. data/app/assets/images/pageflow/themes/default/logo_navi.png +0 -0
  132. data/app/assets/images/pageflow/themes/default/logo_navi_invert.png +0 -0
  133. data/app/assets/javascripts/pageflow/editor/collections/audio_files_collection.js +0 -7
  134. data/app/assets/javascripts/pageflow/editor/collections/image_files_collection.js +0 -8
  135. data/app/assets/javascripts/pageflow/editor/collections/mixins/files_collection.js +0 -42
  136. data/app/assets/javascripts/pageflow/editor/collections/video_files_collection.js +0 -8
  137. data/app/assets/javascripts/pageflow/editor/models/mixins/encoded_file.js +0 -51
  138. data/app/assets/javascripts/pageflow/editor/models/mixins/file.js +0 -31
  139. data/app/assets/javascripts/pageflow/editor/views/audio_file_item_view.js +0 -14
  140. data/app/assets/javascripts/pageflow/editor/views/image_file_item_view.js +0 -10
  141. data/app/assets/javascripts/pageflow/editor/views/video_file_item_view.js +0 -18
  142. data/app/controllers/pageflow/editor/audio_files_controller.rb +0 -11
  143. data/app/controllers/pageflow/editor/image_files_controller.rb +0 -11
  144. data/app/controllers/pageflow/editor/video_files_controller.rb +0 -11
  145. data/app/views/pageflow/video_files/show.html.erb +0 -1
@@ -122,14 +122,14 @@ de:
122
122
  description: "Beschreibung für Übersicht"
123
123
  additional_title: "Titel für Infobox"
124
124
  additional_description: "Beschreibung für Infobox"
125
- gradient_opacity: "Intensität des Farverlaufs"
125
+ gradient_opacity: "Intensität des Farbverlaufs"
126
126
  invert: "Farben invertieren"
127
127
  transition: "Übergangseffekt"
128
128
  display_in_navigation: "In Navigationsleiste anzeigen"
129
129
  allow_full_screen: "Vollbild Anzeige erlauben"
130
130
  autoplay: "automatisch abspielen"
131
131
  background_image_id: "Hintergrundbild"
132
- thumbnail_image_id: "Hintergrundbild"
132
+ thumbnail_image_id: "Thumbnail"
133
133
  background_video_id: "Hintergrundvideo"
134
134
  video_file_id: "Video"
135
135
  audio_file_id: "Audio"
@@ -164,6 +164,7 @@ de:
164
164
  background_video: "Hintergrund-Video"
165
165
  video: "Video"
166
166
  audio: "Audio"
167
+ audio_loop: "Hintergrund-Audio"
167
168
  internal_links: "Seiten-Verweise"
168
169
  transition:
169
170
  scroll: "Scrollen"
@@ -0,0 +1,4 @@
1
+ de:
2
+ pageflow:
3
+ audio:
4
+ open: "Audio anhören"
@@ -0,0 +1,6 @@
1
+ de:
2
+ pageflow:
3
+ editor:
4
+ errors:
5
+ unknown: "Ein unbekannter Fehler ist aufgetreten."
6
+ "UnmatchedUploadError": "Der Dateityp wird nicht unterstützt."
data/config/routes.rb CHANGED
@@ -24,19 +24,12 @@ Pageflow::Engine.routes.draw do
24
24
 
25
25
  namespace :editor do
26
26
  resources :entries, :only => :index, :shallow => true do
27
- resources :image_files, :only => [:index, :create, :update] do
28
- get :retry, :on => :member
29
- end
30
-
31
- resources :video_files, :only => [:index, :create, :update] do
32
- get :retry, :on => :member
33
- end
34
-
35
- resources :audio_files, :only => [:index, :create, :update] do
27
+ resources :files, :path => 'files/:collection_name', :only => [:index, :create, :update] do
36
28
  get :retry, :on => :member
37
29
  end
38
30
 
39
31
  resources :file_usages, :only => [:create, :destroy]
32
+
40
33
  resources :encoding_confirmations, :only => [:create] do
41
34
  post :check, :on => :collection
42
35
  end
@@ -50,7 +43,8 @@ Pageflow::Engine.routes.draw do
50
43
  root :to => redirect('/admin')
51
44
  end
52
45
 
53
- get ':entry_id/videos/:id', :to => 'video_files#show', :as => :short_video_file
46
+ get ':entry_id/videos/:id', :to => 'files#show', :as => :short_video_file, :defaults => {:collection_name => 'video_files'}
47
+ get ':entry_id/audio/:id', :to => 'files#show', :as => :short_audio_file, :defaults => {:collection_name => 'audio_files'}
54
48
 
55
49
  resources :entries, :only => [:show]
56
50
  get ':id', :to => 'entries#show', :as => :short_entry
@@ -4,7 +4,7 @@ ActiveAdmin.application.load_paths.unshift(Dir[Pageflow::Engine.root.join('admin
4
4
  Pageflow.configure do |config|
5
5
  # The email address to use as from header in invitation mails to new
6
6
  # users.
7
- config.mailer_sender = 'change-me-in-at-config-initializers-pageflow@example.com'
7
+ config.mailer_sender = 'change-me-at-config-initializers-pageflow@example.com'
8
8
 
9
9
  # Page types available in the editor. Add futher page types from
10
10
  # page type engines below.
@@ -12,6 +12,7 @@ Pageflow.configure do |config|
12
12
  config.register_page_type(Pageflow::BuiltInPageType.background_video)
13
13
  config.register_page_type(Pageflow::BuiltInPageType.video)
14
14
  config.register_page_type(Pageflow::BuiltInPageType.audio)
15
+ config.register_page_type(Pageflow::BuiltInPageType.audio_loop)
15
16
  config.register_page_type(Pageflow::BuiltInPageType.internal_links)
16
17
  # config.register_page_type(Pageflow::Rainbow::PageType.new)
17
18
 
data/lib/pageflow.rb CHANGED
@@ -20,16 +20,18 @@ module Pageflow
20
20
  def self.configure!
21
21
  return unless @finalized
22
22
 
23
- @config = Configuration.new
23
+ config = Configuration.new
24
24
  @configure_blocks ||= []
25
25
 
26
26
  @configure_blocks.each do |block|
27
- block.call(@config)
27
+ block.call(config)
28
28
  end
29
29
 
30
30
  @after_configure_blocks.each do |block|
31
- block.call(@config)
31
+ block.call(config)
32
32
  end
33
+
34
+ @config = config
33
35
  end
34
36
 
35
37
  def self.finalize!
@@ -17,7 +17,7 @@ module Pageflow
17
17
  can_edit_entry?(user, record.entry)
18
18
  end
19
19
 
20
- can :manage, [ImageFile, VideoFile, AudioFile] do |record|
20
+ can :manage, Pageflow.config.file_types.map(&:model) do |record|
21
21
  can_edit_any_entry_using_file?(user, record)
22
22
  end
23
23
 
@@ -47,7 +47,7 @@ module Pageflow
47
47
  can :manage, Folder
48
48
  can :manage, [Entry, Revision]
49
49
  can :manage, [Chapter, Page]
50
- can :manage, [ImageFile, VideoFile, AudioFile]
50
+ can :manage, Pageflow.config.file_types.map(&:model)
51
51
 
52
52
  can :manage, Resque
53
53
  elsif user.account_manager?
@@ -1,10 +1,23 @@
1
1
  module Pageflow
2
2
  # Definition of page type located inside the Pageflow gem.
3
3
  class BuiltInPageType < PageType
4
- attr_reader :name
4
+ attr_reader :name, :file_type_models
5
5
 
6
- def initialize(name)
6
+ def initialize(name, options = {})
7
7
  @name = name.to_s
8
+ @file_type_models = options.fetch(:file_type_models, [])
9
+ @thumbnail_candidates = options.fetch(:thumbnail_candidates, nil)
10
+ end
11
+
12
+ def file_types
13
+ @file_types ||= file_type_models.map do |model_name|
14
+ model = model_name.constantize
15
+ base_name = model_name.underscore.split('/').last
16
+
17
+ FileType.new(model: model,
18
+ editor_partial: "pageflow/editor/#{base_name.pluralize}/#{base_name}",
19
+ collection_name: base_name.pluralize)
20
+ end
8
21
  end
9
22
 
10
23
  def template_path
@@ -15,28 +28,48 @@ module Pageflow
15
28
  "activerecord.values.pageflow/page.template.#{name}"
16
29
  end
17
30
 
31
+ def thumbnail_candidates
32
+ @thumbnail_candidates.presence || super
33
+ end
34
+
18
35
  # Factory methods to decouple Pageflow initializers from concrete
19
36
  # page type classes, so we might decide later to create a
20
37
  # VideoPageType subclass etc.
21
38
 
22
39
  def self.audio
23
- new('audio')
40
+ new('audio', file_type_models: ['Pageflow::ImageFile', 'Pageflow::AudioFile'])
41
+ end
42
+
43
+ def self.audio_loop
44
+ new('audio_loop', file_type_models: ['Pageflow::ImageFile', 'Pageflow::AudioFile'])
24
45
  end
25
46
 
26
47
  def self.background_image
27
- new('background_image')
48
+ new('background_image', file_type_models: ['Pageflow::ImageFile'])
28
49
  end
29
50
 
30
51
  def self.background_video
31
- new('background_video')
52
+ new('background_video',
53
+ file_type_models: ['Pageflow::ImageFile', 'Pageflow::VideoFile'],
54
+ thumbnail_candidates: video_thumbnail_candidates)
32
55
  end
33
56
 
34
57
  def self.internal_links
35
- new('internal_links')
58
+ new('internal_links', file_type_models: ['Pageflow::ImageFile'])
36
59
  end
37
60
 
38
61
  def self.video
39
- new('video')
62
+ new('video',
63
+ file_type_models: ['Pageflow::ImageFile', 'Pageflow::VideoFile'],
64
+ thumbnail_candidates: video_thumbnail_candidates)
65
+ end
66
+
67
+ def self.video_thumbnail_candidates
68
+ [
69
+ {file_collection: 'image_files', attribute: 'thumbnail_image_id'},
70
+ {file_collection: 'image_files', attribute: 'poster_image_id'},
71
+ {file_collection: 'video_files', attribute: 'video_file_id'}
72
+ ]
40
73
  end
41
74
  end
42
75
  end
@@ -60,6 +60,19 @@ module Pageflow
60
60
  # @return [Themes]
61
61
  attr_reader :themes
62
62
 
63
+ # List of {FileType} instances provided by page types.
64
+ # @return [FileTypes]
65
+ attr_reader :file_types
66
+
67
+ # Paperclip style definitions of thumbnails used by Pageflow.
68
+ # @return Hash
69
+ attr_accessor :thumbnail_styles
70
+
71
+ # Names of Paperclip styles that shall be rendered into entry
72
+ # specific stylesheets.
73
+ # @return Array<Symbol>
74
+ attr_accessor :css_rendered_thumbnail_styles
75
+
63
76
  # Either a lambda or an object with a `match?` method, to restrict
64
77
  # access to the editor routes defined by Pageflow.
65
78
  #
@@ -133,6 +146,10 @@ module Pageflow
133
146
  @hooks = Hooks.new
134
147
  @quotas = Quotas.new
135
148
  @themes = Themes.new
149
+ @file_types = FileTypes.new(page_types)
150
+
151
+ @thumbnail_styles = {}
152
+ @css_rendered_thumbnail_styles = Pageflow::PagesHelper::CSS_RENDERED_THUMBNAIL_STYLES
136
153
 
137
154
  @theming_request_scope = CnameThemingRequestScope.new
138
155
  @public_entry_request_scope = lambda { |entries, request| entries }
@@ -0,0 +1,60 @@
1
+ module Pageflow
2
+ # Describes a type of file that can be managed in the editor and
3
+ # used in revisions.
4
+ class FileType
5
+ class NotFoundError < RuntimeError
6
+ end
7
+
8
+ # ActiveRecord model that represents the files of this type.
9
+ # @return {ActiveRecord::Model}
10
+ attr_reader :model
11
+
12
+ # Path of the partial used to render a json representation of the
13
+ # file.
14
+ # @return {String}
15
+ attr_reader :editor_partial
16
+
17
+ # Underscored plural name for usage in routes.
18
+ # @return {String}
19
+ attr_reader :collection_name
20
+
21
+ # Create file type to be returned in {PageType#file_types}.
22
+ #
23
+ # @example
24
+ #
25
+ # Pageflow::FileType.new(model: Pageflow::Rainbow::File,
26
+ # editor_partial: 'pageflow/rainbow/editor/files/file')
27
+ #
28
+ # @param [Hash] options
29
+ # @option options [ActiveRecord::Base] :model Required. Model
30
+ # representing the file.
31
+ # @option options [String] :editor_partial Optional. Path of a
32
+ # partial to include in json representations of the file.
33
+ # @option options [String] :collection_name Optional. String to
34
+ # be used in routes. Defaults to `"pageflow_rainbow_file"` for
35
+ # model `Pageflow::Rainbow::File`.
36
+ def initialize(options)
37
+ @model = options.fetch(:model)
38
+ @editor_partial = options.fetch(:editor_partial, nil)
39
+ @collection_name = options.fetch(:collection_name, model.model_name.plural)
40
+ end
41
+
42
+ # @api private
43
+ def param_key
44
+ model.model_name.param_key.to_sym
45
+ end
46
+
47
+ # @api private
48
+ alias_method :short_name, :param_key
49
+
50
+ # @api private
51
+ def type_name
52
+ model.name
53
+ end
54
+
55
+ # @api private
56
+ def i18n_key
57
+ model.model_name.i18n_key
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,25 @@
1
+ module Pageflow
2
+ class FileTypes
3
+ include Enumerable
4
+
5
+ def initialize(page_types)
6
+ @page_types = page_types
7
+ end
8
+
9
+ def each(&block)
10
+ @page_types.map(&:file_types).flatten.uniq(&:model).each(&block)
11
+ end
12
+
13
+ def find_by_collection_name!(collection_name)
14
+ detect do |file_type|
15
+ file_type.collection_name == collection_name
16
+ end || raise(FileType::NotFoundError, "No file type found for collection name '#{collection_name}'.")
17
+ end
18
+
19
+ def with_thumbnail_support
20
+ select do |file_type|
21
+ file_type.model.instance_methods.include?(:thumbnail_url)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -66,6 +66,37 @@ module Pageflow
66
66
  []
67
67
  end
68
68
 
69
+ # File types to enable when this page type is registered..
70
+ # @returns {Array<FileType>}
71
+ def file_types
72
+ []
73
+ end
74
+
75
+ # A list of hashes used to determine a thumbnail for a page. Each
76
+ # hash in the list must contain two keys: `attribute` and
77
+ # `file_collection`.
78
+ #
79
+ # For each item, the given attribute is fetched from the page
80
+ # configuration and used to find a file from the given
81
+ # collection. `file_collection` must equal the collection_name of
82
+ # a registered {FileType}. The first file found is used as
83
+ # thumbnail.
84
+ #
85
+ # @example Default return value
86
+ #
87
+ # [
88
+ # {attribute: 'thumbnail_image_id', file_collection: 'image_files'},
89
+ # {attribute: 'background_image_id', file_collection: 'image_files'}
90
+ # ]
91
+ #
92
+ # @returns {Array<Hash>}
93
+ def thumbnail_candidates
94
+ [
95
+ {attribute: 'thumbnail_image_id', file_collection: 'image_files'},
96
+ {attribute: 'background_image_id', file_collection: 'image_files'}
97
+ ]
98
+ end
99
+
69
100
  # View path of a template containing additional json to pass to
70
101
  # the editor. The data is available in the javascript definition
71
102
  # of the page type's configuration editor. By default nothing is
@@ -1,3 +1,3 @@
1
1
  module Pageflow
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -169,15 +169,15 @@ module Pageflow
169
169
  def hls_stream_definitions
170
170
  [
171
171
  {
172
- :path => video_file.hls_medium.url(default_protocol: 'http'),
172
+ :path => video_file.hls_medium.url(host: :hls_origin, default_protocol: 'http'),
173
173
  :bandwidth => 2250
174
174
  },
175
175
  {
176
- :path => video_file.hls_low.url(default_protocol: 'http'),
176
+ :path => video_file.hls_low.url(host: :hls_origin, default_protocol: 'http'),
177
177
  :bandwidth => 256
178
178
  },
179
179
  {
180
- :path => video_file.hls_high.url(default_protocol: 'http'),
180
+ :path => video_file.hls_high.url(host: :hls_origin, default_protocol: 'http'),
181
181
  :bandwidth => 3750
182
182
  }
183
183
  ]
@@ -24,10 +24,10 @@ module Pageflow
24
24
  state 'not_uploaded_to_s3'
25
25
  end
26
26
 
27
- trait :upload_to_s3_failed do
27
+ trait :uploading_to_s3_failed do
28
28
  attachment_on_filesystem File.open(Engine.root.join('spec', 'fixtures', 'et.ogg'))
29
29
  attachment_on_s3 nil
30
- state 'upload_to_s3_failed'
30
+ state 'uploading_to_s3_failed'
31
31
  end
32
32
 
33
33
  trait :waiting_for_confirmation do
@@ -0,0 +1,35 @@
1
+ module Pageflow
2
+ FactoryGirl.define do
3
+ hosted_file_model = Class.new(ActiveRecord::Base) do
4
+ self.table_name = 'test_hosted_files'
5
+ include HostedFile
6
+ end
7
+
8
+ factory :hosted_file, class: hosted_file_model do
9
+ trait :on_filesystem do
10
+ attachment_on_filesystem File.open(Engine.root.join('spec', 'fixtures', 'image.png'))
11
+ attachment_on_s3 nil
12
+ state 'not_uploaded_to_s3'
13
+ end
14
+
15
+ trait :uploading_to_s3_failed do
16
+ attachment_on_filesystem File.open(Engine.root.join('spec', 'fixtures', 'image.png'))
17
+ attachment_on_s3 nil
18
+ state 'uploading_to_s3_failed'
19
+ end
20
+
21
+ trait :uploaded_to_s3 do
22
+ attachment_on_s3 File.open(Engine.root.join('spec', 'fixtures', 'image.png'))
23
+ state 'uploaded_to_s3'
24
+ end
25
+
26
+ trait :with_overridden_keep_on_filesystem do
27
+ after(:build) do |hosted_file|
28
+ def hosted_file.keep_on_filesystem_after_upload_to_s3?
29
+ true
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end