pageflow 0.5.0 → 0.6.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 (197) hide show
  1. checksums.yaml +8 -8
  2. data/Rakefile +2 -1
  3. data/admins/pageflow/accounts.rb +20 -4
  4. data/admins/pageflow/entry.rb +4 -5
  5. data/app/assets/javascripts/pageflow/audio_player.js +16 -7
  6. data/app/assets/javascripts/pageflow/base.js +5 -0
  7. data/app/assets/javascripts/pageflow/built_in_widget_types.js +11 -0
  8. data/app/assets/javascripts/pageflow/cookies.js +43 -0
  9. data/app/assets/javascripts/pageflow/editor/base.js +2 -10
  10. data/app/assets/javascripts/pageflow/editor/collections/widgets_collection.js +16 -0
  11. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +3 -2
  12. data/app/assets/javascripts/pageflow/editor/edit_widget.jst.ejs +2 -0
  13. data/app/assets/javascripts/pageflow/editor/initializers/setup_widget_types.js +3 -0
  14. data/app/assets/javascripts/pageflow/editor/models/configuration.js +18 -9
  15. data/app/assets/javascripts/pageflow/editor/models/edit_lock_container.js +1 -0
  16. data/app/assets/javascripts/pageflow/editor/models/entry.js +13 -3
  17. data/app/assets/javascripts/pageflow/editor/models/entry_configuration.js +4 -0
  18. data/app/assets/javascripts/pageflow/editor/models/entry_configuration_file_selection_handler.js +11 -0
  19. data/app/assets/javascripts/pageflow/editor/models/image_file.js +4 -0
  20. data/app/assets/javascripts/pageflow/editor/models/mixins/widget_subject.js +37 -0
  21. data/app/assets/javascripts/pageflow/editor/models/page.js +1 -1
  22. data/app/assets/javascripts/pageflow/editor/models/page_configuration_file_selection_handler.js +1 -25
  23. data/app/assets/javascripts/pageflow/editor/models/theming.js +3 -0
  24. data/app/assets/javascripts/pageflow/editor/models/video_file.js +7 -0
  25. data/app/assets/javascripts/pageflow/editor/models/widget.js +19 -0
  26. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
  27. data/app/assets/javascripts/pageflow/editor/templates/background_positioning.jst.ejs +18 -0
  28. data/app/assets/javascripts/pageflow/editor/templates/background_positioning_preview.jst.ejs +2 -0
  29. data/app/assets/javascripts/pageflow/editor/templates/background_positioning_sliders.jst.ejs +6 -0
  30. data/app/assets/javascripts/pageflow/editor/templates/edit_meta_data.jst.ejs +1 -1
  31. data/app/assets/javascripts/pageflow/editor/templates/edit_widget.jst.ejs +2 -0
  32. data/app/assets/javascripts/pageflow/editor/templates/edit_widgets.jst.ejs +2 -0
  33. data/app/assets/javascripts/pageflow/editor/templates/entry_preview.jst.ejs +1 -3
  34. data/app/assets/javascripts/pageflow/editor/views/background_positioning_preview_view.js +39 -0
  35. data/app/assets/javascripts/pageflow/editor/views/background_positioning_sliders_view.js +94 -0
  36. data/app/assets/javascripts/pageflow/editor/views/background_positioning_view.js +67 -0
  37. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
  38. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +1 -1
  39. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +1 -1
  40. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +4 -3
  41. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +1 -1
  42. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +9 -2
  43. data/app/assets/javascripts/pageflow/editor/views/edit_meta_data_view.js +18 -2
  44. data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +29 -0
  45. data/app/assets/javascripts/pageflow/editor/views/edit_widgets_view.js +20 -0
  46. data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +8 -3
  47. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +53 -9
  48. data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +1 -1
  49. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +11 -3
  50. data/app/assets/javascripts/pageflow/events.js +1 -0
  51. data/app/assets/javascripts/pageflow/features/hashchange_support.js +8 -0
  52. data/app/assets/javascripts/pageflow/history.js +14 -2
  53. data/app/assets/javascripts/pageflow/page_types/audio.js +18 -6
  54. data/app/assets/javascripts/pageflow/page_types/audio_loop.js +19 -7
  55. data/app/assets/javascripts/pageflow/page_types/background_video.js +41 -33
  56. data/app/assets/javascripts/pageflow/page_types/mixins/video_helpers.js +7 -16
  57. data/app/assets/javascripts/pageflow/ready.js +12 -25
  58. data/app/assets/javascripts/pageflow/slideshow.js +5 -5
  59. data/app/assets/javascripts/pageflow/slideshow/hide_text_on_swipe.js +1 -1
  60. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +11 -1
  61. data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +19 -2
  62. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +31 -6
  63. data/app/assets/javascripts/pageflow/slideshow/swipe_gesture.js +6 -5
  64. data/app/assets/javascripts/pageflow/ui.js +16 -0
  65. data/app/assets/javascripts/pageflow/{editor → ui}/object.js +0 -0
  66. data/app/assets/javascripts/pageflow/{editor → ui}/renderer.js +0 -0
  67. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/check_box.jst.ejs +0 -0
  68. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/file_input.jst.ejs +0 -0
  69. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/page_reference.jst.ejs +0 -0
  70. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/select_input.jst.ejs +0 -0
  71. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/slider_input.jst.ejs +0 -0
  72. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_area_input.jst.ejs +0 -0
  73. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_input.jst.ejs +0 -0
  74. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/url_input.jst.ejs +0 -0
  75. data/app/assets/javascripts/pageflow/{editor → ui}/templates/tabs_view.jst.ejs +0 -0
  76. data/app/assets/javascripts/pageflow/{editor → ui}/views/collection_view.js +0 -0
  77. data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_tab_view.js +8 -1
  78. data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_view.js +3 -1
  79. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/check_box_input_view.js +1 -1
  80. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/file_input_view.js +10 -8
  81. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/page_reference_input_view.js +1 -1
  82. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/proxy_url_input_view.js +0 -0
  83. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/select_input_view.js +41 -1
  84. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/slider_input_view.js +1 -1
  85. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_area_input_view.js +1 -1
  86. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_input_view.js +8 -2
  87. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/url_input_view.js +9 -3
  88. data/app/assets/javascripts/pageflow/{editor/views → ui/views/mixins}/input_view.js +5 -1
  89. data/app/assets/javascripts/pageflow/{editor → ui}/views/mixins/subview_container.js +0 -0
  90. data/app/assets/javascripts/pageflow/{editor → ui}/views/sortable_collection_view.js +0 -0
  91. data/app/assets/javascripts/pageflow/{editor → ui}/views/tabs_view.js +11 -2
  92. data/app/assets/javascripts/pageflow/video_player/lazy.js +4 -1
  93. data/app/assets/javascripts/pageflow/visited.js +56 -0
  94. data/app/assets/javascripts/pageflow/widget_types.js +27 -0
  95. data/app/assets/javascripts/pageflow/widgets/events.js +33 -0
  96. data/app/assets/javascripts/pageflow/widgets/navigation.js +42 -33
  97. data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +60 -38
  98. data/app/assets/javascripts/pageflow/widgets/overview.js +3 -3
  99. data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +34 -4
  100. data/app/assets/javascripts/pageflow/widgets/share_menu.js +60 -0
  101. data/app/assets/stylesheets/pageflow/admin.css.scss +1 -0
  102. data/app/assets/stylesheets/pageflow/admin/tabs_view.css.scss +50 -0
  103. data/app/assets/stylesheets/pageflow/application_with_simulated_media_queries.css.scss +2 -0
  104. data/app/assets/stylesheets/pageflow/base.css.scss +2 -1
  105. data/app/assets/stylesheets/pageflow/editor/{image_positioning.css.scss → background_positioning.css.scss} +66 -65
  106. data/app/assets/stylesheets/pageflow/editor/base.css.scss +7 -5
  107. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.css.scss +7 -9
  108. data/app/assets/stylesheets/pageflow/editor/select_button.css.scss +4 -4
  109. data/app/assets/stylesheets/pageflow/editor/widgets.css.scss +4 -0
  110. data/app/assets/stylesheets/pageflow/entries.css.scss +5 -0
  111. data/app/assets/stylesheets/pageflow/mixins/breakpoints.css.scss +75 -10
  112. data/app/assets/stylesheets/pageflow/multimedia_alert.css.scss +31 -30
  113. data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
  114. data/app/assets/stylesheets/pageflow/navigation_mobile.css.scss +57 -58
  115. data/app/assets/stylesheets/pageflow/player_controls.css.scss +2 -2
  116. data/app/assets/stylesheets/pageflow/slideshow.css.scss +4 -1
  117. data/app/assets/stylesheets/pageflow/subshare.css.scss +28 -0
  118. data/app/assets/stylesheets/pageflow/ui.css.scss +7 -0
  119. data/app/assets/stylesheets/pageflow/{editor → ui}/forms.css.scss +1 -0
  120. data/app/assets/stylesheets/pageflow/{editor → ui}/tabs_view.css.scss +1 -0
  121. data/app/controllers/pageflow/editor/widgets_controller.rb +39 -0
  122. data/app/controllers/pageflow/entries_controller.rb +10 -1
  123. data/app/helpers/pageflow/entries_helper.rb +7 -0
  124. data/app/helpers/pageflow/page_types_helper.rb +7 -7
  125. data/app/helpers/pageflow/pages_helper.rb +36 -5
  126. data/app/helpers/pageflow/social_share_helper.rb +54 -0
  127. data/app/helpers/pageflow/widgets_helper.rb +43 -0
  128. data/app/models/pageflow/draft_entry.rb +4 -1
  129. data/app/models/pageflow/entry.rb +1 -0
  130. data/app/models/pageflow/published_entry.rb +6 -3
  131. data/app/models/pageflow/revision.rb +5 -0
  132. data/app/models/pageflow/theming.rb +3 -0
  133. data/app/models/pageflow/widget.rb +74 -0
  134. data/app/views/admin/accounts/_form.html.erb +10 -0
  135. data/app/views/components/pageflow/admin/entries_tab.rb +22 -0
  136. data/app/views/components/pageflow/admin/members_tab.rb +35 -0
  137. data/app/views/components/pageflow/admin/revisions_tab.rb +51 -0
  138. data/app/views/components/pageflow/admin/tabs_view.rb +78 -0
  139. data/app/views/components/pageflow/admin/users_tab.rb +22 -0
  140. data/app/views/layouts/pageflow/application.html.erb +5 -5
  141. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +7 -4
  142. data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -2
  143. data/app/views/pageflow/editor/widgets/_widget.json.jbuilder +2 -0
  144. data/app/views/pageflow/editor/widgets/index.json.jbuilder +1 -0
  145. data/app/views/pageflow/entries/_entry.html.erb +6 -2
  146. data/app/views/pageflow/entries/_mobile_navigation.html.erb +56 -0
  147. data/app/views/pageflow/entries/_navigation.html.erb +3 -53
  148. data/app/views/pageflow/entries/edit.html.erb +2 -0
  149. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +7 -3
  150. data/app/views/pageflow/entries/navigation/_page.html.erb +2 -2
  151. data/app/views/pageflow/entries/partials.html.erb +1 -1
  152. data/app/views/pageflow/entries/show.html.erb +12 -4
  153. data/app/views/pageflow/files/show.html.erb +5 -0
  154. data/app/views/pageflow/pages/templates/_audio_loop.html.erb +1 -1
  155. data/app/views/pageflow/pages/templates/_background_video.html.erb +2 -2
  156. data/app/views/pageflow/pages/templates/_video.html.erb +4 -3
  157. data/app/views/pageflow/{entries/_social_meta_tags.html.erb → social_share/_entry_meta_tags.html.erb} +2 -2
  158. data/app/views/pageflow/social_share/_image_tags.html.erb +3 -0
  159. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +9 -0
  160. data/config/initializers/admin_resource_tabs.rb +7 -0
  161. data/config/initializers/paperclip.rb +1 -1
  162. data/config/initializers/view_components.rb +9 -1
  163. data/config/initializers/widget_types.rb +4 -0
  164. data/config/locales/activerecord.de.yml +5 -1
  165. data/config/locales/admin/tabs.de.yml +8 -0
  166. data/config/locales/editor.de.yml +5 -4
  167. data/config/locales/pageflow/editor/background_positioning.de.yml +13 -0
  168. data/config/locales/pageflow/ui.de.yml +6 -0
  169. data/config/locales/pageflow/widgets.de.yml +14 -0
  170. data/config/routes.rb +6 -0
  171. data/config/spring.rb +2 -1
  172. data/db/migrate/20141027102310_create_widgets.rb +11 -0
  173. data/db/migrate/20141028125408_add_emphasize_chapter_beginning_to_revisions.rb +5 -0
  174. data/db/migrate/20141119164526_add_emphasize_new_pages_to_revisions.rb +5 -0
  175. data/db/migrate/20141119174032_add_sharing_image_to_revisions.rb +7 -0
  176. data/lib/pageflow/ability_mixin.rb +2 -0
  177. data/lib/pageflow/admin/tabs.rb +18 -0
  178. data/lib/pageflow/built_in_widget_type.rb +27 -0
  179. data/lib/pageflow/configuration.rb +17 -0
  180. data/lib/pageflow/engine.rb +2 -0
  181. data/lib/pageflow/version.rb +1 -1
  182. data/lib/pageflow/widget_type.rb +52 -0
  183. data/lib/pageflow/widget_types.rb +50 -0
  184. data/spec/factories/audio_files.rb +1 -1
  185. data/spec/factories/chapters.rb +1 -1
  186. data/spec/factories/entries.rb +2 -2
  187. data/spec/factories/image_files.rb +1 -1
  188. data/spec/factories/video_files.rb +1 -1
  189. data/spec/factories/widgets.rb +6 -0
  190. data/vendor/assets/javascripts/audio5.min.js +3 -0
  191. metadata +104 -44
  192. data/app/assets/javascripts/pageflow/editor/templates/image_positioning.jst.ejs +0 -26
  193. data/app/assets/javascripts/pageflow/editor/views/image_positioning_view.js +0 -153
  194. data/app/views/admin/accounts/_entries_panel.html.arb +0 -15
  195. data/app/views/admin/accounts/_users_panel.html.arb +0 -15
  196. data/app/views/admin/entries/_members.html.arb +0 -29
  197. data/app/views/admin/entries/_revisions.html.arb +0 -45
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NmUxZDk3ZWY0NmIxNjVhYjE5MDdlODYzNDZmMjZiNGE5NjNmMzFmMA==
4
+ MTNhNTM1MWI5MWJmN2NmYmFkNjJjM2IyNWYxYTA4N2NiNmZhYmJmNw==
5
5
  data.tar.gz: !binary |-
