refinerycms-blog 2.1.0 → 3.0.1
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 +4 -4
- data/.travis.yml +9 -23
- data/Gemfile +15 -7
- data/Rakefile +0 -1
- data/app/assets/javascripts/refinery/blog/backend.js +18 -59
- data/app/assets/stylesheets/refinery/blog/backend.css.scss +4 -55
- data/app/assets/stylesheets/refinery/blog/frontend.css.scss +2 -2
- data/app/controllers/refinery/blog/admin/categories_controller.rb +6 -0
- data/app/controllers/refinery/blog/admin/posts_controller.rb +25 -3
- data/app/controllers/refinery/blog/blog_controller.rb +31 -5
- data/app/controllers/refinery/blog/categories_controller.rb +10 -3
- data/app/controllers/refinery/blog/posts_controller.rb +16 -6
- data/app/helpers/refinery/blog/controller_helper.rb +1 -22
- data/app/models/refinery/blog/categorization.rb +0 -1
- data/app/models/refinery/blog/category.rb +3 -6
- data/app/models/refinery/blog/comment.rb +15 -17
- data/app/models/refinery/blog/post.rb +44 -43
- data/app/views/refinery/blog/admin/_submenu.html.erb +1 -3
- data/app/views/refinery/blog/admin/categories/_category.html.erb +14 -5
- data/app/views/refinery/blog/admin/posts/_form.html.erb +13 -6
- data/app/views/refinery/blog/admin/posts/_form_part.html.erb +1 -1
- data/app/views/refinery/blog/admin/posts/_post.html.erb +12 -5
- data/app/views/refinery/blog/admin/posts/_teaser_part.html.erb +1 -1
- data/app/views/refinery/blog/posts/index.html.erb +2 -2
- data/app/views/refinery/blog/shared/_categories.html.erb +3 -3
- data/app/views/refinery/shared/admin/_autocomplete.html.erb +45 -0
- data/bin/rails +5 -0
- data/bin/refinerycms +62 -0
- data/changelog.md +4 -1
- data/config/locales/cs.yml +2 -2
- data/config/locales/en.yml +3 -0
- data/config/locales/fr.yml +6 -4
- data/config/locales/nb.yml +154 -14
- data/config/locales/nl.yml +21 -0
- data/config/locales/pl.yml +2 -2
- data/config/locales/ru.yml +25 -14
- data/config/locales/zh-CN.yml +32 -1
- data/config/locales/zh-TW.yml +160 -0
- data/config/routes.rb +6 -3
- data/db/migrate/20110803223522_create_blog_structure.rb +4 -4
- data/db/migrate/20120531113632_delete_cached_slugs.rb +2 -2
- data/db/migrate/20140622132537_add_missing_unique_indices.acts_as_taggable_on_engine.rb +20 -0
- data/db/migrate/20140622132538_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +15 -0
- data/db/seeds.rb +4 -4
- data/lib/refinery/blog.rb +1 -1
- data/lib/refinery/blog/configuration.rb +1 -1
- data/lib/refinery/blog/engine.rb +8 -3
- data/readme.md +21 -6
- data/refinerycms-blog.gemspec +9 -7
- data/script/rails +1 -3
- data/spec/controllers/refinery/blog/admin/comments_controller_spec.rb +23 -19
- data/spec/controllers/refinery/blog/admin/posts_controller_spec.rb +35 -0
- data/spec/controllers/refinery/blog/posts_controller_spec.rb +3 -3
- data/spec/factories/blog_posts.rb +1 -1
- data/spec/factories/user.rb +27 -0
- data/spec/features/refinery/blog/admin/categories_spec.rb +106 -104
- data/spec/features/refinery/blog/admin/comments_spec.rb +18 -18
- data/spec/features/refinery/blog/admin/menu_spec.rb +14 -8
- data/spec/features/refinery/blog/admin/posts_spec.rb +99 -86
- data/spec/features/refinery/blog/categories_spec.rb +20 -18
- data/spec/features/refinery/blog/posts_spec.rb +128 -124
- data/spec/helpers/refinery/blog/posts_helper_spec.rb +13 -13
- data/spec/lib/refinery/blog/engine_spec.rb +1 -11
- data/spec/models/refinery/blog/category_spec.rb +10 -10
- data/spec/models/refinery/blog/comment_spec.rb +3 -3
- data/spec/models/refinery/blog/post_spec.rb +59 -33
- data/spec/spec_helper.rb +2 -3
- metadata +75 -50
- data/app/assets/images/refinery/blog/icons/add.png +0 -0
- data/app/assets/images/refinery/blog/icons/cog.png +0 -0
- data/app/assets/images/refinery/blog/icons/comment.png +0 -0
- data/app/assets/images/refinery/blog/icons/comment_cross.png +0 -0
- data/app/assets/images/refinery/blog/icons/comment_tick.png +0 -0
- data/app/assets/images/refinery/blog/icons/comments.png +0 -0
- data/app/assets/images/refinery/blog/icons/down.gif +0 -0
- data/app/assets/images/refinery/blog/icons/folder.png +0 -0
- data/app/assets/images/refinery/blog/icons/folder_add.png +0 -0
- data/app/assets/images/refinery/blog/icons/folder_edit.png +0 -0
- data/app/assets/images/refinery/blog/icons/page.png +0 -0
- data/app/assets/images/refinery/blog/icons/page_add.png +0 -0
- data/app/assets/images/refinery/blog/icons/page_copy.png +0 -0
- data/app/assets/images/refinery/blog/icons/up.gif +0 -0
- data/spec/helpers/refinery/blog/controller_helper_spec.rb +0 -27
- data/todo.md +0 -5
@@ -2,28 +2,7 @@ module Refinery
|
|
2
2
|
module Blog
|
3
3
|
module ControllerHelper
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
def find_blog_post
|
8
|
-
unless (@post = Refinery::Blog::Post.with_globalize.find(params[:id])).try(:live?)
|
9
|
-
if refinery_user? and current_refinery_user.authorized_plugins.include?("refinerycms_blog")
|
10
|
-
@post = Refinery::Blog::Post.find(params[:id])
|
11
|
-
else
|
12
|
-
error_404
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def find_all_blog_posts
|
18
|
-
@posts = Refinery::Blog::Post.live.includes(:comments, :categories).with_globalize.page(params[:page])
|
19
|
-
end
|
20
|
-
|
21
|
-
def find_tags
|
22
|
-
@tags = Refinery::Blog::Post.live.tag_counts_on(:tags)
|
23
|
-
end
|
24
|
-
def find_all_blog_categories
|
25
|
-
@categories = Refinery::Blog::Category.translated
|
26
|
-
end
|
5
|
+
|
27
6
|
end
|
28
7
|
end
|
29
8
|
end
|
@@ -6,7 +6,6 @@ module Refinery
|
|
6
6
|
belongs_to :blog_post, :class_name => 'Refinery::Blog::Post', :foreign_key => :blog_post_id
|
7
7
|
belongs_to :blog_category, :class_name => 'Refinery::Blog::Category', :foreign_key => :blog_category_id
|
8
8
|
|
9
|
-
attr_accessible :blog_category_id, :blog_post_id
|
10
9
|
end
|
11
10
|
end
|
12
11
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Refinery
|
2
2
|
module Blog
|
3
3
|
class Category < ActiveRecord::Base
|
4
|
+
extend FriendlyId
|
4
5
|
|
5
6
|
translates :title, :slug
|
6
7
|
|
7
|
-
extend FriendlyId
|
8
8
|
friendly_id :title, :use => [:slugged, :globalize]
|
9
9
|
|
10
10
|
has_many :categorizations, :dependent => :destroy, :foreign_key => :blog_category_id
|
@@ -12,11 +12,8 @@ module Refinery
|
|
12
12
|
|
13
13
|
validates :title, :presence => true, :uniqueness => true
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
class Translation
|
19
|
-
attr_accessible :locale
|
15
|
+
def self.by_title(title)
|
16
|
+
joins(:translations).find_by(title: title)
|
20
17
|
end
|
21
18
|
|
22
19
|
def self.translated
|
@@ -1,31 +1,29 @@
|
|
1
|
+
require 'filters_spam'
|
2
|
+
|
1
3
|
module Refinery
|
2
4
|
module Blog
|
3
5
|
class Comment < ActiveRecord::Base
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
filters_spam :author_field => :name,
|
8
|
-
:email_field => :email,
|
9
|
-
:message_field => :body
|
7
|
+
filters_spam author_field: :name, email_field: :email, message_field: :body
|
10
8
|
|
11
|
-
belongs_to :post, :
|
9
|
+
belongs_to :post, foreign_key: 'blog_post_id'
|
12
10
|
|
13
11
|
alias_attribute :message, :body
|
14
12
|
|
15
|
-
validates :name, :message, :
|
16
|
-
validates :email, :
|
13
|
+
validates :name, :message, presence: true
|
14
|
+
validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i }
|
17
15
|
|
18
16
|
class << self
|
19
17
|
def unmoderated
|
20
|
-
where(:
|
18
|
+
where(state: nil)
|
21
19
|
end
|
22
20
|
|
23
21
|
def approved
|
24
|
-
where(:
|
22
|
+
where(state: 'approved')
|
25
23
|
end
|
26
24
|
|
27
25
|
def rejected
|
28
|
-
where(:
|
26
|
+
where(state: 'rejected')
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
@@ -55,7 +53,7 @@ module Refinery
|
|
55
53
|
currently = Refinery::Setting.find_or_set(:comments_allowed, true, {
|
56
54
|
:scoping => 'blog'
|
57
55
|
})
|
58
|
-
Refinery::Setting.set(:comments_allowed, {:
|
56
|
+
Refinery::Setting.set(:comments_allowed, {value: !currently, scoping: 'blog'})
|
59
57
|
end
|
60
58
|
|
61
59
|
before_create do |comment|
|
@@ -68,16 +66,16 @@ module Refinery
|
|
68
66
|
class << self
|
69
67
|
def enabled?
|
70
68
|
Refinery::Setting.find_or_set(:comment_moderation, true, {
|
71
|
-
:
|
72
|
-
:
|
69
|
+
scoping: 'blog',
|
70
|
+
restricted: false
|
73
71
|
})
|
74
72
|
end
|
75
73
|
|
76
74
|
def toggle!
|
77
75
|
new_value = {
|
78
|
-
:
|
79
|
-
:
|
80
|
-
:
|
76
|
+
value: !Blog::Comment::Moderation.enabled?,
|
77
|
+
scoping: 'blog',
|
78
|
+
restricted: false
|
81
79
|
}
|
82
80
|
Refinery::Setting.set(:comment_moderation, new_value)
|
83
81
|
end
|
@@ -4,51 +4,50 @@ require 'seo_meta'
|
|
4
4
|
module Refinery
|
5
5
|
module Blog
|
6
6
|
class Post < ActiveRecord::Base
|
7
|
+
extend FriendlyId
|
7
8
|
|
8
9
|
translates :title, :body, :custom_url, :custom_teaser, :slug, :include => :seo_meta
|
9
10
|
|
10
|
-
extend FriendlyId
|
11
11
|
friendly_id :friendly_id_source, :use => [:slugged, :globalize]
|
12
12
|
|
13
|
-
is_seo_meta
|
14
|
-
|
15
|
-
default_scope :order => 'published_at DESC'
|
16
|
-
|
17
|
-
belongs_to :author, :class_name => Refinery::Blog.user_class.to_s, :foreign_key => :user_id, :readonly => true
|
13
|
+
is_seo_meta
|
18
14
|
|
19
|
-
has_many :comments, :dependent => :destroy, :foreign_key => :blog_post_id
|
20
15
|
acts_as_taggable
|
21
16
|
|
17
|
+
belongs_to :author, proc { readonly(true) }, :class_name => Refinery::Blog.user_class.to_s, :foreign_key => :user_id
|
18
|
+
has_many :comments, :dependent => :destroy, :foreign_key => :blog_post_id
|
22
19
|
has_many :categorizations, :dependent => :destroy, :foreign_key => :blog_post_id
|
23
20
|
has_many :categories, :through => :categorizations, :source => :blog_category
|
24
21
|
|
25
22
|
validates :title, :presence => true, :uniqueness => true
|
26
23
|
validates :body, :presence => true
|
27
|
-
validates :published_at, :
|
28
|
-
|
24
|
+
validates :published_at, :presence => true
|
25
|
+
validates :author, :presence => true, if: :author_required?
|
29
26
|
validates :source_url, :url => { :if => 'Refinery::Blog.validate_source_url',
|
30
27
|
:update => true,
|
31
28
|
:allow_nil => true,
|
32
29
|
:allow_blank => true,
|
33
30
|
:verify => [:resolve_redirects]}
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
class Translation
|
33
|
+
is_seo_meta
|
34
|
+
end
|
35
|
+
|
36
|
+
# Override this to disable required authors
|
37
|
+
def author_required?
|
38
|
+
true
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
# If custom_url or title changes tell friendly_id to regenerate slug when
|
42
|
+
# saving record
|
43
|
+
def should_generate_new_friendly_id?
|
44
|
+
custom_url_changed? || title_changed?
|
45
|
+
end
|
45
46
|
|
46
|
-
# Delegate SEO Attributes to
|
47
|
+
# Delegate SEO Attributes to globalize translation
|
47
48
|
seo_fields = ::SeoMeta.attributes.keys.map{|a| [a, :"#{a}="]}.flatten
|
48
49
|
delegate(*(seo_fields << {:to => :translation}))
|
49
50
|
|
50
|
-
before_save { |m| m.translation.save }
|
51
|
-
|
52
51
|
self.per_page = Refinery::Blog.posts_per_page
|
53
52
|
|
54
53
|
def next
|
@@ -60,7 +59,7 @@ module Refinery
|
|
60
59
|
end
|
61
60
|
|
62
61
|
def live?
|
63
|
-
!draft
|
62
|
+
!draft && published_at <= Time.now
|
64
63
|
end
|
65
64
|
|
66
65
|
def friendly_id_source
|
@@ -79,56 +78,58 @@ module Refinery
|
|
79
78
|
end
|
80
79
|
end
|
81
80
|
# A join implies readonly which we don't really want.
|
82
|
-
joins(:translations).where(globalized_conditions)
|
81
|
+
where(conditions).joins(:translations).where(globalized_conditions)
|
82
|
+
.readonly(false)
|
83
83
|
end
|
84
84
|
|
85
|
-
def
|
86
|
-
|
87
|
-
find_by_slug(slug_or_id)
|
88
|
-
else
|
89
|
-
find(slug_or_id)
|
90
|
-
end
|
85
|
+
def by_month(date)
|
86
|
+
newest_first.where(:published_at => date.beginning_of_month..date.end_of_month)
|
91
87
|
end
|
92
88
|
|
93
|
-
def
|
94
|
-
where(:published_at => date.
|
89
|
+
def by_year(date)
|
90
|
+
newest_first.where(:published_at => date.beginning_of_year..date.end_of_year).with_globalize
|
95
91
|
end
|
96
92
|
|
97
|
-
def
|
98
|
-
|
99
|
-
by_month(date)
|
93
|
+
def by_title(title)
|
94
|
+
joins(:translations).find_by(:title => title)
|
100
95
|
end
|
101
96
|
|
102
|
-
def
|
103
|
-
|
97
|
+
def newest_first
|
98
|
+
order("published_at DESC")
|
104
99
|
end
|
105
100
|
|
106
101
|
def published_dates_older_than(date)
|
107
|
-
published_before(date).select(:published_at).map(&:published_at)
|
102
|
+
newest_first.published_before(date).select(:published_at).map(&:published_at)
|
108
103
|
end
|
109
104
|
|
110
105
|
def recent(count)
|
111
|
-
live.limit(count)
|
106
|
+
newest_first.live.limit(count)
|
112
107
|
end
|
113
108
|
|
114
109
|
def popular(count)
|
115
|
-
|
110
|
+
order("access_count DESC").limit(count).with_globalize
|
116
111
|
end
|
117
112
|
|
118
113
|
def previous(item)
|
119
|
-
published_before(item.published_at).first
|
114
|
+
newest_first.published_before(item.published_at).first
|
120
115
|
end
|
121
116
|
|
122
117
|
def uncategorized
|
123
|
-
live.includes(:categories).where(
|
118
|
+
newest_first.live.includes(:categories).where(
|
119
|
+
Refinery::Blog::Categorization.table_name => { :blog_category_id => nil }
|
120
|
+
)
|
124
121
|
end
|
125
122
|
|
126
123
|
def next(current_record)
|
127
|
-
where([
|
124
|
+
where(arel_table[:published_at].gt(current_record.published_at))
|
125
|
+
.where(:draft => false)
|
126
|
+
.order('published_at ASC').with_globalize.first
|
128
127
|
end
|
129
128
|
|
130
129
|
def published_before(date=Time.now)
|
131
|
-
where(
|
130
|
+
where(arel_table[:published_at].lt(date))
|
131
|
+
.where(:draft => false)
|
132
|
+
.with_globalize
|
132
133
|
end
|
133
134
|
alias_method :live, :published_before
|
134
135
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
<nav id='actions' class='multilist'>
|
2
2
|
<ul class='search_list'>
|
3
|
-
<li class='not_a_link'>
|
4
|
-
<%= render "/refinery/admin/search", :url => request.path %>
|
5
|
-
</li>
|
3
|
+
<li class='not_a_link'><%= render "/refinery/admin/search", :url => request.path -%></li>
|
6
4
|
</ul>
|
7
5
|
|
8
6
|
<ul class='collapsible_menu'>
|
@@ -2,12 +2,21 @@
|
|
2
2
|
<span class='title'>
|
3
3
|
<%= category.title.presence || category.translations.detect {|t| t.title.present?}.title %>
|
4
4
|
<span class="preview">
|
5
|
-
<%
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
<% if Refinery::I18n.frontend_locales.many? %>
|
6
|
+
<span class='locales'>
|
7
|
+
<% category.translations.sort_by{ |t| Refinery::I18n.frontend_locales.index(t.locale)}.each do |translation| %>
|
8
|
+
<% if translation.title.present? %>
|
9
|
+
<%= link_to refinery.edit_blog_admin_category_path(category,
|
10
|
+
:switch_locale => translation.locale),
|
11
|
+
:class => 'locale',
|
12
|
+
:title => translation.locale.upcase do %>
|
13
|
+
<div class="<%=translation.locale %> locale_marker">
|
14
|
+
<%= locale_text_icon(translation.locale.upcase) %>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
10
18
|
<% end %>
|
19
|
+
</span>
|
11
20
|
<% end %>
|
12
21
|
</span>
|
13
22
|
</span>
|
@@ -40,14 +40,14 @@
|
|
40
40
|
</div>
|
41
41
|
</div>
|
42
42
|
|
43
|
-
<%= render '/refinery/admin/form_advanced_options_menu', :f => f %>
|
44
|
-
|
45
43
|
<div class='field'>
|
46
44
|
<%= f.label :tag_list, t('refinery.blog.shared.tags.title') -%>
|
47
|
-
<%= f.text_field :tag_list, :class => 'larger' -%>
|
45
|
+
<%= f.text_field :tag_list, value: @post.tag_list.to_s, :class => 'larger' -%>
|
48
46
|
</div>
|
49
47
|
|
50
|
-
|
48
|
+
<%= render '/refinery/admin/form_advanced_options_menu', :f => f %>
|
49
|
+
|
50
|
+
<div id='more_options'>
|
51
51
|
<div class="hemisquare">
|
52
52
|
<h3><%= t('title', :scope => 'refinery.blog.admin.submenu.categories') %></h3>
|
53
53
|
<ul class='blog_categories'>
|
@@ -106,11 +106,18 @@
|
|
106
106
|
<%= render "/refinery/admin/form_actions",
|
107
107
|
:f => f,
|
108
108
|
:continue_editing => true,
|
109
|
-
:delete_title => t('delete', :scope => 'refinery.blog.admin.posts.post')
|
109
|
+
:delete_title => t('delete', :scope => 'refinery.blog.admin.posts.post'),
|
110
|
+
:before_delete_button => (link_to(t('delete_translation', :scope => 'refinery.blog.admin.posts.post'),
|
111
|
+
refinery.delete_translation_blog_admin_post_path(@post, :locale_to_delete => Globalize.locale),
|
112
|
+
:method => :post,
|
113
|
+
:data => {
|
114
|
+
:confirm => t('delete_translation_confirmation', :scope => 'refinery.blog.admin.posts.post')
|
115
|
+
},
|
116
|
+
:class => "button confirm-delete") if Refinery::I18n.frontend_locales.many? && @post.translations.size > 1) %>
|
110
117
|
<% end -%>
|
111
118
|
|
112
119
|
<% content_for :stylesheets, stylesheet_link_tag('refinery/blog/backend') %>
|
113
120
|
<% content_for :javascripts, javascript_include_tag('refinery/blog/backend') %>
|
114
121
|
<%= render 'refinery/shared/admin/autocomplete',
|
115
|
-
:dom_id => '#
|
122
|
+
:dom_id => '#post_tag_list',
|
116
123
|
:url => refinery.tags_blog_admin_posts_url %>
|
@@ -2,12 +2,19 @@
|
|
2
2
|
<span class='title'>
|
3
3
|
<%= post.title.presence || post.translations.detect {|t| t.title.present?}.title %>
|
4
4
|
<span class="preview">
|
5
|
-
<%
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
:class => 'locale' %>
|
5
|
+
<% if Refinery::I18n.frontend_locales.many? %>
|
6
|
+
<span class='locales'>
|
7
|
+
<% post.translations.sort_by{ |t| Refinery::I18n.frontend_locales.index(t.locale)}.each do |translation| %>
|
8
|
+
<% if translation.title.present? %>
|
9
|
+
<%= link_to refinery.edit_blog_admin_post_path(post, :switch_locale => translation.locale), :class => 'locale', title: translation.locale.upcase do %>
|
10
|
+
|
11
|
+
<div class="<%=translation.locale %> locale_marker">
|
12
|
+
<%= locale_text_icon(translation.locale.upcase) %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
10
16
|
<% end %>
|
17
|
+
</span>
|
11
18
|
<% end %>
|
12
19
|
|
13
20
|
<%= post.published_at.try(:strftime, '%b %d, %Y') || 'draft' %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div class='page_part' id='page_part_teaser'>
|
2
|
-
<%= f.text_area :custom_teaser, :rows => 20, :class => '
|
2
|
+
<%= f.text_area :custom_teaser, :rows => 20, :class => 'visual_editor widest' -%>
|
3
3
|
<p>
|
4
4
|
<span class='clearfix label_inline_with_link'>
|
5
5
|
<%= link_to t('copy_body', :scope => 'refinery.blog.admin.posts.form'), "#",
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% content_for :body do %>
|
2
|
-
<%= raw @page.content_for(Refinery::Pages.default_parts.first.to_sym) if Refinery::Pages.default_parts.any? %>
|
2
|
+
<%= raw @page.content_for(Refinery::Pages.default_parts.first[:slug].to_sym) if Refinery::Pages.default_parts.any? %>
|
3
3
|
|
4
4
|
<% if @posts.any? %>
|
5
5
|
<section id="blog_posts">
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<% end %>
|
13
13
|
|
14
14
|
<% content_for :side_body_prepend do -%>
|
15
|
-
<%= raw @page.content_for(Refinery::Pages.default_parts.second.to_sym) %>
|
15
|
+
<%= raw @page.content_for(Refinery::Pages.default_parts.second[:slug].to_sym) %>
|
16
16
|
<% end if Refinery::Pages.default_parts.many? -%>
|
17
17
|
<%= render '/refinery/blog/shared/body_content_right' %>
|
18
18
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<% if @categories.any? %>
|
2
2
|
<h2><%= t('.title') %></h2>
|
3
|
-
<ul id=
|
3
|
+
<ul id="categories">
|
4
4
|
<% @categories.each do |category| %>
|
5
|
-
<li
|
5
|
+
<li<%== ' class="selected"' if @category.present? && @category.id == category.id %>>
|
6
6
|
<%= link_to "#{category.title} (#{category.post_count})", refinery.blog_category_path(category) %>
|
7
7
|
</li>
|
8
8
|
<% end %>
|
9
9
|
</ul>
|
10
|
-
<% end %>
|
10
|
+
<% end %>
|
@@ -1 +1,46 @@
|
|
1
1
|
<% content_for :stylesheets, stylesheet_link_tag("refinery/blog/ui-lightness/jquery-ui-1.8.13.custom") %>
|
2
|
+
<% content_for :javascripts do %>
|
3
|
+
<script>
|
4
|
+
function split(val) {
|
5
|
+
return val.split(/,\s*/);
|
6
|
+
}
|
7
|
+
function extractLast(term) {
|
8
|
+
return split(term).pop();
|
9
|
+
}
|
10
|
+
$(document).ready(function(){
|
11
|
+
$('<%= dom_id %>').bind("keydown", function(event) {
|
12
|
+
if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
|
13
|
+
event.preventDefault()
|
14
|
+
}
|
15
|
+
}).autocomplete({
|
16
|
+
source: function(request, response) {
|
17
|
+
$.getJSON("<%= url %>", {
|
18
|
+
term: extractLast(request.term)
|
19
|
+
}, response);
|
20
|
+
},
|
21
|
+
search: function() {
|
22
|
+
// custom minLength
|
23
|
+
var term = extractLast(this.value);
|
24
|
+
if (term.length < 2) {
|
25
|
+
return false;
|
26
|
+
}
|
27
|
+
},
|
28
|
+
focus: function() {
|
29
|
+
// prevent value inserted on focus
|
30
|
+
return false;
|
31
|
+
},
|
32
|
+
select: function(event, ui) {
|
33
|
+
var terms = split(this.value);
|
34
|
+
// remove the current input
|
35
|
+
terms.pop();
|
36
|
+
// add the selected item
|
37
|
+
terms.push(ui.item.value);
|
38
|
+
// add placeholder to get the comma-and-space at the end
|
39
|
+
terms.push("");
|
40
|
+
this.value = terms.join(", ");
|
41
|
+
return false;
|
42
|
+
}
|
43
|
+
});
|
44
|
+
})
|
45
|
+
</script>
|
46
|
+
<% end %>
|