thredded 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.mkdn +63 -0
  3. data/Procfile +1 -0
  4. data/README.mkdn +42 -20
  5. data/app/assets/images/thredded/private-messages.svg +4 -0
  6. data/app/assets/images/thredded/settings.svg +4 -0
  7. data/app/assets/javascripts/thredded.es6 +2 -10
  8. data/app/assets/javascripts/thredded/{currently_online.es6 → components/currently_online.es6} +0 -0
  9. data/app/assets/javascripts/thredded/{post_form.es6 → components/post_form.es6} +0 -0
  10. data/app/assets/javascripts/thredded/{time_stamps.es6 → components/time_stamps.es6} +0 -0
  11. data/app/assets/javascripts/thredded/{topic_form.es6 → components/topic_form.es6} +1 -1
  12. data/app/assets/javascripts/thredded/components/topics.es6 +37 -0
  13. data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +45 -0
  14. data/app/assets/javascripts/thredded/components/users_select.es6 +56 -0
  15. data/app/assets/javascripts/thredded/dependencies.js +9 -0
  16. data/app/assets/javascripts/thredded/thredded.es6 +1 -0
  17. data/app/assets/stylesheets/thredded/_base.scss +3 -2
  18. data/app/assets/stylesheets/thredded/_thredded.scss +4 -1
  19. data/app/assets/stylesheets/thredded/base/_buttons.scss +2 -1
  20. data/app/assets/stylesheets/thredded/base/_forms.scss +23 -18
  21. data/app/assets/stylesheets/thredded/base/_grid.scss +1 -1
  22. data/app/assets/stylesheets/thredded/base/_nav.scss +21 -0
  23. data/app/assets/stylesheets/thredded/base/_tables.scss +5 -14
  24. data/app/assets/stylesheets/thredded/base/_typography.scss +9 -4
  25. data/app/assets/stylesheets/thredded/base/_variables.scss +28 -9
  26. data/app/assets/stylesheets/thredded/components/_alerts.scss +19 -0
  27. data/app/assets/stylesheets/thredded/components/_currently-online.scss +1 -1
  28. data/app/assets/stylesheets/thredded/components/_form-list.scss +2 -4
  29. data/app/assets/stylesheets/thredded/components/_icons.scss +3 -0
  30. data/app/assets/stylesheets/thredded/components/_messageboard.scss +4 -4
  31. data/app/assets/stylesheets/thredded/components/_pagination.scss +2 -2
  32. data/app/assets/stylesheets/thredded/components/_post-form.scss +3 -0
  33. data/app/assets/stylesheets/thredded/components/_post.scss +14 -4
  34. data/app/assets/stylesheets/thredded/components/_select2.scss +79 -9
  35. data/app/assets/stylesheets/thredded/components/_topic-header.scss +11 -1
  36. data/app/assets/stylesheets/thredded/components/_topics.scss +13 -11
  37. data/app/assets/stylesheets/thredded/layout/_main-container.scss +3 -3
  38. data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +11 -17
  39. data/app/assets/stylesheets/thredded/layout/_navigation.scss +72 -0
  40. data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +66 -0
  41. data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +35 -61
  42. data/app/commands/thredded/at_notification_extractor.rb +1 -0
  43. data/app/commands/thredded/members_marked_notified.rb +1 -0
  44. data/app/commands/thredded/messageboard_destroyer.rb +7 -2
  45. data/app/commands/thredded/notify_mentioned_users.rb +8 -21
  46. data/app/commands/thredded/notify_private_topic_users.rb +3 -5
  47. data/app/controllers/thredded/application_controller.rb +76 -41
  48. data/app/controllers/thredded/autocomplete_users_controller.rb +46 -0
  49. data/app/controllers/thredded/messageboards_controller.rb +8 -5
  50. data/app/controllers/thredded/posts_controller.rb +20 -22
  51. data/app/controllers/thredded/preferences_controller.rb +19 -14
  52. data/app/controllers/thredded/private_topics_controller.rb +58 -23
  53. data/app/controllers/thredded/setups_controller.rb +1 -0
  54. data/app/controllers/thredded/theme_previews_controller.rb +24 -53
  55. data/app/controllers/thredded/topics_controller.rb +48 -77
  56. data/app/forms/thredded/private_topic_form.rb +1 -21
  57. data/app/forms/thredded/topic_form.rb +3 -7
  58. data/app/forms/thredded/user_preferences_form.rb +62 -0
  59. data/app/helpers/thredded/application_helper.rb +11 -12
  60. data/app/helpers/thredded/urls_helper.rb +103 -0
  61. data/app/jobs/thredded/activity_updater_job.rb +4 -3
  62. data/app/jobs/thredded/at_notifier_job.rb +1 -0
  63. data/app/jobs/thredded/notify_private_topic_users_job.rb +1 -0
  64. data/app/mailer_previews/thredded/base_mailer_preview.rb +101 -0
  65. data/app/mailer_previews/thredded/post_mailer_preview.rb +11 -0
  66. data/app/mailer_previews/thredded/private_post_mailer_preview.rb +11 -0
  67. data/app/mailer_previews/thredded/private_topic_mailer_preview.rb +15 -0
  68. data/app/mailers/thredded/base_mailer.rb +13 -0
  69. data/app/mailers/thredded/post_mailer.rb +4 -2
  70. data/app/mailers/thredded/private_post_mailer.rb +4 -2
  71. data/app/mailers/thredded/private_topic_mailer.rb +4 -2
  72. data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +16 -0
  73. data/app/models/concerns/thredded/post_common.rb +68 -63
  74. data/app/models/concerns/thredded/topic_common.rb +31 -8
  75. data/app/models/concerns/thredded/user_topic_read_state_common.rb +31 -0
  76. data/app/models/thredded/category.rb +1 -0
  77. data/app/models/thredded/messageboard.rb +24 -25
  78. data/app/models/thredded/messageboard_user.rb +1 -0
  79. data/app/models/thredded/null_preference.rb +1 -0
  80. data/app/models/thredded/null_user.rb +1 -6
  81. data/app/models/thredded/null_user_topic_read_state.rb +12 -0
  82. data/app/models/thredded/post.rb +6 -9
  83. data/app/models/thredded/post_notification.rb +1 -0
  84. data/app/models/thredded/private_post.rb +6 -2
  85. data/app/models/thredded/private_topic.rb +46 -32
  86. data/app/models/thredded/private_user.rb +3 -2
  87. data/app/models/thredded/stats.rb +1 -0
  88. data/app/models/thredded/topic.rb +40 -64
  89. data/app/models/thredded/topic_category.rb +1 -0
  90. data/app/models/thredded/user_detail.rb +2 -15
  91. data/app/models/thredded/user_extender.rb +29 -14
  92. data/app/models/thredded/user_messageboard_preference.rb +20 -0
  93. data/app/models/thredded/user_permissions/admin/if_admin_column_true.rb +1 -0
  94. data/app/models/thredded/user_permissions/admin/none.rb +1 -0
  95. data/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb +1 -0
  96. data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +1 -0
  97. data/app/models/thredded/user_permissions/moderate/none.rb +1 -0
  98. data/app/models/thredded/user_permissions/read/all.rb +1 -0
  99. data/app/models/thredded/user_permissions/write/all.rb +1 -0
  100. data/app/models/thredded/user_permissions/write/none.rb +1 -0
  101. data/app/models/thredded/user_preference.rb +7 -1
  102. data/app/models/thredded/user_private_topic_read_state.rb +12 -0
  103. data/app/models/thredded/user_topic_read_state.rb +12 -0
  104. data/app/policies/thredded/messageboard_policy.rb +27 -0
  105. data/app/policies/thredded/post_policy.rb +33 -0
  106. data/app/policies/thredded/private_post_policy.rb +29 -0
  107. data/app/policies/thredded/private_topic_policy.rb +23 -0
  108. data/app/policies/thredded/topic_policy.rb +32 -0
  109. data/app/view_models/thredded/base_topic_view.rb +56 -0
  110. data/app/view_models/thredded/post_view.rb +44 -0
  111. data/app/view_models/thredded/posts_page_view.rb +27 -0
  112. data/app/view_models/thredded/private_topic_view.rb +9 -0
  113. data/app/{decorators/thredded/topic_email_decorator.rb → view_models/thredded/topic_email_view.rb} +2 -1
  114. data/app/view_models/thredded/topic_view.rb +23 -0
  115. data/app/view_models/thredded/topics_page_view.rb +26 -0
  116. data/app/views/thredded/error_pages/forbidden.html.erb +6 -0
  117. data/app/views/thredded/error_pages/not_found.html.erb +6 -0
  118. data/app/views/thredded/messageboards/_messageboard.html.erb +13 -6
  119. data/app/views/thredded/messageboards/index.html.erb +2 -8
  120. data/app/views/thredded/messageboards/new.html.erb +8 -2
  121. data/app/views/thredded/post_mailer/at_notification.html.erb +3 -3
  122. data/app/views/thredded/post_mailer/at_notification.text.erb +1 -1
  123. data/app/views/thredded/posts/_content_field.html.erb +1 -1
  124. data/app/views/thredded/posts/_form.html.erb +5 -1
  125. data/app/views/thredded/posts/_post.html.erb +3 -1
  126. data/app/views/thredded/posts/edit.html.erb +7 -3
  127. data/app/views/thredded/posts_common/_form.html.erb +1 -1
  128. data/app/views/thredded/posts_common/_post.html.erb +14 -8
  129. data/app/views/thredded/preferences/_form.html.erb +37 -15
  130. data/app/views/thredded/preferences/_header.html.erb +1 -1
  131. data/app/views/thredded/preferences/edit.html.erb +4 -6
  132. data/app/views/thredded/private_post_mailer/at_notification.html.erb +6 -4
  133. data/app/views/thredded/private_posts/_form.html.erb +5 -1
  134. data/app/views/thredded/private_posts/_private_post.html.erb +3 -1
  135. data/app/views/thredded/private_topic_mailer/message_notification.html.erb +3 -7
  136. data/app/views/thredded/private_topic_mailer/message_notification.text.erb +1 -3
  137. data/app/views/thredded/private_topics/_breadcrumbs.html.erb +2 -2
  138. data/app/views/thredded/private_topics/_form.html.erb +15 -10
  139. data/app/views/thredded/private_topics/_header.html.erb +12 -0
  140. data/app/views/thredded/private_topics/_no_private_topics.html.erb +2 -2
  141. data/app/views/thredded/private_topics/_private_topic.html.erb +4 -6
  142. data/app/views/thredded/private_topics/edit.html.erb +32 -0
  143. data/app/views/thredded/private_topics/index.html.erb +5 -5
  144. data/app/views/thredded/private_topics/new.html.erb +1 -2
  145. data/app/views/thredded/private_topics/show.html.erb +12 -7
  146. data/app/views/thredded/search/_form.html.erb +9 -6
  147. data/app/views/thredded/shared/{_messageboard_topics_breadcrumbs.html.erb → _breadcrumbs.html.erb} +2 -2
  148. data/app/views/thredded/shared/_header.html.erb +2 -3
  149. data/app/views/thredded/shared/_nav.html.erb +20 -0
  150. data/app/views/thredded/shared/nav/_notification_preferences.html.erb +6 -0
  151. data/app/views/thredded/shared/nav/_private_topics.html.erb +11 -0
  152. data/app/views/thredded/shared/nav/_standalone.html.erb +12 -0
  153. data/app/views/thredded/theme_previews/_section_title.html.erb +2 -2
  154. data/app/views/thredded/theme_previews/show.html.erb +13 -17
  155. data/app/views/thredded/topics/_form.html.erb +8 -6
  156. data/app/views/thredded/topics/_header.html.erb +12 -0
  157. data/app/views/thredded/topics/_topic.html.erb +4 -8
  158. data/app/views/thredded/topics/_topic_form_admin_options.html.erb +1 -1
  159. data/app/views/thredded/topics/edit.html.erb +22 -18
  160. data/app/views/thredded/topics/index.html.erb +3 -3
  161. data/app/views/thredded/topics/new.html.erb +1 -1
  162. data/app/views/thredded/topics/search.html.erb +17 -5
  163. data/app/views/thredded/topics/show.html.erb +14 -11
  164. data/bin/rails +5 -0
  165. data/config.ru +3 -0
  166. data/config/i18n-tasks.yml +16 -0
  167. data/config/locales/en.yml +90 -0
  168. data/config/routes.rb +29 -15
  169. data/db/migrate/20160329231848_create_thredded.rb +29 -33
  170. data/db/seeds.rb +115 -0
  171. data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +59 -0
  172. data/heroku.gemfile +26 -0
  173. data/heroku.gemfile.lock +282 -0
  174. data/lib/generators/thredded/install/install_generator.rb +1 -0
  175. data/lib/generators/thredded/install/templates/initializer.rb +17 -0
  176. data/lib/html/pipeline/at_mention_filter.rb +2 -1
  177. data/lib/html/pipeline/bbcode_filter.rb +13 -4
  178. data/lib/tasks/thredded_tasks.rake +1 -0
  179. data/lib/thredded.rb +19 -17
  180. data/lib/thredded/at_users.rb +1 -0
  181. data/lib/thredded/engine.rb +14 -5
  182. data/lib/thredded/errors.rb +11 -11
  183. data/lib/thredded/main_app_route_delegator.rb +1 -0
  184. data/lib/thredded/search_parser.rb +2 -1
  185. data/lib/thredded/topics_search.rb +67 -0
  186. data/lib/thredded/version.rb +2 -1
  187. data/thredded.gemspec +12 -8
  188. metadata +146 -82
  189. data/app/assets/javascripts/thredded/users_select.es6 +0 -5
  190. data/app/assets/stylesheets/thredded/layout/_topic-navigation.scss +0 -53
  191. data/app/commands/thredded/user_reads_private_topic.rb +0 -22
  192. data/app/commands/thredded/user_resets_private_topic_to_unread.rb +0 -23
  193. data/app/decorators/thredded/base_topic_decorator.rb +0 -14
  194. data/app/decorators/thredded/base_user_topic_decorator.rb +0 -63
  195. data/app/decorators/thredded/messageboard_decorator.rb +0 -41
  196. data/app/decorators/thredded/post_decorator.rb +0 -40
  197. data/app/decorators/thredded/private_topic_decorator.rb +0 -23
  198. data/app/decorators/thredded/topic_decorator.rb +0 -25
  199. data/app/decorators/thredded/user_private_topic_decorator.rb +0 -13
  200. data/app/decorators/thredded/user_topic_decorator.rb +0 -37
  201. data/app/models/thredded/ability.rb +0 -60
  202. data/app/models/thredded/notification_preference.rb +0 -17
  203. data/app/models/thredded/null_topic.rb +0 -15
  204. data/app/models/thredded/null_topic_read.rb +0 -19
  205. data/app/models/thredded/user_topic_read.rb +0 -10
  206. data/app/views/thredded/shared/_notification_preferences.html.erb +0 -7
  207. data/app/views/thredded/shared/_top_nav.html.erb +0 -36
  208. data/app/views/thredded/shared/_topic_nav.html.erb +0 -22
  209. data/app/views/thredded/topics/_recent_topics_by_user.html.erb +0 -8
  210. data/app/views/thredded/topics/by_category.html.erb +0 -56
  211. data/app/views/thredded/topics_common/_header.html.erb +0 -6
  212. data/lib/thredded/messageboard_user_permissions.rb +0 -22
  213. data/lib/thredded/post_sql_builder.rb +0 -12
  214. data/lib/thredded/post_user_permissions.rb +0 -32
  215. data/lib/thredded/private_topic_user_permissions.rb +0 -26
  216. data/lib/thredded/search_sql_builder.rb +0 -21
  217. data/lib/thredded/seed_database.rb +0 -76
  218. data/lib/thredded/table_sql_builder.rb +0 -41
  219. data/lib/thredded/topic_sql_builder.rb +0 -11
  220. data/lib/thredded/topic_user_permissions.rb +0 -32
