pageflow 13.0.0.beta6 → 13.0.0.beta7
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 +74 -0
- data/README.md +1 -0
- data/app/assets/audios/pageflow/unmute.mp3 +0 -0
- data/app/assets/images/pageflow/editor/help/phone_horizontal_slideshow_mode.gif +0 -0
- data/app/assets/javascripts/pageflow/asset_urls.js.erb +1 -1
- data/app/assets/javascripts/pageflow/audio/multi_player.js +4 -0
- data/app/assets/javascripts/pageflow/audio_player.js +1 -1
- data/app/assets/javascripts/pageflow/background_media.js +22 -0
- data/app/assets/javascripts/pageflow/base.js +1 -0
- data/app/assets/javascripts/pageflow/browser/agent.js +92 -78
- data/app/assets/javascripts/pageflow/browser/autoplay_support.js +2 -2
- data/app/assets/javascripts/pageflow/dist/react.js +711 -252
- data/app/assets/javascripts/pageflow/editor/api/page_type.js +4 -0
- data/app/assets/javascripts/pageflow/editor/base.js +1 -0
- data/app/assets/javascripts/pageflow/editor/collections/files_collection.js +8 -0
- data/app/assets/javascripts/pageflow/editor/initializers/boot.js +6 -4
- data/app/assets/javascripts/pageflow/editor/initializers/setup_asset_urls.js +3 -0
- data/app/assets/javascripts/pageflow/editor/models/entry.js +2 -2
- data/app/assets/javascripts/pageflow/editor/models/file_stage.js +6 -1
- data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +9 -0
- data/app/assets/javascripts/pageflow/editor/models/mixins/transient_references.js +12 -2
- data/app/assets/javascripts/pageflow/editor/models/preview_entry_data.js +5 -0
- data/app/assets/javascripts/pageflow/editor/models/uploaded_file.js +6 -1
- data/app/assets/javascripts/pageflow/editor/templates/emulation_mode_button.jst.ejs +26 -0
- data/app/assets/javascripts/pageflow/editor/templates/entry_preview.jst.ejs +8 -3
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/options.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_link.js +3 -6
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/groups/page_transitions.js +14 -4
- data/app/assets/javascripts/pageflow/editor/views/edit_storyline_view.js +3 -6
- data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +47 -12
- data/app/assets/javascripts/pageflow/editor/views/emulation_mode_button_view.js +45 -0
- data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +62 -8
- data/app/assets/javascripts/pageflow/editor/views/file_stage_item_view.js +7 -0
- data/app/assets/javascripts/pageflow/editor/views/help_image_view.js +9 -0
- data/app/assets/javascripts/pageflow/editor/views/info_box_view.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/inputs/file_processing_state_display_view.js +60 -0
- data/app/assets/javascripts/pageflow/editor/views/sidebar_footer_view.js +12 -0
- data/app/assets/javascripts/pageflow/editor/views/widget_types/phone_horizontal_slideshow_mode.js +14 -0
- data/app/assets/javascripts/pageflow/entry_data.js +4 -0
- data/app/assets/javascripts/pageflow/media_player.js +7 -3
- data/app/assets/javascripts/pageflow/media_player/handle_failed_play.js +34 -0
- data/app/assets/javascripts/pageflow/media_player/volume_fading/web_audio.js +29 -3
- data/app/assets/javascripts/pageflow/page_transitions.js +59 -15
- data/app/assets/javascripts/pageflow/page_type.js +5 -1
- data/app/assets/javascripts/pageflow/seed_entry_data.js +13 -0
- data/app/assets/javascripts/pageflow/slideshow.js +31 -11
- data/app/assets/javascripts/pageflow/slideshow/atmo.js +23 -12
- data/app/assets/javascripts/pageflow/slideshow/lazy_page_widget.js +9 -3
- data/app/assets/javascripts/pageflow/slideshow/navigation_direction.js +37 -0
- data/app/assets/javascripts/pageflow/slideshow/page_widget.js +12 -6
- data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +13 -16
- data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +49 -14
- data/app/assets/javascripts/pageflow/ui/views/mixins/input_view.js +10 -3
- data/app/assets/javascripts/pageflow/video_player/lazy.js +1 -1
- data/app/assets/stylesheets/pageflow/animations/bounce.scss +13 -1
- data/app/assets/stylesheets/pageflow/editor/base.scss +5 -0
- data/app/assets/stylesheets/pageflow/editor/emulation_mode_button.scss +78 -0
- data/app/assets/stylesheets/pageflow/editor/entry_preview.scss +41 -0
- data/app/assets/stylesheets/pageflow/editor/file_stages.scss +11 -3
- data/app/assets/stylesheets/pageflow/editor/help.scss +4 -14
- data/app/assets/stylesheets/pageflow/editor/help_image.scss +5 -0
- data/app/assets/stylesheets/pageflow/editor/info_box.scss +5 -0
- data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
- data/app/assets/stylesheets/pageflow/editor/inputs/file_processing_state_display.scss +18 -0
- data/app/assets/stylesheets/pageflow/editor/sidebar_footer.scss +12 -0
- data/app/assets/stylesheets/pageflow/entries.scss +29 -6
- data/app/assets/stylesheets/pageflow/mixins/breakpoints.scss +5 -3
- data/app/assets/stylesheets/pageflow/mixins/icons/fontawesome.scss +1 -1
- data/app/assets/stylesheets/pageflow/navigation_mobile.scss +5 -1
- data/app/assets/stylesheets/pageflow/page_transitions.scss +0 -6
- data/app/assets/stylesheets/pageflow/page_transitions/crossfade.scss +5 -1
- data/app/assets/stylesheets/pageflow/page_transitions/fade.scss +44 -36
- data/app/assets/stylesheets/pageflow/page_transitions/scroll.scss +96 -11
- data/app/assets/stylesheets/pageflow/slideshow.scss +0 -4
- data/app/assets/stylesheets/pageflow/themes/default/background_media_unmute_button.scss +68 -0
- data/app/assets/stylesheets/pageflow/themes/default/base.scss +1 -0
- data/app/assets/stylesheets/pageflow/themes/default/indicators/icons/icon_font.scss +7 -0
- data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
- data/app/controllers/pageflow/editor/files_controller.rb +9 -1
- data/app/helpers/pageflow/asset_urls_helper.rb +9 -0
- data/app/helpers/pageflow/background_image_helper.rb +6 -10
- data/app/helpers/pageflow/file_background_images_helper.rb +78 -0
- data/app/helpers/pageflow/pages_helper.rb +2 -2
- data/app/helpers/pageflow/render_json_helper.rb +3 -2
- data/app/models/concerns/pageflow/hosted_file.rb +2 -9
- data/app/models/concerns/pageflow/uploaded_file.rb +9 -0
- data/app/models/pageflow/draft_entry.rb +2 -2
- data/app/models/pageflow/image_file.rb +5 -20
- data/app/models/pageflow/image_file_css_background_image_urls.rb +17 -0
- data/app/models/pageflow/video_file_css_background_image_urls.rb +13 -0
- data/app/views/pageflow/editor/asset_urls/_asset_urls.json.jbuilder +4 -0
- data/app/views/pageflow/editor/entries/seed.json.erb +3 -1
- data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +1 -1
- data/app/views/pageflow/entries/_indicators.html.erb +8 -3
- data/app/views/pageflow/entries/edit.html.erb +1 -1
- data/app/views/pageflow/entries/show.css.erb +6 -20
- data/app/views/pageflow/file_background_images/_rule.css.erb +3 -0
- data/config/initializers/features.rb +1 -0
- data/config/locales/de.yml +20 -8
- data/config/locales/en.yml +23 -11
- data/config/routes.rb +1 -0
- data/lib/pageflow/built_in_file_type.rb +4 -0
- data/lib/pageflow/built_in_widget_type.rb +12 -0
- data/lib/pageflow/built_in_widget_types_plugin.rb +5 -0
- data/lib/pageflow/file_type.rb +39 -0
- data/lib/pageflow/file_types.rb +6 -0
- data/lib/pageflow/version.rb +1 -1
- data/spec/factories/hosted_files.rb +12 -8
- data/vendor/assets/javascripts/audio5.min.js +280 -129
- data/vendor/assets/javascripts/iscroll.js +16 -11
- metadata +47 -16
- data/app/assets/javascripts/pageflow/media_player/catch_play_promise.js +0 -23
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_in.scss +0 -66
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_in_right.scss +0 -68
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_left.scss +0 -20
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_over_from_left.scss +0 -12
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_over_from_right.scss +0 -12
- data/app/assets/stylesheets/pageflow/page_transitions/scroll_right.scss +0 -20
- data/lib/pageflow/images/palette.png +0 -0
@@ -1,20 +1,105 @@
|
|
1
1
|
/* scroll transition to left*/
|
2
2
|
|
3
3
|
section.scroll {
|
4
|
-
|
5
|
-
|
4
|
+
@include animation-duration(1s);
|
5
|
+
@include animation-fill-mode(forwards);
|
6
|
+
|
7
|
+
&-fast {
|
8
|
+
@include animation-duration(0.5s);
|
6
9
|
}
|
7
10
|
|
8
|
-
|
9
|
-
|
11
|
+
&-in {
|
12
|
+
&.animate-in-forwards,
|
13
|
+
&.animate-in-backwards {
|
14
|
+
z-index: 2;
|
15
|
+
}
|
10
16
|
}
|
11
|
-
|
12
|
-
|
17
|
+
|
18
|
+
&-over {
|
19
|
+
&.animate-in-forwards,
|
20
|
+
&.animate-out-backwards {
|
21
|
+
z-index: 2;
|
22
|
+
}
|
13
23
|
}
|
14
|
-
|
15
|
-
|
24
|
+
|
25
|
+
&-from_right {
|
26
|
+
&.animate-in-forwards {
|
27
|
+
@include animation-name(scroll-in-right);
|
28
|
+
}
|
29
|
+
|
30
|
+
&.animate-out-backwards {
|
31
|
+
@include animation-name(scroll-out-right);
|
32
|
+
}
|
33
|
+
|
34
|
+
&.scroll-in {
|
35
|
+
&.animate-in-backwards {
|
36
|
+
@include animation-name(scroll-in-left);
|
37
|
+
}
|
38
|
+
|
39
|
+
&.animate-out-forwards {
|
40
|
+
@include animation-name(scroll-out-left);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
&-from_left {
|
46
|
+
&.animate-in-forwards {
|
47
|
+
@include animation-name(scroll-in-left);
|
48
|
+
}
|
49
|
+
|
50
|
+
&.animate-out-backwards {
|
51
|
+
@include animation-name(scroll-out-left);
|
52
|
+
}
|
53
|
+
|
54
|
+
&.scroll-in {
|
55
|
+
&.animate-in-backwards {
|
56
|
+
@include animation-name(scroll-in-right);
|
57
|
+
}
|
58
|
+
|
59
|
+
&.animate-out-forwards {
|
60
|
+
@include animation-name(scroll-out-right);
|
61
|
+
}
|
62
|
+
}
|
16
63
|
}
|
17
|
-
|
18
|
-
|
64
|
+
|
65
|
+
|
66
|
+
&-from_bottom {
|
67
|
+
&.animate-in-forwards {
|
68
|
+
@include animation-name(scroll-in-forwards);
|
69
|
+
}
|
70
|
+
|
71
|
+
&.animate-out-backwards {
|
72
|
+
@include animation-name(scroll-out-backwards);
|
73
|
+
}
|
74
|
+
|
75
|
+
&.scroll-in {
|
76
|
+
&.animate-in-backwards {
|
77
|
+
@include animation-name(scroll-in-backwards);
|
78
|
+
}
|
79
|
+
|
80
|
+
&.animate-out-forwards {
|
81
|
+
@include animation-name(scroll-out-forwards);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
&-from_top {
|
87
|
+
&.animate-in-forwards {
|
88
|
+
@include animation-name(scroll-in-backwards);
|
89
|
+
}
|
90
|
+
|
91
|
+
&.animate-out-backwards {
|
92
|
+
@include animation-name(scroll-out-forwards);
|
93
|
+
}
|
94
|
+
|
95
|
+
&.scroll-in {
|
96
|
+
&.animate-in-backwards {
|
97
|
+
@include animation-name(scroll-in-forwards);
|
98
|
+
}
|
99
|
+
|
100
|
+
&.animate-out-forwards {
|
101
|
+
@include animation-name(scroll-out-backwards);
|
102
|
+
}
|
103
|
+
}
|
19
104
|
}
|
20
|
-
}
|
105
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
$background-media-unmute-button-color: rgba(53, 53, 53, 0.9);
|
2
|
+
|
3
|
+
$background-media-unmute-button-shadow-color: #ccc;
|
4
|
+
|
5
|
+
$background-media-unmute-button-icon-color: #ddd;
|
6
|
+
|
7
|
+
$background-media-unmute-button-icon-size: 24px;
|
8
|
+
|
9
|
+
$background-media-unmute-button-size: 34px;
|
10
|
+
|
11
|
+
$background-media-unmute-button-margin: 10px;
|
12
|
+
|
13
|
+
.background_media_unmute_button {
|
14
|
+
position: absolute;
|
15
|
+
top: 26px;
|
16
|
+
right: 25px;
|
17
|
+
width: $background-media-unmute-button-size + $background-media-unmute-button-margin;
|
18
|
+
height: $background-media-unmute-button-size + $background-media-unmute-button-margin;
|
19
|
+
|
20
|
+
@extend %pageflow_widget_margin_right_max !optional;
|
21
|
+
@extend %pageflow_widget_margin_top !optional;
|
22
|
+
|
23
|
+
@include mobile {
|
24
|
+
top: 70px;
|
25
|
+
right: 11px;
|
26
|
+
}
|
27
|
+
|
28
|
+
&:before {
|
29
|
+
z-index: 2;
|
30
|
+
}
|
31
|
+
|
32
|
+
&:after {
|
33
|
+
content: "";
|
34
|
+
display: block;
|
35
|
+
position: absolute;
|
36
|
+
top: 6px;
|
37
|
+
left: 6px;
|
38
|
+
width: $background-media-unmute-button-size;
|
39
|
+
height: $background-media-unmute-button-size;
|
40
|
+
border-radius: $background-media-unmute-button-size / 2;
|
41
|
+
background-color: $background-media-unmute-button-color;
|
42
|
+
@include box-shadow(0 0 7px $background-media-unmute-button-shadow-color);
|
43
|
+
z-index: 1;
|
44
|
+
}
|
45
|
+
|
46
|
+
a {
|
47
|
+
display: block;
|
48
|
+
width: 100%;
|
49
|
+
height: 100%;
|
50
|
+
z-index: 2;
|
51
|
+
position: relative;
|
52
|
+
@include background-icon-center($color: $background-media-unmute-button-icon-color,
|
53
|
+
$font-size: $background-media-unmute-button-icon-size);
|
54
|
+
@include fa-volume-down-icon;
|
55
|
+
|
56
|
+
&:after {
|
57
|
+
content: "";
|
58
|
+
display: block;
|
59
|
+
position: absolute;
|
60
|
+
width: 25px;
|
61
|
+
left: 22px;
|
62
|
+
top: 22px;
|
63
|
+
border-top: solid 2px $background-media-unmute-button-icon-color;
|
64
|
+
border-bottom: solid 1px $background-media-unmute-button-color;
|
65
|
+
@include transform(translate(-50%, -50%) rotate(45deg));
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
@@ -12,6 +12,7 @@
|
|
12
12
|
font-weight: bold;
|
13
13
|
vertical-align: middle;
|
14
14
|
padding-left: 15px;
|
15
|
+
height: 33px;
|
15
16
|
|
16
17
|
@include phone {
|
17
18
|
padding-left: 10px;
|
@@ -22,5 +23,11 @@
|
|
22
23
|
> .scroll_next_indicator {
|
23
24
|
@include fa-angle-down-icon($position: "after");
|
24
25
|
}
|
26
|
+
|
27
|
+
.widget_phone_horizontal_slideshow_mode_present & > .scroll_next_indicator {
|
28
|
+
@include phone {
|
29
|
+
@include fa-angle-right-icon($position: "after");
|
30
|
+
}
|
31
|
+
}
|
25
32
|
}
|
26
33
|
}
|
@@ -19,10 +19,13 @@ module Pageflow
|
|
19
19
|
authorize!(:edit, entry.to_model)
|
20
20
|
verify_edit_lock!(entry)
|
21
21
|
|
22
|
-
@file = entry.create_file(file_type.model, create_params)
|
22
|
+
@file = entry.create_file!(file_type.model, create_params)
|
23
23
|
@file.publish!
|
24
24
|
|
25
25
|
respond_with(:editor, @file)
|
26
|
+
rescue ActiveRecord::RecordInvalid => e
|
27
|
+
debug_log_with_backtrace(e)
|
28
|
+
head :unprocessable_entity
|
26
29
|
end
|
27
30
|
|
28
31
|
def reuse
|
@@ -81,6 +84,7 @@ module Pageflow
|
|
81
84
|
file_attachment_params
|
82
85
|
.merge(file_configuration_params)
|
83
86
|
.merge(file_parent_file_params)
|
87
|
+
.merge(file_custom_params)
|
84
88
|
end
|
85
89
|
|
86
90
|
def file_reuse_params
|
@@ -109,6 +113,10 @@ module Pageflow
|
|
109
113
|
file_params.permit(:parent_file_id, :parent_file_model_type)
|
110
114
|
end
|
111
115
|
|
116
|
+
def file_custom_params
|
117
|
+
file_params.permit(file_type.custom_attributes)
|
118
|
+
end
|
119
|
+
|
112
120
|
def file_params
|
113
121
|
params.require(file_type.param_key)
|
114
122
|
end
|
@@ -22,11 +22,6 @@ module Pageflow
|
|
22
22
|
end
|
23
23
|
|
24
24
|
class Div
|
25
|
-
FILE_TYPE_CSS_CLASS_PREFIXES = {
|
26
|
-
'image_file' => 'image',
|
27
|
-
'video_file' => 'video_poster',
|
28
|
-
}
|
29
|
-
|
30
25
|
attr_reader :configuration, :property_base_name, :options
|
31
26
|
|
32
27
|
delegate :content_tag, :to => :@template
|
@@ -67,13 +62,18 @@ module Pageflow
|
|
67
62
|
end
|
68
63
|
|
69
64
|
def image_css_class_prefix
|
70
|
-
|
65
|
+
file_type.css_background_image_class_prefix
|
71
66
|
end
|
72
67
|
|
73
68
|
def background_position(coord)
|
74
69
|
property_name = "#{property_base_name}_#{coord}"
|
75
70
|
configuration.key?(property_name) ? "#{configuration[property_name]}%" : "50%"
|
76
71
|
end
|
72
|
+
|
73
|
+
def file_type
|
74
|
+
collection_name = options.fetch(:file_type, 'image_file').pluralize
|
75
|
+
Pageflow.config.file_types.find_by_collection_name!(collection_name)
|
76
|
+
end
|
77
77
|
end
|
78
78
|
|
79
79
|
class DivWithSizeAttributes < Div
|
@@ -111,10 +111,6 @@ module Pageflow
|
|
111
111
|
def find_file
|
112
112
|
file_type.model.find_by_id(file_id)
|
113
113
|
end
|
114
|
-
|
115
|
-
def file_type
|
116
|
-
Pageflow.config.file_types.find_by_collection_name!(options.fetch(:file_type, 'image_file').pluralize)
|
117
|
-
end
|
118
114
|
end
|
119
115
|
end
|
120
116
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Pageflow
|
2
|
+
# @api private
|
3
|
+
module FileBackgroundImagesHelper
|
4
|
+
include BackgroundImageHelper
|
5
|
+
|
6
|
+
ALLOWED_BREAKPOINTS = [:mobile, :desktop].freeze
|
7
|
+
|
8
|
+
def file_background_images_css(entry, breakpoint_name)
|
9
|
+
render(partial: 'pageflow/file_background_images/rule',
|
10
|
+
collection: Rules.new(Pageflow.config.file_types.with_css_background_image_support,
|
11
|
+
entry,
|
12
|
+
breakpoint_name).to_a)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
class Rules
|
17
|
+
def initialize(file_types, entry, breakpoint_name)
|
18
|
+
@file_types = file_types
|
19
|
+
@entry = entry
|
20
|
+
@breakpoint_name = breakpoint_name
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_a
|
24
|
+
file_types.flat_map do |file_type|
|
25
|
+
rules_for_file_type(file_type)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :entry, :file_types, :breakpoint_name
|
32
|
+
|
33
|
+
def rules_for_file_type(file_type)
|
34
|
+
entry.find_files(file_type.model).flat_map do |file|
|
35
|
+
exclude_rules_with_blank_url(rules_for_file(file_type, file))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def rules_for_file(file_type, file)
|
40
|
+
file_type.css_background_image_urls.call(file).map do |name, url|
|
41
|
+
{
|
42
|
+
prefix: rule_prefix(file_type, name),
|
43
|
+
file: file,
|
44
|
+
url: url_for_breakpoint(file_type, url)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def url_for_breakpoint(file_type, url)
|
50
|
+
if url.is_a?(Hash)
|
51
|
+
unknown_breakpoint_names = url.keys - ALLOWED_BREAKPOINTS
|
52
|
+
|
53
|
+
if unknown_breakpoint_names.any?
|
54
|
+
raise("Unknown breakpoints #{unknown_breakpoint_names.join(', ')} used in " \
|
55
|
+
"css_background_image_urls of file type #{file_type.collection_name}.")
|
56
|
+
end
|
57
|
+
|
58
|
+
url[breakpoint_name]
|
59
|
+
else
|
60
|
+
url
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def rule_prefix(file_type, name)
|
65
|
+
[
|
66
|
+
file_type.css_background_image_class_prefix,
|
67
|
+
name == :default ? nil : name
|
68
|
+
].compact.join('_')
|
69
|
+
end
|
70
|
+
|
71
|
+
def exclude_rules_with_blank_url(rules)
|
72
|
+
rules.reject do |rule|
|
73
|
+
rule[:url].blank?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -23,10 +23,11 @@ module Pageflow
|
|
23
23
|
|
24
24
|
ESCAPED_CHARS = {
|
25
25
|
"\u2028" => '\u2028',
|
26
|
-
"\u2029" => '\u2029'
|
26
|
+
"\u2029" => '\u2029',
|
27
|
+
'</' => '<\/'
|
27
28
|
}
|
28
29
|
|
29
|
-
ESCAPED_CHARS_REGEX =
|
30
|
+
ESCAPED_CHARS_REGEX = %r{</|[\u2028\u2029]}u
|
30
31
|
|
31
32
|
def sanitize_json(json)
|
32
33
|
json.gsub(ESCAPED_CHARS_REGEX, ESCAPED_CHARS)
|
@@ -7,6 +7,8 @@ module Pageflow
|
|
7
7
|
has_attached_file(:attachment_on_filesystem, Pageflow.config.paperclip_filesystem_default_options)
|
8
8
|
has_attached_file(:attachment_on_s3, Pageflow.config.paperclip_s3_default_options)
|
9
9
|
|
10
|
+
validates :attachment, presence: true
|
11
|
+
|
10
12
|
do_not_validate_attachment_file_type(:attachment_on_filesystem)
|
11
13
|
do_not_validate_attachment_file_type(:attachment_on_s3)
|
12
14
|
|
@@ -71,15 +73,6 @@ module Pageflow
|
|
71
73
|
url
|
72
74
|
end
|
73
75
|
|
74
|
-
def cache_key
|
75
|
-
# Ensure the cache key changes when the state changes. There are
|
76
|
-
# cases during processing where the state is updated multiple
|
77
|
-
# times in a single second. Since `cache_key` relies on
|
78
|
-
# `updated_at`, which only is acurate to the second, we need to
|
79
|
-
# prevent caching outdated information.
|
80
|
-
"#{super}-#{state}"
|
81
|
-
end
|
82
|
-
|
83
76
|
# @deprecated Write a migration instead
|
84
77
|
def self.columns(t)
|
85
78
|
t.belongs_to(:entry, index: true)
|