thredded 0.8.4 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -9
  3. data/app/assets/images/thredded/breadcrumb-chevron.svg +1 -1
  4. data/app/assets/images/thredded/follow.svg +1 -1
  5. data/app/assets/images/thredded/moderation.svg +1 -4
  6. data/app/assets/images/thredded/private-messages.svg +1 -4
  7. data/app/assets/images/thredded/settings.svg +1 -4
  8. data/app/assets/images/thredded/unfollow.svg +1 -1
  9. data/app/assets/javascripts/thredded/components/time_stamps.es6 +1 -1
  10. data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +26 -49
  11. data/app/assets/javascripts/thredded/dependencies.js +2 -1
  12. data/app/assets/stylesheets/thredded/base/_grid.scss +4 -4
  13. data/app/assets/stylesheets/thredded/base/_typography.scss +18 -0
  14. data/app/assets/stylesheets/thredded/components/_base.scss +4 -0
  15. data/app/assets/stylesheets/thredded/components/_currently-online.scss +4 -0
  16. data/app/assets/stylesheets/thredded/components/_form-list.scss +5 -0
  17. data/app/assets/stylesheets/thredded/components/_messageboard.scss +3 -0
  18. data/app/assets/stylesheets/thredded/components/_post-form.scss +7 -4
  19. data/app/assets/stylesheets/thredded/components/_post.scss +3 -0
  20. data/app/assets/stylesheets/thredded/components/_topic-delete.scss +3 -0
  21. data/app/assets/stylesheets/thredded/components/_topic-header.scss +20 -0
  22. data/app/assets/stylesheets/thredded/components/_topics.scss +13 -1
  23. data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +1 -1
  24. data/app/assets/stylesheets/thredded/layout/_navigation.scss +3 -1
  25. data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +4 -0
  26. data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +3 -0
  27. data/app/commands/thredded/at_notification_extractor.rb +1 -2
  28. data/app/commands/thredded/autofollow_mentioned_users.rb +0 -1
  29. data/app/commands/thredded/notify_following_users.rb +20 -11
  30. data/app/commands/thredded/notify_private_topic_users.rb +12 -28
  31. data/app/controllers/thredded/application_controller.rb +8 -4
  32. data/app/controllers/thredded/messageboards_controller.rb +2 -2
  33. data/app/controllers/thredded/moderation_controller.rb +12 -13
  34. data/app/controllers/thredded/posts_controller.rb +1 -1
  35. data/app/controllers/thredded/preferences_controller.rb +11 -7
  36. data/app/controllers/thredded/private_topics_controller.rb +13 -9
  37. data/app/controllers/thredded/topics_controller.rb +20 -12
  38. data/app/forms/thredded/user_preferences_form.rb +23 -4
  39. data/app/helpers/thredded/application_helper.rb +11 -1
  40. data/app/mailers/thredded/post_mailer.rb +2 -3
  41. data/app/mailers/thredded/private_topic_mailer.rb +2 -3
  42. data/app/models/concerns/thredded/content_moderation_state.rb +1 -1
  43. data/app/models/concerns/thredded/notifier_preference.rb +18 -0
  44. data/app/models/concerns/thredded/post_common.rb +5 -1
  45. data/{lib → app/models/concerns}/thredded/search_parser.rb +0 -0
  46. data/app/models/concerns/thredded/topic_common.rb +3 -3
  47. data/{lib → app/models/concerns}/thredded/topics_search.rb +2 -3
  48. data/app/models/thredded/messageboard.rb +11 -0
  49. data/app/models/thredded/messageboard_notifications_for_followed_topics.rb +29 -0
  50. data/app/models/thredded/notifications_for_followed_topics.rb +22 -0
  51. data/app/models/thredded/notifications_for_private_topics.rb +21 -0
  52. data/app/models/thredded/post.rb +5 -3
  53. data/app/models/thredded/post_moderation_record.rb +1 -1
  54. data/app/models/thredded/private_post.rb +1 -1
  55. data/app/models/thredded/private_topic.rb +8 -4
  56. data/app/models/thredded/stats.rb +1 -1
  57. data/app/models/thredded/topic.rb +10 -7
  58. data/app/models/thredded/user_detail.rb +1 -1
  59. data/app/models/thredded/user_extender.rb +3 -1
  60. data/app/models/thredded/user_preference.rb +16 -5
  61. data/app/models/thredded/user_private_topic_read_state.rb +1 -1
  62. data/app/models/thredded/user_topic_read_state.rb +1 -1
  63. data/app/notifiers/thredded/base_notifier.rb +28 -0
  64. data/app/notifiers/thredded/email_notifier.rb +34 -0
  65. data/app/policies/thredded/post_policy.rb +3 -4
  66. data/app/policies/thredded/private_post_policy.rb +2 -3
  67. data/app/policies/thredded/topic_policy.rb +1 -2
  68. data/app/view_hooks/thredded/all_view_hooks.rb +0 -3
  69. data/app/view_models/thredded/base_topic_view.rb +0 -1
  70. data/app/view_models/thredded/post_view.rb +0 -1
  71. data/app/view_models/thredded/posts_page_view.rb +1 -4
  72. data/app/view_models/thredded/private_topic_view.rb +3 -1
  73. data/app/view_models/thredded/private_topics_page_view.rb +8 -3
  74. data/app/view_models/thredded/topic_posts_page_view.rb +1 -2
  75. data/app/view_models/thredded/topic_view.rb +3 -3
  76. data/app/view_models/thredded/topics_page_view.rb +0 -1
  77. data/app/views/thredded/messageboard_groups/new.html.erb +5 -1
  78. data/app/views/thredded/messageboards/_form.html.erb +7 -2
  79. data/app/views/thredded/posts/_form.html.erb +2 -1
  80. data/app/views/thredded/posts/edit.html.erb +3 -2
  81. data/app/views/thredded/posts_common/_form.html.erb +6 -2
  82. data/app/views/thredded/preferences/_form.html.erb +41 -29
  83. data/app/views/thredded/private_posts/_form.html.erb +1 -0
  84. data/app/views/thredded/private_topics/_form.html.erb +3 -2
  85. data/app/views/thredded/private_topics/_header.html.erb +4 -0
  86. data/app/views/thredded/private_topics/_no_private_topics.html.erb +1 -1
  87. data/app/views/thredded/private_topics/_private_topic.html.erb +5 -2
  88. data/app/views/thredded/private_topics/edit.html.erb +2 -1
  89. data/app/views/thredded/private_topics/header/_participant.html.erb +1 -0
  90. data/app/views/thredded/private_topics/index.html.erb +6 -5
  91. data/app/views/thredded/private_topics/new.html.erb +0 -1
  92. data/app/views/thredded/private_topics/private_topic/_participant.html.erb +1 -0
  93. data/app/views/thredded/private_topics/show.html.erb +1 -3
  94. data/app/views/thredded/topics/_form.html.erb +1 -1
  95. data/app/views/thredded/topics/show.html.erb +4 -5
  96. data/config/locales/en.yml +22 -9
  97. data/config/locales/pt-BR.yml +22 -10
  98. data/config/routes.rb +1 -1
  99. data/db/migrate/20160329231848_create_thredded.rb +23 -3
  100. data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +1 -1
  101. data/db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb +56 -0
  102. data/lib/generators/thredded/install/templates/initializer.rb +28 -0
  103. data/lib/thredded.rb +32 -8
  104. data/lib/thredded/content_formatter.rb +3 -2
  105. data/lib/thredded/database_seeder.rb +11 -8
  106. data/lib/thredded/db_tools.rb +82 -0
  107. data/lib/thredded/html_pipeline/wrap_iframes_filter.rb +12 -0
  108. data/lib/thredded/version.rb +1 -1
  109. metadata +18 -8
  110. data/app/models/thredded/null_preference.rb +0 -16