6
- ZGRkZmMzODVhMGMyZjE4ZjBkYmZlYTZiM2NlYjc4MTA1NzljZGUyOQ==
6
+ MGMxMTY1ZGQwZDQwZDE1ZmU3ZjViMTkzNTgxODJhMmMzYjZiZDMyNQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NDNmNDJjNWMyZGI0N2M2Y2M4YzNhNDI1MTVlNDNhODkyNTAwM2UyODBmY2U1
10
- ZTgzYzNjYjNmNTMzZmZlZDQyMGJjZDc5M2I4MzQ3MzA0ZTEyNTkwNzk1ZTgz
11
- YWFkNTkxYTA0ODkxNGE1YmNkMTFkNGRlMGQwOWRhYmY2MGQ3YmM=
9
+ ODY1MzZiZDZlNTc1OGYzZjg2MjcyYjUyODA4NDBkMmVlYTJkZDIzYjQ5NjRk
10
+ Y2QyODE5OTIxZWE4OTU2Nzk2Mzg3NGJhYWM4MTgxNTA5OWVkZmZjNGJmM2Uw
11
+ M2IwM2FjNDg5OTdhMTA4NDkyY2E5MWYzNmRhYjcyZjYxMWViMDk=
12
12
  data.tar.gz: !binary |-
