effective_pages 3.5.0 → 3.7.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.
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