thredded 0.4.0 → 0.5.0

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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.mkdn +26 -0
  3. data/README.mkdn +52 -7
  4. data/app/assets/images/thredded/moderation.svg +4 -0
  5. data/app/assets/images/thredded/private-messages.svg +1 -1
  6. data/app/assets/images/thredded/settings.svg +1 -1
  7. data/app/assets/stylesheets/thredded/_base.scss +1 -1
  8. data/app/assets/stylesheets/thredded/_thredded.scss +1 -0
  9. data/app/assets/stylesheets/thredded/base/_buttons.scss +16 -0
  10. data/app/assets/stylesheets/thredded/base/_grid.scss +12 -0
  11. data/app/assets/stylesheets/thredded/components/_base.scss +4 -0
  12. data/app/assets/stylesheets/thredded/components/_messageboard.scss +1 -13
  13. data/app/assets/stylesheets/thredded/components/_topic-header.scss +27 -0
  14. data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +1 -1
  15. data/app/assets/stylesheets/thredded/layout/_moderation.scss +45 -0
  16. data/app/assets/stylesheets/thredded/layout/_navigation.scss +20 -6
  17. data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +2 -2
  18. data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +5 -3
  19. data/app/commands/thredded/autofollow_mentioned_users.rb +32 -0
  20. data/app/commands/thredded/moderate_post.rb +35 -0
  21. data/app/commands/thredded/notify_following_users.rb +18 -0
  22. data/app/commands/thredded/notify_private_topic_users.rb +4 -4
  23. data/app/controllers/thredded/application_controller.rb +6 -25
  24. data/app/controllers/thredded/messageboards_controller.rb +5 -3
  25. data/app/controllers/thredded/moderation_controller.rb +56 -0
  26. data/app/controllers/thredded/post_permalinks_controller.rb +1 -1
  27. data/app/controllers/thredded/posts_controller.rb +4 -2
  28. data/app/controllers/thredded/private_post_permalinks_controller.rb +1 -1
  29. data/app/controllers/thredded/private_topics_controller.rb +2 -3
  30. data/app/controllers/thredded/theme_previews_controller.rb +3 -3
  31. data/app/controllers/thredded/topics_controller.rb +32 -11
  32. data/app/forms/thredded/topic_form.rb +1 -0
  33. data/app/helpers/thredded/application_helper.rb +26 -1
  34. data/app/helpers/thredded/urls_helper.rb +7 -5
  35. data/app/jobs/thredded/auto_follow_and_notify_job.rb +13 -0
  36. data/app/jobs/thredded/notify_private_topic_users_job.rb +3 -4
  37. data/app/mailer_previews/thredded/post_mailer_preview.rb +2 -2
  38. data/app/mailers/thredded/post_mailer.rb +2 -2
  39. data/app/models/concerns/thredded/content_moderation_state.rb +53 -0
  40. data/app/models/concerns/thredded/moderation_state.rb +13 -0
  41. data/app/models/concerns/thredded/post_common.rb +6 -71
  42. data/app/models/concerns/thredded/topic_common.rb +26 -11
  43. data/app/models/concerns/thredded/user_topic_read_state_common.rb +4 -0
  44. data/app/models/thredded/messageboard.rb +2 -0
  45. data/app/models/thredded/post.rb +24 -0
  46. data/app/models/thredded/post_moderation_record.rb +45 -0
  47. data/app/models/thredded/private_post.rb +15 -0
  48. data/app/models/thredded/private_topic.rb +8 -0
  49. data/app/models/thredded/topic.rb +39 -0
  50. data/app/models/thredded/user_detail.rb +11 -0
  51. data/app/models/thredded/user_extender.rb +14 -0
  52. data/app/models/thredded/user_topic_follow.rb +20 -0
  53. data/app/policies/thredded/messageboard_policy.rb +15 -0
  54. data/app/policies/thredded/post_policy.rb +17 -1
  55. data/app/policies/thredded/private_post_policy.rb +1 -1
  56. data/app/policies/thredded/private_topic_policy.rb +1 -1
  57. data/app/policies/thredded/topic_policy.rb +18 -1
  58. data/app/view_models/thredded/base_topic_view.rb +0 -13
  59. data/app/view_models/thredded/post_view.rb +8 -1
  60. data/app/view_models/thredded/posts_page_view.rb +6 -8
  61. data/app/view_models/thredded/private_topic_view.rb +8 -0
  62. data/app/view_models/thredded/private_topics_page_view.rb +24 -0
  63. data/app/view_models/thredded/topic_posts_page_view.rb +17 -0
  64. data/app/view_models/thredded/topic_view.rb +27 -1
  65. data/app/view_models/thredded/topics_page_view.rb +2 -4
  66. data/app/views/thredded/moderation/_post.html.erb +7 -0
  67. data/app/views/thredded/moderation/_post_moderation_actions.html.erb +12 -0
  68. data/app/views/thredded/moderation/_post_moderation_record.html.erb +43 -0
  69. data/app/views/thredded/moderation/history.html.erb +19 -0
  70. data/app/views/thredded/moderation/pending.html.erb +29 -0
  71. data/app/views/thredded/post_mailer/{at_notification.html.erb → post_notification.html.erb} +1 -1
  72. data/app/views/thredded/post_mailer/{at_notification.text.erb → post_notification.text.erb} +1 -1
  73. data/app/views/thredded/posts/_post.html.erb +8 -1
  74. data/app/views/thredded/posts_common/_actions.html.erb +11 -0
  75. data/app/views/thredded/posts_common/_content.html.erb +5 -0
  76. data/app/views/thredded/posts_common/_header.html.erb +5 -0
  77. data/app/views/thredded/private_posts/_private_post.html.erb +5 -1
  78. data/app/views/thredded/shared/_nav.html.erb +1 -0
  79. data/app/views/thredded/shared/_page.html.erb +1 -1
  80. data/app/views/thredded/shared/nav/_moderation.html.erb +13 -0
  81. data/app/views/thredded/shared/nav/_private_topics.html.erb +1 -2
  82. data/app/views/thredded/topics/_header.html.erb +15 -0
  83. data/app/views/thredded/topics/index.html.erb +2 -2
  84. data/app/views/thredded/topics/new.html.erb +1 -1
  85. data/config/locales/en.yml +26 -5
  86. data/config/locales/pt-BR.yml +23 -0
  87. data/config/routes.rb +7 -0
  88. data/db/migrate/20160329231848_create_thredded.rb +40 -5
  89. data/db/seeds.rb +5 -5
  90. data/db/upgrade_migrations/20160429222452_upgrade_v0_3_to_v0_4.rb +1 -2
  91. data/db/upgrade_migrations/20160501151908_upgrade_v0_4_to_v0_5.rb +56 -0
  92. data/heroku.gemfile.lock +20 -18
  93. data/lib/generators/thredded/install/templates/initializer.rb +15 -0
  94. data/lib/html/pipeline/at_mention_filter.rb +5 -2
  95. data/lib/thredded.rb +4 -0
  96. data/lib/thredded/at_users.rb +3 -2
  97. data/lib/thredded/content_formatter.rb +81 -0
  98. data/lib/thredded/version.rb +1 -1
  99. metadata +28 -10
  100. data/app/commands/thredded/notify_mentioned_users.rb +0 -55
  101. data/app/jobs/thredded/at_notifier_job.rb +0 -12
  102. data/app/mailer_previews/thredded/private_post_mailer_preview.rb +0 -12
  103. data/app/mailers/thredded/private_post_mailer.rb +0 -17
  104. data/app/views/thredded/posts_common/_post.html.erb +0 -26
  105. data/app/views/thredded/private_post_mailer/at_notification.html.erb +0 -13