@@ -1,27 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require_dependency 'thredded/posts_page_view'
3
+ require_dependency 'thredded/topics_page_view'
1
4
  module Thredded
2
5
  class PrivateTopicsController < Thredded::ApplicationController
3
- helper_method :private_topic
6
+ before_action :thredded_require_login!
4
7
 
5
8
  def index
6
- @new_private_topic = PrivateTopicForm.new(user: thredded_current_user)
7
- @private_topics = PrivateTopic
8
- .uniq
9
- .for_user(thredded_current_user)
10
- .order('updated_at DESC')
11
- .on_page(params[:page])
12
- .load
13
- @decorated_private_topics = Thredded::UserPrivateTopicDecorator
14
- .decorate_all(thredded_current_user, @private_topics)
9
+ @private_topics = Thredded::TopicsPageView.new(
10
+ thredded_current_user,
11
+ PrivateTopic
12
+ .distinct
13
+ .for_user(thredded_current_user)
14
+ .order_recently_updated_first
15
+ .includes(:last_user, :user)
16
+ .page(params[:page]))
17
+
18
+ PrivateTopicForm.new(user: thredded_current_user).tap do |form|
19
+ @new_private_topic = form if policy(form.private_topic).create?
20
+ end
15
21
  end
16
22
 
17
23
  def show
