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
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTViZDg2ZGZlMzdjYTU0M2E4NzI2YjM4NzU1YWU2NDY1ZTQ3ODA1Zg==
4
+ NmUxZDk3ZWY0NmIxNjVhYjE5MDdlODYzNDZmMjZiNGE5NjNmMzFmMA==
5
5
  data.tar.gz: !binary |-
6
- ZTgwZjI4ZTQ1M2I1MTUwNDc1ZDEzMWQ2Mjk4N2E1NGY5MDE5OTUzOQ==
6
+ ZGRkZmMzODVhMGMyZjE4ZjBkYmZlYTZiM2NlYjc4MTA1NzljZGUyOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Yzk4MWEwMWNiOGFiMmJjNjM1NGQ5YmRmZWZkNmE0OGQyNTIzMjk1OTRhZTVh
10
- Yjc4NGJmNjljOTJiMTc5ZmFmZTU5YWJjNDk4NGIyNzMyYjcxNDVmMDA4MmU5
11
- ZmQyMmFmZDIwOTliMjQzM2RiODdmMjQwMGRhOWQ4MzhjMmM2MDQ=
9
+ NDNmNDJjNWMyZGI0N2M2Y2M4YzNhNDI1MTVlNDNhODkyNTAwM2UyODBmY2U1
10
+ ZTgzYzNjYjNmNTMzZmZlZDQyMGJjZDc5M2I4MzQ3MzA0ZTEyNTkwNzk1ZTgz
11
+ YWFkNTkxYTA0ODkxNGE1YmNkMTFkNGRlMGQwOWRhYmY2MGQ3YmM=
12
12
  data.tar.gz: !binary |-
13
- MTAzOGJlNTRkMDViODVhODg1ZGYzMTVmNmViMzhlMjczYmVjZmE2OTEzMGEz
14
- M2VmYjdlOGM3ZjZmZjBmZGMyNDMyZDM0NzdlMWQxNTcxZWMwYzIwOTc0OWI2
15
- N2Q1OWVhYTc3ZmQ0MmYwODQ0M2QxZDU3ZTc1NTc3ZDdmZTcwOGU=
13
+ YmE0ZDhjMWVmZDk2NjQxNGIwODg5MjJkODcwNGUyZTFjNWZkZjdhNzEwMTk5
14
+ NTU3NzUzNmI5ODY2MjM3ZmVjMGI0NTJlMDM4MTc4NDYwN2M3ZWZjNTlmNGE5
15
+ NTIyZDliMTczMjAxYTYyZjZlMzY2M2IzNTgzZjI0ZWYzMWVhYzk=
@@ -66,4 +66,9 @@ pageflow.AudioPlayer.fromAudioTag = function(element) {
66
66
  type: $(this).attr('type')
67
67
  };
68
68
  }).get(), element[0]);
69
+ };
70
+
71
+ pageflow.AudioPlayer.fromScriptTag = function(element) {
72
+ var sources = element.length ? JSON.parse(element.text()) : [];
73
+ return new pageflow.AudioPlayer(sources);
69
74
  };
