pageflow 12.0.4 → 12.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (217) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +158 -374
  3. data/README.md +24 -3
  4. data/Rakefile +2 -2
  5. data/admins/pageflow/accounts.rb +30 -4
  6. data/admins/pageflow/entry.rb +59 -9
  7. data/admins/pageflow/membership.rb +57 -6
  8. data/admins/pageflow/user.rb +25 -4
  9. data/app/assets/images/pageflow/themes/default/preview.png +0 -0
  10. data/app/assets/images/pageflow/themes/default/preview_thumbnail.png +0 -0
  11. data/app/assets/javascripts/pageflow/admin/entries.js +5 -3
  12. data/app/assets/javascripts/pageflow/admin/users.js +33 -0
  13. data/app/assets/javascripts/pageflow/admin.js +4 -1
  14. data/app/assets/javascripts/pageflow/audio_context.js +28 -0
  15. data/app/assets/javascripts/pageflow/audio_player/get_media_element_method.js +5 -0
  16. data/app/assets/javascripts/pageflow/audio_player.js +2 -0
  17. data/app/assets/javascripts/pageflow/base.js +4 -22
  18. data/app/assets/javascripts/pageflow/dist/react.js +323 -242
  19. data/app/assets/javascripts/pageflow/editor/api/widget_type.js +23 -0
  20. data/app/assets/javascripts/pageflow/editor/api/widget_types.js +53 -0
  21. data/app/assets/javascripts/pageflow/editor/api.js +9 -1
  22. data/app/assets/javascripts/pageflow/editor/base.js +0 -1
  23. data/app/assets/javascripts/pageflow/editor/collections/pages_collection.js +1 -0
  24. data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +21 -1
  25. data/app/assets/javascripts/pageflow/editor/collections/themes_collection.js +13 -0
  26. data/app/assets/javascripts/pageflow/editor/collections/widgets_collection.js +23 -8
  27. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +7 -1
  28. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +10 -3
  29. data/app/assets/javascripts/pageflow/editor/initializers/setup_widget_types.js +5 -1
  30. data/app/assets/javascripts/pageflow/editor/initializers/stylesheet_reloading.js +8 -3
  31. data/app/assets/javascripts/pageflow/editor/models/edit_lock_container.js +1 -1
  32. data/app/assets/javascripts/pageflow/editor/models/entry.js +7 -4
  33. data/app/assets/javascripts/pageflow/editor/models/entry_configuration.js +1 -1
  34. data/app/assets/javascripts/pageflow/editor/models/file_stage.js +1 -0
  35. data/app/assets/javascripts/pageflow/editor/models/page.js +3 -1
  36. data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +2 -2
  37. data/app/assets/javascripts/pageflow/editor/models/theme.js +25 -0
  38. data/app/assets/javascripts/pageflow/editor/models/theming.js +1 -19
  39. data/app/assets/javascripts/pageflow/editor/models/widget.js +22 -1
  40. data/app/assets/javascripts/pageflow/editor/models/widget_configuration.js +5 -0
  41. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
  42. data/app/assets/javascripts/pageflow/editor/templates/change_theme_dialog.jst.ejs +23 -0
  43. data/app/assets/javascripts/pageflow/editor/templates/edit_widget.jst.ejs +1 -2
  44. data/app/assets/javascripts/pageflow/editor/templates/inputs/reference.jst.ejs +2 -2
  45. data/app/assets/javascripts/pageflow/editor/templates/static_thumbnail.jst.ejs +1 -0
  46. data/app/assets/javascripts/pageflow/editor/templates/theme_item.jst.ejs +5 -0
  47. data/app/assets/javascripts/pageflow/editor/templates/widget_item.jst.ejs +3 -0
  48. data/app/assets/javascripts/pageflow/editor/utils/stylesheet.js +23 -0
  49. data/app/assets/javascripts/pageflow/editor/views/change_theme_dialog_view.js +76 -0
  50. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +4 -2
  51. data/app/assets/javascripts/pageflow/editor/views/edit_meta_data_view.js +17 -4
  52. data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +11 -21
  53. data/app/assets/javascripts/pageflow/editor/views/edit_widgets_view.js +1 -3
  54. data/app/assets/javascripts/pageflow/editor/views/file_meta_data_item_value_view.js +10 -1
  55. data/app/assets/javascripts/pageflow/editor/views/inputs/reference_input_view.js +36 -4
  56. data/app/assets/javascripts/pageflow/editor/views/inputs/theme_input_view.js +26 -0
  57. data/app/assets/javascripts/pageflow/editor/views/model_thumbnail_view.js +28 -14
  58. data/app/assets/javascripts/pageflow/editor/views/static_thumbnail_view.js +20 -0
  59. data/app/assets/javascripts/pageflow/editor/views/theme_item_view.js +41 -0
  60. data/app/assets/javascripts/pageflow/editor/views/widget_item_view.js +49 -0
  61. data/app/assets/javascripts/pageflow/history.js +7 -1
  62. data/app/assets/javascripts/pageflow/media_player/volume_fading/interval.js +65 -0
  63. data/app/assets/javascripts/pageflow/media_player/volume_fading/noop.js +5 -0
  64. data/app/assets/javascripts/pageflow/media_player/volume_fading/web_audio.js +109 -0
  65. data/app/assets/javascripts/pageflow/media_player/volume_fading.js +14 -65
  66. data/app/assets/javascripts/pageflow/slideshow/dom_order_scroll_navigator.js +5 -2
  67. data/app/assets/javascripts/pageflow/slideshow.js +19 -8
  68. data/app/assets/javascripts/pageflow/ui/views/configuration_editor_view.js +4 -0
  69. data/app/assets/javascripts/pageflow/ui/views/inputs/text_area_input_view.js +10 -5
  70. data/app/assets/javascripts/pageflow/ui/views/inputs/text_input_view.js +4 -48
  71. data/app/assets/javascripts/pageflow/ui/views/mixins/input_with_placeholder_text.js +58 -0
  72. data/app/assets/javascripts/pageflow/vendor.js +16 -0
  73. data/app/assets/javascripts/pageflow/video_player/get_media_element_method.js +6 -0
  74. data/app/assets/javascripts/pageflow/video_player.js +2 -0
  75. data/app/assets/stylesheets/pageflow/admin/entries.scss +1 -1
  76. data/app/assets/stylesheets/pageflow/admin/quotas.scss +1 -1
  77. data/app/assets/stylesheets/pageflow/admin.scss +2 -0
  78. data/app/assets/stylesheets/pageflow/base.scss +0 -1
  79. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
  80. data/app/assets/stylesheets/pageflow/editor/change_theme.scss +114 -0
  81. data/app/assets/stylesheets/pageflow/editor/static_thumbnails.scss +4 -0
  82. data/app/assets/stylesheets/pageflow/editor/widgets.scss +26 -2
  83. data/app/assets/stylesheets/pageflow/page.scss +1 -14
  84. data/app/assets/stylesheets/pageflow/themes/default/indicators.scss +12 -0
  85. data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.scss +11 -0
  86. data/app/assets/stylesheets/pageflow/themes/default/logo/alignment.scss +27 -0
  87. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +20 -2
  88. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +4 -1
  89. data/app/assets/stylesheets/pageflow/themes/default/page/line_lengths.scss +113 -0
  90. data/app/assets/stylesheets/pageflow/themes/default/page.scss +1 -0
  91. data/app/controllers/pageflow/editor/widgets_controller.rb +15 -1
  92. data/app/controllers/pageflow/entries_controller.rb +1 -1
  93. data/app/helpers/pageflow/admin/entries_helper.rb +0 -9
  94. data/app/helpers/pageflow/admin/memberships_helper.rb +43 -123
  95. data/app/helpers/pageflow/admin/users_helper.rb +15 -0
  96. data/app/helpers/pageflow/entries_helper.rb +3 -1
  97. data/app/helpers/pageflow/entry_json_seed_helper.rb +9 -3
  98. data/app/helpers/pageflow/public_i18n_helper.rb +2 -2
  99. data/app/helpers/pageflow/quota_helper.rb +2 -2
  100. data/app/helpers/pageflow/social_share_helper.rb +3 -2
  101. data/app/helpers/pageflow/themes_helper.rb +11 -3
  102. data/app/helpers/pageflow/widgets_helper.rb +10 -2
  103. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +9 -0
  104. data/app/mailers/pageflow/user_mailer.rb +11 -1
  105. data/app/models/concerns/pageflow/feature_target.rb +1 -1
  106. data/app/models/concerns/pageflow/hosted_file.rb +9 -0
  107. data/app/models/concerns/pageflow/output_source.rb +2 -1
  108. data/app/models/concerns/pageflow/serialization_blacklist.rb +19 -0
  109. data/app/models/concerns/pageflow/serialized_configuration.rb +17 -0
  110. data/app/models/concerns/pageflow/theme_referencer.rb +23 -0
  111. data/app/models/pageflow/account.rb +6 -1
  112. data/app/models/pageflow/account_member_query.rb +6 -12
  113. data/app/models/pageflow/account_role_query.rb +68 -0
  114. data/app/models/pageflow/application_query.rb +13 -0
  115. data/app/models/pageflow/application_record.rb +5 -0
  116. data/app/models/pageflow/audio_file.rb +1 -1
  117. data/app/models/pageflow/auto_snapshot_pruning.rb +26 -0
  118. data/app/models/pageflow/chapter.rb +4 -8
  119. data/app/models/pageflow/draft_entry.rb +2 -1
  120. data/app/models/pageflow/edit_lock.rb +11 -5
  121. data/app/models/pageflow/encoding_confirmation.rb +2 -1
  122. data/app/models/pageflow/entry.rb +13 -2
  123. data/app/models/pageflow/entry_publication.rb +2 -0
  124. data/app/models/pageflow/entry_role_query.rb +24 -9
  125. data/app/models/pageflow/entry_title_or_account_name_query.rb +33 -0
  126. data/app/models/pageflow/file_usage.rb +3 -7
  127. data/app/models/pageflow/folder.rb +1 -1
  128. data/app/models/pageflow/home_button.rb +1 -1
  129. data/app/models/pageflow/image_file.rb +22 -4
  130. data/app/models/pageflow/invitation_form.rb +10 -4
  131. data/app/models/pageflow/managed_user_query.rb +44 -0
  132. data/app/models/pageflow/membership.rb +1 -1
  133. data/app/models/pageflow/overview_button.rb +3 -4
  134. data/app/models/pageflow/page.rb +3 -7
  135. data/app/models/pageflow/potential_memberships.rb +112 -0
  136. data/app/models/pageflow/published_entry.rb +2 -1
  137. data/app/models/pageflow/revision.rb +13 -4
  138. data/app/models/pageflow/storyline.rb +3 -4
  139. data/app/models/pageflow/text_track_file.rb +1 -1
  140. data/app/models/pageflow/theming.rb +15 -10
  141. data/app/models/pageflow/url_template.rb +8 -2
  142. data/app/models/pageflow/user_name_query.rb +30 -0
  143. data/app/models/pageflow/video_file.rb +5 -1
  144. data/app/models/pageflow/widget.rb +3 -1
  145. data/app/models/pageflow/zencoder_attachment.rb +16 -5
  146. data/app/policies/pageflow/account_policy.rb +31 -61
  147. data/app/policies/pageflow/application_policy.rb +6 -0
  148. data/app/policies/pageflow/entry_policy.rb +11 -3
  149. data/app/policies/pageflow/membership_policy.rb +1 -2
  150. data/app/policies/pageflow/user_policy.rb +20 -1
  151. data/app/views/admin/accounts/_form.html.erb +4 -4
  152. data/app/views/admin/accounts/_theming_defaults_inline_help.html.erb +5 -0
  153. data/app/views/admin/memberships/_form.html.erb +9 -14
  154. data/app/views/admin/memberships/_role_hint.html.arb +1 -1
  155. data/app/views/admin/users/invitation.html.erb +18 -9
  156. data/app/views/admin/users/me.html.erb +2 -2
  157. data/app/views/admin/users/quota_state.html.erb +1 -0
  158. data/app/views/components/pageflow/admin/add_membership_button.rb +81 -0
  159. data/app/views/components/pageflow/admin/members_tab.rb +6 -4
  160. data/app/views/components/pageflow/admin/revisions_tab.rb +16 -4
  161. data/app/views/components/pageflow/admin/user_accounts_tab.rb +8 -2
  162. data/app/views/components/pageflow/admin/user_entries_tab.rb +6 -2
  163. data/app/views/components/pageflow/admin/users_tab.rb +9 -5
  164. data/app/views/layouts/pageflow/application.html.erb +2 -1
  165. data/app/views/pageflow/admin/users/_quota_exhausted.html.erb +1 -0
  166. data/app/views/pageflow/admin/users/_quota_state.html.erb +7 -0
  167. data/app/views/pageflow/config/_editor_seeds.json.jbuilder +2 -0
  168. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +1 -0
  169. data/app/views/pageflow/editor/entries/seed.json.erb +3 -1
  170. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
  171. data/app/views/pageflow/editor/themings/_theming.json.jbuilder +0 -7
  172. data/app/views/pageflow/editor/widgets/_widget.json.jbuilder +1 -1
  173. data/app/views/pageflow/entries/_entry.html.erb +5 -5
  174. data/app/views/pageflow/entries/edit.html.erb +1 -1
  175. data/app/views/pageflow/entries/show.html.erb +1 -1
  176. data/app/views/pageflow/entry_json_seed/_entry.json.jbuilder +1 -0
  177. data/app/views/pageflow/themes/_theme.json.jbuilder +13 -0
  178. data/config/initializers/admin_resource_tabs.rb +19 -6
  179. data/config/initializers/features.rb +1 -0
  180. data/config/locales/de.yml +26 -3
  181. data/config/locales/en.yml +26 -3
  182. data/db/migrate/20170201074328_add_configuration_to_widgets.rb +5 -0
  183. data/db/migrate/20170222124848_update_video_file_output_presences.rb +1 -1
  184. data/db/migrate/20170315130000_add_theme_name_to_revisions.rb +12 -0
  185. data/db/migrate/20170912165050_reset_copied_snapshot_type.rb +24 -0
  186. data/lib/generators/pageflow/routes/routes_generator.rb +11 -1
  187. data/lib/generators/pageflow/seeds/seeds_generator.rb +5 -0
  188. data/lib/generators/pageflow/seeds/templates/seeds.rb +5 -3
  189. data/lib/generators/pageflow/theme/templates/preview.png +0 -0
  190. data/lib/generators/pageflow/theme/templates/preview_thumbnail.png +0 -0
  191. data/lib/generators/pageflow/theme/theme_generator.rb +3 -0
  192. data/lib/pageflow/ability_mixin.rb +27 -6
  193. data/lib/pageflow/active_admin_can_can_fix.rb +34 -0
  194. data/lib/pageflow/configuration/permissions.rb +27 -0
  195. data/lib/pageflow/configuration.rb +28 -0
  196. data/lib/pageflow/engine.rb +25 -19
  197. data/lib/pageflow/images/palette.png +0 -0
  198. data/lib/pageflow/seeds.rb +1 -1
  199. data/lib/pageflow/theme.rb +8 -0
  200. data/lib/pageflow/version.rb +1 -1
  201. data/lib/pageflow/widget_type.rb +13 -0
  202. data/lib/pageflow/zencoder_video_output_definition.rb +16 -16
  203. data/lib/tasks/pageflow_tasks.rake +14 -0
  204. data/spec/factories/entries.rb +4 -0
  205. data/spec/factories/revisions.rb +10 -0
  206. data/spec/factories/users.rb +6 -0
  207. data/spec/factories/video_files.rb +4 -0
  208. data/vendor/assets/javascripts/audio5.min.js +3 -0
  209. metadata +78 -15
  210. data/app/assets/javascripts/pageflow/editor/models/mixins/widget_subject.js +0 -37
  211. data/app/assets/javascripts/pageflow/editor/utils/reload_stylesheet.js +0 -9
  212. data/app/assets/stylesheets/pageflow/text_variants.scss +0 -24
  213. data/app/views/admin/accounts/_widgets_inline_help.html.erb +0 -5
  214. data/app/views/admin/memberships/_entity_account_input.html.erb +0 -5
  215. data/app/views/admin/memberships/_entity_entry_input.html.erb +0 -5
  216. data/app/views/admin/users/_quota_exhausted.html.erb +0 -1
  217. data/app/views/components/pageflow/admin/add_membership_button_if_needed.rb +0 -62