18
- authorize! :read, private_topic
19
- UserReadsPrivateTopic.new(private_topic, thredded_current_user).run
24
+ authorize_reading private_topic
20
25
 
21
- @posts = private_topic
26
+ page_scope = private_topic
22
27
  .posts
23
28
  .includes(:user)
24
- .order('id ASC')
29
+ .order_oldest_first
30
+ .page(current_page)
31
+ @posts = Thredded::PostsPageView.new(thredded_current_user, private_topic, page_scope)
32
+
33
+ if signed_in?
34
+ UserPrivateTopicReadState.touch!(thredded_current_user.id, private_topic.id, page_scope.last, current_page)
35
+ end
25
36
 
26
37
  @post = private_topic.posts.build
27
38
  end
@@ -34,32 +45,56 @@ module Thredded
34
45
  def create
35
46
  @private_topic = PrivateTopicForm.new(new_private_topic_params)
36
47
  if @private_topic.save
37
- NotifyPrivateTopicUsersJob
38
- .perform_later(@private_topic.private_topic.id)
39
-
40
- UserResetsPrivateTopicToUnread
41
- .new(@private_topic.private_topic, thredded_current_user)
42
- .run
43
-
48
+ NotifyPrivateTopicUsersJob.perform_later(@private_topic.private_topic.id)
44
49
  redirect_to @private_topic.private_topic
