pageflow 0.5.0 → 0.6.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 +8 -8
- data/Rakefile +2 -1
- data/admins/pageflow/accounts.rb +20 -4
- data/admins/pageflow/entry.rb +4 -5
- data/app/assets/javascripts/pageflow/audio_player.js +16 -7
- data/app/assets/javascripts/pageflow/base.js +5 -0
- data/app/assets/javascripts/pageflow/built_in_widget_types.js +11 -0
- data/app/assets/javascripts/pageflow/cookies.js +43 -0
- data/app/assets/javascripts/pageflow/editor/base.js +2 -10
- data/app/assets/javascripts/pageflow/editor/collections/widgets_collection.js +16 -0
- data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +3 -2
- data/app/assets/javascripts/pageflow/editor/edit_widget.jst.ejs +2 -0
- data/app/assets/javascripts/pageflow/editor/initializers/setup_widget_types.js +3 -0
- data/app/assets/javascripts/pageflow/editor/models/configuration.js +18 -9
- data/app/assets/javascripts/pageflow/editor/models/edit_lock_container.js +1 -0
- data/app/assets/javascripts/pageflow/editor/models/entry.js +13 -3
- data/app/assets/javascripts/pageflow/editor/models/entry_configuration.js +4 -0
- data/app/assets/javascripts/pageflow/editor/models/entry_configuration_file_selection_handler.js +11 -0
- data/app/assets/javascripts/pageflow/editor/models/image_file.js +4 -0
- data/app/assets/javascripts/pageflow/editor/models/mixins/widget_subject.js +37 -0
- data/app/assets/javascripts/pageflow/editor/models/page.js +1 -1
- data/app/assets/javascripts/pageflow/editor/models/page_configuration_file_selection_handler.js +1 -25
- data/app/assets/javascripts/pageflow/editor/models/theming.js +3 -0
- data/app/assets/javascripts/pageflow/editor/models/video_file.js +7 -0
- data/app/assets/javascripts/pageflow/editor/models/widget.js +19 -0
- data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
- data/app/assets/javascripts/pageflow/editor/templates/background_positioning.jst.ejs +18 -0
- data/app/assets/javascripts/pageflow/editor/templates/background_positioning_preview.jst.ejs +2 -0
- data/app/assets/javascripts/pageflow/editor/templates/background_positioning_sliders.jst.ejs +6 -0
- data/app/assets/javascripts/pageflow/editor/templates/edit_meta_data.jst.ejs +1 -1
- data/app/assets/javascripts/pageflow/editor/templates/edit_widget.jst.ejs +2 -0
- data/app/assets/javascripts/pageflow/editor/templates/edit_widgets.jst.ejs +2 -0
- data/app/assets/javascripts/pageflow/editor/templates/entry_preview.jst.ejs +1 -3
- data/app/assets/javascripts/pageflow/editor/views/background_positioning_preview_view.js +39 -0
- data/app/assets/javascripts/pageflow/editor/views/background_positioning_sliders_view.js +94 -0
- data/app/assets/javascripts/pageflow/editor/views/background_positioning_view.js +67 -0
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +4 -3
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +9 -2
- data/app/assets/javascripts/pageflow/editor/views/edit_meta_data_view.js +18 -2
- data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +29 -0
- data/app/assets/javascripts/pageflow/editor/views/edit_widgets_view.js +20 -0
- data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +8 -3
- data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +53 -9
- data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +1 -1
- data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +11 -3
- data/app/assets/javascripts/pageflow/events.js +1 -0
- data/app/assets/javascripts/pageflow/features/hashchange_support.js +8 -0
- data/app/assets/javascripts/pageflow/history.js +14 -2
- data/app/assets/javascripts/pageflow/page_types/audio.js +18 -6
- data/app/assets/javascripts/pageflow/page_types/audio_loop.js +19 -7
- data/app/assets/javascripts/pageflow/page_types/background_video.js +41 -33
- data/app/assets/javascripts/pageflow/page_types/mixins/video_helpers.js +7 -16
- data/app/assets/javascripts/pageflow/ready.js +12 -25
- data/app/assets/javascripts/pageflow/slideshow.js +5 -5
- data/app/assets/javascripts/pageflow/slideshow/hide_text_on_swipe.js +1 -1
- data/app/assets/javascripts/pageflow/slideshow/page_widget.js +11 -1
- data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +19 -2
- data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +31 -6
- data/app/assets/javascripts/pageflow/slideshow/swipe_gesture.js +6 -5
- data/app/assets/javascripts/pageflow/ui.js +16 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/object.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/renderer.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/check_box.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/file_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/page_reference.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/select_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/slider_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_area_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/url_input.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/templates/tabs_view.jst.ejs +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/views/collection_view.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_tab_view.js +8 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_view.js +3 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/check_box_input_view.js +1 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/file_input_view.js +10 -8
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/page_reference_input_view.js +1 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/proxy_url_input_view.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/select_input_view.js +41 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/slider_input_view.js +1 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_area_input_view.js +1 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_input_view.js +8 -2
- data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/url_input_view.js +9 -3
- data/app/assets/javascripts/pageflow/{editor/views → ui/views/mixins}/input_view.js +5 -1
- data/app/assets/javascripts/pageflow/{editor → ui}/views/mixins/subview_container.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/views/sortable_collection_view.js +0 -0
- data/app/assets/javascripts/pageflow/{editor → ui}/views/tabs_view.js +11 -2
- data/app/assets/javascripts/pageflow/video_player/lazy.js +4 -1
- data/app/assets/javascripts/pageflow/visited.js +56 -0
- data/app/assets/javascripts/pageflow/widget_types.js +27 -0
- data/app/assets/javascripts/pageflow/widgets/events.js +33 -0
- data/app/assets/javascripts/pageflow/widgets/navigation.js +42 -33
- data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +60 -38
- data/app/assets/javascripts/pageflow/widgets/overview.js +3 -3
- data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +34 -4
- data/app/assets/javascripts/pageflow/widgets/share_menu.js +60 -0
- data/app/assets/stylesheets/pageflow/admin.css.scss +1 -0
- data/app/assets/stylesheets/pageflow/admin/tabs_view.css.scss +50 -0
- data/app/assets/stylesheets/pageflow/application_with_simulated_media_queries.css.scss +2 -0
- data/app/assets/stylesheets/pageflow/base.css.scss +2 -1
- data/app/assets/stylesheets/pageflow/editor/{image_positioning.css.scss → background_positioning.css.scss} +66 -65
- data/app/assets/stylesheets/pageflow/editor/base.css.scss +7 -5
- data/app/assets/stylesheets/pageflow/editor/file_thumbnails.css.scss +7 -9
- data/app/assets/stylesheets/pageflow/editor/select_button.css.scss +4 -4
- data/app/assets/stylesheets/pageflow/editor/widgets.css.scss +4 -0
- data/app/assets/stylesheets/pageflow/entries.css.scss +5 -0
- data/app/assets/stylesheets/pageflow/mixins/breakpoints.css.scss +75 -10
- data/app/assets/stylesheets/pageflow/multimedia_alert.css.scss +31 -30
- data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
- data/app/assets/stylesheets/pageflow/navigation_mobile.css.scss +57 -58
- data/app/assets/stylesheets/pageflow/player_controls.css.scss +2 -2
- data/app/assets/stylesheets/pageflow/slideshow.css.scss +4 -1
- data/app/assets/stylesheets/pageflow/subshare.css.scss +28 -0
- data/app/assets/stylesheets/pageflow/ui.css.scss +7 -0
- data/app/assets/stylesheets/pageflow/{editor → ui}/forms.css.scss +1 -0
- data/app/assets/stylesheets/pageflow/{editor → ui}/tabs_view.css.scss +1 -0
- data/app/controllers/pageflow/editor/widgets_controller.rb +39 -0
- data/app/controllers/pageflow/entries_controller.rb +10 -1
- data/app/helpers/pageflow/entries_helper.rb +7 -0
- data/app/helpers/pageflow/page_types_helper.rb +7 -7
- data/app/helpers/pageflow/pages_helper.rb +36 -5
- data/app/helpers/pageflow/social_share_helper.rb +54 -0
- data/app/helpers/pageflow/widgets_helper.rb +43 -0
- data/app/models/pageflow/draft_entry.rb +4 -1
- data/app/models/pageflow/entry.rb +1 -0
- data/app/models/pageflow/published_entry.rb +6 -3
- data/app/models/pageflow/revision.rb +5 -0
- data/app/models/pageflow/theming.rb +3 -0
- data/app/models/pageflow/widget.rb +74 -0
- data/app/views/admin/accounts/_form.html.erb +10 -0
- data/app/views/components/pageflow/admin/entries_tab.rb +22 -0
- data/app/views/components/pageflow/admin/members_tab.rb +35 -0
- data/app/views/components/pageflow/admin/revisions_tab.rb +51 -0
- data/app/views/components/pageflow/admin/tabs_view.rb +78 -0
- data/app/views/components/pageflow/admin/users_tab.rb +22 -0
- data/app/views/layouts/pageflow/application.html.erb +5 -5
- data/app/views/pageflow/editor/entries/_entry.json.jbuilder +7 -4
- data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -2
- data/app/views/pageflow/editor/widgets/_widget.json.jbuilder +2 -0
- data/app/views/pageflow/editor/widgets/index.json.jbuilder +1 -0
- data/app/views/pageflow/entries/_entry.html.erb +6 -2
- data/app/views/pageflow/entries/_mobile_navigation.html.erb +56 -0
- data/app/views/pageflow/entries/_navigation.html.erb +3 -53
- data/app/views/pageflow/entries/edit.html.erb +2 -0
- data/app/views/pageflow/entries/navigation/_bar_top.html.erb +7 -3
- data/app/views/pageflow/entries/navigation/_page.html.erb +2 -2
- data/app/views/pageflow/entries/partials.html.erb +1 -1
- data/app/views/pageflow/entries/show.html.erb +12 -4
- data/app/views/pageflow/files/show.html.erb +5 -0
- data/app/views/pageflow/pages/templates/_audio_loop.html.erb +1 -1
- data/app/views/pageflow/pages/templates/_background_video.html.erb +2 -2
- data/app/views/pageflow/pages/templates/_video.html.erb +4 -3
- data/app/views/pageflow/{entries/_social_meta_tags.html.erb → social_share/_entry_meta_tags.html.erb} +2 -2
- data/app/views/pageflow/social_share/_image_tags.html.erb +3 -0
- data/app/views/pageflow/social_share/_page_meta_tags.html.erb +9 -0
- data/config/initializers/admin_resource_tabs.rb +7 -0
- data/config/initializers/paperclip.rb +1 -1
- data/config/initializers/view_components.rb +9 -1
- data/config/initializers/widget_types.rb +4 -0
- data/config/locales/activerecord.de.yml +5 -1
- data/config/locales/admin/tabs.de.yml +8 -0
- data/config/locales/editor.de.yml +5 -4
- data/config/locales/pageflow/editor/background_positioning.de.yml +13 -0
- data/config/locales/pageflow/ui.de.yml +6 -0
- data/config/locales/pageflow/widgets.de.yml +14 -0
- data/config/routes.rb +6 -0
- data/config/spring.rb +2 -1
- data/db/migrate/20141027102310_create_widgets.rb +11 -0
- data/db/migrate/20141028125408_add_emphasize_chapter_beginning_to_revisions.rb +5 -0
- data/db/migrate/20141119164526_add_emphasize_new_pages_to_revisions.rb +5 -0
- data/db/migrate/20141119174032_add_sharing_image_to_revisions.rb +7 -0
- data/lib/pageflow/ability_mixin.rb +2 -0
- data/lib/pageflow/admin/tabs.rb +18 -0
- data/lib/pageflow/built_in_widget_type.rb +27 -0
- data/lib/pageflow/configuration.rb +17 -0
- data/lib/pageflow/engine.rb +2 -0
- data/lib/pageflow/version.rb +1 -1
- data/lib/pageflow/widget_type.rb +52 -0
- data/lib/pageflow/widget_types.rb +50 -0
- data/spec/factories/audio_files.rb +1 -1
- data/spec/factories/chapters.rb +1 -1
- data/spec/factories/entries.rb +2 -2
- data/spec/factories/image_files.rb +1 -1
- data/spec/factories/video_files.rb +1 -1
- data/spec/factories/widgets.rb +6 -0
- data/vendor/assets/javascripts/audio5.min.js +3 -0
- metadata +104 -44
- data/app/assets/javascripts/pageflow/editor/templates/image_positioning.jst.ejs +0 -26
- data/app/assets/javascripts/pageflow/editor/views/image_positioning_view.js +0 -153
- data/app/views/admin/accounts/_entries_panel.html.arb +0 -15
- data/app/views/admin/accounts/_users_panel.html.arb +0 -15
- data/app/views/admin/entries/_members.html.arb +0 -29
- data/app/views/admin/entries/_revisions.html.arb +0 -45
@@ -0,0 +1,39 @@
|
|
1
|
+
module Pageflow
|
2
|
+
module Editor
|
3
|
+
class WidgetsController < Pageflow::ApplicationController
|
4
|
+
respond_to :json
|
5
|
+
|
6
|
+
before_action :authenticate_user!
|
7
|
+
|
8
|
+
def index
|
9
|
+
subject = find_subject
|
10
|
+
authorize!(:edit, subject.to_model)
|
11
|
+
|
12
|
+
@widgets = subject.widgets.resolve(include_placeholders: true)
|
13
|
+
respond_with(@widgets)
|
14
|
+
end
|
15
|
+
|
16
|
+
def batch
|
17
|
+
subject = find_subject
|
18
|
+
authorize!(:edit, subject.to_model)
|
19
|
+
|
20
|
+
subject.widgets.batch_update!(widget_batch_params)
|
21
|
+
render(json: {})
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def widget_batch_params
|
27
|
+
params.permit(widgets: [:role, :type_name]).fetch(:widgets, [])
|
28
|
+
end
|
29
|
+
|
30
|
+
def find_subject
|
31
|
+
if params[:collection_name] == 'entries'
|
32
|
+
DraftEntry.find(params[:subject_id])
|
33
|
+
else
|
34
|
+
Theming.find(params[:subject_id])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -20,6 +20,13 @@ module Pageflow
|
|
20
20
|
respond_to do |format|
|
21
21
|
format.any(:html, :css) do
|
22
22
|
@entry = PublishedEntry.find(params[:id], entry_request_scope)
|
23
|
+
|
24
|
+
if params[:page].present?
|
25
|
+
@entry.share_target = Page.find_by_perma_id(params[:page])
|
26
|
+
else
|
27
|
+
@entry.share_target = @entry
|
28
|
+
end
|
29
|
+
|
23
30
|
end
|
24
31
|
format.json do
|
25
32
|
authenticate_user!
|
@@ -66,7 +73,9 @@ module Pageflow
|
|
66
73
|
protected
|
67
74
|
|
68
75
|
def entry_params
|
69
|
-
params.require(:entry).permit(:title, :summary, :credits, :manual_start, :home_url, :home_button_enabled
|
76
|
+
params.require(:entry).permit(:title, :summary, :credits, :manual_start, :home_url, :home_button_enabled,
|
77
|
+
:emphasize_chapter_beginning, :emphasize_new_pages,
|
78
|
+
:share_image_id, :share_image_x, :share_image_y)
|
70
79
|
end
|
71
80
|
|
72
81
|
def entry_request_scope
|
@@ -52,6 +52,13 @@ module Pageflow
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
def entry_css_class(entry)
|
56
|
+
[
|
57
|
+
present_widgets_css_class(entry),
|
58
|
+
entry.emphasize_chapter_beginning ? 'emphasize_chapter_beginning' : nil
|
59
|
+
].compact.join(' ')
|
60
|
+
end
|
61
|
+
|
55
62
|
def entry_header_css_class(entry)
|
56
63
|
css_class = 'header'
|
57
64
|
if entry.pages.any? && entry.pages.first.configuration['invert']
|
@@ -7,13 +7,13 @@ module Pageflow
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def page_type_templates
|
10
|
-
Pageflow.config.page_types.map do |page_type|
|
11
|
-
content_tag(:script,
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
10
|
+
safe_join(Pageflow.config.page_types.map do |page_type|
|
11
|
+
content_tag(:script,
|
12
|
+
render_to_string(:template => page_type.template_path,
|
13
|
+
:locals => {:configuration => {}, :page => Page.new},
|
14
|
+
:layout => false).to_str,
|
15
|
+
:type => 'text/html', :data => {:template => "#{page_type.name}_page"})
|
16
|
+
end)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -5,6 +5,15 @@ module Pageflow
|
|
5
5
|
classes << 'invert' if page.configuration['invert']
|
6
6
|
classes << 'hide_title' if page.configuration['hide_title']
|
7
7
|
classes << "text_position_#{page.configuration['text_position']}" if page.configuration['text_position'].present?
|
8
|
+
classes << 'chapter_beginning' if page.position == 0
|
9
|
+
classes.join(' ')
|
10
|
+
end
|
11
|
+
|
12
|
+
def page_navigation_css_class(page)
|
13
|
+
classes = [page.template]
|
14
|
+
classes << 'chapter_beginning' if page.position == 0
|
15
|
+
classes << "chapter_#{page.chapter.position}"
|
16
|
+
page.chapter.position % 2 == 0 ? classes << 'chapter_even' : classes << 'chapter_odd'
|
8
17
|
classes.join(' ')
|
9
18
|
end
|
10
19
|
|
@@ -13,12 +22,28 @@ module Pageflow
|
|
13
22
|
content_tag(:div, '', :class => 'shadow', :style => style)
|
14
23
|
end
|
15
24
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
25
|
+
def mobile_poster_image_div(config = {})
|
26
|
+
classes = ['background', 'background_image']
|
27
|
+
position = {x: 50, y: 50}
|
28
|
+
|
29
|
+
if config['mobile_poster_image_id']
|
30
|
+
classes << "image_#{config['mobile_poster_image_id']}"
|
31
|
+
position[:x] = config['mobile_poster_image_x'] || 50
|
32
|
+
position[:y] = config['mobile_poster_image_y'] || 50
|
33
|
+
elsif config['poster_image_id']
|
34
|
+
classes << "image_#{config['poster_image_id']}"
|
35
|
+
position[:x] = config['poster_image_x'] || 50
|
36
|
+
position[:y] = config['poster_image_y'] || 50
|
37
|
+
elsif config['video_file_id']
|
38
|
+
classes << "video_poster_#{config['video_file_id']}"
|
39
|
+
position[:x] = config['video_file_x'] || 50
|
40
|
+
position[:y] = config['video_file_y'] || 50
|
19
41
|
else
|
20
|
-
|
42
|
+
classes << 'video_poster_none'
|
21
43
|
end
|
44
|
+
|
45
|
+
content_tag(:div, '', :class => classes.join(' '),
|
46
|
+
:style => "background-position: #{position[:x]}% #{position[:y]}%;")
|
22
47
|
end
|
23
48
|
|
24
49
|
def poster_image_tag(video_id, poster_image_id, options = {})
|
@@ -46,10 +71,16 @@ module Pageflow
|
|
46
71
|
|
47
72
|
video_file = VideoFile.find_by_id(video_id)
|
48
73
|
poster = ImageFile.find_by_id(poster_image_id)
|
74
|
+
mobile_poster = ImageFile.find_by_id(options.delete(:mobile_poster_image_id))
|
49
75
|
|
50
76
|
options[:data] = {}
|
51
77
|
script_tag_data = {:template => 'video'}
|
52
78
|
|
79
|
+
if mobile_poster
|
80
|
+
options[:data][:mobile_poster] = mobile_poster.attachment.url(:medium)
|
81
|
+
options[:data][:mobile_large_poster] = mobile_poster.attachment.url(:large)
|
82
|
+
end
|
83
|
+
|
53
84
|
if poster
|
54
85
|
options[:data][:poster] = poster.attachment.url(:medium)
|
55
86
|
options[:data][:large_poster] = poster.attachment.url(:large)
|
@@ -58,7 +89,7 @@ module Pageflow
|
|
58
89
|
options[:data][:large_poster] = video_file.poster.url(:large)
|
59
90
|
end
|
60
91
|
|
61
|
-
if
|
92
|
+
if video_file && video_file.width.present? && video_file.height.present?
|
62
93
|
script_tag_data[:video_width] = options[:data][:width] = video_file.width
|
63
94
|
script_tag_data[:video_height] = options[:data][:height] = video_file.height
|
64
95
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Pageflow
|
2
|
+
module SocialShareHelper
|
3
|
+
def social_share_meta_tags_for(target)
|
4
|
+
if target.is_a?(Page)
|
5
|
+
render('pageflow/social_share/page_meta_tags', entry: @entry, page: @entry.share_target)
|
6
|
+
else
|
7
|
+
render('pageflow/social_share/entry_meta_tags', entry: @entry)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def social_share_page_url(page)
|
12
|
+
"#{pretty_entry_url(page.chapter.entry)}?page=#{page.perma_id}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def social_share_page_title(page)
|
16
|
+
entry = page.chapter.entry
|
17
|
+
|
18
|
+
title = ["#{entry.title}:"]
|
19
|
+
title << page.title
|
20
|
+
title << '-' if entry.theming.cname_domain.present?
|
21
|
+
title << entry.theming.cname_domain
|
22
|
+
|
23
|
+
title.join(' ')
|
24
|
+
end
|
25
|
+
|
26
|
+
def social_share_page_description(page)
|
27
|
+
return page.configuration['text'] if page.configuration['text'].present?
|
28
|
+
return page.configuration['description'] if page.configuration['description'].present?
|
29
|
+
''
|
30
|
+
end
|
31
|
+
|
32
|
+
def social_share_entry_image_tags(entry)
|
33
|
+
image_urls = []
|
34
|
+
|
35
|
+
image_urls << ImageFile.find(entry.share_image_id).thumbnail_url(:medium) if entry.share_image_id.present?
|
36
|
+
|
37
|
+
entry.pages.each do |page|
|
38
|
+
if image_urls.size >= 4
|
39
|
+
break
|
40
|
+
else
|
41
|
+
image_urls << page.thumbnail_url(:medium)
|
42
|
+
image_urls.uniq!
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
render 'pageflow/social_share/image_tags', :image_urls => image_urls
|
47
|
+
end
|
48
|
+
|
49
|
+
def social_share_normalize_protocol(url)
|
50
|
+
url.gsub(/^(\/\/|https:\/\/)/, 'http://')
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pageflow
|
2
|
+
module WidgetsHelper
|
3
|
+
def render_widget_head_fragments(entry, options = {})
|
4
|
+
fragments = entry.widgets.resolve(options).map do |widget|
|
5
|
+
widget.widget_type.render_head_fragment(self, entry)
|
6
|
+
end
|
7
|
+
|
8
|
+
safe_join(fragments)
|
9
|
+
end
|
10
|
+
|
11
|
+
def render_widgets(entry, options = {})
|
12
|
+
fragments = entry.widgets.resolve(options).map do |widget|
|
13
|
+
widget.widget_type.render(self, entry)
|
14
|
+
end
|
15
|
+
|
16
|
+
safe_join(fragments)
|
17
|
+
end
|
18
|
+
|
19
|
+
def present_widgets_css_class(entry)
|
20
|
+
entry.widgets.resolve.map do |widget|
|
21
|
+
"widget_#{widget.widget_type.name}_present"
|
22
|
+
end.join(' ')
|
23
|
+
end
|
24
|
+
|
25
|
+
def widget_types_json_seeds
|
26
|
+
Pageflow.config.widget_types.each_with_object({}) do |widget_type, result|
|
27
|
+
widget_type.roles.each do |role|
|
28
|
+
result[role] ||= []
|
29
|
+
result[role] << {
|
30
|
+
name: widget_type.name,
|
31
|
+
translationKey: widget_type.translation_key
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end.to_json.html_safe
|
35
|
+
end
|
36
|
+
|
37
|
+
def widget_types_collection_for_role(role)
|
38
|
+
Pageflow.config.widget_types.find_all_by_role(role).each_with_object({}) do |widget_type, result|
|
39
|
+
result[I18n.t(widget_type.translation_key)] = widget_type.name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -11,7 +11,10 @@ module Pageflow
|
|
11
11
|
:to => :entry)
|
12
12
|
|
13
13
|
delegate(:title, :summary, :credits, :manual_start,
|
14
|
-
:chapters, :pages,
|
14
|
+
:widgets, :chapters, :pages,
|
15
|
+
:emphasize_chapter_beginning,
|
16
|
+
:emphasize_new_pages,
|
17
|
+
:share_image_id, :share_image_x, :share_image_y,
|
15
18
|
:files,
|
16
19
|
:image_files, :video_files, :audio_files,
|
17
20
|
:to => :draft)
|
@@ -4,13 +4,16 @@ module Pageflow
|
|
4
4
|
extend ActiveModel::Naming
|
5
5
|
|
6
6
|
attr_reader :entry, :revision
|
7
|
+
attr_accessor :share_target
|
7
8
|
|
8
|
-
delegate(:account, :theming, :to_model, :to_key, :persisted?, :to => :entry)
|
9
|
+
delegate(:id, :account, :theming, :to_model, :to_key, :persisted?, :to => :entry)
|
9
10
|
|
10
|
-
delegate(:chapters, :pages,
|
11
|
-
:files,
|
11
|
+
delegate(:widgets, :chapters, :pages, :files,
|
12
12
|
:image_files, :video_files, :audio_files,
|
13
13
|
:title, :summary, :credits, :manual_start,
|
14
|
+
:emphasize_chapter_beginning,
|
15
|
+
:emphasize_new_pages,
|
16
|
+
:share_image_id, :share_image_x, :share_image_y,
|
14
17
|
:to => :revision)
|
15
18
|
|
16
19
|
def initialize(entry, revision = nil)
|
@@ -4,6 +4,7 @@ module Pageflow
|
|
4
4
|
belongs_to :creator, :class_name => 'User'
|
5
5
|
belongs_to :restored_from, :class_name => 'Pageflow::Revision'
|
6
6
|
|
7
|
+
has_many :widgets, :as => :subject
|
7
8
|
has_many :chapters, -> { order('position ASC') }
|
8
9
|
has_many :pages, -> { reorder('pageflow_chapters.position ASC, pageflow_pages.position ASC') }, :through => :chapters
|
9
10
|
|
@@ -73,6 +74,10 @@ module Pageflow
|
|
73
74
|
revision = dup
|
74
75
|
yield(revision) if block_given?
|
75
76
|
|
77
|
+
widgets.each do |widget|
|
78
|
+
widget.copy_to(revision)
|
79
|
+
end
|
80
|
+
|
76
81
|
chapters.each do |chapter|
|
77
82
|
chapter.copy_to(revision)
|
78
83
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Pageflow
|
2
2
|
class Theming < ActiveRecord::Base
|
3
3
|
belongs_to :account
|
4
|
+
has_many :widgets, as: :subject
|
5
|
+
|
6
|
+
has_many :entries
|
4
7
|
|
5
8
|
scope :with_home_url, -> { where.not(home_url: '') }
|
6
9
|
scope :for_request, ->(request) { Pageflow.config.theming_request_scope.call(all, request) }
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Pageflow
|
2
|
+
class Widget < ActiveRecord::Base
|
3
|
+
belongs_to :subject, polymorphic: true, touch: true
|
4
|
+
|
5
|
+
validates :subject, presence: true
|
6
|
+
|
7
|
+
def copy_to(subject)
|
8
|
+
record = dup
|
9
|
+
record.subject = subject
|
10
|
+
record.save!
|
11
|
+
end
|
12
|
+
|
13
|
+
def enabled?(options)
|
14
|
+
options[:only] != :editor || widget_type.enabled_in_editor?
|
15
|
+
end
|
16
|
+
|
17
|
+
def widget_type
|
18
|
+
Pageflow.config.widget_types.fetch_by_name(type_name) do
|
19
|
+
WidgetType::Null.new(role)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.copy_all_to(subject)
|
24
|
+
all.each do |widget|
|
25
|
+
widget.copy_to(subject)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.batch_update!(widgets_attributes)
|
30
|
+
widgets_attributes.each do |attributes|
|
31
|
+
find_or_initialize_by(role: attributes[:role]).update!(attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.resolve(options = {})
|
36
|
+
Resolver.new(options).result
|
37
|
+
end
|
38
|
+
|
39
|
+
class Resolver < Struct.new(:options)
|
40
|
+
def result
|
41
|
+
all.select do |widget|
|
42
|
+
widget.enabled?(options)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def all
|
49
|
+
placeholders_by_role
|
50
|
+
.merge(defaults_by_role)
|
51
|
+
.merge(from_db_by_role)
|
52
|
+
.values
|
53
|
+
end
|
54
|
+
|
55
|
+
def from_db_by_role
|
56
|
+
Widget.all.index_by(&:role)
|
57
|
+
end
|
58
|
+
|
59
|
+
def defaults_by_role
|
60
|
+
Pageflow.config.widget_types.defaults_by_role.each_with_object({}) do |(role, widget_type), result|
|
61
|
+
result[role] = Widget.new(role: role, type_name: widget_type.name, subject: nil)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def placeholders_by_role
|
66
|
+
return {} unless options[:include_placeholders]
|
67
|
+
|
68
|
+
Pageflow.config.widget_types.roles.each_with_object({}) do |role, result|
|
69
|
+
result[role] = Widget.new(role: role, type_name: nil, subject: nil)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|