pageflow 0.8.2 → 0.9.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 (293) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +810 -0
  3. data/README.md +179 -0
  4. data/admins/pageflow/accounts.rb +46 -3
  5. data/admins/pageflow/entry.rb +35 -7
  6. data/app/assets/javascripts/pageflow/audio.js +62 -0
  7. data/app/assets/javascripts/pageflow/audio/multi_player.js +127 -0
  8. data/app/assets/javascripts/pageflow/audio/player_pool.js +15 -0
  9. data/app/assets/javascripts/pageflow/audio_player.js +23 -1
  10. data/app/assets/javascripts/pageflow/audio_player/null.js +37 -0
  11. data/app/assets/javascripts/pageflow/audio_player/pause_in_background.js +34 -0
  12. data/app/assets/javascripts/pageflow/audio_player/rewind_method.js +17 -0
  13. data/app/assets/javascripts/pageflow/audio_player/seek_with_invalid_state_handling.js +41 -0
  14. data/app/assets/javascripts/pageflow/base.js +10 -0
  15. data/app/assets/javascripts/pageflow/browser.js +123 -0
  16. data/app/assets/javascripts/pageflow/{features → browser}/hashchange_support.js +1 -1
  17. data/app/assets/javascripts/pageflow/{features → browser}/high_bandwidth.js +1 -1
  18. data/app/assets/javascripts/pageflow/{features → browser}/ie_platform.js +1 -1
  19. data/app/assets/javascripts/pageflow/browser/ios_platform.js +6 -0
  20. data/app/assets/javascripts/pageflow/{features → browser}/mobile_platform.js +1 -1
  21. data/app/assets/javascripts/pageflow/{features → browser}/phone_platform.js +1 -1
  22. data/app/assets/javascripts/pageflow/browser/pushstate_support.js +3 -0
  23. data/app/assets/javascripts/pageflow/{features → browser}/touch_support.js +1 -1
  24. data/app/assets/javascripts/pageflow/browser/video.js +16 -0
  25. data/app/assets/javascripts/pageflow/browser/volume_control_support.js +3 -0
  26. data/app/assets/javascripts/pageflow/chapter_filter.js +56 -0
  27. data/app/assets/javascripts/pageflow/editor/api.js +29 -0
  28. data/app/assets/javascripts/pageflow/editor/api/page_type.js +42 -0
  29. data/app/assets/javascripts/pageflow/editor/api/page_types.js +47 -0
  30. data/app/assets/javascripts/pageflow/editor/base.js +7 -1
  31. data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +5 -1
  32. data/app/assets/javascripts/pageflow/editor/initializers/boot.js +10 -2
  33. data/app/assets/javascripts/pageflow/editor/initializers/setup_audio.js +8 -0
  34. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +7 -0
  35. data/app/assets/javascripts/pageflow/editor/initializers/setup_features.js +3 -0
  36. data/app/assets/javascripts/pageflow/editor/initializers/setup_hotkeys.js +20 -0
  37. data/app/assets/javascripts/pageflow/editor/initializers/setup_page_types.js +1 -6
  38. data/app/assets/javascripts/pageflow/editor/models/audio_file.js +8 -0
  39. data/app/assets/javascripts/pageflow/editor/models/chapter.js +23 -4
  40. data/app/assets/javascripts/pageflow/editor/models/chapter_configuration.js +7 -0
  41. data/app/assets/javascripts/pageflow/editor/models/configuration.js +5 -3
  42. data/app/assets/javascripts/pageflow/editor/models/entry.js +6 -4
  43. data/app/assets/javascripts/pageflow/editor/models/mixins/delayed_destroying.js +1 -1
  44. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +3 -2
  45. data/app/assets/javascripts/pageflow/editor/models/page.js +11 -4
  46. data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +31 -0
  47. data/app/assets/javascripts/pageflow/editor/models/theming.js +8 -0
  48. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +8 -0
  49. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button.jst.ejs +6 -0
  50. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button_item.jst.ejs +1 -0
  51. data/app/assets/javascripts/pageflow/editor/templates/files_explorer.jst.ejs +2 -2
  52. data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +7 -0
  53. data/app/assets/javascripts/pageflow/editor/templates/list.jst.ejs +5 -0
  54. data/app/assets/javascripts/pageflow/editor/templates/list_blank_slate.jst.ejs +1 -0
  55. data/app/assets/javascripts/pageflow/editor/templates/list_item.jst.ejs +11 -0
  56. data/app/assets/javascripts/pageflow/editor/templates/loading.jst.ejs +7 -1
  57. data/app/assets/javascripts/pageflow/editor/templates/other_entries_blank_slate.jst.ejs +1 -1
  58. data/app/assets/javascripts/pageflow/editor/templates/page_link_item.jst.ejs +7 -0
  59. data/app/assets/javascripts/pageflow/editor/templates/page_links.jst.ejs +6 -0
  60. data/app/assets/javascripts/pageflow/editor/templates/page_selection.jst.ejs +12 -0
  61. data/app/assets/javascripts/pageflow/editor/templates/publish_entry.jst.ejs +44 -8
  62. data/app/assets/javascripts/pageflow/editor/views/chapter_item_view.js +3 -1
  63. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
  64. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +34 -2
  65. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_transitions.js +6 -0
  66. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +6 -1
  67. data/app/assets/javascripts/pageflow/editor/views/disabled_atmo_indicator_view.js +27 -0
  68. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_item_view.js +33 -0
  69. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_view.js +80 -0
  70. data/app/assets/javascripts/pageflow/editor/views/edit_chapter_view.js +25 -5
  71. data/app/assets/javascripts/pageflow/editor/views/edit_entry_view.js +9 -1
  72. data/app/assets/javascripts/pageflow/editor/views/edit_page_view.js +7 -5
  73. data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +1 -1
  74. data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +4 -1
  75. data/app/assets/javascripts/pageflow/editor/views/embedded/lazy_video_embedded_view.js +41 -0
  76. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +6 -6
  77. data/app/assets/javascripts/pageflow/editor/views/inputs/page_link_input_view.js +9 -0
  78. data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +66 -0
  79. data/app/assets/javascripts/pageflow/editor/views/list_item_view.js +95 -0
  80. data/app/assets/javascripts/pageflow/editor/views/list_view.js +59 -0
  81. data/app/assets/javascripts/pageflow/editor/views/loading_view.js +5 -0
  82. data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +37 -0
  83. data/app/assets/javascripts/pageflow/editor/views/navigatable_page_item_view.js +1 -0
  84. data/app/assets/javascripts/pageflow/editor/views/other_entries_collection_view.js +4 -4
  85. data/app/assets/javascripts/pageflow/editor/views/other_entry_item_view.js +2 -1
  86. data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +2 -2
  87. data/app/assets/javascripts/pageflow/editor/views/page_link_item_view.js +51 -0
  88. data/app/assets/javascripts/pageflow/editor/views/page_links_view.js +45 -0
  89. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +24 -16
  90. data/app/assets/javascripts/pageflow/editor/views/page_selection_view.js +46 -0
  91. data/app/assets/javascripts/pageflow/editor/views/page_thumbnail_view.js +2 -29
  92. data/app/assets/javascripts/pageflow/editor/views/publish_entry_view.js +95 -10
  93. data/app/assets/javascripts/pageflow/editor/views/scrolling_view.js +24 -0
  94. data/app/assets/javascripts/pageflow/entry_data.js +35 -0
  95. data/app/assets/javascripts/pageflow/features.js +68 -98
  96. data/app/assets/javascripts/pageflow/fullscreen.js +24 -0
  97. data/app/assets/javascripts/pageflow/highlighted_page.js +48 -0
  98. data/app/assets/javascripts/pageflow/history.js +50 -18
  99. data/app/assets/javascripts/pageflow/history/hash_adapter.js +36 -0
  100. data/app/assets/javascripts/pageflow/history/push_state_adapter.js +37 -0
  101. data/app/assets/javascripts/pageflow/history/simulated_adapter.js +44 -0
  102. data/app/assets/javascripts/pageflow/media_player.js +25 -0
  103. data/app/assets/javascripts/pageflow/media_player/async_play.js +54 -0
  104. data/app/assets/javascripts/pageflow/media_player/hooks.js +24 -0
  105. data/app/assets/javascripts/pageflow/media_player/load_waiting.js +11 -0
  106. data/app/assets/javascripts/pageflow/media_player/volume_binding.js +72 -0
  107. data/app/assets/javascripts/pageflow/media_player/volume_fading.js +62 -0
  108. data/app/assets/javascripts/pageflow/multimedia_alert.js +13 -0
  109. data/app/assets/javascripts/pageflow/object.js +14 -0
  110. data/app/assets/javascripts/pageflow/page_transitions.js +27 -0
  111. data/app/assets/javascripts/pageflow/page_type.js +6 -0
  112. data/app/assets/javascripts/pageflow/page_types/audio.js +17 -21
  113. data/app/assets/javascripts/pageflow/page_types/background_video.js +18 -17
  114. data/app/assets/javascripts/pageflow/page_types/mixins/common_page_css_classes.js +29 -4
  115. data/app/assets/javascripts/pageflow/page_types/video.js +73 -36
  116. data/app/assets/javascripts/pageflow/preload.js +9 -6
  117. data/app/assets/javascripts/pageflow/ready.js +18 -14
  118. data/app/assets/javascripts/pageflow/seed_entry_data.js +43 -0
  119. data/app/assets/javascripts/pageflow/settings.js +17 -4
  120. data/app/assets/javascripts/pageflow/slideshow.js +103 -23
  121. data/app/assets/javascripts/pageflow/slideshow/adjacent_pages.js +26 -0
  122. data/app/assets/javascripts/pageflow/slideshow/adjacent_preparer.js +44 -0
  123. data/app/assets/javascripts/pageflow/slideshow/atmo.js +105 -0
  124. data/app/assets/javascripts/pageflow/slideshow/dom_order_scroll_navigator.js +29 -0
  125. data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +49 -0
  126. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +60 -26
  127. data/app/assets/javascripts/pageflow/slideshow/progressive_preload.js +16 -7
  128. data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +45 -7
  129. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +42 -5
  130. data/app/assets/javascripts/pageflow/ui.js +1 -0
  131. data/app/assets/javascripts/pageflow/ui/object.js +4 -13
  132. data/app/assets/javascripts/pageflow/ui/utils/i18n_utils.js +23 -0
  133. data/app/assets/javascripts/pageflow/ui/views/collection_view.js +8 -4
  134. data/app/assets/javascripts/pageflow/ui/views/configuration_editor_tab_view.js +6 -5
  135. data/app/assets/javascripts/pageflow/ui/views/configuration_editor_view.js +2 -11
  136. data/app/assets/javascripts/pageflow/ui/views/inputs/select_input_view.js +6 -1
  137. data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +4 -0
  138. data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +149 -6
  139. data/app/assets/javascripts/pageflow/ui/views/mixins/subview_container.js +4 -0
  140. data/app/assets/javascripts/pageflow/video_player.js +5 -0
  141. data/app/assets/javascripts/pageflow/video_player/buffer_underrun_waiting.js +1 -1
  142. data/app/assets/javascripts/pageflow/video_player/lazy.js +8 -4
  143. data/app/assets/javascripts/pageflow/video_player/media_events.js +1 -1
  144. data/app/assets/javascripts/pageflow/video_player/play_button_patch.js +1 -1
  145. data/app/assets/javascripts/pageflow/video_player/prebuffering.js +1 -1
  146. data/app/assets/javascripts/pageflow/widgets/fullscreen_button.js +26 -0
  147. data/app/assets/javascripts/pageflow/widgets/multimedia_alert.js +21 -5
  148. data/app/assets/javascripts/pageflow/widgets/mute_button.js +42 -0
  149. data/app/assets/javascripts/pageflow/widgets/navigation.js +5 -78
  150. data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +4 -0
  151. data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +28 -34
  152. data/app/assets/javascripts/pageflow/widgets/parent_page_button.js +27 -0
  153. data/app/assets/javascripts/pageflow/widgets/skip_page_button.js +22 -0
  154. data/app/assets/javascripts/pageflow/widgets/top_button.js +6 -7
  155. data/app/assets/javascripts/pageflow/widgets/volume_slider.js +62 -0
  156. data/app/assets/stylesheets/pageflow/admin/entries.css.scss +10 -0
  157. data/app/assets/stylesheets/pageflow/animations.css.scss +1 -0
  158. data/app/assets/stylesheets/pageflow/animations/loading.css.scss +8 -0
  159. data/app/assets/stylesheets/pageflow/animations/scroll.css.scss +18 -0
  160. data/app/assets/stylesheets/pageflow/base.css.scss +3 -1
  161. data/app/assets/stylesheets/pageflow/delayed_text_fade_in.css.scss +49 -0
  162. data/app/assets/stylesheets/pageflow/editor/base.css.scss +15 -2
  163. data/app/assets/stylesheets/pageflow/editor/disabled_atmo_indicator.css.scss +13 -0
  164. data/app/assets/stylesheets/pageflow/editor/drop_down_button.css.scss +54 -0
  165. data/app/assets/stylesheets/pageflow/editor/files_explorer.css.scss +6 -0
  166. data/app/assets/stylesheets/pageflow/editor/indicators.css.scss +5 -0
  167. data/app/assets/stylesheets/pageflow/editor/inputs.css.scss +1 -0
  168. data/app/assets/stylesheets/pageflow/editor/inputs/reference.css.scss +51 -0
  169. data/app/assets/stylesheets/pageflow/editor/list.css.scss +108 -0
  170. data/app/assets/stylesheets/pageflow/editor/loading.css.scss +31 -0
  171. data/app/assets/stylesheets/pageflow/editor/outline.css.scss +7 -5
  172. data/app/assets/stylesheets/pageflow/editor/page_links.css.scss +58 -0
  173. data/app/assets/stylesheets/pageflow/editor/page_selection.css.scss +39 -0
  174. data/app/assets/stylesheets/pageflow/editor/publish_entry.css.scss +38 -1
  175. data/app/assets/stylesheets/pageflow/entries.css.scss +17 -9
  176. data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
  177. data/app/assets/stylesheets/pageflow/page_transitions.css.scss +10 -0
  178. data/app/assets/stylesheets/pageflow/page_transitions/crossfade.css.scss +29 -0
  179. data/app/assets/stylesheets/pageflow/page_transitions/cut.css.scss +23 -0
  180. data/app/assets/stylesheets/pageflow/page_transitions/fade.css.scss +78 -0
  181. data/app/assets/stylesheets/pageflow/page_transitions/fade_to_black.css.scss +107 -0
  182. data/app/assets/stylesheets/pageflow/page_transitions/scroll.css.scss +20 -0
  183. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in.css.scss +66 -0
  184. data/app/assets/stylesheets/pageflow/page_transitions/scroll_in_right.css.scss +68 -0
  185. data/app/assets/stylesheets/pageflow/page_transitions/scroll_left.css.scss +20 -0
  186. data/app/assets/stylesheets/pageflow/page_transitions/scroll_right.css.scss +20 -0
  187. data/app/assets/stylesheets/pageflow/page_types.css.scss +1 -3
  188. data/app/assets/stylesheets/pageflow/page_types/video.css.scss +0 -4
  189. data/app/assets/stylesheets/pageflow/slideshow.css.scss +0 -145
  190. data/app/assets/stylesheets/pageflow/text_variants.css.scss +0 -4
  191. data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +0 -3
  192. data/app/controllers/concerns/pageflow/public_https_mode.rb +13 -0
  193. data/app/controllers/pageflow/application_controller.rb +0 -6
  194. data/app/controllers/pageflow/chapters_controller.rb +2 -1
  195. data/app/controllers/pageflow/editor/entries_controller.rb +2 -0
  196. data/app/controllers/pageflow/editor/entry_publications_controller.rb +3 -1
  197. data/app/controllers/pageflow/entries_controller.rb +16 -3
  198. data/app/controllers/pageflow/files_controller.rb +3 -1
  199. data/app/helpers/pageflow/admin/features_helper.rb +25 -0
  200. data/app/helpers/pageflow/background_image_helper.rb +40 -9
  201. data/app/helpers/pageflow/entries_helper.rb +10 -11
  202. data/app/helpers/pageflow/entry_json_seed_helper.rb +44 -0
  203. data/app/helpers/pageflow/help_entries_helper.rb +4 -4
  204. data/app/helpers/pageflow/page_types_helper.rb +4 -2
  205. data/app/helpers/pageflow/pages_helper.rb +20 -27
  206. data/app/helpers/pageflow/widgets_helper.rb +4 -4
  207. data/app/models/concerns/pageflow/feature_target.rb +37 -0
  208. data/app/models/pageflow/account.rb +2 -0
  209. data/app/models/pageflow/chapter.rb +6 -0
  210. data/app/models/pageflow/draft_entry.rb +2 -0
  211. data/app/models/pageflow/entry.rb +47 -9
  212. data/app/models/pageflow/entry_duplicate.rb +51 -0
  213. data/app/models/pageflow/image_file.rb +33 -13
  214. data/app/models/pageflow/page.rb +2 -2
  215. data/app/models/pageflow/published_entry.rb +7 -1
  216. data/app/views/admin/accounts/_form.html.erb +11 -1
  217. data/app/views/admin/features/_form.html.erb +16 -0
  218. data/app/views/components/pageflow/admin/features_tab.rb +10 -0
  219. data/app/views/components/pageflow/admin/revisions_tab.rb +4 -0
  220. data/app/views/layouts/pageflow/_meta_tags.html.erb +1 -1
  221. data/app/views/layouts/pageflow/application.html.erb +2 -2
  222. data/app/views/pageflow/editor/accounts/_account.json.jbuilder +1 -0
  223. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  224. data/app/views/pageflow/editor/entries/_help_entries_seed.html.erb +2 -2
  225. data/app/views/pageflow/editor/entries/_indicators_seed.html.erb +3 -0
  226. data/app/views/pageflow/editor/entries/seed.json.erb +3 -2
  227. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +1 -0
  228. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
  229. data/app/views/pageflow/editor/themings/_theming.json.jbuilder +4 -0
  230. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -0
  231. data/app/views/pageflow/entries/_entry.html.erb +4 -3
  232. data/app/views/pageflow/entries/_indicators.html.erb +13 -0
  233. data/app/views/pageflow/entries/_mobile_navigation.html.erb +3 -15
  234. data/app/views/pageflow/entries/edit.html.erb +9 -1
  235. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +3 -15
  236. data/app/views/pageflow/entries/share_menu/_facebook_link.html.erb +12 -0
  237. data/app/views/pageflow/entries/share_menu/_google_link.html.erb +12 -0
  238. data/app/views/pageflow/entries/share_menu/_twitter_link.html.erb +12 -0
  239. data/app/views/pageflow/entries/show.css.erb +12 -2
  240. data/app/views/pageflow/entries/show.html.erb +5 -1
  241. data/app/views/pageflow/page_types/_page_type.json.jbuilder +7 -1
  242. data/app/views/pageflow/pages/_page.html.erb +2 -2
  243. data/app/views/pageflow/pages/templates/_audio.html.erb +10 -0
  244. data/config/initializers/admin_resource_tabs.rb +1 -0
  245. data/config/initializers/features.rb +9 -0
  246. data/config/initializers/page_type_helpers.rb +1 -1
  247. data/config/initializers/paperclip.rb +1 -1
  248. data/config/initializers/zencoder.rb +1 -1
  249. data/config/locales/de.yml +132 -71
  250. data/config/locales/en.yml +118 -191
  251. data/db/migrate/20141211110226_add_configuration_to_chapters.rb +5 -0
  252. data/db/migrate/20150115175116_add_features_configuration_to_accounts.rb +5 -0
  253. data/db/migrate/20150115175207_add_features_configuration_to_entries.rb +5 -0
  254. data/db/migrate/20150603091823_add_password_attributes_to_revisions.rb +6 -0
  255. data/db/migrate/20151022080518_add_first_published_at_to_entries.rb +14 -0
  256. data/lib/generators/pageflow/initializer/templates/pageflow.rb +26 -17
  257. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  258. data/lib/pageflow.rb +2 -46
  259. data/lib/pageflow/admin/form_input.rb +18 -0
  260. data/lib/pageflow/admin/form_inputs.rb +41 -0
  261. data/lib/pageflow/built_in_page_type.rb +0 -4
  262. data/lib/pageflow/configuration.rb +74 -18
  263. data/lib/pageflow/feature.rb +33 -0
  264. data/lib/pageflow/features.rb +68 -0
  265. data/lib/pageflow/global_config_api.rb +118 -0
  266. data/lib/pageflow/page_type_feature.rb +21 -0
  267. data/lib/pageflow/page_types.rb +29 -0
  268. data/lib/pageflow/theme.rb +20 -0
  269. data/lib/pageflow/themes.rb +26 -0
  270. data/lib/pageflow/version.rb +1 -1
  271. data/spec/factories/entries.rb +6 -0
  272. data/spec/factories/feature_targets.rb +4 -0
  273. data/spec/fixtures/image.gif +0 -0
  274. data/spec/fixtures/video.mp4 +0 -0
  275. data/vendor/assets/javascripts/audio5.min.js +12 -8
  276. data/vendor/assets/javascripts/iscroll.js +1 -1
  277. metadata +144 -24
  278. data/app/assets/images/pageflow/internal_links_pictogram.png +0 -0
  279. data/app/assets/images/pageflow/internal_links_pictogram_small.png +0 -0
  280. data/app/assets/images/pageflow/internal_links_sprite.png +0 -0
  281. data/app/assets/images/pageflow/ov-internal_links.png +0 -0
  282. data/app/assets/images/pageflow/themes/default/internal_links_sprite.png +0 -0
  283. data/app/assets/javascripts/pageflow/editor/templates/embedded/page_link.jst.ejs +0 -3
  284. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +0 -24
  285. data/app/assets/javascripts/pageflow/editor/views/draggable_page_item_view.js +0 -31
  286. data/app/assets/javascripts/pageflow/editor/views/embedded/page_link_embedded_view.js +0 -176
  287. data/app/assets/javascripts/pageflow/features/video.js +0 -16
  288. data/app/assets/javascripts/pageflow/page_types/internal_links.js +0 -55
  289. data/app/assets/javascripts/pageflow/ui/templates/inputs/page_reference.jst.ejs +0 -6
  290. data/app/assets/javascripts/pageflow/ui/views/inputs/page_reference_input_view.js +0 -44
  291. data/app/assets/stylesheets/pageflow/editor/embedded.css.scss +0 -104
  292. data/app/assets/stylesheets/pageflow/page_types/internal_links.css.scss +0 -222
  293. data/app/views/pageflow/pages/templates/_internal_links.html.erb +0 -31