45
50
  else
46
51
  render :new
47
52
  end
48
53
  end
49
54
 
55
+ def edit
56
+ authorize private_topic, :update?
57
+ end
58
+
59
+ def update
60
+ authorize private_topic, :update?
61
+ if private_topic.update(private_topic_params)
62
+ redirect_to private_topic_url(private_topic),
63
+ notice: t('thredded.private_topics.updated_notice')
64
+ else
65
+ render :edit
66
+ end
67
+ end
68
+
50
69
  private
51
70
 
71
+ def current_page
72
+ (params[:page] || 1).to_i
73
+ end
74
+
52
75
  def private_topic
53
76
  @private_topic ||= Thredded::PrivateTopic.find_by_slug(params[:id])
54
77
  end
55
78
 
79
+ def private_topic_params
80
+ params
81
+ .require(:private_topic)
82
+ .permit(:title)
83
+ end
84
+
56
85
  def new_private_topic_params
57
86
  params
58
87
  .require(:private_topic)
59
- .permit(:title, :locked, :sticky, :content, user_ids: [], category_ids: [])
88
+ .permit(:title, :content, :user_ids, user_ids: [])
60
89
  .merge(
61
90
  user: thredded_current_user,
62
- ip: request.remote_ip)
91
+ ip: request.remote_ip
92
+ ).tap { |p| adapt_user_ids! p }
93
+ end
94
+
95
+ # select2 returns a string of IDs joined with commas.
96
+ def adapt_user_ids!(p)
97
+ p[:user_ids] = p[:user_ids].split(',') if p[:user_ids].is_a?(String)
63
98
  end
