the_comments_ruby 2.3.3
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 +7 -0
- data/.gitignore +30 -0
- data/.ruby-gemset.example +1 -0
- data/.ruby-version.example +1 -0
- data/.rvmrc.example +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +338 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/the_comments.js.coffee +108 -0
- data/app/assets/javascripts/the_comments_manage.js.coffee +27 -0
- data/app/assets/stylesheets/the_comments.css.scss +248 -0
- data/app/controllers/_templates_/comments_controller.rb +44 -0
- data/app/controllers/concerns/the_comments/controller.rb +197 -0
- data/app/controllers/concerns/the_comments/view_token.rb +20 -0
- data/app/helpers/render_comments_tree_helper.rb +111 -0
- data/app/models/_templates_/comment.rb +38 -0
- data/app/models/concerns/the_comments/comment.rb +116 -0
- data/app/models/concerns/the_comments/comment_states.rb +80 -0
- data/app/models/concerns/the_comments/commentable.rb +69 -0
- data/app/models/concerns/the_comments/user.rb +56 -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/haml/_comment.html.haml +1 -0
- data/app/views/the_comments/haml/_comment_body.html.haml +25 -0
- data/app/views/the_comments/haml/_comment_edit.html.haml +26 -0
- data/app/views/the_comments/haml/_form.html.haml +8 -0
- data/app/views/the_comments/haml/_guest_form.html.haml +22 -0
- data/app/views/the_comments/haml/_logined_form.html.haml +18 -0
- data/app/views/the_comments/haml/_manage_controls.html.haml +30 -0
- data/app/views/the_comments/haml/_sidebar.html.haml +9 -0
- data/app/views/the_comments/haml/_sidebar_admin.html.haml +12 -0
- data/app/views/the_comments/haml/_sidebar_backlink.html.haml +3 -0
- data/app/views/the_comments/haml/_sidebar_user.html.haml +29 -0
- data/app/views/the_comments/haml/_tree.html.haml +16 -0
- data/app/views/the_comments/haml/manage.html.haml +26 -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 +24 -0
- data/app/views/the_comments/slim/_comment_edit.html.slim +26 -0
- data/app/views/the_comments/slim/_form.html.slim +8 -0
- data/app/views/the_comments/slim/_guest_form.html.slim +22 -0
- data/app/views/the_comments/slim/_logined_form.html.slim +18 -0
- data/app/views/the_comments/slim/_manage_controls.html.slim +30 -0
- data/app/views/the_comments/slim/_sidebar.html.slim +9 -0
- data/app/views/the_comments/slim/_sidebar_admin.html.slim +12 -0
- data/app/views/the_comments/slim/_sidebar_backlink.html.slim +3 -0
- data/app/views/the_comments/slim/_sidebar_user.html.slim +29 -0
- data/app/views/the_comments/slim/_tree.html.slim +16 -0
- data/app/views/the_comments/slim/index.html.slim +18 -0
- data/app/views/the_comments/slim/manage.html.slim +26 -0
- data/app/views/the_comments/slim/my_comments.html.slim +28 -0
- data/config/initializers/the_comments.rb +14 -0
- data/config/locales/en.yml +68 -0
- data/config/locales/ru.yml +71 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20130101010101_the_comments_change_user.rb +18 -0
- data/db/migrate/20130101010102_the_comments_create_comments.rb +50 -0
- data/db/migrate/20130101010103_the_comments_change_commentable.rb +13 -0
- data/docs/admin_ui_installation.md +145 -0
- data/docs/advanced_installation.md +185 -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 +29 -0
- data/docs/generators.md +74 -0
- data/docs/pagination.md +123 -0
- data/docs/routes.md +77 -0
- data/docs/screencast.jpg +0 -0
- data/docs/the_comments.jpg +0 -0
- data/docs/the_comments_view_1.gif +0 -0
- data/docs/the_comments_view_2.gif +0 -0
- data/docs/the_comments_view_3.gif +0 -0
- data/docs/the_comments_view_4.gif +0 -0
- data/docs/the_comments_view_5.gif +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 +28 -0
- data/docs/where_is_example_application.md +37 -0
- data/gem_version.rb +3 -0
- data/lib/generators/the_comments/USAGE +44 -0
- data/lib/generators/the_comments/the_comments_generator.rb +56 -0
- data/lib/generators/the_comments/views_generator.rb +79 -0
- data/lib/the_comments/config.rb +37 -0
- data/lib/the_comments/version.rb +1 -0
- data/lib/the_comments.rb +28 -0
- data/spec/dummy_app/.gitignore +18 -0
- data/spec/dummy_app/.rspec +1 -0
- data/spec/dummy_app/Gemfile +43 -0
- data/spec/dummy_app/README.md +33 -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/spec/dummy_app/app/controllers/comments_controller.rb +28 -0
- 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 +14 -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 +19 -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/the_comments.gemspec +25 -0
- data/the_comments.yml.teamocil.example +11 -0
- data/views_converter.rb +16 -0
- metadata +333 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
label= t('the_comments.form.title')
|
|
2
|
+
p= f.text_field :title, class: 'form-control'
|
|
3
|
+
|
|
4
|
+
label= t('the_comments.form.contacts')
|
|
5
|
+
p= f.text_field :contacts, class: 'form-control'
|
|
6
|
+
|
|
7
|
+
label= t('the_comments.form.content')
|
|
8
|
+
p= f.text_area :raw_content, class: 'form-control'
|
|
9
|
+
|
|
10
|
+
p.trap
|
|
11
|
+
- TheComments.config.empty_inputs.each do |name|
|
|
12
|
+
= text_field_tag name, nil, autocomplete: :off, tabindex: -1, id: nil
|
|
13
|
+
|
|
14
|
+
= hidden_field_tag :tolerance_time, 0, id: nil, class: :tolerance_time
|
|
15
|
+
|
|
16
|
+
= f.hidden_field :commentable_type, value: commentable.class
|
|
17
|
+
= f.hidden_field :commentable_id, value: commentable.id
|
|
18
|
+
= f.hidden_field :parent_id, class: :parent_id
|
|
19
|
+
|
|
20
|
+
p
|
|
21
|
+
= f.submit t('the_comments.form.create'), class: :btn
|
|
22
|
+
= t('the_comments.form.thank_you')
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.logined_comment_form
|
|
2
|
+
.user_data
|
|
3
|
+
= link_to user_path(current_user), nopin: :nopin do
|
|
4
|
+
= image_tag current_user.avatar.url(:thumb)
|
|
5
|
+
.comment_data
|
|
6
|
+
= hidden_field_tag :tolerance_time, 0, id: nil, class: :tolerance_time
|
|
7
|
+
= f.hidden_field :commentable_type, value: commentable.class
|
|
8
|
+
= f.hidden_field :commentable_id, value: commentable.id
|
|
9
|
+
= f.hidden_field :parent_id, class: :parent_id
|
|
10
|
+
|
|
11
|
+
.user_name
|
|
12
|
+
b= current_user.username.present? ? current_user.username : current_user.login
|
|
13
|
+
label= t('the_comments.form.content')
|
|
14
|
+
p= f.text_area :raw_content
|
|
15
|
+
|
|
16
|
+
p
|
|
17
|
+
= f.submit t('the_comments.form.create'), class: :btn
|
|
18
|
+
= t('the_comments.form.thank_you')
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
- hidden = "display:none"
|
|
2
|
+
|
|
3
|
+
.row.controls
|
|
4
|
+
.col-md-9.action_btns
|
|
5
|
+
= link_to '#', class: "edit btn btn-success" do
|
|
6
|
+
= t('the_comments.edit')
|
|
7
|
+
|
|
8
|
+
= link_to '#', class: "btn btn-warning edit", style: "display:none" do
|
|
9
|
+
= t('the_comments.cancel')
|
|
10
|
+
|
|
11
|
+
- unless to_hide = comment.published? ? hidden : nil
|
|
12
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
|
13
|
+
= link_to [:to_published, comment], opts.merge(class: "btn btn-primary to_published") do
|
|
14
|
+
= t('the_comments.to_published')
|
|
15
|
+
|
|
16
|
+
- unless to_hide = comment.draft? ? hidden : nil
|
|
17
|
+
- opts = { remote: true, style: to_hide, method: :post }
|
|
18
|
+
= link_to [:to_draft, comment], opts.merge(class: "btn btn-warning to_draft") do
|
|
19
|
+
= t('the_comments.to_draft')
|
|
20
|
+
|
|
21
|
+
- unless to_hide = comment.deleted? ? hidden : nil
|
|
22
|
+
- opts = { remote: true, style: to_hide, method: :delete, data: { confirm: t('the_comments.delete_confirm') } }
|
|
23
|
+
= link_to [:to_deleted, comment], opts.merge(class: "btn btn-danger to_deleted") do
|
|
24
|
+
= t('the_comments.to_deleted')
|
|
25
|
+
|
|
26
|
+
- opts = { remote: true, method: :post}
|
|
27
|
+
= link_to [:to_spam, comment], opts.merge(class: "btn btn-danger to_spam") do
|
|
28
|
+
= t('the_comments.to_spam')
|
|
29
|
+
.col-md-3.text-right
|
|
30
|
+
= link_to t('the_comments.additional_info'), "#", class: "additional_info btn btn-info"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
.panel.panel-default
|
|
2
|
+
.panel-heading= t "the_comments.nav.header"
|
|
3
|
+
.panel-body
|
|
4
|
+
= render partial: 'the_comments/slim/sidebar_backlink'
|
|
5
|
+
|
|
6
|
+
- if current_user.comments_admin?
|
|
7
|
+
= render partial: 'the_comments/slim/sidebar_admin'
|
|
8
|
+
- else
|
|
9
|
+
= render partial: 'the_comments/slim/sidebar_user'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
- cuser = current_user
|
|
2
|
+
|
|
3
|
+
= render partial: 'the_comments/slim/sidebar_user'
|
|
4
|
+
|
|
5
|
+
- if cuser.comments_admin?
|
|
6
|
+
br
|
|
7
|
+
h5= t 'the_comments.in_system', num: Comment.count
|
|
8
|
+
p= link_to t("the_comments.published_comments", num: Comment.with_state(:published).count), [:total_published, :comments], class: 'btn btn-success btn-sm'
|
|
9
|
+
p= link_to t("the_comments.draft_comments", num: Comment.with_state(:draft).count), [:total_draft, :comments], class: 'btn btn-info btn-sm'
|
|
10
|
+
p
|
|
11
|
+
= link_to t("the_comments.deleted_comments", num: Comment.with_state(:deleted).count), [:total_deleted, :comments], class: 'btn btn-default btn-sm'
|
|
12
|
+
= link_to t("the_comments.spam_comments", num: Comment.where(spam: true).count), [:total_spam, :comments], class: 'btn btn-default btn-sm'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
- cuser = current_user
|
|
2
|
+
|
|
3
|
+
h5=t 'the_comments.written_by_me', num: cuser.my_comments.count
|
|
4
|
+
|
|
5
|
+
p= link_to t("the_comments.published_comments", num: cuser.my_published_comments.count), [:my_published, :comments], class: 'btn btn-success btn-sm'
|
|
6
|
+
p= link_to t("the_comments.draft_comments", num: cuser.my_draft_comments.count), [:my_draft, :comments], class: 'btn btn-info btn-sm'
|
|
7
|
+
|
|
8
|
+
p
|
|
9
|
+
- if cuser.comments_admin?
|
|
10
|
+
= link_to t("the_comments.deleted_comments", num: cuser.my_deleted_comments.count), [:my_deleted, :comments], class: 'btn btn-default btn-sm'
|
|
11
|
+
= link_to t("the_comments.spam_comments", num: cuser.my_spam_comments.count), [:my_spam, :comments], class: 'btn btn-default btn-sm'
|
|
12
|
+
- else
|
|
13
|
+
span.btn.btn-default.btn-sm= t("the_comments.deleted_comments", num: cuser.my_deleted_comments.count)
|
|
14
|
+
span.btn.btn-default.btn-sm= t("the_comments.spam_comments", num: cuser.my_spam_comments.count)
|
|
15
|
+
|
|
16
|
+
br
|
|
17
|
+
h5= t 'the_comments.for_my_posts', num: cuser.comcoms.count
|
|
18
|
+
|
|
19
|
+
p= link_to t("the_comments.published_comments", num: cuser.published_comcoms_count), [:published, :comments], class: 'btn btn-success btn-sm'
|
|
20
|
+
p= link_to t("the_comments.draft_comments", num: cuser.draft_comcoms_count), [:draft, :comments], class: 'btn btn-info btn-sm'
|
|
21
|
+
p
|
|
22
|
+
- if cuser.comments_admin?
|
|
23
|
+
= link_to t("the_comments.deleted_comments", num: cuser.deleted_comcoms_count), [:deleted, :comments], class: 'btn btn-default btn-sm'
|
|
24
|
+
= link_to t("the_comments.spam_comments", num: cuser.spam_comcoms_count), [:spam, :comments], class: 'btn btn-default btn-sm'
|
|
25
|
+
- else
|
|
26
|
+
span.btn.btn-default.btn-sm= t("the_comments.deleted_comments", num: cuser.deleted_comcoms_count)
|
|
27
|
+
span.btn.btn-default.btn-sm= t("the_comments.spam_comments", num: cuser.spam_comcoms_count)
|
|
28
|
+
|
|
29
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
- if commentable.comments_on?
|
|
2
|
+
h4.comments_sum
|
|
3
|
+
- if commentable.comments_sum.zero?
|
|
4
|
+
| Вы можете стать первым, кто оставит комментарий!
|
|
5
|
+
- else
|
|
6
|
+
| Комментариев: #{ commentable.comments_sum }
|
|
7
|
+
|
|
8
|
+
- unless current_user
|
|
9
|
+
.comments_description
|
|
10
|
+
p — Комментарий можно оставить <b>без регистрации</b>, для этого достаточно заполнить одно обязательное поле <b class='nobr'>Текст комментария</b>. Анонимные комментарии проходят модерацию и до момента одобрения видны только в браузере автора
|
|
11
|
+
p — Комментарии зарегистрированных пользователей публикуются сразу после создания
|
|
12
|
+
|
|
13
|
+
.comments#comments
|
|
14
|
+
ol.comments_tree data: { comments: { tolarance_time: TheComments.config.tolerance_time } }
|
|
15
|
+
= render partial: 'the_comments/slim/comment', locals: { tree: comments_tree }
|
|
16
|
+
= 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: :success, draft: :info, deleted: :danger }[comment.state.to_sym]
|
|
13
|
+
.panel class: "panel-#{klass}"
|
|
14
|
+
.panel-heading= comment.header_title
|
|
15
|
+
.panel-body
|
|
16
|
+
= render partial: 'the_comments/slim/comment_body', locals: { comment: comment }
|
|
17
|
+
|
|
18
|
+
= paginate @comments
|
|
@@ -0,0 +1,26 @@
|
|
|
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: :success, draft: :info, deleted: :danger }[comment.state.to_sym]
|
|
16
|
+
.panel class: "panel-#{klass}"
|
|
17
|
+
.panel-heading= comment.header_title
|
|
18
|
+
.panel-body
|
|
19
|
+
= render partial: 'the_comments/slim/comment_body', locals: { comment: comment }
|
|
20
|
+
|
|
21
|
+
- if current_user.comments_admin?
|
|
22
|
+
= render partial: 'the_comments/slim/comment_edit', locals: { comment: comment }
|
|
23
|
+
= render partial: 'the_comments/slim/manage_controls', locals: { comment: comment }
|
|
24
|
+
= render partial: 'the_comments/slim/additional_info', locals: { comment: comment }
|
|
25
|
+
|
|
26
|
+
= 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/slim/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/slim/comment_body', locals: { comment: comment }
|
|
22
|
+
|
|
23
|
+
- if cuser.comments_admin?
|
|
24
|
+
= render partial: 'the_comments/slim/comment_edit', locals: { comment: comment }
|
|
25
|
+
= render partial: 'the_comments/slim/manage_controls', locals: { comment: comment }
|
|
26
|
+
= render partial: 'the_comments/slim/additional_info', locals: { comment: comment }
|
|
27
|
+
|
|
28
|
+
= paginate @comments
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# TheComments.config.param_name => value
|
|
2
|
+
|
|
3
|
+
TheComments.configure do |config|
|
|
4
|
+
config.max_reply_depth = 3 # comments tree depth
|
|
5
|
+
config.tolerance_time = 10 # sec - after this delay user can post a comment
|
|
6
|
+
config.default_state = :draft # default state for comment
|
|
7
|
+
config.default_owner_state = :published # default state for comment for Moderator
|
|
8
|
+
config.empty_inputs = [:commentBody] # array of spam trap fields
|
|
9
|
+
config.default_title = 'Undefined title' # default commentable_title for denormalization
|
|
10
|
+
config.template_engine = :haml
|
|
11
|
+
|
|
12
|
+
config.empty_trap_protection = true
|
|
13
|
+
config.tolerance_time_protection = true
|
|
14
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
en:
|
|
2
|
+
activerecord:
|
|
3
|
+
attributes:
|
|
4
|
+
comment:
|
|
5
|
+
raw_content: Content
|
|
6
|
+
errors:
|
|
7
|
+
models:
|
|
8
|
+
comment:
|
|
9
|
+
attributes:
|
|
10
|
+
raw_content:
|
|
11
|
+
blank: 'should not be empty'
|
|
12
|
+
# blank: '%{attribute} should not be empty'
|
|
13
|
+
|
|
14
|
+
the_comments:
|
|
15
|
+
incoming: "Incoming:"
|
|
16
|
+
in_system: "In system:"
|
|
17
|
+
written_by_me: "Written by me:"
|
|
18
|
+
back_to_root: "← To root"
|
|
19
|
+
|
|
20
|
+
my_comments: "My comments (%{num})"
|
|
21
|
+
draft_comments: "New (%{num})"
|
|
22
|
+
published_comments: "Published (%{num})"
|
|
23
|
+
deleted_comments: "Deleted (%{num})"
|
|
24
|
+
spam_comments: "Spam (%{num})"
|
|
25
|
+
|
|
26
|
+
management: Comments management
|
|
27
|
+
new: "New comment"
|
|
28
|
+
update: "Update comment"
|
|
29
|
+
additional_info: "Additional info"
|
|
30
|
+
cancel: "Cancel"
|
|
31
|
+
|
|
32
|
+
title: "Title on name:"
|
|
33
|
+
contacts: "Contacts:"
|
|
34
|
+
content: "Message:"
|
|
35
|
+
|
|
36
|
+
guest_name: Guest
|
|
37
|
+
reply: Reply to this comment
|
|
38
|
+
edit: Edit
|
|
39
|
+
to_spam: Spam!
|
|
40
|
+
to_draft: Draft
|
|
41
|
+
to_published: Publicate
|
|
42
|
+
to_deleted: Delete
|
|
43
|
+
|
|
44
|
+
no_comments_here: No comments here
|
|
45
|
+
|
|
46
|
+
nav:
|
|
47
|
+
header: "Navigation"
|
|
48
|
+
|
|
49
|
+
form:
|
|
50
|
+
title: "Your name:"
|
|
51
|
+
contacts: "Contacts (only admin can see this):"
|
|
52
|
+
content: "Comment* :"
|
|
53
|
+
create: "Submit comment"
|
|
54
|
+
thank_you: "Thank you!"
|
|
55
|
+
|
|
56
|
+
trap: Trap
|
|
57
|
+
trap_message: should be empty
|
|
58
|
+
|
|
59
|
+
tolerance_time: Page view time
|
|
60
|
+
tolerance_time_message: "Please wait %{time} seconds before send a comment and try again"
|
|
61
|
+
|
|
62
|
+
delete_confirm: Are you sure?
|
|
63
|
+
|
|
64
|
+
cookies: Cookies
|
|
65
|
+
cookies_required: 'Please enable cookies and try to reload page'
|
|
66
|
+
ajax_requests_required: 'Sorry, JavaScript/Ajax Requests required'
|
|
67
|
+
waiting_for_moderation: Waiting for moderation
|
|
68
|
+
undefined_commentable: Commentable object is undefined
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
ru:
|
|
2
|
+
activerecord:
|
|
3
|
+
attributes:
|
|
4
|
+
comment:
|
|
5
|
+
raw_content: Содержимое
|
|
6
|
+
errors:
|
|
7
|
+
models:
|
|
8
|
+
comment:
|
|
9
|
+
attributes:
|
|
10
|
+
raw_content:
|
|
11
|
+
blank: 'Не может быть пустым'
|
|
12
|
+
|
|
13
|
+
the_comments:
|
|
14
|
+
incoming: "Входящие:"
|
|
15
|
+
in_system: "Все в системе: %{num}"
|
|
16
|
+
written_by_me: "Написаны мной: %{num}"
|
|
17
|
+
for_my_posts: "К моим постам: %{num}"
|
|
18
|
+
back_to_root: "← На главную"
|
|
19
|
+
|
|
20
|
+
my_comments: "Мои комментарии %{num}"
|
|
21
|
+
draft_comments: "На модерации: %{num}"
|
|
22
|
+
published_comments: "Опубликованы: %{num}"
|
|
23
|
+
deleted_comments: "Удалены: %{num}"
|
|
24
|
+
spam_comments: "Спам: %{num}"
|
|
25
|
+
|
|
26
|
+
waiting_for_moderation: Комментарий ожидает проверки
|
|
27
|
+
management: Управление комментариями
|
|
28
|
+
new: "Написать новый комментарий"
|
|
29
|
+
update: "Обновить"
|
|
30
|
+
additional_info: "Подробнее"
|
|
31
|
+
cancel: "Отмена"
|
|
32
|
+
|
|
33
|
+
title: "Имя или тема:"
|
|
34
|
+
contacts: "Контакты:"
|
|
35
|
+
content: "Сообщение:"
|
|
36
|
+
|
|
37
|
+
guest_name: Гость
|
|
38
|
+
reply: Ответить на этот комментарий
|
|
39
|
+
edit: Править
|
|
40
|
+
to_spam: Спам!
|
|
41
|
+
to_draft: Черновик
|
|
42
|
+
to_published: Публиковать
|
|
43
|
+
to_deleted: Удалить
|
|
44
|
+
|
|
45
|
+
no_comments_here: Здесь нет комментариев
|
|
46
|
+
|
|
47
|
+
nav:
|
|
48
|
+
header: Комментарии
|
|
49
|
+
to_root: На главную
|
|
50
|
+
all_incoming: Все входящие
|
|
51
|
+
|
|
52
|
+
form:
|
|
53
|
+
title: "Ваше имя:"
|
|
54
|
+
contacts: "Контакты (не отображаются на сайте):"
|
|
55
|
+
content: "Текст комментария* :"
|
|
56
|
+
create: "Отправить комментарий"
|
|
57
|
+
thank_you: "Спaсибо!"
|
|
58
|
+
|
|
59
|
+
trap: Ловушка
|
|
60
|
+
trap_message: Должна быть пустой
|
|
61
|
+
|
|
62
|
+
tolerance_time: Просмотр времени
|
|
63
|
+
tolerance_time_message: "Пожалуйста ожидайте %{time} сек. перед отправкой сообщения"
|
|
64
|
+
|
|
65
|
+
cookies: Куки
|
|
66
|
+
cookies_required: 'Включите куки и перезагрузите страницу'
|
|
67
|
+
|
|
68
|
+
delete_confirm: Вы уверены?
|
|
69
|
+
waiting_for_moderation: Ожидает модерации
|
|
70
|
+
ajax_requests_required: 'Извините, ожидается JavaScript/Ajax запрос'
|
|
71
|
+
undefined_commentable: Комментируемый объект не определен
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module TheComments
|
|
2
|
+
class UserRoutes
|
|
3
|
+
def call mapper, options = {}
|
|
4
|
+
mapper.collection do
|
|
5
|
+
mapper.get :manage
|
|
6
|
+
mapper.get :my_comments
|
|
7
|
+
|
|
8
|
+
mapper.get :my_draft
|
|
9
|
+
mapper.get :my_published
|
|
10
|
+
mapper.get :my_deleted
|
|
11
|
+
mapper.get :my_spam
|
|
12
|
+
|
|
13
|
+
mapper.get :draft
|
|
14
|
+
mapper.get :published
|
|
15
|
+
mapper.get :deleted
|
|
16
|
+
mapper.get :spam
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
mapper.member do
|
|
20
|
+
mapper.post :to_spam
|
|
21
|
+
mapper.post :to_draft
|
|
22
|
+
mapper.post :to_published
|
|
23
|
+
mapper.delete :to_deleted
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class AdminRoutes
|
|
29
|
+
def call mapper, options = {}
|
|
30
|
+
mapper.collection do
|
|
31
|
+
mapper.get :total_draft
|
|
32
|
+
mapper.get :total_published
|
|
33
|
+
mapper.get :total_deleted
|
|
34
|
+
mapper.get :total_spam
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# null: false => de-facto db-level validation
|
|
2
|
+
class TheCommentsChangeUser < ActiveRecord::Migration
|
|
3
|
+
def change
|
|
4
|
+
change_table :users do |t|
|
|
5
|
+
# "Written by me" (cache counters)
|
|
6
|
+
t.integer :my_draft_comments_count, default: 0
|
|
7
|
+
t.integer :my_published_comments_count, default: 0
|
|
8
|
+
t.integer :my_comments_count, default: 0 # my_draft_comments_count + my_published_comments_count
|
|
9
|
+
|
|
10
|
+
# commentable's comments => comcoms (cache counters)
|
|
11
|
+
# Relation through Comment#holder_id field
|
|
12
|
+
t.integer :draft_comcoms_count, default: 0
|
|
13
|
+
t.integer :published_comcoms_count, default: 0
|
|
14
|
+
t.integer :deleted_comcoms_count, default: 0
|
|
15
|
+
t.integer :spam_comcoms_count, default: 0
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
class TheCommentsCreateComments < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :comments do |t|
|
|
4
|
+
# relations
|
|
5
|
+
t.integer :user_id
|
|
6
|
+
t.integer :holder_id
|
|
7
|
+
|
|
8
|
+
# polymorphic, commentable object
|
|
9
|
+
t.integer :commentable_id
|
|
10
|
+
t.string :commentable_type
|
|
11
|
+
|
|
12
|
+
# denormalization
|
|
13
|
+
t.string :commentable_url
|
|
14
|
+
t.string :commentable_title
|
|
15
|
+
t.string :commentable_state
|
|
16
|
+
|
|
17
|
+
# comment
|
|
18
|
+
t.string :anchor
|
|
19
|
+
|
|
20
|
+
t.string :title
|
|
21
|
+
t.string :contacts
|
|
22
|
+
|
|
23
|
+
t.text :raw_content
|
|
24
|
+
t.text :content
|
|
25
|
+
|
|
26
|
+
# moderation token
|
|
27
|
+
t.string :view_token
|
|
28
|
+
|
|
29
|
+
# state machine => :draft | :published | :deleted
|
|
30
|
+
t.string :state, default: :draft
|
|
31
|
+
|
|
32
|
+
# base user data (BanHammer power)
|
|
33
|
+
t.string :ip, default: :undefined
|
|
34
|
+
t.string :referer, default: :undefined
|
|
35
|
+
t.string :user_agent, default: :undefined
|
|
36
|
+
t.integer :tolerance_time
|
|
37
|
+
|
|
38
|
+
# unusable: for future versions
|
|
39
|
+
t.boolean :spam, default: false
|
|
40
|
+
|
|
41
|
+
# nested set
|
|
42
|
+
t.integer :parent_id
|
|
43
|
+
t.integer :lft
|
|
44
|
+
t.integer :rgt
|
|
45
|
+
t.integer :depth, default: 0
|
|
46
|
+
|
|
47
|
+
t.timestamps
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class TheCommentsChangeCommentable < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
# Uncomment this. Add fields to Commentable Models
|
|
4
|
+
#
|
|
5
|
+
# [:users, :posts, :blogs, :articles, :pages].each do |table_name|
|
|
6
|
+
# change_table table_name do |t|
|
|
7
|
+
# t.integer :draft_comments_count, default: 0
|
|
8
|
+
# t.integer :published_comments_count, default: 0
|
|
9
|
+
# t.integer :deleted_comments_count, default: 0
|
|
10
|
+
# end
|
|
11
|
+
# end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
← [documentation](documentation.md)
|
|
2
|
+
|
|
3
|
+
## Admin UI installation
|
|
4
|
+
|
|
5
|
+
### 1. Gems install
|
|
6
|
+
|
|
7
|
+
**Gemfile**
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
# TheComments base
|
|
11
|
+
gem 'the_comments', "~> 2.0"
|
|
12
|
+
|
|
13
|
+
gem 'haml' # or gem 'slim'
|
|
14
|
+
gem 'awesome_nested_set' # or same gem
|
|
15
|
+
|
|
16
|
+
# TheComments Admin UI gems
|
|
17
|
+
|
|
18
|
+
# pagination
|
|
19
|
+
gem 'kaminari'
|
|
20
|
+
|
|
21
|
+
# bootstrap 3
|
|
22
|
+
gem 'bootstrap-sass', github: 'thomas-mcdonald/bootstrap-sass'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Bundle**
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
bundle
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2. Assets install
|
|
32
|
+
|
|
33
|
+
**app/assets/stylesheets/admin_ui.css**
|
|
34
|
+
|
|
35
|
+
```css
|
|
36
|
+
/*
|
|
37
|
+
*= require bootstrap
|
|
38
|
+
*/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**app/assets/javascripts/admin_ui.js**
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
//= require jquery
|
|
45
|
+
//= require jquery_ujs
|
|
46
|
+
|
|
47
|
+
//= require bootstrap
|
|
48
|
+
//= require the_comments_manage
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3. Admin layout
|
|
52
|
+
|
|
53
|
+
You can use following yields to insert TheComments management tools in your Layout.
|
|
54
|
+
|
|
55
|
+
```haml
|
|
56
|
+
= yield :comments_sidebar
|
|
57
|
+
= yield :comments_main
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
For example:
|
|
61
|
+
|
|
62
|
+
```haml
|
|
63
|
+
!!! 5
|
|
64
|
+
%html(lang="en")
|
|
65
|
+
%head
|
|
66
|
+
%meta(charset="utf-8")
|
|
67
|
+
%meta(http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1")
|
|
68
|
+
%meta(name="viewport" content="width=device-width, initial-scale=1.0")
|
|
69
|
+
%title= content_for?(:title) ? yield(:title) : "Admin Panel"
|
|
70
|
+
%link(href="favicon.ico" rel="shortcut icon")
|
|
71
|
+
|
|
72
|
+
= stylesheet_link_tag :admin_ui
|
|
73
|
+
= javascript_include_tag :admin_ui
|
|
74
|
+
= csrf_meta_tags
|
|
75
|
+
|
|
76
|
+
%body
|
|
77
|
+
.container
|
|
78
|
+
.row
|
|
79
|
+
.col-md-12
|
|
80
|
+
%h3= content_for?(:title) ? yield(:title) : "Admin Panel"
|
|
81
|
+
.row
|
|
82
|
+
.col-md-3= yield :comments_sidebar
|
|
83
|
+
.col-md-9= yield :comments_main
|
|
84
|
+
|
|
85
|
+
= stylesheet_link_tag "//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 4. Comments controller modifications
|
|
89
|
+
|
|
90
|
+
by default your comments controller looks like this:
|
|
91
|
+
|
|
92
|
+
**app/controllers/comments_controller.rb**
|
|
93
|
+
|
|
94
|
+
```ruby
|
|
95
|
+
class CommentsController < ApplicationController
|
|
96
|
+
# layout 'admin'
|
|
97
|
+
|
|
98
|
+
# Define your restrict methods and use them like this:
|
|
99
|
+
#
|
|
100
|
+
# before_action :user_required, except: %w[index create]
|
|
101
|
+
# before_action :owner_required, except: %w[index create]
|
|
102
|
+
# before_action :admin_required, only: %w[total_draft total_published total_deleted total_spam]
|
|
103
|
+
|
|
104
|
+
include TheComments::Controller
|
|
105
|
+
|
|
106
|
+
# >>> include TheComments::Controller <<<
|
|
107
|
+
# (!) Almost all methods based on *current_user* method
|
|
108
|
+
#
|
|
109
|
+
# 1. Controller's public methods list:
|
|
110
|
+
# You can redifine it for your purposes
|
|
111
|
+
# public
|
|
112
|
+
# %w[ manage index create edit update ]
|
|
113
|
+
# %w[ my_comments my_draft my_published ]
|
|
114
|
+
# %w[ draft published deleted spam ]
|
|
115
|
+
# %w[ to_draft to_published to_deleted to_spam ]
|
|
116
|
+
# %w[ total_draft total_published total_deleted total_spam ]
|
|
117
|
+
#
|
|
118
|
+
#
|
|
119
|
+
# 2. Controller's private methods list:
|
|
120
|
+
# You can redifine it for your purposes
|
|
121
|
+
#
|
|
122
|
+
# private
|
|
123
|
+
# %w[ comment_template comment_partial ]
|
|
124
|
+
# %w[ denormalized_fields request_data_for_comment define_commentable ]
|
|
125
|
+
# %w[ comment_params patch_comment_params ]
|
|
126
|
+
# %w[ ajax_requests_required cookies_required ]
|
|
127
|
+
# %w[ empty_trap_required tolerance_time_required ]
|
|
128
|
+
|
|
129
|
+
# KAMINARI pagination:
|
|
130
|
+
# following methods based on gem "kaminari"
|
|
131
|
+
# You should redefine them if you use something else
|
|
132
|
+
#
|
|
133
|
+
# public
|
|
134
|
+
# %w[ manage index edit ]
|
|
135
|
+
# %w[ draft published deleted spam ]
|
|
136
|
+
# %w[ my_comments my_draft my_published ]
|
|
137
|
+
# %w[ total_draft total_published total_deleted total_spam ]
|
|
138
|
+
end
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
You must define protection methods to restrict access to Admin UI for regular users.
|
|
142
|
+
|
|
143
|
+
### 5. Visit Admin UI
|
|
144
|
+
|
|
145
|
+
**localhost:3000/comments/manage**
|