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
@@ -2,15 +2,16 @@ pageflow.FileStage = Backbone.Model.extend({
2
2
  initialize: function(attributes, options) {
3
3
  this.file = options.file;
4
4
 
5
- this.activeStates = options.activeStates;
6
- this.finishedStates = options.finishedStates;
7
- this.failedStates = options.failedStates;
5
+ this.activeStates = options.activeStates || [];
6
+ this.finishedStates = options.finishedStates || [];
7
+ this.failedStates = options.failedStates || [];
8
8
  this.actionRequiredStates = options.actionRequiredStates || [];
9
9
 
10
+ this.nonFinishedStates = this.activeStates.concat(this.failedStates, this.actionRequiredStates);
11
+
10
12
  this.update();
11
13
  this.listenTo(this.file, 'change:state', this.update);
12
- this.listenTo(this.file, 'change:encoding_progress', this.update);
13
- this.listenTo(this.file, 'change:uploading_progress', this.update);
14
+ this.listenTo(this.file, 'change:' + this.get('name') + '_progress', this.update);
14
15
  },
15
16
 
16
17
  update: function() {
@@ -49,7 +50,7 @@ pageflow.FileStage = Backbone.Model.extend({
49
50
  },
50
51
 
51
52
  updateErrorMessage: function() {
52
- var errorMessageAttribute = this.get('name').replace('_failed', '') + '_error_message';
53
+ var errorMessageAttribute = this.get('name') + '_error_message';
53
54
  this.set('error_message', this.file.get(errorMessageAttribute));
54
55
  },
55
56
 
@@ -0,0 +1,20 @@
1
+ pageflow.HostedFile = pageflow.UploadedFile.extend({
2
+ stages: function() {
3
+ return [
4
+ {
5
+ name: 'uploading',
6
+ activeStates: ['uploading'],
7
+ failedStates: ['upload_failed']
8
+ },
9
+ {
10
+ name: 'uploading_to_s3',
11
+ activeStates: ['uploading_to_s3'],
12
+ failedStates: ['uploading_to_s3_failed']
13
+ }
14
+ ].concat(_.result(this, 'processingStages'));
15
+ },
16
+
17
+ processingStages: [],
18
+
19
+ readyState: 'uploaded_to_s3'
20
+ });
@@ -1,42 +1,19 @@
1
- pageflow.ImageFile = Backbone.Model.extend({
2
- modelName: 'image_file',
3
- paramRoot: 'image_file',
4
- i18nKey: 'pageflow/image_file',
5
-
6
- mixins: [pageflow.file, pageflow.stageProvider, pageflow.retryable],
7
-
8
- stageMapping: {
9
- uploading: {
1
+ pageflow.ImageFile = pageflow.UploadedFile.extend({
2
+ stages: [
3
+ {
4
+ name: 'uploading',
10
5
  activeStates: ['uploading'],
11
- finishedStates: ['processing', 'processed', 'processing_failed'],
12
6
  failedStates: ['upload_failed']
13
7
  },
14
- processing: {
8
+ {
9
+ name: 'processing',
15
10
  activeStates: ['processing'],
16
11
  finishedStates: ['processed'],
17
12
  failedStates: ['processing_failed']
18
13
  }
19
- },
20
-
21
- urlRoot: function() {
22
- return this.isNew() ? this.collection.url() : '/editor/image_files';
23
- },
24
-
25
- isReady: function() {
26
- return this.get('state') === 'processed';
27
- },
28
-
29
- isPending: function() {
30
- return this.get('state') === 'processing';
31
- },
32
-
33
- isRetryable: function() {
34
- return this.get('state') === 'processing_failed';
35
- },
14
+ ],
36
15
 
37
- isConfirmable: function() {
38
- return false;
39
- },
16
+ readyState: 'processed',
40
17
 
41
18
  isPositionable: function() {
42
19
  return this.isReady();
@@ -0,0 +1,3 @@
1
+ pageflow.fileWithType = {
2
+
3
+ };
@@ -1,12 +1,18 @@
1
1
  pageflow.stageProvider = {
2
2
  initialize: function() {
3
- this.stages = new Backbone.Collection(_.chain(this).result('stageMapping').pairs().map(function (pair) {
4
- var name = pair[0];
5
- var options = pair[1];
3
+ var finishedStates = [this.readyState];
4
+
5
+ this.stages = new Backbone.Collection(_.chain(this).result('stages').slice().reverse().map(function (options) {
6
+ var name = options.name;
6
7
 
7
8
  options.file = this;
8
- return new pageflow.FileStage({name: name}, options);
9
- }, this).value());
9
+ options.finishedStates = finishedStates;
10
+
11
+ var fileStage = new pageflow.FileStage({name: name}, options);
12
+ finishedStates = finishedStates.concat(fileStage.nonFinishedStates);
13
+
14
+ return fileStage;
15
+ }, this).reverse().value());
10
16
  },
11
17
 
12
18
  currentStage: function() {
@@ -5,6 +5,11 @@ pageflow.transientReferences = {
5
5
  },
6
6
 
7
7
  getReference: function(attribute, collection) {
8
+ if (typeof collection === 'string') {
9
+ var fileType = pageflow.editor.fileTypes.findByCollectionName(collection);
10
+ collection = pageflow.entry.getFileCollection(fileType);
11
+ }
12
+
8
13
  return this.transientReferences[attribute] ||
9
14
  collection.get(this.get(attribute));
10
15
  },
@@ -5,9 +5,15 @@ pageflow.OtherEntry = Backbone.Model.extend({
5
5
  i18nKey: 'pageflow/entry',
6
6
 
7
7
  initialize: function() {
8
- this.imageFiles = new pageflow.ImageFilesCollection([], {entry: this});
9
- this.videoFiles = new pageflow.VideoFilesCollection([], {entry: this});
10
- this.audioFiles = new pageflow.AudioFilesCollection([], {entry: this});
8
+ this.files = {};
9
+ },
10
+
11
+ getFileCollection: function(fileType) {
12
+ if (!this.files[fileType.collectionName]) {
13
+ this.files[fileType.collectionName] = pageflow.FilesCollection.createForFileType(fileType, [], {entry: this});
14
+ }
15
+
16
+ return this.files[fileType.collectionName];
11
17
  },
12
18
 
13
19
  titleOrSlug: function () {
@@ -48,17 +48,15 @@ pageflow.Page = Backbone.Model.extend({
48
48
  },
49
49
 
50
50
  thumbnailFile: function() {
51
- if (_.contains(['video', 'background_video'], this.get('template'))) {
52
- if (this.configuration.get('poster_image_id')) {
53
- return this.configuration.getImageFile('poster_image_id');
54
- }
55
- else {
56
- return this.configuration.getVideoFile('video_file_id');
57
- }
58
- }
59
- else {
60
- return this.configuration.getImageFile('background_image_id');
61
- }
51
+ var configuration = this.configuration;
52
+
53
+ return _.reduce(this.pageType().thumbnail_candidates, function(result, candidate) {
54
+ return result || configuration.getReference(candidate.attribute, candidate.file_collection);
55
+ }, null);
56
+ },
57
+
58
+ pageType: function() {
59
+ return pageflow.Page.typesByName[this.get('template')];
62
60
  },
63
61
 
64
62
  toJSON: function() {
@@ -0,0 +1,65 @@
1
+ pageflow.UploadedFile = Backbone.Model.extend({
2
+ mixins: [pageflow.stageProvider, pageflow.retryable],
3
+
4
+ urlRoot: function() {
5
+ return this.isNew() ? this.collection.url() : '/editor/files/' + this.fileType().collectionName;
6
+ },
7
+
8
+ fileType: function() {
9
+ return this.collection && this.collection.fileType;
10
+ },
11
+
12
+ isUploading: function() {
13
+ return this.get('state') === 'uploading';
14
+ },
15
+
16
+ isUploaded: function() {
17
+ return this.get('state') !== 'uploading' && this.get('state') !== 'upload_failed';
18
+ },
19
+
20
+ isPending: function() {
21
+ return !this.isReady() && !this.isFailed();
22
+ },
23
+
24
+ isReady: function() {
25
+ return this.get('state') === this.readyState;
26
+ },
27
+
28
+ isFailed: function() {
29
+ return this.get('state') && !!this.get('state').match(/_failed$/);
30
+ },
31
+
32
+ isRetryable: function() {
33
+ return !!this.get('retryable');
34
+ },
35
+
36
+ isConfirmable: function() {
37
+ return false;
38
+ },
39
+
40
+ isPositionable: function() {
41
+ return false;
42
+ },
43
+
44
+ cancelUpload: function() {
45
+ if (this.get('state') === 'uploading') {
46
+ this.trigger('uploadCancelled');
47
+ this.destroy();
48
+ }
49
+ },
50
+
51
+ uploadFailed: function() {
52
+ this.set('state', 'upload_failed');
53
+ this.unset('uploading_progress');
54
+
55
+ this.trigger('uploadFailed');
56
+ },
57
+
58
+ destroyUsage: function() {
59
+ var usage = new pageflow.FileUsage({id: this.get('usage_id')});
60
+
61
+ usage.destroy();
62
+
63
+ this.trigger('destroy', this, this.collection, {});
64
+ }
65
+ });
@@ -1,15 +1,2 @@
1
- pageflow.VideoFile = Backbone.Model.extend({
2
- modelName: 'video_file',
3
- paramRoot: 'video_file',
4
- i18nKey: 'pageflow/video_file',
5
-
6
- mixins: [pageflow.file, pageflow.encodedFile, pageflow.stageProvider, pageflow.retryable],
7
-
8
- urlRoot: function() {
9
- return this.isNew() ? this.collection.url() : '/editor/video_files';
10
- },
11
-
12
- isPositionable: function() {
13
- return false;
14
- }
1
+ pageflow.VideoFile = pageflow.EncodedFile.extend({
15
2
  });
@@ -4,15 +4,8 @@ pageflow.SidebarRouter = Backbone.Marionette.AppRouter.extend({
4
4
  'pages/:id/:tab': 'page',
5
5
  'chapters/:id': 'chapter',
6
6
 
7
- 'files/image_files?handler=:handler&payload=:payload': 'imageFiles',
8
- 'files/video_files?handler=:handler&payload=:payload': 'videoFiles',
9
- 'files/audio_files?handler=:handler&payload=:payload': 'audioFiles',
10
-
11
- 'files/image_files': 'imageFiles',
12
- 'files/video_files': 'videoFiles',
13
- 'files/audio_files': 'audioFiles',
14
-
15
- 'files?page=:page_id&attribute=:attribute': 'files',
7
+ 'files/:collectionName?handler=:handler&payload=:payload': 'files',
8
+ 'files/:collectionName': 'files',
16
9
  'files': 'files',
17
10
 
18
11
  'confirmable_files?type=:type&id=:id': 'confirmableFiles',
@@ -26,7 +26,7 @@
26
26
  <tbody class="downloads">
27
27
  <tr>
28
28
  <th>Original</th>
29
- <td><a class="original" href="#" target="_blank">Herunterladen</a></td>
29
+ <td><a class="original" href="#" download target="_blank">Herunterladen</a></td>
30
30
  </tr>
31
31
  <tbody>
32
32
  </table>
@@ -10,6 +10,10 @@ pageflow.ConfigurationEditorView.register('audio', {
10
10
  this.tab('files', function() {
11
11
  this.input('audio_file_id', pageflow.FileInputView, {collection: pageflow.audioFiles});
12
12
  this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
13
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
14
+ collection: pageflow.imageFiles,
15
+ imagePositioning: false
16
+ });
13
17
  });
14
18
 
15
19
  this.tab('options', function() {
@@ -0,0 +1,23 @@
1
+ pageflow.ConfigurationEditorView.register('audio_loop', {
2
+ configure: function() {
3
+ this.tab('general', function() {
4
+ this.group('general');
5
+
6
+ this.input('additional_title', pageflow.TextInputView);
7
+ this.input('additional_description', pageflow.TextAreaInputView, {size: 'short'});
8
+ });
9
+
10
+ this.tab('files', function() {
11
+ this.input('audio_file_id', pageflow.FileInputView, {collection: pageflow.audioFiles});
12
+ this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
13
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
14
+ collection: pageflow.imageFiles,
15
+ imagePositioning: false
16
+ });
17
+ });
18
+
19
+ this.tab('options', function() {
20
+ this.group('options');
21
+ });
22
+ }
23
+ });
@@ -6,6 +6,10 @@ pageflow.ConfigurationEditorView.register('background_image', {
6
6
 
7
7
  this.tab('files', function() {
8
8
  this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
9
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
10
+ collection: pageflow.imageFiles,
11
+ imagePositioning: false
12
+ });
9
13
  });
10
14
 
11
15
  this.tab('options', function() {
@@ -10,6 +10,10 @@ pageflow.ConfigurationEditorView.register('background_video', {
10
10
  collection: pageflow.imageFiles,
11
11
  imagePositioning: false
12
12
  });
13
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
14
+ collection: pageflow.imageFiles,
15
+ imagePositioning: false
16
+ });
13
17
  });
14
18
 
15
19
  this.tab('options', function() {
@@ -6,6 +6,10 @@ pageflow.ConfigurationEditorView.register('internal_links', {
6
6
 
7
7
  this.tab('files', function() {
8
8
  this.input('background_image_id', pageflow.FileInputView, {collection: pageflow.imageFiles});
9
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
10
+ collection: pageflow.imageFiles,
11
+ imagePositioning: false
12
+ });
9
13
  });
10
14
 
11
15
  this.tab('links', function() {
@@ -13,6 +13,10 @@ pageflow.ConfigurationEditorView.register('video', {
13
13
  collection: pageflow.imageFiles,
14
14
  imagePositioning: false
15
15
  });
16
+ this.input('thumbnail_image_id', pageflow.FileInputView, {
17
+ collection: pageflow.imageFiles,
18
+ imagePositioning: false
19
+ });
16
20
  });
17
21
 
18
22
  this.tab('options', function() {
@@ -108,7 +108,7 @@ pageflow.PageLinkEmbeddedView = Backbone.Marionette.ItemView.extend({
108
108
  updateTitle: function() {
109
109
  var linkedPage = this.linkedPage();
110
110
 
111
- this.ui.title.text(linkedPage ? linkedPage.configuration.get('description') : '');
111
+ this.ui.title.html(linkedPage ? linkedPage.configuration.get('description') : '');
112
112
  },
113
113
 
114
114
  updateThumbnailView: function() {
@@ -4,6 +4,8 @@ pageflow.ExplorerFileItemView = Backbone.Marionette.ItemView.extend({
4
4
 
5
5
  mixins: [pageflow.loadable, pageflow.selectableView],
6
6
 
7
+ selectionAttribute: 'file',
8
+
7
9
  ui: {
8
10
  fileName: '.file_name',
9
11
 
@@ -92,7 +92,14 @@ pageflow.FileItemView = Backbone.Marionette.ItemView.extend({
92
92
  },
93
93
 
94
94
  metaDataViews: function() {
95
- return [];
95
+ var model = this.model;
96
+
97
+ return _.map(this.options.metaDataAttributes, function(attribute) {
98
+ return new pageflow.FileMetaDataItemView({
99
+ model: model,
100
+ attribute: attribute
101
+ });
102
+ });
96
103
  },
97
104
 
98
105
  toggleExpanded: function() {
@@ -31,11 +31,18 @@ pageflow.FileStageItemView = Backbone.Marionette.ItemView.extend({
31
31
 
32
32
  this.ui.errorMessage
33
33
  .toggle(!!this.model.get('error_message'))
34
- .text(this.model.get('error_message'));
34
+ .text(this._translatedErrorMessage());
35
35
 
36
36
  this.$el.toggleClass('active', this.model.get('active'));
37
37
  this.$el.toggleClass('finished', this.model.get('finished'));
38
38
  this.$el.toggleClass('failed', this.model.get('failed'));
39
39
  this.$el.toggleClass('action_required', this.model.get('action_required'));
40
+ },
41
+
42
+ _translatedErrorMessage: function() {
43
+ return this.model.get('error_message') &&
44
+ I18n.t(this.model.get('error_message'), {
45
+ defaultValue: this.model.get('error_message')
46
+ });
40
47
  }
41
48
  });