tkh_content 0.1.6 → 0.1.7

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.
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
 
4
4
 
5
+ ## 0.1.7
6
+
7
+ * Added tags to blog
8
+ * Added autocompletion of parent page field in page form
9
+
10
+
5
11
  ## 0.1.6
6
12
 
7
13
  * Added inline HTML editor to the pages form
@@ -0,0 +1,2 @@
1
+ jQuery ->
2
+ $('.typeahead').typeahead()
@@ -1,7 +1,11 @@
1
1
  class BlogController < ApplicationController
2
2
 
3
3
  def index
4
- @posts = Page.for_blog.published.order('published_at desc').paginate(:page => params[:page], :per_page => 20)
4
+ unless params[:tag]
5
+ @posts = Page.for_blog.published.order('published_at desc').paginate(:page => params[:page], :per_page => 20)
6
+ else
7
+ @posts = Page.for_blog.published.tagged_with(params[:tag]).order('published_at desc').paginate(:page => params[:page], :per_page => 20)
8
+ end
5
9
  # respond_to
6
10
  render :layout => 'blog'
7
11
  end
@@ -15,11 +15,13 @@ class PagesController < ApplicationController
15
15
 
16
16
  def new
17
17
  @page = Page.new
18
+ page_autocomplete_items
18
19
  switch_to_admin_layout
19
20
  end
20
21
 
21
22
  def edit
22
23
  @page = Page.find(params[:id])
24
+ page_autocomplete_items
23
25
  switch_to_admin_layout
24
26
  end
25
27
 
@@ -74,4 +76,10 @@ class PagesController < ApplicationController
74
76
  redirect_to pages_path notice: "The blog status of the page has been changed"
75
77
  end
76
78
 
79
+ private
80
+
81
+ def page_autocomplete_items
82
+ @autocomplete_items = Page.published.not_for_blog.by_title.map(&:title)
83
+ end
84
+
77
85
  end
@@ -0,0 +1,11 @@
1
+ module BlogHelper
2
+
3
+ def tag_cloud(tags, classes)
4
+ max = tags.sort_by(&:count).last
5
+ tags.alphabetically.each do |tag|
6
+ index = tag.count.to_f / max.count * (classes.size - 1)
7
+ yield(tag, classes[index.round])
8
+ end
9
+ end
10
+
11
+ end
data/app/models/page.rb CHANGED
@@ -7,7 +7,10 @@ class Page < ActiveRecord::Base
7
7
 
8
8
  belongs_to :author, class_name: 'User', foreign_key: 'author_id'
9
9
 
10
- attr_accessible :title, :short_title, :description, :body, :for_blog, :parent_id
10
+ attr_accessible :title, :short_title, :description, :body, :for_blog, :parent_id, :tag_list, :parent_page_title
11
+
12
+ has_many :taggings
13
+ has_many :tags, through: :taggings
11
14
 
12
15
  validates_presence_of :title
13
16
  validates_presence_of :description
@@ -28,21 +31,24 @@ class Page < ActiveRecord::Base
28
31
  # tree scopes
29
32
  scope :orphans, where('parent_id IS ?', nil)
30
33
  scope :with_parent_id, lambda { |id| where('parent_id = ?', id) }
34
+ scope :by_title, order('title')
31
35
 
32
36
  def nickname
33
37
  short_title || title
34
38
  end
35
39
 
40
+ ### menu related instance methods
41
+
36
42
  def orphan?
37
43
  parent_id == nil
38
44
  end
39
45
 
40
46
  def has_children?
41
- Page.with_parent_id(id).count >= 1
47
+ Page.with_parent_id(id).published.count >= 1
42
48
  end
43
49
 
44
50
  def children
45
- Page.with_parent_id(id)
51
+ Page.published.with_parent_id(id)
46
52
  end
47
53
 
48
54
  def parent
@@ -50,11 +56,46 @@ class Page < ActiveRecord::Base
50
56
  end
51
57
 
52
58
  def has_siblings?
53
- Page.with_parent_id(parent_id).count >= 1
59
+ Page.with_parent_id(parent_id).published.count >= 1
54
60
  end
55
61
 
56
62
  def siblings
57
- Page.with_parent_id(parent_id)
63
+ Page.published.with_parent_id(parent_id)
64
+ end
65
+
66
+ ### tagging related methods
67
+
68
+ def self.tagged_with(name)
69
+ Tag.find_by_name!(name).pages
70
+ end
71
+
72
+ def self.tag_counts
73
+ Tag.select("tags.*, count(taggings.tag_id) as count").
74
+ joins(:taggings).group("taggings.tag_id")
75
+ end
76
+
77
+ def tag_list
78
+ tags.map(&:name).join(" ")
79
+ end
80
+
81
+ def tag_list=(names)
82
+ self.tags = names.split(" ").map do |n|
83
+ Tag.where(name: n.strip).first_or_create!
84
+ end
85
+ end
86
+
87
+ ### autocomplete related instance methods
88
+
89
+ def parent_page_title
90
+ parent.try(:title) unless self.orphan?
91
+ end
92
+
93
+ def parent_page_title=(title)
94
+ if title.present? && Page.find_by_title(title)
95
+ self.parent_id = Page.find_by_title(title).id
96
+ else
97
+ self.parent_id = nil
98
+ end
58
99
  end
59
100
 
60
101
  end
