effective_pages 3.5.0 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/app/controllers/admin/permalinks_controller.rb +15 -0
  4. data/app/controllers/admin/taggings_controller.rb +8 -0
  5. data/app/controllers/admin/tags_controller.rb +13 -0
  6. data/app/controllers/effective/permalinks_controller.rb +21 -0
  7. data/app/datatables/admin/effective_taggings_datatable.rb +18 -0
  8. data/app/datatables/admin/effective_tags_datatable.rb +16 -0
  9. data/app/datatables/effective_permalinks_datatable.rb +18 -0
  10. data/app/helpers/effective_alerts_helper.rb +1 -0
  11. data/app/helpers/effective_permalinks_helper.rb +20 -0
  12. data/app/helpers/effective_tags_helper.rb +4 -0
  13. data/app/models/concerns/acts_as_tagged.rb +46 -0
  14. data/app/models/effective/page.rb +42 -0
  15. data/app/models/effective/permalink.rb +53 -0
  16. data/app/models/effective/tag.rb +27 -0
  17. data/app/models/effective/tagging.rb +26 -0
  18. data/app/views/admin/pages/_form.html.haml +3 -0
  19. data/app/views/admin/pages/_form_tags.html.haml +4 -0
  20. data/app/views/admin/permalinks/_form.html.haml +7 -0
  21. data/app/views/admin/permalinks/_form_permalink.html.haml +8 -0
  22. data/app/views/admin/taggings/_form.html.haml +3 -0
  23. data/app/views/admin/taggings/_form_tagging.html.haml +4 -0
  24. data/app/views/admin/tags/_form.html.haml +7 -0
  25. data/app/views/admin/tags/_form_tag.html.haml +4 -0
  26. data/app/views/effective/tags/_fields.html.haml +1 -0
  27. data/config/effective_pages.rb +3 -0
  28. data/config/locales/effective_pages.en.yml +4 -0
  29. data/config/routes.rb +11 -6
  30. data/db/migrate/01_create_effective_pages.rb.erb +26 -0
  31. data/lib/effective_pages/engine.rb +11 -0
  32. data/lib/effective_pages/version.rb +1 -1
  33. data/lib/effective_pages.rb +1 -1
  34. data/lib/generators/effective_pages/install_generator.rb +1 -0
  35. metadata +23 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf8ab6a872f5612cfc81a80d9a4616ef18ca85dc6b360e693fb24cd6039ced4e
4
- data.tar.gz: 903d3aec8b320e7a69e6cd01a971e2ef3c09f57ed38103e357e031b9fd418090
3
+ metadata.gz: 955cae35489cf5133d4e988126070fb86de48849bb75d832b2acc43fc709d1b8
4
+ data.tar.gz: dc820dc28af2c81dbfaa4158ce1196209ec173dab3f16255121dab37e87586eb
5
5
  SHA512:
6
- metadata.gz: d4c3f5328c83713f2efba331743bcd99870432f2ba9d5defcda5926a82c2ad6d124191fec7987cb87442cc6d681869d8a4ccbf917394657f4d30be940b208479
7
- data.tar.gz: 7a8fad535372027cd5b87b2b0f72508f26731d6e07b3d0ef7e6b6bb007396674306cbe9e8f37974ad134d577d65989036a7d7774331d08dec0345191a7f02e2a
6
+ metadata.gz: 1a5e86f7a5c65d13432dd2701b7366f5d1a0ab4a7032bc9cc81ba278fc57e5d2777e8b4f339d28a1a61a48ca996adb0473ccf6c54487c80e363600fd4fd4a4a7
7
+ data.tar.gz: e967b492ab869e6bd1f02f523317e30899dcffe14a1a767162af5d1d7bd8df195e306da9cabbc2cbfedb01b509b588c5e6bf16aad402d1aaa82b86fc2c82c8ee
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 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,8 @@
1
+ module Admin
2
+ class TaggingsController < ApplicationController
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_pages) }
5
+
6
+ include Effective::CrudController
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module Admin
2
+ class TagsController < 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
+ def permitted_params
9
+ params.require(:effective_tag).permit!
10
+ end
11
+
12
+ end
13
+ 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 Admin::EffectiveTaggingsDatatable < Effective::Datatable
2
+
3
+ datatable do
4
+ col :id, visible: false
5
+
6
+ col :tag
7
+ col :taggable
8
+
9
+ col :created_at
10
+
11
+ actions_col
12
+ end
13
+
14
+ collection do
15
+ Effective::Tagging.deep.all
16
+ end
17
+
18
+ end
@@ -0,0 +1,16 @@
1
+ class Admin::EffectiveTagsDatatable < Effective::Datatable
2
+
3
+ datatable do
4
+ col :id, visible: false
5
+ col :updated_at, visible: false
6
+
7
+ col :name
8
+
9
+ actions_col
10
+ end
11
+
12
+ collection do
13
+ Effective::Tag.deep.all
14
+ end
15
+
16
+ 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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module EffectiveAlertsHelper
3
4
 
