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.
Files changed (172) hide show
  1. data/.rvmrc.example +1 -0
  2. data/.travis.yml +5 -0
  3. data/README.md +105 -425
  4. data/app/assets/javascripts/the_comments.js.coffee +12 -9
  5. data/app/assets/javascripts/the_comments_manage.js.coffee +19 -49
  6. data/app/assets/stylesheets/the_comments.css.scss +20 -29
  7. data/app/controllers/_templates_/comments_controller.rb +44 -0
  8. data/app/controllers/concerns/controller.rb +216 -0
  9. data/app/helpers/render_comments_tree_helper.rb +4 -7
  10. data/app/models/_templates_/comment.rb +38 -0
  11. data/app/models/concerns/comment.rb +103 -0
  12. data/app/models/concerns/comment_states.rb +80 -0
  13. data/app/models/concerns/commentable.rb +69 -0
  14. data/app/models/concerns/user.rb +52 -0
  15. data/app/views/the_comments/_tree.html.erb +3 -0
  16. data/app/views/the_comments/haml/_additional_info.html.haml +13 -0
  17. data/app/views/the_comments/{_comment.html.haml → haml/_comment.html.haml} +0 -0
  18. data/app/views/the_comments/haml/_comment_body.html.haml +20 -0
  19. data/app/views/the_comments/haml/_comment_edit.html.haml +26 -0
  20. data/app/views/the_comments/{_form.html.haml → haml/_form.html.haml} +8 -6
  21. data/app/views/the_comments/haml/_manage_controls.html.haml +27 -0
  22. data/app/views/the_comments/haml/_sidebar.html.haml +28 -0
  23. data/app/views/the_comments/haml/_tree.html.haml +4 -0
  24. data/app/views/the_comments/haml/index.html.haml +18 -0
  25. data/app/views/the_comments/haml/manage.html.haml +25 -0
  26. data/app/views/the_comments/haml/my_comments.html.haml +28 -0
  27. data/app/views/the_comments/slim/_additional_info.html.slim +13 -0
  28. data/app/views/the_comments/slim/_comment.html.slim +1 -0
  29. data/app/views/the_comments/slim/_comment_body.html.slim +20 -0
  30. data/app/views/the_comments/slim/_comment_edit.html.slim +26 -0
  31. data/app/views/the_comments/slim/_form.html.slim +27 -0
  32. data/app/views/the_comments/slim/_manage_controls.html.slim +27 -0
  33. data/app/views/the_comments/slim/_sidebar.html.slim +28 -0
  34. data/app/views/the_comments/slim/_tree.html.slim +4 -0
  35. data/app/views/the_comments/slim/index.html.slim +18 -0
  36. data/app/views/the_comments/slim/manage.html.slim +25 -0
  37. data/app/views/the_comments/slim/my_comments.html.slim +28 -0
  38. data/{lib/generators/the_comments/templates → config/initializers}/the_comments.rb +3 -0
  39. data/config/locales/en.yml +39 -14
  40. data/config/locales/ru.yml +67 -0
  41. data/config/routes.rb +17 -13
  42. data/db/migrate/20130101010101_change_user.rb +18 -0
  43. data/db/migrate/20130101010102_create_comments.rb +50 -0
  44. data/db/migrate/20130101010103_change_commentable.rb +13 -0
  45. data/docs/admin_ui_installation.md +145 -0
  46. data/docs/advanced_installation.md +182 -0
  47. data/docs/comment_api.md +58 -0
  48. data/docs/commentable_api.md +59 -0
  49. data/docs/config_file.md +27 -0
  50. data/docs/content_preprocessors.md +73 -0
  51. data/docs/customazation_of_views.md +30 -0
  52. data/docs/denormalization_and_recent_comments.md +40 -0
  53. data/docs/documentation.md +28 -0
  54. data/docs/mountable_routes.md +80 -0
  55. data/docs/pagination.md +123 -0
  56. data/docs/screencast.jpg +0 -0
  57. data/docs/user_api.md +75 -0
  58. data/docs/what_is_comcoms.md +63 -0
  59. data/docs/whats_wrong_with_other_gems.md +18 -0
  60. data/docs/where_is_example_application.md +37 -0
  61. data/gem_version.rb +3 -0
  62. data/lib/generators/the_comments/USAGE +31 -20
  63. data/lib/generators/the_comments/the_comments_generator.rb +35 -18
  64. data/lib/generators/the_comments/views_generator.rb +52 -16
  65. data/lib/the_comments/config.rb +14 -1
  66. data/lib/the_comments/version.rb +1 -3
  67. data/lib/the_comments.rb +10 -0
  68. data/spec/dummy_app/.gitignore +17 -0
  69. data/spec/dummy_app/.rspec +1 -0
  70. data/spec/dummy_app/.ruby-gemset +1 -0
  71. data/spec/dummy_app/.ruby-version +1 -0
  72. data/spec/dummy_app/Gemfile +43 -0
  73. data/spec/dummy_app/README.md +50 -0
  74. data/spec/dummy_app/Rakefile +6 -0
  75. data/spec/dummy_app/app/assets/images/.keep +0 -0
  76. data/spec/dummy_app/app/assets/javascripts/admin_panel.js +5 -0
  77. data/spec/dummy_app/app/assets/javascripts/application.js +16 -0
  78. data/spec/dummy_app/app/assets/stylesheets/admin_panel.css +3 -0
  79. data/spec/dummy_app/app/assets/stylesheets/app.css.scss +4 -0
  80. data/spec/dummy_app/app/assets/stylesheets/application.css +16 -0
  81. data/spec/dummy_app/app/controllers/application_controller.rb +7 -0
  82. data/{lib/generators/the_comments/templates → spec/dummy_app/app/controllers}/comments_controller.rb +3 -1
  83. data/spec/dummy_app/app/controllers/concerns/.keep +0 -0
  84. data/spec/dummy_app/app/controllers/posts_controller.rb +13 -0
  85. data/spec/dummy_app/app/controllers/users_controller.rb +7 -0
  86. data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
  87. data/spec/dummy_app/app/mailers/.keep +0 -0
  88. data/spec/dummy_app/app/models/.keep +0 -0
  89. data/spec/dummy_app/app/models/comment.rb +32 -0
  90. data/spec/dummy_app/app/models/concerns/.keep +0 -0
  91. data/spec/dummy_app/app/models/post.rb +17 -0
  92. data/spec/dummy_app/app/models/user.rb +21 -0
  93. data/spec/dummy_app/app/views/layouts/admin.html.haml +25 -0
  94. data/spec/dummy_app/app/views/layouts/application.html.haml +20 -0
  95. data/spec/dummy_app/app/views/posts/index.html.haml +22 -0
  96. data/spec/dummy_app/app/views/posts/show.html.haml +7 -0
  97. data/spec/dummy_app/bin/bundle +3 -0
  98. data/spec/dummy_app/bin/rails +4 -0
  99. data/spec/dummy_app/bin/rake +4 -0
  100. data/spec/dummy_app/config/application.rb +23 -0
  101. data/spec/dummy_app/config/boot.rb +4 -0
  102. data/spec/dummy_app/config/database.yml +11 -0
  103. data/spec/dummy_app/config/environment.rb +5 -0
  104. data/spec/dummy_app/config/environments/development.rb +29 -0
  105. data/spec/dummy_app/config/environments/production.rb +80 -0
  106. data/spec/dummy_app/config/environments/test.rb +36 -0
  107. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  108. data/spec/dummy_app/config/initializers/filter_parameter_logging.rb +4 -0
  109. data/spec/dummy_app/config/initializers/inflections.rb +16 -0
  110. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  111. data/spec/dummy_app/config/initializers/secret_token.rb +12 -0
  112. data/spec/dummy_app/config/initializers/session_store.rb +3 -0
  113. data/spec/dummy_app/config/initializers/sorcery.rb +437 -0
  114. data/spec/dummy_app/config/initializers/the_comments.rb +13 -0
  115. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  116. data/spec/dummy_app/config/locales/en.yml +23 -0
  117. data/spec/dummy_app/config/routes.rb +15 -0
  118. data/spec/dummy_app/config.ru +4 -0
  119. data/spec/dummy_app/db/migrate/20130712061503_sorcery_core.rb +16 -0
  120. data/spec/dummy_app/db/migrate/20130712065951_create_posts.rb +11 -0
  121. data/spec/dummy_app/db/migrate/20131027185332_change_user.the_comments_engine.rb +19 -0
  122. data/spec/dummy_app/db/migrate/20131027185333_create_comments.the_comments_engine.rb +51 -0
  123. data/spec/dummy_app/db/migrate/20131027185334_change_commentable.the_comments_engine.rb +14 -0
  124. data/spec/dummy_app/db/schema.rb +74 -0
  125. data/spec/dummy_app/db/seeds.rb +42 -0
  126. data/spec/dummy_app/lib/assets/.keep +0 -0
  127. data/spec/dummy_app/lib/tasks/.keep +0 -0
  128. data/spec/dummy_app/lib/tasks/app_bootstrap.rake +15 -0
  129. data/spec/dummy_app/log/.keep +0 -0
  130. data/spec/dummy_app/public/404.html +58 -0
  131. data/spec/dummy_app/public/422.html +58 -0
  132. data/spec/dummy_app/public/500.html +57 -0
  133. data/spec/dummy_app/public/favicon.ico +0 -0
  134. data/spec/dummy_app/public/robots.txt +5 -0
  135. data/spec/dummy_app/spec/factories/post.rb +6 -0
  136. data/spec/dummy_app/spec/factories/user.rb +6 -0
  137. data/spec/dummy_app/spec/models/user_counters_spec.rb +339 -0
  138. data/spec/dummy_app/spec/spec_helper.rb +29 -0
  139. data/spec/dummy_app/test/controllers/.keep +0 -0
  140. data/spec/dummy_app/test/fixtures/.keep +0 -0
  141. data/spec/dummy_app/test/helpers/.keep +0 -0
  142. data/spec/dummy_app/test/integration/.keep +0 -0
  143. data/spec/dummy_app/test/mailers/.keep +0 -0
  144. data/spec/dummy_app/test/models/.keep +0 -0
  145. data/spec/dummy_app/test/test_helper.rb +15 -0
  146. data/spec/dummy_app/vendor/assets/javascripts/.keep +0 -0
  147. data/spec/dummy_app/vendor/assets/stylesheets/.keep +0 -0
  148. data/views_converter.rb +16 -0
  149. metadata +223 -45
  150. data/app/controllers/concerns/the_comments_controller.rb +0 -229
  151. data/app/controllers/concerns/the_comments_ip_controller.rb +0 -17
  152. data/app/controllers/concerns/the_comments_user_agent_controller.rb +0 -15
  153. data/app/models/concerns/the_comments_base.rb +0 -69
  154. data/app/models/concerns/the_comments_black_ip.rb +0 -9
  155. data/app/models/concerns/the_comments_black_user_agent.rb +0 -9
  156. data/app/models/concerns/the_comments_commentable.rb +0 -66
  157. data/app/models/concerns/the_comments_states.rb +0 -65
  158. data/app/models/concerns/the_comments_user.rb +0 -32
  159. data/app/views/ip_black_lists/index.html.haml +0 -17
  160. data/app/views/the_comments/_comment_body.html.haml +0 -30
  161. data/app/views/the_comments/_manage_controls.html.haml +0 -4
  162. data/app/views/the_comments/_tree.html.haml +0 -4
  163. data/app/views/the_comments/index.html.haml +0 -19
  164. data/app/views/the_comments/manage.html.haml +0 -29
  165. data/app/views/user_agent_black_lists/index.html.haml +0 -17
  166. data/db/migrate/20130101010101_create_comments.rb +0 -90
  167. data/lib/generators/the_comments/templates/ip_black_list.rb +0 -3
  168. data/lib/generators/the_comments/templates/ip_black_lists_controller.rb +0 -10
  169. data/lib/generators/the_comments/templates/the_comments_black_ip.rb +0 -9
  170. data/lib/generators/the_comments/templates/the_comments_black_user_agent.rb +0 -9
  171. data/lib/generators/the_comments/templates/user_agent_black_list.rb +0 -3
  172. data/lib/generators/the_comments/templates/user_agent_black_lists_controller.rb +0 -10
