the_comments 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc.example +1 -0
- data/.travis.yml +5 -0
- data/README.md +105 -425
- data/app/assets/javascripts/the_comments.js.coffee +12 -9
- data/app/assets/javascripts/the_comments_manage.js.coffee +19 -49
- data/app/assets/stylesheets/the_comments.css.scss +20 -29
- data/app/controllers/_templates_/comments_controller.rb +44 -0
- data/app/controllers/concerns/controller.rb +216 -0
- data/app/helpers/render_comments_tree_helper.rb +4 -7
- data/app/models/_templates_/comment.rb +38 -0
- data/app/models/concerns/comment.rb +103 -0
- data/app/models/concerns/comment_states.rb +80 -0
- data/app/models/concerns/commentable.rb +69 -0
- data/app/models/concerns/user.rb +52 -0
- data/app/views/the_comments/_tree.html.erb +3 -0
- data/app/views/the_comments/haml/_additional_info.html.haml +13 -0
- data/app/views/the_comments/{_comment.html.haml → haml/_comment.html.haml} +0 -0
- data/app/views/the_comments/haml/_comment_body.html.haml +20 -0
- data/app/views/the_comments/haml/_comment_edit.html.haml +26 -0
- data/app/views/the_comments/{_form.html.haml → haml/_form.html.haml} +8 -6
- data/app/views/the_comments/haml/_manage_controls.html.haml +27 -0
- data/app/views/the_comments/haml/_sidebar.html.haml +28 -0
- data/app/views/the_comments/haml/_tree.html.haml +4 -0
- data/app/views/the_comments/haml/index.html.haml +18 -0
- data/app/views/the_comments/haml/manage.html.haml +25 -0
- data/app/views/the_comments/haml/my_comments.html.haml +28 -0
- data/app/views/the_comments/slim/_additional_info.html.slim +13 -0
- data/app/views/the_comments/slim/_comment.html.slim +1 -0
- data/app/views/the_comments/slim/_comment_body.html.slim +20 -0
- data/app/views/the_comments/slim/_comment_edit.html.slim +26 -0
- data/app/views/the_comments/slim/_form.html.slim +27 -0
- data/app/views/the_comments/slim/_manage_controls.html.slim +27 -0
- data/app/views/the_comments/slim/_sidebar.html.slim +28 -0
- data/app/views/the_comments/slim/_tree.html.slim +4 -0
- data/app/views/the_comments/slim/index.html.slim +18 -0
- data/app/views/the_comments/slim/manage.html.slim +25 -0
- data/app/views/the_comments/slim/my_comments.html.slim +28 -0
- data/{lib/generators/the_comments/templates → config/initializers}/the_comments.rb +3 -0
- data/config/locales/en.yml +39 -14
- data/config/locales/ru.yml +67 -0
- data/config/routes.rb +17 -13
- data/db/migrate/20130101010101_change_user.rb +18 -0
- data/db/migrate/20130101010102_create_comments.rb +50 -0
- data/db/migrate/20130101010103_change_commentable.rb +13 -0
- data/docs/admin_ui_installation.md +145 -0
- data/docs/advanced_installation.md +182 -0
- data/docs/comment_api.md +58 -0
- data/docs/commentable_api.md +59 -0
- data/docs/config_file.md +27 -0
- data/docs/content_preprocessors.md +73 -0
- data/docs/customazation_of_views.md +30 -0
- data/docs/denormalization_and_recent_comments.md +40 -0
- data/docs/documentation.md +28 -0
- data/docs/mountable_routes.md +80 -0
- data/docs/pagination.md +123 -0
- data/docs/screencast.jpg +0 -0
- data/docs/user_api.md +75 -0
- data/docs/what_is_comcoms.md +63 -0
- data/docs/whats_wrong_with_other_gems.md +18 -0
- data/docs/where_is_example_application.md +37 -0
- data/gem_version.rb +3 -0
- data/lib/generators/the_comments/USAGE +31 -20
- data/lib/generators/the_comments/the_comments_generator.rb +35 -18
- data/lib/generators/the_comments/views_generator.rb +52 -16
- data/lib/the_comments/config.rb +14 -1
- data/lib/the_comments/version.rb +1 -3
- data/lib/the_comments.rb +10 -0
- data/spec/dummy_app/.gitignore +17 -0
- data/spec/dummy_app/.rspec +1 -0
- data/spec/dummy_app/.ruby-gemset +1 -0
- data/spec/dummy_app/.ruby-version +1 -0
- data/spec/dummy_app/Gemfile +43 -0
- data/spec/dummy_app/README.md +50 -0
- data/spec/dummy_app/Rakefile +6 -0
- data/spec/dummy_app/app/assets/images/.keep +0 -0
- data/spec/dummy_app/app/assets/javascripts/admin_panel.js +5 -0
- data/spec/dummy_app/app/assets/javascripts/application.js +16 -0
- data/spec/dummy_app/app/assets/stylesheets/admin_panel.css +3 -0
- data/spec/dummy_app/app/assets/stylesheets/app.css.scss +4 -0
- data/spec/dummy_app/app/assets/stylesheets/application.css +16 -0
- data/spec/dummy_app/app/controllers/application_controller.rb +7 -0
- data/{lib/generators/the_comments/templates → spec/dummy_app/app/controllers}/comments_controller.rb +3 -1
- data/spec/dummy_app/app/controllers/concerns/.keep +0 -0
- data/spec/dummy_app/app/controllers/posts_controller.rb +13 -0
- data/spec/dummy_app/app/controllers/users_controller.rb +7 -0
- data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
- data/spec/dummy_app/app/mailers/.keep +0 -0
- data/spec/dummy_app/app/models/.keep +0 -0
- data/spec/dummy_app/app/models/comment.rb +32 -0
- data/spec/dummy_app/app/models/concerns/.keep +0 -0
- data/spec/dummy_app/app/models/post.rb +17 -0
- data/spec/dummy_app/app/models/user.rb +21 -0
- data/spec/dummy_app/app/views/layouts/admin.html.haml +25 -0
- data/spec/dummy_app/app/views/layouts/application.html.haml +20 -0
- data/spec/dummy_app/app/views/posts/index.html.haml +22 -0
- data/spec/dummy_app/app/views/posts/show.html.haml +7 -0
- data/spec/dummy_app/bin/bundle +3 -0
- data/spec/dummy_app/bin/rails +4 -0
- data/spec/dummy_app/bin/rake +4 -0
- data/spec/dummy_app/config/application.rb +23 -0
- data/spec/dummy_app/config/boot.rb +4 -0
- data/spec/dummy_app/config/database.yml +11 -0
- data/spec/dummy_app/config/environment.rb +5 -0
- data/spec/dummy_app/config/environments/development.rb +29 -0
- data/spec/dummy_app/config/environments/production.rb +80 -0
- data/spec/dummy_app/config/environments/test.rb +36 -0
- data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy_app/config/initializers/inflections.rb +16 -0
- data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_app/config/initializers/secret_token.rb +12 -0
- data/spec/dummy_app/config/initializers/session_store.rb +3 -0
- data/spec/dummy_app/config/initializers/sorcery.rb +437 -0
- data/spec/dummy_app/config/initializers/the_comments.rb +13 -0
- data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy_app/config/locales/en.yml +23 -0
- data/spec/dummy_app/config/routes.rb +15 -0
- data/spec/dummy_app/config.ru +4 -0
- data/spec/dummy_app/db/migrate/20130712061503_sorcery_core.rb +16 -0
- data/spec/dummy_app/db/migrate/20130712065951_create_posts.rb +11 -0
- data/spec/dummy_app/db/migrate/20131027185332_change_user.the_comments_engine.rb +19 -0
- data/spec/dummy_app/db/migrate/20131027185333_create_comments.the_comments_engine.rb +51 -0
- data/spec/dummy_app/db/migrate/20131027185334_change_commentable.the_comments_engine.rb +14 -0
- data/spec/dummy_app/db/schema.rb +74 -0
- data/spec/dummy_app/db/seeds.rb +42 -0
- data/spec/dummy_app/lib/assets/.keep +0 -0
- data/spec/dummy_app/lib/tasks/.keep +0 -0
- data/spec/dummy_app/lib/tasks/app_bootstrap.rake +15 -0
- data/spec/dummy_app/log/.keep +0 -0
- data/spec/dummy_app/public/404.html +58 -0
- data/spec/dummy_app/public/422.html +58 -0
- data/spec/dummy_app/public/500.html +57 -0
- data/spec/dummy_app/public/favicon.ico +0 -0
- data/spec/dummy_app/public/robots.txt +5 -0
- data/spec/dummy_app/spec/factories/post.rb +6 -0
- data/spec/dummy_app/spec/factories/user.rb +6 -0
- data/spec/dummy_app/spec/models/user_counters_spec.rb +339 -0
- data/spec/dummy_app/spec/spec_helper.rb +29 -0
- data/spec/dummy_app/test/controllers/.keep +0 -0
- data/spec/dummy_app/test/fixtures/.keep +0 -0
- data/spec/dummy_app/test/helpers/.keep +0 -0
- data/spec/dummy_app/test/integration/.keep +0 -0
- data/spec/dummy_app/test/mailers/.keep +0 -0
- data/spec/dummy_app/test/models/.keep +0 -0
- data/spec/dummy_app/test/test_helper.rb +15 -0
- data/spec/dummy_app/vendor/assets/javascripts/.keep +0 -0
- data/spec/dummy_app/vendor/assets/stylesheets/.keep +0 -0
- data/views_converter.rb +16 -0
- metadata +223 -45
- data/app/controllers/concerns/the_comments_controller.rb +0 -229
- data/app/controllers/concerns/the_comments_ip_controller.rb +0 -17
- data/app/controllers/concerns/the_comments_user_agent_controller.rb +0 -15
- data/app/models/concerns/the_comments_base.rb +0 -69
- data/app/models/concerns/the_comments_black_ip.rb +0 -9
- data/app/models/concerns/the_comments_black_user_agent.rb +0 -9
- data/app/models/concerns/the_comments_commentable.rb +0 -66
- data/app/models/concerns/the_comments_states.rb +0 -65
- data/app/models/concerns/the_comments_user.rb +0 -32
- data/app/views/ip_black_lists/index.html.haml +0 -17
- data/app/views/the_comments/_comment_body.html.haml +0 -30
- data/app/views/the_comments/_manage_controls.html.haml +0 -4
- data/app/views/the_comments/_tree.html.haml +0 -4
- data/app/views/the_comments/index.html.haml +0 -19
- data/app/views/the_comments/manage.html.haml +0 -29
- data/app/views/user_agent_black_lists/index.html.haml +0 -17
- data/db/migrate/20130101010101_create_comments.rb +0 -90
- data/lib/generators/the_comments/templates/ip_black_list.rb +0 -3
- data/lib/generators/the_comments/templates/ip_black_lists_controller.rb +0 -10
- data/lib/generators/the_comments/templates/the_comments_black_ip.rb +0 -9
- data/lib/generators/the_comments/templates/the_comments_black_user_agent.rb +0 -9
- data/lib/generators/the_comments/templates/user_agent_black_list.rb +0 -3
- data/lib/generators/the_comments/templates/user_agent_black_lists_controller.rb +0 -10
@@ -0,0 +1,80 @@
|
|
1
|
+
module TheComments
|
2
|
+
module CommentStates
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
# :draft | :published | :deleted
|
7
|
+
state_machine :state, :initial => TheComments.config.default_state do
|
8
|
+
|
9
|
+
# events
|
10
|
+
event :to_draft do
|
11
|
+
transition all - :draft => :draft
|
12
|
+
end
|
13
|
+
|
14
|
+
event :to_published do
|
15
|
+
transition all - :published => :published
|
16
|
+
end
|
17
|
+
|
18
|
+
event :to_deleted do
|
19
|
+
transition any - :deleted => :deleted
|
20
|
+
end
|
21
|
+
|
22
|
+
# transition callbacks
|
23
|
+
after_transition any => any do |comment|
|
24
|
+
@comment = comment
|
25
|
+
@owner = comment.user
|
26
|
+
@holder = comment.holder
|
27
|
+
@commentable = comment.commentable
|
28
|
+
end
|
29
|
+
|
30
|
+
# between draft and published
|
31
|
+
after_transition [:draft, :published] => [:draft, :published] do |comment, transition|
|
32
|
+
from = transition.from_name
|
33
|
+
to = transition.to_name
|
34
|
+
|
35
|
+
if @holder
|
36
|
+
@holder.send :try, :define_denormalize_flags
|
37
|
+
@holder.increment! "#{to}_comcoms_count"
|
38
|
+
@holder.decrement! "#{from}_comcoms_count"
|
39
|
+
end
|
40
|
+
|
41
|
+
if @commentable
|
42
|
+
@commentable.send :define_denormalize_flags
|
43
|
+
@commentable.increment! "#{to}_comments_count"
|
44
|
+
@commentable.decrement! "#{from}_comments_count"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# to deleted (cascade like query)
|
49
|
+
after_transition [:draft, :published] => :deleted do |comment|
|
50
|
+
ids = comment.self_and_descendants.map(&:id)
|
51
|
+
::Comment.where(id: ids).update_all(state: :deleted)
|
52
|
+
|
53
|
+
@owner.try :recalculate_my_comments_counter!
|
54
|
+
@holder.try :recalculate_comcoms_counters!
|
55
|
+
@commentable.try :recalculate_comments_counters!
|
56
|
+
end
|
57
|
+
|
58
|
+
# from deleted
|
59
|
+
after_transition :deleted => [:draft, :published] do |comment, transition|
|
60
|
+
to = transition.to_name
|
61
|
+
comment.mark_as_not_spam
|
62
|
+
|
63
|
+
@owner.try :recalculate_my_comments_counter!
|
64
|
+
|
65
|
+
if @holder
|
66
|
+
@holder.send :try, :define_denormalize_flags
|
67
|
+
@holder.decrement! :deleted_comcoms_count
|
68
|
+
@holder.increment! "#{to}_comcoms_count"
|
69
|
+
end
|
70
|
+
|
71
|
+
if @commentable
|
72
|
+
@commentable.send :define_denormalize_flags
|
73
|
+
@commentable.decrement! :deleted_comments_count
|
74
|
+
@commentable.increment! "#{to}_comments_count"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module TheComments
|
2
|
+
module Commentable
|
3
|
+
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_many :comments, as: :commentable
|
8
|
+
|
9
|
+
# *define_denormalize_flags* - should be placed before title or url builder filters
|
10
|
+
before_validation :define_denormalize_flags
|
11
|
+
after_save :denormalize_for_comments, if: -> { !id_changed? }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Default Denormalization methods
|
15
|
+
# Overwrite it with your Application
|
16
|
+
def commentable_title
|
17
|
+
# My first blog post
|
18
|
+
try(:title) || TheComments.config.default_title
|
19
|
+
end
|
20
|
+
|
21
|
+
def commentable_url
|
22
|
+
# /posts/1
|
23
|
+
['', self.class.to_s.tableize, self.to_param].join('/')
|
24
|
+
end
|
25
|
+
|
26
|
+
def commentable_state
|
27
|
+
# 'draft'
|
28
|
+
try(:state)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Helper methods
|
32
|
+
def comments_sum
|
33
|
+
published_comments_count + draft_comments_count
|
34
|
+
end
|
35
|
+
|
36
|
+
def recalculate_comments_counters!
|
37
|
+
update_attributes!({
|
38
|
+
draft_comments_count: comments.with_state(:draft).count,
|
39
|
+
published_comments_count: comments.with_state(:published).count,
|
40
|
+
deleted_comments_count: comments.with_state(:deleted).count
|
41
|
+
})
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def define_denormalize_flags
|
47
|
+
@trackable_commentable_title = commentable_title
|
48
|
+
@trackable_commentable_state = commentable_state
|
49
|
+
@trackable_commentable_url = commentable_url
|
50
|
+
end
|
51
|
+
|
52
|
+
def denormalization_fields_changed?
|
53
|
+
a = @trackable_commentable_title != commentable_title
|
54
|
+
b = @trackable_commentable_state != commentable_state
|
55
|
+
c = @trackable_commentable_url != commentable_url
|
56
|
+
a || b || c
|
57
|
+
end
|
58
|
+
|
59
|
+
def denormalize_for_comments
|
60
|
+
if denormalization_fields_changed?
|
61
|
+
comments.update_all({
|
62
|
+
commentable_title: commentable_title,
|
63
|
+
commentable_state: commentable_state,
|
64
|
+
commentable_url: commentable_url
|
65
|
+
})
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module TheComments
|
2
|
+
module User
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_many :comcoms, class_name: :Comment, foreign_key: :holder_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def my_comments; ::Comment.where(user: self); end
|
10
|
+
|
11
|
+
%w[draft published deleted].each do |state|
|
12
|
+
define_method "my_#{state}_comments" do
|
13
|
+
my_comments.with_state state
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method "#{state}_comcoms" do
|
17
|
+
comcoms.with_state state
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# I think we shouldn't to have my_deleted_comments cache counter
|
22
|
+
def recalculate_my_comments_counter!
|
23
|
+
dcount = my_draft_comments.count
|
24
|
+
pcount = my_published_comments.count
|
25
|
+
update_attributes!({
|
26
|
+
my_draft_comments_count: dcount,
|
27
|
+
my_published_comments_count: pcount,
|
28
|
+
my_comments_count: dcount + pcount
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
def recalculate_comcoms_counters!
|
33
|
+
update_attributes!({
|
34
|
+
draft_comcoms_count: draft_comcoms.count,
|
35
|
+
published_comcoms_count: published_comcoms.count,
|
36
|
+
deleted_comcoms_count: deleted_comcoms.count
|
37
|
+
})
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_comcoms_spam_counter
|
41
|
+
update!(spam_comcoms_count: comcoms.where(spam: true).count)
|
42
|
+
end
|
43
|
+
|
44
|
+
def comments_sum
|
45
|
+
published_comments_count + draft_comments_count
|
46
|
+
end
|
47
|
+
|
48
|
+
def comcoms_sum
|
49
|
+
published_comcoms_count + draft_comcoms_count
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
.additional_info{ style: "display:none" }
|
2
|
+
%br
|
3
|
+
%table.table.table-striped.table-hover
|
4
|
+
%tr
|
5
|
+
%th Tolerance time:
|
6
|
+
%th IP:
|
7
|
+
%th User Agent:
|
8
|
+
%th Referer:
|
9
|
+
%tr
|
10
|
+
%td= comment.tolerance_time || :none
|
11
|
+
%td= comment.ip
|
12
|
+
%td= comment.user_agent
|
13
|
+
%td= comment.referer
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
%table.comment_body.table.table-striped.table-hover
|
2
|
+
%tr
|
3
|
+
%td{ style: "width: 120px;"}
|
4
|
+
%b= comment.commentable_type
|
5
|
+
→
|
6
|
+
%td
|
7
|
+
= link_to comment.commentable_title, comment.commentable_url
|
8
|
+
(#{comment.try(:commentable_state)})
|
9
|
+
%tr
|
10
|
+
%td
|
11
|
+
%b= t('the_comments.title')
|
12
|
+
%td= comment.title.blank? ? t('the_comments.guest_name') : comment.title
|
13
|
+
%tr
|
14
|
+
%td
|
15
|
+
%b= t('the_comments.contacts')
|
16
|
+
%td= comment.contacts
|
17
|
+
%tr.success
|
18
|
+
%td
|
19
|
+
%b= t('the_comments.content')
|
20
|
+
%td= comment.content
|
@@ -0,0 +1,26 @@
|
|
1
|
+
.edit_form{ style: "display:none" }
|
2
|
+
= form_for [comments, comment], remote: true, html:{ role: :form } do |f|
|
3
|
+
%table.table.table-striped.table-hover
|
4
|
+
%tr{ style: "width: 100px;"}
|
5
|
+
%td
|
6
|
+
%b= comment.commentable_type
|
7
|
+
→
|
8
|
+
%td
|
9
|
+
= link_to comment.commentable_title, comment.commentable_url
|
10
|
+
(#{comment.try(:commentable_state)})
|
11
|
+
%tr
|
12
|
+
%td
|
13
|
+
%b= t('the_comments.title')
|
14
|
+
%td= f.text_field :title, class: "form-control"
|
15
|
+
%tr
|
16
|
+
%td
|
17
|
+
%b= t('the_comments.contacts')
|
18
|
+
%td= f.text_field :contacts, class: "form-control"
|
19
|
+
%tr
|
20
|
+
%td
|
21
|
+
%b= t('the_comments.content')
|
22
|
+
%td= f.text_area :raw_content, class: "form-control", rows: 7
|
23
|
+
%tr
|
24
|
+
%td
|
25
|
+
%td= f.submit t('the_comments.update'), class: "btn btn-success"
|
26
|
+
%hr
|
@@ -1,15 +1,15 @@
|
|
1
1
|
%h3
|
2
|
-
= link_to '
|
2
|
+
= link_to t('the_comments.new'), '#', id: :new_root_comment
|
3
3
|
|
4
|
-
= form_for Comment.new, remote: true, authenticity_token: true do |f|
|
4
|
+
= form_for [comments, Comment.new], remote: true, authenticity_token: true do |f|
|
5
5
|
.error_notifier{ style: "display:none" }
|
6
|
-
%label title
|
6
|
+
%label= t('the_comments.form.title')
|
7
7
|
%p= f.text_field :title
|
8
8
|
|
9
|
-
%label contacts
|
9
|
+
%label= t('the_comments.form.contacts')
|
10
10
|
%p= f.text_field :contacts
|
11
11
|
|
12
|
-
%label content
|
12
|
+
%label= t('the_comments.form.content')
|
13
13
|
%p= f.text_area :raw_content
|
14
14
|
|
15
15
|
%p.trap
|
@@ -22,4 +22,6 @@
|
|
22
22
|
= f.hidden_field :commentable_id, value: commentable.id
|
23
23
|
= f.hidden_field :parent_id, class: :parent_id
|
24
24
|
|
25
|
-
%p
|
25
|
+
%p
|
26
|
+
= f.submit t('the_comments.form.create'), class: :btn
|
27
|
+
= t('the_comments.form.thank_you')
|
@@ -0,0 +1,27 @@
|
|
1
|
+
- hidden = "display:none"
|
2
|
+
|
3
|
+
.row.controls
|
4
|
+
.col-md-9
|
5
|
+
= link_to t('the_comments.edit'), "#", class: "edit btn btn-success"
|
6
|
+
= link_to t('the_comments.cancel'), "#", class: "btn btn-warning edit", style: "display:none"
|
7
|
+
|
8
|
+
- to_hide = comment.published? ? hidden : nil
|
9
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
10
|
+
= link_to [comments, :to_published, comment], opts.merge(class: "btn btn-primary to_published") do
|
11
|
+
= t('the_comments.to_published')
|
12
|
+
|
13
|
+
- to_hide = comment.draft? ? hidden : nil
|
14
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
15
|
+
= link_to [comments, :to_draft, comment], opts.merge(class: "btn btn-warning to_draft") do
|
16
|
+
= t('the_comments.to_draft')
|
17
|
+
|
18
|
+
- to_hide = comment.deleted? ? hidden : nil
|
19
|
+
- opts = { remote: true, style: to_hide, method: :delete, data: { confirm: t('the_comments.delete_confirm') } }
|
20
|
+
= link_to [comments, :to_deleted, comment], opts.merge(class: "btn btn-danger to_deleted") do
|
21
|
+
= t('the_comments.to_deleted')
|
22
|
+
|
23
|
+
- opts = { remote: true, method: :post}
|
24
|
+
= link_to [comments, :to_spam, comment], opts.merge(class: "btn btn-danger to_spam") do
|
25
|
+
= t('the_comments.to_spam')
|
26
|
+
.col-md-3.text-right
|
27
|
+
= link_to t('the_comments.additional_info'), "#", class: "additional_info btn btn-info"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- cuser = current_user
|
2
|
+
|
3
|
+
.panel.panel-primary
|
4
|
+
.panel-heading= t "the_comments.nav.header"
|
5
|
+
.panel-body
|
6
|
+
%p= link_to raw(t('the_comments.back_to_root')), '/'
|
7
|
+
%hr
|
8
|
+
|
9
|
+
%h5= t 'the_comments.incoming'
|
10
|
+
%ul
|
11
|
+
%li= link_to t("the_comments.draft_comments", num: cuser.draft_comcoms_count), [comments, :draft, :comments]
|
12
|
+
%li= link_to t("the_comments.published_comments", num: cuser.published_comcoms_count), [comments, :published, :comments]
|
13
|
+
%li= link_to t("the_comments.deleted_comments", num: cuser.deleted_comcoms_count), [comments, :deleted, :comments]
|
14
|
+
%li= link_to t("the_comments.spam_comments", num: cuser.spam_comcoms_count), [comments, :spam, :comments]
|
15
|
+
|
16
|
+
%h5= t 'the_comments.written_by_me'
|
17
|
+
%ul
|
18
|
+
%li= link_to t("the_comments.draft_comments", num: cuser.my_draft_comments.count), [comments, :my_draft, :comments]
|
19
|
+
%li= link_to t("the_comments.published_comments", num: cuser.my_published_comments.count), [comments, :my_published, :comments]
|
20
|
+
%li= link_to t("the_comments.my_comments", num: cuser.my_comments_count), [comments, :my_comments, :comments]
|
21
|
+
|
22
|
+
- if cuser.comments_admin?
|
23
|
+
%h5= t 'the_comments.in_system'
|
24
|
+
%ul
|
25
|
+
%li= link_to t("the_comments.draft_comments", num: Comment.with_state(:draft).count), [comments, :total_draft, :comments]
|
26
|
+
%li= link_to t("the_comments.published_comments", num: Comment.with_state(:published).count), [comments, :total_published, :comments]
|
27
|
+
%li= link_to t("the_comments.deleted_comments", num: Comment.with_state(:deleted).count), [comments, :total_deleted, :comments]
|
28
|
+
%li= link_to t("the_comments.spam_comments", num: Comment.where(spam: true).count), [comments, :total_spam, :comments]
|
@@ -0,0 +1,4 @@
|
|
1
|
+
.comments#comments
|
2
|
+
%ol.comments_tree{ data: { comments: { tolarance_time: TheComments.config.tolerance_time } } }
|
3
|
+
= render partial: 'the_comments/haml/comment', locals: { tree: comments_tree }
|
4
|
+
= render partial: 'the_comments/haml/form', locals: { commentable: commentable }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
= t "the_comments.management"
|
3
|
+
|
4
|
+
- content_for :comments_sidebar do
|
5
|
+
= render partial: 'the_comments/haml/sidebar'
|
6
|
+
|
7
|
+
- content_for :comments_main do
|
8
|
+
= paginate @comments
|
9
|
+
|
10
|
+
.comments
|
11
|
+
- @comments.each do |comment|
|
12
|
+
- klass = { published: :primary, draft: :warning, deleted: :danger }[comment.state.to_sym]
|
13
|
+
.panel{ class: "panel-#{klass}" }
|
14
|
+
.panel-heading= comment.title
|
15
|
+
.panel-body
|
16
|
+
= render partial: 'the_comments/haml/comment_body', locals: { comment: comment }
|
17
|
+
|
18
|
+
= paginate @comments
|
@@ -0,0 +1,25 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
= t "the_comments.management"
|
3
|
+
|
4
|
+
- content_for :comments_sidebar do
|
5
|
+
= render partial: 'the_comments/haml/sidebar'
|
6
|
+
|
7
|
+
- content_for :comments_main do
|
8
|
+
= paginate @comments
|
9
|
+
|
10
|
+
- if @comments.blank?
|
11
|
+
.alert.alert-info= t 'the_comments.no_comments_here'
|
12
|
+
|
13
|
+
.comments
|
14
|
+
- @comments.each do |comment|
|
15
|
+
- klass = { published: :primary, draft: :warning, deleted: :danger }[comment.state.to_sym]
|
16
|
+
.panel{ class: "panel-#{klass}" }
|
17
|
+
.panel-heading= comment.title
|
18
|
+
.panel-body
|
19
|
+
= render partial: 'the_comments/haml/comment_edit', locals: { comment: comment }
|
20
|
+
= render partial: 'the_comments/haml/comment_body', locals: { comment: comment }
|
21
|
+
|
22
|
+
= render partial: 'the_comments/haml/manage_controls', locals: { comment: comment }
|
23
|
+
= render partial: 'the_comments/haml/additional_info', locals: { comment: comment }
|
24
|
+
|
25
|
+
= paginate @comments
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- cuser = current_user
|
2
|
+
|
3
|
+
- content_for :title do
|
4
|
+
= t "the_comments.management"
|
5
|
+
|
6
|
+
- content_for :comments_sidebar do
|
7
|
+
= render partial: 'the_comments/haml/sidebar'
|
8
|
+
|
9
|
+
- content_for :comments_main do
|
10
|
+
= paginate @comments
|
11
|
+
|
12
|
+
- if @comments.blank?
|
13
|
+
.alert.alert-info= t 'the_comments.no_comments_here'
|
14
|
+
|
15
|
+
.comments
|
16
|
+
- @comments.each do |comment|
|
17
|
+
- klass = { published: :primary, draft: :warning, deleted: :danger }[comment.state.to_sym]
|
18
|
+
.panel{ class: "panel-#{klass}" }
|
19
|
+
.panel-heading= comment.title
|
20
|
+
.panel-body
|
21
|
+
= render partial: 'the_comments/haml/comment_body', locals: { comment: comment }
|
22
|
+
|
23
|
+
- if cuser.comments_admin?
|
24
|
+
= render partial: 'the_comments/haml/comment_edit', locals: { comment: comment }
|
25
|
+
= render partial: 'the_comments/haml/manage_controls', locals: { comment: comment }
|
26
|
+
= render partial: 'the_comments/haml/additional_info', locals: { comment: comment }
|
27
|
+
|
28
|
+
= paginate @comments
|
@@ -0,0 +1,13 @@
|
|
1
|
+
.additional_info style: "display:none"
|
2
|
+
br
|
3
|
+
table.table.table-striped.table-hover
|
4
|
+
tr
|
5
|
+
th Tolerance time:
|
6
|
+
th IP:
|
7
|
+
th User Agent:
|
8
|
+
th Referer:
|
9
|
+
tr
|
10
|
+
td= comment.tolerance_time || :none
|
11
|
+
td= comment.ip
|
12
|
+
td= comment.user_agent
|
13
|
+
td= comment.referer
|
@@ -0,0 +1 @@
|
|
1
|
+
= build_server_tree(tree, render_module: RenderCommentsTreeHelper, controller: controller)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
table.comment_body.table.table-striped.table-hover
|
2
|
+
tr
|
3
|
+
td style: "width: 120px;"
|
4
|
+
b= comment.commentable_type
|
5
|
+
| →
|
6
|
+
td
|
7
|
+
= link_to comment.commentable_title, comment.commentable_url
|
8
|
+
| (#{comment.try(:commentable_state)})
|
9
|
+
tr
|
10
|
+
td
|
11
|
+
b= t('the_comments.title')
|
12
|
+
td= comment.title.blank? ? t('the_comments.guest_name') : comment.title
|
13
|
+
tr
|
14
|
+
td
|
15
|
+
b= t('the_comments.contacts')
|
16
|
+
td= comment.contacts
|
17
|
+
tr.success
|
18
|
+
td
|
19
|
+
b= t('the_comments.content')
|
20
|
+
td= comment.content
|
@@ -0,0 +1,26 @@
|
|
1
|
+
.edit_form style: "display:none"
|
2
|
+
= form_for [comments, comment], remote: true, html:{ role: :form } do |f|
|
3
|
+
table.table.table-striped.table-hover
|
4
|
+
tr style: "width: 100px;"
|
5
|
+
td
|
6
|
+
b= comment.commentable_type
|
7
|
+
| →
|
8
|
+
td
|
9
|
+
= link_to comment.commentable_title, comment.commentable_url
|
10
|
+
| (#{comment.try(:commentable_state)})
|
11
|
+
tr
|
12
|
+
td
|
13
|
+
b= t('the_comments.title')
|
14
|
+
td= f.text_field :title, class: "form-control"
|
15
|
+
tr
|
16
|
+
td
|
17
|
+
b= t('the_comments.contacts')
|
18
|
+
td= f.text_field :contacts, class: "form-control"
|
19
|
+
tr
|
20
|
+
td
|
21
|
+
b= t('the_comments.content')
|
22
|
+
td= f.text_area :raw_content, class: "form-control", rows: 7
|
23
|
+
tr
|
24
|
+
td
|
25
|
+
td= f.submit t('the_comments.update'), class: "btn btn-success"
|
26
|
+
hr
|
@@ -0,0 +1,27 @@
|
|
1
|
+
h3
|
2
|
+
= link_to t('the_comments.new'), '#', id: :new_root_comment
|
3
|
+
|
4
|
+
= form_for [comments, Comment.new], remote: true, authenticity_token: true do |f|
|
5
|
+
.error_notifier style: "display:none"
|
6
|
+
label= t('the_comments.form.title')
|
7
|
+
p= f.text_field :title
|
8
|
+
|
9
|
+
label= t('the_comments.form.contacts')
|
10
|
+
p= f.text_field :contacts
|
11
|
+
|
12
|
+
label= t('the_comments.form.content')
|
13
|
+
p= f.text_area :raw_content
|
14
|
+
|
15
|
+
p.trap
|
16
|
+
- TheComments.config.empty_inputs.each do |name|
|
17
|
+
= text_field_tag name, nil, autocomplete: :off, tabindex: -1, id: nil
|
18
|
+
|
19
|
+
= hidden_field_tag :tolerance_time, 0, id: nil, class: :tolerance_time
|
20
|
+
|
21
|
+
= f.hidden_field :commentable_type, value: commentable.class
|
22
|
+
= f.hidden_field :commentable_id, value: commentable.id
|
23
|
+
= f.hidden_field :parent_id, class: :parent_id
|
24
|
+
|
25
|
+
p
|
26
|
+
= f.submit t('the_comments.form.create'), class: :btn
|
27
|
+
= t('the_comments.form.thank_you')
|
@@ -0,0 +1,27 @@
|
|
1
|
+
- hidden = "display:none"
|
2
|
+
|
3
|
+
.row.controls
|
4
|
+
.col-md-9
|
5
|
+
= link_to t('the_comments.edit'), "#", class: "edit btn btn-success"
|
6
|
+
= link_to t('the_comments.cancel'), "#", class: "btn btn-warning edit", style: "display:none"
|
7
|
+
|
8
|
+
- to_hide = comment.published? ? hidden : nil
|
9
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
10
|
+
= link_to [comments, :to_published, comment], opts.merge(class: "btn btn-primary to_published") do
|
11
|
+
= t('the_comments.to_published')
|
12
|
+
|
13
|
+
- to_hide = comment.draft? ? hidden : nil
|
14
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
15
|
+
= link_to [comments, :to_draft, comment], opts.merge(class: "btn btn-warning to_draft") do
|
16
|
+
= t('the_comments.to_draft')
|
17
|
+
|
18
|
+
- to_hide = comment.deleted? ? hidden : nil
|
19
|
+
- opts = { remote: true, style: to_hide, method: :delete, data: { confirm: t('the_comments.delete_confirm') } }
|
20
|
+
= link_to [comments, :to_deleted, comment], opts.merge(class: "btn btn-danger to_deleted") do
|
21
|
+
= t('the_comments.to_deleted')
|
22
|
+
|
23
|
+
- opts = { remote: true, method: :post}
|
24
|
+
= link_to [comments, :to_spam, comment], opts.merge(class: "btn btn-danger to_spam") do
|
25
|
+
= t('the_comments.to_spam')
|
26
|
+
.col-md-3.text-right
|
27
|
+
= link_to t('the_comments.additional_info'), "#", class: "additional_info btn btn-info"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- cuser = current_user
|
2
|
+
|
3
|
+
.panel.panel-primary
|
4
|
+
.panel-heading= t "the_comments.nav.header"
|
5
|
+
.panel-body
|
6
|
+
p= link_to raw(t('the_comments.back_to_root')), '/'
|
7
|
+
hr
|
8
|
+
|
9
|
+
h5= t 'the_comments.incoming'
|
10
|
+
ul
|
11
|
+
li= link_to t("the_comments.draft_comments", num: cuser.draft_comcoms_count), [comments, :draft, :comments]
|
12
|
+
li= link_to t("the_comments.published_comments", num: cuser.published_comcoms_count), [comments, :published, :comments]
|
13
|
+
li= link_to t("the_comments.deleted_comments", num: cuser.deleted_comcoms_count), [comments, :deleted, :comments]
|
14
|
+
li= link_to t("the_comments.spam_comments", num: cuser.spam_comcoms_count), [comments, :spam, :comments]
|
15
|
+
|
16
|
+
h5= t 'the_comments.written_by_me'
|
17
|
+
ul
|
18
|
+
li= link_to t("the_comments.draft_comments", num: cuser.my_draft_comments.count), [comments, :my_draft, :comments]
|
19
|
+
li= link_to t("the_comments.published_comments", num: cuser.my_published_comments.count), [comments, :my_published, :comments]
|
20
|
+
li= link_to t("the_comments.my_comments", num: cuser.my_comments_count), [comments, :my_comments, :comments]
|
21
|
+
|
22
|
+
- if cuser.comments_admin?
|
23
|
+
h5= t 'the_comments.in_system'
|
24
|
+
ul
|
25
|
+
li= link_to t("the_comments.draft_comments", num: Comment.with_state(:draft).count), [comments, :total_draft, :comments]
|
26
|
+
li= link_to t("the_comments.published_comments", num: Comment.with_state(:published).count), [comments, :total_published, :comments]
|
27
|
+
li= link_to t("the_comments.deleted_comments", num: Comment.with_state(:deleted).count), [comments, :total_deleted, :comments]
|
28
|
+
li= link_to t("the_comments.spam_comments", num: Comment.where(spam: true).count), [comments, :total_spam, :comments]
|
@@ -0,0 +1,4 @@
|
|
1
|
+
.comments#comments
|
2
|
+
ol.comments_tree data: { comments: { tolarance_time: TheComments.config.tolerance_time } }
|
3
|
+
= render partial: 'the_comments/slim/comment', locals: { tree: comments_tree }
|
4
|
+
= render partial: 'the_comments/slim/form', locals: { commentable: commentable }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
= t "the_comments.management"
|
3
|
+
|
4
|
+
- content_for :comments_sidebar do
|
5
|
+
= render partial: 'the_comments/slim/sidebar'
|
6
|
+
|
7
|
+
- content_for :comments_main do
|
8
|
+
= paginate @comments
|
9
|
+
|
10
|
+
.comments
|
11
|
+
- @comments.each do |comment|
|
12
|
+
- klass = { published: :primary, draft: :warning, deleted: :danger }[comment.state.to_sym]
|
13
|
+
.panel class: "panel-#{klass}"
|
14
|
+
.panel-heading= comment.title
|
15
|
+
.panel-body
|
16
|
+
= render partial: 'the_comments/slim/comment_body', locals: { comment: comment }
|
17
|
+
|
18
|
+
= paginate @comments
|
@@ -0,0 +1,25 @@
|
|
1
|
+
- content_for :title do
|
2
|
+
= t "the_comments.management"
|
3
|
+
|
4
|
+
- content_for :comments_sidebar do
|
5
|
+
= render partial: 'the_comments/slim/sidebar'
|
6
|
+
|
7
|
+
- content_for :comments_main do
|
8
|
+
= paginate @comments
|
9
|
+
|
10
|
+
- if @comments.blank?
|
11
|
+
.alert.alert-info= t 'the_comments.no_comments_here'
|
12
|
+
|
13
|
+
.comments
|
14
|
+
- @comments.each do |comment|
|
15
|
+
- klass = { published: :primary, draft: :warning, deleted: :danger }[comment.state.to_sym]
|
16
|
+
.panel class: "panel-#{klass}"
|
17
|
+
.panel-heading= comment.title
|
18
|
+
.panel-body
|
19
|
+
= render partial: 'the_comments/slim/comment_edit', locals: { comment: comment }
|
20
|
+
= render partial: 'the_comments/slim/comment_body', locals: { comment: comment }
|
21
|
+
|
22
|
+
= render partial: 'the_comments/slim/manage_controls', locals: { comment: comment }
|
23
|
+
= render partial: 'the_comments/slim/additional_info', locals: { comment: comment }
|
24
|
+
|
25
|
+
= paginate @comments
|