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
data/README.md CHANGED
@@ -12,7 +12,9 @@ For a high level introduction and example Pageflow stories see
12
12
 
13
13
  * [Getting Started](https://github.com/codevise/pageflow/wiki/Getting-Started)
14
14
  * [Guides](https://github.com/codevise/pageflow/blob/master/doc/index.md)
15
- * [Theme Settings](http://codevise.github.io/pageflow/theme/master/)
15
+ * [JavaScript API Reference](https://doclets.io/codevise/pageflow/master)
16
+ * [Theme API Reference](http://codevise.github.io/pageflow/theme/master/)
17
+ * [List of Plugins](https://github.com/codevise/pageflow/wiki/List-of-Plugins)
16
18
 
17
19
  ## Updating
18
20
 
@@ -41,13 +43,15 @@ Pageflow assumes the following choice of libraries:
41
43
  * [Resque](https://github.com/resque/resque) for background jobs
42
44
  * [FriendlyId](https://github.com/norman/friendly_id) for pretty URLs
43
45
  * [Paperclip](https://github.com/thoughtbot/paperclip) for attachment handling
44
- * [Backbone](http://backbonejs.org/) [Marionette](http://marionettejs.com/) for client side development
46
+ * [Backbone](http://backbonejs.org/) [Marionette](http://marionettejs.com/) for the editor
47
+ * [React](https://facebook.github.io/react/)/[Redux](http://redux.js.org/) for the frontend
45
48
 
46
49
  ## Requirements
47
50
 
48
51
  Pageflow runs in environments with:
49
52
 
50
53
  * Ruby >= 2.1
54
+ * Node >= 6.9.5
51
55
  * Rails 4.2
52
56
  * Redis server (for Resque)
53
57
  * A database server supported by Active Record (tested with MySQL)
@@ -83,7 +87,7 @@ Add this line to your application's Gemfile:
83
87
  # Gemfile
84
88
  gem 'pageflow'
85
89
 
86
- # Required for Rails 4.1:
90
+ # Required for Rails 4.2 compatibility
87
91
  gem 'state_machine', git: 'https://github.com/codevise/state_machine.git'
88
92
 
89
93
  Run bundler to install dependencies:
data/Rakefile CHANGED
@@ -26,3 +26,5 @@ load 'rails/tasks/engine.rake' if File.exists?(APP_RAKEFILE)
26
26
  load File.expand_path('lib/tasks/pageflow_tasks.rake', File.dirname(__FILE__))
27
27
 
28
28
  Bundler::GemHelper.install_tasks
29
+
30
+ task 'release:prepare' => 'pageflow:node_package:build'
@@ -1,21 +1,38 @@
1
1
  module Pageflow
2
2
  ActiveAdmin.register Account, :as => 'Account' do
3
- menu :priority => 3
3
+ menu priority: 3,
4
+ if: proc { authorized?(:index, :accounts) }
4
5
 
5
6
  config.batch_actions = false
6
7
 
7
8
  index do
8
9
  column :name do |account|
9
- link_to account.name, admin_account_path(account)
10
+ if authorized?(:read, account)
11
+ link_to(account.name,
12
+ admin_account_path(account),
13
+ data: {id: account.id})
14
+ else
15
+ account.name
16
+ end
10
17
  end
11
18
  column :entries_count do |account|
12
- account.entries_count
19
+ account.entries_count if authorized?(:read, account)
13
20
  end
14
21
  column :users_count do |account|
15
- account.users_count
22
+ account.memberships.size if authorized?(:read, account)
23
+ end
24
+ account_memberships = current_user.memberships.on_accounts
25
+ account_roles = account_memberships.each_with_object({}) do |membership, roles|
26
+ roles[membership.entity_id] = membership.role
27
+ end
28
+ if authorized?(:see_own_role_on, :accounts)
29
+ column :own_role do |account|
30
+ own_role = account_roles[account.id]
31
+ membership_role_with_tooltip(own_role, scope: 'own_account_role')
32
+ end
16
33
  end
17
34
  column :default_theming do |account|
18
- account.default_theming.theme_name
35
+ account.default_theming.theme_name if authorized?(:read, account)
19
36
  end
20
37
  end
21
38
 
@@ -27,15 +44,17 @@ module Pageflow
27
44
  render 'account_details', :account => account
28
45
  render 'theming_details', :account => account
29
46
 
30
- tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(:theming),
31
- :i18n => 'pageflow.admin.resource_tabs',
32
- :build_args => [account.default_theming])
47
+ tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(account.default_theming),
48
+ i18n: 'pageflow.admin.resource_tabs',
49
+ authorize: :see_theming_admin_tab,
50
+ build_args: [account.default_theming])
33
51
  end
34
52
 
35
53
  controller do
36
54
  helper Pageflow::Admin::FeaturesHelper
37
55
  helper Pageflow::Admin::WidgetsHelper
38
56
  helper Pageflow::Admin::FormHelper
57
+ helper Pageflow::Admin::MembershipsHelper
39
58
  helper ThemesHelper
40
59
 
41
60
  def new
@@ -1,6 +1,6 @@
1
1
  module Pageflow
2
- ActiveAdmin.register Entry, :as => 'Entry' do
3
- menu :priority => 1
2
+ ActiveAdmin.register Entry, as: 'Entry' do
3
+ menu priority: 1
4
4
 
5
5
  config.batch_actions = false
6
6
 
@@ -14,11 +14,15 @@ module Pageflow
14
14
  column I18n.t('pageflow.admin.entries.members'), class: 'members' do |entry|
15
15
  entry_user_badge_list(entry)
16
16
  end
17
- if authorized?(:read, Account)
17
+ if authorized?(:see, :accounts)
18
18
  column :account, sortable: 'account_id' do |entry|
19
- link_to(entry.account.name,
20
- admin_account_path(entry.account),
21
- data: {id: entry.account.id})
19
+ if authorized?(:read, entry.account)
20
+ link_to(entry.account.name,
21
+ admin_account_path(entry.account),
22
+ data: {id: entry.account.id})
23
+ else
24
+ entry.account.name
25
+ end
22
26
  end
23
27
  end
24
28
  column :created_at
@@ -26,7 +30,7 @@ module Pageflow
26
30
  column :published_at, sortable: 'pageflow_revisions.published_at'
27
31
 
28
32
  column class: 'buttons' do |entry|
29
- if authorized?(:edit, Entry)
33
+ if authorized?(:edit, entry)
30
34
  icon_link_to(pageflow.edit_entry_path(entry),
31
35
  tooltip: I18n.t('pageflow.admin.entries.editor_hint'),
32
36
  class: 'editor')
@@ -45,33 +49,46 @@ module Pageflow
45
49
  end
46
50
 
47
51
  filter :title
48
- filter :account, if: ->(_) { authorized?(:read, Account) }
52
+ filter :account,
53
+ if: ->(_) { authorized?(:index, :accounts) },
54
+ collection: -> { Account.accessible_by(current_ability, :read) }
49
55
  filter :created_at
50
56
  filter :edited_at
51
57
  filter :first_published_at
52
58
  filter :published_revision_published_at, as: :date_range
53
- filter :with_publication_state, as: :select, collection: -> { collection_for_entry_publication_states }
54
-
55
- sidebar :folders, :only => :index do
56
- text_node(link_to(I18n.t('pageflow.admin.entries.add_folder'), new_admin_folder_path, :class => 'new'))
57
- grouped_folder_list(Folder.includes(:account).accessible_by(Ability.new(current_user), :read),
58
- :class => authorized?(:manage, Folder) ? 'editable' : nil,
59
- :active_id => params[:folder_id],
60
- :grouped_by_accounts => authorized?(:read, Account))
59
+ filter :with_publication_state,
60
+ as: :select,
61
+ collection: -> { collection_for_entry_publication_states }
62
+
63
+ sidebar :folders, only: :index do
64
+ text_node(link_to(I18n.t('pageflow.admin.entries.add_folder'),
65
+ new_admin_folder_path,
66
+ class: 'new'))
67
+ grouped_folder_list(Folder.accessible_by(current_ability, :read).includes(:account),
68
+ active_id: params[:folder_id],
69
+ grouped_by_accounts: authorized?(:see, :accounts))
61
70
  end
62
71
 
63
72
  form do |f|
64
73
  f.inputs do
65
- f.input :title, :hint => I18n.t('pageflow.admin.entries.title_hint')
66
- if authorized?(:read, Account)
67
- f.input :account, :include_blank => false
74
+ f.input :title, hint: I18n.t('pageflow.admin.entries.title_hint')
68
75
 
69
- unless f.object.new_record?
70
- f.input :theming, :include_blank => false
71
- end
76
+ if authorized?(:update_account_on, resource)
77
+ f.input :account,
78
+ collection: eligible_accounts,
79
+ include_blank: false,
80
+ input_html: {class: 'entry_account_input'}
81
+ end
82
+
83
+ if authorized?(:update_theming_on, resource) && !f.object.new_record?
84
+ f.input :theming, collection: eligible_themings, include_blank: false
72
85
  end
73
- if authorized?(:manage, Folder)
74
- f.input :folder, :collection => collection_for_folders(f.object.account), :include_blank => true
86
+
87
+ if authorized?(:configure_folder_for, resource)
88
+ folder_collection = collection_for_folders(resource.account, resource.folder)
89
+ f.input(:folder,
90
+ collection: folder_collection,
91
+ include_blank: true) unless folder_collection.empty?
75
92
  end
76
93
 
77
94
  Pageflow.config_for(f.object).admin_form_inputs.build(:entry, f)
@@ -80,7 +97,7 @@ module Pageflow
80
97
  end
81
98
 
82
99
  action_item(:depublish, only: :show) do
83
- if authorized?(:publish, Entry) && entry.published?
100
+ if authorized?(:publish, entry) && entry.published?
84
101
  button_to(I18n.t('pageflow.admin.entries.depublish'),
85
102
  pageflow.current_entry_revisions_path(entry),
86
103
  method: :delete,
@@ -105,46 +122,48 @@ module Pageflow
105
122
  end
106
123
  end
107
124
 
108
- member_action :duplicate, :method => :post do
125
+ member_action :duplicate, method: :post do
109
126
  entry = Entry.find(params[:id])
110
127
  authorize!(:duplicate, entry)
111
128
  new_entry = entry.duplicate
112
129
  redirect_to(edit_admin_entry_path(new_entry))
113
130
  end
114
131
 
115
- member_action :snapshot, :method => :post do
132
+ member_action :snapshot, method: :post do
116
133
  entry = Entry.find(params[:id])
117
134
  authorize!(:snapshot, entry)
118
- entry.snapshot(:creator => current_user, :type => 'user')
135
+ entry.snapshot(creator: current_user, type: 'user')
119
136
  redirect_to(admin_entry_path(entry))
120
137
  end
121
138
 
122
139
  member_action :preview do
123
140
  entry = Entry.find(params[:id])
124
- authorize!(:show, entry.draft)
141
+ authorize!(:read, entry.draft)
125
142
  redirect_to(pageflow.revision_path(entry.draft))
126
143
  end
127
144
 
128
- show :title => :title do |entry|
129
- render 'attributes_table', :entry => entry
130
- render 'links', :entry => entry
145
+ show title: :title do |entry|
146
+ render 'attributes_table', entry: entry
147
+ render 'links', entry: entry
131
148
 
132
- tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(:entry),
133
- :i18n => 'pageflow.admin.resource_tabs',
134
- :authorize => true,
135
- :build_args => [entry])
149
+ tabs_view(Pageflow.config.admin_resource_tabs.find_by_resource(entry),
150
+ i18n: 'pageflow.admin.resource_tabs',
151
+ authorize: :see_entry_admin_tab,
152
+ build_args: [entry])
136
153
  end
137
154
 
138
155
  controller do
139
156
  helper FoldersHelper
140
157
  helper EntriesHelper
141
- helper Pageflow::Admin::EntriesHelper
142
- helper Pageflow::Admin::FeaturesHelper
143
- helper Pageflow::Admin::RevisionsHelper
144
- helper Pageflow::Admin::FormHelper
158
+ helper EmbedCodeHelper
159
+ helper Admin::EntriesHelper
160
+ helper Admin::FeaturesHelper
161
+ helper Admin::FormHelper
162
+ helper Admin::MembershipsHelper
163
+ helper Admin::RevisionsHelper
145
164
 
146
165
  after_build do |entry|
147
- entry.account ||= current_user.account
166
+ entry.account ||= account_policy_scope.entry_creatable.first || Account.first
148
167
  entry.theming ||= entry.account.default_theming
149
168
  end
150
169
 
@@ -155,7 +174,7 @@ module Pageflow
155
174
  end
156
175
 
157
176
  def scoped_collection
158
- result = super.includes(:theming, :account, :users, :published_revision).references(:published_revision)
177
+ result = super.includes(:theming, :account, {memberships: :user}, :published_revision).references(:published_revision)
159
178
  params.key?(:folder_id) ? result.where(folder_id: params[:folder_id]) : result
160
179
  end
161
180
 
@@ -171,23 +190,87 @@ module Pageflow
171
190
 
172
191
  private
173
192
 
193
+ def account_policy_scope
194
+ AccountPolicy::Scope.new(current_user, Account)
195
+ end
196
+
197
+ def theming_policy_scope
198
+ ThemingPolicy::Scope.new(current_user, Theming)
199
+ end
200
+
174
201
  def permitted_attributes
175
202
  result = [:title]
176
-
177
- target = params[:id] ? resource : current_user.account
203
+ target = if !params[:id] && current_user.admin?
204
+ Account.first
205
+ elsif params[:id]
206
+ resource
207
+ else
208
+ current_user.accounts.first
209
+ end
178
210
  result += Pageflow.config_for(target).admin_form_inputs.permitted_attributes_for(:entry)
211
+ result += permitted_account_attributes
212
+
213
+ if params[:id]
214
+ result << :folder_id if authorized?(:configure_folder_for, resource)
215
+ end
216
+
217
+ if params[:id]
218
+ accounts = resource.account
219
+ else
220
+ accounts = account_policy_scope.themings_accessible
221
+ end
222
+
223
+ result += permitted_theming_attributes(accounts)
179
224
 
180
- result += [:account_id, :theming_id] if authorized?(:read, Account)
181
- result << :folder_id if authorized?(:manage, Folder)
182
225
  result
183
226
  end
184
227
 
185
228
  def permit_feature_states(attributes)
186
- if authorized?(:read, Account)
229
+ if params[:id] && authorized?(:update_feature_configuration_on, resource)
187
230
  feature_states = params[:entry][:feature_states].try(:permit!)
188
231
  attributes.merge!(feature_states: feature_states || {})
189
232
  end
190
233
  end
234
+
235
+ def permitted_theming_attributes(accounts)
236
+ if (create_or_new_action? || authorized?(:update_theming_on, resource)) &&
237
+ theming_params_present? && theming_in_allowed_themings_for?(accounts)
238
+ [:theming_id]
239
+ else
240
+ []
241
+ end
242
+ end
243
+
244
+ def theming_params_present?
245
+ params[:entry] && params[:entry][:theming_id]
246
+ end
247
+
248
+ def create_or_new_action?
249
+ [:create, :new].include?(action_name.to_sym)
250
+ end
251
+
252
+ def theming_in_allowed_themings_for?(accounts)
253
+ theming_policy_scope.themings_allowed_for(accounts)
254
+ .include?(Theming.find(params[:entry][:theming_id]))
255
+ end
256
+
257
+ def permitted_account_attributes
258
+ if account_params_present? &&
259
+ (action_name.to_sym == :create || legally_moving_entry_to_other_account)
260
+ [:account_id]
261
+ else
262
+ []
263
+ end
264
+ end
265
+
266
+ def legally_moving_entry_to_other_account
267
+ action_name.to_sym == :update && authorized?(:update_account_on, resource) &&
268
+ account_policy_scope.entry_movable.include?(Account.find(params[:entry][:account_id]))
269
+ end
270
+
271
+ def account_params_present?
272
+ params[:entry] && params[:entry][:account_id]
273
+ end
191
274
  end
192
275
  end
193
276
  end
@@ -1,58 +1,69 @@
1
1
  module Pageflow
2
- ActiveAdmin.register Folder, :as => 'Folder' do
2
+ ActiveAdmin.register Folder, as: 'Folder' do
3
3
  menu false
4
4
 
5
- # TODO
6
5
  actions :new, :create, :edit, :update, :destroy
7
6
 
8
7
  form do |f|
9
8
  f.inputs do
10
- if authorized?(:read, Account) && f.object.new_record?
11
- f.input :account, :include_blank => false
9
+ if authorized?(:show_account_selection_on, resource) && f.object.new_record?
10
+ f.input :account,
11
+ collection: AccountPolicy::Scope.new(current_user, Account).folder_addable,
12
+ include_blank: false
12
13
  end
13
14
  f.input :name
14
15
  end
15
16
  f.actions do
16
17
  f.action(:submit)
17
- f.action(:cancel, :wrapper_html => {:class => 'cancel'})
18
+ f.action(:cancel, wrapper_html: {class: 'cancel'})
18
19
  end
19
20
  end
20
21
 
21
22
  controller do
22
- def build_new_resource
23
- super.tap do |folder|
24
- folder.account ||= current_user.account
25
- end
23
+ after_build do |folder|
24
+ folder.account ||= account_policy_scope.folder_addable.first || Account.first
26
25
  end
27
26
 
28
27
  def create
29
- super do |success, failure|
28
+ super do |success|
30
29
  success.html { redirect_to(admin_entries_path) }
31
30
  end
32
31
  end
33
32
 
34
33
  def update
35
- super do |success, failure|
36
- success.html { redirect_to(admin_entries_path(:folder_id => resource.id)) }
34
+ super do |success, _failure|
35
+ success.html { redirect_to(admin_entries_path(folder_id: resource.id)) }
37
36
  end
38
37
  end
39
38
 
40
39
  def destroy
41
- super do |success, failure|
40
+ super do |success, _failure|
42
41
  success.html { redirect_to(admin_entries_path) }
43
42
  end
44
43
  end
45
44
 
46
45
  def permitted_params
47
- result = params.permit(:folder => [:name, :account_id])
48
- restrict_attributes(params[:id], result[:folder]) if result[:folder]
46
+ result = params.permit(folder: [:name, :account_id])
47
+ restrict_attributes(result[:folder]) if result[:folder]
49
48
  result
50
49
  end
51
50
 
52
51
  private
53
52
 
54
- def restrict_attributes(id, attributes)
55
- attributes.except!(:account_id) if !authorized?(:read, Account) || id.present?
53
+ def account_policy_scope
54
+ AccountPolicy::Scope.new(current_user, Account)
55
+ end
56
+
57
+ def restrict_attributes(attributes)
58
+ if params[:folder] && params[:folder][:account_id] &&
59
+ AccountPolicy::Scope.new(current_user, Account)
60
+ .folder_addable.exists?(params[:folder][:account_id]) &&
61
+ action_name.to_sym == :create
62
+
63
+ attributes
64
+ else
65
+ attributes.except!(:account_id)
66
+ end
56
67
  end
57
68
  end
58
69
  end