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,5 +0,0 @@
1
- jQuery(function($) {
2
- $('[data-thredded-users-select]').select2({
3
- dropdownCssClass: 'thredded--select2-drop'
4
- });
5
- });
@@ -1,53 +0,0 @@
1
- &--topic-navigation {
2
- @extend %thredded--list-unstyled;
3
- margin-bottom: 0;
4
- text-align: center;
5
-
6
- @include thredded-media-tablet-and-up {
7
- float: right;
8
-
9
- }
10
-
11
- li {
12
- display: inline-block;
13
- margin-right: $thredded-base-spacing;
14
-
15
- &:last-child {
16
- margin-right: 0;
17
- }
18
- }
19
-
20
- a {
21
- @extend %thredded--link;
22
- color: lighten($thredded-base-font-color, 10%);
23
- display: block;
24
- padding-bottom: $thredded-small-spacing;
25
-
26
- &:hover {
27
- color: $thredded-action-color;
28
- }
29
- }
30
- }
31
-
32
- .thredded--new-topic &--topic-navigation--public,
33
- .thredded--topics-index &--topic-navigation--public,
34
- .thredded--new-private-topic &--topic-navigation--private,
35
- .thredded--private-topics-index &--topic-navigation--private {
36
- border-bottom: 1px solid $thredded-action-color;
37
- margin-bottom: -2px;
38
-
39
- a {
40
- @extend %thredded--link;
41
- color: $thredded-action-color;
42
- }
43
- }
44
-
45
- &--topic-navigation--unread {
46
- background-color: $thredded-action-color;
47
- border-radius: 10px;
48
- color: #fff;
49
- font-size: 0.75rem; // 12px
50
- line-height: 1;
51
- margin-left: $thredded-small-spacing;
52
- padding: 2px 6px;
53
- }
@@ -1,22 +0,0 @@
1
- module Thredded
2
- class UserReadsPrivateTopic
3
- def initialize(private_topic, user)
4
- @private_topic = private_topic
5
- @user = user
6
- end
7
-
8
- def run
9
- private_user = Thredded::PrivateUser
10
- .find_by(private_topic_id: private_topic.id, user_id: user.id)
11
- private_user.update_attributes(read: true)
12
- end
13
-
14
- private
15
-
16
- attr_reader :private_topic, :user
17
-
18
- def messageboard
19
- private_topic.messageboard
20
- end
21
- end
22
- end
@@ -1,23 +0,0 @@
1
- module Thredded
2
- class UserResetsPrivateTopicToUnread
3
- def initialize(private_topic, user)
4
- @private_topic = private_topic
5
- @user = user
6
- end
7
-
8
- def run
9
- other_users = Thredded::PrivateUser
10
- .where(private_topic: private_topic)
11
- .where.not(user_id: user.id)
12
- other_users.update_all(read: false)
13
- end
14
-
15
- private
16
-
17
- attr_reader :private_topic, :user
18
-
19
- def messageboard
20
- private_topic.messageboard
21
- end
22
- end
23
- end
@@ -1,14 +0,0 @@
1
- module Thredded
2
- class BaseTopicDecorator < SimpleDelegator
3
- include Rails.application.routes.url_helpers
4
- include ActionView::Helpers::UrlHelper
5
-
6
- def slug
7
- __getobj__.slug.nil? ? id : __getobj__.slug
8
- end
9
-
10
- def original
11
- __getobj__
12
- end
13
- end
14
- end
@@ -1,63 +0,0 @@
1
- module Thredded
2
- class BaseUserTopicDecorator < SimpleDelegator
3
- extend ActiveModel::Naming
4
- include ActiveModel::Conversion
5
-
6
- class << self
7
- # @return [Class<ActiveRecord::Base>]
8
- def topic_class
9
- fail 'Implement in subclass'
10
- end
11
-
12
- def decorator_class
13
- "#{topic_class.name}Decorator".constantize
14
- end
15
-
16
- def decorate_all(user, topics)
17
- topics.map { |topic| new(user, topic) }
18
- end
19
-
20
- def model_name
21
- ActiveModel::Name.new(self, nil, topic_class.name.demodulize)
22
- end
23
- end
24
-
25
- def initialize(user, topic)
26
- @user = user || Thredded::NullUser.new
27
- @topic = self.class.decorator_class.new(topic)
28
- super(@topic)
29
- end
30
-
31
- def to_model
32
- topic
33
- end
34
-
35
- def persisted?
36
- false
37
- end
38
-
39
- def css_class
40
- [read_status_class, topic.css_class].map(&:presence).compact.join(' ')
41
- end
42
-
43
- def read_status_class
44
- if read?
45
- 'thredded--topic--read'
46
- else
47
- 'thredded--topic--unread'
48
- end
49
- end
50
-
51
- def read?
52
- fail 'Subclass responsibility'
53
- end
54
-
55
- def to_ary
56
- [self]
57
- end
58
-
59
- private
60
-
61
- attr_reader :topic, :user
62
- end
63
- end
@@ -1,41 +0,0 @@
1
- module Thredded
2
- class MessageboardDecorator < SimpleDelegator
3
- include ActionView::Helpers::NumberHelper
4
- include ActionView::Helpers::TagHelper
5
-
6
- def initialize(messageboard)
7
- super
8
- @messageboard = messageboard
9
- end
10
-
11
- def original
12
- messageboard
13
- end
14
-
15
- def meta
16
- topics_count = number_to_human(messageboard.topics_count)
17
- posts_count = number_to_human(messageboard.posts_count)
18
-
19
- "#{topics_count} topics / #{posts_count} posts".downcase
20
- end
21
-
22
- def latest_topic
23
- @latest_topic ||= begin
24
- messageboard.topics.order_latest_first.first ||
25
- Thredded::NullTopic.new
26
- end
27
- end
28
-
29
- def latest_user
30
- latest_topic.last_user
31
- end
32
-
33
- def category_options
34
- messageboard.categories.map { |cat| [cat.name, cat.id] }
35
- end
36
-
37
- private
38
-
39
- attr_reader :messageboard
40
- end
41
- end
@@ -1,40 +0,0 @@
1
- module Thredded
2
- class PostDecorator < SimpleDelegator
3
- attr_reader :post
4
-
5
- def initialize(post)
6
- super
7
- @post = post
8
- end
9
-
10
- def user_name
11
- if user
12
- user.to_s
13
- else
14
- 'Anonymous'
15
- end
16
- end
17
-
18
- def original
19
- post
20
- end
21
-
22
- def avatar_url
23
- super.sub(/\Ahttp:/, '')
24
- end
25
-
26
- def to_ary
27
- [self]
28
- end
29
-
30
- private
31
-
32
- def created_at_str
33
- created_at.getutc.to_s
34
- end
35
-
36
- def created_at_utc
37
- created_at.getutc.iso8601
38
- end
39
- end
40
- end
@@ -1,23 +0,0 @@
1
- require 'thredded/base_topic_decorator'
2
-
3
- module Thredded
4
- class PrivateTopicDecorator < SimpleDelegator
5
- def initialize(private_topic)
6
- super Thredded::BaseTopicDecorator.new(private_topic)
7
- end
8
-
9
- def self.model_name
10
- ActiveModel::Name.new(self, nil, 'PrivateTopic')
11
- end
12
-
13
- def to_model
14
- __getobj__
15
- end
16
-
17
- def css_class
18
- classes = []
19
- classes << 'thredded--private-topic'
20
- classes.join(' ')
21
- end
22
- end
23
- end
@@ -1,25 +0,0 @@
1
- require 'thredded/base_topic_decorator'
2
-
3
- module Thredded
4
- class TopicDecorator < SimpleDelegator
5
- def initialize(private_topic)
6
- super(Thredded::BaseTopicDecorator.new(private_topic))
7
- end
8
-
9
- def self.model_name
10
- ActiveModel::Name.new(self, nil, 'Topic')
11
- end
12
-
13
- def css_class
14
- classes = []
15
- classes << 'thredded--topic--locked' if locked?
16
- classes << 'thredded--topic--sticky' if sticky?
17
- classes += ['thredded--topic--category'] + categories.map { |c| "thredded--topic--category--#{c.name}" } if categories.present?
18
- classes.join(' ')
19
- end
20
-
21
- def category_options
22
- messageboard.decorate.category_options
23
- end
24
- end
25
- end
@@ -1,13 +0,0 @@
1
- require 'thredded/base_user_topic_decorator'
2
-
3
- module Thredded
4
- class UserPrivateTopicDecorator < BaseUserTopicDecorator
5
- def self.topic_class
6
- PrivateTopic
7
- end
8
-
9
- def read?
10
- topic.private_users.find_by(user: user).try(:read?)
11
- end
12
- end
13
- end
@@ -1,37 +0,0 @@
1
- require 'thredded/base_user_topic_decorator'
2
-
3
- module Thredded
4
- class UserTopicDecorator < BaseUserTopicDecorator
5
- def self.topic_class
6
- Topic
7
- end
8
-
9
- def farthest_page
10
- read_status.page
11
- end
12
-
13
- def farthest_post
14
- read_status.farthest_post
15
- end
16
-
17
- def read?
18
- topic.posts_count == read_status.posts_count
19
- end
20
-
21
- private
22
-
23
- def read_status
24
- if user.id > 0
25
- @read_status ||= topic.user_topic_reads.select do |reads|
26
- reads.user_id == user.id
27
- end
28
- end
29
-
30
- if @read_status.blank?
31
- Thredded::NullTopicRead.new
32
- else
33
- @read_status.first
34
- end
35
- end
36
- end
37
- end
@@ -1,60 +0,0 @@
1
- module Thredded
2
- class Ability
3
- include ::CanCan::Ability
4
-
5
- def initialize(user)
6
- user ||= Thredded::NullUser.new
7
- user_details = user.thredded_user_detail
8
-
9
- can :manage, :all if user.thredded_admin?
10
-
11
- can :read, Thredded::Messageboard do |messageboard|
12
- Thredded::MessageboardUserPermissions.new(messageboard, user).readable?
13
- end
14
-
15
- can :admin, Thredded::Topic do |topic|
16
- Thredded::TopicUserPermissions.new(topic, user, user_details).adminable?
17
- end
18
-
19
- can :edit, Thredded::Topic do |topic|
20
- Thredded::TopicUserPermissions.new(topic, user, user_details).editable?
21
- end
22
-
23
- can :update, Thredded::Topic do |topic|
24
- Thredded::TopicUserPermissions.new(topic, user, user_details).editable?
25
- end
26
-
27
- can :read, Thredded::Topic do |topic|
28
- Thredded::TopicUserPermissions.new(topic, user, user_details).readable?
29
- end
30
-
31
- can :create, Thredded::Topic do |topic|
32
- Thredded::TopicUserPermissions.new(topic, user, user_details).creatable?
33
- end
34
-
35
- can :manage, Thredded::PrivateTopic do |private_topic|
36
- Thredded::PrivateTopicUserPermissions.new(private_topic, user, user_details).manageable?
37
- end
38
-
39
- can :create, Thredded::PrivateTopic do |private_topic|
40
- Thredded::PrivateTopicUserPermissions.new(private_topic, user, user_details).creatable?
41
- end
42
-
43
- can :read, Thredded::PrivateTopic do |private_topic|
44
- Thredded::PrivateTopicUserPermissions.new(private_topic, user, user_details).readable?
45
- end
46
-
47
- can :edit, Thredded::Post do |post|
48
- Thredded::PostUserPermissions.new(post, user, user_details).editable?
49
- end
50
-
51
- can :manage, Thredded::Post do |post|
52
- Thredded::PostUserPermissions.new(post, user, user_details).manageable?
53
- end
54
-
55
- can :create, Thredded::Post do |post|
56
- Thredded::PostUserPermissions.new(post, user, user_details).creatable?
57
- end
58
- end
59
- end
60
- end
@@ -1,17 +0,0 @@
1
- module Thredded
2
- class NotificationPreference < ActiveRecord::Base
3
- belongs_to :user
4
- belongs_to :messageboard
5
-
6
- validates :user_id, presence: true
7
- validates :messageboard_id, presence: true
8
-
9
- def self.for(user)
10
- where(user_id: user.id)
11
- end
12
-
13
- def self.in(messageboard)
14
- where(messageboard_id: messageboard.id)
15
- end
16
- end
17
- end