tb_blog 1.3.1 → 1.3.2
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/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
|