@@ -86,8 +86,12 @@ module Pageflow
86
86
  query.has_at_least_role?(:publisher)
87
87
  end
88
88
 
89
+ def create_any?
90
+ AccountPolicy::Scope.new(@user, Account).entry_creatable.any?
91
+ end
92
+
89
93
  def create?
90
- publish? && AccountPolicy::Scope.new(user, Account).entry_creatable.any?
94
+ query.has_at_least_account_role?(:publisher)
91
95
  end
92
96
 
93
97
  def duplicate?
@@ -120,7 +124,9 @@ module Pageflow
120
124
  end
121
125
 
122
126
  def update_theming_on?
123
- publish_on_account_of?
127
+ user.admin? ||
128
+ (!permissions_config.only_admins_may_update_theming &&
129
+ publish_on_account_of?)
124
130
  end
125
131
 
126
132
  def manage_account_of?
@@ -128,7 +134,9 @@ module Pageflow
128
134
  end
129
135
 
130
136
  def update_feature_configuration_on?
131
- manage_account_of?
137
+ user.admin? ||
138
+ (!permissions_config.only_admins_may_update_features &&
139
+ manage_account_of?)
132
140
  end
133
141
 
134
142
  def destroy?
@@ -98,8 +98,7 @@ module Pageflow
98
98
  end