data/db/seeds.rb CHANGED
@@ -15,8 +15,8 @@ module Thredded
15
15
  attr_reader :user, :users, :messageboard, :topics, :private_topics, :posts
16
16
 
17
17
  SKIP_CALLBACKS = [
18
- [Thredded::Post, :commit, :after, :notify_at_users],
19
- [Thredded::PrivatePost, :commit, :after, :notify_at_users],
18
+ [Thredded::Post, :commit, :after, :auto_follow_and_notify],
19
+ [Thredded::PrivatePost, :commit, :after, :notify_users],
20
20
  ].freeze
21
21
 
22
22
  def self.run(users: 200, topics: 55, posts: (1..60))
@@ -44,12 +44,12 @@ module Thredded
44
44
  end
45
45
 
46
46
  def create_first_user
47
- @user ||= ::User.first || ::User.create(name: 'Joe', email: 'joe@example.com')
47
+ @user ||= ::User.first || FactoryGirl.create(:user, :approved, :admin, name: 'Joe', email: 'joe@example.com')
48
48
  end
49
49
 
50
- def create_users(count: 5)
50
+ def create_users(count:)
51
51
  log "Creating #{count} users..."
52
- @users = [user] + FactoryGirl.create_list(:user, count)
52
+ @users = [user] + FactoryGirl.create_list(:user, count, *(%i(approved) if rand > 0.1))
53
53
  end