13
- YmE0ZDhjMWVmZDk2NjQxNGIwODg5MjJkODcwNGUyZTFjNWZkZjdhNzEwMTk5
14
- NTU3NzUzNmI5ODY2MjM3ZmVjMGI0NTJlMDM4MTc4NDYwN2M3ZWZjNTlmNGE5
15
- NTIyZDliMTczMjAxYTYyZjZlMzY2M2IzNTgzZjI0ZWYzMWVhYzk=
13
+ YjYxOGQ2ZDYzNmU0ZGZiYjI4Nzk3ODljOTkxZTI4Zjk3NzRlMmI3ZjAxMDIx
14
+ ZGUwNDE4N2NkODFjNjJjYjlhYmEwNTZhNDg1OTE1MDUzMzIwZmFhMjdlMGZj
15
+ ZDQ4ZDg4MTIwOGE5ZTJhN2NiMGYzMDFmMDdkMzc0YjBhZjRlZTU=
data/Rakefile CHANGED
@@ -14,7 +14,8 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
17
+ require File.expand_path('spec/support/pageflow/rails_version', File.dirname(__FILE__))
18
+ APP_RAKEFILE = File.expand_path("../spec/dummy/rails-#{Pageflow::RailsVersion.detect}/Rakefile", __FILE__)
18
19
  load 'rails/tasks/engine.rake'
