effective_pages 3.12.0 → 3.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a415e3b0c2a07052c1c2be02f5444637ce620debf117d680939a0ed57dffc4c0
4
- data.tar.gz: aa71beffd9b9b95c841a329c19e6813d6f860dad393e6a0dfddd1150420c7de8
3
+ metadata.gz: 77904dcc5dcbdb4b61099c85b7ca2e201796a74a5018251eeebe66f3fcdf1128
4
+ data.tar.gz: 39d9c4b11d21ebdc73b31ddbd8925791a2a3bba78e5e839f15880f8fa7af4477
5
5
  SHA512:
6
- metadata.gz: a93466db870f0d256d864c49ca2cec4f21e644198c05959490b6918a45ecfc83da350a94d68f669dc94cdf00e1b7d6a85ecfd769d7904e6a4f1d2cb070e16654
7
- data.tar.gz: 24407df9909682c9cf3d781625e84b9eb0037b33a5da778541b8b8fed9f5988cd8dec5c2da1300387778d00ace3b36101a7a2548eb4863dc12ce62aad749299f
6
+ metadata.gz: 57fccf986d7b3279e0dd3f5bacd365841fe4b45db2d828de068eb8504f2da54f07a3005ae63951ebb621aca623ade13ede050b22b62c7cbe86278a4262ffd015
7
+ data.tar.gz: e290da633e3cc9cf3b08081457ea7e5218cbab17364fc6906ddd4f63c16f58b8ee86232f2f27fc097038b61847a192cf531896c3a328e7c71f5b1bc7a350a584
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EffectivePageSegmentsHelper
4
+
5
+ # This is a scrollspy navbar
6
+ # = render_page_segments_menu(class: 'navbar navbar-light bg-light')
7
+ def render_page_segments_menu(page = nil, options = {})
8
+ (options = page; page = nil) if page.kind_of?(Hash)
9
+ page ||= @page
10
+
11
+ raise('Expected an Effective::Page') if page && !page.kind_of?(Effective::Page)
12
+ raise('Expected a Hash of options') unless options.kind_of?(Hash)
13
+
14
+ return if page.blank?
15
+ return if page.page_segments.blank?
16
+ return unless page.template_page_segments?
17
+
18
+ # Default options
19
+ options[:class] ||= 'navbar navbar-light bg-light'
20
+
21
+ render('effective/page_segments/menu', page: page, html_options: options)
22
+ end
23
+
24
+ # Renders all page segments for one page
25
+ def render_page_segments(page = nil, options = {})
26
+ (options = page; page = nil) if page.kind_of?(Hash)
27
+ page ||= @page
28
+
29
+ raise('Expected an Effective::Page') if page && !page.kind_of?(Effective::Page)
30
+ raise('Expected a Hash of options') unless options.kind_of?(Hash)
31
+
32
+ return if page.blank?
33
+ return if page.page_segments.blank?
34
+
35
+ render('effective/page_segments/content', page: page, html_options: options)
36
+ end
37
+
38
+ end
@@ -18,7 +18,7 @@ module Effective
18
18
  validates :body, presence: true
19
19
 
20
20
  def to_s
21
- 'alert'
21
+ model_name.human
22
22
  end
23
23
 
24
24
  end
@@ -56,7 +56,7 @@ module Effective
56
56
  end
57
57
 
58
58
  def to_s
59
- persisted? ? [carousel, number].join(' ') : 'carousel item'
59
+ persisted? ? [carousel, number].join(' ') : model_name.human
60
60
  end
61
61
 
62
62
  # As per has_many_rich_texts
@@ -19,6 +19,9 @@ module Effective
19
19
  has_many :menu_children, -> { Effective::Page.menuable }, class_name: 'Effective::Page',
20
20
  foreign_key: :menu_parent_id, inverse_of: :menu_parent
21
21
 