54
54
 
55
55
  def create_messageboard
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
-
3
- class UpgradeV03ToV04 < ActiveRecord::Migration[5.0]
2
+ class UpgradeV03ToV04 < ActiveRecord::Migration
4
3
  def up
5
4
  create_table :thredded_messageboard_groups do |t|
6
5
  t.string :name
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ # rubocop:disable Metrics/MethodLength
3
+ class UpgradeV04ToV05 < ActiveRecord::Migration
4
+ def change
5
+ # Topic following
6
+ create_table :thredded_user_topic_follows do |t|
7
+ t.integer :user_id, null: false
8
+ t.integer :topic_id, null: false
9
+ t.datetime :created_at, null: false
10
+ t.integer :reason, limit: 1
11
+ t.index [:user_id, :topic_id], name: :thredded_user_topic_follows_user_topic, unique: true
12
+ end
13
+
14
+ # Moderation
15
+ change_table :thredded_posts, bulk: true do |t|
16
+ t.integer :moderation_state, null: false, default: 1
17
+ t.index [:moderation_state, :updated_at],
18
+ order: { updated_at: :asc },
19
+ name: :index_thredded_posts_for_display
20
+ end
21
+ change_column_default :thredded_posts, :moderation_state, from: 1, to: nil
22
+
23
+ change_table :thredded_topics, bulk: true do |t|
24
+ t.integer :moderation_state, null: false, default: 1
25
+ t.index %i(moderation_state sticky updated_at),
26
+ order: { sticky: :desc, updated_at: :desc },
27
+ name: :index_thredded_topics_for_display
28
+ end
29
+ change_column_default :thredded_topics, :moderation_state, from: 1, to: nil
30
+
31
+ change_table :thredded_user_details do |t|
32
+ t.integer :moderation_state, null: false, default: 1
33
+ t.timestamp :moderation_state_changed_at
34
+ t.index %i(moderation_state moderation_state_changed_at),
35
+ order: { moderation_state_changed_at: :desc },
36
+ name: :index_thredded_user_details_for_moderations
37
+ end
38
+ change_column_default :thredded_user_details, :moderation_state, from: 1, to: 0 # pending_moderation
39
+
40
+ create_table :thredded_post_moderation_records do |t|
41
+ t.references :post
42
+ t.references :messageboard
43
+ t.text :post_content, limit: 65_535
44
+ t.references :post_user
45
+ t.text :post_user_name
46
+ t.references :moderator
47
+ t.integer :moderation_state, null: false
48
+ t.integer :previous_moderation_state, null: false
49
+ t.timestamp :created_at, null: false
50
+ t.index [:messageboard_id, :created_at],
51
+ order: { created_at: :desc },
52
+ name: :index_thredded_moderation_records_for_display
53
+ end
54
+ end
55
+ end
56
+ # rubocop:enable Metrics/MethodLength
data/heroku.gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/amatsuda/kaminari
3
- revision: 9c44b6461f00471886caff921feea36f29dbb06d
3
+ revision: f93231e6e7624dde21b528726ec471029ffb8b02
4
4
  specs:
5
5
  kaminari (1.0.0.alpha)
6
6
  actionpack (>= 3.0.0)
@@ -17,7 +17,7 @@ GIT
17
17
  PATH
18
18
  remote: .
