pageflow 0.11.4 → 12.0.0.rc1

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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +224 -1207
  3. data/README.md +7 -3
  4. data/Rakefile +2 -0
  5. data/admins/pageflow/accounts.rb +27 -8
  6. data/admins/pageflow/entry.rb +130 -47
  7. data/admins/pageflow/folder.rb +28 -17
  8. data/admins/pageflow/membership.rb +58 -6
  9. data/admins/pageflow/user.rb +105 -98
  10. data/app/assets/fonts/pageflow/fontawesome-webfont.eot +0 -0
  11. data/app/assets/fonts/pageflow/fontawesome-webfont.svg +644 -463
  12. data/app/assets/fonts/pageflow/fontawesome-webfont.ttf +0 -0
  13. data/app/assets/fonts/pageflow/fontawesome-webfont.woff +0 -0
  14. data/app/assets/fonts/pageflow/sourcesanspro-bold-webfont.eot +0 -0
  15. data/app/assets/fonts/pageflow/sourcesanspro-bold-webfont.svg +2864 -696
  16. data/app/assets/fonts/pageflow/sourcesanspro-bold-webfont.ttf +0 -0
  17. data/app/assets/fonts/pageflow/sourcesanspro-bold-webfont.woff +0 -0
  18. data/app/assets/fonts/pageflow/sourcesanspro-light-webfont.eot +0 -0
  19. data/app/assets/fonts/pageflow/sourcesanspro-light-webfont.svg +2572 -613
  20. data/app/assets/fonts/pageflow/sourcesanspro-light-webfont.ttf +0 -0
  21. data/app/assets/fonts/pageflow/sourcesanspro-light-webfont.woff +0 -0
  22. data/app/assets/fonts/pageflow/sourcesanspro-regular-webfont.eot +0 -0
  23. data/app/assets/fonts/pageflow/sourcesanspro-regular-webfont.svg +2977 -779
  24. data/app/assets/fonts/pageflow/sourcesanspro-regular-webfont.ttf +0 -0
  25. data/app/assets/fonts/pageflow/sourcesanspro-regular-webfont.woff +0 -0
  26. data/app/assets/javascripts/pageflow/admin/entries.js +21 -3
  27. data/app/assets/javascripts/pageflow/audio.js +30 -15
  28. data/app/assets/javascripts/pageflow/audio/multi_player.js +12 -1
  29. data/app/assets/javascripts/pageflow/audio_player.js +15 -1
  30. data/app/assets/javascripts/pageflow/audio_player/rewind_method.js +3 -1
  31. data/app/assets/javascripts/pageflow/base.js +4 -1
  32. data/app/assets/javascripts/pageflow/browser.js +3 -0
  33. data/app/assets/javascripts/pageflow/browser/autoplay_support.js +3 -0
  34. data/app/assets/javascripts/pageflow/browser/facebook.js +1 -2
  35. data/app/assets/javascripts/pageflow/browser/ios_platform.js +5 -0
  36. data/app/assets/javascripts/pageflow/browser/video.js +4 -0
  37. data/app/assets/javascripts/pageflow/components.js +7 -0
  38. data/app/assets/javascripts/pageflow/cookies.js +1 -4
  39. data/app/assets/javascripts/pageflow/dist/react.js +4724 -5808
  40. data/app/assets/javascripts/pageflow/editor/api.js +201 -161
  41. data/app/assets/javascripts/pageflow/editor/api/errors.js +80 -0
  42. data/app/assets/javascripts/pageflow/editor/api/failure.js +9 -0
  43. data/app/assets/javascripts/pageflow/editor/api/failures.js +25 -2
  44. data/app/assets/javascripts/pageflow/editor/api/file_type.js +42 -3
  45. data/app/assets/javascripts/pageflow/editor/api/file_types.js +75 -46
  46. data/app/assets/javascripts/pageflow/editor/base.js +8 -0
  47. data/app/assets/javascripts/pageflow/editor/collections/file_types_collection.js +37 -0
  48. data/app/assets/javascripts/pageflow/editor/collections/files_collection.js +32 -1
  49. data/app/assets/javascripts/pageflow/editor/collections/mixins/ordered_collection.js +1 -1
  50. data/app/assets/javascripts/pageflow/editor/collections/multi_collection.js +4 -6
  51. data/app/assets/javascripts/pageflow/editor/collections/nested_files_collection.js +27 -0
  52. data/app/assets/javascripts/pageflow/editor/collections/pages_collection.js +21 -1
  53. data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +8 -2
  54. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +3 -2
  55. data/app/assets/javascripts/pageflow/editor/initializers/error_listener.js +10 -5
  56. data/app/assets/javascripts/pageflow/editor/initializers/routing.js +3 -1
  57. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +3 -0
  58. data/app/assets/javascripts/pageflow/editor/initializers/setup_file_types.js +136 -6
  59. data/app/assets/javascripts/pageflow/editor/initializers/setup_file_uploader.js +10 -0
  60. data/app/assets/javascripts/pageflow/editor/initializers/setup_hotkeys.js +5 -7
  61. data/app/assets/javascripts/pageflow/editor/initializers/stylesheet_reloading.js +1 -1
  62. data/app/assets/javascripts/pageflow/editor/models/configuration.js +1 -0
  63. data/app/assets/javascripts/pageflow/editor/models/entry.js +34 -26
  64. data/app/assets/javascripts/pageflow/editor/models/file_configuration.js +10 -0
  65. data/app/assets/javascripts/pageflow/editor/models/file_reuse.js +23 -0
  66. data/app/assets/javascripts/pageflow/editor/models/file_uploader.js +69 -0
  67. data/app/assets/javascripts/pageflow/editor/models/mixins/retryable.js +1 -1
  68. data/app/assets/javascripts/pageflow/editor/models/page.js +13 -0
  69. data/app/assets/javascripts/pageflow/editor/models/text_track_file.js +48 -0
  70. data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +62 -11
  71. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
  72. data/app/assets/javascripts/pageflow/editor/templates/confirm_upload.jst.ejs +18 -0
  73. data/app/assets/javascripts/pageflow/editor/templates/delete_row_table_cell.jst.ejs +1 -0
  74. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button.jst.ejs +0 -2
  75. data/app/assets/javascripts/pageflow/editor/templates/drop_down_button_item.jst.ejs +1 -0
  76. data/app/assets/javascripts/pageflow/editor/templates/edit_entry.jst.ejs +3 -1
  77. data/app/assets/javascripts/pageflow/editor/templates/edit_file.jst.ejs +0 -0
  78. data/app/assets/javascripts/pageflow/editor/templates/file_item.jst.ejs +1 -6
  79. data/app/assets/javascripts/pageflow/editor/templates/file_meta_data_item_value_view.jst.ejs +3 -0
  80. data/app/assets/javascripts/pageflow/editor/templates/file_settings_dialog.jst.ejs +10 -0
  81. data/app/assets/javascripts/pageflow/editor/templates/files_blank_slate.jst.ejs +1 -1
  82. data/app/assets/javascripts/pageflow/editor/templates/filtered_files.jst.ejs +10 -0
  83. data/app/assets/javascripts/pageflow/{ui → editor}/templates/inputs/file_input.jst.ejs +1 -1
  84. data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +2 -2
  85. data/app/assets/javascripts/pageflow/editor/templates/nested_files.jst.ejs +1 -0
  86. data/app/assets/javascripts/pageflow/editor/templates/table_cell.jst.ejs +0 -0
  87. data/app/assets/javascripts/pageflow/editor/templates/text_tracks.jst.ejs +13 -0
  88. data/app/assets/javascripts/pageflow/editor/templates/uploadable_files.jst.ejs +1 -0
  89. data/app/assets/javascripts/pageflow/editor/utils/form_data_utils.js +19 -0
  90. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +5 -2
  91. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +3 -2
  92. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/background.js +35 -0
  93. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +7 -9
  94. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +6 -5
  95. data/app/assets/javascripts/pageflow/editor/views/confirm_upload_view.js +69 -0
  96. data/app/assets/javascripts/pageflow/editor/views/confirmable_file_item_view.js +1 -1
  97. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_item_list_view.js +9 -0
  98. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_item_view.js +14 -1
  99. data/app/assets/javascripts/pageflow/editor/views/drop_down_button_view.js +51 -20
  100. data/app/assets/javascripts/pageflow/editor/views/edit_entry_view.js +21 -2
  101. data/app/assets/javascripts/pageflow/editor/views/edit_file_view.js +52 -0
  102. data/app/assets/javascripts/pageflow/editor/views/edit_storyline_view.js +1 -1
  103. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +15 -7
  104. data/app/assets/javascripts/pageflow/editor/views/file_item_view.js +33 -22
  105. data/app/assets/javascripts/pageflow/editor/views/file_meta_data_item_value_view.js +49 -0
  106. data/app/assets/javascripts/pageflow/editor/views/file_meta_data_item_view.js +16 -5
  107. data/app/assets/javascripts/pageflow/editor/views/file_settings_dialog_view.js +31 -0
  108. data/app/assets/javascripts/pageflow/editor/views/files_explorer_view.js +6 -7
  109. data/app/assets/javascripts/pageflow/editor/views/files_view.js +13 -14
  110. data/app/assets/javascripts/pageflow/editor/views/filtered_files_view.js +75 -0
  111. data/app/assets/javascripts/pageflow/editor/views/help_view.js +3 -0
  112. data/app/assets/javascripts/pageflow/editor/views/inputs/file_input_view.js +217 -0
  113. data/app/assets/javascripts/pageflow/editor/views/inputs/page_link_input_view.js +6 -0
  114. data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +13 -2
  115. data/app/assets/javascripts/pageflow/editor/views/list_view.js +24 -14
  116. data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +4 -1
  117. data/app/assets/javascripts/pageflow/editor/views/nested_files_view.js +94 -0
  118. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +7 -2
  119. data/app/assets/javascripts/pageflow/editor/views/text_file_meta_data_item_value_view.js +25 -0
  120. data/app/assets/javascripts/pageflow/editor/views/text_tracks_file_meta_data_item_value_view.js +12 -0
  121. data/app/assets/javascripts/pageflow/editor/views/text_tracks_view.js +65 -0
  122. data/app/assets/javascripts/pageflow/editor/views/uploadable_files_view.js +56 -0
  123. data/app/assets/javascripts/pageflow/editor/views/uploader_view.js +13 -10
  124. data/app/assets/javascripts/pageflow/features.js +8 -12
  125. data/app/assets/javascripts/pageflow/focus_outline.js +2 -0
  126. data/app/assets/javascripts/pageflow/media_player/volume_binding.js +2 -0
  127. data/app/assets/javascripts/pageflow/media_player/volume_fading.js +6 -0
  128. data/app/assets/javascripts/pageflow/page_type.js +0 -1
  129. data/app/assets/javascripts/pageflow/phone_landscape_fullscreen.js +34 -0
  130. data/app/assets/javascripts/pageflow/react.js +4 -0
  131. data/app/assets/javascripts/pageflow/ready.js +3 -0
  132. data/app/assets/javascripts/pageflow/seed_entry_data.js +4 -1
  133. data/app/assets/javascripts/pageflow/slideshow.js +1 -0
  134. data/app/assets/javascripts/pageflow/slideshow/adjacent_preparer.js +7 -5
  135. data/app/assets/javascripts/pageflow/slideshow/atmo.js +3 -3
  136. data/app/assets/javascripts/pageflow/slideshow/hidden_text_indicator_widget.js +4 -2
  137. data/app/assets/javascripts/pageflow/slideshow/hide_text.js +8 -4
  138. data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +5 -0
  139. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +11 -18
  140. data/app/assets/javascripts/pageflow/ui.js +6 -0
  141. data/app/assets/javascripts/pageflow/ui/templates/inputs/url_display.jst.ejs +7 -0
  142. data/app/assets/javascripts/pageflow/ui/templates/table.jst.ejs +7 -0
  143. data/app/assets/javascripts/pageflow/ui/templates/table_blank_slate.jst.ejs +3 -0
  144. data/app/assets/javascripts/pageflow/ui/utils/i18n_utils.js +97 -2
  145. data/app/assets/javascripts/pageflow/ui/views/collection_view.js +8 -1
  146. data/app/assets/javascripts/pageflow/ui/views/inputs/check_box_input_view.js +12 -1
  147. data/app/assets/javascripts/pageflow/ui/views/inputs/proxy_url_input_view.js +51 -5
  148. data/app/assets/javascripts/pageflow/ui/views/inputs/select_input_view.js +80 -2
  149. data/app/assets/javascripts/pageflow/ui/views/inputs/slider_input_view.js +8 -1
  150. data/app/assets/javascripts/pageflow/ui/views/inputs/text_area_input_view.js +17 -1
  151. data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +47 -4
  152. data/app/assets/javascripts/pageflow/ui/views/inputs/url_display_view.js +42 -0
  153. data/app/assets/javascripts/pageflow/ui/views/inputs/url_input_view.js +20 -2
  154. data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +74 -46
  155. data/app/assets/javascripts/pageflow/ui/views/table_cells/delete_row_table_cell_view.js +63 -0
  156. data/app/assets/javascripts/pageflow/ui/views/table_cells/enum_table_cell_view.js +26 -0
  157. data/app/assets/javascripts/pageflow/ui/views/table_cells/icon_table_cell_view.js +40 -0
  158. data/app/assets/javascripts/pageflow/ui/views/table_cells/presence_table_cell_view.js +31 -0
  159. data/app/assets/javascripts/pageflow/ui/views/table_cells/table_cell_view.js +101 -0
  160. data/app/assets/javascripts/pageflow/ui/views/table_cells/table_header_cell_view.js +10 -0
  161. data/app/assets/javascripts/pageflow/ui/views/table_cells/text_table_cell_view.js +46 -0
  162. data/app/assets/javascripts/pageflow/ui/views/table_row_view.js +47 -0
  163. data/app/assets/javascripts/pageflow/ui/views/table_view.js +47 -0
  164. data/app/assets/javascripts/pageflow/video_player.js +9 -5
  165. data/app/assets/javascripts/pageflow/video_player/buffer_underrun_waiting.js +15 -13
  166. data/app/assets/javascripts/pageflow/video_player/cue_settings_methods.js +33 -0
  167. data/app/assets/javascripts/pageflow/video_player/dash.js +3 -0
  168. data/app/assets/javascripts/pageflow/video_player/filter_sources.js +1 -1
  169. data/app/assets/javascripts/pageflow/video_player/lazy.js +3 -9
  170. data/app/assets/javascripts/pageflow/video_player/prebuffering.js +11 -2
  171. data/app/assets/javascripts/pageflow/video_player/use_slim_controls_during_phone_playback.js +16 -0
  172. data/app/assets/javascripts/pageflow/videojs.js +6 -0
  173. data/app/assets/javascripts/pageflow/widgets.js +41 -7
  174. data/app/assets/stylesheets/pageflow/admin.scss +7 -4
  175. data/app/assets/stylesheets/pageflow/admin/{entries/user_badge_list.scss → badge_list.scss} +6 -9
  176. data/app/assets/stylesheets/pageflow/admin/embed_code.scss +13 -0
  177. data/app/assets/stylesheets/pageflow/admin/entries.scss +1 -2
  178. data/app/assets/stylesheets/pageflow/admin/hint.scss +20 -0
  179. data/app/assets/stylesheets/pageflow/admin/tooltip_bubble.scss +34 -0
  180. data/app/assets/stylesheets/pageflow/editor/base.scss +4 -4
  181. data/app/assets/stylesheets/pageflow/editor/confirm_upload.scss +66 -0
  182. data/app/assets/stylesheets/pageflow/editor/dialogs.scss +9 -1
  183. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +56 -20
  184. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +26 -6
  185. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +32 -0
  186. data/app/assets/stylesheets/pageflow/editor/files.scss +5 -0
  187. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +25 -0
  188. data/app/assets/stylesheets/pageflow/editor/inputs.scss +2 -1
  189. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +65 -0
  190. data/app/assets/stylesheets/pageflow/editor/inputs/reference.scss +2 -2
  191. data/app/assets/stylesheets/pageflow/editor/text_tracks.scss +39 -0
  192. data/app/assets/stylesheets/pageflow/entries.scss +1 -0
  193. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +77 -5
  194. data/app/assets/stylesheets/pageflow/mixins/icons/fontawesome.scss +3 -1
  195. data/app/assets/stylesheets/pageflow/page_types.scss +0 -4
  196. data/app/assets/stylesheets/pageflow/page_types/video.scss +5 -1
  197. data/app/assets/stylesheets/pageflow/page_types/video/content_hiding.scss +1 -0
  198. data/app/assets/stylesheets/pageflow/themes/default/base.scss +1 -0
  199. data/app/assets/stylesheets/pageflow/themes/default/built_in_page_types.scss +0 -2
  200. data/app/assets/stylesheets/pageflow/themes/default/definitions.scss +1 -0
  201. data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.scss +31 -12
  202. data/app/assets/stylesheets/pageflow/themes/default/logo.scss +9 -1
  203. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +8 -2
  204. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +21 -0
  205. data/app/assets/stylesheets/pageflow/themes/default/mixins/cue_margins.scss +43 -0
  206. data/app/assets/stylesheets/pageflow/themes/default/mixins/indicator_typography.scss +7 -3
  207. data/app/assets/stylesheets/pageflow/themes/default/page.scss +20 -2
  208. data/app/assets/stylesheets/pageflow/themes/default/player_controls.scss +4 -0
  209. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic.scss +4 -0
  210. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/container.scss +8 -6
  211. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/control_bar.scss +18 -3
  212. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/cue_margins.scss +1 -0
  213. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/icons/custom.scss +14 -0
  214. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/icons/icon_font.scss +4 -0
  215. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/icons/sprite.scss +4 -0
  216. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/info_box.scss +2 -2
  217. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/menu_bar.scss +5 -0
  218. data/app/assets/stylesheets/pageflow/themes/default/player_controls/shared/menu_bar.scss +121 -0
  219. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim.scss +2 -0
  220. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/container.scss +2 -0
  221. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/control_bar.scss +74 -12
  222. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/cue_margins.scss +3 -0
  223. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/info_box.scss +31 -5
  224. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/menu_bar.scss +13 -0
  225. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/quality_menu.scss +116 -0
  226. data/app/assets/stylesheets/pageflow/themes/default/player_controls/vjs_mapping.scss +13 -3
  227. data/app/assets/stylesheets/pageflow/themes/default/player_controls/widget_margins.scss +8 -3
  228. data/app/assets/stylesheets/pageflow/themes/default/text_track_cues.scss +25 -0
  229. data/app/assets/stylesheets/pageflow/themes/default/variables/widgets.scss +2 -2
  230. data/app/assets/stylesheets/pageflow/themes/default/video_player/vjs_base.scss +122 -79
  231. data/app/assets/stylesheets/pageflow/themes/default/video_wrapper.scss +16 -7
  232. data/app/assets/stylesheets/pageflow/ui.scss +5 -1
  233. data/app/assets/stylesheets/pageflow/ui/forms.scss +5 -58
  234. data/app/assets/stylesheets/pageflow/ui/table_cells/delete_row_table_cell.scss +7 -0
  235. data/app/assets/stylesheets/pageflow/ui/table_cells/icon_table_cell.scss +16 -0
  236. data/app/assets/stylesheets/pageflow/ui/table_cells/presence_table_cell.scss +8 -0
  237. data/app/assets/stylesheets/pageflow/ui/table_view.scss +33 -0
  238. data/app/assets/stylesheets/pageflow/ui/tooltip.scss +1 -1
  239. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +3 -3
  240. data/app/controllers/pageflow/editor/entry_publications_controller.rb +3 -3
  241. data/app/controllers/pageflow/editor/files_controller.rb +72 -14
  242. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -1
  243. data/app/controllers/pageflow/entries_controller.rb +12 -2
  244. data/app/controllers/pageflow/files_controller.rb +1 -1
  245. data/app/helpers/pageflow/admin/entries_helper.rb +17 -0
  246. data/app/helpers/pageflow/admin/form_helper.rb +1 -1
  247. data/app/helpers/pageflow/admin/memberships_helper.rb +117 -13
  248. data/app/helpers/pageflow/common_entry_seed_helper.rb +36 -5
  249. data/app/helpers/pageflow/embed_code_helper.rb +32 -0
  250. data/app/helpers/pageflow/entries_helper.rb +1 -1
  251. data/app/helpers/pageflow/entry_json_seed_helper.rb +6 -16
  252. data/app/helpers/pageflow/files_helper.rb +5 -2
  253. data/app/helpers/pageflow/folders_helper.rb +26 -2
  254. data/app/helpers/pageflow/page_background_asset_helper.rb +8 -0
  255. data/app/helpers/pageflow/quota_helper.rb +1 -1
  256. data/app/helpers/pageflow/video_files_helper.rb +0 -5
  257. data/app/jobs/pageflow/poll_zencoder_job.rb +1 -1
  258. data/app/jobs/pageflow/process_file_job.rb +18 -0
  259. data/app/mailers/pageflow/user_mailer.rb +4 -2
  260. data/app/models/concerns/pageflow/hosted_file.rb +9 -0
  261. data/app/models/concerns/pageflow/output_source.rb +60 -0
  262. data/app/models/concerns/pageflow/uploaded_file.rb +33 -5
  263. data/app/models/pageflow/account.rb +3 -1
  264. data/app/models/pageflow/audio_file_url_templates.rb +21 -0
  265. data/app/models/pageflow/draft_entry.rb +19 -9
  266. data/app/models/pageflow/entry.rb +2 -1
  267. data/app/models/pageflow/entry_duplicate.rb +2 -2
  268. data/app/models/pageflow/entry_role_query.rb +81 -0
  269. data/app/models/pageflow/file_reuse.rb +25 -0
  270. data/app/models/pageflow/file_usage.rb +7 -1
  271. data/app/models/pageflow/image_file.rb +7 -1
  272. data/app/models/pageflow/image_file_url_templates.rb +19 -0
  273. data/app/models/pageflow/invited_user.rb +2 -0
  274. data/app/models/pageflow/membership.rb +46 -3
  275. data/app/models/pageflow/published_entry.rb +2 -2
  276. data/app/models/pageflow/revision.rb +16 -5
  277. data/app/models/pageflow/roles.rb +36 -0
  278. data/app/models/pageflow/text_track_file.rb +45 -0
  279. data/app/models/pageflow/text_track_file_url_templates.rb +16 -0
  280. data/app/models/pageflow/thumbnail_file_resolver.rb +22 -2
  281. data/app/models/pageflow/url_template.rb +13 -0
  282. data/app/models/pageflow/used_file.rb +21 -0
  283. data/app/models/pageflow/video_file.rb +72 -27
  284. data/app/models/pageflow/video_file_url_templates.rb +34 -0
  285. data/app/policies/pageflow/account_policy.rb +145 -0
  286. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +16 -0
  287. data/app/policies/pageflow/admin/entry_tab_policy.rb +25 -0
  288. data/app/policies/pageflow/application_policy.rb +11 -0
  289. data/app/policies/pageflow/entry_policy.rb +138 -0
  290. data/app/policies/pageflow/file_policy.rb +42 -0
  291. data/app/policies/pageflow/folder_policy.rb +54 -0
  292. data/app/policies/pageflow/membership_policy.rb +105 -0
  293. data/app/policies/pageflow/theming_policy.rb +57 -0
  294. data/app/policies/pageflow/user_policy.rb +69 -0
  295. data/app/state_machines/pageflow/encoded_file_state_machine.rb +4 -0
  296. data/app/state_machines/pageflow/image_file_state_machine.rb +5 -1
  297. data/app/views/admin/entries/_attributes_table.html.arb +21 -2
  298. data/app/views/admin/entries/_links.html.arb +1 -1
  299. data/app/views/admin/memberships/_entity_account_input.html.erb +5 -0
  300. data/app/views/admin/memberships/_entity_entry_input.html.erb +5 -0
  301. data/app/views/admin/memberships/_form.html.erb +16 -5
  302. data/app/views/admin/memberships/_role_hint.html.arb +2 -0
  303. data/app/views/admin/users/_form.html.erb +29 -20
  304. data/app/views/components/pageflow/admin/add_membership_button_if_needed.rb +62 -0
  305. data/app/views/components/pageflow/admin/embed_code_field.rb +15 -0
  306. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +15 -7
  307. data/app/views/components/pageflow/admin/grouped_folder_list.rb +20 -16
  308. data/app/views/components/pageflow/admin/members_tab.rb +22 -11
  309. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +21 -0
  310. data/app/views/components/pageflow/admin/tabs_view.rb +13 -13
  311. data/app/views/components/pageflow/admin/user_account_badge_list.rb +43 -0
  312. data/app/views/components/pageflow/admin/user_accounts_tab.rb +46 -0
  313. data/app/views/components/pageflow/admin/user_entries_tab.rb +50 -0
  314. data/app/views/components/pageflow/admin/users_tab.rb +32 -4
  315. data/app/views/layouts/pageflow/application.html.erb +3 -2
  316. data/app/views/pageflow/config/_editor_seeds.json.jbuilder +15 -2
  317. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +1 -0
  318. data/app/views/pageflow/editor/files/_file.json.jbuilder +10 -2
  319. data/app/views/pageflow/entries/show.css.erb +4 -11
  320. data/app/views/pageflow/entries/show.json.jbuilder +1 -1
  321. data/app/views/pageflow/entry_json_seed/_entry.json.jbuilder +19 -0
  322. data/app/views/pageflow/file_types/_thumbnails.css.erb +1 -1
  323. data/app/views/pageflow/files/_file.json.jbuilder +12 -0
  324. data/app/views/pageflow/page_background_asset/_element.html.erb +3 -0
  325. data/app/views/pageflow/page_types/_page_type.json.jbuilder +7 -0
  326. data/app/views/pageflow/react/_widget.html.erb +1 -0
  327. data/app/views/pageflow/react/page.html.erb +6 -0
  328. data/app/views/pageflow/video_files/_video_file.json.jbuilder +2 -0
  329. data/config/initializers/admin_resource_tabs.rb +8 -1
  330. data/config/initializers/features.rb +1 -4
  331. data/config/initializers/help_entries.rb +2 -1
  332. data/config/initializers/paperclip.rb +4 -0
  333. data/config/initializers/zencoder.rb +5 -2
  334. data/config/locales/de.yml +370 -108
  335. data/config/locales/en.yml +333 -83
  336. data/config/routes.rb +18 -10
  337. data/db/migrate/20150825133449_update_audio_loop_pages_to_use_atmo.rb +24 -0
  338. data/db/migrate/20160304072911_rename_membership_entry_and_make_polymorphic.rb +19 -0
  339. data/db/migrate/20160304151327_add_role_to_membership.rb +19 -0
  340. data/db/migrate/20160504093145_replace_role_and_account_on_user.rb +42 -0
  341. data/db/migrate/20160531152500_update_users_count.rb +27 -0
  342. data/db/migrate/20160707125400_add_output_presences_to_video_files.rb +5 -0
  343. data/db/migrate/20160824115000_add_parent_file_to_video_files.rb +8 -0
  344. data/db/migrate/20160824115100_add_parent_file_to_audio_files.rb +8 -0
  345. data/db/migrate/20160824115200_add_parent_file_to_image_files.rb +8 -0
  346. data/db/migrate/20160929102700_add_configuration_to_files.rb +7 -0
  347. data/db/migrate/20161007144500_add_text_track_files.rb +31 -0
  348. data/db/migrate/20161216175734_move_configuration_from_file_to_file_usage.rb +27 -0
  349. data/db/migrate/20161230144429_add_processed_attachment_to_text_track_files.rb +8 -0
  350. data/db/migrate/20170222124848_update_video_file_output_presences.rb +12 -0
  351. data/db/migrate/20170421112300_turn_background_video_pages_into_background_image_pages.rb +22 -0
  352. data/lib/generators/pageflow/assets/assets_generator.rb +2 -0
  353. data/lib/generators/pageflow/assets/templates/components.js +4 -0
  354. data/lib/generators/pageflow/initializer/templates/pageflow.rb +23 -20
  355. data/lib/generators/pageflow/seeds/templates/seeds.rb +81 -15
  356. data/lib/pageflow.rb +8 -0
  357. data/lib/pageflow/ability_mixin.rb +196 -62
  358. data/lib/pageflow/admin/tab.rb +21 -0
  359. data/lib/pageflow/admin/tabs.rb +31 -6
  360. data/lib/pageflow/built_in_file_type.rb +39 -0
  361. data/lib/pageflow/built_in_page_types_plugin.rb +80 -0
  362. data/lib/pageflow/configuration.rb +13 -1
  363. data/lib/pageflow/engine.rb +6 -1
  364. data/lib/pageflow/file_type.rb +60 -15
  365. data/lib/pageflow/file_types.rb +20 -2
  366. data/lib/pageflow/page_type.rb +53 -4
  367. data/lib/pageflow/page_types.rb +4 -0
  368. data/lib/pageflow/paperclip_processors/vtt.rb +35 -0
  369. data/lib/pageflow/react.rb +11 -0
  370. data/lib/pageflow/react/page_type.rb +26 -0
  371. data/lib/pageflow/react/widget_type.rb +20 -0
  372. data/lib/pageflow/seeds.rb +59 -15
  373. data/lib/pageflow/user_mixin.rb +18 -25
  374. data/lib/pageflow/version.rb +1 -1
  375. data/lib/pageflow/zencoder_api.rb +18 -4
  376. data/lib/pageflow/zencoder_video_output_definition.rb +375 -127
  377. data/lib/tasks/pageflow_tasks.rake +7 -0
  378. data/spec/factories/accounts.rb +36 -3
  379. data/spec/factories/entries.rb +22 -4
  380. data/spec/factories/invited_user.rb +3 -4
  381. data/spec/factories/memberships.rb +34 -2
  382. data/spec/factories/text_track_files.rb +40 -0
  383. data/spec/factories/users.rb +32 -7
  384. data/spec/factories/video_files.rb +7 -1
  385. data/spec/fixtures/sample.srt +12 -0
  386. data/spec/fixtures/sample.vtt +40 -0
  387. data/vendor/assets/javascripts/dash.all.min.js +14 -0
  388. data/vendor/assets/javascripts/polyfills/bind.js +17 -11
  389. data/vendor/assets/javascripts/videojs-dash.js +302 -0
  390. data/vendor/assets/javascripts/videojs.js +26804 -0
  391. metadata +187 -49
  392. data/app/assets/images/pageflow/themes/default/page_type_pictograms/audio_loop/sprite.png +0 -0
  393. data/app/assets/images/pageflow/themes/default/page_type_pictograms/audio_loop/wide.png +0 -0
  394. data/app/assets/javascripts/pageflow/editor/collections/file_usages_collection.js +0 -21
  395. data/app/assets/javascripts/pageflow/editor/models/file_usage.js +0 -8
  396. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +0 -20
  397. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +0 -24
  398. data/app/assets/javascripts/pageflow/page_types/audio.js +0 -135
  399. data/app/assets/javascripts/pageflow/page_types/audio_loop.js +0 -102
  400. data/app/assets/javascripts/pageflow/page_types/background_image.js +0 -44
  401. data/app/assets/javascripts/pageflow/page_types/background_video.js +0 -137
  402. data/app/assets/javascripts/pageflow/page_types/video.js +0 -277
  403. data/app/assets/javascripts/pageflow/ui/views/inputs/file_input_view.js +0 -79
  404. data/app/assets/javascripts/pageflow/video_player/play_button_patch.js +0 -39
  405. data/app/assets/javascripts/pageflow/video_player/player_buffered_patch.js +0 -47
  406. data/app/assets/javascripts/pageflow/video_player/src_from_options_method.js +0 -31
  407. data/app/assets/stylesheets/pageflow/page_types/audio_loop.scss +0 -18
  408. data/app/assets/stylesheets/pageflow/page_types/background-video.scss +0 -50
  409. data/app/controllers/pageflow/editor/file_usages_controller.rb +0 -37
  410. data/app/jobs/pageflow/process_image_file_job.rb +0 -18
  411. data/app/views/pageflow/pages/templates/_audio.html.erb +0 -69
  412. data/app/views/pageflow/pages/templates/_audio_loop.html.erb +0 -34
  413. data/app/views/pageflow/pages/templates/_background_image.html.erb +0 -24
  414. data/app/views/pageflow/pages/templates/_background_video.html.erb +0 -32
  415. data/app/views/pageflow/pages/templates/_video.html.erb +0 -42
  416. data/lib/pageflow/built_in_page_type.rb +0 -79
