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.

Files changed (197) hide show
  1. checksums.yaml +8 -8
  2. data/Rakefile +2 -1
  3. data/admins/pageflow/accounts.rb +20 -4
  4. data/admins/pageflow/entry.rb +4 -5
  5. data/app/assets/javascripts/pageflow/audio_player.js +16 -7
  6. data/app/assets/javascripts/pageflow/base.js +5 -0
  7. data/app/assets/javascripts/pageflow/built_in_widget_types.js +11 -0
  8. data/app/assets/javascripts/pageflow/cookies.js +43 -0
  9. data/app/assets/javascripts/pageflow/editor/base.js +2 -10
  10. data/app/assets/javascripts/pageflow/editor/collections/widgets_collection.js +16 -0
  11. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +3 -2
  12. data/app/assets/javascripts/pageflow/editor/edit_widget.jst.ejs +2 -0
  13. data/app/assets/javascripts/pageflow/editor/initializers/setup_widget_types.js +3 -0
  14. data/app/assets/javascripts/pageflow/editor/models/configuration.js +18 -9
  15. data/app/assets/javascripts/pageflow/editor/models/edit_lock_container.js +1 -0
  16. data/app/assets/javascripts/pageflow/editor/models/entry.js +13 -3
  17. data/app/assets/javascripts/pageflow/editor/models/entry_configuration.js +4 -0
  18. data/app/assets/javascripts/pageflow/editor/models/entry_configuration_file_selection_handler.js +11 -0
  19. data/app/assets/javascripts/pageflow/editor/models/image_file.js +4 -0
  20. data/app/assets/javascripts/pageflow/editor/models/mixins/widget_subject.js +37 -0
  21. data/app/assets/javascripts/pageflow/editor/models/page.js +1 -1
  22. data/app/assets/javascripts/pageflow/editor/models/page_configuration_file_selection_handler.js +1 -25
  23. data/app/assets/javascripts/pageflow/editor/models/theming.js +3 -0
  24. data/app/assets/javascripts/pageflow/editor/models/video_file.js +7 -0
  25. data/app/assets/javascripts/pageflow/editor/models/widget.js +19 -0
  26. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +1 -0
  27. data/app/assets/javascripts/pageflow/editor/templates/background_positioning.jst.ejs +18 -0
  28. data/app/assets/javascripts/pageflow/editor/templates/background_positioning_preview.jst.ejs +2 -0
  29. data/app/assets/javascripts/pageflow/editor/templates/background_positioning_sliders.jst.ejs +6 -0
  30. data/app/assets/javascripts/pageflow/editor/templates/edit_meta_data.jst.ejs +1 -1
  31. data/app/assets/javascripts/pageflow/editor/templates/edit_widget.jst.ejs +2 -0
  32. data/app/assets/javascripts/pageflow/editor/templates/edit_widgets.jst.ejs +2 -0
  33. data/app/assets/javascripts/pageflow/editor/templates/entry_preview.jst.ejs +1 -3
  34. data/app/assets/javascripts/pageflow/editor/views/background_positioning_preview_view.js +39 -0
  35. data/app/assets/javascripts/pageflow/editor/views/background_positioning_sliders_view.js +94 -0
  36. data/app/assets/javascripts/pageflow/editor/views/background_positioning_view.js +67 -0
  37. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio.js +1 -1
  38. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/audio_loop.js +1 -1
  39. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_image.js +1 -1
  40. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/background_video.js +4 -3
  41. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/internal_links.js +1 -1
  42. data/app/assets/javascripts/pageflow/editor/views/configuration_editors/video.js +9 -2
  43. data/app/assets/javascripts/pageflow/editor/views/edit_meta_data_view.js +18 -2
  44. data/app/assets/javascripts/pageflow/editor/views/edit_widget_view.js +29 -0
  45. data/app/assets/javascripts/pageflow/editor/views/edit_widgets_view.js +20 -0
  46. data/app/assets/javascripts/pageflow/editor/views/embedded/background_image_embedded_view.js +8 -3
  47. data/app/assets/javascripts/pageflow/editor/views/entry_preview_view.js +53 -9
  48. data/app/assets/javascripts/pageflow/editor/views/page_item_view.js +1 -1
  49. data/app/assets/javascripts/pageflow/editor/views/page_preview_view.js +11 -3
  50. data/app/assets/javascripts/pageflow/events.js +1 -0
  51. data/app/assets/javascripts/pageflow/features/hashchange_support.js +8 -0
  52. data/app/assets/javascripts/pageflow/history.js +14 -2
  53. data/app/assets/javascripts/pageflow/page_types/audio.js +18 -6
  54. data/app/assets/javascripts/pageflow/page_types/audio_loop.js +19 -7
  55. data/app/assets/javascripts/pageflow/page_types/background_video.js +41 -33
  56. data/app/assets/javascripts/pageflow/page_types/mixins/video_helpers.js +7 -16
  57. data/app/assets/javascripts/pageflow/ready.js +12 -25
  58. data/app/assets/javascripts/pageflow/slideshow.js +5 -5
  59. data/app/assets/javascripts/pageflow/slideshow/hide_text_on_swipe.js +1 -1
  60. data/app/assets/javascripts/pageflow/slideshow/page_widget.js +11 -1
  61. data/app/assets/javascripts/pageflow/slideshow/scroll_indicator_widget.js +19 -2
  62. data/app/assets/javascripts/pageflow/slideshow/scroller_widget.js +31 -6
  63. data/app/assets/javascripts/pageflow/slideshow/swipe_gesture.js +6 -5
  64. data/app/assets/javascripts/pageflow/ui.js +16 -0
  65. data/app/assets/javascripts/pageflow/{editor → ui}/object.js +0 -0
  66. data/app/assets/javascripts/pageflow/{editor → ui}/renderer.js +0 -0
  67. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/check_box.jst.ejs +0 -0
  68. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/file_input.jst.ejs +0 -0
  69. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/page_reference.jst.ejs +0 -0
  70. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/select_input.jst.ejs +0 -0
  71. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/slider_input.jst.ejs +0 -0
  72. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_area_input.jst.ejs +0 -0
  73. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/text_input.jst.ejs +0 -0
  74. data/app/assets/javascripts/pageflow/{editor → ui}/templates/inputs/url_input.jst.ejs +0 -0
  75. data/app/assets/javascripts/pageflow/{editor → ui}/templates/tabs_view.jst.ejs +0 -0
  76. data/app/assets/javascripts/pageflow/{editor → ui}/views/collection_view.js +0 -0
  77. data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_tab_view.js +8 -1
  78. data/app/assets/javascripts/pageflow/{editor → ui}/views/configuration_editor_view.js +3 -1
  79. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/check_box_input_view.js +1 -1
  80. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/file_input_view.js +10 -8
  81. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/page_reference_input_view.js +1 -1
  82. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/proxy_url_input_view.js +0 -0
  83. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/select_input_view.js +41 -1
  84. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/slider_input_view.js +1 -1
  85. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_area_input_view.js +1 -1
  86. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/text_input_view.js +8 -2
  87. data/app/assets/javascripts/pageflow/{editor → ui}/views/inputs/url_input_view.js +9 -3
  88. data/app/assets/javascripts/pageflow/{editor/views → ui/views/mixins}/input_view.js +5 -1
  89. data/app/assets/javascripts/pageflow/{editor → ui}/views/mixins/subview_container.js +0 -0
  90. data/app/assets/javascripts/pageflow/{editor → ui}/views/sortable_collection_view.js +0 -0
  91. data/app/assets/javascripts/pageflow/{editor → ui}/views/tabs_view.js +11 -2
  92. data/app/assets/javascripts/pageflow/video_player/lazy.js +4 -1
  93. data/app/assets/javascripts/pageflow/visited.js +56 -0
  94. data/app/assets/javascripts/pageflow/widget_types.js +27 -0
  95. data/app/assets/javascripts/pageflow/widgets/events.js +33 -0
  96. data/app/assets/javascripts/pageflow/widgets/navigation.js +42 -33
  97. data/app/assets/javascripts/pageflow/widgets/navigation_mobile.js +60 -38
  98. data/app/assets/javascripts/pageflow/widgets/overview.js +3 -3
  99. data/app/assets/javascripts/pageflow/widgets/page_navigation_list.js +34 -4
  100. data/app/assets/javascripts/pageflow/widgets/share_menu.js +60 -0
  101. data/app/assets/stylesheets/pageflow/admin.css.scss +1 -0
  102. data/app/assets/stylesheets/pageflow/admin/tabs_view.css.scss +50 -0
  103. data/app/assets/stylesheets/pageflow/application_with_simulated_media_queries.css.scss +2 -0
  104. data/app/assets/stylesheets/pageflow/base.css.scss +2 -1
  105. data/app/assets/stylesheets/pageflow/editor/{image_positioning.css.scss → background_positioning.css.scss} +66 -65
  106. data/app/assets/stylesheets/pageflow/editor/base.css.scss +7 -5
  107. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.css.scss +7 -9
  108. data/app/assets/stylesheets/pageflow/editor/select_button.css.scss +4 -4
  109. data/app/assets/stylesheets/pageflow/editor/widgets.css.scss +4 -0
  110. data/app/assets/stylesheets/pageflow/entries.css.scss +5 -0
  111. data/app/assets/stylesheets/pageflow/mixins/breakpoints.css.scss +75 -10
  112. data/app/assets/stylesheets/pageflow/multimedia_alert.css.scss +31 -30
  113. data/app/assets/stylesheets/pageflow/navigation_bar.css.scss +4 -0
  114. data/app/assets/stylesheets/pageflow/navigation_mobile.css.scss +57 -58
  115. data/app/assets/stylesheets/pageflow/player_controls.css.scss +2 -2
  116. data/app/assets/stylesheets/pageflow/slideshow.css.scss +4 -1
  117. data/app/assets/stylesheets/pageflow/subshare.css.scss +28 -0
  118. data/app/assets/stylesheets/pageflow/ui.css.scss +7 -0
  119. data/app/assets/stylesheets/pageflow/{editor → ui}/forms.css.scss +1 -0
  120. data/app/assets/stylesheets/pageflow/{editor → ui}/tabs_view.css.scss +1 -0
  121. data/app/controllers/pageflow/editor/widgets_controller.rb +39 -0
  122. data/app/controllers/pageflow/entries_controller.rb +10 -1
  123. data/app/helpers/pageflow/entries_helper.rb +7 -0
  124. data/app/helpers/pageflow/page_types_helper.rb +7 -7
  125. data/app/helpers/pageflow/pages_helper.rb +36 -5
  126. data/app/helpers/pageflow/social_share_helper.rb +54 -0
  127. data/app/helpers/pageflow/widgets_helper.rb +43 -0
  128. data/app/models/pageflow/draft_entry.rb +4 -1
  129. data/app/models/pageflow/entry.rb +1 -0
  130. data/app/models/pageflow/published_entry.rb +6 -3
  131. data/app/models/pageflow/revision.rb +5 -0
  132. data/app/models/pageflow/theming.rb +3 -0
  133. data/app/models/pageflow/widget.rb +74 -0
  134. data/app/views/admin/accounts/_form.html.erb +10 -0
  135. data/app/views/components/pageflow/admin/entries_tab.rb +22 -0
  136. data/app/views/components/pageflow/admin/members_tab.rb +35 -0
  137. data/app/views/components/pageflow/admin/revisions_tab.rb +51 -0
  138. data/app/views/components/pageflow/admin/tabs_view.rb +78 -0
  139. data/app/views/components/pageflow/admin/users_tab.rb +22 -0
  140. data/app/views/layouts/pageflow/application.html.erb +5 -5
  141. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +7 -4
  142. data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -2
  143. data/app/views/pageflow/editor/widgets/_widget.json.jbuilder +2 -0
  144. data/app/views/pageflow/editor/widgets/index.json.jbuilder +1 -0
  145. data/app/views/pageflow/entries/_entry.html.erb +6 -2
  146. data/app/views/pageflow/entries/_mobile_navigation.html.erb +56 -0
  147. data/app/views/pageflow/entries/_navigation.html.erb +3 -53
  148. data/app/views/pageflow/entries/edit.html.erb +2 -0
  149. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +7 -3
  150. data/app/views/pageflow/entries/navigation/_page.html.erb +2 -2
  151. data/app/views/pageflow/entries/partials.html.erb +1 -1
  152. data/app/views/pageflow/entries/show.html.erb +12 -4
  153. data/app/views/pageflow/files/show.html.erb +5 -0
  154. data/app/views/pageflow/pages/templates/_audio_loop.html.erb +1 -1
  155. data/app/views/pageflow/pages/templates/_background_video.html.erb +2 -2
  156. data/app/views/pageflow/pages/templates/_video.html.erb +4 -3
  157. data/app/views/pageflow/{entries/_social_meta_tags.html.erb → social_share/_entry_meta_tags.html.erb} +2 -2
  158. data/app/views/pageflow/social_share/_image_tags.html.erb +3 -0
  159. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +9 -0
  160. data/config/initializers/admin_resource_tabs.rb +7 -0
  161. data/config/initializers/paperclip.rb +1 -1
  162. data/config/initializers/view_components.rb +9 -1
  163. data/config/initializers/widget_types.rb +4 -0
  164. data/config/locales/activerecord.de.yml +5 -1
  165. data/config/locales/admin/tabs.de.yml +8 -0
  166. data/config/locales/editor.de.yml +5 -4
  167. data/config/locales/pageflow/editor/background_positioning.de.yml +13 -0
  168. data/config/locales/pageflow/ui.de.yml +6 -0
  169. data/config/locales/pageflow/widgets.de.yml +14 -0
  170. data/config/routes.rb +6 -0
  171. data/config/spring.rb +2 -1
  172. data/db/migrate/20141027102310_create_widgets.rb +11 -0
  173. data/db/migrate/20141028125408_add_emphasize_chapter_beginning_to_revisions.rb +5 -0
  174. data/db/migrate/20141119164526_add_emphasize_new_pages_to_revisions.rb +5 -0
  175. data/db/migrate/20141119174032_add_sharing_image_to_revisions.rb +7 -0
  176. data/lib/pageflow/ability_mixin.rb +2 -0
  177. data/lib/pageflow/admin/tabs.rb +18 -0
  178. data/lib/pageflow/built_in_widget_type.rb +27 -0
  179. data/lib/pageflow/configuration.rb +17 -0
  180. data/lib/pageflow/engine.rb +2 -0
  181. data/lib/pageflow/version.rb +1 -1
  182. data/lib/pageflow/widget_type.rb +52 -0
  183. data/lib/pageflow/widget_types.rb +50 -0
  184. data/spec/factories/audio_files.rb +1 -1
  185. data/spec/factories/chapters.rb +1 -1
  186. data/spec/factories/entries.rb +2 -2
  187. data/spec/factories/image_files.rb +1 -1
  188. data/spec/factories/video_files.rb +1 -1
  189. data/spec/factories/widgets.rb +6 -0
  190. data/vendor/assets/javascripts/audio5.min.js +3 -0
  191. metadata +104 -44
  192. data/app/assets/javascripts/pageflow/editor/templates/image_positioning.jst.ejs +0 -26
  193. data/app/assets/javascripts/pageflow/editor/views/image_positioning_view.js +0 -153
  194. data/app/views/admin/accounts/_entries_panel.html.arb +0 -15
  195. data/app/views/admin/accounts/_users_panel.html.arb +0 -15
  196. data/app/views/admin/entries/_members.html.arb +0 -29
  197. data/app/views/admin/entries/_revisions.html.arb +0 -45