4
5
  def effective_alerts
@@ -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,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EffectiveTagsHelper
4
+ end
@@ -0,0 +1,46 @@
1
+ module ActsAsTagged
2
+ extend ActiveSupport::Concern
3
+
4
+ module Base
5
+ def acts_as_tagged(*options)
6
+ @acts_as_tagged = options || []
7
+ include ::ActsAsTagged
8
+ end
9
+ end
10
+
11
+ included do
12
+ has_many :taggings, as: :taggable, class_name: 'Effective::Tagging', dependent: :delete_all
13
+
14
+ has_many :tags, through: :taggings, class_name: 'Effective::Tag'
15
+
16
+ accepts_nested_attributes_for :tags, reject_if: :all_blank, allow_destroy: true
17
+
18
+ #
19
+ # Create or assign tags based on the input
20
+ #
21
+ # @param [Array<String, Integer>] input An array of tag names and/or tag ids, with a possible blank string
22
+ #
23
+ # @return [void]
24
+ #
25
+ def tags=(input)
26
+ input = (input - ['']).group_by { |value| value.gsub(/\D/, '').to_i > 0 }
27
+
28
+ ids = (input[true] || []).map(&:to_i)
29
+ names = input[false] || []
30
+
31
+ # Delete any existing Tags that aren't in this array
32
+ tags.each { |tag| tag.mark_for_destruction unless ids.include?(tag.id) }
33
+
34
+ # Create any new Tags
35
+ ids.each do |tag_id|
36
+ taggings.find { |tagging| tagging.tag_id == tag_id } || self.tags << Effective::Tag.where(id: tag_id).first!
37
+ end
38
+
39
+ names.each { |name| self.tags.build(name: name) }
40
+ end
41
+ end
42
+
43
+ module ClassMethods
44
+ def acts_as_tagged?; true; end
45
+ end
46
+ 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
 
@@ -13,6 +46,7 @@ module Effective
13
46
 
14
47
  acts_as_role_restricted
15
48
  acts_as_slugged
49
+ acts_as_tagged
16
50
  has_many_rich_texts
17
51
 
18
52
  log_changes if respond_to?(:log_changes)
@@ -76,6 +110,14 @@ module Effective
76
110
  published.where(menu: false).or(published.where(menu: true).where.not(id: menu_root_with_children))
77
111
  }
78
112
 
113
+ # 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?
114
+ scope :paginate, -> (page: nil, per_page: nil) {
115
+ page = (page || 1).to_i
116
+ offset = [(page - 1), 0].max * per_page
117
+
118
+ limit(per_page).offset(offset)
119
+ }
120
+
79
121
  before_validation(if: -> { menu? && menu_position.blank? }) do
80
122
  self.menu_position = (self.class.where(menu_parent: menu_parent).maximum(:menu_position) || -1) + 1
81
123
  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,27 @@
1
+ module Effective
2
+ class Tag < ApplicationRecord
3
+ self.table_name = (EffectivePages.tags_table_name || :tags).to_s
4
+
5
+ log_changes if respond_to?(:log_changes)
6
+
7
+ has_many :taggings, class_name: 'Effective::Tagging', dependent: :delete_all
8
+
9
+ scope :deep, -> { all }
10
+ scope :sorted, -> { order(:name) }
11
+
12
+ effective_resource do
13
+ name :string
14
+
15
+ timestamps
16
+ end
17
+
18
+ validates :name, presence: true
19
+ validates :name, uniqueness: true
20
+
21
+ public
22
+
23
+ def to_s
24
+ name.presence || model_name.human
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module Effective
2
+ class Tagging < ApplicationRecord
3
+ self.table_name = (EffectivePages.taggings_table_name || :taggings).to_s
4
+
5
+ belongs_to :tag, class_name: 'Effective::Tag'
6
+ belongs_to :taggable, polymorphic: true
7
+
8
+ scope :deep, -> { all }
9
+
10
+ effective_resource do
11
+ tag_id :integer
12
+ taggable_id :integer
13
+ taggable_type :string
14
+
15
+ timestamps
16
+ end
17
+
18
+ validates :tag_id, uniqueness: { scope: [:taggable_type, :taggable_id] }
19
+
20
+ public
21
+
22
+ def to_s
23
+ name
24
+ end
25
+ end
26
+ end
@@ -16,3 +16,6 @@
16
16
 
17
17
  = tab 'Logs' do