@@ -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
@@ -7,4 +7,7 @@ TheComments.configure do |config|
7
7
  config.default_owner_state = :published # default state for comment for Moderator
8
8
  config.empty_inputs = [:commentBody] # array of spam trap fields
9
9
  config.default_title = 'Undefined title' # default commentable_title for denormalization
10
+
11
+ config.empty_trap_protection = true
12
+ config.tolerance_time_protection = true
10
13
  end
@@ -12,22 +12,26 @@ en:
12
12
  # blank: '%{attribute} should not be empty'
13
13
 
14
14
  the_comments:
15
- trap: Trap
16
- trap_message: should be empty
15
+ incoming: "Incoming:"
16
+ in_system: "In system:"
17
+ written_by_me: "Written by me:"
18
+ back_to_root: "← To root"
17
19
 
18
- tolerance_time: Page view time
19
- tolerance_time_message: "Please wait %{time} seconds before send a comment and try again"
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})"
20
25
 
21
- cookies: Cookies
22
- cookies_required: 'Please enable cookies and try to reload page'
26
+ management: Comments management
27
+ new: "New comment"
28
+ update: "Update comment"
29
+ additional_info: "Additional info"
30
+ cancel: "Cancel"
23
31
 
24
- ajax_requests_required: 'Sorry, JavaScript/Ajax Requests required'
25
-
26
- black_ip: Black IP adress
27
- black_ip_message: Sorry! Your IP banned
28
-
29
- black_user_agent: Black User Agent
30
- black_user_agent_message: Sorry! Your User Agent banned
32
+ title: "Title on name:"
33
+ contacts: "Contacts:"
34
+ content: "Message:"
31
35
 
