opinio 0.4.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,15 +30,16 @@ The most common way to quickly get Opinio working is:
30
30
  rails g opinio:install comment
31
31
 
32
32
  This will generate the *Comment* model, migration and also generate the opinio initializer for customization of the engine.
33
- A `opinio_model` will be added on the `routes.rb`. This method adds the default urls for the model that will acts as the comment
33
+ A +opinio_model+ will be added on the +routes.rb+. This method adds the default urls for the model that will act as the comment
34
+ in your app.
34
35
 
35
- In order to add the comments functionallity to a model, you use the *opinio_subjectum* method
36
+ In order to add the comments functionality to a model, you use the *opinio_subjectum* method
36
37
 
37
38
  class Post < ActiveRecord::Base
38
39
  opinio_subjectum
39
40
  end
40
41
 
41
- On the `routes.rb` you should simply add an `opinio` for your resource that will have comments
42
+ On the +routes.rb+ you should simply add an +opinio+ for your resource that will have comments
42
43
 
43
44
  resources :posts do
44
45
  opinio
@@ -56,12 +57,12 @@ Alternatively you can render just the comments or just the form like this:
56
57
  <%= render_comments_form @post %>
57
58
 
58
59
  If you need to render the comments with a specific page or limit
59
- you can use Kaminari's configurations like `paginates_per 10` on your comment model
60
+ you can use Kaminari's configurations like +paginates_per 10+ on your comment model
60
61
  or you can customize it for specific views on the helpers
61
62
 
62
63
  <%= render_comments @post, :page => params[:page], :limit => 5 %>
63
64
 
64
- This can also be used on the `comments_for` helper.
65
+ This can also be used on the +comments_for+ helper.
65
66
 
66
67
  == Customization
67
68
 