99
99
 
100
100
  def destroy_for_account?
101
- @user.admin? ||
102
- AccountPolicy.new(@user, @membership.entity).destroy_membership_on?
101
+ AccountPolicy.new(@user, @membership.entity).destroy_membership_on?
103
102
  end
104
103
  end
105
104
  end
@@ -29,17 +29,28 @@ module Pageflow
29
29
  end
30
30
  end
31
31
 
32
+ attr_reader :user
33
+
32
34
  def initialize(user, managed_user)
33
35
  @user = user
34
36
  @managed_user = managed_user
35
37
  end
36
38
 
39
+ def create_any?
40
+ index?
41
+ end
42
+
37
43
  def create?
38
44
  index?
39
45
  end
40
46
 
41
47
  def index?
42
- @user.memberships.on_accounts.where(role: 'manager').any?
48
+ @user.admin? ||
49
+ @user.memberships.on_accounts.where(role: 'manager').any?
50
+ end
51
+
52
+ def add_account_to?
53
+ Pageflow.config.allow_multiaccount_users
43
54
  end
44
55
 
45
56
  def read?
@@ -62,6 +73,14 @@ module Pageflow
62
73
  admin?
63
74
  end
64
75
 
76
+ def see_admin_status?
77
+ if permissions_config.only_admins_may_see_admin_boolean
78
+ admin?
79
+ else
80
+ read?
81
+ end
82
+ end
83
+
65
84
  def delete_own_user?