18
18
  = render_datatable(page.log_changes_datatable, inline: true, namespace: :admin)
19
+
20
+ = tab 'Tags' do
21
+ = render '/admin/pages/form_tags', page: page
@@ -0,0 +1,4 @@
1
+ = effective_form_with(model: [:admin, page], engine: true) do |f|
2
+ = render 'effective/tags/fields', f: f
3
+
4
+ = f.submit
@@ -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,3 @@
1
+ = tabs do
2
+ = tab 'Tagged content' do
3
+ = render_datatable(EffectiveTaggingsDatatable.new, namespace: :admin)
@@ -0,0 +1,4 @@
1
+ = effective_form_with(model: [:admin, tagging], engine: true) do |f|
2
+ = f.text_field :name, hint: 'Tag ID'
3
+
4
+ = f.submit 'Save'
@@ -0,0 +1,7 @@
1
+ = tabs do
2
+ = tab 'Tag' do
3
+ = render '/admin/tags/form_tag', tag: tag
4
+
5
+ - if tag.persisted?
6
+ = tab 'Logs' do
7
+ = render_datatable(tag.log_changes_datatable, inline: true, namespace: :admin)
@@ -0,0 +1,4 @@
1
+ = effective_form_with(model: [:admin, tag], engine: true) do |f|
2
+ = f.text_field :name, hint: 'Tag name'
3
+
4
+ = f.submit 'Save'
@@ -0,0 +1 @@
1
+ = f.select :tag_ids, Effective::Tag.all, tags: true, hint: 'Select existing tags or type and hit Enter to create a new tag'
@@ -4,6 +4,9 @@ EffectivePages.setup do |config|
4
4
  config.page_banners_table_name = :page_banners
5
5
  config.carousel_items_table_name = :carousel_items
6
6
  config.alerts_table_name = :alerts
7
+ config.permalinks_table_name = :permalinks
8
+ config.tags_table_name = :tags
9
+ config.taggings_table_name = :taggings
7
10
 
8
11
  # The menu names a page can belong to
9
12
  config.menus = [:main, :footer]
@@ -2,3 +2,7 @@ en:
2
2
  effective_pages:
3
3
  name: 'Effective Pages'
4
4
  acronym: 'Pages'
5
+
6
+ activerecord:
7
+ models:
8
+ effective/tagging: 'Tagged content'
data/config/routes.rb CHANGED
@@ -2,15 +2,20 @@
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]
10
- resources :alerts, 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]
12
+ resources :tags, except: [:show]
13
+ resources :taggings, only: [:index]
11
14
  end
12
15
 
13
16
  scope module: 'effective' do
17
+ get '/permalinks/:slug', to: 'permalinks#redirect', as: :permalink_redirect
18
+
14
19
  match '*id', to: 'pages#show', via: :get, as: :page, constraints: lambda { |req|
15
20
  Effective::Page.find_by_slug_or_id(req.path_parameters[:id] || '/').present?
16
21
  }
@@ -81,6 +81,29 @@ class CreateEffectivePages < ActiveRecord::Migration[4.2]
81
81
  t.timestamps
82
82
  end
83
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
+
93
+ create_table <%= @tags_table_name %>, if_not_exists: true do |t|
94
+ t.string :name
95
+
96
+ t.timestamps
97
+ end
98
+
99
+ create_table <%= @taggings_table_name %>, if_not_exists: true do |t|
100
+ t.integer :tag_id
101
+ t.integer :taggable_id
102
+ t.string :taggable_type
103
+
104
+ t.timestamps
105
+ end
106
+
84
107
  end
85
108
 
86
109
  def self.down
@@ -89,6 +112,9 @@ class CreateEffectivePages < ActiveRecord::Migration[4.2]
89
112
  drop_table <%= @page_sections_table_name %>
90
113
  drop_table <%= @carousel_items_table_name %>
91
114
  drop_table <%= @alerts_table_name %>
115
+ drop_table <%= @permalinks_table_name %>
116
+ drop_table <%= @tags_table_name %>
117
+ drop_table <%= @taggings_table_name %>
92
118
  end
93
119
 
94
120
  end
@@ -2,6 +2,15 @@ module EffectivePages
2
2
  class Engine < ::Rails::Engine
3
3
  engine_name 'effective_pages'
4
4
 
5
+ # Include acts_as_tagged concern and allow any ActiveRecord object to call it
6
+ initializer 'effective_pages.active_record' do |app|
7
+ app.config.to_prepare do
8
+ ActiveSupport.on_load :active_record do
9
+ ActiveRecord::Base.extend(ActsAsTagged::Base)
10
+ end
11
+ end
12
+ end
13
+
5
14
  # Include Helpers to base application
6
15
  initializer 'effective_pages.action_controller' do |app|