@@ -108,3 +108,31 @@ Thredded.layout = 'thredded/application'
108
108
  # 'hi'
109
109
  # end
110
110
  # end
111
+
112
+ # ==> Topic following
113
+ #
114
+ # By default, a user will be subscribed to a topic they've created. Uncomment this to not subscribe them:
115
+ #
116
+ # Thredded.auto_follow_when_creating_topic = false
117
+ #
118
+ # By default, a user will be subscribed to (follow) a topic they post in. Uncomment this to not subscribe them:
119
+ #
120
+ # Thredded.auto_follow_when_posting_in_topic = false
121
+ #
122
+ # By default, a user will be subscribed to the topic they get @-mentioned in.
123
+ # Individual users can disable this in the Notification Settings.
124
+ # To change the default for all users, simply change the default value of the `follow_topics_on_mention` column
125
+ # of the `thredded_user_preferences` and `thredded_user_messageboard_preferences` tables.
126
+
127
+ # ==> Notifiers
128
+ #
129
+ # Change how users can choose to be notified, by adding notifiers here, or removing the initializer altogether
130
+ #
131
+ # default:
132
+ # Thredded.notifiers = [Thredded::EmailNotifier.new]
133
+ #
134
+ # none:
135
+ # Thredded.notifiers = []
136
+ #
137
+ # add in (must install separate gem (under development) as well):
138
+ # Thredded.notifiers = [Thredded::EmailNotifier.new, Thredded::PushoverNotifier.new(ENV['PUSHOVER_APP_ID'])]
@@ -19,6 +19,7 @@ require 'inline_svg'
19
19
  require 'thredded/html_pipeline/at_mention_filter'