66
85
  Pageflow.config.authorize_user_deletion.call(@managed_user) == true
67
86
  end
@@ -12,7 +12,6 @@
12
12
 
13
13
  <%= f.semantic_fields_for :default_theming do |theming| %>
14
14
  <%= f.inputs do %>
15
- <%= theming.input :theme_name, include_blank: false, collection: Pageflow.config.themes.names %>
16
15
  <%= theming.input :cname, hint: t('pageflow.admin.themings.cname_hint') %>
17
16
  <%= theming.input :additional_cnames, hint: t('pageflow.admin.themings.additional_cnames_hint') %>
18
17
  <%= theming.input :home_url, hint: t('pageflow.admin.themings.home_url_hint') %>
@@ -31,7 +30,6 @@
31
30
  <% end %>
32
31
 
33
32
  <%= f.inputs do %>
34
- <%= theming.input :home_button_enabled_by_default %>
35
33
  <%= theming.input :imprint_link_label %>
36
34
  <%= theming.input :imprint_link_url %>
37
35
  <%= theming.input :copyright_link_label %>
@@ -43,7 +41,9 @@
43
41
  <% end %>
44
42
 
45
43
  <%= f.inputs do %>
46
- <%= render('admin/accounts/widgets_inline_help') %>
44
+ <%= render('admin/accounts/theming_defaults_inline_help') %>
45
+ <%= theming.input :theme_name, include_blank: false, collection: account_config.themes.names %>
46
+ <%= theming.input :home_button_enabled_by_default %>
47
47
  <%= admin_widgets_fields(theming, account_config) %>
48
48
  <% end %>
49
49
  <% end %>
@@ -53,6 +53,6 @@
53
53
  <% end %>
54
54
 
55
55
  <script id="theme_options" type="application/json">
56
- <%= themes_options_json_seed %>
56
+ <%= themes_options_json_seed(account_config) %>
57
57
  </script>
58
58
  <% end %>
@@ -0,0 +1,5 @@
1
+ <li class="inline_help_item">
2
+ <p>
3
+ <%= t('pageflow.admin.accounts.theming_defaults_inline_help') %>
4
+ </p>
5
+ </li>
@@ -1,22 +1,17 @@
1
1
  <%= admin_form_for [:admin, parent, resource] do |f| %>
2
+ <% entity_type = resource.entity_type || params[:entity_type] %>
2
3
  <%= f.inputs do %>
3
- <%= f.input :user,
4
- collection: membership_users_collection(parent, resource),
5
- include_blank: false,
6
- input_html: { disabled: !f.object.new_record? || parent_type == :user }%>
7
- <% if params[:entity_type].to_sym == :entry %>
8
- <%= render partial: 'admin/memberships/entity_entry_input', locals: {f: f} %>
9
- <% else %>
10
- <%= render partial: 'admin/memberships/entity_account_input', locals: {f: f} %>
11
- <% end %>
12
- <%= f.hidden_field :entity_type, value: "Pageflow::#{params[:entity_type].capitalize}" %>
4
+ <%= membership_user_select(f, parent) %>
5
+ <%= membership_entity_select(f, parent, entity_type) %>
6
+ <%= f.hidden_field :entity_type, value: entity_type %>
13
7
  <% end %>
