pageflow 12.1.0 → 12.2.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +90 -171
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +22 -2
  5. data/admins/pageflow/entry.rb +3 -1
  6. data/admins/pageflow/user.rb +9 -3
  7. data/app/assets/javascripts/pageflow/browser/agent.js +20 -9
  8. data/app/assets/javascripts/pageflow/browser/autoplay_support.js +3 -2
  9. data/app/assets/javascripts/pageflow/dist/react.js +6000 -4941
  10. data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +0 -1
  11. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +0 -5
  12. data/app/assets/javascripts/pageflow/links.js +0 -7
  13. data/app/assets/javascripts/pageflow/ready.js +2 -0
  14. data/app/assets/javascripts/pageflow/slideshow.js +1 -0
  15. data/app/assets/javascripts/pageflow/slideshow/hide_text_on_swipe.js +10 -5
  16. data/app/assets/javascripts/pageflow/slideshow/page_split_layout.js +74 -0
  17. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +25 -1
  18. data/app/assets/javascripts/pageflow/slideshow/swipe_gesture.js +5 -3
  19. data/app/assets/javascripts/pageflow/ui.js +1 -0
  20. data/app/assets/javascripts/pageflow/ui/templates/inputs/text_area_input.jst.ejs +1 -1
  21. data/app/assets/javascripts/pageflow/ui/templates/inputs/text_input.jst.ejs +1 -1
  22. data/app/assets/javascripts/pageflow/ui/views/inputs/color_input_view.js +105 -0
  23. data/app/assets/javascripts/pageflow/visited.js +62 -34
  24. data/app/assets/javascripts/pageflow/widgets/overview.js +18 -5
  25. data/app/assets/stylesheets/pageflow/base.scss +0 -1
  26. data/app/assets/stylesheets/pageflow/entries.scss +11 -3
  27. data/app/assets/stylesheets/pageflow/mixins.scss +1 -0
  28. data/app/assets/stylesheets/pageflow/mixins/layout_direction.scss +72 -0
  29. data/app/assets/stylesheets/pageflow/mixins/shadow.scss +20 -0
  30. data/app/assets/stylesheets/pageflow/navigation_bar.scss +8 -2
  31. data/app/assets/stylesheets/pageflow/navigation_mobile.scss +1 -2
  32. data/app/assets/stylesheets/pageflow/overview.scss +10 -11
  33. data/app/assets/stylesheets/pageflow/page.scss +3 -37
  34. data/app/assets/stylesheets/pageflow/page_transitions/fade.scss +7 -3
  35. data/app/assets/stylesheets/pageflow/page_transitions/fade_to_black.scss +1 -10
  36. data/app/assets/stylesheets/pageflow/slideshow.scss +1 -2
  37. data/app/assets/stylesheets/pageflow/themes/default/anchors.scss +5 -0
  38. data/app/assets/stylesheets/pageflow/themes/default/base.scss +1 -0
  39. data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.scss +9 -3
  40. data/app/assets/stylesheets/pageflow/themes/default/logo.scss +9 -3
  41. data/app/assets/stylesheets/pageflow/themes/default/logo/alignment.scss +2 -2
  42. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +52 -5
  43. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +6 -3
  44. data/app/assets/stylesheets/pageflow/{multimedia_alert.scss → themes/default/multimedia_alert.scss} +32 -11
  45. data/app/assets/stylesheets/pageflow/themes/default/overview.scss +7 -3
  46. data/app/assets/stylesheets/pageflow/themes/default/overview/icons/icon_font.scss +20 -4
  47. data/app/assets/stylesheets/pageflow/themes/default/page.scss +20 -53
  48. data/app/assets/stylesheets/pageflow/themes/default/page/line_lengths.scss +3 -8
  49. data/app/assets/stylesheets/pageflow/themes/default/page/paddings.scss +72 -0
  50. data/app/assets/stylesheets/pageflow/themes/default/page/scroller.scss +3 -0
  51. data/app/assets/stylesheets/pageflow/themes/default/page/shadow.scss +27 -0
  52. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/control_bar.scss +1 -0
  53. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/container.scss +1 -1
  54. data/app/assets/stylesheets/pageflow/ui.scss +2 -0
  55. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +25 -0
  56. data/app/controllers/pageflow/application_controller.rb +17 -3
  57. data/app/helpers/pageflow/overview_helper.rb +11 -0
  58. data/app/helpers/pageflow/text_direction_helper.rb +7 -0
  59. data/app/policies/pageflow/user_policy.rb +20 -0
  60. data/app/views/admin/accounts/_account_details.html.arb +5 -3
  61. data/app/views/admin/accounts/_theming_details.html.arb +5 -3
  62. data/app/views/admin/entries/_attributes_table.html.arb +3 -1
  63. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +88 -0
  64. data/app/views/layouts/pageflow/application.html.erb +1 -1
  65. data/app/views/pageflow/entries/edit.html.erb +1 -1
  66. data/app/views/pageflow/entries/overview/_page.html.erb +3 -1
  67. data/app/views/pageflow/entries/show.html.erb +2 -1
  68. data/config/initializers/admin_attributes_table_rows.rb +3 -0
  69. data/config/locales/de.yml +1 -1
  70. data/lib/pageflow.rb +4 -2
  71. data/lib/pageflow/ability_mixin.rb +8 -0
  72. data/lib/pageflow/admin/attributes_table_rows.rb +47 -0
  73. data/lib/pageflow/configuration.rb +27 -3
  74. data/lib/pageflow/engine.rb +1 -0
  75. data/lib/pageflow/news_item_api.rb +18 -0
  76. data/lib/pageflow/version.rb +1 -1
  77. data/spec/factories/accounts.rb +7 -2
  78. data/spec/factories/entries.rb +7 -2
  79. data/vendor/assets/javascripts/iscroll.js +49 -34
  80. metadata +53 -12
