effective_pages 3.4.13 → 3.6.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: 370a0872726ab5cc18dca40bf8bdafaef20ac8cfc145600fa1679abe2253059f
4
- data.tar.gz: e9e3de8d9fd1e68ee1421a96cf6a0fb15af8014421edf95493e2146d067e8f26
3
+ metadata.gz: 1a4bbe810bd4f30ca02c101c48465763f4c6f246bb2e89afa70ddb79e117df8b
4
+ data.tar.gz: a8780dabcf25e0403836da65af42af2497c120cbd6fa9b67388d2f66c24b2e74
5
5
  SHA512:
6
- metadata.gz: 16f78050a37aa5785fea91281c439dd6ad275377374969569f4e5d9b34b8b287b9d930494eb91b7481f6ac29a57a42e52ea8ededfeb5775928c7e1b32188c034
7
- data.tar.gz: cbea464d3c44f65a05b0d20bad91ea2e18d12c40968885f09fcfa9f4d80605148dfee04c3cb3e0364e72b4328de82a332a4f1f1add499278568d9d1ba749edc6
6
+ metadata.gz: 612e18117979fdc36a5eaf6db3db0041ec2192006a7965d23357efd56fd18f6976cfefb95eeb4159ad16db765e9a275d06abd235abd0d062aab2bd34288123ae
7
+ data.tar.gz: 301c723e79df66b45159ac505badabea9eac1ea68bd56eda0c57ef57ae4f9d1f6a47418c18bd985c9a75fada67ec20df6317f17a8483d1a0ce8fe96049a7b588
data/README.md CHANGED
@@ -211,6 +211,10 @@ if user.is?(:admin)
211
211
  end
