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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +90 -171
- data/MIT-LICENSE +1 -1
- data/README.md +22 -2
- data/admins/pageflow/entry.rb +3 -1
- data/admins/pageflow/user.rb +9 -3
- data/app/assets/javascripts/pageflow/browser/agent.js +20 -9
- data/app/assets/javascripts/pageflow/browser/autoplay_support.js +3 -2
- data/app/assets/javascripts/pageflow/dist/react.js +6000 -4941
- data/app/assets/javascripts/pageflow/editor/initializers/setup_collections.js +0 -1
- data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +0 -5
- data/app/assets/javascripts/pageflow/links.js +0 -7
- data/app/assets/javascripts/pageflow/ready.js +2 -0
- data/app/assets/javascripts/pageflow/slideshow.js +1 -0
- data/app/assets/javascripts/pageflow/slideshow/hide_text_on_swipe.js +10 -5
- data/app/assets/javascripts/pageflow/slideshow/page_split_layout.js +74 -0
- data/app/assets/javascripts/pageflow/slideshow/page_widget.js +25 -1
- data/app/assets/javascripts/pageflow/slideshow/swipe_gesture.js +5 -3
- data/app/assets/javascripts/pageflow/ui.js +1 -0
- data/app/assets/javascripts/pageflow/ui/templates/inputs/text_area_input.jst.ejs +1 -1
- data/app/assets/javascripts/pageflow/ui/templates/inputs/text_input.jst.ejs +1 -1
- data/app/assets/javascripts/pageflow/ui/views/inputs/color_input_view.js +105 -0
- data/app/assets/javascripts/pageflow/visited.js +62 -34
- data/app/assets/javascripts/pageflow/widgets/overview.js +18 -5
- data/app/assets/stylesheets/pageflow/base.scss +0 -1
- data/app/assets/stylesheets/pageflow/entries.scss +11 -3
- data/app/assets/stylesheets/pageflow/mixins.scss +1 -0
- data/app/assets/stylesheets/pageflow/mixins/layout_direction.scss +72 -0
- data/app/assets/stylesheets/pageflow/mixins/shadow.scss +20 -0
- data/app/assets/stylesheets/pageflow/navigation_bar.scss +8 -2
- data/app/assets/stylesheets/pageflow/navigation_mobile.scss +1 -2
- data/app/assets/stylesheets/pageflow/overview.scss +10 -11
- data/app/assets/stylesheets/pageflow/page.scss +3 -37
- data/app/assets/stylesheets/pageflow/page_transitions/fade.scss +7 -3
- data/app/assets/stylesheets/pageflow/page_transitions/fade_to_black.scss +1 -10
- data/app/assets/stylesheets/pageflow/slideshow.scss +1 -2
- data/app/assets/stylesheets/pageflow/themes/default/anchors.scss +5 -0
- data/app/assets/stylesheets/pageflow/themes/default/base.scss +1 -0
- data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.scss +9 -3
- data/app/assets/stylesheets/pageflow/themes/default/logo.scss +9 -3
- data/app/assets/stylesheets/pageflow/themes/default/logo/alignment.scss +2 -2
- data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +52 -5
- data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +6 -3
- data/app/assets/stylesheets/pageflow/{multimedia_alert.scss → themes/default/multimedia_alert.scss} +32 -11
- data/app/assets/stylesheets/pageflow/themes/default/overview.scss +7 -3
- data/app/assets/stylesheets/pageflow/themes/default/overview/icons/icon_font.scss +20 -4
- data/app/assets/stylesheets/pageflow/themes/default/page.scss +20 -53
- data/app/assets/stylesheets/pageflow/themes/default/page/line_lengths.scss +3 -8
- data/app/assets/stylesheets/pageflow/themes/default/page/paddings.scss +72 -0
- data/app/assets/stylesheets/pageflow/themes/default/page/scroller.scss +3 -0
- data/app/assets/stylesheets/pageflow/themes/default/page/shadow.scss +27 -0
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/control_bar.scss +1 -0
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/container.scss +1 -1
- data/app/assets/stylesheets/pageflow/ui.scss +2 -0
- data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +25 -0
- data/app/controllers/pageflow/application_controller.rb +17 -3
- data/app/helpers/pageflow/overview_helper.rb +11 -0
- data/app/helpers/pageflow/text_direction_helper.rb +7 -0
- data/app/policies/pageflow/user_policy.rb +20 -0
- data/app/views/admin/accounts/_account_details.html.arb +5 -3
- data/app/views/admin/accounts/_theming_details.html.arb +5 -3
- data/app/views/admin/entries/_attributes_table.html.arb +3 -1
- data/app/views/components/pageflow/admin/extensible_attributes_table.rb +88 -0
- data/app/views/layouts/pageflow/application.html.erb +1 -1
- data/app/views/pageflow/entries/edit.html.erb +1 -1
- data/app/views/pageflow/entries/overview/_page.html.erb +3 -1
- data/app/views/pageflow/entries/show.html.erb +2 -1
- data/config/initializers/admin_attributes_table_rows.rb +3 -0
- data/config/locales/de.yml +1 -1
- data/lib/pageflow.rb +4 -2
- data/lib/pageflow/ability_mixin.rb +8 -0
- data/lib/pageflow/admin/attributes_table_rows.rb +47 -0
- data/lib/pageflow/configuration.rb +27 -3
- data/lib/pageflow/engine.rb +1 -0
- data/lib/pageflow/news_item_api.rb +18 -0
- data/lib/pageflow/version.rb +1 -1
- data/spec/factories/accounts.rb +7 -2
- data/spec/factories/entries.rb +7 -2
- data/vendor/assets/javascripts/iscroll.js +49 -34
- metadata +53 -12
@@ -37,9 +37,8 @@ $page-content-width: 60% !default;
|
|
37
37
|
width: 100%;
|
38
38
|
}
|
39
39
|
|
40
|
-
|
41
|
-
$page-padding-
|
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-
|
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,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
|
+
}
|
@@ -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
|
@@ -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
|
-
|
2
|
-
|
3
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
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'
|
@@ -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,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
|
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>
|