14
8
  <%= f.inputs do %>
15
- <%= render partial: 'admin/memberships/role_hint' %>
9
+ <%= render partial: 'admin/memberships/role_hint',
10
+ locals: {entity_type: entity_type
11
+ .gsub('Pageflow::', '').downcase} %>
16
12
  <%= f.input :role,
17
- collection: membership_roles_collection("Pageflow::#{params[:entity_type]
18
- .capitalize}"),
19
- include_blank: false %>
13
+ collection: membership_roles_collection(entity_type),
14
+ include_blank: false %>
20
15
  <% end %>
21
16
  <%= f.actions do %>
22
17
  <%= f.action(:submit) %>
@@ -1,2 +1,2 @@
1
- li(para(t("pageflow.admin.memberships.on_#{params[:entity_type]}.role.hint_html")),
1
+ li(para(t("pageflow.admin.memberships.on_#{entity_type}.role.hint_html")),
2
2
  class: 'side_hint')
@@ -11,11 +11,24 @@
11
11
  </ul>
12
12
  <% end %>
13
13
 
14
- <%= f.inputs "Details" do %>
15
- <% @invitation_form.available_accounts.each do |account| %>
16
- <%= quota_state_description(:users, account) %>
17
- <% end %>
14
+ <%= f.inputs do %>
15
+ <%= m.input :entity_id,
16
+ as: :searchable_select,
17
+ ajax: {
18
+ resource: Pageflow::Account,
19
+ collection_name: :member_addable
20
+ },
21
+ include_blank: false,
22
+ label: Pageflow::Membership.human_attribute_name(:account) %>
23
+
24
+ <div id="quota_state_container">
25
+ <% if @invitation_form.initial_account %>
26
+ <%= users_quota_state(@invitation_form.initial_account) %>
27
+ <% end %>
28
+ </div>
29
+ <% end %>
18
30
 
31
+ <%= f.inputs "Details", id: 'invitation_form_details' do %>
19
32
  <%= u.input :email, hint: I18n.t('pageflow.admin.users.email_invitation_hint') %>
20
33
  <%= u.input :first_name %>
21
34
  <%= u.input :last_name %>
@@ -23,11 +36,7 @@
23
36
  as: :select,
24
37
  include_blank: false,
25
38
  collection: available_locales_collection %>
26
- <%= m.input :entity_id,
27
- as: :select,
28
- collection: @invitation_form.available_accounts,
29
- include_blank: false,
30
- label: Pageflow::Membership.human_attribute_name(:account) %>
39
+
31
40
  <%= m.input :role,
32
41
  collection: membership_roles_collection('Pageflow::Account'),
33
42
  include_blank: false,
@@ -1,4 +1,4 @@
1
- <%= admin_form_for current_user, :url => me_admin_users_path, :html => {:class => 'profile'} do |form| %>
1
+ <%= admin_form_for @user, url: me_admin_users_path, html: {class: 'profile'} do |form| %>
2
2
  <%= form.inputs :first_name, :last_name %>
3
3
 
4
4
  <%= form.inputs do %>
@@ -9,7 +9,7 @@
9
9
  <% end %>
10
10
 
11
11
  <%= form.inputs do %>
12
- <%= form.input :current_password, :hint => t('pageflow.admin.users.me.change_password_hint') %>
12
+ <%= form.input :current_password, hint: t('pageflow.admin.users.me.change_password_hint') %>
13
13
  <%= form.input :password %>
14
14
  <%= form.input :password_confirmation %>
15
15
  <% end %>
@@ -0,0 +1 @@
1
+ <%= users_quota_state(@account) %>
@@ -0,0 +1,81 @@
1
+ module Pageflow
2
+ module Admin
3
+ class AddMembershipButton < ViewComponent
4
+ builder_method :add_membership_button
5
+
6
+ def build(user, parent, entity_type)
7
+ if parent.is_a?(User)
8
+ button_label = I18n.t("pageflow.admin.#{entity_type}.add")
9
+ path = new_admin_user_membership_path(
10
+ parent, entity_type: to_class_name(entity_type)
11
+ )
12
+ data_tooltip = I18n.t("pageflow.admin.#{entity_type}."\
13
+ 'none_addable_tooltip')
14
+ rel = "add_#{entity_type}_membership"
15
+ elsif parent.is_a?(Entry)
16
+ path = new_admin_entry_membership_path(
17
+ parent, entity_type: to_class_name(entity_type)
18
+ )
19
+ else
20
+ path = new_admin_account_membership_path(
21
+ parent, entity_type: to_class_name(entity_type)
22
+ )
23
+ end
24
+
25
+ unless parent.is_a?(User)
26
+ button_label = I18n.t('pageflow.admin.users.add')
27
+ data_tooltip = I18n.t('pageflow.admin.user.none_addable_tooltip')
28
+ rel = 'add_member'
29
+ end
30
+
31
+ if membership_possible_for(user, parent, entity_type)
32
+ para do
33
+ link_to(button_label, path, class: 'button', data: {rel: rel})
34
+ end
35
+ else
36
+ para(content_tag('a',
37
+ button_label,
38
+ class: 'button disabled',
39
+ data: {rel: rel}),
40
+ 'data-tooltip' => data_tooltip)
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def membership_possible_for(user, parent, entity_type)
47
+ if entity_type == 'entry'
48
+ entry_membership_possible_for_creator_and(user, parent)
49
+ else
50
+ account_membership_possible_for_creator_and(user, parent)
51
+ end
52
+ end
53
+
54
+ def entry_membership_possible_for_creator_and(user, parent)
55
+ case parent
56
+ when User
57
+ PotentialMemberships.creatable_by(user).entries_for_user(parent).any?
58
+ when Entry
59
+ PotentialMemberships.creatable_by(user).users_for_entry(parent).any?
60
+ end
61
+ end
62
+
63
+ def account_membership_possible_for_creator_and(user, parent)
64
+ case parent
65
+ when User
66
+ PotentialMemberships.creatable_by(user).accounts_for_user(parent).any?
67
+ when Account
68
+ PotentialMemberships.creatable_by(user).users_for_account(parent).any?
69
+ end
70
+ end
71
+
72
+ def to_class_name(entity_type)
73
+ if [:entry, 'entry'].include?(entity_type)
74
+ 'Pageflow::Entry'
75
+ else
76
+ 'Pageflow::Account'
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -22,9 +22,11 @@ module Pageflow
22
22
  column do |membership|
23
23
  if authorized?(:update, membership)
24
24
  link_to(I18n.t('pageflow.admin.users.edit_role'),
25
- edit_admin_entry_membership_path(entry,
26
- membership,
27
- entity_type: :entry),
25
+ edit_admin_entry_membership_path(
26
+ entry,
27
+ membership,
28
+ entity_type: 'Pageflow::Entry'
29
+ ),
28
30
  data: {
29
31
  rel: "edit_entry_membership_#{membership.role}"
30
32
  })
@@ -45,7 +47,7 @@ module Pageflow
45
47
  end
46
48
  para text_node I18n.t('pageflow.admin.resource_tabs.account_editor_hint')
47
49
  if authorized?(:add_member_to, entry)
48
- add_membership_button_if_needed(current_user, entry, 'entry')
50
+ add_membership_button(current_user, entry, 'entry')
49
51
  end
50
52
  end
51
53
  end
@@ -39,16 +39,28 @@ module Pageflow
39
39
  end
40
40
  column do |revision|
41
41
  text_node(link_to(t('pageflow.admin.entries.show'), pageflow.revision_path(revision), :class => 'show'))
42
- text_node(link_to(t('pageflow.admin.entries.restore'), restore_admin_revision_path(revision), :method => :post, :class => 'restore', :data => {:confirm => I18n.t('pageflow.admin.entries.confirm_restore')}))
42
+ if authorized?(:restore, entry)
43
+ text_node(link_to(t('pageflow.admin.entries.restore'),
44
+ restore_admin_revision_path(revision),
45
+ method: :post,
46
+ class: 'restore',
47
+ data: {
48
+ confirm: I18n.t(
49
+ 'pageflow.admin.entries.confirm_restore'
50
+ )
51
+ }))
52
+ end
43
53
  end
44
54
  end
45
55
  end
46
56
 
47
57
  para(I18n.t('pageflow.admin.entries.published_revision_legend'), :class => 'legend published')
48
58
 
49
- text_node(button_to(t('pageflow.admin.entries.snapshot'),
50
- snapshot_admin_entry_path(entry),
51
- :method => :post))
59
+ if authorized?(:snapshot, entry)
60
+ text_node(button_to(t('pageflow.admin.entries.snapshot'),
61
+ snapshot_admin_entry_path(entry),
62
+ method: :post))
63
+ end
52
64
  end
53
65
  end
54
66
  end
@@ -21,7 +21,11 @@ module Pageflow
21
21
  column do |membership|
22
22
  if authorized?(:update, membership)
23
23
  link_to(t('pageflow.admin.users.edit_role'),
24
- edit_admin_user_membership_path(user, membership, entity_type: :account),
24
+ edit_admin_user_membership_path(
25
+ user,
26
+ membership,
27
+ entity_type: 'Pageflow::Account'
28
+ ),
25
29
  data: {
26
30
  rel: "edit_account_role_#{membership.role}"
27
31
  })
@@ -39,7 +43,9 @@ module Pageflow
39
43
  end
40
44
  end
41
45
  end
42
- add_membership_button_if_needed(user, user, 'account')
46
+ if authorized?(:add_account_to, :users)
47
+ add_membership_button(current_user, user, 'account')
48
+ end
43
49
  end
44
50
  end
45
51
  end
@@ -25,7 +25,11 @@ module Pageflow
25
25
  column do |membership|
26
26
  if authorized?(:update, membership)
27
27
  link_to(t('pageflow.admin.users.edit_role'),
28
- edit_admin_user_membership_path(user, membership, entity_type: :entry),
28
+ edit_admin_user_membership_path(
29
+ user,
30
+ membership,
31
+ entity_type: 'Pageflow::Entry'
32
+ ),
29
33
  data: {
30
34
  rel: "edit_entry_role_#{membership.role}"
31
35
  })
@@ -43,7 +47,7 @@ module Pageflow
43
47
  end
44
48
  end
45
49
  end
46
- add_membership_button_if_needed(user, user, 'entry')
50
+ add_membership_button(current_user, user, 'entry')
47
51
  end
48
52
  end
49
53
  end
@@ -18,9 +18,11 @@ module Pageflow
18
18
  column do |membership|
19
19
  if authorized?(:update, membership)
20
20
  link_to(I18n.t('pageflow.admin.users.edit_role'),
21
- edit_admin_account_membership_path(membership.entity,
22
- membership,
23
- entity_type: :account),
21
+ edit_admin_account_membership_path(
22
+ account,
23
+ membership,
24
+ entity_type: 'Pageflow::Account'
25
+ ),
24
26
  data: {
25
27
  rel: "edit_account_role_#{membership.role}"
26
28
  })
@@ -29,7 +31,7 @@ module Pageflow
29
31
  column do |membership|
30
32
  if authorized?(:destroy, membership)
31
33
  link_to(I18n.t('pageflow.admin.users.delete'),
32
- admin_account_membership_path(membership.entity, membership),
34
+ admin_account_membership_path(account, membership),
33
35
  method: :delete,
34
36
  data: {
35
37
  confirm: I18n.t('active_admin.delete_confirmation'),
@@ -38,7 +40,9 @@ module Pageflow
38
40
  end
39
41
  end
40
42
  end
41
- add_membership_button_if_needed(current_user, account, 'account')
43
+ if authorized?(:add_member_to, account)
44
+ add_membership_button(current_user, account, 'account')
45
+ end
42
46
  end
43
47
  end
44
48
  end
@@ -7,7 +7,8 @@
7
7
  window.PAGEFLOW_EDITOR = <%= @editor_scope ? 'true' : 'false' %>;
8
8
  </script>
9
9
 
10
- <%= javascript_include_tag "pageflow/application", "data-turbolinks-track" => true %>
10
+ <%= javascript_include_tag 'pageflow/vendor', 'data-turbolinks-track' => true %>
11
+ <%= javascript_include_tag 'pageflow/application', 'data-turbolinks-track' => true %>
11
12
 
12
13
  <%= csrf_meta_tags %>
13
14
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1" />
@@ -0,0 +1 @@
1
+ <p>Replace by creating <code>app/views/pageflow/admin/users/_quota_exhausted.html.erb</code></p>
@@ -0,0 +1,7 @@
1
+ <%= content_tag(:div, class: 'quota_state', data: data_attributes) do %>
2
+ <% if quota.exhausted? %>
3
+ <%= render 'pageflow/admin/users/quota_exhausted', account: account %>
4
+ <% else %>
5
+ <%= quota_state_description(:users, account) %>
6
+ <% end %>
7
+ <% end %>
@@ -17,3 +17,5 @@ end
17
17
  json.default_author_meta_tag Pageflow.config.default_author_meta_tag
18
18
  json.default_publisher_meta_tag Pageflow.config.default_publisher_meta_tag
19
19
  json.default_keywords_meta_tag Pageflow.config.default_keywords_meta_tag
20
+ json.themes(Pageflow.config.themes, :name, :preview_image_path)
21
+ json.edit_lock_polling_interval_in_seconds Pageflow.config.edit_lock_polling_interval
@@ -12,6 +12,7 @@ json.configuration do
12
12
  :title, :locale, :summary, :credits, :author, :publisher, :keywords,
13
13
  :manual_start, :emphasize_chapter_beginning, :emphasize_new_pages,
14
14
  :share_url, :share_image_id, :share_image_x, :share_image_y)
15
+ json.theme_name entry.theme.name
15
16
  json.home_url entry.home_button.url_value
16
17
  json.home_button_enabled entry.home_button.enabled_value
17
18
  json.overview_button_enabled entry.overview_button.enabled_value
@@ -6,6 +6,7 @@
6
6
  "storylines": <%= @entry.storylines.to_json.html_safe %>,
7
7
  "chapters": <%= @entry.chapters.to_json.html_safe %>,
8
8
  "pages": <%= @entry.pages.to_json.html_safe %>,
9
+ "widgets": <%= widgets_json_seeds(@entry) %>,
9
10
 
10
11
  "files": <%= files_json_seeds(@entry) %>,
11
12
 
@@ -13,6 +14,7 @@
13
14
  "theming": <%= render_json_seed(@entry.theming) %>,
14
15
  "widget_types": <%= widget_types_json_seeds(@entry_config) %>,
15
16
  "page_types": <%= page_type_json_seeds(@entry_config) %>,
17
+ "themes": <%= theme_json_seeds(@entry_config) %>,
16
18
 
17
19
  "common": <%= common_entry_seed(@entry).to_json.html_safe %>
18
- }
20
+ }
@@ -1,3 +1,3 @@
1
- json.(image_file, :width, :height, :panorama_url)
1
+ json.(image_file, :width, :height, :panorama_url, :panorama_mask_url)
2
2
 