22
+ has_many :page_segments, -> { Effective::PageSegment.sorted }, class_name: 'Effective::PageSegment', inverse_of: :page, dependent: :destroy
23
+ accepts_nested_attributes_for :page_segments, allow_destroy: true
24
+
22
25
  acts_as_role_restricted if respond_to?(:acts_as_role_restricted)
23
26
  acts_as_paginable
24
27
  acts_as_published
@@ -137,7 +140,7 @@ module Effective
137
140
  end
138
141
 
139
142
  def to_s
140
- title
143
+ title.presence || model_name.human
141
144
  end
142
145
 
143
146
  def menu_to_s
@@ -201,6 +204,9 @@ module Effective
201
204
  menu_children_count <= 0
202
205
  end
203
206
 
207
+ # Checked by render_page_segments_menu() to see if this page should render the page_segments menu
208
+ def template_page_segments?
209
+ template == 'page_segments'
210
+ end
204
211
  end
205
-
206
212
  end
@@ -36,7 +36,7 @@ module Effective
36
36
  end
37
37
 
38
38
  def to_s
39
- name.presence || 'page banner'
39
+ name.presence || model_name.human
40
40
  end
41
41
 
42
42
  # As per has_many_rich_texts
@@ -35,14 +35,12 @@ module Effective
35
35
  scope :sorted, -> { order(:name) }
36
36
 
37
37
  def to_s
38
- name.presence || 'page section'
38
+ name.presence || model_name.human
39
39
  end
40
40
 
41
41
  # As per has_many_rich_texts
42
42
  def body
43
43
  rich_text_body
44
44
  end
45
-
46
45
  end
47
-
48
46
  end
@@ -0,0 +1,43 @@
1
+ # For use with the the ScrollSpy pages
2
+ # Each PageSegment will be considered with the page_segments / scrollspy menu
3
+
4
+ module Effective
5
+ class PageSegment < ActiveRecord::Base
6
+ self.table_name = (EffectivePages.page_segments_table_name || :page_segments).to_s
7
+
8
+ belongs_to :page
9
+
10
+ has_many_rich_texts
11
+ log_changes(to: :page) if respond_to?(:log_changes)
12
+
13
+ effective_resource do
14
+ title :string
15
+ position :integer
16
+
17
+ timestamps
18
+ end
19
+
20
+ before_validation(if: -> { page.present? }) do
21
+ self.position ||= (page.page_segments.map(&:position).compact.max || -1) + 1
22
+ end
23
+
24
+ validates :title, presence: true, uniqueness: { scope: :page_id }
25
+ validates :position, presence: true
26
+
27
+ scope :deep, -> { includes(:page, :rich_texts) }
28
+ scope :sorted, -> { order(:position) }
29
+
30
+ def to_s
31
+ title.presence || model_name.human
32
+ end
33
+
34
+ # As per has_many_rich_texts
35
+ def body
36
+ rich_text_body
37
+ end
38
+
39
+ def uid
40
+ title.parameterize
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ %p Please add one or more page segments. Each segment will be displayed on the in-page menu.
2
+
3
+ = f.has_many :page_segments, f.object.page_segments do |fps|
4
+ = card do
5
+ = fps.text_field :title
6
+
7
+ - if defined?(EffectiveArticleEditor)
8
+ = fps.article_editor :rich_text_body, label: 'Body'
9
+ - else
10
+ = fps.rich_text_area :rich_text_body, label: 'Body'
@@ -1,12 +1,11 @@
1
1
  = effective_form_with(model: [:admin, page], engine: true) do |f|
2
-
3
2
  = f.text_field :title
4
3
 
5
4
  -# acts_as_published
6
5
  = f.hide_if(:save_as_draft, true) do
7
6
  .row
8
7
  .col-md-6
9
- = f.datetime_field :published_start_at, hint: 'The page will be available starting on this date and time.'
8
+ = f.datetime_field :published_start_at, hint: 'The page will be available starting on this date and time. Leave blank to publish immediately.'
10
9
  .col-md-6