20
20
  require 'thredded/html_pipeline/autolink_filter'
21
21
  require 'thredded/html_pipeline/kramdown_filter'
22
+ require 'thredded/html_pipeline/wrap_iframes_filter'
22
23
 
23
24
  # Asset compilation
24
25
  require 'autoprefixer-rails'
@@ -32,6 +33,9 @@ require 'thredded/version'
32
33
  require 'thredded/engine'
33
34
  require 'thredded/errors'
34
35
 
36
+ require 'thredded/view_hooks/config'
37
+ require 'thredded/view_hooks/renderer'
38
+
35
39
  # Require Thredded::ContentFormatter explicitly so that it doesn't need to be required if used in the initializer.
36
40
  require 'thredded/content_formatter'
37
41
 
@@ -61,12 +65,23 @@ module Thredded
61
65
  # @return [Boolean] Whether posts that are pending moderation are visible to regular users.
62
66
  mattr_accessor :content_visible_while_pending_moderation
63
67
 
68
+ # @return [Array] The notifiers, by default just the EmailNotifier
69
+ mattr_accessor :notifiers
70
+
64
71
  # @return [Boolean] Whether users that are following a topic are listed on topic page.
65
72
  mattr_accessor :show_topic_followers
66
73
 
67
74
  # @return [Symbol] The name of the method used by Thredded to display users
68
75
  mattr_accessor :user_display_name_method
69
76
 
77
+ # @return [Boolean] Whether the user should get subscribed to a new topic they've created.
78
+ mattr_accessor :auto_follow_when_creating_topic
79
+ self.auto_follow_when_creating_topic = true
80
+
81
+ # @return [Boolean] Whether the user should get subscribed to a topic after posting in it.
82
+ mattr_accessor :auto_follow_when_posting_in_topic
83
+ self.auto_follow_when_posting_in_topic = true
84
+
70
85
  self.active_user_threshold = 5.minutes
71
86
  self.admin_column = :admin
72
87
  self.avatar_url = ->(user) { Gravatar.src(user.email, 128, 'mm') }
@@ -87,6 +102,15 @@ module Thredded
87
102
  instance
88
103
  end
89
104
 
105
+ def self.notifiers
106
+ @@notifiers ||= [Thredded::EmailNotifier.new] # rubocop:disable Style/ClassVars
107
+ end
108
+
109
+ def self.notifiers=(notifiers)
110
+ notifiers.each { |notifier| BaseNotifier.validate_notifier(notifier) }
111
+ @@notifiers = notifiers # rubocop:disable Style/ClassVars
112
+ end
113
+
90
114
  def self.user_display_name_method