3
3
  json.dimensions(file_dimensions(image_file))
@@ -1,8 +1 @@
1
1
  json.pretty_url pretty_theming_url(theming)
2
- json.home_button theming.theme.has_home_button?
3
- json.overview_button theming.theme.has_overview_button?
4
- json.page_change_by_scrolling theming.theme.page_change_by_scrolling?
5
- json.hide_text_on_swipe theming.theme.hide_text_on_swipe?
6
- json.emphasized_pages theming.theme.supports_emphasized_pages?
7
- json.scroll_indicator_modes theming.theme.supports_scroll_indicator_modes?
8
- json.change_to_parent_page_at_storyline_boundary theming.theme.change_to_parent_page_at_storyline_boundary?
@@ -1,2 +1,2 @@
1
1
  json.id(widget.role)
2
- json.(widget, :type_name)
2
+ json.(widget, :type_name, :role, :configuration)
@@ -1,18 +1,18 @@
1
1
  <%= content_tag(:div,
2
- :id => 'outer_wrapper',
3
- :data => {:theme => entry.theming.theme.name},
4
- :class => entry_css_class(entry)) do %>
2
+ id: 'outer_wrapper',
3
+ data: {theme: entry.theme.name},
4
+ class: entry_css_class(entry)) do %>
5
5
 