32
36
  guest_name: Guest
33
37
  reply: Reply to this comment
@@ -37,7 +41,28 @@ en:
37
41
  to_published: Publicate
38
42
  to_deleted: Delete
39
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
+
40
62
  delete_confirm: Are you sure?
41
63
 
64
+ cookies: Cookies
65
+ cookies_required: 'Please enable cookies and try to reload page'
66
+ ajax_requests_required: 'Sorry, JavaScript/Ajax Requests required'
42
67
  waiting_for_moderation: Waiting for moderation
43
- item_not_found: Black list Item not found
68
+ undefined_commentable: Commentable object is undefined
@@ -0,0 +1,67 @@
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: "Все в системе:"
16
+ written_by_me: "Написанные мной:"
17
+ back_to_root: "← На главную"
18
+
19
+ my_comments: "Мои комментарии (%{num})"
20
+ draft_comments: "Новые (%{num})"
21
+ published_comments: "Опубликованные (%{num})"
22
+ deleted_comments: "Удаленные (%{num})"
23
+ spam_comments: "Спам (%{num})"
24
+
25
+ management: Управление комментариями
26
+ new: "Написать новый комментарий"
27
+ update: "Обновить"
28
+ additional_info: "Подробнее"
29
+ cancel: "Отмена"
30
+
31
+ title: "Имя или тема:"
32
+ contacts: "Контакты:"
33
+ content: "Сообщение:"
34
+
35
+ guest_name: Гость
36
+ reply: Ответить на этот комментарий
37
+ edit: Править
38
+ to_spam: Спам!
39
+ to_draft: Черновик
40
+ to_published: Публиковать
41
+ to_deleted: Удалить
42
+
43
+ no_comments_here: Здесь нет комментариев
44
+
45
+ nav:
46
+ header: "Навигация"
47
+
48
+ form:
49
+ title: "Ваше имя:"
50
+ contacts: "Контакты (не отображаются на сайте):"
51
+ content: "Текст комментария* :"
52
+ create: "Отправить комментарий"
53
+ thank_you: "Спaсибо!"
54
+
55
+ trap: Ловушка
56
+ trap_message: Должна быть пустой
57
+
58
+ tolerance_time: Просмотр времени
59
+ tolerance_time_message: "Пожалуйста ожидайте %{time} сек. перед отправкой сообщения"
60
+
61
+ cookies: Куки
62
+ cookies_required: 'Включите куки и перезагрузите страницу'
63
+
64
+ delete_confirm: Вы уверены?
65
+ waiting_for_moderation: Ожидает модерации
66
+ ajax_requests_required: 'Извините, ожидается JavaScript/Ajax запрос'
67
+ undefined_commentable: Комментируемый объект не определен
data/config/routes.rb CHANGED
@@ -1,24 +1,28 @@
1
- Rails.application.routes.draw do
2
- resources :ip_black_lists do
3
- patch :to_state
4
- end
5
-
6
- resources :user_agent_black_lists do
7
- patch :to_state
8
- end
9
-
1
+ TheComments::Engine.routes.draw do
10
2
  resources :comments do