64
99
  end
65
100
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Thredded
2
3
  class SetupsController < Thredded::ApplicationController
3
4
  def new
@@ -1,59 +1,30 @@
1
+ # frozen_string_literal: true
1
2
  module Thredded
2
3
  class ThemePreviewsController < Thredded::ApplicationController
3
- before_filter :fail_on_empty_database, if: :no_messageboard?
4
-
5
4
  def show
6
- @messageboard = messageboard
7
- @messageboards = Messageboard.where(closed: false).decorate
8
- @topics = messageboard.topics.on_page(current_page).limit(3)
9
- @decorated_topics = UserTopicDecorator.decorate_all(user, @topics)
10
- @decorated_private_topics = Thredded::UserPrivateTopicDecorator
11
- .decorate_all(thredded_current_user, user.thredded_private_topics)
12
- @topic = @topics.find { |t| t.posts.present? } || @topics.first ||
13
- @messageboard.topics.build(title: 'Hello', slug: 'hello', user: user)
14
- @user_topic = UserTopicDecorator.new(user, @topic)
15
- @posts = @topic.posts.first(3)
16
- @post = @posts.first || @messageboard.posts.build(id: 1337, postable: @topic, content: 'Hello world', user: user)
17
- @new_post = @messageboard.posts.build(postable: @topic)
18
- @new_topic = TopicForm.new(messageboard: messageboard, user: Thredded::NullUser.new)
19
- @new_private_topic = PrivateTopicForm.new(user: user)
20
- @private_topic = PrivateTopic.all.first || PrivateTopic.new(id: 1337, title: 'Hello', user: user, last_user: user,
21
- users: [user])
22
- @private_post = PrivatePost.first ||
23
- @private_topic.posts.build(id: 1337, postable: @private_topic, content: 'A private hello world', user: user)
24
- @preference = preference
25
- end
26
-
27
- def messageboard
28
- @messageboard ||= Messageboard.first
29
- end
30
-
31
- def preference
32
- @preference ||= NotificationPreference
33
- .where(messageboard_id: messageboard.id, user_id: user.id)
34
- .first_or_create!
35
- end
36
-
37
- def current_page
38
- 1
39
- end
40
-
41
- private
42
-
43
- def fail_on_empty_database
44
- fail Thredded::Errors::DatabaseEmpty
45
- end
46
-
47
- def no_messageboard?
48
- !Thredded::Messageboard.any?
49
- end
50
-
51
- def user
52
- @user ||= if thredded_current_user.thredded_anonymous?
53
- Thredded.user_class.first_or_create!(slug: 'joe', name: 'joe', email: 'joe@example.com')
54
- else
55
- thredded_current_user
56
- end
5
+ @messageboard = Messageboard.first
6
+ fail Thredded::Errors::DatabaseEmpty unless @messageboard
7
+ @user = if thredded_current_user.thredded_anonymous?
8
+ Thredded.user_class.new(id: 1334, name: 'joe', email: 'joe@example.com')
9
+ else
10
+ thredded_current_user
11
+ end
12
+ @messageboards = Messageboard.where(closed: false)
13
+ @topics = TopicsPageView.new(@user, @messageboard.topics.page(1).limit(3))
14
+ @private_topics = TopicsPageView.new(@user, @user.thredded_private_topics.page(1).limit(3))
15
+ topic = Topic.new(messageboard: @messageboard, title: 'Hello', slug: 'hello', user: @user)
16
+ @topic = TopicView.from_user(topic, @user)
17
+ @posts = PostsPageView.new(@user, topic, topic.posts.page(1).limit(3))
18
+ @post = topic.posts.build(id: 1337, postable: topic, content: 'Hello world', user: @user)
19
+ @new_post = @messageboard.posts.build(postable: topic)
20
+ @new_topic = TopicForm.new(user: @user, messageboard: @messageboard)
21
+ @new_private_topic = PrivateTopicForm.new(user: @user)
22
+ private_topic = PrivateTopic.new(id: 1337, title: 'Hello', user: @user, last_user: @user, users: [@user])
23
+ @private_topic = PrivateTopicView.from_user(private_topic, @user)
24
+ @private_posts = PostsPageView.new(@user, private_topic, private_topic.posts.page(1).limit(3))
25
+ @private_post = private_topic.posts.build(
26
+ id: 1337, postable: private_topic, content: 'A private hello world', user: @user)
27
+ @preferences = UserPreferencesForm.new(user: @user, messageboard: @messageboard)
57
28
  end