19
19
  specs:
20
- thredded (0.4.0)
20
+ thredded (0.5.0)
21
21
  active_record_union (>= 1.1.1)
22
22
  autoprefixer-rails
23
23
  autosize-rails
@@ -86,7 +86,7 @@ GEM
86
86
  tzinfo (~> 1.1)
87
87
  addressable (2.4.0)
88
88
  arel (7.0.0)
89
- autoprefixer-rails (6.3.6)
89
+ autoprefixer-rails (6.3.6.2)
90
90
  execjs
91
91
  autosize-rails (1.18.17)
92
92
  rails (>= 3.1)
@@ -109,7 +109,7 @@ GEM
109
109
  db_text_search (0.2.0)
110
110
  activerecord (>= 4.1.15, < 6.0)
111
111
  erubis (2.7.0)
112
- execjs (2.6.0)
112
+ execjs (2.7.0)
113
113
  factory_girl (4.7.0)
114
114
  activesupport (>= 3.0.0)
115
115
  factory_girl_rails (4.7.0)
@@ -128,12 +128,12 @@ GEM
128
128
  nokogiri (>= 1.4)
129
129
  html-pipeline-vimeo (0.1.1)
130
130
  html-pipeline (~> 2.0)
131
- html-pipeline-youtube (0.1.2)
131
+ html-pipeline-youtube (0.1.3)
132
132
  html-pipeline (~> 2.0)
133
133
  htmlentities (4.3.4)
134
134
  http_accept_language (2.0.5)
135
135
  i18n (0.7.0)
136
- inline_svg (0.7.0)
136
+ inline_svg (0.8.0)
137
137
  activesupport (>= 4.0.4)
138
138
  loofah (>= 2.0)
139
139
  nokogiri (~> 1.6)
@@ -151,25 +151,27 @@ GEM
151
151
  mail (2.6.4)
152
152
  mime-types (>= 1.16, < 4)
153
153
  method_source (0.8.2)
154
- mime-types (3.0)
154
+ mime-types (3.1)
155
155
  mime-types-data (~> 3.2015)
156
- mime-types-data (3.2016.0221)
157
- mini_portile2 (2.0.0)
158
- minitest (5.8.4)
159
- multi_json (1.12.0)
156
+ mime-types-data (3.2016.0521)
157
+ mini_portile2 (2.1.0)
158
+ minitest (5.9.0)
159
+ multi_json (1.12.1)
160
160
  newrelic_rpm (3.15.2.317)
161
161
  nio4r (1.2.1)
162
- nokogiri (1.6.7.2)
163
- mini_portile2 (~> 2.0.0.rc2)
162
+ nokogiri (1.6.8)
163
+ mini_portile2 (~> 2.1.0)
164
+ pkg-config (~> 1.1.7)
164
165
  nokogumbo (1.4.7)
165
166
  nokogiri
166
167
  pg (0.18.4)
168
+ pkg-config (1.1.7)
167
169
  puma (3.4.0)
168
170
  pundit (1.1.0)
169
171
  activesupport (>= 3.0.0)
170
172
  rack (2.0.0.rc1)
171
173
  json
172
- rack-canonical-host (0.2.1)
174
+ rack-canonical-host (0.2.2)
173
175
  addressable (> 0, < 3)
174
176
  rack (>= 1.0.0, < 3)
175
177
  rack-test (0.6.3)
@@ -215,8 +217,8 @@ GEM
215
217
  rb-gravatar (1.0.5)
216
218
  ref (2.0.0)
217
219
  request_store (1.3.1)
218
- rinku (1.7.3)
219
- rollbar (2.11.3)
220
+ rinku (2.0.0)
221
+ rollbar (2.11.5)
220
222
  multi_json
221
223
  sanitize (4.0.1)
222
224
  crass (~> 1.0.2)
@@ -247,12 +249,12 @@ GEM
247
249
  ref
248
250
  thor (0.19.1)
249
251
  thread_safe (0.3.5)
250
- tilt (2.0.3)
252
+ tilt (2.0.5)
251
253
  turbolinks (2.5.3)
252
254
  coffee-rails
253
255
  tzinfo (1.2.2)