6
6
  <%= render 'pageflow/entries/skip_links' %>
7
7
 
8
8
  <h1 class="hidden"><%= entry.title %></h1>
9
9
 
10
- <img src="<%= image_path("pageflow/themes/#{entry.theming.theme.directory_name}/logo_print.png") %>" class="print_image" alt="<%= t('pageflow.public.logo') %>">
10
+ <img src="<%= image_path("pageflow/themes/#{entry.theme.directory_name}/logo_print.png") %>" class="print_image" alt="<%= t('pageflow.public.logo') %>">
11
11
  <span class="print_only page_url"><%= request.original_url %></span>
12
12
 
13
13
  <%= content_tag :div, :id => 'content', :class => 'entry', :data => {:role => 'slideshow'} do %>
14
14
  <%= render entry.pages, entry: entry %>
15
- <%= render 'pageflow/entries/indicators', :theme => entry.theming.theme %>
15
+ <%= render 'pageflow/entries/indicators', :theme => entry.theme %>
16
16
  <% end %>
17
17
 
18
18
  <%= render 'pageflow/entries/header', :entry => entry %>
@@ -42,7 +42,7 @@
42
42
 
43
43
  <% I18n.with_locale(@entry.locale) do %>
44
44
  <%= page_type_templates(@entry) %>
