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
@@ -1,5 +1,6 @@
1
1
  pageflow.NavigatablePageItemView = pageflow.PageItemView.extend({
2
2
  mixins: [pageflow.loadable, pageflow.failureIndicatingView],
3
+ className: 'draggable',
3
4
 
4
5
  events: {
5
6
  'click': function() {
@@ -18,11 +18,11 @@ pageflow.OtherEntriesCollectionView = Backbone.Marionette.View.extend({
18
18
  selection: this.options.selection
19
19
  },
20
20
  blankSlateViewConstructor: Backbone.Marionette.ItemView.extend({
21
- template: 'templates/other_entries_blank_slate'
21
+ template: 'templates/other_entries_blank_slate',
22
+ tagName: 'li',
23
+ className: 'blank_slate'
22
24
  }),
23
- loadingViewConstructor: Backbone.Marionette.ItemView.extend({
24
- template: 'templates/loading'
25
- })
25
+ loadingViewConstructor: pageflow.LoadingView
26
26
  }));
27
27
 
28
28
  this.otherEntries.fetch();
@@ -1,6 +1,7 @@
1
1
  pageflow.OtherEntryItemView = Backbone.Marionette.ItemView.extend({
2
2
  template: 'templates/other_entry_item',
3
3
  className: 'other_entry_item',
4
+ tagName: 'li',
4
5
 
5
6
  mixins: [pageflow.selectableView],
6
7
 
@@ -9,7 +10,7 @@ pageflow.OtherEntryItemView = Backbone.Marionette.ItemView.extend({
9
10
  },
10
11
 
11
12
  events: {
12
- 'click': 'select'
13
+ 'click': 'select'
13
14
  },
14
15
 
15
16
  onRender: function() {
@@ -29,7 +29,7 @@ pageflow.PageItemView = Backbone.Marionette.ItemView.extend({
29
29
  this.$el.toggleClass('active', this.model.get('active'));
30
30
  this.$el.toggleClass('display_in_navigation', !!this.model.configuration.get('display_in_navigation'));
31
31
  this.$el
32
- .removeClass(_.pluck(pageflow.Page.types, 'name').join(' '))
32
+ .removeClass(pageflow.editor.pageTypes.pluck('name').join(' '))
33
33
  .addClass(this.model.get('template'));
34
34
 
35
35
  this.ui.pictogram.attr('title', this._getPictogramTitle());
@@ -37,7 +37,7 @@ pageflow.PageItemView = Backbone.Marionette.ItemView.extend({
37
37
  },
38
38
 
39
39
  _getPictogramTitle: function() {
40
- var result = I18n.t(this.model.pageType().translation_key);
40
+ var result = I18n.t(this.model.pageType().translationKey());
41
41
  result += ' Seite';
42
42
 
43
43
  if (this.options.displayInNavigationHint && !this.model.configuration.get('display_in_navigation')) {
@@ -0,0 +1,51 @@
1
+ pageflow.PageLinkItemView = Backbone.Marionette.ItemView.extend({
2
+ template: 'pageflow/editor/templates/page_link_item',
3
+
4
+ tagName: 'li',
5
+ className: 'page_link',
6
+
7
+ ui: {
8
+ thumbnail: '.page_thumbnail',
9
+ title: '.title',
10
+ label: '.label',
11
+ editButton: '.edit'
12
+ },
13
+
14
+ events: {
15
+ 'click .edit': function() {
16
+ pageflow.editor.navigate(this.model.editPath(), {trigger: true});
17
+ return false;
18
+ },
19
+
20
+ 'mouseenter': function() {
21
+ this.model.highlight(true);
22
+ },
23
+
24
+ 'mouseleave': function() {
25
+ this.model.resetHighlight(false);
26
+ }
27
+ },
28
+
29
+ onRender: function() {
30
+ var page = this.model.targetPage();
31
+
32
+ if (page) {
33
+ this.subview(new pageflow.PageThumbnailView({
34
+ el: this.ui.thumbnail,
35
+ model: page
36
+ }));
37
+
38
+ this.$el.addClass(page.get('template'));
39
+ this.ui.title.text(page.title() || I18n.t('pageflow.editor.views.page_link_item_view.unnamed'));
40
+ }
41
+ else {
42
+ this.ui.title.text(I18n.t('pageflow.editor.views.page_link_item_view.no_page'));
43
+ }
44
+
45
+ this.ui.label.text(this.model.label());
46
+ this.ui.label.toggle(!!this.model.label());
47
+ this.ui.editButton.toggle(!!this.model.editPath());
48
+
49
+ this.$el.toggleClass('dangling', !page);
50
+ },
51
+ });
@@ -0,0 +1,45 @@
1
+ pageflow.PageLinksView = Backbone.Marionette.ItemView.extend({
2
+ template: 'pageflow/editor/templates/page_links',
3
+ className: 'page_links',
4
+
5
+ ui: {
6
+ links: 'ul.links',
7
+ addButton: '.add_link'
8
+ },
9
+
10
+ events: {
11
+ 'click .add_link': function() {
12
+ var view = this;
13
+
14
+ pageflow.editor.selectPage().then(function(page) {
15
+ view.model.pageLinks().addLink(page.get('perma_id'));
16
+ });
17
+
18
+ return false;
19
+ }
20
+ },
21
+
22
+ onRender: function() {
23
+ var pageLinks = this.model.pageLinks();
24
+ var collectionViewConstructor = pageLinks.saveOrder ? pageflow.SortableCollectionView : pageflow.CollectionView;
25
+
26
+ this.subview(new collectionViewConstructor({
27
+ el: this.ui.links,
28
+ collection: pageLinks,
29
+ itemViewConstructor: pageflow.PageLinkItemView,
30
+ itemViewOptions: {
31
+ pageLinks: pageLinks
32
+ }
33
+ }));
34
+
35
+ this.listenTo(pageLinks, 'add remove', function() {
36
+ this.updateAddButton(pageLinks);
37
+ });
38
+
39
+ this.updateAddButton(pageLinks);
40
+ },
41
+
42
+ updateAddButton: function(pageLinks) {
43
+ this.ui.addButton.css('display', pageLinks.canAddLink() ? 'inline-block' : 'none');
44
+ }
45
+ });
@@ -12,6 +12,7 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
12
12
  'sync': function() {
13
13
  this.$el.attr('data-id', this.model.id);
14
14
  this.$el.attr('data-perma-id', this.model.get('perma_id'));
15
+ this.$el.attr('id', this.model.get('perma_id'));
15
16
  }
16
17
  },
17
18
 
@@ -27,17 +28,21 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
27
28
 
28
29
  render: function() {
29
30
  this.$el.html(this.pageTemplate());
31
+
30
32
  this.$el.attr('data-id', this.model.id);
31
33
  this.$el.attr('data-perma-id', this.model.get('perma_id'));
34
+ this.$el.attr('id', this.model.get('perma_id'));
35
+ this.$el.attr('data-chapter-id', this.model.get('chapter_id'));
36
+
32
37
  this.$el.data('template', this.model.get('template'));
33
38
  this.$el.data('configuration', this.model.get('configuration'));
34
39
 
35
- this.$el.page();
36
- this.updateChapterBeginningClass();
37
- this.update();
38
- this.$el.page('reactivate');
40
+ this.$el.on('pageenhanced', _.bind(function() {
41
+ this.update();
42
+ this.initEmbeddedViews();
39
43
 
40
- this.initEmbeddedViews();
44
+ this.$el.page('reactivate');
45
+ }, this));
41
46
 
42
47
  return this;
43
48
  },
@@ -49,21 +54,16 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
49
54
  this.$el.data('template', this.model.get('template'));
50
55
 
51
56
  this.$el.page('reinit');
52
- this.updateChapterBeginningClass();
53
- this.update();
54
- this.$el.page('reactivate');
55
-
56
- this.initEmbeddedViews();
57
57
  },
58
58
 
59
59
  update: function() {
60
- this.$el.removeClass(pageflow.Page.transitions.join(' ')).addClass(this.model.configuration.get('transition'));
60
+ this.$el.page('update', this.model.configuration);
61
61
 
62
- this.pageType().update(this.$el, this.model.configuration);
63
- _.extend(this.$el.data('configuration'), this.model.configuration.attributes);
62
+ pageflow.events.trigger('page:update', this.model);
64
63
 
65
64
  this.refreshScroller();
66
65
  this.ensureTargetBlankForContentLinks();
66
+ this.updateChapterBeginningClass();
67
67
  },
68
68
 
69
69
  updateChapterBeginningClass: function() {
@@ -71,8 +71,8 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
71
71
  this.$el.toggleClass('chapter_beginning', chapterBeginning);
72
72
  },
73
73
 
74
- pageType: function() {
75
- return this.$el.data('pageType');
74
+ pageTypeHooks: function() {
75
+ return pageflow.pageType.get(this.model.get('template'));
76
76
  },
77
77
 
78
78
  pageTemplate: function() {
@@ -96,7 +96,7 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
96
96
 
97
97
  view.embeddedViews = new Backbone.ChildViewContainer();
98
98
 
99
- _.each(view.pageType().embeddedEditorViews(), function(item, selector) {
99
+ _.each(view.embeddedViewDefinitions(), function(item, selector) {
100
100
  view.$(selector).each(function() {
101
101
  view.embeddedViews.add(new item.view(_.extend(item.options || {}, {
102
102
  el: this,
@@ -107,6 +107,14 @@ pageflow.PagePreviewView = Backbone.Marionette.View.extend({
107
107
  });
108
108
  },
109
109
 
110
+ embeddedViewDefinitions: function() {
111
+ return _.extend(
112
+ {},
113
+ this.pageTypeHooks().embeddedEditorViews() || {},
114
+ this.model.pageType().embeddedViews()
115
+ );
116
+ },
117
+
110
118
  _unescape: function(text) {
111
119
  return $('<div/>').html(text).text();
112
120
  }
@@ -0,0 +1,46 @@
1
+ pageflow.PageSelectionView = Backbone.Marionette.ItemView.extend({
2
+ template: 'templates/page_selection',
3
+ className: 'page_selection dialog',
4
+
5
+ mixins: [pageflow.dialogView],
6
+
7
+ ui: {
8
+ chapters: 'ul.chapters',
9
+ },
10
+
11
+ events: {
12
+ 'click ul.pages li': function(event) {
13
+ this.options.onSelect(pageflow.pages.get($(event.currentTarget).data('id')));
14
+ this.close();
15
+ }
16
+ },
17
+
18
+ onRender: function() {
19
+ var onSelect = this.onSelect;
20
+
21
+ this.subview(new pageflow.CollectionView({
22
+ el: this.ui.chapters,
23
+ collection: this.model.chapters,
24
+ itemViewConstructor: pageflow.ChapterItemView,
25
+ itemViewOptions: {
26
+ pageItemView: pageflow.PageItemView,
27
+ sortable: false
28
+ }
29
+ }));
30
+ }
31
+ });
32
+
33
+ pageflow.PageSelectionView.selectPage = function() {
34
+ return $.Deferred(function(deferred) {
35
+ var view = new pageflow.PageSelectionView({
36
+ model: pageflow.entry,
37
+ onSelect: deferred.resolve
38
+ });
39
+
40
+ view.on('close', function() {
41
+ deferred.reject();
42
+ });
43
+
44
+ pageflow.app.dialogRegion.show(view.render());
45
+ }).promise();
46
+ };
@@ -1,30 +1,3 @@
1
- pageflow.PageThumbnailView = Backbone.Marionette.View.extend({
2
- modelEvents: {
3
- 'change:configuration': 'update'
4
- },
5
-
6
- render: function() {
7
- this.update();
8
- return this;
9
- },
10
-
11
- update: function() {
12
- if (this.fileThumbnailView && this.currentFileThumbnail == this.model.thumbnailFile()) {
13
- return;
14
- }
15
-
16
- this.currentFileThumbnail = this.model.thumbnailFile();
17
-
18
- if (this.fileThumbnailView) {
19
- this.fileThumbnailView.close();
20
- }
21
-
22
- this.fileThumbnailView = this.subview(new pageflow.FileThumbnailView({
23
- model: this.model.thumbnailFile(),
24
- className: 'thumbnail file_thumbnail',
25
- imageUrlPropertyName: this.options.imageUrlPropertyName
26
- }));
27
-
28
- this.$el.append(this.fileThumbnailView.el);
29
- }
1
+ pageflow.PageThumbnailView = pageflow.ModelThumbnailView.extend({
2
+ className: 'model_thumbnail page_thumbnail'
30
3
  });
@@ -8,6 +8,13 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
8
8
  publishUntilTimeField: 'input[name=publish_until_time]',
9
9
  publishUntilRadioBox: '#publish_entry_until',
10
10
  publishForeverRadioBox: 'input[value=publish_forever]',
11
+ passwordProtectedCheckBox: 'input[name=password_protected]',
12
+ passwordFields: '.password_fields',
13
+ userNameField: 'input[name=user_name]',
14
+ passwordField: 'input[name=password]',
15
+ alreadyPublishedWithPassword: '.already_published_with_password',
16
+ previouslyPublishedWithPassword: '.previously_published_with_password',
17
+ alreadyPublishedWithoutPassword: '.already_published_without_password',
11
18
  revisionsLink: '.published.notice a',
12
19
  publishedNotice: '.published.notice',
13
20
  saveButton: 'button.save',
@@ -24,7 +31,13 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
24
31
 
25
32
  'focus .publish_until_fields input': 'enablePublishUntilFields',
26
33
 
27
- 'change .publish_until_fields input': 'checkPublishUntil'
34
+ 'change .publish_until_fields input': 'checkForm',
35
+
36
+ 'click input#publish_password_protected': 'togglePasswordFields',
37
+
38
+ 'keyup input[name=password]': 'checkForm',
39
+
40
+ 'change input[name=password]': 'checkForm'
28
41
  },
29
42
 
30
43
  modelEvents: {
@@ -63,6 +76,23 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
63
76
  this.ui.publishUntilField.datepicker('setDate', publishedUntil);
64
77
  this.ui.publishUntilTimeField.val(timeStr(publishedUntil));
65
78
  }
79
+ else {
80
+ this.ui.publishUntilField.datepicker('setDate', oneYearFromNow());
81
+ }
82
+
83
+ this.ui.userNameField.val(pageflow.account.get('name'));
84
+
85
+ if (this.model.get('password_protected')) {
86
+ this.ui.passwordProtectedCheckBox.prop('checked', true);
87
+ this.togglePasswordFields();
88
+ }
89
+ else {
90
+ this.ui.passwordField.val(this.randomPassword());
91
+ }
92
+
93
+ this.ui.alreadyPublishedWithPassword.toggle(this.model.get('published') && this.model.get('password_protected'));
94
+ this.ui.previouslyPublishedWithPassword.toggle(!this.model.get('published') && this.model.get('password_protected'));
95
+ this.ui.alreadyPublishedWithoutPassword.toggle(this.model.get('published') && !this.model.get('password_protected'));
66
96
 
67
97
  // Helpers
68
98
  function timeStr(date) {
@@ -72,6 +102,12 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
72
102
  return ("0" + val).slice(-2);
73
103
  }
74
104
  }
105
+
106
+ function oneYearFromNow() {
107
+ var date = new Date();
108
+ date.setFullYear(date.getFullYear() + 1);
109
+ return date;
110
+ }
75
111
  },
76
112
 
77
113
  save: function() {
@@ -100,7 +136,11 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
100
136
 
101
137
  var that = this;
102
138
 
103
- this.options.entryPublication.publish({published_until: publishedUntil})
139
+ this.options.entryPublication.publish({
140
+ published_until: publishedUntil,
141
+ password_protected: this.ui.passwordProtectedCheckBox.is(':checked'),
142
+ password: this.ui.passwordField.val()
143
+ })
104
144
  .fail(function() {
105
145
  alert('Beim Veröffentlichen ist ein Fehler aufgetreten');
106
146
  })
@@ -156,17 +196,20 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
156
196
  this.ui.publishUntilRadioBox[0].checked = true;
157
197
 
158
198
  this.ui.publishUntilFields.removeClass('disabled');
159
- this.checkPublishUntil();
199
+ this.checkForm();
160
200
  },
161
201
 
162
202
  disablePublishUntilFields: function() {
163
203
  this.ui.publishUntilRadioBox[0].checked = false;
164
204
  this.ui.publishUntilFields.addClass('disabled');
205
+ this.checkForm();
165
206
 
166
207
  if (!this.checkPublishUntilTime()) {
167
208
  this.ui.publishUntilTimeField.val('00:00');
168
- this.ui.publishUntilTimeField.removeClass('invalid');
169
209
  }
210
+
211
+ this.ui.publishUntilTimeField.removeClass('invalid');
212
+ this.ui.publishUntilField.removeClass('invalid');
170
213
  },
171
214
 
172
215
  enablePublishForever: function() {
@@ -175,15 +218,31 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
175
218
  this.enableSave();
176
219
  },
177
220
 
221
+ checkForm: function() {
222
+ if (_.all([this.checkPublishUntil(), this.checkPassword()])) {
223
+ this.enableSave();
224
+ }
225
+ else{
226
+ this.disableSave();
227
+ }
228
+ },
229
+
178
230
  checkPublishUntil: function() {
179
- var publishedUntil = this.ui.publishUntilField.datepicker('getDate');
231
+ return (this.ui.publishForeverRadioBox.is(':checked') ||
232
+ (this.ui.publishUntilRadioBox.is(':checked') &&
233
+ _.all([this.checkPublishUntilDate(),
234
+ this.checkPublishUntilTime()])));
235
+ },
180
236
 
181
- if (!publishedUntil || !this.checkPublishUntilTime()) {
182
- this.disableSave();
183
- return false;
184
- }
185
- this.enableSave();
237
+ checkPublishUntilDate: function() {
238
+ if (this.ui.publishUntilField.datepicker('getDate')) {
239
+ this.ui.publishUntilField.removeClass('invalid');
186
240
  return true;
241
+ }
242
+ else {
243
+ this.ui.publishUntilField.addClass('invalid');
244
+ return false;
245
+ }
187
246
  },
188
247
 
189
248
  checkPublishUntilTime: function() {
@@ -193,6 +252,32 @@ pageflow.PublishEntryView = Backbone.Marionette.ItemView.extend({
193
252
  }
194
253
  this.ui.publishUntilTimeField.removeClass('invalid');
195
254
  return true;
255
+ },
256
+
257
+ togglePasswordFields: function() {
258
+ this.ui.passwordFields.toggleClass('disabled', !this.ui.passwordProtectedCheckBox.is(':checked'));
259
+ this.checkForm();
260
+ },
261
+
262
+ checkPassword: function() {
263
+ if (this.ui.passwordField.val().length === 0 &&
264
+ !this.model.get('password_protected') &&
265
+ this.ui.passwordProtectedCheckBox.is(':checked')) {
266
+ this.ui.passwordField.addClass('invalid');
267
+ return false;
268
+ }
269
+ else {
270
+ this.ui.passwordField.removeClass('invalid');
271
+ return true;
272
+ }
273
+ },
274
+
275
+ randomPassword: function() {
276
+ var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
277
+
278
+ return _(10).times(function() {
279
+ return possible.charAt(Math.floor(Math.random() * possible.length));
280
+ }).join('');
196
281
  }
197
282
  });
198
283