254
256
  thread_safe (~> 0.1)
255
- websocket-driver (0.6.3)
257
+ websocket-driver (0.6.4)
256
258
  websocket-extensions (>= 0.1.0)
257
259
  websocket-extensions (0.1.2)
258
260
 
@@ -34,6 +34,9 @@ Thredded.moderator_column = :admin
34
34
  # The name of the admin flag column on the users table.
35
35
  Thredded.admin_column = :admin
36
36
 
37
+ # Whether posts and topics pending moderation are visible to regular users.
38
+ Thredded.content_visible_while_pending_moderation = true
39
+
37
40
  # This model can be customized further by overriding a handful of methods on the User model.
38
41
  # For more information, see app/models/thredded/user_extender.rb.
39
42
 
@@ -54,6 +57,18 @@ Thredded.admin_column = :admin
54
57
  # Set the layout for rendering the thredded views.
55
58
  Thredded.layout = 'thredded/application'
56
59
 
60
+ # ==> Post Content Formatting
61
+ # Customize the way Thredded handles post formatting.
62
+
63
+ # Change the default html-pipeline filters used by thredded.
64
+ # E.g. to remove BBCode support:
65
+ # Thredded::ContentFormatter.pipeline_filters -= [HTML::Pipeline::BbcodeFilter]
66
+
67
+ # Change the HTML sanitization settings used by Thredded.
68
+ # See the Sanitize docs for more information on the underlying library: https://github.com/rgrove/sanitize/#readme
69
+ # E.g. to allow a custom element <custom-element>:
70
+ # Thredded::ContentFormatter.whitelist[:elements] += %w(custom-element)
71
+
57
72
  # ==> Error Handling
58
73
  # By default Thredded just renders a flash alert on errors such as Topic not found, or Login required.
59
74
  # Below is an example of overriding the default behavior on LoginRequired:
@@ -4,15 +4,18 @@ require 'thredded/at_users'
4
4
  module HTML
5
5
  class Pipeline
6
6
  class AtMentionFilter < Filter
7
+ # @param context [Hash]
8
+ # @options context :users_provider [#call(usernames)] given usernames, returns a list of users.
7
9
  def initialize(text, context = nil, result = nil)
8
10
  super text, context, result
9
11
  @text = text.to_s.delete("\r")
10
- @post = context[:post]
12
+ @users_provider = context[:users_provider]
11
13
  @view_context = context[:view_context]
12
14
  end
13
15
 
14
16
  def call
15
- html = Thredded::AtUsers.render(@text, @post, @view_context)
17
+ return html unless @users_provider
18
+ html = Thredded::AtUsers.render(@text, @users_provider, @view_context)
16
19
  html.rstrip!
17
20
  html
18
21
  end
data/lib/thredded.rb CHANGED
@@ -46,6 +46,9 @@ module Thredded
46
46
  # @return [Symbol] The name of the admin flag column on the users table for the default permissions model
47
47
  mattr_accessor :admin_column
48
48
 
49
+ # @return [Boolean] Whether posts that are pending moderation are visible to regular users.
50
+ mattr_accessor :content_visible_while_pending_moderation
51
+
49
52
  self.active_user_threshold = 5.minutes
50
53
  self.admin_column = :admin
51
54
  self.avatar_url = ->(user) { Gravatar.src(user.email, 128, 'mm') }
@@ -53,6 +56,7 @@ module Thredded
53
56
  self.layout = 'thredded/application'
54
57
  self.moderator_column = :admin
55
58
  self.user_name_column = :name
59
+ self.content_visible_while_pending_moderation = true
56
60
 
57
61
  # @return [Class<Thredded::UserExtender>] the user class from the host application.
58
62
  def self.user_class
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
  module Thredded
3
3
  class AtUsers
4
- def self.render(content, post, view_context)
4
+ # @param users_provider [#call(usernames)] given usernames, returns a list of users.
5
+ def self.render(content, users_provider, view_context)
5
6
  at_names = AtNotificationExtractor.new(content).run
6
7
 
7
8
  if at_names.any?
8
- members = post.readers_from_user_names(at_names)
9
+ members = users_provider.call(at_names)
9
10
 