@@ -1,3 +1,10 @@
1
+ /**
2
+ * A slider for numeric inputs.
3
+ *
4
+ * @see {@link module:pageflow/ui.pageflow.inputView pageflow.inputView} for options
5
+ * @class
6
+ * @memberof module:pageflow/ui
7
+ */
1
8
  pageflow.SliderInputView = Backbone.Marionette.ItemView.extend({
2
9
  mixins: [pageflow.inputView],
3
10
 
@@ -44,4 +51,4 @@ pageflow.SliderInputView = Backbone.Marionette.ItemView.extend({
44
51
 
45
52
  this.ui.widget.slider('option', 'value', value);
46
53
  }
47
- });
54
+ });
@@ -1,5 +1,21 @@
1
- /*global wysihtml5, wysihtml5ParserRules*/
1
+ /*global wysihtml5*/
2
2
 
3
+ /**
4
+ * Input view for multi line text with simple formatting options.
5
+ *
6
+ * @param {string} [options.size="normal"]
7
+ * Pass `"short"` to reduce the text area height.
8
+ *
9
+ * @param {boolean} [options.disableLinks=false]
10
+ * Do not allow links inside the text.
11
+ *
12
+ * @param {boolean} [options.disableRichtext=false]
13
+ * Do not provide text formatting options.
14
+ *
15
+ * @see {@link module:pageflow/ui.pageflow.inputView pageflow.inputView} for further options
16
+ * @class
17
+ * @memberof module:pageflow/ui
18
+ */
3
19
  pageflow.TextAreaInputView = Backbone.Marionette.ItemView.extend({
4
20
  mixins: [pageflow.inputView],
5
21
 
@@ -1,3 +1,29 @@
1
+ /**
2
+ * Input view for a single line of text.
3
+ *
4
+ * @param {boolean} [options.required=false]
5
+ * Display an error if the input is blank.
6
+ *
7
+ * @param {string|function} [options.placeholder]
8
+ * Display a placeholder string if the input is blank. Either a
9
+ * string or a function taking the model as a first parameter and
10
+ * returning a string.
11
+ *
12
+ * @param {string} [options.placeholderBinding]
13
+ * Name of an attribute. Recompute the placeholder function whenever
14
+ * this attribute changes.
15
+ *
16
+ * @param {boolean} [options.hidePlaceholderIfDisabled]
17
+ * Do not display the placeholder if the input is disabled.
18
+ *
19
+ * @param {Backbone.Model} [options.placeholderModel]
20
+ * Obtain placeholder by looking up the configured `propertyName`
21
+ * inside a given model.
22
+ *
23
+ * @see {@link module:pageflow/ui.pageflow.inputView pageflow.inputView} for further options
24
+ * @class
25
+ * @memberof module:pageflow/ui
26
+ */
1
27
  pageflow.TextInputView = Backbone.Marionette.ItemView.extend({
2
28
  mixins: [pageflow.inputView],
3
29
 
@@ -17,6 +43,12 @@ pageflow.TextInputView = Backbone.Marionette.ItemView.extend({
17
43
  this.validate();
18
44
 
19
45
  this.listenTo(this.model, 'change:' + this.options.propertyName, this.load);
46
+
47
+ if (this.options.placeholderBinding) {
48
+ this.listenTo(this.model,
49
+ 'change:' + this.options.placeholderBinding,
50
+ this.updatePlaceholder);
51
+ }
20
52
  },
21
53
 
22
54
  onChange: function() {
@@ -61,11 +93,22 @@ pageflow.TextInputView = Backbone.Marionette.ItemView.extend({
61
93
 
62
94
  placeholderText: function() {
63
95
  if (!this.options.disabled || !this.options.hidePlaceholderIfDisabled) {
64
- return this.options.placeholder || this.placholderModelValue();
96
+ if (this.options.placeholder) {
97
+ if (typeof this.options.placeholder == 'function') {
98
+ return this.options.placeholder(this.model);
99
+ }
100
+ else {
101
+ return this.options.placeholder;
102
+ }
103
+ }
104
+ else {
105
+ return this.placeholderModelValue();
106
+ }
65
107
  }
66
108
  },
67
109
 
68
- placholderModelValue: function() {
69
- return this.options.placeholderModel && this.options.placeholderModel.get(this.options.propertyName);
110
+ placeholderModelValue: function() {
111
+ return this.options.placeholderModel &&
112
+ this.options.placeholderModel.get(this.options.propertyName);
70
113
  }
71
- });
114
+ });
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Display view for a link to a URL, to be used like an input view.
3
+ *
4
+ * @param {string} [options.propertyName]
5
+ * Target URL for link
6
+ *
7
+ * @see {@link module:pageflow/ui.pageflow.inputView pageflow.inputView} for further options
8
+ * @class
9
+ * @memberof module:pageflow/ui
10
+ */
11
+
12
+ pageflow.UrlDisplayView = Backbone.Marionette.ItemView.extend({
13
+ mixins: [pageflow.inputView],
14
+
15
+ template: 'pageflow/ui/templates/inputs/url_display',
16
+
17
+ ui: {
18
+ link: 'a'
19
+ },
20
+
21
+ modelEvents: {
22
+ 'change': 'update'
23
+ },
24
+
25
+ events: {
26
+ 'click a': function(event) {
27
+ // Ensure default is not prevented by parent event listener.
28
+ event.stopPropagation();
29
+ }
30
+ },
31
+
32
+ onRender: function() {
33
+ this.update();
34
+ },
35
+
36
+ update: function() {
37
+ var url = this.model.get('original_url');
38
+
39
+ this.$el.toggle(this.model.isUploaded() && !_.isEmpty(url));
40
+ this.ui.link.attr('href', url);
41
+ }
42
+ });
@@ -1,4 +1,22 @@
1
- pageflow.UrlInputView = Backbone.Marionette.Layout.extend({
1
+ /**
2
+ * Input view for URLs.
3
+ *
4
+ * @param {string[]} options.supportedHosts
5
+ * List of allowed url prefixes.
6
+ *
7
+ * @param {boolean} [options.required=false]
8
+ * Display an error if the url is blank.
9
+ *
10
+ * @param {boolean} [options.permitHttps=false]
11
+ * Allow urls with https protocol.
12
+ *
13
+ * @see {@link module:pageflow/ui.pageflow.inputView pageflow.inputView} for further options
14
+ * @class
15
+ * @memberof module:pageflow/ui
16
+ */
17
+ pageflow.UrlInputView = Backbone.Marionette.Layout.extend(
18
+ /** @lends module:pageflow/ui.pageflow.UrlInputView# */{
19
+
2
20
  mixins: [pageflow.inputView],
3
21
 
4
22
  template: 'pageflow/ui/templates/inputs/url_input',
@@ -149,4 +167,4 @@ pageflow.UrlInputView = Backbone.Marionette.Layout.extend({
149
167
  view.ui.validation.hide();
150
168
  }
151
169
  }
152
- });
170
+ });
@@ -15,6 +15,7 @@
15
15
  *
16
16
  * will be used for the label. And the key
17
17
  *
18
+ * pageflow.ui.inline_help.page.title_html
18
19
  * pageflow.ui.inline_help.page.title
19
20
  *
20
21
  * will be used for the inline help.
@@ -35,19 +36,22 @@
35
36
  *
36
37
  * Accordingly, for the inline help:
37
38
  *
39
+ * some.attributes.title.inline_help_html
38
40
  * some.attributes.title.inline_help
41
+ * fallback.attributes.title.inline_help_html
39
42
  * fallback.attributes.title.inline_help
43
+ * pageflow.ui.inline_help.post.title_html
40
44
  * pageflow.ui.inline_help.post.title
41
45
  *
42
46
  * This setup allows to keep all translation keys for an attribute
43
47
  * to share a common prefix:
44
48
  *
45
- * some:
46
- * attributes:
47
- * title:
48
- * label: "Label"
49
- * inline_help: "..."
50
- * inline_help_disabled: "..."
49
+ * some:
50
+ * attributes:
51
+ * title:
52
+ * label: "Label"
53
+ * inline_help: "..."
54
+ * inline_help_disabled: "..."
51
55
  *
52
56
  * ### Inline Help for Disabled Inputs
53
57
  *
@@ -57,38 +61,50 @@
57
61
  * attribute translation key prefixes take precedence over suffixed
58
62
  * keys:
59
63
  *
64
+ * some.attributes.title.inline_help_html
60
65
  * some.attributes.title.inline_help
66
+ * some.attributes.title.inline_help_disabled_html
61
67
  * some.attributes.title.inline_help_disabled
68
+ * fallback.attributes.title.inline_help_html
62
69
  * fallback.attributes.title.inline_help
70
+ * fallback.attributes.title.inline_help_disabled_html
63
71
  * fallback.attributes.title.inline_help_disabled
72
+ * pageflow.ui.inline_help.post.title_html
64
73
  * pageflow.ui.inline_help.post.title
74
+ * pageflow.ui.inline_help.post.title_disabled_html
65
75
  * pageflow.ui.inline_help.post.title_disabled
66
76
  *
67
- * @option propertyName [String]
77
+ * @param {string} options
78
+ * Common constructor options for all views that include this mixin.
79
+ *
80
+ * @param {string} options.propertyName
68
81
  * Name of the attribute on the model to display and edit.
69
82
  *
70
- * @option label [String]
83
+ * @param {string} [options.label]
71
84
  * Label text for the input.
72
85
  *
73
- * @option attributeTranslationKeyPrefixes [Array<String>]
86
+ * @param {string[]} [options.attributeTranslationKeyPrefixes]
74
87
  * An array of prefixes to lookup translations for labels and
75
88
  * inline help texts based on attribute names.
76
89
  *
77
- * @option disabled [Boolean]
90
+ * @param {boolean} [options.disabled]
78
91
  * Render input as disabled.
79
92
  *
80
- * @option visibleBinding [String]
93
+ * @param {string} [options.visibleBinding]
81
94
  * Name of an attribute to control whether the input is visible. If
82
95
  * the `visible` and `visibleBindingValue` options are not set,
83
- * input will be visible whenever this attribute as a truthy value.
96
+ * input will be visible whenever this attribute has a truthy value.
84
97
  *
85
- * @option visible [Function|Boolean]
98
+ * @param {function|boolean} [options.visible]
86
99
  * A Function taking the value of the `visibleBinding` attribute as
87
100
  * parameter. Input will be visible only if function returns `true`.
88
101
  *
89
- * @option visibleBindingValue [Any]
102
+ * @param {any} [options.visibleBindingValue]
90
103
  * Input will be visible whenever the value of the `visibleBinding`
91
104
  * attribute equals the value of this option.
105
+ *
106
+ * @mixin
107
+ * @memberof module:pageflow/ui
92
108
  */
93
109
  pageflow.inputView = {
94
110
  ui: {
@@ -97,44 +113,47 @@ pageflow.inputView = {
97
113
  },
98
114
 
99
115
  /**
100
- * Returns an array of translation keys based on the propertyName
101
- * options and the given prefixes.
116
+ * Returns an array of translation keys based on the
117
+ * `attributeTranslationKeyPrefixes` option and the given keyName.
102
118
  *
103
- * @param keyName [String]
104
- * Suffix to append to prefixes.
119
+ * Combined with {@link
120
+ * module:pageflow/ui.pageflow.i18nUtils.findTranslation
121
+ * i18nUtils.findTranslation}, this can be used inside input views
122
+ * to obtain additional translations with the same logic as for
123
+ * labels and inline help texts.
105
124
  *
106
- * @option attributeTranslationKeyPrefixes [Array<String>]
107
- * An array of strings to use as prefixes to constructs
108
- * translation keys.
125
+ * pageflow.i18nUtils.findTranslation(this.attributeTranslationKeys('default_value'));
109
126
  *
110
- * @option fallbackPrefix [String]
127
+ * @param {string} keyName
128
+ * Suffix to append to prefixes.
129
+ *
130
+ * @param {string} [options.fallbackPrefix]
111
131
  * Optional additional prefix to form a model based translation
112
132
  * key of the form `prefix.modelI18nKey.propertyName.keyName
113
133
  *
114
- * @api edge
134
+ * @return {string[]}
135
+ * @since 0.9
136
+ * @member
115
137
  */
116
138
  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;
139
+ return pageflow.i18nUtils.attributeTranslationKeys(
140
+ this.options.propertyName,
141
+ keyName,
142
+ _.extend({
143
+ prefixes: this.options.attributeTranslationKeyPrefixes,
144
+ fallbackModelI18nKey: this.model.i18nKey
145
+ }, options || {})
146
+ );
130
147
  },
131
148
 
132
- /** @private */
133
149
  onRender: function() {
150
+ this.$el.addClass('input');
134
151
  this.$el.addClass(this.model.modelName + '_' + this.options.propertyName);
135
- this.ui.labelText.text(this.labelText());
136
152
 
137
- this.ui.inlineHelp.text(this.inlineHelpText());
153
+ this.$el.data('inputPropertyName', this.options.propertyName);
154
+
155
+ this.ui.labelText.text(this.labelText());
156
+ this.ui.inlineHelp.html(this.inlineHelpText());
138
157
 
139
158
  if (!this.inlineHelpText()) {
140
159
  this.ui.inlineHelp.hide();
@@ -144,32 +163,42 @@ pageflow.inputView = {
144
163
  this.setupVisibleBinding();
145
164
  },
146
165
 
166
+ /**
167
+ * The label to display in the form.
168
+ * @return {string}
169
+ */
147
170
  labelText: function() {
148
171
  return this.options.label || this.localizedAttributeName();
149
172
  },
150
173
 
151
174
  localizedAttributeName: function() {
152
- return pageflow.i18nUtils.findTranslation(this.attributeTranslationKeys('label', {fallbackPrefix: 'activerecord.attributes'}));
175
+ return pageflow.i18nUtils.findTranslation(this.attributeTranslationKeys('label', {
176
+ fallbackPrefix: 'activerecord.attributes'
177
+ }));
153
178
  },
154
179
 
180
+ /**
181
+ * The inline help text for the form field.
182
+ * @return {string}
183
+ */
155
184
  inlineHelpText: function() {
156
- var keys = this.attributeTranslationKeys('inline_help', {fallbackPrefix: 'pageflow.ui.inline_help'});
185
+ var keys = this.attributeTranslationKeys('inline_help', {
186
+ fallbackPrefix: 'pageflow.ui.inline_help'
187
+ });
157
188
 
158
189
  if (this.options.disabled) {
159
190
  keys = pageflow.i18nUtils.translationKeysWithSuffix(keys, 'disabled');
160
191
  }
161
192
 
162
- return pageflow.i18nUtils.findTranslation(keys, {defaultValue: ''});
193
+ return pageflow.i18nUtils.findTranslation(keys, {defaultValue: '', html: true});
163
194
  },
164
195
 
165
- /** @private */
166
196
  updateDisabled: function() {
167
197
  if (this.ui.input) {
168
198
  this.updateDisabledAttribute(this.ui.input);
169
199
  }
170
200
  },
171
201
 
172
- /** @private */
173
202
  updateDisabledAttribute: function(element) {
174
203
  if (this.options.disabled) {
175
204
  element.attr('disabled', true);
@@ -179,7 +208,6 @@ pageflow.inputView = {
179
208
  }
180
209
  },
181
210
 
182
- /** @private */
183
211
  setupVisibleBinding: function() {
184
212
  var view = this;
185
213
 
@@ -207,4 +235,4 @@ pageflow.inputView = {
207
235
  }
208
236
  }
209
237
  }
210
- };
238
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * A table cell providing a button which destroys the model that the
3
+ * current row refers to.
4
+ *
5
+ * ## Attribute Translations
6
+ *
7
+ * The following attribute translation is used:
8
+ *
9
+ * - `.cell_title` - Used as title attribute.
10
+ *
11
+ * @param {function} [options.toggleDeleteButton]
12
+ * A function with boolean return value to be called on
13
+ * this.getModel(). Delete button will be visible only if the
14
+ * function returns a truthy value.
15
+ *
16
+ * @param {boolean} [options.invertToggleDeleteButton]
17
+ * Invert the return value of `toggleDeleteButton`?
18
+ *
19
+ * @since 12.0
20
+ */
21
+ pageflow.DeleteRowTableCellView = pageflow.TableCellView.extend({
22
+ className: 'delete_row_table_cell',
23
+ template: 'templates/delete_row_table_cell',
24
+
25
+ ui: {
26
+ removeButton: '.remove'
27
+ },
28
+
29
+ events: {
30
+ 'click .remove': 'destroy',
31
+
32
+ 'click': function() {
33
+ return false;
34
+ }
35
+ },
36
+
37
+ showButton: function() {
38
+ if (this.options.toggleDeleteButton) {
39
+ var context = this.getModel();
40
+ var toggle = context[this.options.toggleDeleteButton].apply(context);
41
+
42
+ if (this.options.invertToggleDeleteButton) {
43
+ return !toggle;
44
+ }
45
+ else {
46
+ return !!toggle;
47
+ }
48
+ }
49
+ else {
50
+ return true;
51
+ }
52
+ },
53
+
54
+ update: function() {
55
+ this.ui.removeButton.toggleClass('remove', this.showButton());
56
+
57
+ this.ui.removeButton.attr('title', this.attributeTranslation('cell_title'));
58
+ },
59
+
60
+ destroy: function() {
61
+ this.getModel().destroy();
62
+ }
63
+ });