data/app/models/tag.rb ADDED
@@ -0,0 +1,23 @@
1
+ # this is needed for now to make mass assignment security compatible with the translation of globalize3
2
+ Globalize::ActiveRecord::Translation.class_eval do
3
+ attr_accessible :locale
4
+ end
5
+
6
+ class Tag < ActiveRecord::Base
7
+
8
+ attr_accessible :name
9
+
10
+ has_many :taggings
11
+ has_many :pages, through: :taggings
12
+
13
+ translates :name
14
+
15
+ scope :alphabetically, order('name')
16
+
17
+ def to_param
18
+ name ? "#{id}-#{name.to_url}" : id
19
+ end
20
+
21
+ end
22
+
23
+
@@ -0,0 +1,6 @@
1
+ class Tagging < ActiveRecord::Base
2
+
3
+ belongs_to :page, touch: true
4
+ belongs_to :tag
5
+
6
+ end
@@ -3,9 +3,17 @@
3
3
 
4
4
  <div class="form-inputs">
5
5
  <%= f.input :title, hint: 'nice and descriptive' %><br />
6
- <%= f.input :short_title, hint: 'ideally one word only, used for the menu' %><br />
7
- <%= f.input :parent_id %><br />
8
6
  <%= f.input :for_blog %><br />
7
+ <%= f.input :tag_list, hint: 'space separated' %>
8
+ <%= f.input :short_title, hint: 'ideally one word only, used for the menu' %><br />
9
+ <%# = javascript_tag "var autocomplete_items = #{ @autocomplete_items.to_json };" %>
10
+ <%= f.input :parent_page_title,
11
+ as: :string,
12
+ label: 'parent page title',
13
+ :input_html => { class: 'typeahead',
14
+ :data => { provide: 'typeahead',
15
+ source: @autocomplete_items.to_json }
16
+ } %><br />
9
17
  <%= f.input :description, :input_html => { :rows => 3 } %>
10
18
  <%= f.input :body, :input_html => { :rows => 25, :id => 'editable' } %>
11
19
  </div>
data/config/routes.rb CHANGED
@@ -7,6 +7,7 @@ Rails.application.routes.draw do
7
7
  post :toggle_for_blog
8
8
  end
9
9
  end
10
- match 'blog' => 'blog#index'
10
+ get 'blog' => 'blog#index', as: :blog
11
+ get 'tags/:tag', to: 'blog#index', as: :tag
11
12
  end
12
13
  end
@@ -20,6 +20,8 @@ module TkhContent
20
20
  migration_template "create_pages.rb", "db/migrate/create_pages.rb"
21
21
  migration_template "add_author_to_pages.rb", "db/migrate/add_author_to_pages.rb"
22
22
  migration_template "add_parent_id_to_pages.rb", "db/migrate/add_parent_id_to_pages.rb"
23
+ migration_template "create_tags.rb", "db/migrate/create_tags.rb"
24
+ migration_template "create_taggings.rb", "db/migrate/create_taggings.rb"
23
25
  end
24
26
 
25
27
  end
@@ -0,0 +1,18 @@
1
+ class CreateTaggings < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table :taggings do |t|
5
+ t.integer :page_id
6
+ t.integer :tag_id
7
+ t.timestamps
8
+ end
9
+ add_index :taggings, :page_id
10
+ add_index :taggings, :tag_id
11
+ end
12
+
13
+ def self.down
14
+ drop_table :taggings
15
+ remove_index :taggings, :page_id
16
+ remove_index :taggings, :tag_id
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ class CreateTags < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table :tags do |t|
5
+ t.string :name
6
+ t.timestamps
7
+ end
8
+ add_index :tags, :name
9
+ Tag.create_translation_table! :name => :string
10
+ end
11
+
12
+ def self.down
13
+ drop_table :tags
14
+ remove_index :tags, :name
15
+ Tag.drop_translation_table!
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module TkhContent
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tkh_content
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-19 00:00:00.000000000 Z
12
+ date: 2012-09-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -162,9 +162,13 @@ executables: []
162
162
  extensions: []
163
163
  extra_rdoc_files: []
164
164
  files:
165
+ - app/assets/javascripts/page.js.coffee
165
166
  - app/controllers/blog_controller.rb
166
167
  - app/controllers/pages_controller.rb
168
+ - app/helpers/blog_helper.rb
167
169
  - app/models/page.rb
170
+ - app/models/tag.rb
171
+ - app/models/tagging.rb
168
172
  - app/views/blog/index.html.erb
169
173
  - app/views/blog/index.rss.builder
170
174
  - app/views/pages/_form.html.erb
@@ -185,6 +189,8 @@ files:
185
189
  - lib/generators/tkh_content/create_or_update_migrations/templates/add_author_to_pages.rb
186
190
  - lib/generators/tkh_content/create_or_update_migrations/templates/add_parent_id_to_pages.rb
187
191
  - lib/generators/tkh_content/create_or_update_migrations/templates/create_pages.rb
192
+ - lib/generators/tkh_content/create_or_update_migrations/templates/create_taggings.rb
193
+ - lib/generators/tkh_content/create_or_update_migrations/templates/create_tags.rb
188
194
  - lib/tasks/tkh_content_tasks.rake
189
195
  - lib/tkh_content/version.rb
190
196
  - lib/tkh_content.rb
@@ -236,7 +242,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
236
242
  version: '0'
237
243
  segments:
238
244
  - 0
239
- hash: 2338962339073569954
245
+ hash: -3697178061325346543
240
246
  required_rubygems_version: !ruby/object:Gem::Requirement
241
247
  none: false
242
248
  requirements:
@@ -245,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
251
  version: '0'
246
252
  segments:
247
253
  - 0
248
- hash: 2338962339073569954
254
+ hash: -3697178061325346543
249
255
  requirements: []
250
256
  rubyforge_project:
251
257
  rubygems_version: 1.8.23