10
11
  members.each do |member|
11
12
  member_path = Thredded.user_path(view_context, member)
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ module Thredded
3
+ # Generates HTML from content source.
4
+ class ContentFormatter
5
+ # Sanitization whitelist options.
6
+ mattr_accessor :whitelist
7
+
8
+ self.whitelist = HTML::Pipeline::SanitizationFilter::WHITELIST.deep_merge(
9
+ elements: HTML::Pipeline::SanitizationFilter::WHITELIST[:elements] + %w(iframe span figure figcaption),
10
+ transformers: HTML::Pipeline::SanitizationFilter::WHITELIST[:transformers] + [
11
+ lambda do |env|
12
+ node = env[:node]
13
+
14
+ a_tags = node.css('a')
15
+ a_tags.each do |a_tag|
16
+ a_tag['href'] ||= '#'
17
+ if a_tag['href'].starts_with? 'http'
18
+ a_tag['target'] = '_blank'
19
+ a_tag['rel'] = 'nofollow noopener'
20
+ end
21
+ end
22
+ end
23
+ ],
24
+ attributes: {
25
+ 'a' => %w(href rel),
26
+ 'iframe' => %w(src width height frameborder allowfullscreen sandbox seamless),
27
+ 'span' => %w(class),
28
+ },
29
+ add_attributes: {
30
+ 'iframe' => {
31
+ 'seamless' => 'seamless',
32
+ 'sandbox' => 'allow-same-origin allow-scripts allow-forms',
33
+ }
34
+ }
35
+ )
36
+
37
+ # HTML::Pipeline filters.
38
+ mattr_accessor :pipeline_filters
39
+
40
+ self.pipeline_filters = [
41
+ HTML::Pipeline::VimeoFilter,
42
+ HTML::Pipeline::YoutubeFilter,
43
+ HTML::Pipeline::BbcodeFilter,
44
+ HTML::Pipeline::MarkdownFilter,
45
+ HTML::Pipeline::SanitizationFilter,
46
+ HTML::Pipeline::AtMentionFilter,
47
+ HTML::Pipeline::EmojiFilter,
48
+ HTML::Pipeline::AutolinkFilter,
49
+ ].freeze
50
+
51
+ # @param view_context [Object] the context of the rendering view.
52
+ # @param pipeline_options [Hash]
53
+ def initialize(view_context, pipeline_options = {})
54
+ @view_context = view_context
55
+ @pipeline_options = pipeline_options
56
+ end
57
+
58
+ # @param content [String]
59
+ # @return [String] formatted and sanitized html-safe content.
60
+ def format_content(content)
61
+ pipeline = HTML::Pipeline.new(content_pipeline_filters, content_pipeline_options.merge(@pipeline_options))
62
+ result = pipeline.call(content, view_context: @view_context)
63
+ result[:output].to_s.html_safe
64
+ end
65
+
66
+ protected
67
+
68
+ # @return [Array<HTML::Pipeline::Filter]>]
69
+ def content_pipeline_filters
70
+ ContentFormatter.pipeline_filters
71
+ end
72
+
73
+ # @return [Hash] options for HTML::Pipeline.new
74
+ def content_pipeline_options
75
+ {
76
+ asset_root: Rails.application.config.action_controller.asset_host || '',
77
+ whitelist: ContentFormatter.whitelist
78
+ }
79
+ end
80
+ end
81
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Thredded
3
- VERSION = '0.4.0'
3
+ VERSION = '0.5.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thredded
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Oliveira
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-05-20 00:00:00.000000000 Z
12
+ date: 2016-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bbcoder
@@ -626,6 +626,7 @@ files:
626
626
  - Procfile
627
627
  - README.mkdn
628
628
  - app/assets/images/thredded/breadcrumb-chevron.svg
629
+ - app/assets/images/thredded/moderation.svg
629
630
  - app/assets/images/thredded/private-messages.svg
630
631
  - app/assets/images/thredded/settings.svg
631
632
  - app/assets/javascripts/thredded.es6
@@ -670,20 +671,24 @@ files:
670
671
  - app/assets/stylesheets/thredded/components/_topics.scss