@@ -0,0 +1,7 @@
1
+ @import "bourbon";
2
+ @import "pageflow/mixins";
3
+
4
+ %pageflow-ui {
5
+ @import "./ui/forms";
6
+ @import "./ui/tabs_view";
7
+ }
@@ -180,6 +180,7 @@ textarea.short {
180
180
 
181
181
  .configuration_editor {
182
182
  margin: 10px 0;
183
+ padding-bottom: 20px;
183
184
 
184
185
  > div {
185
186
  padding: 5px 0;
@@ -4,6 +4,7 @@
4
4
  width: 100%;
5
5
  white-space: nowrap;
6
6
  overflow: hidden;
7
+ padding: 0;
7
8
  }
8
9
 
9
10
  > ul > li {
@@ -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, :type => 'text/html', :data => {:template => "#{page_type.name}_page"}) do
12
- render_to_string(:template => page_type.template_path,
13
- :locals => {:configuration => {}, :page => Page.new},
14
- :layout => false)
15
- end
16
- end.join(' ').html_safe
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 poster_image_div(video_id, poster_image_id)
17
- if poster_image_id.present?
18
- content_tag(:div, '', :class => "background background_image image_#{poster_image_id}")
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
- content_tag(:div, '', :class => "background background_image video_poster_#{video_id || 'none'}")
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 (video_file && video_file.width.present? && video_file.height.present?)
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)
@@ -32,6 +32,7 @@ module Pageflow
32
32
 
33
33
  after_create do
34
34
  create_draft!(home_button_enabled: theming.home_button_enabled_by_default)
35
+ theming.widgets.copy_all_to(draft)
35
36
  end
36
37
 
37
38
  def edit_lock
@@ -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