@@ -121,6 +121,10 @@ pageflow.EditorApi = pageflow.Object.extend({
121
121
  */
122
122
  this.failures = new pageflow.FailuresAPI();
123
123
 
124
+ /**
125
+ *
126
+ */
127
+ this.fileTypes = new pageflow.FileTypes();
124
128
 
125
129
  /** @private */
126
130
  this.createFileSelectionHandler = function(handlerName, encodedPayload) {
@@ -0,0 +1,32 @@
1
+ pageflow.FileType = pageflow.Object.extend({
2
+ initialize: function(options) {
3
+ this.model = options.model;
4
+
5
+ this.typeName = options.typeName;
6
+ this.collectionName = options.collectionName;
7
+ this.paramKey = options.paramKey;
8
+ this.i18nKey = options.i18nKey;
9
+
10
+ this.metaDataAttributes = options.metaDataAttributes || [];
11
+
12
+ if (typeof options.matchUpload === 'function') {
13
+ this.matchUpload = options.matchUpload;
14
+ }
15
+ else if (options.matchUpload instanceof RegExp) {
16
+ this.matchUpload = function(upload) {
17
+ return upload.type.match(options.matchUpload);
18
+ };
19
+ }
20
+ else {
21
+ throw 'matchUpload option of FileType "' + this.collectionName + '" must either be a function or a RegExp.';
22
+ }
23
+
24
+ this.setupModelNaming();
25
+ },
26
+
27
+ setupModelNaming: function() {
28
+ this.model.prototype.modelName = this.model.prototype.modelName || this.paramKey;
29
+ this.model.prototype.paramRoot = this.model.prototype.paramRoot || this.paramKey;
30
+ this.model.prototype.i18nKey = this.model.prototype.i18nKey || this.i18nKey;
31
+ }
32
+ });
@@ -0,0 +1,73 @@
1
+ pageflow.FileTypes = pageflow.Object.extend({
2
+ initialize: function() {
3
+ this.clientSideConfigs = [];
4
+ },
5
+
6
+ register: function(name, config) {
7
+ if (this._setup) {
8
+ throw 'File types already set up. Register file types before initializers run.';
9
+ }
10
+
11
+ this.clientSideConfigs[name] = config;
12
+ },
13
+
14
+ setup: function(serverSideConfigs) {
15
+ var clientSideConfigs = this.clientSideConfigs;
16
+ this._setup = true;
17
+
18
+ this.fileTypes = _.map(serverSideConfigs, function(serverSideConfig) {
19
+ var clientSideConfig = clientSideConfigs[serverSideConfig.collectionName];
20
+
21
+ if (!clientSideConfig) {
22
+ throw 'Missing client side config for file type "' + serverSideConfig.collectionName + '"';
23
+ }
24
+
25
+ return new pageflow.FileType(_.extend({}, serverSideConfig, clientSideConfig));
26
+ });
27
+ },
28
+
29
+ findByUpload: function(upload) {
30
+ var result = this.find(function(fileType) {
31
+ return fileType.matchUpload(upload);
32
+ });
33
+
34
+ if (!result) {
35
+ throw(new pageflow.FileTypes.UnmatchedUploadError(upload));
36
+ }
37
+
38
+ return result;
39
+ },
40
+
41
+ findByCollectionName: function(collectionName) {
42
+ var result = this.find(function(fileType) {
43
+ return fileType.collectionName === collectionName;
44
+ });
45
+
46
+ if (!result) {
47
+ throw('Could not find file type by collection name "' + collectionName +'"');
48
+ }
49
+
50
+ return result;
51
+ }
52
+ });
53
+
54
+ _.each(['each', 'map', 'reduce', 'first', 'find'], function(method) {
55
+ pageflow.FileTypes.prototype[method] = function() {
56
+ if (!this._setup) {
57
+ throw 'File types are not yet set up.';
58
+ }
59
+
60
+ var args = Array.prototype.slice.call(arguments);
61
+ args.unshift(this.fileTypes);
62
+ return _[method].apply(_, args);
63
+ };
64
+ });
65
+
66
+ pageflow.FileTypes.UnmatchedUploadError = pageflow.Object.extend({
67
+ name: 'UnmatchedUploadError',
68
+
69
+ initialize: function(upload) {
70
+ this.upload = upload;
71
+ this.message = 'No matching file type found for upload "' + upload.name + '" of type "' + upload.type +'".';
72
+ }
73
+ });
@@ -23,6 +23,9 @@
23
23
  //= require_self
24
24
 
25
25
  //= require_tree ./models/mixins
26
+ //= require ./models/uploaded_file
27
+ //= require ./models/hosted_file
28
+ //= require ./models/encoded_file
26
29
  //= require_tree ./models
27
30
  //= require_tree ./collections/mixins
28
31
  //= require ./collections/multi_collection
@@ -42,11 +45,13 @@
42
45
  //= require_tree ./views
43
46
 
44
47
  //= require ./initializers/setup_config
48
+ //= require ./initializers/setup_file_types
45
49
  //= require ./initializers/setup_collections
46
50
  //= require ./initializers/setup_page_types
47
51
  //= require ./initializers/edit_lock
48
52
  //= require ./initializers/files_polling
49
53
  //= require ./initializers/routing
54
+ //= require ./initializers/error_listener
50
55
  //= require ./initializers/additional_initializers
51
56
  //= require ./initializers/boot
52
57
 
@@ -3,7 +3,19 @@ pageflow.FileUsagesCollection = Backbone.Collection.extend({
3
3
 
4
4
  name: 'file_usages',
5
5
 
6
+ initialize: function(models, options) {
7
+ options = options || {};
8
+ this.entry = options.entry;
9
+ },
10
+
6
11
  url: function() {
7
- return '/editor/entries/' + pageflow.entry.get('id') + '/file_usages';
12
+ return '/editor/entries/' + this.entry.get('id') + '/file_usages';
13
+ },
14
+
15
+ createForFile: function(file, options) {
16
+ return this.create({
17
+ file_id: file.get('id'),
18
+ file_type: file.fileType().typeName
19
+ }, options);
8
20
  }
9
21
  });
@@ -0,0 +1,54 @@
1
+ pageflow.FilesCollection = Backbone.Collection.extend({
2
+ initialize: function(models, options) {
3
+ options = options || {};
4
+
5
+ this.entry = options.entry;
6
+ this.fileType = options.fileType;
7
+ this.name = options.fileType.collectionName;
8
+ },
9
+
10
+ comparator: function(file) {
11
+ var fileName = file.get('file_name');
12
+ return (fileName && fileName.toLowerCase) ? fileName.toLowerCase() : fileName;
13
+ },
14
+
15
+ url: function() {
16
+ return '/editor/entries/' + this.getEntry().get('id') + '/files/' + this.name;
17
+ },
18
+
19
+ getEntry: function() {
20
+ return this.entry || pageflow.entry;
21
+ },
22
+
23
+ confirmable: function() {
24
+ return new pageflow.SubsetCollection({
25
+ parent: this,
26
+ watchAttribute: 'state',
27
+
28
+ filter: function(item) {
29
+ return item.get('state') === 'waiting_for_confirmation';
30
+ },
31
+ });
32
+ }
33
+ });
34
+
35
+ pageflow.FilesCollection.createForFileTypes = function(fileTypes, files, options) {
36
+ return fileTypes.reduce(function(result, fileType) {
37
+ result[fileType.collectionName] = pageflow.FilesCollection.createForFileType(
38
+ fileType,
39
+ files[fileType.collectionName],
40
+ options
41
+ );
42
+ return result;
43
+ }, {});
44
+ };
45
+
46
+ pageflow.FilesCollection.createForFileType = function(fileType, files, options) {
47
+ return new pageflow.FilesCollection(
48
+ files,
49
+ _.extend({
50
+ fileType: fileType,
51
+ model: fileType.model
52
+ }, options || {})
53
+ );
54
+ };
@@ -10,23 +10,11 @@ pageflow.SidebarController = Backbone.Marionette.Controller.extend({
10
10
  }));
11
11
  },
12
12
 
13
- imageFiles: function(handler, payload) {
14
- this.files(handler, payload, 'image_files');
15
- },
16
-
17
- videoFiles: function(handler, payload) {
18
- this.files(handler, payload, 'video_files');
19
- },
20
-
21
- audioFiles: function(handler, payload) {
22
- this.files(handler, payload, 'audio_files');
23
- },
24
-
25
- files: function(handler, payload, tabName) {
13
+ files: function(collectionName, handler, payload) {
26
14
  this.region.show(new pageflow.FilesView({
27
15
  model: this.entry,
28
16
  selectionHandler: handler && pageflow.editor.createFileSelectionHandler(handler, payload),
29
- tabName: tabName
17
+ tabName: collectionName
30
18
  }));
31
19
  },
32
20
 
@@ -0,0 +1,8 @@
1
+ pageflow.app.addInitializer(function() {
2
+ pageflow.app.on('error', function(e) {
3
+ alert(I18n.t(e.name, {
4
+ scope: 'pageflow.editor.errors',
5
+ defaultValue: I18n.t('pageflow.editor.errors.unknown')
6
+ }));
7
+ });
8
+ });
@@ -1,7 +1,9 @@
1
1
  pageflow.app.addInitializer(function(options) {
2
- pageflow.imageFiles = new pageflow.ImageFilesCollection(options.imageFiles);
3
- pageflow.videoFiles = new pageflow.VideoFilesCollection(options.videoFiles);
4
- pageflow.audioFiles = new pageflow.AudioFilesCollection(options.audioFiles);
2
+ pageflow.files = pageflow.FilesCollection.createForFileTypes(pageflow.editor.fileTypes, options.files);
3
+
4
+ pageflow.imageFiles = pageflow.files.image_files;
5
+ pageflow.videoFiles = pageflow.files.video_files;
6
+ pageflow.audioFiles = pageflow.files.audio_files;
5
7
 
6
8
  pageflow.pages = new pageflow.PagesCollection(options.pages);
7
9
  pageflow.chapters = new pageflow.ChaptersCollection(options.chapters);
@@ -0,0 +1,21 @@
1
+ pageflow.app.addInitializer(function(options) {
2
+ pageflow.editor.fileTypes.register('image_files', {
3
+ model: pageflow.ImageFile,
4
+ metaDataAttributes: ['dimensions'],
5
+ matchUpload: /^image/
6
+ });
7
+
8
+ pageflow.editor.fileTypes.register('video_files', {
9
+ model: pageflow.VideoFile,
10
+ metaDataAttributes: ['format', 'dimensions', 'duration'],
11
+ matchUpload: /^video/
12
+ });
13
+
14
+ pageflow.editor.fileTypes.register('audio_files', {
15
+ model: pageflow.AudioFile,
16
+ metaDataAttributes: ['format', 'duration'],
17
+ matchUpload: /^audio/
18
+ });
19
+
20
+ pageflow.editor.fileTypes.setup(options.config.fileTypes);
21
+ });
@@ -1,17 +1,3 @@
1
- pageflow.AudioFile = Backbone.Model.extend({
2
- modelName: 'audio_file',
3
- paramRoot: 'audio_file',
4
- i18nKey: 'pageflow/audio_file',
5
-
6
- mixins: [pageflow.file, pageflow.encodedFile, pageflow.stageProvider, pageflow.retryable],
7
-
1
+ pageflow.AudioFile = pageflow.EncodedFile.extend({
8
2
  thumbnailPictogram: 'audio',
9
-
10
- urlRoot: function() {
11
- return this.isNew() ? this.collection.url() : '/editor/audio_files';
12
- },
13
-
14
- isPositionable: function() {
15
- return false;
16
- }
17
3
  });
@@ -0,0 +1,32 @@
1
+ pageflow.EncodedFile = pageflow.HostedFile.extend({
2
+ processingStages: function() {
3
+ var stages = [];
4
+
5
+ if (pageflow.config.confirmEncodingJobs) {
6
+ stages.push({
7
+ name: 'fetching_meta_data',
8
+ activeStates: ['waiting_for_meta_data', 'fetching_meta_data'],
9
+ failedStates: ['fetching_meta_data_failed']
10
+ });
11
+ }
12
+
13
+ stages.push({
14
+ name: 'encoding',
15
+ actionRequiredStates: ['waiting_for_confirmation'],
16
+ activeStates: ['waiting_for_encoding', 'encoding'],
17
+ failedStates: ['fetching_meta_data_failed', 'encoding_failed']
18
+ });
19
+
20
+ return stages;
21
+ },
22
+
23
+ readyState: 'encoded',
24
+
25
+ isConfirmable: function() {
26
+ return this.get('state') === 'waiting_for_confirmation';
27
+ },
28
+
29
+ isPositionable: function() {
30
+ return false;
31
+ }
32
+ });
@@ -6,8 +6,11 @@ pageflow.Entry = Backbone.Model.extend({
6
6
 
7
7
  mixins: [pageflow.filesCountWatcher, pageflow.polling, pageflow.failureTracking],
8
8
 
9
- initialize: function() {
10
- this.chapters = pageflow.chapters;
9
+ initialize: function(attributes, options) {
10
+ options = options || {};
11
+
12
+ this.files = options.files || pageflow.files;
13
+ this.chapters = options.chapters || pageflow.chapters;
11
14
  this.chapters.parentModel = this;
12
15
  this.pages = pageflow.pages;
13
16
 
@@ -15,6 +18,10 @@ pageflow.Entry = Backbone.Model.extend({
15
18
  this.videoFiles = pageflow.videoFiles;
16
19
  this.audioFiles = pageflow.audioFiles;
17
20
 
21
+ pageflow.editor.fileTypes.each(function(fileType) {
22
+ this.watchFileCollection(fileType.collectionName, this.getFileCollection(fileType));
23
+ }, this);
24
+
18
25
  this.listenTo(this.chapters, 'sort', function() {
19
26
  this.pages.sort();
20
27
  });
@@ -22,10 +29,6 @@ pageflow.Entry = Backbone.Model.extend({
22
29
  this.listenTo(this, 'change:title change:summary change:credits change:manual_start change:home_url change:home_button_enabled', function() {
23
30
  this.save();
24
31
  });
25
-
26
- this.watchFileCollection('image_files', this.imageFiles);
27
- this.watchFileCollection('video_files', this.videoFiles);
28
- this.watchFileCollection('audio_files', this.audioFiles);
29
32
  },
30
33
 
31
34
  addChapter: function() {
@@ -35,65 +38,31 @@ pageflow.Entry = Backbone.Model.extend({
35
38
  });
36
39
  },
37
40
 
38
- addFile: function(file) {
39
- var record;
41
+ addFileUpload: function(upload) {
42
+ var fileType = pageflow.editor.fileTypes.findByUpload(upload);
43
+ var file = new fileType.model({
44
+ state: 'uploading',
45
+ file_name: upload.name
46
+ });
40
47
 
41
- if (file.type.match(/^image/)) {
42
- record = new pageflow.ImageFile({
43
- state: 'uploading',
44
- file_name: file.name
45
- });
46
- pageflow.imageFiles.add(record);
47
- }
48
- else if (file.type.match(/^video/)) {
49
- record = new pageflow.VideoFile({
50
- state: 'uploading',
51
- file_name: file.name
52
- });
53
- pageflow.videoFiles.add(record);
54
- }
55
- else if (file.type.match(/^audio/)) {
56
- record = new pageflow.AudioFile({
57
- state: 'uploading',
58
- file_name: file.name
59
- });
60
- pageflow.audioFiles.add(record);
61
- }
48
+ this.getFileCollection(fileType).add(file);
62
49
 
63
- return record;
50
+ return file;
64
51
  },
65
52
 
66
53
  addFileUsage: function(file) {
67
- this.createFileUsage(file, { success: function(usage) {
54
+ var fileUsages = new pageflow.FileUsagesCollection([], {
55
+ entry: this
56
+ });
57
+
58
+ fileUsages.createForFile(file, { success: function(usage) {
68
59
  file.set('usage_id', usage.get('id'));
69
- this.addFileToCollection(file);
60
+ this.getFileCollection(file.fileType()).add(file);
70
61
  }.bind(this)});
71
62
  },
72
63
 
73
- createFileUsage: function(file, options) {
74
- var file_usages = new pageflow.FileUsagesCollection();
75
-
76
- return file_usages.create({
77
- file_id: file.get('id'),
78
- file_type: file.get('typeName')
79
- }, options);
80
-
81
- },
82
-
83
- addFileToCollection: function (file) {
84
- this.getFileCollection(file.get('typeName')).add(file);
85
- },
86
-
87
- getFileCollection: function(filetype) {
88
- return this[lowerCaseFirst(removeNamespace(filetype)) + 's'];
89
-
90
- function removeNamespace(string) {
91
- return string.split('::').pop();
92
- }
93
-
94
- function lowerCaseFirst(string) {
95
- return string.charAt(0).toLowerCase() + string.slice(1);
96
- }
64
+ getFileCollection: function(fileType) {
65
+ return this.files[fileType.collectionName];
97
66
  },
98
67
 
99
68
  pollForPendingFiles: function() {
@@ -108,13 +77,10 @@ pageflow.Entry = Backbone.Model.extend({
108
77
  if (response) {
109
78
  this.set(_.pick(response, 'published', 'published_until'));
110
79
 
111
- this.imageFiles.set(response.image_files, {add: false, remove: false});
112
- this.videoFiles.set(response.video_files, {add: false, remove: false});
113
- this.audioFiles.set(response.audio_files, {add: false, remove: false});
114
-
115
- delete response.image_files;
116
- delete response.video_files;
117
- delete response.audio_files;
80
+ pageflow.editor.fileTypes.each(function(fileType) {
81
+ this.getFileCollection(fileType).set(response[fileType.collectionName], {add: false, remove: false});
82
+ delete response[fileType.collectionName];
83
+ }, this);
118
84
  }
119
85
 
120
86
  return response;