thredded 0.16.14 → 0.16.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/helpers/thredded/icon_helper.rb +1 -1
- data/app/models/concerns/thredded/user_topic_read_state_common.rb +4 -5
- data/app/models/thredded/messageboard.rb +4 -2
- data/app/models/thredded/user_private_topic_read_state.rb +3 -0
- data/app/models/thredded/user_topic_read_state.rb +3 -0
- data/app/views/thredded/posts_common/_actions.html.erb +1 -1
- data/app/views/thredded/shared/nav/_moderation.html.erb +3 -3
- data/app/views/thredded/shared/nav/_notification_preferences.html.erb +1 -1
- data/app/views/thredded/shared/nav/_private_topics.html.erb +3 -3
- data/app/views/thredded/topics/_header.html.erb +1 -1
- data/lib/thredded/arel_compat.rb +27 -18
- data/lib/thredded/html_pipeline/onebox_filter.rb +1 -4
- data/lib/thredded/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac00c63103252bbf9bff35aa057a6630605ad897368010665476b8b4d2abfc3a
|
4
|
+
data.tar.gz: cf7c0937115c8967c8fed0ba5789e4445db0a9e8b098a3109563b63be3883059
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd1d9295ea54d35b3f6f1ac48f741b2766645c118b4519b717d5c4f87d926be12492ff2f4b76449088dfe2357b10e518b28442c76ac2998c19614ea2d3631603
|
7
|
+
data.tar.gz: 6d8892713aba82af3017146f0c4f5f8238af39842f4536640689915fa3833b68dc63023502c23e1311a63b6dd45aec0c02c14e4be3367fa6b67e3a471df70caf
|
data/README.md
CHANGED
@@ -96,7 +96,7 @@ Then, see the rest of this Readme for more information about using and customizi
|
|
96
96
|
Add the gem to your Gemfile:
|
97
97
|
|
98
98
|
```ruby
|
99
|
-
gem 'thredded', '~> 0.16.
|
99
|
+
gem 'thredded', '~> 0.16.15'
|
100
100
|
```
|
101
101
|
|
102
102
|
Add the Thredded [initializer] to your parent app by running the install generator.
|
@@ -25,7 +25,7 @@ module Thredded
|
|
25
25
|
def inline_svg_once(filename, id:, **transform_params)
|
26
26
|
return if @already_inlined_svg_ids&.include?(id)
|
27
27
|
record_already_inlined_svg(filename, id)
|
28
|
-
|
28
|
+
inline_svg_tag(filename, id: id, **transform_params)
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
@@ -27,10 +27,9 @@ module Thredded
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def calculate_post_counts
|
30
|
+
relation = self.class.visible_posts_scope(user).where(postable_id: postable_id)
|
30
31
|
unread_posts_count, read_posts_count =
|
31
|
-
self.class.
|
32
|
-
.where(postable_id: postable_id)
|
33
|
-
.pluck(*self.class.post_counts_arel(read_at))[0]
|
32
|
+
Thredded::ArelCompat.pluck(relation, *self.class.post_counts_arel(read_at))[0]
|
34
33
|
{ unread_posts_count: unread_posts_count || 0, read_posts_count: read_posts_count || 0 }
|
35
34
|
end
|
36
35
|
|
@@ -89,9 +88,9 @@ module Thredded
|
|
89
88
|
def calculate_post_counts
|
90
89
|
states = arel_table
|
91
90
|
posts = post_class.arel_table
|
92
|
-
joins(states.join(posts).on(states[:postable_id].eq(posts[:postable_id])).join_sources)
|
91
|
+
relation = joins(states.join(posts).on(states[:postable_id].eq(posts[:postable_id])).join_sources)
|
93
92
|
.group(states[:id])
|
94
|
-
|
93
|
+
Thredded::ArelCompat.pluck(relation, states[:id], *post_counts_arel(states[:read_at], posts: posts))
|
95
94
|
end
|
96
95
|
end
|
97
96
|
end
|
@@ -139,9 +139,11 @@ module Thredded
|
|
139
139
|
.and(read_states[:user_id].eq(user.id))
|
140
140
|
.and(read_states[:unread_posts_count].eq(0))
|
141
141
|
|
142
|
-
joins(:topics).merge(topics_scope).joins(
|
142
|
+
relation = joins(:topics).merge(topics_scope).joins(
|
143
143
|
messageboards.outer_join(read_states).on(read_states_join_cond).join_sources
|
144
|
-
).group(messageboards[:id])
|
144
|
+
).group(messageboards[:id])
|
145
|
+
Thredded::ArelCompat.pluck(
|
146
|
+
relation,
|
145
147
|
:id,
|
146
148
|
Arel::Nodes::Subtraction.new(topics[:id].count, read_states[:id].count)
|
147
149
|
).to_h
|
@@ -27,6 +27,9 @@ module Thredded
|
|
27
27
|
return if !overwrite_newer && state.read_at? && state.read_at >= post.created_at
|
28
28
|
state.read_at = post.created_at
|
29
29
|
state.update!(state.calculate_post_counts)
|
30
|
+
rescue ActiveRecord::RecordNotUnique
|
31
|
+
# The record has been created from another connection, retry to find it.
|
32
|
+
retry
|
30
33
|
end
|
31
34
|
|
32
35
|
# @param [Thredded.user_class] user
|
@@ -31,6 +31,9 @@ module Thredded
|
|
31
31
|
state.messageboard_id = post.messageboard_id
|
32
32
|
state.read_at = post.created_at
|
33
33
|
state.update!(state.calculate_post_counts)
|
34
|
+
rescue ActiveRecord::RecordNotUnique
|
35
|
+
# The record has been created from another connection, retry to find it.
|
36
|
+
retry
|
34
37
|
end
|
35
38
|
|
36
39
|
# @param [Thredded.user_class] user
|
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
<%- if actions_html.present? %>
|
22
22
|
<div class='thredded--post--dropdown'>
|
23
|
-
<%=
|
23
|
+
<%= inline_svg_tag 'thredded/three-dot-menu.svg', class: 'thredded--post--dropdown--toggle' %>
|
24
24
|
<div class='thredded--post--dropdown--actions'>
|
25
25
|
<%= actions_html %>
|
26
26
|
</div>
|
@@ -2,9 +2,9 @@
|
|
2
2
|
<% current = current_page_moderation? %>
|
3
3
|
<li class="thredded--user-navigation--item thredded--user-navigation--moderation<%= ' thredded--is-current' if current %>">
|
4
4
|
<%= link_to current ? nav_back_path : pending_moderation_path, rel: 'nofollow' do %>
|
5
|
-
<%=
|
6
|
-
|
7
|
-
|
5
|
+
<%= inline_svg_tag 'thredded/moderation.svg',
|
6
|
+
class: 'thredded--icon',
|
7
|
+
title: t('thredded.nav.moderation') %>
|
8
8
|
<span class="thredded--nav-text"><%= t 'thredded.nav.moderation' %></span>
|
9
9
|
<% if posts_pending_moderation_count > 0 %>
|
10
10
|
<span class="thredded--user-navigation--moderation--pending-count"><%= posts_pending_moderation_count %></span>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% current = current_page_preferences? %>
|
2
2
|
<li class="thredded--user-navigation--settings thredded--user-navigation--item<%= ' thredded--is-current' if current %>">
|
3
3
|
<%= link_to current ? nav_back_path(messageboard) : edit_preferences_path(messageboard), rel: 'nofollow' do %>
|
4
|
-
<%=
|
4
|
+
<%= inline_svg_tag 'thredded/settings.svg', class: 'thredded--icon', title: t('thredded.nav.settings') %>
|
5
5
|
<span class="thredded--nav-text"><%= t('thredded.nav.settings') %></span>
|
6
6
|
<% end %>
|
7
7
|
</li>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<% current = current_page_private_topics? %>
|
2
2
|
<li class="thredded--user-navigation--item thredded--user-navigation--private-topics<%= ' thredded--is-current' if current %>">
|
3
3
|
<%= link_to current ? nav_back_path : private_topics_path, rel: 'nofollow' do %>
|
4
|
-
<%=
|
5
|
-
|
6
|
-
|
4
|
+
<%= inline_svg_tag 'thredded/private-messages.svg',
|
5
|
+
class: 'thredded--icon',
|
6
|
+
title: t('thredded.nav.private_topics') %>
|
7
7
|
<span class="thredded--nav-text"><%= t('thredded.nav.private_topics') %></span>
|
8
8
|
<% if unread_private_topics_count > 0 -%>
|
9
9
|
<span class="thredded--user-navigation--private-topics--unread"><%= unread_private_topics_count %></span>
|
@@ -20,7 +20,7 @@
|
|
20
20
|
</span>
|
21
21
|
<%= button_to topic.unfollow_path, form: {class: 'thredded--topic-header--follow-info--unfollow'} do %>
|
22
22
|
<%= t('thredded.topics.unfollow') %>
|
23
|
-
<%=
|
23
|
+
<%= inline_svg_tag 'thredded/follow.svg', class: 'thredded--topic-header--follow-icon' %>
|
24
24
|
<% end %>
|
25
25
|
</div>
|
26
26
|
<% else %>
|
data/lib/thredded/arel_compat.rb
CHANGED
@@ -4,28 +4,37 @@ unless Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2 || Rails::VERSIO
|
|
4
4
|
require 'thredded/rails_lt_5_2_arel_case_node.rb'
|
5
5
|
end
|
6
6
|
|
7
|
-
if Rails::VERSION::MAJOR == 4
|
8
|
-
# Make `pluck` compatible with Arel.
|
9
|
-
require 'active_record/relation'
|
10
|
-
ActiveRecord::Relation.prepend(Module.new do
|
11
|
-
def pluck(*column_names)
|
12
|
-
super(*column_names.map do |n|
|
13
|
-
if n.is_a?(Arel::Node)
|
14
|
-
Arel.sql(n.to_sql)
|
15
|
-
elsif n.is_a?(Arel::Attributes::Attribute)
|
16
|
-
n.name
|
17
|
-
else
|
18
|
-
n
|
19
|
-
end
|
20
|
-
end)
|
21
|
-
end
|
22
|
-
end)
|
23
|
-
end
|
24
|
-
|
25
7
|
module Thredded
|
26
8
|
module ArelCompat
|
27
9
|
module_function
|
28
10
|
|
11
|
+
# On Rails >= 5, this method simply returns `relation.pluck(*columns)`.
|
12
|
+
#
|
13
|
+
# Rails 4 `pluck` does not support Arel nodes and attributes. This method does.
|
14
|
+
#
|
15
|
+
# This is an external method because monkey-patching `pluck` would
|
16
|
+
# have compatibility issues, see:
|
17
|
+
#
|
18
|
+
# https://github.com/thredded/thredded/issues/842
|
19
|
+
# https://blog.newrelic.com/engineering/ruby-agent-module-prepend-alias-method-chains/
|
20
|
+
if Rails::VERSION::MAJOR > 4
|
21
|
+
def pluck(relation, *columns)
|
22
|
+
relation.pluck(*columns)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
def pluck(relation, *columns)
|
26
|
+
relation.pluck(*columns.map do |n|
|
27
|
+
if n.is_a?(Arel::Node)
|
28
|
+
Arel.sql(n.to_sql)
|
29
|
+
elsif n.is_a?(Arel::Attributes::Attribute)
|
30
|
+
n.name
|
31
|
+
else
|
32
|
+
n
|
33
|
+
end
|
34
|
+
end)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
29
38
|
# @param [#connection] engine
|
30
39
|
# @param [Arel::Nodes::Node] a integer node
|
31
40
|
# @param [Arel::Nodes::Node] b integer node
|
@@ -39,12 +39,10 @@ module Thredded
|
|
39
39
|
# Regardless, always store the onebox in a file cache to enable offline development,
|
40
40
|
# persistence between test runs, and to improve performance.
|
41
41
|
attr_accessor :onebox_views_cache
|
42
|
-
attr_accessor :onebox_data_cache
|
43
42
|
end
|
44
43
|
|
45
44
|
if Rails.env.development? || Rails.env.test?
|
46
45
|
self.onebox_views_cache = ActiveSupport::Cache::FileStore.new('tmp/cache/onebox-views')
|
47
|
-
self.onebox_data_cache = ActiveSupport::Cache::FileStore.new('tmp/cache/onebox-data')
|
48
46
|
end
|
49
47
|
|
50
48
|
def call
|
@@ -84,8 +82,7 @@ module Thredded
|
|
84
82
|
end
|
85
83
|
|
86
84
|
def onebox_options(_url)
|
87
|
-
{
|
88
|
-
sanitize_config: SANITIZE_CONFIG }
|
85
|
+
{ sanitize_config: SANITIZE_CONFIG }
|
89
86
|
end
|
90
87
|
|
91
88
|
def onebox_views_cache
|
data/lib/thredded/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thredded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Oliveira
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-12-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active_record_union
|
@@ -73,14 +73,14 @@ dependencies:
|
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: 1.6.0
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
83
|
+
version: 1.6.0
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: kaminari
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -208,7 +208,7 @@ dependencies:
|
|
208
208
|
version: '1.8'
|
209
209
|
- - ">="
|
210
210
|
- !ruby/object:Gem::Version
|
211
|
-
version: 1.8.
|
211
|
+
version: 1.8.99
|
212
212
|
type: :runtime
|
213
213
|
prerelease: false
|
214
214
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -218,7 +218,7 @@ dependencies:
|
|
218
218
|
version: '1.8'
|
219
219
|
- - ">="
|
220
220
|
- !ruby/object:Gem::Version
|
221
|
-
version: 1.8.
|
221
|
+
version: 1.8.99
|
222
222
|
- !ruby/object:Gem::Dependency
|
223
223
|
name: rinku
|
224
224
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1037,7 +1037,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1037
1037
|
- !ruby/object:Gem::Version
|
1038
1038
|
version: '0'
|
1039
1039
|
requirements: []
|
1040
|
-
rubygems_version: 3.0.
|
1040
|
+
rubygems_version: 3.0.3
|
1041
1041
|
signing_key:
|
1042
1042
|
specification_version: 4
|
1043
1043
|
summary: The best Rails forums engine ever.
|