sofa_blog 0.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.
- data/.DS_Store +0 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +83 -0
- data/LICENSE +20 -0
- data/README.md +66 -0
- data/Rakefile +19 -0
- data/VERSION +1 -0
- data/app/.DS_Store +0 -0
- data/app/controllers/cms_admin/blog_comments_controller.rb +66 -0
- data/app/controllers/cms_admin/blog_posts_controller.rb +48 -0
- data/app/models/blog_comment.rb +45 -0
- data/app/models/blog_post.rb +62 -0
- data/app/models/blog_tag.rb +22 -0
- data/app/models/blog_tagging.rb +8 -0
- data/app/views/.DS_Store +0 -0
- data/app/views/cms_admin/blog_comments/_blog_comment.html.erb +22 -0
- data/app/views/cms_admin/blog_comments/_form.html.erb +24 -0
- data/app/views/cms_admin/blog_comments/_status.html.erb +7 -0
- data/app/views/cms_admin/blog_comments/approve.rjs +1 -0
- data/app/views/cms_admin/blog_comments/disapprove.rjs +1 -0
- data/app/views/cms_admin/blog_comments/edit.html.erb +7 -0
- data/app/views/cms_admin/blog_comments/index.html.erb +7 -0
- data/app/views/cms_admin/blog_comments/new.html.erb +6 -0
- data/app/views/cms_admin/blog_posts/_blog_post.html.erb +21 -0
- data/app/views/cms_admin/blog_posts/_form.html.erb +33 -0
- data/app/views/cms_admin/blog_posts/edit.html.erb +7 -0
- data/app/views/cms_admin/blog_posts/index.html.erb +8 -0
- data/app/views/cms_admin/blog_posts/new.html.erb +5 -0
- data/app/views/sofa_blog/_head.html.erb +1 -0
- data/app/views/sofa_blog/_nav.html.erb +1 -0
- data/config/.DS_Store +0 -0
- data/config/routes.rb +14 -0
- data/db/migrate/01_create_sofa_blog.rb +50 -0
- data/doc/sofa.png +0 -0
- data/lib/generators/README +12 -0
- data/lib/generators/blog_generator.rb +33 -0
- data/lib/sofa_blog/engine.rb +17 -0
- data/lib/sofa_blog.rb +3 -0
- data/public/javascripts/jquery.autocomplete.pack.js +12 -0
- data/public/stylesheets/content.css +53 -0
- data/sofa_blog.gemspec +88 -0
- data/tmp/application.rb +15 -0
- data/tmp/boot.rb +13 -0
- data/tmp/environment.rb +6 -0
- data/tmp/initializers/formatted_form_builder.rb +141 -0
- data/tmp/initializers/wristband.rb +1 -0
- metadata +145 -0
data/.DS_Store
ADDED
Binary file
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
abstract (1.0.0)
|
5
|
+
actionmailer (3.0.4)
|
6
|
+
actionpack (= 3.0.4)
|
7
|
+
mail (~> 2.2.15)
|
8
|
+
actionpack (3.0.4)
|
9
|
+
activemodel (= 3.0.4)
|
10
|
+
activesupport (= 3.0.4)
|
11
|
+
builder (~> 2.1.2)
|
12
|
+
erubis (~> 2.6.6)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
rack (~> 1.2.1)
|
15
|
+
rack-mount (~> 0.6.13)
|
16
|
+
rack-test (~> 0.5.7)
|
17
|
+
tzinfo (~> 0.3.23)
|
18
|
+
active_link_to (0.0.6)
|
19
|
+
activemodel (3.0.4)
|
20
|
+
activesupport (= 3.0.4)
|
21
|
+
builder (~> 2.1.2)
|
22
|
+
i18n (~> 0.4)
|
23
|
+
activerecord (3.0.4)
|
24
|
+
activemodel (= 3.0.4)
|
25
|
+
activesupport (= 3.0.4)
|
26
|
+
arel (~> 2.0.2)
|
27
|
+
tzinfo (~> 0.3.23)
|
28
|
+
activeresource (3.0.4)
|
29
|
+
activemodel (= 3.0.4)
|
30
|
+
activesupport (= 3.0.4)
|
31
|
+
activesupport (3.0.4)
|
32
|
+
arel (2.0.9)
|
33
|
+
builder (2.1.2)
|
34
|
+
comfortable_mexican_sofa (1.0.46)
|
35
|
+
active_link_to (>= 0.0.6)
|
36
|
+
active_link_to (>= 0.0.6)
|
37
|
+
mime-types
|
38
|
+
paperclip (>= 2.3.8)
|
39
|
+
paperclip (>= 2.3.8)
|
40
|
+
rails (>= 3.0.3)
|
41
|
+
rails (>= 3.0.3)
|
42
|
+
erubis (2.6.6)
|
43
|
+
abstract (>= 1.0.0)
|
44
|
+
i18n (0.5.0)
|
45
|
+
mail (2.2.15)
|
46
|
+
activesupport (>= 2.3.6)
|
47
|
+
i18n (>= 0.4.0)
|
48
|
+
mime-types (~> 1.16)
|
49
|
+
treetop (~> 1.4.8)
|
50
|
+
mime-types (1.16)
|
51
|
+
paperclip (2.3.8)
|
52
|
+
activerecord
|
53
|
+
activesupport
|
54
|
+
polyglot (0.3.1)
|
55
|
+
rack (1.2.1)
|
56
|
+
rack-mount (0.6.13)
|
57
|
+
rack (>= 1.0.0)
|
58
|
+
rack-test (0.5.7)
|
59
|
+
rack (>= 1.0)
|
60
|
+
rails (3.0.4)
|
61
|
+
actionmailer (= 3.0.4)
|
62
|
+
actionpack (= 3.0.4)
|
63
|
+
activerecord (= 3.0.4)
|
64
|
+
activeresource (= 3.0.4)
|
65
|
+
activesupport (= 3.0.4)
|
66
|
+
bundler (~> 1.0)
|
67
|
+
railties (= 3.0.4)
|
68
|
+
railties (3.0.4)
|
69
|
+
actionpack (= 3.0.4)
|
70
|
+
activesupport (= 3.0.4)
|
71
|
+
rake (>= 0.8.7)
|
72
|
+
thor (~> 0.14.4)
|
73
|
+
rake (0.8.7)
|
74
|
+
thor (0.14.6)
|
75
|
+
treetop (1.4.9)
|
76
|
+
polyglot (>= 0.3.1)
|
77
|
+
tzinfo (0.3.24)
|
78
|
+
|
79
|
+
PLATFORMS
|
80
|
+
ruby
|
81
|
+
|
82
|
+
DEPENDENCIES
|
83
|
+
comfortable_mexican_sofa (>= 1.0.46)
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Jack Neto, The Working Group Inc
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Sofa Blog
|
2
|
+
|
3
|
+
Sofa Blog is an extension for [ComfortableMexicanSofa](https://github.com/twg/comfortable-mexican-sofa) (CMS) that allows management of blog posts and comments.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add gem definition to your Gemfile:
|
8
|
+
|
9
|
+
gem 'sofa_blog'
|
10
|
+
|
11
|
+
Then from the Rails project's root run:
|
12
|
+
|
13
|
+
bundle install
|
14
|
+
rails g blog
|
15
|
+
rake db:migrate
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
After finishing installation you should be able to navigate to the CMS admin area (http://yoursite/cms-admin by default) and see a Blog Posts tab on the main navigation.
|
20
|
+
|
21
|
+
### The Blog Post
|
22
|
+
|
23
|
+
@post = BlogPost.first # Grab the first post
|
24
|
+
@post.title # The title of the post
|
25
|
+
@post.author # The name of the author
|
26
|
+
@post.content # The content of the post
|
27
|
+
@post.published? # Returns true if the post has been published
|
28
|
+
@post.created_at # Created at
|
29
|
+
@post.updated_at # Updated at
|
30
|
+
@post.comments_count # The total number of comments
|
31
|
+
@post.approved_comments_count # The number of approved comments
|
32
|
+
|
33
|
+
A blog post can be tagged with a comma separared list of words.
|
34
|
+
|
35
|
+
@post.blog_tags.collect(&:name).join(', ') # Returns a comma-separated list of tags in the post
|
36
|
+
|
37
|
+
|
38
|
+
A few scopes are also available for your convenience:
|
39
|
+
|
40
|
+
BlogPost.published # All the published posts
|
41
|
+
BlogPost.tagged_with(params[:tag_id].to_i) # All the posts tagged with a specific tag_id
|
42
|
+
BlogPost.published.tagged_with(params[:tag_id].to_i) # All the published posts tagged with a specific tag_id
|
43
|
+
|
44
|
+
### The Comments
|
45
|
+
|
46
|
+
@comment = @post.blog_comments.first # Grab the first comment
|
47
|
+
@comment.name # The name of the author
|
48
|
+
@comment.email # The email of the author
|
49
|
+
@comment.content # The comment
|
50
|
+
@comment.created_at # Created at
|
51
|
+
@comment.updated_at # Updated at
|
52
|
+
|
53
|
+
|
54
|
+
## Dependencies
|
55
|
+
|
56
|
+
Sofa Blog depends on:
|
57
|
+
|
58
|
+
* **[ComfortableMexicanSofa](https://github.com/twg/comfortable-mexican-sofa)** - A tiny and powerful micro CMS for your Rails 3 application
|
59
|
+
|
60
|
+
* * *
|
61
|
+
|
62
|
+

|
63
|
+
|
64
|
+
Sofa Blog is released under the [MIT license](https://github.com/twg/sofa-blog/raw/master/LICENSE)
|
65
|
+
|
66
|
+
Copyright 2011 Jack Neto, [The Working Group Inc](http://www.twg.ca)
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'jeweler'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = 'sofa_blog'
|
9
|
+
gem.summary = 'A blog extension for Comfortable Mexican Sofa'
|
10
|
+
gem.description = ''
|
11
|
+
gem.email = 'jack@theworkinggroup.ca'
|
12
|
+
gem.homepage = 'http://github.com/twg/sofa-blog'
|
13
|
+
gem.authors = ['Jack Neto', 'The Working Group Inc']
|
14
|
+
gem.add_dependency('comfortable_mexican_sofa', '>=1.0.46')
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/app/.DS_Store
ADDED
Binary file
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class CmsAdmin::BlogCommentsController < CmsAdmin::BaseController
|
2
|
+
before_filter :load_blog_post
|
3
|
+
before_filter :build_blog_comment, :only => [:new, :create]
|
4
|
+
before_filter :load_blog_comment, :only => [:show, :edit, :update, :destroy, :approve, :disapprove]
|
5
|
+
|
6
|
+
def index
|
7
|
+
@blog_comments = BlogComment.order('created_at DESC')
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
# ...
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
# ...
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
@blog_comment.save!
|
20
|
+
flash[:notice] = 'Comment created'
|
21
|
+
redirect_to :action => :edit, :id => @blog_post
|
22
|
+
rescue ActiveRecord::RecordInvalid
|
23
|
+
render :action => :new
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
# ...
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
if @blog_comment.update_attributes(params[:blog_comment])
|
32
|
+
flash[:notice] = 'Comment updated'
|
33
|
+
redirect_to :action => :index, :id => @blog_comment
|
34
|
+
else
|
35
|
+
render :action => :edit
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
@blog_comment.destroy
|
41
|
+
|
42
|
+
flash[:notice] = 'Comment removed'
|
43
|
+
redirect_to :action => :index
|
44
|
+
end
|
45
|
+
|
46
|
+
def approve
|
47
|
+
@blog_comment.approve!
|
48
|
+
end
|
49
|
+
|
50
|
+
def disapprove
|
51
|
+
@blog_comment.disapprove!
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
def load_blog_post
|
56
|
+
@blog_post = BlogPost.find(params[:blog_post_id])
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_blog_comment
|
60
|
+
@blog_comment = BlogComment.find(params[:id])
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_blog_comment
|
64
|
+
@blog_comment = @blog_post.blog_comments.build(params[:blog_comment])
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class CmsAdmin::BlogPostsController < CmsAdmin::BaseController
|
2
|
+
before_filter :build_blog_post, :only => [:new, :create]
|
3
|
+
before_filter :load_blog_post, :only => [:edit, :update, :destroy]
|
4
|
+
|
5
|
+
def index
|
6
|
+
@blog_posts = BlogPost.order('created_at DESC')
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
@blog_post.published ||= true
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
@blog_post.save!
|
15
|
+
flash[:notice] = 'Blog post created'
|
16
|
+
redirect_to :action => :edit, :id => @blog_post
|
17
|
+
rescue ActiveRecord::RecordInvalid
|
18
|
+
render :action => :new
|
19
|
+
end
|
20
|
+
|
21
|
+
def edit
|
22
|
+
# ...
|
23
|
+
end
|
24
|
+
|
25
|
+
def update
|
26
|
+
@blog_post.update_attributes!(params[:blog_post])
|
27
|
+
flash[:notice] = 'Post updated'
|
28
|
+
redirect_to :action => :edit, :id => @blog_post
|
29
|
+
rescue ActiveRecord::RecordInvalid
|
30
|
+
render :action => :edit
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy
|
34
|
+
@blog_post.destroy
|
35
|
+
|
36
|
+
flash[:notice] = 'Post removed'
|
37
|
+
redirect_to :action => :index
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
def build_blog_post
|
42
|
+
@blog_post = BlogPost.new(params[:blog_post])
|
43
|
+
end
|
44
|
+
|
45
|
+
def load_blog_post
|
46
|
+
@blog_post = BlogPost.find_by_id(params[:id].to_i)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class BlogComment < ActiveRecord::Base
|
2
|
+
|
3
|
+
# -- Relationships --------------------------------------------------------
|
4
|
+
|
5
|
+
belongs_to :blog_post, :counter_cache => :comments_count
|
6
|
+
|
7
|
+
# -- Validations ----------------------------------------------------------
|
8
|
+
|
9
|
+
validates_presence_of :content
|
10
|
+
validates_length_of :email,
|
11
|
+
:in => 6..100,
|
12
|
+
:too_short => 'Your email address needs to be at least 6 characters long.'
|
13
|
+
validates_format_of :email,
|
14
|
+
:message => 'The email you entered is not valid.',
|
15
|
+
:with => /^([\w.%-+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
16
|
+
|
17
|
+
# -- Scopes ----------------------------------------------------------
|
18
|
+
|
19
|
+
scope :approved, where(:approved => true)
|
20
|
+
|
21
|
+
# -- AR Callbacks ---------------------------------------------------------
|
22
|
+
|
23
|
+
after_save :update_approved_comments_counter, :update_comments_counter
|
24
|
+
after_destroy :update_approved_comments_counter, :update_comments_counter
|
25
|
+
|
26
|
+
# -- Instance Methods --------------------------------------------------------
|
27
|
+
|
28
|
+
def approve!
|
29
|
+
update_attribute(:approved, true)
|
30
|
+
end
|
31
|
+
|
32
|
+
def disapprove!
|
33
|
+
update_attribute(:approved, false)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
protected
|
38
|
+
def update_approved_comments_counter
|
39
|
+
self.connection.execute("UPDATE blog_posts SET approved_comments_count = #{blog_post.blog_comments.approved.count} WHERE id = #{blog_post.id}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def update_comments_counter
|
43
|
+
self.connection.execute("UPDATE blog_posts SET comments_count = #{blog_post.blog_comments.count} WHERE id = #{blog_post.id}")
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class BlogPost < ActiveRecord::Base
|
2
|
+
|
3
|
+
attr_accessor :tag_names
|
4
|
+
|
5
|
+
# -- Relationships --------------------------------------------------------
|
6
|
+
|
7
|
+
has_many :blog_comments, :dependent => :destroy
|
8
|
+
has_many :blog_taggings, :dependent => :destroy
|
9
|
+
has_many :blog_tags, :through => :blog_taggings
|
10
|
+
|
11
|
+
# -- Validations ----------------------------------------------------------
|
12
|
+
|
13
|
+
validates :content, :presence => {:message => 'Please enter some content for this post'}
|
14
|
+
validates :title, :presence => {:message => 'Please enter a title for this post'}
|
15
|
+
|
16
|
+
# -- Scopes ----------------------------------------------------------
|
17
|
+
|
18
|
+
scope :published, where(:published => true).order('created_at DESC')
|
19
|
+
scope :tagged_with, lambda { |tag_id|
|
20
|
+
joins(:blog_taggings).where('blog_taggings.blog_tag_id' => tag_id)
|
21
|
+
}
|
22
|
+
|
23
|
+
# -- AR Callbacks ---------------------------------------------------------
|
24
|
+
|
25
|
+
before_save :assign_tags
|
26
|
+
after_save :delete_unused_tags
|
27
|
+
|
28
|
+
# -- Instance Methods --------------------------------------------------------
|
29
|
+
|
30
|
+
def to_param
|
31
|
+
"#{self.id}-#{title.downcase.gsub(/\W|_/, ' ').strip.squeeze(' ').gsub(/\s/, '-')}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def tag_names
|
35
|
+
@tag_names ||= self.blog_tags.collect(&:name).join(', ')
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
protected
|
40
|
+
def self.collect_tags(query)
|
41
|
+
return [] if query.blank?
|
42
|
+
query.split(',').collect{|t| t.strip.downcase}.delete_if{|s|s.blank?}.uniq
|
43
|
+
end
|
44
|
+
|
45
|
+
def assign_tags
|
46
|
+
self.tag_names # IMPORTANT: populating @tag_names so we can rebuild existing taggings
|
47
|
+
self.blog_taggings.delete_all
|
48
|
+
|
49
|
+
BlogPost.collect_tags(self.tag_names).each do |tag_name|
|
50
|
+
if existing_tag = BlogTag.find_by_name(tag_name)
|
51
|
+
self.blog_tags << existing_tag
|
52
|
+
else
|
53
|
+
self.blog_tags.new(:name => tag_name)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
@tag_names = nil # reloading the reader
|
57
|
+
end
|
58
|
+
|
59
|
+
def delete_unused_tags
|
60
|
+
BlogTag.destroy_all('blog_taggings_count = 0')
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class BlogTag < ActiveRecord::Base
|
2
|
+
|
3
|
+
# -- AR Callbacks ---------------------------------------------------------
|
4
|
+
|
5
|
+
before_validation :downcase_name
|
6
|
+
|
7
|
+
# -- Validations ----------------------------------------------------------
|
8
|
+
|
9
|
+
validates_uniqueness_of :name
|
10
|
+
|
11
|
+
# -- Relationships --------------------------------------------------------
|
12
|
+
|
13
|
+
has_many :blog_taggings, :dependent => :destroy
|
14
|
+
has_many :blog_posts, :through => :blog_taggings
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def downcase_name
|
19
|
+
self.name = self.name.downcase unless self.name.blank?
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/app/views/.DS_Store
ADDED
Binary file
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<li>
|
2
|
+
<div class='item'>
|
3
|
+
<div class='icon' style="background-image:url(http://www.gravatar.com/avatar/<%=Digest::MD5.hexdigest(blog_comment.email.downcase)%>?s=28&d=identicon)"></div>
|
4
|
+
<div class='action_links'>
|
5
|
+
<%= render :partial => 'status', :locals => {:blog_comment => blog_comment} %>
|
6
|
+
<%= link_to 'Edit', edit_cms_admin_blog_post_blog_comment_path(@blog_post, blog_comment) %>
|
7
|
+
<%= link_to 'Delete', cms_admin_blog_post_blog_comment_path(@blog_post, blog_comment), :method => 'delete', :confirm => 'Are you sure?' %>
|
8
|
+
</div>
|
9
|
+
<div class='label'>
|
10
|
+
<div class='sublabel'>
|
11
|
+
<em>
|
12
|
+
<%= time_ago_in_words(blog_comment.updated_at) %> ago
|
13
|
+
<strong><%= mail_to(blog_comment.email, blog_comment.name) %></strong> wrote
|
14
|
+
<% if !blog_comment.approved? %>[Waiting approval]<% end %>
|
15
|
+
</em>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
<div class='content'>
|
19
|
+
<%= simple_format(auto_link(blog_comment.content)) %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</li>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%= content_for :head do %>
|
2
|
+
<script type="text/javascript">
|
3
|
+
$(document).ready(function() {
|
4
|
+
$('#blog_comment_content').focus();
|
5
|
+
})
|
6
|
+
</script>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<div id='form_blocks'>
|
10
|
+
<%= form.text_field :name %>
|
11
|
+
<%= form.text_field :email %>
|
12
|
+
<%= form.text_area :content %>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
|
16
|
+
<%= form.simple_field nil, nil, :class => 'submit_element' do %>
|
17
|
+
<%= form.check_box :approved, :disable_builder => true %>
|
18
|
+
<%= form.label_for :approved, :label => 'Approved' %>
|
19
|
+
<%= form.submit @blog_post.new_record?? 'Create comment' : 'Update comment', :disable_builder => true %>
|
20
|
+
or
|
21
|
+
<%= link_to 'cancel', :back%>
|
22
|
+
<% end %>
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<span id="<%= dom_id(blog_comment, :status) %>">
|
2
|
+
<% if blog_comment.approved? %>
|
3
|
+
<%= link_to 'Disapprove', disapprove_cms_admin_blog_post_blog_comment_path(@blog_post, blog_comment), :remote => true, :method => :put, :before => "$('##{dom_id(blog_comment, :status)}').html('disapproving ...')", :update => dom_id(blog_comment, :status) %>
|
4
|
+
<% else %>
|
5
|
+
<%= link_to 'Approve', approve_cms_admin_blog_post_blog_comment_path(@blog_post, blog_comment), :remote => true, :method => :put, :before => "$('##{dom_id(blog_comment, :status)}').html('approving ...')", :update => dom_id(blog_comment, :status) %>
|
6
|
+
<% end %>
|
7
|
+
</span>
|
@@ -0,0 +1 @@
|
|
1
|
+
page << "$('##{dom_id(@blog_comment, :status)}').html('#{escape_javascript(render(:partial => 'status', :locals => {:blog_comment => @blog_comment}))}')"
|
@@ -0,0 +1 @@
|
|
1
|
+
page << "$('##{dom_id(@blog_comment, :status)}').html('#{escape_javascript(render(:partial => 'status', :locals => {:blog_comment => @blog_comment}))}')"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<li>
|
2
|
+
<div class='item'>
|
3
|
+
<div class='icon'></div>
|
4
|
+
<div class='action_links'>
|
5
|
+
<%= link_to pluralize(blog_post.comments_count, 'comment'), cms_admin_blog_post_blog_comments_path(blog_post) %>
|
6
|
+
<%= link_to 'Edit', edit_cms_admin_blog_post_path(blog_post) %>
|
7
|
+
<%= link_to 'Delete', cms_admin_blog_post_path(blog_post), :method => 'delete', :confirm => 'Are you sure?' %>
|
8
|
+
</div>
|
9
|
+
<div class='label'>
|
10
|
+
<%= link_to blog_post.title.titleize, edit_cms_admin_blog_post_path(blog_post)%>
|
11
|
+
<div class='sublabel'>
|
12
|
+
Published <%= time_ago_in_words(blog_post.updated_at) %> ago
|
13
|
+
by <strong><%= blog_post.author %></strong>
|
14
|
+
<% if !blog_post.published? %>[DRAFT]<% end %>
|
15
|
+
<% blog_post.blog_tags.each do |tag| %>
|
16
|
+
<span class="tag"><%= tag.name %></span>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</li>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<% content_for :head do %>
|
2
|
+
<%= javascript_include_tag 'comfortable_mexican_sofa/blog/jquery.autocomplete.pack' %>
|
3
|
+
<script type="text/javascript">
|
4
|
+
$(document).ready(function() {
|
5
|
+
$('#blog_post_title').focus();
|
6
|
+
$("#blog_post_tag_names").autocomplete(<%= BlogTag.all.collect(&:name).to_json.html_safe %>, {
|
7
|
+
multiple: true,
|
8
|
+
selectFirst: false
|
9
|
+
});
|
10
|
+
})
|
11
|
+
</script>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<% content_for :right_column do %>
|
15
|
+
<%= render :partial => 'cms_admin/uploads/index' %>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<div id='form_blocks'>
|
19
|
+
<%= form.text_field :title %>
|
20
|
+
<%= form.text_field :author %>
|
21
|
+
<%= form.text_field :tag_names, :label => 'Tags' %>
|
22
|
+
<%= form.text_area :content, :class=> 'rich_text' %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<%= form.simple_field nil, nil, :class => 'submit_element' do %>
|
26
|
+
<%= form.check_box :published, :disable_builder => true %>
|
27
|
+
<%= form.label_for :published, :label => 'Published' %>
|
28
|
+
<%= form.submit @blog_post.new_record?? 'Create post' : 'Update post', :disable_builder => true %>
|
29
|
+
or
|
30
|
+
<%= link_to 'cancel', :back%>
|
31
|
+
<% end %>
|
32
|
+
|
33
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= stylesheet_link_tag :blog, :cache => ('_blog' if ComfortableMexicanSofa.config.enable_caching) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= active_link_to 'Blog posts', cms_admin_blog_posts_path %>
|
data/config/.DS_Store
ADDED
Binary file
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
|
3
|
+
namespace :cms_admin, :path => ComfortableMexicanSofa.config.admin_route_prefix do
|
4
|
+
resources :blog_posts do
|
5
|
+
resources :blog_comments do
|
6
|
+
member do
|
7
|
+
put :approve
|
8
|
+
put :disapprove
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|