19
20
 
20
21
  Bundler::GemHelper.install_tasks
@@ -17,14 +17,14 @@ module Pageflow
17
17
  render 'account_details', :account => account
18
18
  render 'theming_details', :account => account
19
19
 
20
- div :class => 'columns' do
21
- render 'entries_panel', :account => account
22
- render 'users_panel', :account => account
23
- end
20
+ tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(:theming),
21
+ :i18n => 'pageflow.admin.resource_tabs',
22
+ :build_args => [account.default_theming])
24
23
  end
25
24
 
26
25
  controller do
27
26
  helper ThemesHelper
27
+ helper WidgetsHelper
28
28
 
29
29
  def new
30
30
  @account = Account.new
@@ -35,6 +35,22 @@ module Pageflow
35
35
  @account = Account.new(permitted_params[:account])
36
36
  @account.build_default_theming(permitted_params[:account][:default_theming_attributes])
37
37
  super
38
+ update_widgets
39
+ end
40
+
41
+ def update
42
+ super
43
+ update_widgets
44
+ end
45
+
46
+ def update_widgets
47
+ @account.default_theming.widgets.batch_update!(widgets_params) if @account.valid?
48
+ end
49
+
50
+ def widgets_params
51
+ params.fetch(:widgets, {}).map do |role, type_name|
52
+ {role: role, type_name: type_name}
53
+ end
38
54
  end