91
115
  @@user_display_name_method || user_name_column
92
116
  end
@@ -103,14 +127,14 @@ module Thredded
103
127
 
104
128
  # @return [Class<Thredded::UserExtender>] the user class from the host application.
105
129
  def self.user_class
106
- fail 'Please use a string instead of a class' if @@user_class.is_a?(Class)
107
-
108
- if @@user_class.is_a?(String)
109
- begin
110
- Object.const_get(@@user_class)
111
- rescue NameError
112
- @@user_class.constantize
113
- end
130
+ # This is nil before the initializer is installed.
131
+ return nil if @@user_class.nil?
132
+ fail 'Please use a String instead of a Class' if @@user_class.is_a?(Class)
133
+ fail "user_class must be a String, got #{@@user_class.inspect}" unless @@user_class.is_a?(String)
134
+ begin
135
+ Object.const_get(@@user_class)
136
+ rescue NameError
137
+ @@user_class.constantize
114
138
  end
115
139
  end
116
140
 
@@ -25,11 +25,12 @@ module Thredded
25
25
  'a' => %w(href rel),
26
26
  'iframe' => %w(src width height frameborder allowfullscreen sandbox seamless),
27
27
  'span' => %w(class),
28
+ 'div' => %w(class)
28
29
  },
29
30
  add_attributes: {
30
31
  'iframe' => {
31
32
  'seamless' => 'seamless',
32
- 'sandbox' => 'allow-same-origin allow-scripts allow-forms',
33
+ 'sandbox' => 'allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox',
33
34
  }
34
35
  },
35
36
  protocols: {
@@ -63,7 +64,7 @@ module Thredded
63
64
  Thredded::HtmlPipeline::AutolinkFilter,
64
65
  HTML::Pipeline::EmojiFilter,
65
66
  Thredded::HtmlPipeline::AtMentionFilter,
66
- HTML::Pipeline::SanitizationFilter,
67
+ Thredded::HtmlPipeline::WrapIframesFilter,
67
68
  ]
68
69
 
69
70
  # Filters that sanitize the resulting HTML.
@@ -231,12 +231,14 @@ module Thredded
231
231
  MODEL_CLASS = PrivateTopic
232
232
 
233
233
  def create(count: 1)
234
- FactoryGirl.create_list(
235
- :private_topic, count,
236
- user: seeder.users[1..-1].sample,
237
- last_user: seeder.users.sample,
238
- users: [seeder.first_user]
239
- )
234
+ Array.new(count) do
235
+ FactoryGirl.create(
236
+ :private_topic,
237
+ user: seeder.users[1..-1].sample,
238
+ last_user: seeder.users.sample,
239
+ users: [seeder.first_user, *seeder.users.sample(1 + rand(3))]
240
+ )
241
+ end
240
242
  end
241
243
  end
242
244
 
@@ -274,8 +276,9 @@ module Thredded
274
276
  def create(count: (1..1))
275
277
  log "Creating #{count} additional posts in each private topic..."
276
278
  seeder.private_topics.flat_map do |topic|
277
- (count.min + rand(count.max + 1)).times do
278
- FactoryGirl.create(:private_post, postable: topic, user: seeder.users.sample)
279
+ (count.min + rand(count.max + 1)).times do |i|
280
+ author = i.zero? ? topic.user : topic.users.sample
281
+ FactoryGirl.create(:private_post, postable: topic, user: author)
279
282
  end
280
283
  end