671
672
  - app/assets/stylesheets/thredded/layout/_main-container.scss
672
673
  - app/assets/stylesheets/thredded/layout/_main-navigation.scss
674
+ - app/assets/stylesheets/thredded/layout/_moderation.scss
673
675
  - app/assets/stylesheets/thredded/layout/_navigation.scss
674
676
  - app/assets/stylesheets/thredded/layout/_search-navigation.scss
675
677
  - app/assets/stylesheets/thredded/layout/_user-navigation.scss
676
678
  - app/assets/stylesheets/thredded/utilities/_is-compact.scss
677
679
  - app/assets/stylesheets/thredded/utilities/_is-expanded.scss
678
680
  - app/commands/thredded/at_notification_extractor.rb
681
+ - app/commands/thredded/autofollow_mentioned_users.rb
679
682
  - app/commands/thredded/members_marked_notified.rb
680
683
  - app/commands/thredded/messageboard_destroyer.rb
681
- - app/commands/thredded/notify_mentioned_users.rb
684
+ - app/commands/thredded/moderate_post.rb
685
+ - app/commands/thredded/notify_following_users.rb
682
686
  - app/commands/thredded/notify_private_topic_users.rb
683
687
  - app/controllers/thredded/application_controller.rb
684
688
  - app/controllers/thredded/autocomplete_users_controller.rb
685
689
  - app/controllers/thredded/messageboard_groups_controller.rb
686
690
  - app/controllers/thredded/messageboards_controller.rb
691
+ - app/controllers/thredded/moderation_controller.rb
687
692
  - app/controllers/thredded/post_permalinks_controller.rb
688
693
  - app/controllers/thredded/posts_controller.rb
689
694
  - app/controllers/thredded/preferences_controller.rb
@@ -697,17 +702,17 @@ files:
697
702
  - app/helpers/thredded/application_helper.rb
698
703
  - app/helpers/thredded/urls_helper.rb
699
704
  - app/jobs/thredded/activity_updater_job.rb
700
- - app/jobs/thredded/at_notifier_job.rb
705
+ - app/jobs/thredded/auto_follow_and_notify_job.rb
701
706
  - app/jobs/thredded/notify_private_topic_users_job.rb
702
707
  - app/mailer_previews/thredded/base_mailer_preview.rb
703
708
  - app/mailer_previews/thredded/post_mailer_preview.rb
704
- - app/mailer_previews/thredded/private_post_mailer_preview.rb
705
709
  - app/mailer_previews/thredded/private_topic_mailer_preview.rb
706
710
  - app/mailers/thredded/base_mailer.rb
707
711
  - app/mailers/thredded/post_mailer.rb
708
- - app/mailers/thredded/private_post_mailer.rb
709
712
  - app/mailers/thredded/private_topic_mailer.rb
713
+ - app/models/concerns/thredded/content_moderation_state.rb
710
714
  - app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb
715
+ - app/models/concerns/thredded/moderation_state.rb
711
716
  - app/models/concerns/thredded/post_common.rb
712
717
  - app/models/concerns/thredded/topic_common.rb
713
718
  - app/models/concerns/thredded/user_topic_read_state_common.rb
@@ -719,6 +724,7 @@ files:
719
724
  - app/models/thredded/null_user.rb
720
725
  - app/models/thredded/null_user_topic_read_state.rb
721
726
  - app/models/thredded/post.rb
727
+ - app/models/thredded/post_moderation_record.rb
722
728
  - app/models/thredded/post_notification.rb
723
729
  - app/models/thredded/private_post.rb
724
730
  - app/models/thredded/private_topic.rb
@@ -739,6 +745,7 @@ files:
739
745
  - app/models/thredded/user_permissions/write/none.rb
740
746
  - app/models/thredded/user_preference.rb
741
747
  - app/models/thredded/user_private_topic_read_state.rb
748
+ - app/models/thredded/user_topic_follow.rb
742
749
  - app/models/thredded/user_topic_read_state.rb
743
750
  - app/policies/thredded/messageboard_group_policy.rb
744
751
  - app/policies/thredded/messageboard_policy.rb
@@ -751,7 +758,9 @@ files:
751
758
  - app/view_models/thredded/post_view.rb
