thredded 0.8.4 → 0.9.1
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 +48 -9
- data/app/assets/images/thredded/breadcrumb-chevron.svg +1 -1
- data/app/assets/images/thredded/follow.svg +1 -1
- data/app/assets/images/thredded/moderation.svg +1 -4
- data/app/assets/images/thredded/private-messages.svg +1 -4
- data/app/assets/images/thredded/settings.svg +1 -4
- data/app/assets/images/thredded/unfollow.svg +1 -1
- data/app/assets/javascripts/thredded/components/time_stamps.es6 +1 -1
- data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +26 -49
- data/app/assets/javascripts/thredded/dependencies.js +2 -1
- data/app/assets/stylesheets/thredded/base/_grid.scss +4 -4
- data/app/assets/stylesheets/thredded/base/_typography.scss +18 -0
- data/app/assets/stylesheets/thredded/components/_base.scss +4 -0
- data/app/assets/stylesheets/thredded/components/_currently-online.scss +4 -0
- data/app/assets/stylesheets/thredded/components/_form-list.scss +5 -0
- data/app/assets/stylesheets/thredded/components/_messageboard.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_post-form.scss +7 -4
- data/app/assets/stylesheets/thredded/components/_post.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_topic-delete.scss +3 -0
- data/app/assets/stylesheets/thredded/components/_topic-header.scss +20 -0
- data/app/assets/stylesheets/thredded/components/_topics.scss +13 -1
- data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +1 -1
- data/app/assets/stylesheets/thredded/layout/_navigation.scss +3 -1
- data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +4 -0
- data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +3 -0
- data/app/commands/thredded/at_notification_extractor.rb +1 -2
- data/app/commands/thredded/autofollow_mentioned_users.rb +0 -1
- data/app/commands/thredded/notify_following_users.rb +20 -11
- data/app/commands/thredded/notify_private_topic_users.rb +12 -28
- data/app/controllers/thredded/application_controller.rb +8 -4
- data/app/controllers/thredded/messageboards_controller.rb +2 -2
- data/app/controllers/thredded/moderation_controller.rb +12 -13
- data/app/controllers/thredded/posts_controller.rb +1 -1
- data/app/controllers/thredded/preferences_controller.rb +11 -7
- data/app/controllers/thredded/private_topics_controller.rb +13 -9
- data/app/controllers/thredded/topics_controller.rb +20 -12
- data/app/forms/thredded/user_preferences_form.rb +23 -4
- data/app/helpers/thredded/application_helper.rb +11 -1
- data/app/mailers/thredded/post_mailer.rb +2 -3
- data/app/mailers/thredded/private_topic_mailer.rb +2 -3
- data/app/models/concerns/thredded/content_moderation_state.rb +1 -1
- data/app/models/concerns/thredded/notifier_preference.rb +18 -0
- data/app/models/concerns/thredded/post_common.rb +5 -1
- data/{lib → app/models/concerns}/thredded/search_parser.rb +0 -0
- data/app/models/concerns/thredded/topic_common.rb +3 -3
- data/{lib → app/models/concerns}/thredded/topics_search.rb +2 -3
- data/app/models/thredded/messageboard.rb +11 -0
- data/app/models/thredded/messageboard_notifications_for_followed_topics.rb +29 -0
- data/app/models/thredded/notifications_for_followed_topics.rb +22 -0
- data/app/models/thredded/notifications_for_private_topics.rb +21 -0
- data/app/models/thredded/post.rb +5 -3
- data/app/models/thredded/post_moderation_record.rb +1 -1
- data/app/models/thredded/private_post.rb +1 -1
- data/app/models/thredded/private_topic.rb +8 -4
- data/app/models/thredded/stats.rb +1 -1
- data/app/models/thredded/topic.rb +10 -7
- data/app/models/thredded/user_detail.rb +1 -1
- data/app/models/thredded/user_extender.rb +3 -1
- data/app/models/thredded/user_preference.rb +16 -5
- data/app/models/thredded/user_private_topic_read_state.rb +1 -1
- data/app/models/thredded/user_topic_read_state.rb +1 -1
- data/app/notifiers/thredded/base_notifier.rb +28 -0
- data/app/notifiers/thredded/email_notifier.rb +34 -0
- data/app/policies/thredded/post_policy.rb +3 -4
- data/app/policies/thredded/private_post_policy.rb +2 -3
- data/app/policies/thredded/topic_policy.rb +1 -2
- data/app/view_hooks/thredded/all_view_hooks.rb +0 -3
- data/app/view_models/thredded/base_topic_view.rb +0 -1
- data/app/view_models/thredded/post_view.rb +0 -1
- data/app/view_models/thredded/posts_page_view.rb +1 -4
- data/app/view_models/thredded/private_topic_view.rb +3 -1
- data/app/view_models/thredded/private_topics_page_view.rb +8 -3
- data/app/view_models/thredded/topic_posts_page_view.rb +1 -2
- data/app/view_models/thredded/topic_view.rb +3 -3
- data/app/view_models/thredded/topics_page_view.rb +0 -1
- data/app/views/thredded/messageboard_groups/new.html.erb +5 -1
- data/app/views/thredded/messageboards/_form.html.erb +7 -2
- data/app/views/thredded/posts/_form.html.erb +2 -1
- data/app/views/thredded/posts/edit.html.erb +3 -2
- data/app/views/thredded/posts_common/_form.html.erb +6 -2
- data/app/views/thredded/preferences/_form.html.erb +41 -29
- data/app/views/thredded/private_posts/_form.html.erb +1 -0
- data/app/views/thredded/private_topics/_form.html.erb +3 -2
- data/app/views/thredded/private_topics/_header.html.erb +4 -0
- data/app/views/thredded/private_topics/_no_private_topics.html.erb +1 -1
- data/app/views/thredded/private_topics/_private_topic.html.erb +5 -2
- data/app/views/thredded/private_topics/edit.html.erb +2 -1
- data/app/views/thredded/private_topics/header/_participant.html.erb +1 -0
- data/app/views/thredded/private_topics/index.html.erb +6 -5
- data/app/views/thredded/private_topics/new.html.erb +0 -1
- data/app/views/thredded/private_topics/private_topic/_participant.html.erb +1 -0
- data/app/views/thredded/private_topics/show.html.erb +1 -3
- data/app/views/thredded/topics/_form.html.erb +1 -1
- data/app/views/thredded/topics/show.html.erb +4 -5
- data/config/locales/en.yml +22 -9
- data/config/locales/pt-BR.yml +22 -10
- data/config/routes.rb +1 -1
- data/db/migrate/20160329231848_create_thredded.rb +23 -3
- data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +1 -1
- data/db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb +56 -0
- data/lib/generators/thredded/install/templates/initializer.rb +28 -0
- data/lib/thredded.rb +32 -8
- data/lib/thredded/content_formatter.rb +3 -2
- data/lib/thredded/database_seeder.rb +11 -8
- data/lib/thredded/db_tools.rb +82 -0
- data/lib/thredded/html_pipeline/wrap_iframes_filter.rb +12 -0
- data/lib/thredded/version.rb +1 -1
- metadata +18 -8
- data/app/models/thredded/null_preference.rb +0 -16
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require 'thredded/html_pipeline/at_mention_filter'
|
|
3
2
|
module Thredded
|
|
4
3
|
class AtNotificationExtractor
|
|
5
4
|
def initialize(post)
|
|
@@ -16,7 +15,7 @@ module Thredded
|
|
|
16
15
|
Thredded::HtmlPipeline::AtMentionFilter.new(
|
|
17
16
|
html,
|
|
18
17
|
view_context: view_context,
|
|
19
|
-
users_provider: ->
|
|
18
|
+
users_provider: ->(user_names) { @post.readers_from_user_names(user_names).to_a }
|
|
20
19
|
).mentioned_users
|
|
21
20
|
end
|
|
22
21
|
end
|
|
@@ -6,23 +6,32 @@ module Thredded
|
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def run
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
Thredded.notifiers.each do |notifier|
|
|
10
|
+
notifiable_users = targeted_users(notifier)
|
|
11
|
+
notifier.new_post(@post, notifiable_users) if notifiable_users.present?
|
|
12
|
+
end
|
|
12
13
|
end
|
|
13
14
|
|
|
14
|
-
def targeted_users
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
def targeted_users(notifier)
|
|
16
|
+
possible_targeted_users.select do |user|
|
|
17
|
+
NotificationsForFollowedTopics
|
|
18
|
+
.detect_or_default(user.thredded_notifications_for_followed_topics, notifier).enabled? &&
|
|
19
|
+
MessageboardNotificationsForFollowedTopics
|
|
20
|
+
.detect_or_default(messageboard_notifier_prefs_by_user_id[user.id], notifier).enabled?
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def possible_targeted_users
|
|
25
|
+
@possible_targeted_users ||=
|
|
26
|
+
@post.postable.followers.includes(:thredded_notifications_for_followed_topics).reject { |u| u == @post.user }
|
|
17
27
|
end
|
|
18
28
|
|
|
19
29
|
private
|
|
20
30
|
|
|
21
|
-
def
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
end
|
|
31
|
+
def messageboard_notifier_prefs_by_user_id
|
|
32
|
+
@messageboard_notifier_prefs_by_user_id ||= MessageboardNotificationsForFollowedTopics
|
|
33
|
+
.where(user_id: possible_targeted_users.map(&:id))
|
|
34
|
+
.for_messageboard(@post.messageboard).group_by(&:user_id)
|
|
26
35
|
end
|
|
27
36
|
end
|
|
28
37
|
end
|
|
@@ -7,42 +7,26 @@ module Thredded
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def run
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
PrivateTopicMailer
|
|
15
|
-
.message_notification(private_topic.id, user_emails)
|
|
16
|
-
.deliver_later
|
|
17
|
-
mark_notified(members)
|
|
10
|
+
Thredded.notifiers.each do |notifier|
|
|
11
|
+
notifiable_users = targeted_users(notifier)
|
|
12
|
+
notifier.new_private_post(@post, notifiable_users) if notifiable_users.present?
|
|
13
|
+
end
|
|
18
14
|
end
|
|
19
15
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
members
|
|
16
|
+
def targeted_users(notifier)
|
|
17
|
+
users = private_topic.users.includes(:thredded_notifications_for_private_topics) - [post.user]
|
|
18
|
+
users = only_those_with_this_notifier_enabled(users, notifier)
|
|
19
|
+
users
|
|
25
20
|
end
|
|
26
21
|
|
|
27
22
|
private
|
|
28
23
|
|
|
29
24
|
attr_reader :post, :private_topic
|
|
30
25
|
|
|
31
|
-
def
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def exclude_those_opting_out_of_message_notifications(members)
|
|
38
|
-
members.select { |member| member.thredded_user_preference.notify_on_message? }
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def exclude_previously_notified(members)
|
|
42
|
-
emails_notified = post.post_notifications.map(&:email)
|
|
43
|
-
|
|
44
|
-
members.reject do |member|
|
|
45
|
-
emails_notified.include? member.email
|
|
26
|
+
def only_those_with_this_notifier_enabled(users, notifier)
|
|
27
|
+
users.select do |user|
|
|
28
|
+
NotificationsForPrivateTopics
|
|
29
|
+
.detect_or_default(user.thredded_notifications_for_private_topics, notifier).enabled?
|
|
46
30
|
end
|
|
47
31
|
end
|
|
48
32
|
end
|
|
@@ -76,7 +76,7 @@ module Thredded
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def update_user_activity
|
|
79
|
-
return if
|
|
79
|
+
return if !messageboard_or_nil || !signed_in?
|
|
80
80
|
|
|
81
81
|
Thredded::ActivityUpdaterJob.perform_later(
|
|
82
82
|
thredded_current_user.id,
|
|
@@ -88,10 +88,14 @@ module Thredded
|
|
|
88
88
|
thredded_current_user
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
+
# Returns the `@messageboard` instance variable.
|
|
92
|
+
# If `@messageboard` is not set, it first sets it to the messageboard with the slug or ID given by
|
|
93
|
+
# `params[:messageboard_id]`.
|
|
94
|
+
#
|
|
95
|
+
# @return [Thredded::Messageboard]
|
|
96
|
+
# @raise [Thredded::Errors::MessageboardNotFound] if the messageboard with the given slug does not exist.
|
|
91
97
|
def messageboard
|
|
92
|
-
@messageboard ||=
|
|
93
|
-
rescue ActiveRecord::RecordNotFound
|
|
94
|
-
raise Thredded::Errors::MessageboardNotFound
|
|
98
|
+
@messageboard ||= Messageboard.friendly_find!(params[:messageboard_id])
|
|
95
99
|
end
|
|
96
100
|
|
|
97
101
|
def messageboard_or_nil
|
|
@@ -27,12 +27,12 @@ module Thredded
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def edit
|
|
30
|
-
@messageboard = Messageboard.
|
|
30
|
+
@messageboard = Messageboard.friendly_find!(params[:id])
|
|
31
31
|
authorize @messageboard, :update?
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def update
|
|
35
|
-
@messageboard = Messageboard.
|
|
35
|
+
@messageboard = Messageboard.friendly_find!(params[:id])
|
|
36
36
|
authorize @messageboard, :update?
|
|
37
37
|
if @messageboard.update(messageboard_params)
|
|
38
38
|
redirect_to messageboard_topics_path(@messageboard), notice: I18n.t('thredded.messageboard.updated_notice')
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require_dependency 'thredded/moderate_post'
|
|
3
|
-
require_dependency 'thredded/posts_page_view'
|
|
4
2
|
module Thredded
|
|
5
3
|
class ModerationController < Thredded::ApplicationController
|
|
6
4
|
before_action :thredded_require_login!
|
|
7
5
|
before_action :load_moderatable_messageboards
|
|
8
6
|
|
|
9
7
|
def pending
|
|
10
|
-
@posts = PostsPageView.new(
|
|
8
|
+
@posts = Thredded::PostsPageView.new(
|
|
11
9
|
thredded_current_user,
|
|
12
10
|
moderatable_posts
|
|
13
11
|
.pending_moderation
|
|
@@ -15,9 +13,7 @@ module Thredded
|
|
|
15
13
|
.preload(:user, :postable)
|
|
16
14
|
.page(current_page)
|
|
17
15
|
)
|
|
18
|
-
|
|
19
|
-
@last_moderated_record = accessible_post_moderation_records.find(flash[:last_moderated_record_id].to_i)
|
|
20
|
-
end
|
|
16
|
+
maybe_set_last_moderated_record_flash
|
|
21
17
|
end
|
|
22
18
|
|
|
23
19
|
def history
|
|
@@ -27,21 +23,19 @@ module Thredded
|
|
|
27
23
|
end
|
|
28
24
|
|
|
29
25
|
def activity
|
|
30
|
-
@posts = PostsPageView.new(
|
|
26
|
+
@posts = Thredded::PostsPageView.new(
|
|
31
27
|
thredded_current_user,
|
|
32
28
|
moderatable_posts
|
|
33
29
|
.order_newest_first
|
|
34
30
|
.preload(:user, :postable)
|
|
35
31
|
.page(current_page)
|
|
36
32
|
)
|
|
37
|
-
|
|
38
|
-
@last_moderated_record = accessible_post_moderation_records.find(flash[:last_moderated_record_id].to_i)
|
|
39
|
-
end
|
|
33
|
+
maybe_set_last_moderated_record_flash
|
|
40
34
|
end
|
|
41
35
|
|
|
42
36
|
def moderate_post
|
|
43
37
|
return head(:bad_request) unless Thredded::Post.moderation_states.include?(params[:moderation_state])
|
|
44
|
-
flash[:last_moderated_record_id] = ModeratePost.run!(
|
|
38
|
+
flash[:last_moderated_record_id] = Thredded::ModeratePost.run!(
|
|
45
39
|
post: moderatable_posts.find(params[:id]),
|
|
46
40
|
moderation_state: params[:moderation_state],
|
|
47
41
|
moderator: thredded_current_user,
|
|
@@ -68,7 +62,7 @@ module Thredded
|
|
|
68
62
|
.order_newest_first
|
|
69
63
|
.includes(:postable)
|
|
70
64
|
.page(current_page)
|
|
71
|
-
@posts = PostsPageView.new(thredded_current_user, posts_scope)
|
|
65
|
+
@posts = Thredded::PostsPageView.new(thredded_current_user, posts_scope)
|
|
72
66
|
end
|
|
73
67
|
|
|
74
68
|
def moderate_user
|
|
@@ -80,6 +74,11 @@ module Thredded
|
|
|
80
74
|
|
|
81
75
|
private
|
|
82
76
|
|
|
77
|
+
def maybe_set_last_moderated_record_flash
|
|
78
|
+
return unless flash[:last_moderated_record_id]
|
|
79
|
+
@last_moderated_record = accessible_post_moderation_records.find(flash[:last_moderated_record_id].to_i)
|
|
80
|
+
end
|
|
81
|
+
|
|
83
82
|
def moderatable_posts
|
|
84
83
|
Thredded::Post.where(messageboard_id: @moderatable_messageboards)
|
|
85
84
|
end
|
|
@@ -91,7 +90,7 @@ module Thredded
|
|
|
91
90
|
|
|
92
91
|
def load_moderatable_messageboards
|
|
93
92
|
@moderatable_messageboards = thredded_current_user.thredded_can_moderate_messageboards.to_a
|
|
94
|
-
if @moderatable_messageboards.empty?
|
|
93
|
+
if @moderatable_messageboards.empty? # rubocop:disable Style/GuardClause
|
|
95
94
|
fail Pundit::NotAuthorizedError, 'You are not authorized to perform this action.'
|
|
96
95
|
end
|
|
97
96
|
end
|
|
@@ -22,13 +22,17 @@ module Thredded
|
|
|
22
22
|
@preferences = UserPreferencesForm.new(
|
|
23
23
|
user: thredded_current_user,
|
|
24
24
|
messageboard: messageboard_or_nil,
|
|
25
|
-
params:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
params: preferences_params
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def preferences_params
|
|
30
|
+
params.fetch(:user_preferences_form, {}).permit(
|
|
31
|
+
:follow_topics_on_mention,
|
|
32
|
+
:messageboard_follow_topics_on_mention,
|
|
33
|
+
messageboard_notifications_for_followed_topics_attributes: %i(notifier_key id messageboard_id enabled),
|
|
34
|
+
notifications_for_followed_topics_attributes: %i(notifier_key id enabled),
|
|
35
|
+
notifications_for_private_topics_attributes: %i(notifier_key id enabled)
|
|
32
36
|
)
|
|
33
37
|
end
|
|
34
38
|
end
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require_dependency 'thredded/posts_page_view'
|
|
3
|
-
require_dependency 'thredded/topics_page_view'
|
|
4
2
|
module Thredded
|
|
5
3
|
class PrivateTopicsController < Thredded::ApplicationController
|
|
6
4
|
before_action :thredded_require_login!
|
|
@@ -8,15 +6,14 @@ module Thredded
|
|
|
8
6
|
def index
|
|
9
7
|
@private_topics = Thredded::PrivateTopicsPageView.new(
|
|
10
8
|
thredded_current_user,
|
|
11
|
-
PrivateTopic
|
|
9
|
+
Thredded::PrivateTopic
|
|
12
10
|
.distinct
|
|
13
11
|
.for_user(thredded_current_user)
|
|
14
12
|
.order_recently_posted_first
|
|
15
|
-
.includes(:last_user, :user)
|
|
16
13
|
.page(params[:page])
|
|
17
14
|
)
|
|
18
15
|
|
|
19
|
-
PrivateTopicForm.new(user: thredded_current_user).tap do |form|
|
|
16
|
+
Thredded::PrivateTopicForm.new(user: thredded_current_user).tap do |form|
|
|
20
17
|
@new_private_topic = form if policy(form.private_topic).create?
|
|
21
18
|
end
|
|
22
19
|
end
|
|
@@ -32,19 +29,21 @@ module Thredded
|
|
|
32
29
|
@posts = Thredded::TopicPostsPageView.new(thredded_current_user, private_topic, page_scope)
|
|
33
30
|
|
|
34
31
|
if signed_in?
|
|
35
|
-
UserPrivateTopicReadState.touch!(
|
|
32
|
+
Thredded::UserPrivateTopicReadState.touch!(
|
|
33
|
+
thredded_current_user.id, private_topic.id, page_scope.last, current_page
|
|
34
|
+
)
|
|
36
35
|
end
|
|
37
36
|
|
|
38
37
|
@post = private_topic.posts.build
|
|
39
38
|
end
|
|
40
39
|
|
|
41
40
|
def new
|
|
42
|
-
@private_topic = PrivateTopicForm.new(user: thredded_current_user)
|
|
41
|
+
@private_topic = Thredded::PrivateTopicForm.new(user: thredded_current_user)
|
|
43
42
|
authorize_creating @private_topic.private_topic
|
|
44
43
|
end
|
|
45
44
|
|
|
46
45
|
def create
|
|
47
|
-
@private_topic = PrivateTopicForm.new(new_private_topic_params)
|
|
46
|
+
@private_topic = Thredded::PrivateTopicForm.new(new_private_topic_params)
|
|
48
47
|
if @private_topic.save
|
|
49
48
|
redirect_to @private_topic.private_topic
|
|
50
49
|
else
|
|
@@ -72,8 +71,13 @@ module Thredded
|
|
|
72
71
|
(params[:page] || 1).to_i
|
|
73
72
|
end
|
|
74
73
|
|
|
74
|
+
# Returns the `@private_topic` instance variable.
|
|
75
|
+
# If `@private_topic` is not set, it first sets it to the topic with the slug or ID given by `params[:id]`.
|
|
76
|
+
#
|
|
77
|
+
# @return [Thredded::PrivateTopic]
|
|
78
|
+
# @raise [Thredded::Errors::PrivateTopicNotFound] if the topic with the given slug does not exist.
|
|
75
79
|
def private_topic
|
|
76
|
-
@private_topic ||= Thredded::PrivateTopic.
|
|
80
|
+
@private_topic ||= Thredded::PrivateTopic.friendly_find!(params[:id])
|
|
77
81
|
end
|
|
78
82
|
|
|
79
83
|
def private_topic_params
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require_dependency 'thredded/posts_page_view'
|
|
3
|
-
require_dependency 'thredded/topics_page_view'
|
|
4
2
|
# rubocop:disable Metrics/ClassLength
|
|
5
3
|
module Thredded
|
|
6
4
|
class TopicsController < Thredded::ApplicationController
|
|
@@ -20,7 +18,7 @@ module Thredded
|
|
|
20
18
|
.order_sticky_first.order_recently_posted_first
|
|
21
19
|
.page(current_page)
|
|
22
20
|
)
|
|
23
|
-
TopicForm.new(messageboard: messageboard, user: thredded_current_user).tap do |form|
|
|
21
|
+
Thredded::TopicForm.new(messageboard: messageboard, user: thredded_current_user).tap do |form|
|
|
24
22
|
@new_topic = form if policy(form.topic).create?
|
|
25
23
|
end
|
|
26
24
|
end
|
|
@@ -33,19 +31,24 @@ module Thredded
|
|
|
33
31
|
.page(current_page)
|
|
34
32
|
@posts = Thredded::TopicPostsPageView.new(thredded_current_user, topic, page_scope)
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
if signed_in?
|
|
35
|
+
Thredded::UserTopicReadState.touch!(
|
|
36
|
+
thredded_current_user.id, topic.id, page_scope.last, current_page
|
|
37
|
+
)
|
|
38
|
+
end
|
|
37
39
|
|
|
38
40
|
@new_post = messageboard.posts.build(postable: topic)
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
def search
|
|
42
|
-
|
|
44
|
+
in_messageboard = params.key?(:messageboard_id)
|
|
45
|
+
authorize_reading messageboard if in_messageboard
|
|
43
46
|
@query = params[:q].to_s
|
|
44
47
|
topics_scope = policy_scope(
|
|
45
|
-
if
|
|
48
|
+
if in_messageboard
|
|
46
49
|
messageboard.topics
|
|
47
50
|
else
|
|
48
|
-
Topic.where(messageboard_id: policy_scope(Messageboard.all).pluck(:id))
|
|
51
|
+
Thredded::Topic.where(messageboard_id: policy_scope(Thredded::Messageboard.all).pluck(:id))
|
|
49
52
|
end
|
|
50
53
|
)
|
|
51
54
|
@topics = Thredded::TopicsPageView.new(
|
|
@@ -59,7 +62,7 @@ module Thredded
|
|
|
59
62
|
end
|
|
60
63
|
|
|
61
64
|
def new
|
|
62
|
-
@new_topic = TopicForm.new(new_topic_params)
|
|
65
|
+
@new_topic = Thredded::TopicForm.new(new_topic_params)
|
|
63
66
|
authorize_creating @new_topic.topic
|
|
64
67
|
end
|
|
65
68
|
|
|
@@ -77,7 +80,7 @@ module Thredded
|
|
|
77
80
|
end
|
|
78
81
|
|
|
79
82
|
def create
|
|
80
|
-
@new_topic = TopicForm.new(new_topic_params)
|
|
83
|
+
@new_topic = Thredded::TopicForm.new(new_topic_params)
|
|
81
84
|
authorize_creating @new_topic.topic
|
|
82
85
|
if @new_topic.save
|
|
83
86
|
redirect_to messageboard_topics_path(messageboard)
|
|
@@ -109,13 +112,13 @@ module Thredded
|
|
|
109
112
|
|
|
110
113
|
def follow
|
|
111
114
|
authorize topic, :read?
|
|
112
|
-
UserTopicFollow.create_unless_exists(thredded_current_user.id, topic.id)
|
|
115
|
+
Thredded::UserTopicFollow.create_unless_exists(thredded_current_user.id, topic.id)
|
|
113
116
|
follow_change_response(following: true)
|
|
114
117
|
end
|
|
115
118
|
|
|
116
119
|
def unfollow
|
|
117
120
|
authorize topic, :read?
|
|
118
|
-
UserTopicFollow.find_by(topic_id: topic.id, user_id: thredded_current_user.id).try(:destroy)
|
|
121
|
+
Thredded::UserTopicFollow.find_by(topic_id: topic.id, user_id: thredded_current_user.id).try(:destroy)
|
|
119
122
|
follow_change_response(following: false)
|
|
120
123
|
end
|
|
121
124
|
|
|
@@ -129,8 +132,13 @@ module Thredded
|
|
|
129
132
|
end
|
|
130
133
|
end
|
|
131
134
|
|
|
135
|
+
# Returns the `@topic` instance variable.
|
|
136
|
+
# If `@topic` is not set, it first sets it to the topic with the slug or ID given by `params[:id]`.
|
|
137
|
+
#
|
|
138
|
+
# @return [Thredded::Topic]
|
|
139
|
+
# @raise [Thredded::Errors::TopicNotFound] if the topic with the given slug does not exist.
|
|
132
140
|
def topic
|
|
133
|
-
@topic ||= messageboard.topics.
|
|
141
|
+
@topic ||= messageboard.topics.friendly_find!(params[:id])
|
|
134
142
|
end
|
|
135
143
|
|
|
136
144
|
def topic_params
|