7
16
  app.config.to_prepare do
@@ -12,6 +21,8 @@ module EffectivePages
12
21
  helper EffectivePageBannersHelper
13
22
  helper EffectiveMenusHelper
14
23
  helper EffectiveAlertsHelper
24
+ helper EffectivePermalinksHelper
25
+ helper EffectiveTagsHelper
15
26
  end
16
27
  end
17
28
  end
@@ -1,3 +1,3 @@
1
1
  module EffectivePages
2
- VERSION = '3.5.0'.freeze
2
+ VERSION = '3.7.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, :alerts_table_name,
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,
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,
@@ -25,6 +25,7 @@ module EffectivePages
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
27
  @alerts_table_name = ':' + EffectivePages.alerts_table_name.to_s
28
+ @permalinks_table_name = ':' + EffectivePages.permalinks_table_name.to_s
28
29
 
29
30
  migration_template ('../' * 3) + 'db/migrate/01_create_effective_pages.rb.erb', 'db/migrate/create_effective_pages.rb'
30
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.5.0
4
+ version: 3.7.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-06-01 00:00:00.000000000 Z
11
+ date: 2023-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -84,24 +84,37 @@ files:
84
84
  - app/controllers/admin/page_banners_controller.rb
85
85
  - app/controllers/admin/page_sections_controller.rb
86
86
  - app/controllers/admin/pages_controller.rb
87
+ - app/controllers/admin/permalinks_controller.rb
88
+ - app/controllers/admin/taggings_controller.rb
89
+ - app/controllers/admin/tags_controller.rb
87
90
  - app/controllers/effective/pages_controller.rb
91
+ - app/controllers/effective/permalinks_controller.rb
92
+ - app/datatables/admin/effective_taggings_datatable.rb
93
+ - app/datatables/admin/effective_tags_datatable.rb
88
94
  - app/datatables/effective_alerts_datatable.rb
89
95
  - app/datatables/effective_carousel_items_datatable.rb
90
96
  - app/datatables/effective_page_banners_datatable.rb
91
97
  - app/datatables/effective_page_sections_datatable.rb
92
98
  - app/datatables/effective_pages_datatable.rb
93
99
  - app/datatables/effective_pages_menu_datatable.rb
100
+ - app/datatables/effective_permalinks_datatable.rb
94
101
  - app/helpers/effective_alerts_helper.rb
95
102
  - app/helpers/effective_carousels_helper.rb
96
103
  - app/helpers/effective_menus_helper.rb
97
104
  - app/helpers/effective_page_banners_helper.rb
98
105
  - app/helpers/effective_page_sections_helper.rb
99
106
  - app/helpers/effective_pages_helper.rb
107
+ - app/helpers/effective_permalinks_helper.rb
108
+ - app/helpers/effective_tags_helper.rb
109
+ - app/models/concerns/acts_as_tagged.rb
100
110
  - app/models/effective/alert.rb
101
111
  - app/models/effective/carousel_item.rb
102
112
  - app/models/effective/page.rb
103
113
  - app/models/effective/page_banner.rb
104
114
  - app/models/effective/page_section.rb
115
+ - app/models/effective/permalink.rb
116
+ - app/models/effective/tag.rb
117
+ - app/models/effective/tagging.rb
105
118
  - app/views/admin/alerts/_form.html.haml
106
119
  - app/views/admin/alerts/_form_alert.html.haml
107
120
  - app/views/admin/carousel_items/_form.html.haml
@@ -117,11 +130,19 @@ files:
117
130
  - app/views/admin/pages/_form_access.html.haml
118
131
  - app/views/admin/pages/_form_menu.html.haml
119
132
  - app/views/admin/pages/_form_page.html.haml
133
+ - app/views/admin/pages/_form_tags.html.haml
120
134
  - app/views/admin/pages/_rich_text_areas.html.haml
135
+ - app/views/admin/permalinks/_form.html.haml
136
+ - app/views/admin/permalinks/_form_permalink.html.haml
137
+ - app/views/admin/taggings/_form.html.haml
138
+ - app/views/admin/taggings/_form_tagging.html.haml
139
+ - app/views/admin/tags/_form.html.haml
140
+ - app/views/admin/tags/_form_tag.html.haml
121
141
  - app/views/effective/alerts/_alert.html.haml
122
142
  - app/views/effective/carousels/_carousel.html.haml
123
143
  - app/views/effective/pages/_menu.html.haml
124
144
  - app/views/effective/pages/_page_menu.html.haml
145
+ - app/views/effective/tags/_fields.html.haml
125
146
  - app/views/layouts/_google_analytics.html.erb
126
147
  - config/effective_pages.rb
127
148
  - config/locales/effective_pages.en.yml