58
29
  end
59
30
  end
@@ -1,40 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require_dependency 'thredded/posts_page_view'
3
+ require_dependency 'thredded/topics_page_view'
1
4
  module Thredded
2
5
  class TopicsController < Thredded::ApplicationController
3
- helper_method :current_page, :topic, :user_topic
4
- before_filter :update_user_activity
6
+ before_action :thredded_require_login!,
7
+ only: [:edit, :new, :update, :create, :destroy]
8
+ after_action :update_user_activity
5
9
 
6
10
  def index
7
11
  authorize_reading messageboard
8
12
 
9
- @topics = topics
10
- @decorated_topics = Thredded::UserTopicDecorator
11
- .decorate_all(thredded_current_user, @topics)
12
- initialize_new_topic.tap do |new_topic|
13
- @new_topic = new_topic if current_ability.can?(:create, new_topic.topic)
13
+ @topics = Thredded::TopicsPageView.new(
14
+ thredded_current_user,
15
+ messageboard.topics
16
+ .order_sticky_first.order_recently_updated_first
17
+ .includes(:categories, :last_user, :user)
18
+ .page(current_page))
19
+ TopicForm.new(messageboard: messageboard, user: thredded_current_user).tap do |form|
20
+ @new_topic = form if policy(form.topic).create?
14
21
  end