39
55
 
40
56
  def permitted_params
@@ -81,16 +81,15 @@ module Pageflow
81
81
  render 'attributes_table', :entry => entry
82
82
  render 'links', :entry => entry
83
83
 
84
- div :class => 'columns' do
85
- render 'members', :entry => entry
86
- render 'revisions', :entry => entry
87
- end
84
+ tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(:entry),
85
+ :i18n => 'pageflow.admin.resource_tabs',
86
+ :build_args => [entry])
88
87
  end
89
88
 
90
89
  controller do
91
90
  helper FoldersHelper
92
91
  helper EntriesHelper
93
- helper Admin::RevisionsHelper
92
+ helper Pageflow::Admin::RevisionsHelper
94
93
 
95
94
  def scoped_collection
96
95
  params.key?(:folder_id) ? super.where(:folder_id => params[:folder_id]) : super
@@ -1,4 +1,6 @@
1
- pageflow.AudioPlayer = function(sources, tag) {
1
+ pageflow.AudioPlayer = function(sources, options) {
2
+ options = options || {};
3
+
2
4
  var codecMapping = {
3
5
  vorbis: 'audio/ogg',
4
6
  mp4: 'audio/mp4',
@@ -6,16 +8,23 @@ pageflow.AudioPlayer = function(sources, tag) {
6
8
  };
7
9
 
8
10
  var ready = new $.Deferred();
11
+ var loaded = new $.Deferred();
12
+
9
13
  var audio = new Audio5js({
10
- reusedTag: tag,
14
+ reusedTag: options.tag,
11
15
  swf_path: pageflow.assetUrls.audioSwf,
12
16
  throw_errors: false,
13
17
  format_time: false,
14
18
  codecs: ['vorbis', 'mp4', 'mp3'],
15
- ready: ready.resolve
19
+ ready: ready.resolve,
20
+ loop: options.loop
16
21
  });
17
22
 
18
23
  audio.readyPromise = ready.promise();
24
+ audio.loadedPromise = loaded.promise();
25
+
26
+ audio.on('load', loaded.resolve);
27
+
19
28
  audio.src = function(sources) {
20
29
  ready.then(function() {
21
30
  var source = _.detect(sources || [], function(source) {
@@ -59,16 +68,16 @@ pageflow.AudioPlayer = function(sources, tag) {
59
68
  return audio;
60
69
  };
61
70
 
62
- pageflow.AudioPlayer.fromAudioTag = function(element) {
71
+ pageflow.AudioPlayer.fromAudioTag = function(element, options) {
63
72
  return new pageflow.AudioPlayer(element.find('source').map(function() {
64
73
  return {
65
74
  src: $(this).attr('src'),
66
75
  type: $(this).attr('type')
67
76
  };
68
- }).get(), element[0]);
77
+ }).get(), {tag: element[0], loop: options.loop});
69
78
  };
70
79
 
71
- pageflow.AudioPlayer.fromScriptTag = function(element) {
80
+ pageflow.AudioPlayer.fromScriptTag = function(element, options) {
72
81
  var sources = element.length ? JSON.parse(element.text()) : [];
73
- return new pageflow.AudioPlayer(sources);
82
+ return new pageflow.AudioPlayer(sources, options);
74
83
  };
@@ -26,6 +26,8 @@
26
26
  //= require backbone-rails
27
27
  //= require_self
28
28
 
29
+ //= require ./cookies
30
+ //= require ./events
29
31
  //= require ./page_type
30
32
  //= require ./asset_urls
31
33
  //= require ./preload
@@ -33,9 +35,12 @@
33
35
  //= require ./features
34
36
  //= require ./audio_player
35
37
  //= require ./video_player
38
+ //= require ./visited
36
39
  //= require ./print_layout
37
40
  //= require ./history
38
41
  //= require ./manual_start
42
+ //= require ./widget_types
43
+ //= require ./built_in_widget_types
39
44
 
40
45
  //= require ./settings
41
46
 
@@ -0,0 +1,11 @@
1
+ pageflow.widgetTypes.register('default_navigation', {
2
+ enhance: function(element) {
3
+ element.navigation();
4
+ }
5
+ });
6
+
7
+ pageflow.widgetTypes.register('default_mobile_navigation', {
8
+ enhance: function(element) {
9
+ element.navigationMobile();
10
+ }
11
+ });
@@ -0,0 +1,43 @@
1
+ /**
2
+ * https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
3
+ */
4
+
5
+ pageflow.cookies = {
6
+ getItem: function (sKey) {
7
+ if (!sKey) { return null; }
8
+ return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
9
+ },
10
+ setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
11
+ if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
12
+ var sExpires = "";
13
+ if (vEnd) {
14
+ switch (vEnd.constructor) {
15
+ case Number:
16
+ sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
17
+ break;
18
+ case String:
19
+ sExpires = "; expires=" + vEnd;
20
+ break;
21
+ case Date:
22
+ sExpires = "; expires=" + vEnd.toUTCString();
23
+ break;
24
+ }
25
+ }
26
+ document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
27
+ return true;
28
+ },
29
+ removeItem: function (sKey, sPath, sDomain) {
30
+ if (!this.hasItem(sKey)) { return false; }
31
+ document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
32
+ return true;
33
+ },
34
+ hasItem: function (sKey) {
35
+ if (!sKey) { return false; }
36
+ return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
37
+ },
38
+ keys: function () {
39
+ var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
40
+ for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
41
+ return aKeys;
42
+ }
43
+ };
@@ -1,7 +1,7 @@
1
1
  //= require cocktail
2
2
  //= require backbone.marionette
3
+ //= require pageflow/ui
3
4
  //= require ./sync
4
- //= require ./renderer
5
5
 
6
6
  //= require jquery.ui.all
7
7
  //= require jquery/layout
@@ -11,13 +11,6 @@
11
11
  //= require jquery-fileupload/jquery.fileupload
12
12
  //= require jquery-fileupload/jquery.fileupload-fp
13
13
 
14
- //= require wysihtml5
15
- //= require parser_rules/simple
16
-
17
- //= require i18n
18
- //= require i18n/translations
19
-
20
- //= require ./object
21
14
  //= require ./api
22
15
 
23
16
  //= require_self
@@ -39,13 +32,12 @@
39
32
  //= require ./views/file_item_view
40
33
  //= require ./views/chapter_item_view
41
34
  //= require ./views/page_item_view
42
- //= require ./views/configuration_editor_tab_view
43
- //= require ./views/configuration_editor_view
44
35
  //= require_tree ./views/configuration_editors
45
36
  //= require_tree ./views
46
37
 
47
38
  //= require ./initializers/setup_config
48
39
  //= require ./initializers/setup_file_types
40
+ //= require ./initializers/setup_widget_types
49
41
  //= require ./initializers/setup_collections
50
42
  //= require ./initializers/setup_page_types
51
43
  //= require ./initializers/edit_lock
@@ -0,0 +1,16 @@
1
+ pageflow.WidgetsCollection = Backbone.Collection.extend({
2
+ model: pageflow.Widget,
3
+
4
+ initialize: function(models, options) {
5
+ options = options || {};
6
+ this.subject = options.subject;
7
+ },
8
+
9
+ url: function() {
10
+ return this.subject.widgetsUrlRoot() + '/widgets';
11
+ },
12
+ });
13
+
14
+ pageflow.WidgetsCollection.createForSubject = function(subject) {
15
+ return new pageflow.WidgetsCollection([], {subject: subject});
16
+ };
@@ -27,9 +27,10 @@ pageflow.SidebarController = Backbone.Marionette.Controller.extend({
27
27
  }));
28
28
  },
29
29
 
30
- metaData: function() {
30
+ metaData: function(tab) {
31
31
  this.region.show(new pageflow.EditMetaDataView({
32
- model: this.entry
32
+ model: this.entry,
33
+ tab: tab
33
34
  }));
34
35
  },
35
36
 
@@ -0,0 +1,2 @@
1
+ <div class="widget_type">
2
+ </div>
@@ -0,0 +1,3 @@
1
+ pageflow.app.addInitializer(function(options) {
2
+ pageflow.editor.widgetTypes = options.widget_types;
3
+ });
@@ -19,7 +19,7 @@ pageflow.Configuration = Backbone.Model.extend({
19
19
  * routes to lookup configuration via its page.
20
20
  */
21
21
  getRoutableId: function() {
22
- return this.page.id;
22
+ return this.parent.id;
23
23
  },
24
24
 
25
25
  getImageFileUrl: function(attribute) {
@@ -36,17 +36,26 @@ pageflow.Configuration = Backbone.Model.extend({
36
36
  return this.getReference(attribute, pageflow.imageFiles);
37
37
  },
38
38
 
39
- getImageFilePosition: function(attribute, coord) {
40
- var propertyName = this._imageFilePositionProperty(attribute, coord);
39
+ getFilePosition: function(attribute, coord) {
40
+ var propertyName = this._filePositionProperty(attribute, coord);
41
41
  return this.has(propertyName) ? this.get(propertyName) : 50;
42
42
  },
43
43
 
44
- setImageFilePosition: function(attribute, coord, value) {
45
- var propertyName = this._imageFilePositionProperty(attribute, coord);
44
+ setFilePosition: function(attribute, coord, value) {
45
+ var propertyName = this._filePositionProperty(attribute, coord);
46
46
  this.set(propertyName, value);
47
47
  },
48
48
 
49
- _imageFilePositionProperty: function(attribute, coord) {
49
+ setFilePositions: function(attribute, x, y) {
50
+ var attributes = {};
51
+
52
+ attributes[this._filePositionProperty(attribute, 'x')] = x;
53
+ attributes[this._filePositionProperty(attribute, 'y')] = y;
54
+
55
+ this.set(attributes);
56
+ },
57
+
58
+ _filePositionProperty: function(attribute, coord) {
50
59
  return attribute.replace(/_id$/, '_' + coord);
51
60
  },
52
61
 
@@ -93,15 +102,15 @@ pageflow.Configuration = Backbone.Model.extend({
93
102
  },
94
103
 
95
104
  _appendSuffix: function(sources) {
96
- var page = this.page;
105
+ var parent = this.parent;
97
106
 
98
- if (!page || !page.id) {
107
+ if (!parent || !parent.id) {
99
108
  return sources;
100
109
  }
101
110
 
102
111
  return _.map(sources, function(source) {
103
112
  var clone = _.clone(source);
104
- clone.src = clone.src + '?e=' + page.id;
113
+ clone.src = clone.src + '?e=' + parent.id;
105
114
  return clone;
106
115
  });
107
116
  }
@@ -66,6 +66,7 @@ pageflow.EditLockContainer = Backbone.Model.extend({
66
66
  release: function() {
67
67
  if (this.lock) {
68
68
  var promise = this.lock.destroy();
69
+ delete sessionStorage[this.storageKey];
69
70
  this.lock = null;
70
71
  return promise;
71
72
  }
@@ -3,12 +3,21 @@ pageflow.Entry = Backbone.Model.extend({
3
3
  urlRoot: '/entries',
4
4
  modelName: 'entry',
5
5
  i18nKey: 'pageflow/entry',
6
+ collectionName: 'entries',
6
7
 
7
- mixins: [pageflow.filesCountWatcher, pageflow.polling, pageflow.failureTracking],
8
+ autoSaveWidgets: true,
9
+
10
+ mixins: [pageflow.filesCountWatcher,
11
+ pageflow.polling,
12
+ pageflow.failureTracking,
13
+ pageflow.widgetSubject],
8
14
 
9
15
  initialize: function(attributes, options) {
10
16
  options = options || {};
11
17
 
18
+ this.configuration = new pageflow.EntryConfiguration(this.get('configuration') || {});
19
+ this.configuration.parent = this;
20
+
12
21
  this.files = options.files || pageflow.files;
13
22
  this.chapters = options.chapters || pageflow.chapters;
14
23
  this.chapters.parentModel = this;
@@ -26,7 +35,8 @@ pageflow.Entry = Backbone.Model.extend({
26
35
  this.pages.sort();
27
36
  });
28
37
 
29
- this.listenTo(this, 'change:title change:summary change:credits change:manual_start change:home_url change:home_button_enabled', function() {
38
+ this.listenTo(this.configuration, 'change', function() {
39
+ this.trigger('change:configuration');
30
40
  this.save();
31
41
  });
32
42
  },
@@ -87,6 +97,6 @@ pageflow.Entry = Backbone.Model.extend({
87
97
  },
88
98
 
89
99
  toJSON: function() {
90
- return _.pick(this.attributes, 'title', 'summary', 'credits', 'manual_start', 'home_url', 'home_button_enabled');
100
+ return this.configuration.toJSON();
91
101
  }
92
102
  });
@@ -0,0 +1,4 @@
1
+ pageflow.EntryConfiguration = pageflow.Configuration.extend({
2
+ modelName: 'entry',
3
+ i18nKey: 'pageflow/entry'
4
+ });
@@ -0,0 +1,11 @@
1
+ pageflow.EntryConfigurationFileSelectionHandler = function(options) {
2
+ this.call = function(file) {
3
+ pageflow.entry.configuration.setReference(options.attributeName, file);
4
+ };
5
+
6
+ this.getReferer = function() {
7
+ return '/meta_data/' + (options.returnToTab || 'general');
8
+ };
9
+ };
10
+
11
+ pageflow.editor.registerFileSelectionHandler('entryConfiguration', pageflow.EntryConfigurationFileSelectionHandler);
@@ -15,6 +15,10 @@ pageflow.ImageFile = pageflow.UploadedFile.extend({
15
15
 
16
16
  readyState: 'processed',
17
17
 
18
+ getBackgroundPositioningImageUrl: function() {
19
+ return this.get('url');
20
+ },
21
+
18
22
  isPositionable: function() {
19
23
  return this.isReady();
20
24
  }