@@ -37,9 +37,8 @@ $page-content-width: 60% !default;
37
37
  width: 100%;
38
38
  }
39
39
 
40
- // see pageflow/page.scss
41
- $page-padding-left: 8%;
42
- $page-padding-right: 14%;
40
+ $page-padding-left: $page-scroller-padding-left;
41
+ $page-padding-right: $page-scroller-padding-right;
43
42
  $page-content-wrapper-width: 100% - $page-padding-left - $page-padding-right;
44
43
 
45
44
  // On pages that support split layout (i.e. some kind of
@@ -82,17 +81,13 @@ $page-content-width: 60% !default;
82
81
  }
83
82
 
84
83
  &.text_position_right {
85
- .contentText > * {
86
- margin-left: auto;
87
- }
88
-
89
84
  h1,
90
85
  h2 .subtitle,
91
86
  h2 .title,
92
87
  h2 .tagline,
93
88
  h3,
94
89
  p {
95
- margin-left: auto;
90
+ @include margin-start(auto);
96
91
  max-width: $page-content-position-right-max-width;
97
92
  width: 60%;
98
93
 
@@ -0,0 +1,72 @@
1
+ ////
2
+ /// @group page-typography
3
+ ////
4
+
5
+ /// Space around page text inside scroller.
6
+ $page-scroller-padding-top: 15% !default;
7
+
8
+ /// Space around page text inside scroller.
9
+ $page-scroller-mobile-padding-top: 25% !default;
10
+
11
+ /// Space around page text inside scroller.
12
+ $page-scroller-mobile-landscape-padding-top: 10% !default;
13
+
14
+ /// Space around page text inside scroller.
15
+ $page-scroller-padding-bottom: 5% !default;
16
+
17
+ /// Space around page text inside scroller.
18
+ $page-scroller-padding-left: 8% !default;
19
+
20
+ /// Space around page text inside scroller.
21
+ $page-scroller-padding-right: 8% !default;
22
+
23
+ /// Space around page text inside scroller.
24
+ $page-scroller-mobile-padding-right: 8% !default;
25
+
26
+ /// Space for logo on first page.
27
+ $page-scroller-first-page-padding-top: null !default;
28
+
29
+ /// Space for logo on first page in mobile layout.
30
+ $page-scroller-first-page-mobile-padding-top: 110px !default;
31
+
32
+ /// Space for logo on first page in mobile landscape layout.
33
+ $page-scroller-first-page-mobile-landscape-padding-top: 100px !default;
34
+
35
+ /// Space for logo on first page in phone layout.
36
+ $page-scroller-first-page-phone-padding-top: null !default;
37
+
38
+ .page {
39
+ .scroller > div {
40
+ padding: $page-scroller-padding-top
41
+ $page-scroller-padding-right
42
+ $page-scroller-padding-bottom
43
+ $page-scroller-padding-left;
44
+
45
+ @include mobile {
46
+ padding-top: $page-scroller-mobile-padding-top;
47
+ padding-right: $page-scroller-mobile-padding-right;
48
+
49
+ @media (orientation: landscape) {
50
+ padding-top: $page-scroller-mobile-landscape-padding-top;
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ .page:first-child {
57
+ .scroller > div {
58
+ padding-top: $page-scroller-first-page-padding-top;
59
+
60
+ @include mobile {
61
+ padding-top: $page-scroller-first-page-mobile-padding-top;
62
+
63
+ @media (orientation: landscape) {
64
+ padding-top: $page-scroller-first-page-mobile-landscape-padding-top;
65
+ }
66
+ }
67
+
68
+ @include phone {
69
+ padding-top: $page-scroller-first-page-phone-padding-top;
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,3 @@
1
+ .page .scroller {
2
+ @extend %pageflow_widget_margin_right !optional;
3
+ }
@@ -0,0 +1,27 @@
1
+ /// Color of the gradient
2
+ /// @group page-colors
3
+ $page-shadow-color: #000 !default;
4
+
5
+ /// Color of the gradient on inverted pages
6
+ /// @group page-colors
7
+ $page-shadow-inverted-color: #fff !default;
8
+
9
+ .page {
10
+ .shadow {
11
+ @include shadow-start($page-shadow-color);
12
+ }
13
+
14
+ &.invert {
15
+ .shadow {
16
+ @include shadow-start($page-shadow-inverted-color);
17
+ }
18
+ }
19
+
20
+ &.text_position_right .shadow {
21
+ @include shadow-end($page-shadow-color);
22
+ }
23
+
24
+ &.invert.text_position_right .shadow {
25
+ @include shadow-end($page-shadow-inverted-color);
26
+ }
27
+ }
@@ -48,6 +48,7 @@ $classic-player-controls-timestamp-position: "left" !default;
48
48
 
49
49
  %player_controls {
50
50
  &-control_bar {
51
+ direction: ltr;
51
52
  position: absolute;
52
53
  left: 50%;
53
54
  bottom: 100%;
@@ -7,7 +7,7 @@ $slim-player-controls-typography: $player-controls-typography !default;
7
7
 
8
8
  %player_controls {
9
9
  &-container,
10
- &-background {
10
+ &-background::after {
11
11
  @include transition(opacity 0.2s linear, visibility 0.2s linear);
12
12
  }
13
13
 
@@ -1,8 +1,10 @@
1
1
  @import "bourbon";
2
+ @import "jquery.minicolors";
2
3
  @import "pageflow/mixins";
3
4
 
4
5
  %pageflow-ui {
5
6
  @import "./ui/forms";
7
+ @import "./ui/input/color_input";
6
8
  @import "./ui/table_view";
7
9
  @import "./ui/table_cells/presence_table_cell";
8
10
  @import "./ui/table_cells/delete_row_table_cell";
@@ -0,0 +1,25 @@
1
+ .color_input {
2
+ .minicolors {
3
+ box-sizing: border-box;
4
+ width: 100%;
5
+ padding-right: 24px;
6
+ }
7
+
8
+ input {
9
+ padding-left: 26px;
10
+ width: 100%;
11
+ }
12
+
13
+ .minicolors-input-swatch {
14
+ top: 3px;
15
+ left: 2px;
16
+ }
17
+
18
+ &.is_default input {
19
+ color: #888;
20
+ }
21
+
22
+ .minicolors-focus input {
23
+ color: #000;
24
+ }
25
+ }
@@ -15,16 +15,19 @@ module Pageflow
15
15
 
16
16
  include EditLocking
17
17
 
18
- rescue_from ActionController::UnknownFormat do
18
+ rescue_from ActionController::UnknownFormat do |exception|
19
+ debug_log_with_backtrace(exception)
19
20
  render(status: 404, text: 'Not found')
20
21
  end
21
22
 
22
- rescue_from ActiveRecord::RecordNotFound do
23
+ rescue_from ActiveRecord::RecordNotFound do |exception|
24
+ debug_log_with_backtrace(exception)
23
25
  respond_to do |format|
24
26
  format.html do
25
27
  begin
26
28
  render file: Rails.public_path.join('pageflow', 'error_pages', '404.html'), status: :not_found
27
- rescue ActionView::MissingTemplate
29
+ rescue ActionView::MissingTemplate => exception
30
+ debug_log_with_backtrace(exception)
28
31
  head :not_found
29
32
  end
30
33
  end
@@ -33,6 +36,7 @@ module Pageflow
33
36
  end
34
37
 
35
38
  rescue_from CanCan::AccessDenied do |exception|
39
+ debug_log_with_backtrace(exception)
36
40
  respond_to do |format|
37
41
  format.html { redirect_to main_app.admin_root_path, :alert => t('pageflow.unauthorized') }
38
42
  format.any(:json, :css) { head :forbidden }
@@ -40,6 +44,7 @@ module Pageflow
40
44
  end
41
45
 
42
46
  rescue_from StateMachine::InvalidTransition do |exception|
47
+ debug_log_with_backtrace(exception)
43
48
  respond_to do |format|
44
49
  format.html { redirect_to main_app.admin_root_path, :alert => t('pageflow.invalid_transition') }
45
50
  format.json { head :bad_request }
@@ -63,5 +68,14 @@ module Pageflow
63
68
  def locale_from_accept_language_header
64
69
  http_accept_language.compatible_language_from(I18n.available_locales)
65
70
  end
71
+
72
+ def debug_log_with_backtrace(exception)
73
+ Rails.logger.debug exception
74
+ backtrace = ''
75
+ exception.backtrace.each do |line|
76
+ backtrace << line
77
+ end
78
+ Rails.logger.debug backtrace
79
+ end
66
80
  end
67
81
  end
@@ -0,0 +1,11 @@
1
+ module Pageflow
2
+ module OverviewHelper
3
+ def overview_page_description(page)
4
+ if page.configuration['description'].present?
5
+ raw(page.configuration['description'])
6
+ else
7
+ page.title
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Pageflow
2
+ module TextDirectionHelper
3
+ def text_direction(locale)
4
+ PublicI18n.text_direction(locale)
5
+ end
6
+ end
7
+ end
@@ -65,6 +65,14 @@ module Pageflow
65
65
  read?
66
66
  end
67
67
 
68
+ def suspend?
69
+ deny_sign_in?
70
+ end
71
+
72
+ def destroy?
73
+ deny_sign_in?
74
+ end
75
+
68
76
  def admin?
69
77
  @user.admin?
70
78
  end
@@ -84,5 +92,17 @@ module Pageflow
84
92
  def delete_own_user?
85
93
  Pageflow.config.authorize_user_deletion.call(@managed_user) == true
86
94
  end
95
+
96
+ private
97
+
98
+ attr_reader :managed_user
99
+
100
+ def deny_sign_in?
101
+ if Pageflow.config.allow_multiaccount_users
102
+ user.admin?
103
+ else
104
+ AccountRoleQuery.new(user, managed_user.accounts.first).has_at_least_role?(:manager)
105
+ end
106
+ end
87
107
  end
88
108
  end
@@ -1,5 +1,7 @@
1
- attributes_table_for account do
2
- row :name, :class => 'name'
3
- row :default_file_rights, :class => 'default_file_rights'
1
+ extensible_attributes_table_for(account,
2
+ Pageflow.config_for(account)
3
+ .admin_attributes_table_rows.for(:account)) do
4
+ row :name, class: 'name'
5
+ row :default_file_rights, class: 'default_file_rights'
4
6
  row :created_at
5
7
  end
@@ -1,6 +1,8 @@
1
- attributes_table_for account.default_theming do
2
- row :cname, :class => 'cname'
3
- row :theme, :class => 'theme' do
1
+ extensible_attributes_table_for(account.default_theming,
2
+ Pageflow.config_for(account)
3
+ .admin_attributes_table_rows.for(:theming)) do
4
+ row :cname, class: 'cname'
5
+ row :theme, class: 'theme' do
4
6
  account.default_theming.theme.name
5
7
  end
6
8
  row :default_author, class: 'default_author'
@@ -1,4 +1,6 @@
1
- attributes_table_for entry do
1
+ extensible_attributes_table_for(entry,
2
+ Pageflow.config_for(entry)
3
+ .admin_attributes_table_rows.for(:entry)) do
2
4
  row :title, :class => 'title'
3
5
  if authorized?(:see_own_role_on, :entries)
4
6
  row :own_role do
@@ -0,0 +1,88 @@
1
+ module Pageflow
2
+ module Admin
3
+ class ExtensibleAttributesTable < ActiveAdmin::Views::AttributesTable
4
+ module BuilderMethods
5
+ def extensible_attributes_table_for(model, additional_rows, &block)
6
+ attributes_table_for(model) do
7
+ row_inserter = RowInserter.new(self, additional_rows)
8
+ RowDelegator.new(self, row_inserter).instance_eval(&block)
9
+ row_inserter.at_end_of_table
10
+ end
11
+ end
12
+ end
13
+
14
+ class RowInserter
15
+ def initialize(context, additional_rows)
16
+ @context = context
17
+ @additional_rows = additional_rows
18
+ @rendered_rows = []
19
+ end
20
+
21
+ def row(name, options = {}, &block)
22
+ render_additional_rows(rows_at(:before, name))
23
+ context.row(name, options, &block)
24
+ render_additional_rows(rows_at(:after, name))
25
+ end
26
+
27
+ def at_end_of_table
28
+ render_additional_rows(not_yet_rendered_rows)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :context, :additional_rows, :rendered_rows
34
+
35
+ def render_additional_rows(additional_rows)
36
+ additional_rows.each do |additional_row|
37
+ block =
38
+ additional_row[:block] &&
39
+ ->(*args) { context.instance_exec(*args, &additional_row[:block]) }
40
+
41
+ context.row(additional_row[:name],
42
+ additional_row[:options],
43
+ &block)
44
+ end
45
+
46
+ rendered_rows.concat(additional_rows)
47
+ end
48
+
49
+ def rows_at(position, name)
50
+ additional_rows.select { |additional_row| additional_row[position] == name }
51
+ end
52
+
53
+ def not_yet_rendered_rows
54
+ additional_rows - rendered_rows
55
+ end
56
+ end
57
+
58
+ class RowDelegator
59
+ def initialize(context, row_handler)
60
+ @context = context
61
+ @row_handler = row_handler
62
+ end
63
+
64
+ def row(name, options = {}, &block)
65
+ @row_handler.row(name, options, &block)
66
+ end
67
+
68
+ private
69
+
70
+ def respond_to_missing?(name, _include_private = false)
71
+ @context.respond_to?(name)
72
+ end
73
+
74
+ # rubocop:disable Style/MethodMissing
75
+ # Normally we would delegate to super if context does not
76
+ # respond_to? method. But Arbre appears to report not to
77
+ # repond to helpers like authorized? even if it does.
78
+ #
79
+ # This is also the reason we can not use SimpleDelegator here
80
+ # and also delegate_missing in Rails 5 would not work.
81
+ def method_missing(method, *args, &block)
82
+ @context.public_send(method, *args, &block)
83
+ end
84
+ # rubocop:enable Style/MethodMissing
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <%= content_tag(:html, lang: I18n.locale) do %>
2
+ <%= content_tag(:html, lang: I18n.locale, dir: @page_text_direction) do %>
3
3
  <head>
4
4
  <title><%= @page_title.presence || 'Pageflow' %></title>
5
5
 
@@ -9,7 +9,7 @@
9
9
  <% end %>
10
10
 
11
11
  <main class="ui-layout-center">
12
- <div id="entry_preview"></div>
12
+ <%= content_tag(:div, '', id: 'entry_preview', dir: text_direction(@entry.locale)) %>
13
13
  <div id="main_content"></div>
14
14
  <div id="editor_indicators"></div>
15
15
  </main>
@@ -1,6 +1,8 @@
1
1
  <%= link_to "##{page.perma_id}", :class => "ov_page #{page.template}", :data => {:link => page.id} do %>
2
2
  <div class="ov_page_description">
3
- <p><%= raw(page.configuration['description']) unless page.configuration.blank? %></p>
3
+ <p>
4
+ <%= overview_page_description(page) %>
5
+ </p>
4
6
  </div>
5
7
  <%= image_tag("#{page.thumbnail_url(:thumbnail_overview_desktop)}") %>
6
8
  <div class="pictogram"></div>