15
22
  end
16
23
 
17
24
  def show
18
- authorize! :read, topic
19
-
20
- @posts = topic.posts
25
+ authorize_reading topic
26
+ page_scope = topic.posts
21
27
  .includes(:user, :messageboard, :postable)
22
- .order('id ASC')
28
+ .order_oldest_first
23
29
  .page(current_page)
30
+ @posts = Thredded::PostsPageView.new(thredded_current_user, topic, page_scope)
24
31
 
25
- @new_post = messageboard.posts.build(
26
- postable: topic,
27
- filter: messageboard.filter
28
- )
32
+ UserTopicReadState.touch!(thredded_current_user.id, topic.id, page_scope.last, current_page) if signed_in?
29
33
 
30
- update_read_status
34
+ @new_post = messageboard.posts.build(postable: topic)
31
35
  end
32
36
 
33
37
  def search
34
- @topics = Topic.search(params[:q], messageboard)
35
- @decorated_topics = Thredded::UserTopicDecorator
36
- .decorate_all(thredded_current_user, @topics)
37
- flash.now[:notice] = "Search Results for '#{params[:q]}'"
38
+ @query = params[:q].to_s
39
+ @topics = Thredded::TopicsPageView.new(
40
+ thredded_current_user,
41
+ (messageboard_or_nil ? messageboard.topics : Topic)
42
+ .search_query(@query)
43
+ .order_recently_updated_first
44
+ .includes(:categories, :last_user, :user)
45
+ .page(current_page))
38
46
  end
39
47
 
40
48
  def new
@@ -43,16 +51,14 @@ module Thredded
43
51
  end
44
52
 
45
53
  def category
54
+ authorize_reading messageboard
46
55
  @category = messageboard.categories.friendly.find(params[:category_id])
47
- @topics = @category
48
- .topics
49
- .unstuck
50
- .order_by_updated_time
51
- .on_page(current_page)
52
- .load
53
- @decorated_topics = Thredded::UserTopicDecorator
54
- .decorate_all(thredded_current_user, @topics)
55
-
56
+ @topics = Thredded::TopicsPageView.new(
57
+ thredded_current_user,
58
+ @category.topics
59
+ .unstuck
60
+ .order_recently_updated_first
61
+ .page(current_page))
56
62
  render :index
57
63
  end
58
64
 
@@ -67,37 +73,30 @@ module Thredded
67
73
  end
68
74
 
69
75
  def edit
70
- authorize! :update, topic
76
+ authorize topic, :update?
71
77
  end
72
78
 
73
79
  def update