45
- <%= render('pageflow/editor/entries/indicators_seed', theme: @entry.theming.theme) %>
45
+ <%= render('pageflow/editor/entries/indicators_seed', theme: @entry.theme) %>
46
46
  <% end %>
47
47
 
48
48
  <%= render('pageflow/editor/entries/help_entries_seed', config: @entry_config) %>
@@ -9,7 +9,7 @@
9
9
  <%= social_share_meta_tags_for(@entry.share_target) %>
10
10
  <%= render_widget_head_fragments(@entry) %>
11
11
 
12
- <%= tag :link, :rel => 'icon', :href => image_path("pageflow/themes/#{@entry.theming.theme.directory_name}/favicon.ico"), :type => 'image/ico' %>
12
+ <%= tag :link, :rel => 'icon', :href => image_path("pageflow/themes/#{@entry.theme.directory_name}/favicon.ico"), :type => 'image/ico' %>
13
13
  <%= meta_tags_for_entry(@entry) %>
14
14
  <% end %>
15
15
  <% end %>
@@ -5,6 +5,7 @@ json.theming entry_theming_seed(entry)
5
5
  json.storylines entry_storylines_seed(entry)
6
6
  json.chapters entry_chapters_seed(entry)
7
7
  json.pages entry_pages_seed(entry)
8
+ json.widgets entry_widgets_seed(entry)
8
9
 
9
10
  json.file_ids entry_file_ids_seed(entry)
10
11
 
@@ -0,0 +1,13 @@
1
+ json.(theme, :name)
2
+
3
+ json.preview_image_url(image_url(theme.preview_image_path))
4
+ json.preview_thumbnail_url(image_url(theme.preview_thumbnail_path))
5
+ json.stylesheet_path(stylesheet_path(theme.stylesheet_path))
6
+
7
+ json.home_button theme.has_home_button?
8
+ json.overview_button theme.has_overview_button?
9
+ json.page_change_by_scrolling theme.page_change_by_scrolling?
10
+ json.hide_text_on_swipe theme.hide_text_on_swipe?
11
+ json.emphasized_pages theme.supports_emphasized_pages?
12
+ json.scroll_indicator_modes theme.supports_scroll_indicator_modes?
13
+ json.change_to_parent_page_at_storyline_boundary theme.change_to_parent_page_at_storyline_boundary?
@@ -2,15 +2,28 @@ Pageflow.configure do |config|
2
2
  config.admin_resource_tabs.register(:entry, name: :members, component: Pageflow::Admin::MembersTab)
3
3
  config.admin_resource_tabs.register(:entry, name: :revisions, component: Pageflow::Admin::RevisionsTab)
4
4
 
5
- config.admin_resource_tabs.register(:entry,
6
- name: :features,
7
- component: Pageflow::Admin::FeaturesTab,
8
- required_account_role: :manager)
9
-
10
5
  config.admin_resource_tabs.register(:user, name: :accounts, component: Pageflow::Admin::UserAccountsTab)
11
6
  config.admin_resource_tabs.register(:user, name: :entries, component: Pageflow::Admin::UserEntriesTab)
12
7
 
13
8
  config.admin_resource_tabs.register(:theming, name: :entries, component: Pageflow::Admin::EntriesTab)
14
9
  config.admin_resource_tabs.register(:theming, name: :users, component: Pageflow::Admin::UsersTab)
15
- config.admin_resource_tabs.register(:theming, name: :features, component: Pageflow::Admin::FeaturesTab)
10
+ end
11
+
12
+ Pageflow.after_configure do |config|
13
+ features_tab_permissions =
14
+ if config.permissions.only_admins_may_update_features
15
+ {admin_only: true}
16
+ else
17
+ {required_account_role: :manager}
18
+ end
19
+
20
+ config.admin_resource_tabs.register(:entry,
21
+ name: :features,
22
+ component: Pageflow::Admin::FeaturesTab,
23
+ **features_tab_permissions)
24
+
25
+ config.admin_resource_tabs.register(:theming,
26
+ name: :features,
27
+ component: Pageflow::Admin::FeaturesTab,
28
+ **features_tab_permissions)
16
29
  end
@@ -5,4 +5,5 @@ Pageflow.configure do |config|
5
5
  config.features.register('storylines') do |feature_config|
6
6
  feature_config.help_entries.register('pageflow.help_entries.storylines', priority: 7)
7
7
  end
8
+ config.features.register('selectable_themes')
8
9
  end