thredded 0.15.4 → 0.15.5
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/README.md +1 -1
- data/app/assets/stylesheets/thredded/base/_alerts.scss +1 -0
- data/app/controllers/thredded/application_controller.rb +14 -7
- data/app/controllers/thredded/messageboards_controller.rb +5 -6
- data/app/controllers/thredded/moderation_controller.rb +28 -18
- data/app/controllers/thredded/topics_controller.rb +1 -1
- data/app/forms/thredded/post_form.rb +1 -1
- data/app/forms/thredded/private_post_form.rb +1 -1
- data/app/forms/thredded/private_topic_form.rb +2 -3
- data/app/forms/thredded/topic_form.rb +1 -1
- data/app/helpers/thredded/application_helper.rb +10 -9
- data/app/mailer_previews/thredded/base_mailer_preview.rb +4 -4
- data/app/models/concerns/thredded/content_moderation_state.rb +24 -24
- data/app/models/concerns/thredded/topic_common.rb +1 -1
- data/app/models/concerns/thredded/user_topic_read_state_common.rb +1 -1
- data/app/models/thredded/category.rb +1 -1
- data/app/models/thredded/messageboard.rb +6 -6
- data/app/models/thredded/messageboard_user.rb +4 -1
- data/app/models/thredded/post.rb +4 -2
- data/app/models/thredded/post_moderation_record.rb +3 -9
- data/app/models/thredded/private_topic.rb +6 -5
- data/app/models/thredded/topic.rb +6 -4
- data/app/models/thredded/topic_category.rb +2 -2
- data/app/models/thredded/user_detail.rb +12 -6
- data/app/models/thredded/user_extender.rb +22 -22
- data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +7 -0
- data/app/models/thredded/user_permissions/moderate/none.rb +6 -0
- data/app/models/thredded/user_permissions/read/all.rb +7 -0
- data/app/models/thredded/user_preference.rb +9 -9
- data/app/policies/thredded/messageboard_policy.rb +8 -3
- data/app/views/thredded/messageboards/_form.html.erb +3 -2
- data/app/views/thredded/messageboards/new.html.erb +1 -1
- data/app/views/thredded/private_topics/_form.html.erb +1 -1
- data/app/views/thredded/private_topics/edit.html.erb +1 -1
- data/app/views/thredded/shared/_field_errors.html.erb +5 -3
- data/app/views/thredded/shared/nav/_moderation.html.erb +1 -1
- data/app/views/thredded/topics/_form.html.erb +1 -1
- data/app/views/thredded/topics/edit.html.erb +1 -1
- data/bin/rails +2 -2
- data/config/locales/ru.yml +1 -1
- data/lib/generators/thredded/install/install_generator.rb +2 -2
- data/lib/generators/thredded/install/templates/initializer.rb +3 -0
- data/lib/thredded.rb +15 -2
- data/lib/thredded/base_notifier.rb +1 -3
- data/lib/thredded/database_seeder.rb +2 -5
- data/lib/thredded/engine.rb +1 -3
- data/lib/thredded/rails_lt_5_2_arel_case_node.rb +4 -4
- data/lib/thredded/version.rb +1 -1
- metadata +86 -72
@@ -8,7 +8,10 @@ module Thredded
|
|
8
8
|
class_name: 'Thredded::Messageboard',
|
9
9
|
foreign_key: :thredded_messageboard_id,
|
10
10
|
inverse_of: :messageboard_users
|
11
|
-
belongs_to :user_detail,
|
11
|
+
belongs_to :user_detail,
|
12
|
+
class_name: 'Thredded::UserDetail',
|
13
|
+
foreign_key: :thredded_user_detail_id,
|
14
|
+
inverse_of: :messageboard_users
|
12
15
|
scope :recently_active, -> { where(arel_table[:last_seen_at].gt(Thredded.active_user_threshold.ago)) }
|
13
16
|
end
|
14
17
|
end
|
data/app/models/thredded/post.rb
CHANGED
@@ -10,7 +10,8 @@ module Thredded
|
|
10
10
|
inverse_of: :thredded_posts,
|
11
11
|
**(Thredded.rails_gte_51? ? { optional: true } : {})
|
12
12
|
belongs_to :messageboard,
|
13
|
-
counter_cache: true
|
13
|
+
counter_cache: true,
|
14
|
+
inverse_of: :posts
|
14
15
|
belongs_to :postable,
|
15
16
|
class_name: 'Thredded::Topic',
|
16
17
|
inverse_of: :posts,
|
@@ -27,7 +28,8 @@ module Thredded
|
|
27
28
|
has_many :user_notifications,
|
28
29
|
class_name: 'Thredded::UserPostNotification',
|
29
30
|
dependent: :destroy
|
30
|
-
has_one :last_moderation_record,
|
31
|
+
has_one :last_moderation_record, # rubocop:disable Rails/InverseOf
|
32
|
+
-> { order_newest_first },
|
31
33
|
class_name: 'Thredded::PostModerationRecord'
|
32
34
|
|
33
35
|
validates :messageboard_id, presence: true
|
@@ -4,9 +4,7 @@ module Thredded
|
|
4
4
|
class PostModerationRecord < ActiveRecord::Base
|
5
5
|
include Thredded::ModerationState
|
6
6
|
# Rails 4 doesn't support enum _prefix
|
7
|
-
if Rails::VERSION::MAJOR >= 5
|
8
|
-
enum previous_moderation_state: moderation_states, _prefix: :previous
|
9
|
-
end
|
7
|
+
enum previous_moderation_state: moderation_states, _prefix: :previous if Rails::VERSION::MAJOR >= 5
|
10
8
|
validates :previous_moderation_state, presence: true
|
11
9
|
|
12
10
|
scope :order_newest_first, -> { order(created_at: :desc, id: :desc) }
|
@@ -26,9 +24,7 @@ module Thredded
|
|
26
24
|
**(Thredded.rails_gte_51? ? { optional: true } : {})
|
27
25
|
|
28
26
|
validates_each :moderation_state do |record, attr, value|
|
29
|
-
if record.previous_moderation_state == value
|
30
|
-
record.errors.add attr, "Post moderation_state is already #{value}"
|
31
|
-
end
|
27
|
+
record.errors.add attr, "Post moderation_state is already #{value}" if record.previous_moderation_state == value
|
32
28
|
end
|
33
29
|
|
34
30
|
paginates_per Thredded.posts_per_page
|
@@ -40,9 +36,7 @@ module Thredded
|
|
40
36
|
# @return [Thredded::PostModerationRecord] the newly created persisted record
|
41
37
|
def self.record!(moderator:, post:, previous_moderation_state:, moderation_state:)
|
42
38
|
# Rails 4 doesn't support enum _prefix
|
43
|
-
if Rails::VERSION::MAJOR < 5
|
44
|
-
previous_moderation_state = moderation_states[previous_moderation_state.to_s]
|
45
|
-
end
|
39
|
+
previous_moderation_state = moderation_states[previous_moderation_state.to_s] if Rails::VERSION::MAJOR < 5
|
46
40
|
create!(
|
47
41
|
previous_moderation_state: previous_moderation_state,
|
48
42
|
moderation_state: moderation_state,
|
@@ -27,10 +27,13 @@ module Thredded
|
|
27
27
|
foreign_key: :postable_id,
|
28
28
|
inverse_of: :postable,
|
29
29
|
dependent: :destroy
|
30
|
-
has_one :first_post,
|
30
|
+
has_one :first_post, # rubocop:disable Rails/InverseOf
|
31
|
+
-> { order_oldest_first },
|
31
32
|
class_name: 'Thredded::PrivatePost',
|
32
33
|
foreign_key: :postable_id
|
33
|
-
has_many :private_users,
|
34
|
+
has_many :private_users,
|
35
|
+
inverse_of: :private_topic,
|
36
|
+
dependent: :delete_all
|
34
37
|
has_many :users, through: :private_users
|
35
38
|
has_many :user_read_states,
|
36
39
|
class_name: 'Thredded::UserPrivateTopicReadState',
|
@@ -54,9 +57,7 @@ module Thredded
|
|
54
57
|
|
55
58
|
validates_each :users do |model, _attr, users|
|
56
59
|
# Must include the creator + at least one other user
|
57
|
-
if users.length < 2
|
58
|
-
model.errors.add(:user_ids, I18n.t('thredded.private_topics.errors.user_ids_length'))
|
59
|
-
end
|
60
|
+
model.errors.add(:user_ids, I18n.t('thredded.private_topics.errors.user_ids_length')) if users.length < 2
|
60
61
|
unless users.include?(model.user)
|
61
62
|
# This never happens in the UI, so we don't need to i18n the message.
|
62
63
|
model.errors.add(:user_ids, 'must include in user_ids')
|
@@ -58,14 +58,16 @@ module Thredded
|
|
58
58
|
foreign_key: :postable_id,
|
59
59
|
inverse_of: :postable,
|
60
60
|
dependent: :destroy
|
61
|
-
has_one :first_post,
|
62
|
-
|
61
|
+
has_one :first_post, # rubocop:disable Rails/InverseOf
|
62
|
+
-> { order_oldest_first },
|
63
|
+
class_name: 'Thredded::Post',
|
63
64
|
foreign_key: :postable_id
|
64
|
-
has_one :last_post,
|
65
|
+
has_one :last_post, # rubocop:disable Rails/InverseOf
|
66
|
+
-> { order_newest_first },
|
65
67
|
class_name: 'Thredded::Post',
|
66
68
|
foreign_key: :postable_id
|
67
69
|
|
68
|
-
has_many :topic_categories, dependent: :
|
70
|
+
has_many :topic_categories, inverse_of: :topic, dependent: :delete_all
|
69
71
|
has_many :categories, through: :topic_categories
|
70
72
|
has_many :user_read_states,
|
71
73
|
class_name: 'Thredded::UserTopicReadState',
|
@@ -7,12 +7,18 @@ module Thredded
|
|
7
7
|
belongs_to :user, class_name: Thredded.user_class_name, inverse_of: :thredded_user_detail
|
8
8
|
validates :user_id, uniqueness: true, **(Thredded.rails_gte_51? ? {} : { presence: true })
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
with_options foreign_key: :user_id, primary_key: :user_id, inverse_of: :user_detail, dependent: :nullify do
|
11
|
+
has_many :topics, class_name: 'Thredded::Topic'
|
12
|
+
has_many :private_topics, class_name: 'Thredded::PrivateTopic'
|
13
|
+
has_many :posts, class_name: 'Thredded::Post'
|
14
|
+
has_many :private_posts, class_name: 'Thredded::PrivatePost'
|
15
|
+
end
|
16
|
+
|
17
|
+
has_many :messageboard_users,
|
18
|
+
class_name: 'Thredded::MessageboardUser',
|
19
|
+
foreign_key: :thredded_user_detail_id,
|
20
|
+
inverse_of: :user_detail,
|
21
|
+
dependent: :delete_all
|
16
22
|
|
17
23
|
scope :recently_active, -> { where(arel_table[:last_seen_at].gt(Thredded.active_user_threshold.ago)) }
|
18
24
|
|
@@ -11,29 +11,29 @@ module Thredded
|
|
11
11
|
include ::Thredded::UserPermissions::Admin::IfAdminColumnTrue
|
12
12
|
|
13
13
|
included do # rubocop:disable Metrics/BlockLength
|
14
|
-
with_options dependent: :nullify, foreign_key: 'user_id', inverse_of: :user do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
with_options dependent: :nullify, foreign_key: 'user_id', inverse_of: :user do
|
15
|
+
has_many :thredded_posts, class_name: 'Thredded::Post'
|
16
|
+
has_many :thredded_topics, class_name: 'Thredded::Topic'
|
17
|
+
has_many :thredded_private_posts, class_name: 'Thredded::PrivatePost'
|
18
|
+
has_many :thredded_started_private_topics, class_name: 'Thredded::PrivateTopic'
|
19
19
|
end
|
20
20
|
|
21
|
-
with_options dependent: :nullify, foreign_key: 'last_user_id', inverse_of: :last_user do
|
22
|
-
|
23
|
-
|
21
|
+
with_options dependent: :nullify, foreign_key: 'last_user_id', inverse_of: :last_user do
|
22
|
+
has_many :thredded_last_user_topics, class_name: 'Thredded::Topic'
|
23
|
+
has_many :thredded_last_user_private_topics, class_name: 'Thredded::PrivateTopic'
|
24
24
|
end
|
25
25
|
|
26
|
-
with_options dependent: :destroy, foreign_key: 'user_id', inverse_of: :user do
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
26
|
+
with_options dependent: :destroy, foreign_key: 'user_id', inverse_of: :user do
|
27
|
+
has_many :thredded_user_messageboard_preferences, class_name: 'Thredded::UserMessageboardPreference'
|
28
|
+
has_many :thredded_notifications_for_followed_topics, class_name: 'Thredded::NotificationsForFollowedTopics'
|
29
|
+
has_many :thredded_notifications_for_private_topics, class_name: 'Thredded::NotificationsForPrivateTopics'
|
30
|
+
has_many :thredded_post_notifications, class_name: 'Thredded::UserPostNotification'
|
31
|
+
has_many :thredded_private_users, class_name: 'Thredded::PrivateUser'
|
32
|
+
has_many :thredded_topic_read_states, class_name: 'Thredded::UserTopicReadState'
|
33
|
+
has_many :thredded_private_topic_read_states, class_name: 'Thredded::UserPrivateTopicReadState'
|
34
|
+
has_many :thredded_topic_follows, class_name: 'Thredded::UserTopicFollow'
|
35
|
+
has_one :thredded_user_detail, class_name: 'Thredded::UserDetail'
|
36
|
+
has_one :thredded_user_preference, class_name: 'Thredded::UserPreference'
|
37
37
|
end
|
38
38
|
|
39
39
|
has_many :thredded_private_topics,
|
@@ -41,9 +41,9 @@ module Thredded
|
|
41
41
|
class_name: 'Thredded::PrivateTopic',
|
42
42
|
source: :private_topic
|
43
43
|
|
44
|
-
with_options dependent: :nullify, class_name: 'Thredded::PostModerationRecord' do
|
45
|
-
|
46
|
-
|
44
|
+
with_options dependent: :nullify, class_name: 'Thredded::PostModerationRecord' do
|
45
|
+
has_many :thredded_post_moderation_records, foreign_key: 'post_user_id', inverse_of: :post_user
|
46
|
+
has_many :thredded_post_moderated_records, foreign_key: 'moderator_id', inverse_of: :moderator
|
47
47
|
end
|
48
48
|
|
49
49
|
scope :left_join_thredded_user_details, -> {
|
@@ -10,6 +10,13 @@ module Thredded
|
|
10
10
|
def thredded_can_moderate_messageboards
|
11
11
|
send(Thredded.moderator_column) ? Thredded::Messageboard.all : Thredded::Messageboard.none
|
12
12
|
end
|
13
|
+
|
14
|
+
# @param [Thredded::Messageboard] messageboard
|
15
|
+
# @return [Boolean] Whether the user can moderate the given messageboard.
|
16
|
+
def thredded_can_moderate_messageboard?(messageboard)
|
17
|
+
scope = thredded_can_moderate_messageboards
|
18
|
+
scope == Thredded::Messageboard.all || scope.include?(messageboard)
|
19
|
+
end
|
13
20
|
end
|
14
21
|
end
|
15
22
|
end
|
@@ -10,6 +10,12 @@ module Thredded
|
|
10
10
|
def thredded_can_moderate_messageboards
|
11
11
|
Thredded::Messageboard.none
|
12
12
|
end
|
13
|
+
|
14
|
+
# @param [Thredded::Messageboard] messageboard
|
15
|
+
# @return [false] Whether the user can moderate the given messageboard.
|
16
|
+
def thredded_can_moderate_messageboard?(messageboard) # rubocop:disable Lint/UnusedMethodArgument
|
17
|
+
false
|
18
|
+
end
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
@@ -12,6 +12,13 @@ module Thredded
|
|
12
12
|
Thredded::Messageboard.all
|
13
13
|
end
|
14
14
|
|
15
|
+
# @param [Thredded::Messageboard] messageboard
|
16
|
+
# @return [Boolean] Whether the user can read the given messageboard.
|
17
|
+
def thredded_can_read_messageboard?(messageboard)
|
18
|
+
scope = thredded_can_read_messageboards
|
19
|
+
scope == Thredded::Messageboard.all || scope.include?(messageboard)
|
20
|
+
end
|
21
|
+
|
15
22
|
module ClassMethods
|
16
23
|
# Users that can read some of the given messageboards.
|
17
24
|
#
|
@@ -5,15 +5,15 @@ module Thredded
|
|
5
5
|
belongs_to :user, class_name: Thredded.user_class_name, inverse_of: :thredded_user_preference
|
6
6
|
|
7
7
|
with_options(inverse_of: :user_preference, primary_key: :user_id, foreign_key: :user_id,
|
8
|
-
dependent: :destroy) do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
dependent: :destroy) do
|
9
|
+
has_many :messageboard_preferences,
|
10
|
+
class_name: 'Thredded::UserMessageboardPreference'
|
11
|
+
has_many :messageboard_notifications_for_followed_topics,
|
12
|
+
class_name: 'Thredded::MessageboardNotificationsForFollowedTopics'
|
13
|
+
has_many :notifications_for_followed_topics,
|
14
|
+
class_name: 'Thredded::NotificationsForFollowedTopics'
|
15
|
+
has_many :notifications_for_private_topics,
|
16
|
+
class_name: 'Thredded::NotificationsForPrivateTopics'
|
17
17
|
end
|
18
18
|
validates :user_id, presence: true
|
19
19
|
|
@@ -13,7 +13,12 @@ module Thredded
|
|
13
13
|
|
14
14
|
# @return [ActiveRecord::Relation<Thredded::Messageboards>]
|
15
15
|
def resolve
|
16
|
-
@
|
16
|
+
readable = @user.thredded_can_read_messageboards
|
17
|
+
if readable == Thredded::Messageboard.all
|
18
|
+
@scope
|
19
|
+
else
|
20
|
+
@scope.merge(readable)
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -29,7 +34,7 @@ module Thredded
|
|
29
34
|
end
|
30
35
|
|
31
36
|
def read?
|
32
|
-
@user.thredded_admin? || @user.
|
37
|
+
@user.thredded_admin? || @user.thredded_can_read_messageboard?(@messageboard)
|
33
38
|
end
|
34
39
|
|
35
40
|
def update?
|
@@ -43,7 +48,7 @@ module Thredded
|
|
43
48
|
end
|
44
49
|
|
45
50
|
def moderate?
|
46
|
-
@user.thredded_admin? || @user.
|
51
|
+
@user.thredded_admin? || @user.thredded_can_moderate_messageboard?(@messageboard)
|
47
52
|
end
|
48
53
|
end
|
49
54
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
<li>
|
4
4
|
<%= f.label t('thredded.messageboard.form.title_label') %>
|
5
5
|
<%= f.text_field :name, required: true %>
|
6
|
+
<%= render 'thredded/shared/field_errors', messages: f.object.errors[:name] %>
|
6
7
|
</li>
|
7
8
|
<li>
|
8
9
|
<%= f.label t('thredded.messageboard.form.description_label') %>
|
@@ -20,9 +21,9 @@
|
|
20
21
|
</li>
|
21
22
|
|
22
23
|
<li>
|
23
|
-
<%= f.submit
|
24
|
+
<%= f.submit messageboard.persisted? ? t('thredded.messageboard.update') : t('thredded.messageboard.create'),
|
24
25
|
class: 'thredded--form--submit',
|
25
|
-
'data-disable-with' =>
|
26
|
+
'data-disable-with' => messageboard.persisted? ?
|
26
27
|
t('thredded.messageboard.form.update_btn_submitting') :
|
27
28
|
t('thredded.messageboard.form.create_btn_submitting') %>
|
28
29
|
</li>
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<li class="title">
|
14
14
|
<%= form.label :title, t('thredded.private_topics.form.title_label') %>
|
15
15
|
<%= form.text_field :title, placeholder: placeholder, required: true, autocomplete: 'off' %>
|
16
|
-
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title]
|
16
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] %>
|
17
17
|
</li>
|
18
18
|
<li>
|
19
19
|
<%= form.label :user_names, t('thredded.private_topics.form.users_label') %>
|
@@ -22,7 +22,7 @@
|
|
22
22
|
placeholder: t('thredded.private_topics.form.title_placeholder_new'),
|
23
23
|
autofocus: true,
|
24
24
|
required: true %>
|
25
|
-
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title]
|
25
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] %>
|
26
26
|
</li>
|
27
27
|
<li>
|
28
28
|
<button type="submit" class="thredded--form--submit"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if
|
1
|
+
<% if thredded_moderator? %>
|
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 %>
|
@@ -11,7 +11,7 @@
|
|
11
11
|
<li class="title">
|
12
12
|
<%= form.label :title, t('thredded.topics.form.title_label') %>
|
13
13
|
<%= form.text_field :title, placeholder: placeholder, required: true, autocomplete: 'off' %>
|
14
|
-
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title]
|
14
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] %>
|
15
15
|
</li>
|
16
16
|
|
17
17
|
<% if form.object.category_options.any? %>
|
@@ -22,7 +22,7 @@
|
|
22
22
|
placeholder: t('thredded.topics.form.title_placeholder'),
|
23
23
|
autofocus: true,
|
24
24
|
required: true %>
|
25
|
-
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title]
|
25
|
+
<%= render 'thredded/shared/field_errors', messages: form.object.errors[:title] %>
|
26
26
|
</li>
|
27
27
|
|
28
28
|
<% if form.object.category_options.any? %>
|
data/bin/rails
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
APP_PATH = File.expand_path('
|
5
|
-
require File.expand_path('
|
4
|
+
APP_PATH = File.expand_path('../spec/dummy/config/application', __dir__)
|
5
|
+
require File.expand_path('../spec/dummy/config/boot', __dir__)
|
6
6
|
require 'rails/commands'
|
data/config/locales/ru.yml
CHANGED
@@ -250,7 +250,7 @@ ru:
|
|
250
250
|
users:
|
251
251
|
currently_online: Онлайн
|
252
252
|
last_active_html: Последняя активность %{time_ago}
|
253
|
-
posted_in_topic_html:
|
253
|
+
posted_in_topic_html: Написал в %{topic_link}
|
254
254
|
posts_count:
|
255
255
|
few: Сделано %{count} поста
|
256
256
|
many: Сделано %{count} постов
|
@@ -5,8 +5,8 @@ module Thredded
|
|
5
5
|
class InstallGenerator < Rails::Generators::Base
|
6
6
|
def set_source_paths
|
7
7
|
@source_paths = [
|
8
|
-
File.expand_path('
|
9
|
-
File.expand_path('
|
8
|
+
File.expand_path('templates', __dir__),
|
9
|
+
File.expand_path('../../../..', __dir__),
|
10
10
|
]
|
11
11
|
end
|
12
12
|
|
@@ -84,6 +84,9 @@ Thredded.layout = 'thredded/application'
|
|
84
84
|
# Thredded.parent_mailer = 'ActionMailer::Base'
|
85
85
|
|
86
86
|
# ==> Model configuration
|
87
|
+
# The range of valid messageboard name lengths. Default:
|
88
|
+
# Thredded.messageboard_name_length_range = (1..60)
|
89
|
+
#
|
87
90
|
# The range of valid topic title lengths. Default:
|
88
91
|
# Thredded.topic_title_length_range = (1..200)
|
89
92
|
|
data/lib/thredded.rb
CHANGED
@@ -44,7 +44,16 @@ require 'thredded/base_notifier'
|
|
44
44
|
require 'thredded/arel_compat'
|
45
45
|
require 'thredded/collection_to_strings_with_cache_renderer'
|
46
46
|
|
47
|
-
|
47
|
+
if Rails::VERSION::MAJOR < 5
|
48
|
+
begin
|
49
|
+
require 'where-or'
|
50
|
+
rescue LoadError
|
51
|
+
$stderr.puts "\nthredded: Please add gem 'where-or' to your Gemfile"
|
52
|
+
exit 1 # rubocop:disable Rails/Exit
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module Thredded # rubocop:disable Metrics/ModuleLength
|
48
57
|
class << self
|
49
58
|
#== User
|
50
59
|
|
@@ -110,7 +119,7 @@ module Thredded
|
|
110
119
|
# :last_post_at_desc most recent post first
|
111
120
|
# :topics_count_desc most topics first
|
112
121
|
# @return [:position, :last_post_at_desc, :topics_count_desc]
|
113
|
-
|
122
|
+
attr_reader :messageboards_order
|
114
123
|
|
115
124
|
# @return [Number] The number of topics to display per page.
|
116
125
|
attr_accessor :topics_per_page
|
@@ -157,6 +166,9 @@ module Thredded
|
|
157
166
|
|
158
167
|
#== Misc
|
159
168
|
|
169
|
+
# @return [Range<Integer>] The range of valid messageboard name lengths.
|
170
|
+
attr_accessor :messageboard_name_length_range
|
171
|
+
|
160
172
|
# @return [Range<Integer>] The range of valid topic title lengths.
|
161
173
|
attr_accessor :topic_title_length_range
|
162
174
|
|
@@ -267,5 +279,6 @@ module Thredded
|
|
267
279
|
self.slugifier = ->(input) { input.parameterize }
|
268
280
|
self.routes_id_constraint = /[1-9]\d*/
|
269
281
|
|
282
|
+
self.messageboard_name_length_range = (1..60)
|
270
283
|
self.topic_title_length_range = (1..200)
|
271
284
|
end
|