212
212
  ```
213
213
 
214
+ ## Search
215
+
216
+ If you use `pg_search` then `Effective::Pages` will be also included on its `multisearch` by default, allowing you to search across all pages.
217
+
214
218
  ## License
215
219
 
216
220
  MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
@@ -0,0 +1,15 @@
1
+ module Admin
2
+ class AlertsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_pages) }
5
+
6
+ include Effective::CrudController
7
+
8
+ page_title 'Alerts'
9
+
10
+ def permitted_params
11
+ params.require(:effective_alert).permit!
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Admin
2
+ class PermalinksController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_pages) }
5
+
6
+ include Effective::CrudController
7
+
8
+ page_title 'Permalinks'
9
+
10
+ def permitted_params
11
+ params.require(:effective_permalink).permit!
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module Effective
2
+ class PermalinksController < ApplicationController
3
+ def redirect
4
+ @permalink = Effective::Permalink.find_by! slug: params[:slug]
5
+
6
+ authorize! :redirect, @permalink
7
+
8
+ redirect_to redirect_path_for(@permalink), allow_other_host: (@permalink.target == :url)
9
+ end
10
+
11
+ private
12
+
13
+ def redirect_path_for(permalink)
14
+ permalink.target == :attachment ? attachment_url(permalink.attachment) : permalink.url
15
+ end
16
+
17
+ def attachment_url(permalink)
18
+ Rails.application.routes.url_helpers.rails_blob_path(permalink, only_path: true)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ class EffectiveAlertsDatatable < Effective::Datatable
2
+
3
+ datatable do
4
+ col :id, visible: false
5
+ col :updated_at, visible: false
6
+
7
+ col :enabled
8
+
9
+ col :rich_text_body, label: 'Content'
10
+
11
+ actions_col
12
+ end
13
+
14
+ collection do
15
+ Effective::Alert.deep.all
16
+ end
17
+
18
+ end
@@ -0,0 +1,18 @@
1
+ class EffectivePermalinksDatatable < Effective::Datatable
2
+
3
+ datatable do
4
+ col :id, visible: false
5
+ col :updated_at, visible: false
6
+
7
+ col :title
8
+ col :slug
9
+ col :summary
10
+
11
+ actions_col
12
+ end
13
+
14
+ collection do
15
+ Effective::Permalink.deep.all
16
+ end
17
+
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EffectiveAlertsHelper
4
+
5
+ def effective_alerts
6
+ @_effective_alerts ||= Effective::Alert.all.enabled
7
+ end
8
+
9
+ def render_effective_alerts
10
+ effective_alerts
11
+ .map { |alert| render 'effective/alerts/alert', alert: alert }
12
+ .join
13
+ .html_safe
14
+ end
15
+
16
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EffectivePermalinksHelper
4
+
5
+ def permalinks
6
+ @_effective_permalinks ||= Effective::Permalink.deep.order(:id)
7
+ end
8
+
9
+ def permalink_to(permalink_or_slug, options = {})
10
+ permalink =
11
+ if permalink_or_slug.kind_of?(String)
12
+ Effective::Permalink.find_by(slug: slug)
13
+ else
14
+ permalink_or_slug
15
+ end
16
+
17
+ link_to permalink, permalink.redirect_path, options
18
+ end
19
+
20
+ end
@@ -0,0 +1,25 @@
1
+ module Effective
2
+ class Alert < ApplicationRecord
3
+ self.table_name = (EffectivePages.alerts_table_name || :alerts).to_s
4
+
5
+ log_changes if respond_to?(:log_changes)
6
+
7
+ has_rich_text :body
8
+
9
+ effective_resource do
10
+ enabled :boolean
11
+
12
+ timestamps
13
+ end
14
+
15
+ scope :deep, -> { with_rich_text_body }
16
+ scope :enabled, -> { where(enabled: true) }
17
+
18
+ validates :body, presence: true
19
+
20
+ def to_s
21
+ 'alert'
22
+ end
23
+
24
+ end
25
+ end
@@ -1,5 +1,38 @@
1
1
  module Effective
2
2
  class Page < ActiveRecord::Base
3
+ if defined?(PgSearch)
4
+ include PgSearch::Model
5
+
6
+ pg_search_scope :search,
7
+ against: [
8
+ :title,
9
+ :menu_title,
10
+ :meta_description,
11
+ :slug,
12
+ ],
13
+ associated_against: {
14
+ rich_texts: [:body],
15
+ },
16
+ using: { tsearch: { highlight: true }, trigram: { word_similarity: true } }
17
+
18
+ multisearchable against: [
19
+ :title,
20
+ :menu_title,
21
+ :meta_description,
22
+ :slug,
23
+ ],
24
+ associated_against: {
25
+ rich_texts: [:body],
26
+ },
27
+ using: {
28
+ trigram: {},
29
+ tsearch: {
30
+ highlight: true,
31
+ }
32
+ },
33
+ ranked_by: ":trigram" # Could rank by any column/expression, e.g.: (books.num_pages * :trigram) + (:tsearch / 2.0)
34
+ end
35
+
3
36
  attr_accessor :current_user
4
37
  attr_accessor :menu_root_level
5
38
 
@@ -76,6 +109,14 @@ module Effective
76
109
  published.where(menu: false).or(published.where(menu: true).where.not(id: menu_root_with_children))
77
110
  }
78
111
 
112
+ # Maybe change paginate to be an isolated function instead of a scope, so we can use it with PgSearch::Document when doing a whole app search?
113
+ scope :paginate, -> (page: nil, per_page: nil) {
114
+ page = (page || 1).to_i
115
+ offset = [(page - 1), 0].max * per_page
116
+
117
+ limit(per_page).offset(offset)
118
+ }
119
+
79
120
  before_validation(if: -> { menu? && menu_position.blank? }) do
80
121
  self.menu_position = (self.class.where(menu_parent: menu_parent).maximum(:menu_position) || -1) + 1
81
122
  end
@@ -0,0 +1,53 @@
1
+ module Effective
2
+ class Permalink < ApplicationRecord
3
+ self.table_name = (EffectivePages.permalinks_table_name || :permalinks).to_s
4
+
5
+ has_one_attached :attachment
6
+ has_one_purgable :attachment
7
+
8
+ acts_as_slugged
9
+
10
+ log_changes if respond_to?(:log_changes)
11
+
12
+ scope :deep, -> { with_attached_attachment }
13
+
14
+ effective_resource do
15
+ title :string
16
+ slug :string
17
+
18
+ url :string
19
+
20
+ summary :text
21
+
22
+ timestamps
23
+ end
24
+
25
+ validate :attachment_and_url_cannot_both_be_present
26
+
27
+ validates :title, presence: true
28
+ validates :attachment, presence: true, if: -> { url.blank? }
29
+ validates :url, presence: true, if: -> { attachment.blank? }, url: true
30
+
31
+ public
32
+
33
+ def to_s
34
+ title.presence || model_name.human
35
+ end
36
+
37
+ def redirect_path
38
+ "/permalinks/#{slug}"
39
+ end
40
+
41
+ def target
42
+ url.present? ? :url : :attachment
43
+ end
44
+
45
+ private
46
+
47
+ def attachment_and_url_cannot_both_be_present
48
+ if url.present? && (attachment.attached? && !attachment.marked_for_destruction?)
49
+ self.errors.add(:base, 'Attachment and URL cannot both be present')
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,7 @@
1
+ = tabs do
2
+ = tab 'Alert' do
3
+ = render '/admin/alerts/form_alert', alert: alert
4
+
5
+ - if alert.persisted?
6
+ = tab 'Logs' do
7
+ = render_datatable(alert.log_changes_datatable, inline: true, namespace: :admin)
@@ -0,0 +1,9 @@
1
+ = effective_form_with(model: [:admin, alert], engine: true) do |f|
2
+ = f.check_box :enabled, hint: 'Toggle activation of this alert'
3
+
4
+ - if defined?(EffectiveArticleEditor)
5
+ = f.article_editor :body, label: 'Content', hint: 'Content to be displayed'
6
+ - else
7
+ = f.rich_text_area :body, label: 'Content', hint: 'Content to be displayed'
8
+
9
+ = effective_submit(f)
@@ -0,0 +1,7 @@
1
+ = tabs do
2
+ = tab 'Permalink' do
3
+ = render '/admin/permalinks/form_permalink', permalink: permalink
4
+
5
+ - if permalink.persisted?
6
+ = tab 'Logs' do
7
+ = render_datatable(permalink.log_changes_datatable, inline: true, namespace: :admin)
@@ -0,0 +1,8 @@
1
+ = effective_form_with(model: [:admin, permalink], engine: true) do |f|
2
+ = f.text_field :title, required: true, hint: 'Title of the permalink to be displayed'
3
+ = f.text_field :slug, required: true, hint: 'Slug for link of the permalink'
4
+ = f.text_field :summary, required: true, hint: 'Summary explanation of the permalink not displayed'
5
+ = f.url_field :url, required: false, hint: 'The link if redirecting to a website or specific page'
6
+ = f.file_field :attachment, required: false, hint: 'The attachment of the permalink if redirecting to a document, image or other file'
7
+
8
+ = effective_submit(f)
@@ -0,0 +1,4 @@
1
+ %div{class: "alert alert-warning", role: 'alert'}
2
+ .container
3
+ .row
4
+ .col= alert.body
@@ -3,6 +3,8 @@ EffectivePages.setup do |config|
3
3
  config.page_sections_table_name = :page_sections
4
4
  config.page_banners_table_name = :page_banners
5
5
  config.carousel_items_table_name = :carousel_items
6
+ config.alerts_table_name = :alerts
7
+ config.permalinks_table_name = :permalinks
6
8
 
7
9
  # The menu names a page can belong to
8
10
  config.menus = [:main, :footer]
data/config/routes.rb CHANGED
@@ -2,14 +2,18 @@
2
2
 
3
3
  EffectivePages::Engine.routes.draw do
4
4
  namespace :admin do
5
- resources :pages, except: [:show]
6
- resources :page_sections, only: [:index, :edit, :update]
7
- resources :page_banners, except: [:show]
8
- resources :menus, only: [:index]
9
- resources :carousel_items, except: [:show]
5
+ resources :pages, except: [:show]
6
+ resources :page_sections, only: [:index, :edit, :update]
7
+ resources :page_banners, except: [:show]
8
+ resources :menus, only: [:index]
9
+ resources :carousel_items, except: [:show]
10
+ resources :alerts, except: [:show]
11
+ resources :permalinks, except: [:show]
10
12
  end
11
13
 
12
14
  scope module: 'effective' do
15
+ get '/permalinks/:slug', to: 'permalinks#redirect', as: :permalink_redirect
16
+
13
17
  match '*id', to: 'pages#show', via: :get, as: :page, constraints: lambda { |req|
14
18
  Effective::Page.find_by_slug_or_id(req.path_parameters[:id] || '/').present?
15
19
  }
@@ -75,6 +75,21 @@ class CreateEffectivePages < ActiveRecord::Migration[4.2]
75
75
  t.timestamps
76
76
  end
77
77
 
78
+ create_table <%= @alerts_table_name %>, if_not_exists: true do |t|
79
+ t.boolean :enabled
80
+
81
+ t.timestamps
82
+ end
83
+
84
+ create_table <%= @permalinks_table_name %>, if_not_exists: true do |t|
85
+ t.string :title
86
+ t.string :slug
87
+ t.string :url
88
+ t.text :summary
89
+
90
+ t.timestamps
91
+ end
92
+
78
93
  end
79
94
 
80
95
  def self.down
@@ -82,6 +97,8 @@ class CreateEffectivePages < ActiveRecord::Migration[4.2]
82
97
  drop_table <%= @page_banners_table_name %>
83
98
  drop_table <%= @page_sections_table_name %>
84
99
  drop_table <%= @carousel_items_table_name %>
100
+ drop_table <%= @alerts_table_name %>
101
+ drop_table <%= @permalinks_table_name %>
85
102
  end
86
103
 
87
104
  end
@@ -11,6 +11,8 @@ module EffectivePages
11
11
  helper EffectivePageSectionsHelper
12
12
  helper EffectivePageBannersHelper
13
13
  helper EffectiveMenusHelper
14
+ helper EffectiveAlertsHelper
15
+ helper EffectivePermalinksHelper
14
16
  end
15
17
  end
16
18
  end
@@ -1,3 +1,3 @@
1
1
  module EffectivePages
2
- VERSION = '3.4.13'.freeze
2
+ VERSION = '3.6.0'.freeze
3
3
  end
@@ -7,7 +7,7 @@ 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,
10
+ :pages_table_name, :page_sections_table_name, :page_banners_table_name, :carousel_items_table_name, :alerts_table_name, :permalinks_table_name,
11
11
  :pages_path, :excluded_pages, :layouts_path, :excluded_layouts,
12
12
  :site_og_image, :site_og_image_width, :site_og_image_height,
13
13
  :site_title, :site_title_suffix, :fallback_meta_description, :google_analytics_code,
@@ -24,6 +24,8 @@ module EffectivePages
24
24
  @page_sections_table_name = ':' + EffectivePages.page_sections_table_name.to_s
25
25
  @page_banners_table_name = ':' + EffectivePages.page_banners_table_name.to_s
26
26
  @carousel_items_table_name = ':' + EffectivePages.carousel_items_table_name.to_s
27
+ @alerts_table_name = ':' + EffectivePages.alerts_table_name.to_s
28
+ @permalinks_table_name = ':' + EffectivePages.permalinks_table_name.to_s
27
29
 
28
30
  migration_template ('../' * 3) + 'db/migrate/01_create_effective_pages.rb.erb', 'db/migrate/create_effective_pages.rb'
29
31
  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.4.13
4
+ version: 3.6.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: 2023-05-31 00:00:00.000000000 Z
11
+ date: 2023-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -78,26 +78,37 @@ files:
78
78
  - app/assets/config/effective_pages_manifest.js
79
79
  - app/assets/javascripts/effective_pages.js
80
80
  - app/assets/javascripts/effective_pages/google_analytics.js
81
+ - app/controllers/admin/alerts_controller.rb
81
82
  - app/controllers/admin/carousel_items_controller.rb
82
83
  - app/controllers/admin/menus_controller.rb
83
84
  - app/controllers/admin/page_banners_controller.rb
84
85
  - app/controllers/admin/page_sections_controller.rb
85
86
  - app/controllers/admin/pages_controller.rb
87
+ - app/controllers/admin/permalinks_controller.rb
86
88
  - app/controllers/effective/pages_controller.rb
89
+ - app/controllers/effective/permalinks_controller.rb
90
+ - app/datatables/effective_alerts_datatable.rb
87
91
  - app/datatables/effective_carousel_items_datatable.rb
88
92
  - app/datatables/effective_page_banners_datatable.rb
89
93
  - app/datatables/effective_page_sections_datatable.rb
90
94
  - app/datatables/effective_pages_datatable.rb
91
95
  - app/datatables/effective_pages_menu_datatable.rb
96
+ - app/datatables/effective_permalinks_datatable.rb
97
+ - app/helpers/effective_alerts_helper.rb
92
98
  - app/helpers/effective_carousels_helper.rb
93
99
  - app/helpers/effective_menus_helper.rb
94
100
  - app/helpers/effective_page_banners_helper.rb
95
101
  - app/helpers/effective_page_sections_helper.rb
96
102
  - app/helpers/effective_pages_helper.rb
103
+ - app/helpers/effective_permalinks_helper.rb
104
+ - app/models/effective/alert.rb
97
105
  - app/models/effective/carousel_item.rb
98
106
  - app/models/effective/page.rb
99
107
  - app/models/effective/page_banner.rb
100
108
  - app/models/effective/page_section.rb
109
+ - app/models/effective/permalink.rb
110
+ - app/views/admin/alerts/_form.html.haml
111
+ - app/views/admin/alerts/_form_alert.html.haml
101
112
  - app/views/admin/carousel_items/_form.html.haml
102
113
  - app/views/admin/carousel_items/_form_carousel_item.html.haml
103
114
  - app/views/admin/carousel_items/index.html.haml
@@ -112,6 +123,9 @@ files:
112
123
  - app/views/admin/pages/_form_menu.html.haml
113
124
  - app/views/admin/pages/_form_page.html.haml
114
125
  - app/views/admin/pages/_rich_text_areas.html.haml
126
+ - app/views/admin/permalinks/_form.html.haml
127
+ - app/views/admin/permalinks/_form_permalink.html.haml
128
+ - app/views/effective/alerts/_alert.html.haml
115
129
  - app/views/effective/carousels/_carousel.html.haml
116
130
  - app/views/effective/pages/_menu.html.haml
117
131
  - app/views/effective/pages/_page_menu.html.haml