74
- topic.update_attributes!(topic_params.merge(last_user_id: thredded_current_user.id))
75
- redirect_to messageboard_topic_posts_url(messageboard, topic), flash: { notice: 'Topic updated' }
80
+ authorize topic, :update?
81
+ if topic.update(topic_params.merge(last_user_id: thredded_current_user.id))
82
+ redirect_to messageboard_topic_url(messageboard, topic),
83
+ notice: t('thredded.topics.updated_notice')
84
+ else
85
+ render :edit
86
+ end
76
87
  end
77
88
 
78
89
  def destroy
79
- authorize! :destroy, topic
90
+ authorize topic, :destroy?
80
91
  topic.destroy!
81
- redirect_to messageboard_topics_path(messageboard), flash: { notice: 'Topic deleted' }
92
+ redirect_to messageboard_topics_path(messageboard),
93
+ notice: t('thredded.topics.deleted_notice')
82
94
  end
83
95
 
84
96
  private
85
97
 
86
- def initialize_new_topic
87
- TopicForm.new(messageboard: messageboard, user: thredded_current_user)
88
- end
89
-
90
98
  def topic
91
- @topic ||= messageboard.topics.find_by_slug_with_user_topic_reads!(params[:id])
92
- end
93
-
94
- def topics
95
- messageboard
96
- .topics
97
- .includes(:user_topic_reads, :categories, :last_user, :user)
98
- .order_by_stuck_and_updated_time
99
- .on_page(current_page)
100
- .load
99
+ @topic ||= messageboard.topics.find_by_slug!(params[:id])
101
100
  end
102
101
 
103
102
  def topic_params
@@ -118,36 +117,8 @@ module Thredded
118
117
  )
119
118
  end
120
119
 
121
- def topics_by_category(category_id)
122
- messageboard.categories.friendly.find(category_id)
123
- .topics
124
- .unstuck
125
- .order_by_updated
126
- .on_page(current_page)
127
- .load
128
- end
129
-
130
120
  def current_page
131
- params[:page] || 1
132
- end
133
-
134
- def user_topic
135
- @user_topic ||= UserTopicDecorator.new(thredded_current_user, topic)
136
- end
137
-
138
- def update_read_status
139
- return if thredded_current_user.thredded_anonymous?
140
-
141
- read_history = UserTopicRead.where(
142
- user_id: thredded_current_user,
143
- topic: topic,
144
- ).first_or_initialize
145
-
146
- read_history.update_attributes(
147
- farthest_post: @posts.last,
148
- posts_count: topic.posts_count,
149
- page: current_page,
150
- )
121
+ (params[:page] || 1).to_i
151
122
  end
152
123
  end
153
124
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Thredded
2
3
  class PrivateTopicForm
3
4
  include ActiveModel::Model
@@ -30,14 +31,6 @@ module Thredded
30
31
  Thredded::PrivateTopic.model_name
31
32
  end
32
33
 
33
- def users
34
- @user.thredded_can_message_users
35
- end
36
-
37
- def users_for_select
38
- (users - [@user]).map { |user| [user.to_s, user.id] }
39
- end
40
-
41
34
  def id
42
35
  private_topic.id
43
36
  end
@@ -66,19 +59,6 @@ module Thredded
66
59
  user: non_null_user)
67
60
  end
68
61
 
69
- def users_selected_options
70
- { selected: private_user_ids }
71
- end
72
-
73
- def users_select_html_options
74
- {
75
- multiple: true,
76
- required: true,
77
- 'data-placeholder' => 'select users to participate in this topic',
78
- 'data-thredded-users-select' => true
79
- }
80
- end
81
-
82
62
  private
83
63
 
84
64
  def topic_categories
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Thredded
2
3
  class TopicForm
3
4
  include ActiveModel::Model
@@ -26,11 +27,7 @@ module Thredded
26
27
  end
27
28
 
28
29
  def category_options
29
- topic.messageboard.decorate.category_options
30
- end
31
-
32
- def filter
33
- topic.messageboard.filter
30
+ categories.map { |cat| [cat.name, cat.id] }
34
31
  end
35
32
 
36
33
  def save
@@ -58,8 +55,7 @@ module Thredded
58
55
  @post ||= topic.posts.build(
59
56
  content: content,
60
57
  user: non_null_user,
61
- messageboard: messageboard,
62
- filter: messageboard.filter
58
+ messageboard: messageboard
63
59
  )
64
60
  end
65
61