281
284
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+ module Thredded
3
+ module DbTools
4
+ class << self
5
+ MIGRATION_SPEC_SOURCE_VERSION = 'v0.8'
6
+
7
+ def dump_file
8
+ File.expand_path("../../../spec/migration/#{MIGRATION_SPEC_SOURCE_VERSION}.#{adapter}.dump", __FILE__)
9
+ end
10
+
11
+ def dump(to = dump_file)
12
+ case adapter
13
+ when /sqlite/i
14
+ system "sqlite3 #{Rails.root.join(database)} .dump > #{to}"
15
+ when /postgres/i
16
+ cmd = "pg_dump --host #{host} --username #{username} --verbose --clean --no-owner --no-acl --format=c " \
17
+ "#{database} > #{to}"
18
+ system cmd
19
+ when /mysql/i
20
+ system("mysqldump --user #{username} -p#{password} #{database} > #{to}")
21
+ end
22
+ end
23
+
24
+ def restore(from = dump_file)
25
+ case adapter
26
+ when /postgres/i
27
+ cmd = [
28
+ "pg_restore --verbose --host #{host}",
29
+ "--username #{username}",
30
+ ' --clean --no-owner --no-acl ',
31
+ " --dbname #{database} #{from}",
32
+ " > #{Rails.root.join('log/restore.log')}"
33
+ ].join(' ')
34
+ system cmd
35
+ when /mysql/i, /sqlite/i
36
+ connection = ActiveRecord::Base.connection
37
+ statements = File.read(from).split(/;$/)
38
+ statements.pop
39
+ silence_active_record do
40
+ ActiveRecord::Base.transaction do
41
+ statements.each do |statement|
42
+ connection.execute(statement) unless statement =~ /(BEGIN TRANSACTION|COMMIT)/
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def silence_active_record
50
+ was = ActiveRecord::Base.logger.level
51
+ ActiveRecord::Base.logger.level = Logger::WARN
52
+ yield
53
+ ensure
54
+ ActiveRecord::Base.logger.level = was
55
+ end
56
+
57
+ def config
58
+ @config ||= Rails.configuration.database_configuration[Rails.env]
59
+ end
60
+
61
+ def adapter
62
+ config['adapter']
63
+ end
64
+
65
+ def database
66
+ config['database']
67
+ end
68
+
69
+ def username
70
+ config['username']
71
+ end
72
+
73
+ def password
74
+ config['password']
75
+ end
76
+
77
+ def host
78
+ config['host']
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ module Thredded
3
+ module HtmlPipeline
4
+ # Wraps iframes with a <div class="thredded--embed-16-by-9"/>
5
+ class WrapIframesFilter < ::HTML::Pipeline::Filter
6
+ def call
7
+ doc.css('iframe').wrap('<div class="thredded--embed-16-by-9"/>')
8
+ doc
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Thredded
3
- VERSION = '0.8.4'
3
+ VERSION = '0.9.1'
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.8.4
4
+ version: 0.9.1
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-11-19 00:00:00.000000000 Z
12
+ date: 2016-11-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pundit
@@ -451,14 +451,14 @@ dependencies:
451
451
  requirements:
452
452
  - - '='
453
453
  - !ruby/object:Gem::Version
454
- version: 0.42.0
454
+ version: 0.45.0
455
455
  type: :development
456
456
  prerelease: false
457
457
  version_requirements: !ruby/object:Gem::Requirement
458
458
  requirements:
459
459
  - - '='
460
460
  - !ruby/object:Gem::Version
461
- version: 0.42.0
461
+ version: 0.45.0
462
462
  - !ruby/object:Gem::Dependency
463
463
  name: rails-i18n
464
464
  requirement: !ruby/object:Gem::Requirement
@@ -713,14 +713,19 @@ files:
713
713
  - app/models/concerns/thredded/content_moderation_state.rb
714
714
  - app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb
715
715
  - app/models/concerns/thredded/moderation_state.rb
716
+ - app/models/concerns/thredded/notifier_preference.rb
716
717
  - app/models/concerns/thredded/post_common.rb
718
+ - app/models/concerns/thredded/search_parser.rb
717
719
  - app/models/concerns/thredded/topic_common.rb
720
+ - app/models/concerns/thredded/topics_search.rb
718
721
  - app/models/concerns/thredded/user_topic_read_state_common.rb
719
722
  - app/models/thredded/category.rb
720
723
  - app/models/thredded/messageboard.rb