11
10
  = f.datetime_field :published_end_at, hint: 'The page will no longer be available after this date and time. Leave blank for no end date.', date_linked: false
12
11
 
@@ -49,7 +48,6 @@
49
48
 
50
49
  = f.select :page_banner_id, Effective::PageBanner.sorted.all, label: 'Choose a page banner'
51
50
 
52
-
53
51
  = render partial: '/admin/pages/additional_fields', locals: { page: page, form: f, f: f }
54
52
 
55
53
  - if f.object.persisted? && f.object.menu_root_with_children?
@@ -68,4 +66,8 @@
68
66
  - if f.object.new_record? && f.object.rich_texts.present?
69
67
  = render '/admin/pages/rich_text_areas', page: page, f: f
70
68
 
69
+ -# For use with the render_page_segments_menu() helper. Used to render the page_segments / scrollspy menu.
70
+ = f.show_if(:template, :page_segments) do
71
+ = render '/admin/pages/fields_page_segments', page: page, f: f
72
+
71
73
  = effective_submit(f)
@@ -1,6 +1,8 @@
1
1
  - if defined?(EffectiveArticleEditor)
2
2
  = f.article_editor :rich_text_body, label: 'Body', hint: 'The main body of your page'
3
- = f.article_editor :rich_text_sidebar, label: 'Sidebar', hint: 'The sidebar content of your page'
3
+ - if EffectivePages.sidebars?
4
+ = f.article_editor :rich_text_sidebar, label: 'Sidebar', hint: 'The sidebar content of your page'
4
5
  - else
5
6
  = f.rich_text_area :rich_text_body, label: 'Body', hint: 'The main body of your page'
6
- = f.rich_text_area :rich_text_sidebar, label: 'Sidebar', hint: 'The sidebar content of your page'
7
+ - if EffectivePages.sidebars?
8
+ = f.rich_text_area :rich_text_sidebar, label: 'Sidebar', hint: 'The sidebar content of your page'
@@ -0,0 +1,5 @@
1
+ -# %div.effective-page-segments{'data-spy': 'scroll', 'data-target': "#effective-page-segments-menu", style: 'position: relative; height: 500px; overflow: auto;'}
2
+
3
+ - page.page_segments.each do |segment|
4
+ %div{id: segment.uid}
5
+ = segment.body
@@ -0,0 +1,4 @@
1
+ %nav#effective-page-segments-menu{local_assigns[:html_options]}
2
+ %ul.nav
3
+ - page.page_segments.each do |segment|
4
+ = nav_link_to(segment.to_s, "#" + segment.uid)
@@ -70,4 +70,7 @@ EffectivePages.setup do |config|
70
70
  # config.carousels = [:home, :secondary]
71
71
  config.carousels_hint_text = 'Hint text that includes required image dimensions'
72
72
 
73
+ # Page Sidebars
74
+ # Set to true if your any of your pages use the sidebar content
75
+ config.sidebars = false
73
76
  end
@@ -65,6 +65,16 @@ class CreateEffectivePages < ActiveRecord::Migration[6.0]
65
65
 
66
66
  add_index :page_sections, :name, :unique => true
67
67
 
68
+ create_table :page_segments do |t|
69
+ t.integer :page_id
70
+
71
+ t.string :title
72
+ t.integer :position
73
+
74
+ t.datetime :updated_at
75
+ t.datetime :created_at
76
+ end
77
+
68
78
  create_table :carousel_items do |t|
69
79
  t.string :carousel
70
80
 
@@ -18,6 +18,7 @@ module EffectivePages
18
18
  helper EffectivePagesHelper
19
19
  helper EffectiveCarouselsHelper
20
20
  helper EffectivePageSectionsHelper
21
+ helper EffectivePageSegmentsHelper
21
22
  helper EffectivePageBannersHelper
