effective_pages 3.11.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f608a5aa1318fab93ca116d9edea04aeb3a2077ecbcd41378dad81b3fb3018a5
4
- data.tar.gz: 803a6fbc21a969464faf8d149b724d1a65b1b970e2a4b2e5ac57ddd17cf02e87
3
+ metadata.gz: 77904dcc5dcbdb4b61099c85b7ca2e201796a74a5018251eeebe66f3fcdf1128
4
+ data.tar.gz: 39d9c4b11d21ebdc73b31ddbd8925791a2a3bba78e5e839f15880f8fa7af4477
5
5
  SHA512:
6
- metadata.gz: 482a07502489d6b6e6494bc6bf17f5b17c82ee05a68f500b85a33d380b71abc49074c371f556816b60142f131d523f46a3f66271c0ea69094dda69fb147523aa
7
- data.tar.gz: dd26dfe9186dc3d1e8408f42967431a3e94d8db2882d8c96f7d53deb9103bb8af0888ccbd5bd247c52a5ba99ff9f0caf8d141caa037d478d5cb5aa98fee64e0b
6
+ metadata.gz: 57fccf986d7b3279e0dd3f5bacd365841fe4b45db2d828de068eb8504f2da54f07a3005ae63951ebb621aca623ade13ede050b22b62c7cbe86278a4262ffd015
7
+ data.tar.gz: e290da633e3cc9cf3b08081457ea7e5218cbab17364fc6906ddd4f63c16f58b8ee86232f2f27fc097038b61847a192cf531896c3a328e7c71f5b1bc7a350a584
@@ -20,7 +20,10 @@ class EffectivePagesDatatable < Effective::Datatable
20
20
  link_to(page.slug, effective_pages.page_path(page), target: '_blank')
21
21
  end
22
22
 
23
- col :draft
23
+ col :draft?, as: :boolean, visible: false
24
+ col :published?, as: :boolean
25
+ col :published_start_at
26
+ col :published_end_at
24
27
 
25
28
  col :layout, visible: false
26
29
  col :tempate, visible: false
@@ -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,19 +19,24 @@ 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
- acts_as_role_restricted
23
- acts_as_paginable if respond_to?(:acts_as_paginable) # Effective Resources
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
+
25
+ acts_as_role_restricted if respond_to?(:acts_as_role_restricted)
26
+ acts_as_paginable
27
+ acts_as_published
24
28
  acts_as_slugged
25
29
  acts_as_tagged
26
30
  has_many_rich_texts
27
-
28
31
  log_changes if respond_to?(:log_changes)
29
32
 
30
33
  effective_resource do
31
34
  title :string
32
35
  meta_description :string
33
36
 
34
- draft :boolean
37
+ published_start_at :datetime
38
+ published_end_at :datetime
39
+ legacy_draft :boolean # No longer used. To be removed.
35
40
 
36
41
  layout :string
37
42
  template :string
@@ -68,9 +73,6 @@ module Effective
68
73
  }
69
74
 
70
75
  scope :deep_menuable, -> { includes(:menu_parent, menu_children: [:menu_parent, :menu_children]) }
71
-
72
- scope :draft, -> { where(draft: true) }
73
- scope :published, -> { where(draft: false) }
74
76
  scope :sorted, -> { order(:title) }
75
77
 
76
78
  scope :on_menu, -> { where(menu: true) }
@@ -138,7 +140,7 @@ module Effective
138
140
  end
139
141
 
140
142
  def to_s
141
- title
143
+ title.presence || model_name.human
142
144
  end
143
145
 
144
146
  def menu_to_s
@@ -154,10 +156,6 @@ module Effective
154
156
  rich_text_sidebar
155
157
  end
156
158
 
157
- def published?
158
- !draft?
159
- end
160
-
161
159
  # Returns a duplicated post object, or throws an exception
162
160
  def duplicate
163
161
  Page.new(attributes.except('id', 'updated_at', 'created_at')).tap do |page|
@@ -168,7 +166,7 @@ module Effective
168
166
  page.send("rich_text_#{rt.name}=", rt.body)
169
167
  end
170
168
 
171
- page.draft = true
169
+ page.assign_attributes(published_start_at: nil, published_end_at: nil)
172
170
  end
173
171
  end
174
172
 
@@ -206,6 +204,9 @@ module Effective
206
204
  menu_children_count <= 0
207
205
  end
208
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
209
211
  end
210
-
211
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,9 +1,15 @@
1
1
  = effective_form_with(model: [:admin, page], engine: true) do |f|
2
-
3
2
  = f.text_field :title
4
3
 
5
- = f.check_box :draft,
6
- label: 'Save this page as a draft. It will not appear in a menu and can only be accessed by admin users.'
4
+ -# acts_as_published
5
+ = f.hide_if(:save_as_draft, true) do
6
+ .row
7
+ .col-md-6
8
+ = f.datetime_field :published_start_at, hint: 'The page will be available starting on this date and time. Leave blank to publish immediately.'
9
+ .col-md-6
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
11
+
12
+ = f.check_box :save_as_draft, label: "Save as a draft. It will not appear in a menu and can only be accessed by admin users."
7
13
 
8
14
  = f.text_field :meta_description,
9
15
  hint: "150 character summary. Appears on Google search results underneath the page title. ",
@@ -42,7 +48,6 @@
42
48
 
43
49
  = f.select :page_banner_id, Effective::PageBanner.sorted.all, label: 'Choose a page banner'
44
50
 
45
-
46
51
  = render partial: '/admin/pages/additional_fields', locals: { page: page, form: f, f: f }
47
52
 
48
53
  - if f.object.persisted? && f.object.menu_root_with_children?
@@ -61,4 +66,8 @@
61
66
  - if f.object.new_record? && f.object.rich_texts.present?
62
67
  = render '/admin/pages/rich_text_areas', page: page, f: f
63
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
+
64
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
@@ -6,7 +6,9 @@ class CreateEffectivePages < ActiveRecord::Migration[6.0]
6
6
  t.string :title
7
7
  t.string :meta_description
8
8
 
9
- t.boolean :draft, default: false
9
+ t.datetime :published_start_at
10
+ t.datetime :published_end_at
11
+ t.boolean :legacy_draft, default: false
10
12
 
11
13
  t.string :layout, default: 'application'
12
14
  t.string :template
@@ -63,6 +65,16 @@ class CreateEffectivePages < ActiveRecord::Migration[6.0]
63
65
 
64
66
  add_index :page_sections, :name, :unique => true
65
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
+
66
78
  create_table :carousel_items do |t|
67
79
  t.string :carousel
68
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.11.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.11.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-27 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