@@ -0,0 +1,23 @@
1
+ pageflow.i18nUtils = {
2
+ findTranslation: function(keys, options) {
3
+ options = options || {};
4
+
5
+ return _.chain(keys).reverse().reduce(function(result, key) {
6
+ return I18n.t(key, {defaultValue: result});
7
+ }, options.defaultValue).value();
8
+ },
9
+
10
+ findKeyWithTranslation: function(keys) {
11
+ var missing = '_not_translated';
12
+
13
+ return _(keys).detect(function(key) {
14
+ return I18n.t(key, {defaultValue: missing}) !== missing;
15
+ }) || _.first(keys);
16
+ },
17
+
18
+ translationKeysWithSuffix: function(keys, suffix) {
19
+ return _.chain(keys).map(function(key) {
20
+ return [key + '_' + suffix, key];
21
+ }).flatten().value();
22
+ }
23
+ };
@@ -16,6 +16,7 @@ pageflow.CollectionView = Backbone.Marionette.View.extend({
16
16
  });
17
17
  this.listenTo(this.collection, 'sync', function() {
18
18
  this.loading = false;
19
+ this.togglePlaceHolder();
19
20
  });
20
21
  }
21
22
  },
@@ -109,13 +110,16 @@ pageflow.CollectionView = Backbone.Marionette.View.extend({
109
110
  },
110
111
 
111
112
  togglePlaceHolder: function() {
112
- var placeHolderConstructor = this.getPlaceHolderConstructor();
113
+ var lastPlaceholderConstructor = this.placeHolderConstructor;
114
+ this.placeHolderConstructor = this.getPlaceHolderConstructor();
113
115
 
114
- if (this.itemViews.length || !placeHolderConstructor) {
116
+ if (this.itemViews.length || !this.placeHolderConstructor) {
115
117
  this.closePlaceHolderView();
116
118
  }
117
- else if(!this.placeHolderView) {
118
- this.placeHolderView = new placeHolderConstructor();
119
+ else if(!this.placeHolderView || lastPlaceholderConstructor !== this.placeHolderConstructor) {
120
+ this.closePlaceHolderView();
121
+
122
+ this.placeHolderView = new this.placeHolderConstructor();
119
123
  this.$el.append(this.placeHolderView.render().el);
120
124
  }
121
125
  },
@@ -8,7 +8,8 @@ pageflow.ConfigurationEditorTabView = Backbone.Marionette.View.extend({
8
8
  input: function(propertyName, view, options) {
9
9
  this.view(view, _.extend({
10
10
  placeholderModel: this.options.placeholderModel,
11
- propertyName: propertyName
11
+ propertyName: propertyName,
12
+ attributeTranslationKeyPrefixes: this.options.attributeTranslationKeyPrefixes
12
13
  }, options || {}));
13
14
  },
14
15
 
@@ -20,8 +21,8 @@ pageflow.ConfigurationEditorTabView = Backbone.Marionette.View.extend({
20
21
  }, options || {})));
21
22
  },
22
23
 
23
- group: function(name) {
24
- this.groups.apply(name, this);
24
+ group: function(name, options) {
25
+ this.groups.apply(name, this, options);
25
26
  },
26
27
 
27
28
  render: function() {
@@ -50,12 +51,12 @@ pageflow.ConfigurationEditorTabView.Groups = function() {
50
51
  groups[name] = fn;
51
52
  };
52
53
 
53
- this.apply = function(name, context) {
54
+ this.apply = function(name, context, options) {
54
55
  if (!(name in groups)) {
55
56
  throw 'Undefined group named "' + name + '".';
56
57
  }
57
58
 
58
- groups[name].call(context);
59
+ groups[name].call(context, options || {});
59
60
  };
60
61
  };
61
62
 
@@ -16,7 +16,8 @@ pageflow.ConfigurationEditorView = Backbone.Marionette.View.extend({
16
16
  var tabView = new pageflow.ConfigurationEditorTabView({
17
17
  model: this.model,
18
18
  placeholderModel: this.options.placeholderModel,
19
- tab: name
19
+ tab: name,
20
+ attributeTranslationKeyPrefixes: this.options.attributeTranslationKeyPrefixes
20
21
  });
21
22
 
22
23
  callback.call(tabView);
@@ -34,15 +35,5 @@ _.extend(pageflow.ConfigurationEditorView, {
34
35
  repository: {},
35
36
  register: function(pageTypeName, prototype) {
36
37
  this.repository[pageTypeName] = pageflow.ConfigurationEditorView.extend(prototype);
37
- },
38
-
39
- create: function(pageTypeName, options) {
40
- if (!this.repository.hasOwnProperty(pageTypeName)) {
41
- throw 'No configuration editor registered for page type "' + pageTypeName + '".';
42
- }
43
-
44
- options.pageType = pageflow.Page.typesByName[pageTypeName];
45
-
46
- return new this.repository[pageTypeName](options);
47
38
  }
48
39
  });
@@ -33,8 +33,13 @@ pageflow.SelectInputView = Backbone.Marionette.ItemView.extend({
33
33
 
34
34
  if (!this.options.texts) {
35
35
  if (!this.options.translationKeys) {
36
+ var translationKeyPrefix = this.options.translationKeyPrefix ||
37
+ pageflow.i18nUtils.findKeyWithTranslation(this.attributeTranslationKeys('values', {
38
+ fallbackPrefix: 'activerecord.values'
39
+ }));
40
+
36
41
  this.options.translationKeys = _.map(this.options.values, function(value) {
37
- return 'activerecord.values.' + this.model.i18nKey + '.' + this.options.propertyName + '.' + value;
42
+ return translationKeyPrefix + '.' + value;
38
43
  }, this);
39
44
  }
40
45
 
@@ -24,6 +24,10 @@ pageflow.TextInputView = Backbone.Marionette.ItemView.extend({
24
24
  this.save();
25
25
  },
26
26
 
27
+ onClose: function() {
28
+ this.save();
29
+ },
30
+
27
31
  save: function() {
28
32
  this.model.set(this.options.propertyName, this.ui.input.val());
29
33
  },
@@ -1,9 +1,135 @@
1
+ /**
2
+ * Mixin for input views handling common concerns like labels,
3
+ * inline help, visiblity and disabling.
4
+ *
5
+ * ## Label and Inline Help Translations
6
+ *
7
+ * By default `#labelText` and `#inlineHelpText` are defined through
8
+ * translations. If no `attributeTranslationKeyPrefixes` are given,
9
+ * translation keys for labels and inline help are constructed from
10
+ * the `i18nKey` of the model and the given `propertyName`
11
+ * option. Suppose the model's `i18nKey` is "page" and the
12
+ * `propertyName` option is "title". Then the key
13
+ *
14
+ * activerecord.attributes.page.title
15
+ *
16
+ * will be used for the label. And the key
17
+ *
18
+ * pageflow.ui.inline_help.page.title
19
+ *
20
+ * will be used for the inline help.
21
+ *
22
+ * ### Attribute Translation Key Prefixes
23
+ *
24
+ * The `attributeTranslationKeyPrefixes` option can be used to supply
25
+ * an array of scopes in which label and inline help translations
26
+ * shall be looked up based on the `propertyName` option.
27
+ *
28
+ * Suppose the array `['some.attributes', 'fallback.attributes']` is
29
+ * given as `attributeTranslationKeyPrefixes` option. Then, in the
30
+ * example above, the first existing translation key is used as label:
31
+ *
32
+ * some.attributes.title.label
33
+ * fallback.attributes.title.label
34
+ * activerecord.attributes.post.title
35
+ *
36
+ * Accordingly, for the inline help:
37
+ *
38
+ * some.attributes.title.inline_help
39
+ * fallback.attributes.title.inline_help
40
+ * pageflow.ui.inline_help.post.title
41
+ *
42
+ * This setup allows to keep all translation keys for an attribute
43
+ * to share a common prefix:
44
+ *
45
+ * some:
46
+ * attributes:
47
+ * title:
48
+ * label: "Label"
49
+ * inline_help: "..."
50
+ * inline_help_disabled: "..."
51
+ *
52
+ * ### Inline Help for Disabled Inputs
53
+ *
54
+ * For each inline help translation key, a separate key with an
55
+ * `"_disbaled"` suffix can be supplied, which provides a help string
56
+ * that shall be displayed when the input is disabled. More specific
57
+ * attribute translation key prefixes take precedence over suffixed
58
+ * keys:
59
+ *
60
+ * some.attributes.title.inline_help
61
+ * some.attributes.title.inline_help_disabled
62
+ * fallback.attributes.title.inline_help
63
+ * fallback.attributes.title.inline_help_disabled
64
+ * pageflow.ui.inline_help.post.title
65
+ * pageflow.ui.inline_help.post.title_disabled
66
+ *
67
+ * @option propertyName [String]
68
+ * Name of the attribute on the model to display and edit.
69
+ *
70
+ * @option label [String]
71
+ * Label text for the input.
72
+ *
73
+ * @option attributeTranslationKeyPrefixes [Array<String>]
74
+ * An array of prefixes to lookup translations for labels and
75
+ * inline help texts based on attribute names.
76
+ *
77
+ * @option disabled [Boolean]
78
+ * Render input as disabled.
79
+ *
80
+ * @option visibleBinding [String]
81
+ * Name of an attribute to control whether the input is visible. If
82
+ * the `visible` and `visibleBindingValue` options are not set,
83
+ * input will be visible whenever this attribute as a truthy value.
84
+ *
85
+ * @option visible [Function|Boolean]
86
+ * A Function taking the value of the `visibleBinding` attribute as
87
+ * parameter. Input will be visible only if function returns `true`.
88
+ *
89
+ * @option visibleBindingValue [Any]
90
+ * Input will be visible whenever the value of the `visibleBinding`
91
+ * attribute equals the value of this option.
92
+ */
1
93
  pageflow.inputView = {
2
94
  ui: {
3
95
  labelText: 'label .name',
4
96
  inlineHelp: 'label .inline_help'
5
97
  },
6
98
 
99
+ /**
100
+ * Returns an array of translation keys based on the propertyName
101
+ * options and the given prefixes.
102
+ *
103
+ * @param keyName [String]
104
+ * Suffix to append to prefixes.
105
+ *
106
+ * @option attributeTranslationKeyPrefixes [Array<String>]
107
+ * An array of strings to use as prefixes to constructs
108
+ * translation keys.
109
+ *
110
+ * @option fallbackPrefix [String]
111
+ * Optional additional prefix to form a model based translation
112
+ * key of the form `prefix.modelI18nKey.propertyName.keyName
113
+ *
114
+ * @api edge
115
+ */
116
+ attributeTranslationKeys: function(keyName, options) {
117
+ var result = [];
118
+
119
+ if (this.options.attributeTranslationKeyPrefixes) {
120
+ result = result.concat(_(this.options.attributeTranslationKeyPrefixes).map(function(prefix) {
121
+ return prefix + '.' + this.options.propertyName + '.' + keyName;
122
+ }, this));
123
+ }
124
+
125
+ if (options && options.fallbackPrefix) {
126
+ result.push(options.fallbackPrefix + '.' + this.model.i18nKey + '.' + this.options.propertyName);
127
+ }
128
+
129
+ return result;
130
+ },
131
+
132
+ /** @private */
7
133
  onRender: function() {
8
134
  this.$el.addClass(this.model.modelName + '_' + this.options.propertyName);
9
135
  this.ui.labelText.text(this.labelText());
@@ -23,26 +149,27 @@ pageflow.inputView = {
23
149
  },
24
150
 
25
151
  localizedAttributeName: function() {
26
- return I18n.t('activerecord.attributes.' + this.model.i18nKey + '.' + this.options.propertyName);
152
+ return pageflow.i18nUtils.findTranslation(this.attributeTranslationKeys('label', {fallbackPrefix: 'activerecord.attributes'}));
27
153
  },
28
154
 
29
155
  inlineHelpText: function() {
30
- var key = 'pageflow.ui.inline_help.' + this.model.i18nKey + '.' + this.options.propertyName;
31
- var text = I18n.t(key, {defaultValue: ''});
156
+ var keys = this.attributeTranslationKeys('inline_help', {fallbackPrefix: 'pageflow.ui.inline_help'});
32
157
 
33
158
  if (this.options.disabled) {
34
- text = I18n.t(key + '_disabled', {defaultValue: text});
159
+ keys = pageflow.i18nUtils.translationKeysWithSuffix(keys, 'disabled');
35
160
  }
36
161
 
37
- return text;
162
+ return pageflow.i18nUtils.findTranslation(keys, {defaultValue: ''});
38
163
  },
39
164
 
165
+ /** @private */
40
166
  updateDisabled: function() {
41
167
  if (this.ui.input) {
42
168
  this.updateDisabledAttribute(this.ui.input);
43
169
  }
44
170
  },
45
171
 
172
+ /** @private */
46
173
  updateDisabledAttribute: function(element) {
47
174
  if (this.options.disabled) {
48
175
  element.attr('disabled', true);
@@ -52,6 +179,7 @@ pageflow.inputView = {
52
179
  }
53
180
  },
54
181
 
182
+ /** @private */
55
183
  setupVisibleBinding: function() {
56
184
  var view = this;
57
185
 
@@ -61,7 +189,22 @@ pageflow.inputView = {
61
189
  }
62
190
 
63
191
  function updateVisible(model, value) {
64
- view.$el.toggle(view.options.visibleBindingValue ? value === view.options.visibleBindingValue : !!value);
192
+ view.$el.toggle(isVisible(value));
193
+ }
194
+
195
+ function isVisible(value) {
196
+ if (view.options.visibleBindingValue) {
197
+ return value === view.options.visibleBindingValue;
198
+ }
199
+ else if (typeof view.options.visible === 'function') {
200
+ return !!view.options.visible(value);
201
+ }
202
+ else if ('visible' in view.options) {
203
+ return !!view.options.visible;
204
+ }
205
+ else {
206
+ return !!value;
207
+ }
65
208
  }
66
209
  }
67
210
  };
@@ -5,6 +5,10 @@ pageflow.subviewContainer = {
5
5
  return view;
6
6
  },
7
7
 
8
+ appendSubview: function(view) {
9
+ return this.$el.append(this.subview(view).el);
10
+ },
11
+
8
12
  onClose: function() {
9
13
  if (this.subviews) {
10
14
  this.subviews.call('close');
@@ -1,4 +1,7 @@
1
+ //= require ./media_player
2
+
1
3
  //= require_self
4
+
2
5
  //= require ./video_player/media_events
3
6
  //= require ./video_player/prebuffering
4
7
  //= require ./video_player/buffer_underrun_waiting
@@ -25,5 +28,7 @@ pageflow.VideoPlayer = function(element, options) {
25
28
  pageflow.VideoPlayer.bufferUnderrunWaiting(player);
26
29
  }
27
30
 
31
+ pageflow.mediaPlayer.enhance(player, options);
32
+
28
33
  return player;
29
34
  };
@@ -56,7 +56,7 @@ pageflow.VideoPlayer.bufferUnderrunWaiting = function(player) {
56
56
  player.off('progress', pauseAndPreloadOnUnderrun);
57
57
  }
58
58
 
59
- if (pageflow.features.has('buffer underrun waiting support')) {
59
+ if (pageflow.browser.has('buffer underrun waiting support')) {
60
60
  player.on('play', function() {
61
61
  player.on('progress', pauseAndPreloadOnUnderrun);
62
62
  });
@@ -25,8 +25,12 @@ pageflow.VideoPlayer.Lazy = function(template, options) {
25
25
  }
26
26
  };
27
27
 
28
+ this.isPresent = function() {
29
+ return videoTag && !disposeTimeout;
30
+ };
31
+
28
32
  this.dispose = function() {
29
- if (videoTag && !pageflow.features.has('mobile platform')) {
33
+ if (videoTag && !pageflow.browser.has('mobile platform')) {
30
34
  this.setEmptySrc();
31
35
 
32
36
  $(videoPlayer.el()).replaceWith(placeholder);
@@ -82,7 +86,7 @@ pageflow.VideoPlayer.Lazy = function(template, options) {
82
86
  return videoPlayer ? videoPlayer.srcFromOptions() : null;
83
87
  };
84
88
 
85
- _.each(['play', 'pause', 'prebuffer', 'src', 'on', 'load'], function(method) {
89
+ _.each(['play', 'playAndFadeIn', 'pause', 'fadeOutAndPause', 'prebuffer', 'src', 'on', 'load', 'currentTime'], function(method) {
86
90
  that[method] = function(/* args */) {
87
91
  var args = arguments;
88
92
 
@@ -109,10 +113,10 @@ pageflow.VideoPlayer.Lazy = function(template, options) {
109
113
 
110
114
  var element = $(htmlWithPreload);
111
115
 
112
- if (pageflow.features.has('mobile platform') && element.attr('data-mobile-poster')) {
116
+ if (pageflow.browser.has('mobile platform') && element.attr('data-mobile-poster')) {
113
117
  element.attr('poster', element.attr('data-mobile-poster'));
114
118
  }
115
- else if (pageflow.features.has('high bandwidth') && !pageflow.features.has('mobile platform')) {
119
+ else if (pageflow.browser.has('high bandwidth') && !pageflow.browser.has('mobile platform')) {
116
120
  element.attr('poster', element.attr('data-large-poster'));
117
121
 
118
122
  element.find('source').each(function() {
@@ -6,7 +6,7 @@ pageflow.VideoPlayer.mediaEvents = function(player, context) {
6
6
  currentTime: player.currentTime(),
7
7
  duration: player.duration(),
8
8
  volume: player.volume(),
9
- bitrate: pageflow.features.has('high bandwidth') ? 3500000 : 2000000
9
+ bitrate: pageflow.browser.has('high bandwidth') ? 3500000 : 2000000
10
10
  });
11
11
  }
12
12
 
@@ -13,7 +13,7 @@
13
13
  if (typeof lastAction == 'undefined' || now - lastAction > 400) {
14
14
  lastAction = now;
15
15
 
16
- if (pageflow.features.has('phone platform')) {
16
+ if (pageflow.browser.has('phone platform')) {
17
17
  var elem = this.player_.tech.el();
18
18
  this.player_.play();
19
19
 
@@ -30,7 +30,7 @@ pageflow.VideoPlayer.prebuffering = function(player) {
30
30
  var deferred = $.Deferred();
31
31
  var timeout;
32
32
 
33
- if (pageflow.features.has('prebuffering support')) {
33
+ if (pageflow.browser.has('prebuffering support')) {
34
34
  if (!player.isBufferedAhead(delta) && !player.prebufferDeferred) {
35
35
  pageflow.log('prebuffering video ' + player.srcFromOptions());
36
36