@@ -142,8 +143,7 @@ For issues please use the github {issues tracker}[https://github.com/Draiken/opi
142
143
 
143
144
  === TODO
144
145
 
145
- * Haml views
146
146
  * Better controller overriding (coding and documentation)
147
147
  * Support for deeper levels of replies
148
- * Refactor the `comments_for` helper
148
+ * Refactor the +comments_for+ helper
149
149
  * Extract documentation to wiki
@@ -10,14 +10,19 @@ class Opinio::CommentsController < ApplicationController
10
10
  @comment = resource.comments.build(params[:comment])
11
11
  @comment.owner = send(Opinio.current_user_method)
12
12
  if @comment.save
13
- messages = {:notice => I18n.translate('opinio.comment.sent', :default => "Comment sent successfully.")}
13
+ flash_area = :notice
14
+ message = t('opinio.messages.comment_sent')
14
15
  else
15
- messages = {:error => I18n.translate('opinio.comment.error', :default => "Error sending the comment.")}
16
+ flash_area = :error
17
+ message = t('opinio.messages.comment_sending_error')
16
18
  end
17
19
 
18
20
  respond_to do |format|
19
21
  format.js
20
- format.html { redirect_to( resource, :flash => messages ) }
22
+ format.html do
23
+ set_flash(flash_area, message)
24
+ redirect_to(resource.is_a?(Opinio.model_name.constantize) ? resource.commentable : resource)
25
+ end
21
26
  end
22
27
  end
23
28
 
@@ -26,7 +31,7 @@ class Opinio::CommentsController < ApplicationController
26
31
 
27
32
  if can_destroy_opinio?(@comment)
28
33
  @comment.destroy
29
- flash[:notice] = I18n.translate('opinio.comment.destroyed', :default => "Comment removed successfully")
34
+ set_flash(:notice, t('opinio.messages.comment_destroyed'))
30
35
  else
31
36
  #flash[:error] = I18n.translate('opinio.comment.not_permitted', :default => "Not permitted")
32
37
  logger.warn "user #{send(Opinio.current_user_method)} tried to remove a comment from another user #{@comment.owner.id}"
@@ -38,6 +43,5 @@ class Opinio::CommentsController < ApplicationController
38
43
  format.html { redirect_to( @comment.commentable ) }
39
44
  end
40
45
  end
41
-
42
46
 
43
47
  end
@@ -2,12 +2,12 @@
2
2
  <li id="comment_<%= comment.id %>">
3
3
  <span>User: <%= comment.owner.id %></span>
4
4
  <p>
5
- <%= comment.body %>
5
+ <%= simple_format(comment.body) %>
6
6
  </p>
7
- <%= link_to 'Destroy', comment_path(comment), :method => :delete, :remote => true %>
7
+ <%= link_to t('opinio.actions.delete'), comment_path(comment), :method => :delete, :remote => true %>
8
8
  <%# this enables only 1 level of replies %>
9
9
  <% if Opinio.accept_replies && !reply %>
10
- <span><%= link_to t("opinio.reply", :default => "Reply"), reply_comment_path(comment), :remote => true %></span>
10
+ <span><%= link_to t('opinio.actions.reply'), reply_comment_path(comment), :remote => true %></span>
11
11
  <ul id="comment_<%= comment.id %>_replies" class="replies">
12
12
  <%= render :partial => "opinio/comments/comment", :collection => comment.comments, :locals => {:reply => true} %>
13
13
  </ul>
@@ -0,0 +1,10 @@
1
+ - reply = defined?(reply) ? reply : false
2
+ %li{:id => "comment_#{comment.id}"}
3
+ %span User: #{comment.owner.id}
4
+ %p= simple_format(comment.body)
5
+ = link_to t('opinio.actions.delete'), comment_path(comment), :method => :delete, :remote => true
6
+ -# this enables only 1 level of replies
7
+ -if Opinio.accept_replies && !reply
8
+ %span= link_to t('opinio.actions.reply'), reply_comment_path(comment), :remote => true
9
+ %ul.replies{:id => "comment_#{comment.id}_replies"}
10
+ = render :partial => "opinio/comments/comment", :collection => comment.comments, :locals => {:reply => true}
@@ -6,7 +6,7 @@
6
6
  <% unless comments.empty? %>
7
7
  <%= render :partial => 'opinio/comments/comment', :collection => comments %>
8
8
  <% else %>
9
- <li id="no_comments"><%= t 'opinio.no_comments_found', :default => "No comments found" %></li>
9
+ <li id="no_comments"><%= t('opinio.messages.no_comments_found') %></li>
10
10
  <% end %>
11
11
  </ul>
12
12
 
@@ -0,0 +1,9 @@
1
+ %div= paginate comments
2
+
3
+ %ul#comments
4
+ - unless comments.empty?
5
+ = render :partial => 'opinio/comments/comment', :collection => comments
6
+ - else
7
+ %li#no_comments= t('opinio.messages.no_comments_found')
8
+
9
+ %div= paginate comments
@@ -1,18 +1,17 @@
1
1
  <div id="new_comment">
2
2
  <% if send(Opinio.current_user_method) %>
3
- <h3>Send Comments</h3>
4
- <%= form_for Comment.new, :remote => true do |f| %>
3
+ <h3><%= t('opinio.messages.add_comment') %></h3>
4
+ <%= form_for Comment.new, :remote => false do |f| %>
5
5
  <p>
6
- <%= f.label :body, "Comment" %>
7
- <%= f.text_area :body, :id => "Comment" %>
6
+ <%= f.text_area :body %>
8
7
  </p>
9
8
  <%= hidden_field_tag :commentable_id, commentable.id %>
10
9
  <%= hidden_field_tag :commentable_type, commentable.class.base_class.name.to_s %>
11
- <%= f.submit "Send Comment" %>
10
+ <%= f.submit t('opinio.actions.add') %>
12
11
  <% end %>
13
12
  <% else %>
14
13
  <p>
15
- Must be logged in to comment.
14
+ <%= t('opinio.messages.must_be_logged_in_to_comment') %>
16
15
  </p>
17
16
  <% end %>
18
17
  </div>
@@ -0,0 +1,10 @@
1
+ #new_comment
2
+ - if send(Opinio.current_user_method)
3
+ %h3= t('opinio.messages.add_comment')
4
+ = form_for Comment.new, :remote => false do |f|
5
+ %p= f.text_area :body
6
+ = hidden_field_tag :commentable_id, commentable.id
7
+ = hidden_field_tag :commentable_type, commentable.class.base_class.name.to_s
8
+ = f.submit t('opinio.actions.add')
9
+ - else
10
+ %p= t('opinio.messages.must_be_logged_in_to_comment')
@@ -1,14 +1,15 @@
1
- $('#no_comments').fadeOut()
1
+ $('#no_comments').hide();
2
2
  <% if @comment.valid? %>
3
3
  <% if @reply %>
4
4
  if($('#comment_<%= @comment.commentable_id %> ul').length == 0)
5
- $('#comment_<%= @comment.commentable_id %>').append('<ul id="comment_<%= @comment.commentable_id %>_replies" class="replies"></ul>')
6
- $('#comment_<%= @comment.commentable_id %>_replies').append("<%= escape_javascript( render @comment, :locals => {:reply => @reply} ) %>")
7
- $('#commentable_id').val('<%= @comment.commentable.commentable_id %>')
8
- $('#commentable_type').val('<%= @comment.commentable.commentable_type %>')
5
+ $('#comment_<%= @comment.commentable_id %>').append('<ul id="comment_<%= @comment.commentable_id %>_replies" class="replies"></ul>');
6
+ $('#comment_<%= @comment.commentable_id %>_replies').append("<%= escape_javascript( render @comment, :locals => {:reply => @reply} ) %>");
7
+ $('#commentable_id').val('<%= @comment.commentable.commentable_id %>');
8
+ $('#commentable_type').val('<%= @comment.commentable.commentable_type %>');
9
9
  <% else %>
10
- $('#comments').prepend("<%= escape_javascript( render @comment, :locals => {:reply => @reply} ) %>")
10
+ $('#comments').<%= Opinio.sort_order == 'ASC' ? 'append' : 'prepend'%>("<%= escape_javascript( render @comment, :locals => {:reply => @reply} ) %>");
11
11
  <% end %>
12
+ $('textarea#comment_body').val('');
12
13
  <% else %>
13
14
  $('#comments').prepend("<%= escape_javascript(flash[:notice]) %>");
14
15
  $('#comments').prepend("<%= escape_javascript(flash[:error]) %>");
@@ -1,4 +1,4 @@
1
- <h1>Comments</h1>
1
+ <h1><%= t('opinio.messages.comments') %></h1>
2
2
 
3
3
  <%= paginate @comments %>
4
4
 
@@ -0,0 +1,7 @@
1
+ %h1= t('opinio.messages.comments')
2
+
3
+ = paginate @comments
4
+
5
+ = render :partial => "opinio/comments/comments", :locals => { :comments => @comments }
6
+
7
+ = paginate @comments
@@ -1,4 +1,4 @@
1
- $("#commentable_id").val('<%= @commentable_id %>')
2
- $("#commentable_type").val('<%= @commentable_type %>')
3
- $("#new_comment textarea").val('')
4
- $("#new_comment textarea").focus()
1
+ $("#commentable_id").val('<%= @commentable_id %>');
2
+ $("#commentable_type").val('<%= @commentable_type %>');
3
+ $("#new_comment textarea").val('');
4
+ $("#new_comment textarea").focus();
@@ -0,0 +1,16 @@
1
+ en:
2
+ opinio:
3
+ actions:
4
+ delete: 'Delete'
5
+ reply: 'Reply'
6
+ add: 'Add comment'
7
+ messages:
8
+ no_comments_found: 'No comments found'
9
+ must_be_logged_in_to_comment: 'Must be logged in to comment.'
10
+ add_comment: 'Add comment'
11
+ comments: 'Comments'
12
+ comment_sent: 'Comment sent successfully.'
13
+ comment_sending_error: 'Error while sending the comment.'
14
+ comment_destroyed: 'Comment removed successfully.'
15
+ comment_interval: 'You must wait %{time} seconds to comment again.'
16
+ cannot_be_comment_of_comment: "Cannot reply another comment's reply"
@@ -14,4 +14,15 @@ Opinio.setup do |config|
14
14
  # Here you can change the method called to check who is the current user
15
15
  # config.current_user_method = :current_user
16
16
 
17
+ # Strip html tags on save comment
18
+ config.strip_html_tags_on_save = true
19
+
20
+ # Comments sort order by created_at (DESC or ASC)
21
+ # Note: you can override that easily within each opinio subjectum
22
+ config.sort_order = 'DESC'
23
+
24
+ # Wether or not the default opinio controller should set the flash
25
+ # when creating/removing comments
26
+ config.set_flash = true
27
+
17
28
  end
@@ -2,12 +2,26 @@ module Opinio
2
2
  module Generators
3
3
  class ViewsGenerator < Rails::Generators::Base
4
4
 
5
- source_root File.expand_path('../../../../../app/views', __FILE__)
5
+ source_root File.expand_path('../../../../../app/views/opinio/comments', __FILE__)
6
+
7
+ class_option :haml, :desc => 'Generate HAML views instead of ERB.', :type => :boolean
6
8
 
7
9
  def copy_views
8
- directory "opinio", "app/views/opinio"
10
+ html_names = ["_comment", "_comments", "_new", "index"]
11
+ js_names = ["create", "destroy", "reply"]
12
+ html_names.each do |name|
13
+ copy_file "#{name}.html.#{view_language}", "app/views/opinio/comments/#{name}.html.#{view_language}"
14
+ end
15
+ js_names.each do |name|
16
+ copy_file "#{name}.js.erb", "app/views/opinio/comments/#{name}.js.erb"
17
+ end
18
+ end
19
+
20
+ def view_language
21
+ options.haml? ? 'haml' : 'erb'
9
22
  end
10
23
 
24
+
11
25
  end
12
26
  end
13
27
  end
@@ -1,10 +1,10 @@
1
1
  module Opinio
2
- autoload :Schema, 'opinio/schema'
2
+ require 'opinio/schema'
3
3
 
4
4
  module Controllers
5
- autoload :Helpers, 'opinio/controllers/helpers'
6
- autoload :InternalHelpers, 'opinio/controllers/internal_helpers'
7
- autoload :Replies, 'opinio/controllers/replies'
5
+ require 'opinio/controllers/helpers'
6
+ require 'opinio/controllers/internal_helpers'
7
+ require 'opinio/controllers/replies'
8
8
  end
9
9
 
10
10
  mattr_accessor :model_name
@@ -31,6 +31,15 @@ module Opinio
31
31
  mattr_accessor :current_user_method
32
32
  @@current_user_method = :current_user
33
33
 
34
+ mattr_accessor :strip_html_tags_on_save
35
+ @@strip_html_tags_on_save = true
36
+
37
+ mattr_accessor :sort_order
38
+ @@sort_order = 'DESC'
39
+
40
+ mattr_accessor :set_flash
41
+ @@set_flash = true
42
+
34
43
  def self.setup
35
44
  yield self
36
45
  end
@@ -28,6 +28,10 @@ module Opinio
28
28
  def resource_name
29
29
  Opinio.model_name
30
30
  end
31
+
32
+ def set_flash(name, message)
33
+ flash[name] = message if Opinio.set_flash
34
+ end
31
35
  end
32
36
  end
33
37
  end
@@ -71,6 +71,11 @@ module Opinio
71
71
  send :include, RepliesSupport
72
72
  end
73
73
 
74
+ if Opinio.strip_html_tags_on_save
75
+ send :include, ActionView::Helpers::SanitizeHelper
76
+ before_save :strip_html_tags
77
+ end
78
+
74
79
  end
75
80
  end
76
81
 
@@ -93,12 +98,7 @@ module Opinio
93
98
  if (Time.now - last_comment.created_at).round >= self.comments_interval
94
99
  true
95
100
  else
96
- errors.add(
97
- :created_at,
98
- I18n.t('opinio.comment_interval',
99
- :time => self.comments_interval,
100
- :default => "You must wait %{time} seconds to comment again.")
101
- )
101
+ errors.add(:created_at, I18n.translate('opinio.messages.comment_interval', :time => self.comments_interval))
102
102
  false
103
103
  end
104
104
  else
@@ -110,11 +110,15 @@ module Opinio
110
110
  def cannot_be_comment_of_a_comments_comment
111
111
  if new_record? && self.commentable_type == Opinio.model_name
112
112
  if commentable.commentable_type == Opinio.model_name
113
- errors.add :base, I18n.translate('opinio.cannot_be_comment_of_comment', :default => 'Cannot reply another comment\'s reply')
113
+ errors.add :base, I18n.t('opinio.messages,cannot_be_comment_of_comment')
114
114
  end
115
115
  end
116
116
  end
117
117
 
118
+ def strip_html_tags
119
+ self.body = strip_tags(self.body)
120
+ end
121
+
118
122
  end
119
123
  end
120
124
  end
@@ -12,7 +12,7 @@ module Opinio
12
12
  has_many :comments,
13
13
  :class_name => Opinio.model_name,
14
14
  :as => :commentable,
15
- :order => options.reverse_merge(:order => "created_at DESC")[:order],
15
+ :order => options.reverse_merge(:order => "created_at #{Opinio.sort_order}")[:order],
16
16
  :dependent => :destroy
17
17
 
18
18
 
@@ -1,5 +1,5 @@
1
1
  module Opinio
2
2
  class Version
3
- VERSION = '0.4.1'
3
+ VERSION = '0.5'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opinio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: '0.5'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000Z
12
+ date: 2012-04-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &2153246840 !ruby/object:Gem::Requirement
16
+ requirement: &2164731680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2153246840
24
+ version_requirements: *2164731680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: kaminari
27
- requirement: &2153246340 !ruby/object:Gem::Requirement
27
+ requirement: &2164881320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2153246340
35
+ version_requirements: *2164881320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jquery-rails
38
- requirement: &2153245840 !ruby/object:Gem::Requirement
38
+ requirement: &2165159760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2153245840
46
+ version_requirements: *2165159760
47
47
  description: Opinio is an engine used to add comments functionallity to rails 3 applications.
48
48
  email:
49
49
  - luiz.felipe.gp@gmail.com
@@ -53,11 +53,15 @@ extra_rdoc_files: []
53
53
  files:
54
54
  - app/controllers/opinio/comments_controller.rb
55
55
  - app/views/opinio/comments/_comment.html.erb
56
+ - app/views/opinio/comments/_comment.html.haml
56
57
  - app/views/opinio/comments/_comments.html.erb
58
+ - app/views/opinio/comments/_comments.html.haml
57
59
  - app/views/opinio/comments/_new.html.erb
60
+ - app/views/opinio/comments/_new.html.haml
58
61
  - app/views/opinio/comments/create.js.erb
59
62
  - app/views/opinio/comments/destroy.js.erb
60
63
  - app/views/opinio/comments/index.html.erb
64
+ - app/views/opinio/comments/index.html.haml
61
65
  - app/views/opinio/comments/reply.js.erb
62
66
  - lib/generators/opinio/install/install_generator.rb
63
67
  - lib/generators/opinio/install/templates/initializers/opinio.erb
@@ -78,6 +82,7 @@ files:
78
82
  - lib/opinio/shared_examples.rb
79
83
  - lib/opinio/version.rb
80
84
  - lib/opinio.rb
85
+ - config/locales/opinio.en.yml
81
86
  - MIT-LICENSE
82
87
  - Rakefile
83
88
  - Gemfile-rails-3.0.x