752
759
  - app/view_models/thredded/posts_page_view.rb
753
760
  - app/view_models/thredded/private_topic_view.rb
761
+ - app/view_models/thredded/private_topics_page_view.rb
754
762
  - app/view_models/thredded/topic_email_view.rb
763
+ - app/view_models/thredded/topic_posts_page_view.rb
755
764
  - app/view_models/thredded/topic_view.rb
756
765
  - app/view_models/thredded/topics_page_view.rb
757
766
  - app/views/layouts/thredded/application.html.erb
@@ -771,21 +780,27 @@ files:
771
780
  - app/views/thredded/messageboards/edit.html.erb
772
781
  - app/views/thredded/messageboards/index.html.erb
773
782
  - app/views/thredded/messageboards/new.html.erb
774
- - app/views/thredded/post_mailer/at_notification.html.erb
775
- - app/views/thredded/post_mailer/at_notification.text.erb
783
+ - app/views/thredded/moderation/_post.html.erb
784
+ - app/views/thredded/moderation/_post_moderation_actions.html.erb
785
+ - app/views/thredded/moderation/_post_moderation_record.html.erb
786
+ - app/views/thredded/moderation/history.html.erb
787
+ - app/views/thredded/moderation/pending.html.erb
788
+ - app/views/thredded/post_mailer/post_notification.html.erb
789
+ - app/views/thredded/post_mailer/post_notification.text.erb
776
790
  - app/views/thredded/posts/_form.html.erb
777
791
  - app/views/thredded/posts/_post.html.erb
778
792
  - app/views/thredded/posts/_user.html.erb
779
793
  - app/views/thredded/posts/edit.html.erb
794
+ - app/views/thredded/posts_common/_actions.html.erb
795
+ - app/views/thredded/posts_common/_content.html.erb
780
796
  - app/views/thredded/posts_common/_form.html.erb
781
- - app/views/thredded/posts_common/_post.html.erb
797
+ - app/views/thredded/posts_common/_header.html.erb
782
798
  - app/views/thredded/posts_common/form/_after_content.html.erb
783
799
  - app/views/thredded/posts_common/form/_before_content.html.erb
784
800
  - app/views/thredded/posts_common/form/_content_field.html.erb
785
801
  - app/views/thredded/preferences/_form.html.erb
786
802
  - app/views/thredded/preferences/_header.html.erb
787
803
  - app/views/thredded/preferences/edit.html.erb
788
- - app/views/thredded/private_post_mailer/at_notification.html.erb
789
804
  - app/views/thredded/private_posts/_form.html.erb
790
805
  - app/views/thredded/private_posts/_private_post.html.erb
791
806
  - app/views/thredded/private_topic_mailer/message_notification.html.erb
@@ -806,6 +821,7 @@ files:
806
821
  - app/views/thredded/shared/_header.html.erb
807
822
  - app/views/thredded/shared/_nav.html.erb
808
823
  - app/views/thredded/shared/_page.html.erb
824
+ - app/views/thredded/shared/nav/_moderation.html.erb
809
825
  - app/views/thredded/shared/nav/_notification_preferences.html.erb
810
826
  - app/views/thredded/shared/nav/_private_topics.html.erb
811
827
  - app/views/thredded/shared/nav/_standalone.html.erb
@@ -832,6 +848,7 @@ files:
832
848
  - db/seeds.rb
833
849
  - db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb
834
850
  - db/upgrade_migrations/20160429222452_upgrade_v0_3_to_v0_4.rb
851
+ - db/upgrade_migrations/20160501151908_upgrade_v0_4_to_v0_5.rb
835
852
  - heroku.gemfile
836
853
  - heroku.gemfile.lock
837
854
  - lib/generators/thredded/install/USAGE
@@ -842,6 +859,7 @@ files:
842
859
  - lib/tasks/thredded_tasks.rake
843
860
  - lib/thredded.rb
844
861
  - lib/thredded/at_users.rb
862
+ - lib/thredded/content_formatter.rb
845
863
  - lib/thredded/engine.rb
846
864
  - lib/thredded/errors.rb
847
865
  - lib/thredded/main_app_route_delegator.rb