11
3
  member do
12
4
  post :to_spam
13
5
  post :to_draft
14
6
  post :to_published
15
- delete :to_trash
7
+ delete :to_deleted
16
8
  end
17
9
 
18
10
  collection do
19
- get :my
20
- get :incoming
21
- get :trash
11
+ get :manage
12
+
13
+ get :my_draft
14
+ get :my_published
15
+ get :my_comments
16
+
17
+ get :total_draft
18
+ get :total_published
19
+ get :total_deleted
20
+ get :total_spam
21
+
22
+ get :draft
23
+ get :published
24
+ get :deleted
25
+ get :spam
22
26
  end
23
27
  end
24
28
  end
@@ -0,0 +1,18 @@
1
+ # null: false => de-facto db-level validation
2
+ class ChangeUser < 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 CreateComments < 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 ChangeCommentable < 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
+ &larr; &nbsp; [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**
@@ -0,0 +1,182 @@
1
+ &larr; &nbsp; [documentation](documentation.md)
2
+
3
+ ## Advanced Installation
4
+
5
+ ### 1. Gems install
6
+
7
+ **Gemfile**
8
+
9
+ ```ruby
10
+ gem 'the_comments', "~> 2.0"
11
+
12
+ gem 'haml' # or gem 'slim'
13
+ gem 'awesome_nested_set' # or same gem
14
+ ```
15
+
16
+ **Bundle**
17
+
18
+ ```
19
+ bundle
20
+ ```
21
+
22
+ ### 2. Migrations install
23
+
24
+ **Copy migrations**
25
+
26
+ ```
27
+ rake the_comments_engine:install:migrations
28
+ ```
29
+
30
+ Will create:
31
+
32
+ * xxxxx_change_user.rb
33
+ * xxxxx_create_comments.rb
34
+ * xxxxx_change_commentable.rb
35
+
36
+ :warning: &nbsp; **Open and change xxxxx_change_commentable.rb migration**
37
+
38
+ ```ruby
39
+ class ChangeCommentable < ActiveRecord::Migration
40
+ def change
41
+ # Additional fields to Commentable Models
42
+ # [:posts, :articles, ... ]
43
+
44
+ # There is only Post model is commentable
45
+ [:posts].each do |table_name|
46
+ change_table table_name do |t|
47
+ t.integer :draft_comments_count, default: 0
48
+ t.integer :published_comments_count, default: 0
49
+ t.integer :deleted_comments_count, default: 0
50
+ end
51
+ end
52
+ end
53
+ end
54
+ ```
55
+
56
+ **Invoke migrations**
57
+
58
+ ```
59
+ rake db:migrate
60
+ ```
61
+
62
+ ### 3. Code install
63
+
64
+ ```ruby
65
+ rails g the_comments install
66
+ ```
67
+
68
+ Will create:
69
+
70
+ * config/initializers/the_comments.rb
71
+ * app/controllers/comments_controller.rb
72
+ * app/models/comment.rb
73
+
74
+ :warning: &nbsp; **Open each file and follow an instructions**
75
+
76
+ ### 4. Models modifictions
77
+
78
+ **app/models/user.rb**
79
+
80
+ ```ruby
81
+ class User < ActiveRecord::Base
82
+ include TheComments::User
83
+
84
+ has_many :posts
85
+
86
+ # Your way to define privileged users
87
+ def admin?
88
+ self == User.first
89
+ end
90
+
91
+ # Required TheComments methods for users restrictions
92
+ def comments_admin?
93
+ admin?
94
+ end
95
+
96
+ def comments_moderator? comment
97
+ id == comment.holder_id
98
+ end
99
+ end
100
+ ```
101
+
102
+ **app/models/post.rb**
103
+
104
+ ```ruby
105
+ class Post < ActiveRecord::Base
106
+ include TheComments::Commentable
107
+
108
+ belongs_to :user
109
+
110
+ # Denormalization methods
111
+ # Migration: t.string :title
112
+ # => "My new awesome post"
113
+ def commentable_title
114
+ try(:title) || "Undefined post title"
115
+ end
116
+
117
+ # => your way to build URL
118
+ # => "/posts/254"
119
+ def commentable_url
120
+ ['', self.class.to_s.tableize, id].join('/')
121
+ end
122
+
123
+ # gem 'state_machine'
124
+ # Migration: t.string :state
125
+ # => "published" | "draft" | "deleted"
126
+ def commentable_state
127
+ try(:state) || "published"
128
+ end
129
+ end
130
+ ```
131
+
132
+ ### 5. Mount Engine routes
133
+
134
+ **config/routes.rb**
135
+
136
+ ```ruby
137
+ MyApp::Application.routes.draw do
138
+ root 'posts#index'
139
+ resources :posts
140
+
141
+ # ...
142
+
143
+ mount TheComments::Engine => '/', as: :comments
144
+ end
145
+ ```
146
+
147
+ Please, read [documentation](docs/documentation.md) to learn more
148
+
149
+ ### 6. Assets install
150
+
151
+ **app/assets/stylesheets/application.css**
152
+
153
+ ```css
154
+ /*
155
+ *= require the_comments
156
+ */
157
+ ```
158
+
159
+ **app/assets/javascripts/application.js**
160
+
161
+ ```js
162
+ //= require the_comments
163
+ ```
164
+
165
+ ### 7. Controller code example
166
+
167
+ **app/controllers/posts_controllers.rb**
168
+
169
+ ```ruby
170
+ def show
171
+ @post = Post.find params[:id]
172
+ @comments = @post.comments.with_state([:draft, :published])
173
+ end
174
+ ```
175
+
176
+ ### 8. View code example
177
+
178
+ **app/views/posts/show.html.haml**
179
+
180
+ ```haml
181
+ = render partial: 'the_comments/tree', locals: { commentable: @post, comments_tree: @comments }
182
+ ```
@@ -0,0 +1,58 @@
1
+ &larr; &nbsp; [documentation](documentation.md)
2
+
3
+ ### Comment API
4
+
5
+ ```ruby
6
+ @comment = Comment.last
7
+
8
+ # Comment creator, can be nil (for Guest)
9
+ @comment.user # => User
10
+
11
+ # Comment holder
12
+ # Owner of commentable object
13
+ # shouldn't be nil, should be defined on create
14
+ @comment.holder # => User
15
+
16
+ # Commentable object
17
+ @comment.commentable # => Post
18
+
19
+ # Raw user input
20
+ @comment.raw_content
21
+
22
+ # Processed user input
23
+ # method *prepare_content* should be redefined by developer
24
+ @comment.content
25
+
26
+ # Denormalization fields
27
+ @comment.commentable_title # => "Harum sint error odit."
28
+ @comment.commentable_url # => "/posts/7"
29
+ @comment.commentable_state # => "published"
30
+
31
+ # Stat info from request
32
+ # Can be used for spam detection
33
+ @comment.user_agent # => Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10
34
+ @comment.tolerance_time # => 5 (secs)
35
+ @comment.referer # => localhost:3000/post/7
36
+ @comment.ip # => 192.168.0.12
37
+
38
+ # State
39
+ @comment.state # => draft | published | deleted
40
+
41
+ # Spam flag
42
+ @comment.spam # => true
43
+
44
+ # Alias for *mark_as_spam*
45
+ @comment.to_spam
46
+
47
+ # mark this comment and all descendants as spam/not spam
48
+ @comment.mark_as_spam
49
+ @comment.mark_as_not_spam
50
+
51
+ # Comment's creator avatar
52
+ # this method can be redefined by developer
53
+ @comment.avatar_url # => "https://2.gravatar.com/avatar/015e ... 2f05?s=42&d=https://identicons.github.com/AVATAR.png"
54
+
55
+ # Anchor of comment
56
+ # this method can be redefined by developer
57
+ @comment.anchor # => b58020
58
+ ```