tb_blog 1.3.1 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/admin/blog/posts.js +35 -0
- data/app/assets/stylesheets/admin/blog/application.css.scss +8 -0
- data/app/helpers/blog_helper.rb +12 -6
- data/app/models/spud/spud_post_model.rb +8 -23
- data/app/views/admin/posts/_form.html.erb +13 -3
- data/app/views/admin/posts/edit.html.erb +1 -1
- data/app/views/admin/posts/new.html.erb +2 -2
- data/app/views/posts/_comment_form.html.erb +7 -7
- data/app/views/posts/index.html.erb +42 -22
- data/app/views/posts/show.html.erb +35 -26
- data/config/locales/en.yml +5 -0
- data/lib/spud_blog/version.rb +1 -1
- data/spec/dummy/db/migrate/20140110180429_add_nested_set_to_post_categories.tb_blog.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9170ccda1ef782dbf78a563fa1efc265b2a4f68
|
4
|
+
data.tar.gz: 95ca57b1a0bfc7ecba20870a9a78bc168e9e5632
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b11edd82dd1eb74576d3c3278474645fb313d0cdb57f4eb8fc4b265f5fafe15e1666a3aa41626f8b385bc5eacc43c0f9145e3bff7d77bf11d72c02c03b9ce802
|
7
|
+
data.tar.gz: ec964ab180f1bbdf53b62fa408ca624c203c79488d64edccd45fe51d59add9b353cf533361d0c3ade859d30c3a475f95d5bb5f83bff94be2dd784b5f4c4098a2
|
@@ -4,6 +4,8 @@ spud.admin.posts = {
|
|
4
4
|
edit: function(){
|
5
5
|
$('body').on('click', '.spud-post-add-category', clickedPostAddCategory);
|
6
6
|
$('body').on('submit', '.spud-post-category-form', submittedPostCategoryForm);
|
7
|
+
$('body').on('blur', '.spud-post-title', blurredPostTitle);
|
8
|
+
$('body').on('click', '.spud-post-url-name-regen', clickedUrlNameRegen);
|
7
9
|
}
|
8
10
|
};
|
9
11
|
|
@@ -56,4 +58,37 @@ var savePostCategoryError = function(jqXHR, textStatus, errorThrown){
|
|
56
58
|
}
|
57
59
|
};
|
58
60
|
|
61
|
+
var blurredPostTitle = function(){
|
62
|
+
generateUrlName(false);
|
63
|
+
};
|
64
|
+
|
65
|
+
var clickedUrlNameRegen = function(e){
|
66
|
+
e.preventDefault();
|
67
|
+
generateUrlName(true);
|
68
|
+
};
|
69
|
+
|
70
|
+
/*
|
71
|
+
* Populate the url name field
|
72
|
+
*
|
73
|
+
* Pass force=true to replace the value currently in the field
|
74
|
+
*/
|
75
|
+
var generateUrlName = function(force){
|
76
|
+
var title = $('.spud-post-title').val();
|
77
|
+
var $urlNameField = $('.spud-post-url-name');
|
78
|
+
if(title !== '' && (force || $urlNameField.val() === '')){
|
79
|
+
$urlNameField.val(encodeTitleForUrlName(title));
|
80
|
+
}
|
81
|
+
};
|
82
|
+
|
83
|
+
/*
|
84
|
+
* Return a url name for a given title
|
85
|
+
*/
|
86
|
+
var encodeTitleForUrlName = function(title){
|
87
|
+
var string;
|
88
|
+
string = title.toLowerCase();
|
89
|
+
string = string.replace(/\s+/g, '-'); // replace spaces with dashes
|
90
|
+
string = string.replace(/[^a-z0-9\-]+/g, ''); // remove symbols
|
91
|
+
return string;
|
92
|
+
};
|
93
|
+
|
59
94
|
})();
|
@@ -10,6 +10,14 @@
|
|
10
10
|
#spud_post_published_at_1i, #spud_post_published_at_4i{
|
11
11
|
width: 50px;
|
12
12
|
}
|
13
|
+
.spud-post-url-name{
|
14
|
+
width: calc(100% - 52px);
|
15
|
+
float: left;
|
16
|
+
}
|
17
|
+
.spud-post-url-name-regen{
|
18
|
+
width: 50px;
|
19
|
+
margin-left: 2px;
|
20
|
+
}
|
13
21
|
|
14
22
|
// Categories
|
15
23
|
//////////////
|
data/app/helpers/blog_helper.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
module BlogHelper
|
2
2
|
|
3
|
+
def options_for_post_category_select
|
4
|
+
return options_from_collection_for_select(SpudPostCategory.ordered, :url_name, :name, params[:category_url_name])
|
5
|
+
end
|
6
|
+
|
7
|
+
def options_for_post_archive_select
|
8
|
+
return options_for_select(SpudPost.months_with_public_posts.collect{ |d|
|
9
|
+
[d.strftime('%B %Y'), d.strftime('%Y-%b').downcase]
|
10
|
+
}, params[:archive_date])
|
11
|
+
end
|
12
|
+
|
3
13
|
def spud_post_category_select
|
4
|
-
return select_tag('category_url_name',
|
5
|
-
options_from_collection_for_select(SpudPostCategory.ordered, :url_name, :name, params[:category_url_name]),
|
6
|
-
{:prompt => 'All Categories'})
|
14
|
+
return select_tag('category_url_name', options_for_post_category_select(), {:prompt => 'All Categories', :class => 'form-control'})
|
7
15
|
end
|
8
16
|
|
9
17
|
def spud_post_archive_select
|
10
|
-
return select_tag 'archive_date',
|
11
|
-
[d.strftime('%B %Y'), d.strftime('%Y-%b').downcase]
|
12
|
-
}, params[:archive_date]), :prompt => 'All Dates', :rel => 'archive'
|
18
|
+
return select_tag 'archive_date', options_for_post_archive_select(), :prompt => 'All Dates', :rel => 'archive', :class => 'form-control'
|
13
19
|
end
|
14
20
|
|
15
21
|
def spud_blog_rss_link
|
@@ -31,7 +31,8 @@ class Spud::SpudPostModel < ActiveRecord::Base
|
|
31
31
|
end
|
32
32
|
}
|
33
33
|
|
34
|
-
validates_presence_of :title, :content, :published_at, :spud_user_id
|
34
|
+
validates_presence_of :title, :content, :published_at, :spud_user_id
|
35
|
+
validates :url_name, :presence => true, :uniqueness => true, :format => {:with => /\A[\w\-]+\z/, :message => 'must contain only letters, numbers, and dashes'}
|
35
36
|
validates_uniqueness_of :url_name
|
36
37
|
before_validation :set_url_name
|
37
38
|
|
@@ -69,18 +70,7 @@ class Spud::SpudPostModel < ActiveRecord::Base
|
|
69
70
|
return self.read_attribute(:is_news)
|
70
71
|
end
|
71
72
|
|
72
|
-
#def self.posts_for_category_archive(category, )
|
73
|
-
|
74
|
-
# Returns an array of Date objects for months with public posts
|
75
73
|
def self.months_with_public_posts
|
76
|
-
# Select
|
77
|
-
# Month(published_at) as published_month,
|
78
|
-
# Year(published_at) as published_year
|
79
|
-
# From spud_posts
|
80
|
-
# Where visible = 1
|
81
|
-
# And published_at < '2012-01-30'
|
82
|
-
# Group By published_month, published_year
|
83
|
-
# Order By published_year desc, published_month desc
|
84
74
|
records = SpudPost.select('Extract(Month from published_at) as published_month, Extract(Year from published_at) as published_year').where('visible = ? AND published_at < ?', true, DateTime.now).group('published_month, published_year').order('published_year desc, published_month desc')
|
85
75
|
begin
|
86
76
|
return records.collect{ |r| Date.new(r[:published_year].to_i, r[:published_month].to_i) }
|
@@ -91,16 +81,8 @@ class Spud::SpudPostModel < ActiveRecord::Base
|
|
91
81
|
end
|
92
82
|
|
93
83
|
def postprocess_content
|
94
|
-
|
95
|
-
|
96
|
-
# renderer = Redcarpet::Render::HTML.new
|
97
|
-
# extensions = {fenced_code_blocks: true}
|
98
|
-
# redcarpet = Redcarpet::Markdown.new(renderer, extensions)
|
99
|
-
# self.content_processed = redcarpet.render self.content
|
100
|
-
# else
|
101
|
-
template = Liquid::Template.parse(self.content)
|
102
|
-
self.content_processed = template.render()
|
103
|
-
# end
|
84
|
+
template = Liquid::Template.parse(self.content)
|
85
|
+
self.content_processed = template.render()
|
104
86
|
end
|
105
87
|
|
106
88
|
def content_processed
|
@@ -133,6 +115,9 @@ class Spud::SpudPostModel < ActiveRecord::Base
|
|
133
115
|
private
|
134
116
|
|
135
117
|
def set_url_name
|
136
|
-
|
118
|
+
if url_name.blank?
|
119
|
+
self.url_name = title.parameterize
|
120
|
+
end
|
137
121
|
end
|
122
|
+
|
138
123
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<div class="form-group">
|
4
4
|
<div class="col-sm-12">
|
5
5
|
<%= f.label :title, :required => true,:class=> "control-label" %>
|
6
|
-
<%= f.text_field :title, :class=>'form-control', :placeholder => "Enter title here" %>
|
6
|
+
<%= f.text_field :title, :class=>'form-control spud-post-title', :placeholder => "Enter title here" %>
|
7
7
|
</div>
|
8
8
|
</div>
|
9
9
|
|
@@ -73,17 +73,27 @@
|
|
73
73
|
|
74
74
|
<h4>Meta Data</h4>
|
75
75
|
|
76
|
+
<div class="form-group">
|
77
|
+
<%= f.label :url_name, :required => true, :class=> "col-sm-2 control-label" %>
|
78
|
+
<div class="col-sm-10">
|
79
|
+
<%= f.text_field :url_name, :class=>'form-control spud-post-url-name', :placeholder => 'Optional' %>
|
80
|
+
<a href="#" class="btn btn-default spud-post-url-name-regen" title="Regenerate URL Slug">
|
81
|
+
<span class="glyphicon glyphicon-refresh"></span>
|
82
|
+
</a>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
|
76
86
|
<div class="form-group">
|
77
87
|
<%= f.label :meta_keywords, :required => true, :class=> "col-sm-2 control-label" %>
|
78
88
|
<div class="col-sm-10">
|
79
|
-
<%= f.text_field :meta_keywords, :class=>'form-control' %>
|
89
|
+
<%= f.text_field :meta_keywords, :class=>'form-control', :placeholder => 'Optional' %>
|
80
90
|
</div>
|
81
91
|
</div>
|
82
92
|
|
83
93
|
<div class="form-group">
|
84
94
|
<%= f.label :meta_description, :required => true, :class=> "col-sm-2 control-label" %>
|
85
95
|
<div class="col-sm-10">
|
86
|
-
<%= f.text_field :meta_description, :class=>'form-control' %>
|
96
|
+
<%= f.text_field :meta_description, :class=>'form-control', :placeholder => 'Optional' %>
|
87
97
|
</div>
|
88
98
|
</div>
|
89
99
|
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<%=
|
1
|
+
<%= tb_form_for @post, :url => admin_post_path(@post), :html => {:class => 'form-horizontal'}, :remote => true, :data => {:errors => :inline, :success => admin_posts_path} do |f| %>
|
2
2
|
<%= render :partial => 'form', :locals => {:f => f} %>
|
3
3
|
<% end %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<%=
|
1
|
+
<%= tb_form_for @post, :url => admin_posts_path, :html => {:class => 'form-horizontal'}, :remote => true, :data => {:errors => :inline, :success => admin_posts_path} do |f| %>
|
2
2
|
<%= render :partial => 'form', :locals => {:f => f} %>
|
3
|
-
<% end %>
|
3
|
+
<% end %>
|
@@ -11,20 +11,20 @@
|
|
11
11
|
</div>
|
12
12
|
<% end %>
|
13
13
|
|
14
|
-
<div>
|
14
|
+
<div class="form-group">
|
15
15
|
<%= f.label :author %>
|
16
|
-
<%= f.text_field :author %>
|
16
|
+
<%= f.text_field :author, :class => 'form-control' %>
|
17
17
|
</div>
|
18
|
-
<div>
|
18
|
+
<div class="form-group">
|
19
19
|
<%= f.label :content %>
|
20
|
-
<%= f.text_area :content %>
|
20
|
+
<%= f.text_area :content, :class => 'form-control' %>
|
21
21
|
</div>
|
22
|
-
<div class="comment_validity">
|
22
|
+
<div class="comment_validity hidden">
|
23
23
|
<%= label_tag 'Comment Validation' %>
|
24
24
|
<%= text_field_tag 'comment_validation' %>
|
25
25
|
</div>
|
26
|
-
<div>
|
27
|
-
<%= f.submit 'Post Comment' %>
|
26
|
+
<div class="form-group">
|
27
|
+
<%= f.submit 'Post Comment', :class => 'btn btn-primary' %>
|
28
28
|
</div>
|
29
29
|
|
30
30
|
<% end %>
|
@@ -5,33 +5,53 @@
|
|
5
5
|
<% end %>
|
6
6
|
|
7
7
|
<% cache(cache_key_for_spud_collection(@posts, :cache_params => [:category_url_name, :archive_date, :page], :for_user => true)) do %>
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<%=
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
|
9
|
+
<div class="row">
|
10
|
+
<div class="col-sm-12">
|
11
|
+
<%= form_tag posts_path, :class => 'form-inline blog-filters' do %>
|
12
|
+
<div class="form-group">
|
13
|
+
<label>Category:</label>
|
14
|
+
<%= spud_post_category_select %>
|
15
|
+
</div>
|
16
|
+
<div class="form-group">
|
17
|
+
<label>Month:</label>
|
18
|
+
<%= spud_post_archive_select %>
|
19
|
+
</div>
|
20
|
+
<input type="submit" value="Submit" class="btn btn-default" />
|
21
|
+
<% end %>
|
22
|
+
</div>
|
16
23
|
</div>
|
17
24
|
|
18
|
-
<div
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<
|
25
|
-
|
26
|
-
<%=
|
25
|
+
<div class="row">
|
26
|
+
|
27
|
+
<div class="col-sm-8 blog-posts">
|
28
|
+
<% if @posts.length > 0 %>
|
29
|
+
<% @posts.includes(:categories, :author).each do |post| %>
|
30
|
+
<% cache(post) do %>
|
31
|
+
<div class="blog-post blog-post-partial">
|
32
|
+
<h3 class="blog-post-title"><%= link_to post.title, post_path(post.url_name) %></h3>
|
33
|
+
<h4 class="blog-post-author">Posted by <%= post.author.full_name %> on <%= post.display_date %></h4>
|
34
|
+
<div class="blog-post-content">
|
35
|
+
<%= truncate_html post.content_processed.html_safe, :length => 250 %>
|
36
|
+
</div>
|
27
37
|
</div>
|
28
|
-
|
38
|
+
<% end %>
|
29
39
|
<% end %>
|
40
|
+
<% else %>
|
41
|
+
<p>No posts were found in this category</p>
|
30
42
|
<% end %>
|
31
|
-
|
32
|
-
|
33
|
-
|
43
|
+
<%= will_paginate @posts %>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div class="col-sm-4 blog-recent-posts">
|
47
|
+
<h3>Recent Posts</h3>
|
48
|
+
<ul class="blog-recent-posts-list">
|
49
|
+
<% SpudPost.for_blog(params[:blog_key]).recent_posts.each do |post| %>
|
50
|
+
<li><%= link_to post.title, post_path(post.url_name) %></li>
|
51
|
+
<% end %>
|
52
|
+
</ul>
|
53
|
+
</div>
|
54
|
+
|
34
55
|
</div>
|
35
56
|
|
36
|
-
<%= will_paginate @posts %>
|
37
57
|
<% end %>
|
@@ -13,36 +13,45 @@
|
|
13
13
|
<% end %>
|
14
14
|
|
15
15
|
<% cache(@post) do %>
|
16
|
-
<div class="
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
<div class="row">
|
17
|
+
<div class="col-sm-12">
|
18
|
+
<div class="blog-post blog-post-partial">
|
19
|
+
<h1 class="blog-post-title"><%= @post.title %></h1>
|
20
|
+
<h4 class="blog-post-author">Posted by <%= @post.author.full_name %> on <%= @post.display_date %></h4>
|
21
|
+
<% if @post.categories.any? %>
|
22
|
+
<p class="blog-post-categories">
|
23
|
+
<span>Filed under</span>
|
24
|
+
<%= raw(@post.categories.collect{ |c| link_to c.name, post_category_path(c.url_name) }.join(', ')) %>
|
25
|
+
</p>
|
26
|
+
<% end %>
|
27
|
+
<div class="blog-post-content">
|
28
|
+
<%= raw @post.content_processed %>
|
29
|
+
</div>
|
30
|
+
<p><%= link_to 'Back to all posts', posts_path %></p>
|
31
|
+
</div>
|
27
32
|
</div>
|
28
33
|
</div>
|
29
34
|
|
30
35
|
<% if @post.comments_enabled %>
|
31
|
-
<div class="
|
32
|
-
<
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
<% @post.visible_comments
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
<div class="row">
|
37
|
+
<div class="col-sm-12">
|
38
|
+
<div class="blog-post-comment">
|
39
|
+
<h5>Post a Comment:</h5>
|
40
|
+
<%= render 'comment_form' %>
|
41
|
+
</div>
|
42
|
+
<% cache(cache_key_for_spud_collection(@post.visible_comments, key:'comments')) do %>
|
43
|
+
<ul id="blog-post-comments">
|
44
|
+
<% @post.visible_comments.each do |comment| %>
|
45
|
+
<% cache(comment) do %>
|
46
|
+
<li>
|
47
|
+
<h6>Posted by: <%= comment.author %></h6>
|
48
|
+
<p><%= comment.content %></p>
|
49
|
+
</li>
|
50
|
+
<% end %>
|
51
|
+
<% end %>
|
52
|
+
</ul>
|
44
53
|
<% end %>
|
45
|
-
</
|
46
|
-
|
54
|
+
</div>
|
55
|
+
</div>
|
47
56
|
<% end %>
|
48
57
|
<% end %>
|
data/lib/spud_blog/version.rb
CHANGED
@@ -8,8 +8,8 @@ class AddNestedSetToPostCategories < ActiveRecord::Migration
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# Populates lft, rgt, and depth values for nested set
|
11
|
-
SpudPostCategory.where(:parent_id => 0).update_all({:parent_id => nil})
|
12
|
-
SpudPostCategory.rebuild!
|
11
|
+
#SpudPostCategory.where(:parent_id => 0).update_all({:parent_id => nil})
|
12
|
+
#SpudPostCategory.rebuild!
|
13
13
|
end
|
14
14
|
|
15
15
|
def down
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tb_blog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Westlake Design
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -202,6 +202,7 @@ files:
|
|
202
202
|
- app/views/posts/index.html.erb
|
203
203
|
- app/views/posts/index.rss.builder
|
204
204
|
- app/views/posts/show.html.erb
|
205
|
+
- config/locales/en.yml
|
205
206
|
- config/routes.rb
|
206
207
|
- db/migrate/20120125180945_create_spud_posts.rb
|
207
208
|
- db/migrate/20120125181022_create_spud_post_categories.rb
|