biovision-comment 0.7.190905.0 → 0.8.190926.0
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 +4 -4
- data/app/assets/javascripts/biovision/comment/biovision-comments.js +56 -0
- data/app/assets/stylesheets/biovision/comment/comments.scss +4 -0
- data/app/controllers/admin/comments_controller.rb +6 -0
- data/app/controllers/comments_controller.rb +6 -1
- data/app/models/comment.rb +2 -1
- data/app/services/biovision/components/comments_component.rb +15 -0
- data/app/services/comment_handler.rb +10 -5
- data/app/services/comments_manager.rb +2 -10
- data/app/views/admin/comments/entity/_in_list.html.erb +7 -0
- data/app/views/admin/comments/show.html.erb +9 -0
- data/app/views/comments/_comment.html.erb +3 -2
- data/app/views/comments/_list.html.erb +2 -1
- data/config/locales/comments-ru.yml +5 -1
- data/config/routes.rb +2 -1
- data/lib/biovision/comment/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7aa9177ba4ca81f53183269587c9ff8d1ab7da046904e65616a72686856b1b44
|
4
|
+
data.tar.gz: 24550aecb8c28841f760bbe9f4caef9ca502efb0c396450ab39f5a18f2499856
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b49ee2521b7c018184f042c464d905c6209452f21aacdb636327a4a07fe254ea79a34ff522ff7257531727e441076e8faf4f683fb8c3e235291904d58c7e8134
|
7
|
+
data.tar.gz: 967b2cb830a8f4076c45c4ccdac61152f88943e67e0a3b5d13c642241e896bd6464c55f017f48884a5e7e4327214ceaa879a4d7cdda6dab94c06f297272370f2
|
@@ -115,4 +115,60 @@ Comments.components.replyFormMover = {
|
|
115
115
|
}
|
116
116
|
};
|
117
117
|
|
118
|
+
Comments.components.commentApproval = {
|
119
|
+
initialized: false,
|
120
|
+
selector: ".js-approve-comment",
|
121
|
+
buttons: [],
|
122
|
+
init: function () {
|
123
|
+
document.querySelectorAll(this.selector).forEach(this.apply);
|
124
|
+
this.initialized = true;
|
125
|
+
},
|
126
|
+
apply: function (button) {
|
127
|
+
const component = Comments.components.commentApproval;
|
128
|
+
component.buttons.push(button);
|
129
|
+
button.addEventListener("click", component.click);
|
130
|
+
},
|
131
|
+
click: function (event) {
|
132
|
+
const button = event.target;
|
133
|
+
const url = button.getAttribute("data-url");
|
134
|
+
const request = Biovision.jsonAjaxRequest("put", url, function () {
|
135
|
+
const container = button.closest("div");
|
136
|
+
container.remove();
|
137
|
+
}, function () {
|
138
|
+
button.disabled = false;
|
139
|
+
});
|
140
|
+
|
141
|
+
button.disabled = true;
|
142
|
+
request.send();
|
143
|
+
}
|
144
|
+
};
|
145
|
+
|
146
|
+
Comments.components.commentDelete = {
|
147
|
+
initialized: false,
|
148
|
+
selector: ".js-delete-comment",
|
149
|
+
buttons: [],
|
150
|
+
init: function () {
|
151
|
+
document.querySelectorAll(this.selector).forEach(this.apply);
|
152
|
+
this.initialized = true;
|
153
|
+
},
|
154
|
+
apply: function (button) {
|
155
|
+
const component = Comments.components.commentDelete;
|
156
|
+
component.buttons.push(button);
|
157
|
+
button.addEventListener("click", component.click);
|
158
|
+
},
|
159
|
+
click: function (event) {
|
160
|
+
const button = event.target;
|
161
|
+
const url = button.getAttribute("data-url");
|
162
|
+
const request = Biovision.jsonAjaxRequest("delete", url, function () {
|
163
|
+
const container = button.closest("div");
|
164
|
+
container.remove();
|
165
|
+
}, function () {
|
166
|
+
button.disabled = false;
|
167
|
+
});
|
168
|
+
|
169
|
+
button.disabled = true;
|
170
|
+
request.send();
|
171
|
+
}
|
172
|
+
};
|
173
|
+
|
118
174
|
Biovision.components.comments = Comments;
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
# Comments
|
4
4
|
class CommentsController < ApplicationController
|
5
|
-
before_action :set_handler
|
6
5
|
before_action :restrict_access, except: %i[check create]
|
7
6
|
before_action :set_entity, only: %i[edit update destroy]
|
8
7
|
|
@@ -45,6 +44,11 @@ class CommentsController < ApplicationController
|
|
45
44
|
redirect_to(@entity.commentable || admin_comments_path)
|
46
45
|
end
|
47
46
|
|
47
|
+
# get /comments/:id
|
48
|
+
def show
|
49
|
+
redirect_to(admin_comment_path(id: params[:id]))
|
50
|
+
end
|
51
|
+
|
48
52
|
private
|
49
53
|
|
50
54
|
def component_slug
|
@@ -86,6 +90,7 @@ class CommentsController < ApplicationController
|
|
86
90
|
end
|
87
91
|
|
88
92
|
def notify_participants
|
93
|
+
flash[:notice] = t('comments.create.premoderation') unless @entity.approved?
|
89
94
|
# to be implemented...
|
90
95
|
end
|
91
96
|
end
|
data/app/models/comment.rb
CHANGED
@@ -48,7 +48,8 @@ class Comment < ApplicationRecord
|
|
48
48
|
|
49
49
|
scope :recent, -> { order 'id desc' }
|
50
50
|
scope :chronological, -> { order 'id asc' }
|
51
|
-
scope :
|
51
|
+
scope :approved, -> { where(approved: true) }
|
52
|
+
scope :visible, -> { approved.where(deleted: false, visible: true, spam: false) }
|
52
53
|
scope :list_for_administration, -> { recent }
|
53
54
|
scope :list_for_visitors, -> { visible.chronological }
|
54
55
|
scope :list_for_visitors_recent, -> { visible.recent }
|
@@ -17,6 +17,7 @@ module Biovision
|
|
17
17
|
# @param [Hash] parameters
|
18
18
|
def create_comment(parameters)
|
19
19
|
@comment = ::Comment.new(parameters)
|
20
|
+
@comment.approved = approval_flag if settings['premoderation']
|
20
21
|
@comment.save
|
21
22
|
@comment
|
22
23
|
end
|
@@ -34,6 +35,20 @@ module Biovision
|
|
34
35
|
|
35
36
|
result
|
36
37
|
end
|
38
|
+
|
39
|
+
def approval_flag
|
40
|
+
threshold = settings['auto_approve_threshold']
|
41
|
+
if @comment.user.nil?
|
42
|
+
criteria = {
|
43
|
+
user_id: nil,
|
44
|
+
ip: @comment.ip,
|
45
|
+
agent_id: @comment.agent_id
|
46
|
+
}
|
47
|
+
::Comment.approved.where(criteria).count >= threshold
|
48
|
+
else
|
49
|
+
::Comment.approved.owned_by(@comment.user).count >= threshold
|
50
|
+
end
|
51
|
+
end
|
37
52
|
end
|
38
53
|
end
|
39
54
|
end
|
@@ -8,7 +8,7 @@ class CommentHandler
|
|
8
8
|
def initialize(user = nil)
|
9
9
|
slug = Biovision::Components::CommentsComponent::SLUG
|
10
10
|
@user = user
|
11
|
-
@handler = Biovision::Components::BaseComponent.handler(slug)
|
11
|
+
@handler = Biovision::Components::BaseComponent.handler(slug, user)
|
12
12
|
end
|
13
13
|
|
14
14
|
# Get list of comments for entity
|
@@ -18,7 +18,7 @@ class CommentHandler
|
|
18
18
|
#
|
19
19
|
# @param [ApplicationRecord] entity
|
20
20
|
def list(entity)
|
21
|
-
if @handler.
|
21
|
+
if @handler.allow?
|
22
22
|
entity.comments.list_for_administration
|
23
23
|
else
|
24
24
|
entity.comments.list_for_visitors
|
@@ -32,16 +32,21 @@ class CommentHandler
|
|
32
32
|
# comments must be more than threshold; anonymous comments are always
|
33
33
|
# non-approved.
|
34
34
|
def approve?
|
35
|
-
return true unless @
|
35
|
+
return true unless @handler.settings['premoderate']
|
36
36
|
return false if @user.nil?
|
37
|
-
return true if @
|
37
|
+
return true if @handler.allow?
|
38
38
|
|
39
|
-
gate = @
|
39
|
+
gate = @handler.settings['auto_approve_threshold'].to_i
|
40
40
|
positive = Comment.where(user: @user, approved: true).count
|
41
41
|
negative = Comment.where(user: @user, approved: false).count
|
42
42
|
positive - negative >= gate
|
43
43
|
end
|
44
44
|
|
45
|
+
# @param [String] privilege_name
|
46
|
+
def allow?(*privilege_name)
|
47
|
+
@handler.allow?(*privilege_name)
|
48
|
+
end
|
49
|
+
|
45
50
|
# @param [ApplicationRecord] entity
|
46
51
|
def allow_reply?(entity)
|
47
52
|
entity.respond_to?(:commentable_by?) && entity.commentable_by?(@user)
|
@@ -6,19 +6,11 @@ class CommentsManager
|
|
6
6
|
# @param [TrueClass|FalseClass] anchor
|
7
7
|
def self.commentable_path(comment, anchor = false)
|
8
8
|
method_name = "#{comment.commentable_type}_path".downcase.to_sym
|
9
|
-
if respond_to?(
|
10
|
-
result =
|
9
|
+
if comment.commentable.respond_to?(:url)
|
10
|
+
result = comment.commentable.url
|
11
11
|
anchor ? "#{result}#comment-#{comment.id}" : result
|
12
12
|
else
|
13
13
|
"##{method_name}"
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
17
|
-
# @param [Post] entity
|
18
|
-
def self.post_path(entity)
|
19
|
-
return '#post' unless Gem.loaded_specs.key?('biovision-post')
|
20
|
-
|
21
|
-
handler = PostManager.new(entity)
|
22
|
-
handler.post_path
|
23
|
-
end
|
24
16
|
end
|
@@ -21,6 +21,13 @@
|
|
21
21
|
<%= simple_format(entity.body) %>
|
22
22
|
</div>
|
23
23
|
|
24
|
+
<% unless entity.approved? %>
|
25
|
+
<div>
|
26
|
+
<button class="js-approve-comment" data-url="<%= approve_admin_comment_path(id: entity.id) %>"><%= t('.approve') %></button>
|
27
|
+
<button class="js-delete-comment" data-url="<%= admin_comment_path(id: entity.id) %>"><%= t(:delete) %></button>
|
28
|
+
</div>
|
29
|
+
<% end %>
|
30
|
+
|
24
31
|
<ul class="actions">
|
25
32
|
<li><%= edit_icon(edit_comment_path(id: entity.id)) %></li>
|
26
33
|
<% unless entity.deleted? %>
|
@@ -52,4 +52,13 @@
|
|
52
52
|
</div>
|
53
53
|
</dd>
|
54
54
|
</dl>
|
55
|
+
|
56
|
+
<%= render partial: 'shared/track', locals: { item: @entity } %>
|
57
|
+
|
58
|
+
<% unless @entity.approved? %>
|
59
|
+
<div>
|
60
|
+
<button class="js-approve-comment" data-url="<%= approve_admin_comment_path(id: @entity.id) %>"><%= t('admin.comments.entity.in_list.approve') %></button>
|
61
|
+
<button class="js-delete-comment" data-url="<%= admin_comment_path(id: @entity.id) %>"><%= t(:delete) %></button>
|
62
|
+
</div>
|
63
|
+
<% end %>
|
55
64
|
</article>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<div class="deleted"><%= t('.deleted') %></div>
|
11
11
|
<% else %>
|
12
12
|
<meta itemprop="url" content="<%= url_for(anchor: element_id) %>"/>
|
13
|
-
<% if
|
13
|
+
<% if handler.allow?('moderator') %>
|
14
14
|
<ul class="actions">
|
15
15
|
<li><%= edit_icon(edit_comment_path(id: comment.id)) %></li>
|
16
16
|
<li class="danger"><%= destroy_icon(comment) %></li>
|
@@ -65,7 +65,8 @@
|
|
65
65
|
locals: {
|
66
66
|
comment: item[:comment],
|
67
67
|
show_container: show_container,
|
68
|
-
comment_tree: comment_tree
|
68
|
+
comment_tree: comment_tree,
|
69
|
+
handler: handler
|
69
70
|
}
|
70
71
|
)
|
71
72
|
%>
|
@@ -38,7 +38,7 @@ ru:
|
|
38
38
|
admin:
|
39
39
|
comments:
|
40
40
|
nav_item:
|
41
|
-
text: "
|
41
|
+
text: "Список комментариев"
|
42
42
|
description: "Модерация комментариев"
|
43
43
|
index:
|
44
44
|
title: "Комментарии, страница %{page}"
|
@@ -47,6 +47,9 @@ ru:
|
|
47
47
|
title: "Комментарий №%{id}"
|
48
48
|
comment:
|
49
49
|
deleted: "Комментарий удалён"
|
50
|
+
entity:
|
51
|
+
in_list:
|
52
|
+
approve: "Одобрить"
|
50
53
|
index:
|
51
54
|
dashboard:
|
52
55
|
biovision_comment:
|
@@ -60,6 +63,7 @@ ru:
|
|
60
63
|
comments:
|
61
64
|
create:
|
62
65
|
success: "Комментарий добавлен"
|
66
|
+
premoderation: "Ваш комментарий добавлен в очередь модерации"
|
63
67
|
update:
|
64
68
|
success: "Комментарий изменён"
|
65
69
|
destroy:
|
data/config/routes.rb
CHANGED
@@ -9,11 +9,12 @@ Rails.application.routes.draw do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :admin do
|
12
|
-
resources :comments, only: %i[index show] do
|
12
|
+
resources :comments, only: %i[index show destroy] do
|
13
13
|
member do
|
14
14
|
post 'toggle', defaults: { format: :json }
|
15
15
|
put 'lock', defaults: { format: :json }
|
16
16
|
delete 'lock', action: :unlock, defaults: { format: :json }
|
17
|
+
put 'approve'
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: biovision-comment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.190926.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxim Khan-Magomedov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|