721
724
  - app/models/thredded/messageboard_group.rb
725
+ - app/models/thredded/messageboard_notifications_for_followed_topics.rb
722
726
  - app/models/thredded/messageboard_user.rb
723
- - app/models/thredded/null_preference.rb
727
+ - app/models/thredded/notifications_for_followed_topics.rb
728
+ - app/models/thredded/notifications_for_private_topics.rb
724
729
  - app/models/thredded/null_user.rb
725
730
  - app/models/thredded/null_user_topic_read_state.rb
726
731
  - app/models/thredded/post.rb
@@ -747,6 +752,8 @@ files:
747
752
  - app/models/thredded/user_private_topic_read_state.rb
748
753
  - app/models/thredded/user_topic_follow.rb
749
754
  - app/models/thredded/user_topic_read_state.rb
755
+ - app/notifiers/thredded/base_notifier.rb
756
+ - app/notifiers/thredded/email_notifier.rb
750
757
  - app/policies/thredded/messageboard_group_policy.rb
751
758
  - app/policies/thredded/messageboard_policy.rb
752
759
  - app/policies/thredded/post_policy.rb
@@ -821,8 +828,10 @@ files:
821
828
  - app/views/thredded/private_topics/_no_private_topics.html.erb
822
829
  - app/views/thredded/private_topics/_private_topic.html.erb
823
830
  - app/views/thredded/private_topics/edit.html.erb
831
+ - app/views/thredded/private_topics/header/_participant.html.erb
824
832
  - app/views/thredded/private_topics/index.html.erb
825
833
  - app/views/thredded/private_topics/new.html.erb
834
+ - app/views/thredded/private_topics/private_topic/_participant.html.erb
826
835
  - app/views/thredded/private_topics/show.html.erb
827
836
  - app/views/thredded/search/_form.html.erb
828
837
  - app/views/thredded/shared/_breadcrumbs.html.erb
@@ -865,6 +874,7 @@ files:
865
874
  - db/upgrade_migrations/20160611094616_upgrade_v0_5_to_v0_6.rb
866
875
  - db/upgrade_migrations/20160723012349_upgrade_v0_6_to_v0_7.rb
867
876
  - db/upgrade_migrations/20161019150201_upgrade_v0_7_to_v0_8.rb
877
+ - db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb
868
878
  - lib/generators/thredded/install/USAGE
869
879
  - lib/generators/thredded/install/install_generator.rb
870
880
  - lib/generators/thredded/install/templates/initializer.rb
@@ -872,13 +882,13 @@ files:
872
882
  - lib/thredded.rb
873
883
  - lib/thredded/content_formatter.rb
874
884
  - lib/thredded/database_seeder.rb
885
+ - lib/thredded/db_tools.rb
875
886
  - lib/thredded/engine.rb
876
887
  - lib/thredded/errors.rb
877
888
  - lib/thredded/html_pipeline/at_mention_filter.rb
878
889
  - lib/thredded/html_pipeline/autolink_filter.rb
879
890
  - lib/thredded/html_pipeline/kramdown_filter.rb
880
- - lib/thredded/search_parser.rb
881
- - lib/thredded/topics_search.rb
891
+ - lib/thredded/html_pipeline/wrap_iframes_filter.rb
882
892
  - lib/thredded/version.rb
883
893
  - lib/thredded/view_hooks/config.rb
884
894
  - lib/thredded/view_hooks/renderer.rb
@@ -903,7 +913,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
903
913
  version: '0'
904
914
  requirements: []
905
915
  rubyforge_project:
906
- rubygems_version: 2.6.8
916
+ rubygems_version: 2.5.2
907
917
  signing_key:
908
918
  specification_version: 4
909
919
  summary: The best Rails forums engine ever.
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
- module Thredded
3
- class NullPreference
4
- def follow_topics_on_mention
5
- true
6
- end
7
-
8
- def notify_on_message
9
- true
10
- end
11
-
12
- def followed_topic_emails
13
- true
14
- end
15
- end
16
- end