22
23
  helper EffectiveMenusHelper
23
24
  helper EffectiveAlertsHelper
@@ -1,3 +1,3 @@
1
1
  module EffectivePages
2
- VERSION = '3.12.0'.freeze
2
+ VERSION = '3.13.0'.freeze
3
3
  end
@@ -7,7 +7,8 @@ require 'effective_pages/version'
7
7
  module EffectivePages
8
8
  def self.config_keys
9
9
  [
10
- :pages_table_name, :page_sections_table_name, :page_banners_table_name, :carousel_items_table_name, :alerts_table_name, :permalinks_table_name, :tags_table_name, :taggings_table_name,
10
+ :pages_table_name, :page_banners_table_name, :page_sections_table_name, :page_segments_table_name,
11
+ :alerts_table_name, :carousel_items_table_name, :permalinks_table_name, :tags_table_name, :taggings_table_name,
11
12
  :pages_path, :excluded_pages, :layouts_path, :excluded_layouts,
12
13
  :site_og_image, :site_og_image_width, :site_og_image_height,
13
14
  :site_title, :site_title_suffix, :fallback_meta_description, :google_analytics_code,
@@ -15,7 +16,7 @@ module EffectivePages
15
16
  :use_effective_roles, :layout, :max_menu_depth, :banners_hint_text, :carousels_hint_text, :banners_force_randomize,
16
17
 
17
18
  # Booleans
18
- :banners,
19
+ :banners, :sidebars,
19
20
 
20
21
  # Hashes
21
22
  :menus, :carousels
@@ -67,4 +68,7 @@ module EffectivePages
67
68
  menus.kind_of?(Array) && menus.present?
68
69
  end
69
70
 
71
+ def self.sidebars?
72
+ !!sidebars
73
+ end
70
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.12.0
4
+ version: 3.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-28 00:00:00.000000000 Z
11
+ date: 2024-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -187,6 +187,7 @@ files:
187
187
  - app/helpers/effective_menus_helper.rb
188
188
  - app/helpers/effective_page_banners_helper.rb
189
189
  - app/helpers/effective_page_sections_helper.rb
190
+ - app/helpers/effective_page_segments_helper.rb
190
191
  - app/helpers/effective_pages_helper.rb
191
192
  - app/helpers/effective_permalinks_helper.rb
192
193
  - app/helpers/effective_tags_helper.rb
@@ -196,6 +197,7 @@ files:
196
197
  - app/models/effective/page.rb
197
198
  - app/models/effective/page_banner.rb
198
199
  - app/models/effective/page_section.rb
200
+ - app/models/effective/page_segment.rb
199
201
  - app/models/effective/permalink.rb
200
202
  - app/models/effective/tag.rb
201
203
  - app/models/effective/tagging.rb
@@ -210,6 +212,7 @@ files:
210
212
  - app/views/admin/page_sections/_form.html.haml
211
213
  - app/views/admin/page_sections/_form_page_section.html.haml
212
214
  - app/views/admin/pages/_additional_fields.html.haml
215
+ - app/views/admin/pages/_fields_page_segments.html.haml
213
216
  - app/views/admin/pages/_form.html.haml
214
217
  - app/views/admin/pages/_form_access.html.haml
215
218
  - app/views/admin/pages/_form_menu.html.haml
@@ -224,6 +227,8 @@ files:
224
227
  - app/views/admin/tags/_form_tag.html.haml
225
228
  - app/views/effective/alerts/_alert.html.haml
226
229
  - app/views/effective/carousels/_carousel.html.haml
230
+ - app/views/effective/page_segments/_content.html.haml
231
+ - app/views/effective/page_segments/_menu.html.haml
227
232
  - app/views/effective/pages/_menu.html.haml
228
233
  - app/views/effective/pages/_page_menu.html.haml
229
234
  - app/views/effective/tags/_fields.html.haml