help_center 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/LICENSE.txt +21 -21
- data/README.md +168 -164
- data/Rakefile +10 -10
- data/app/assets/stylesheets/help_center.scss +140 -139
- data/app/controllers/help_center/application_controller.rb +37 -37
- data/app/controllers/help_center/notifications_controller.rb +19 -19
- data/app/controllers/help_center/support_categories_controller.rb +58 -58
- data/app/controllers/help_center/support_posts_controller.rb +72 -72
- data/app/controllers/help_center/support_threads_controller.rb +82 -82
- data/app/helpers/help_center/support_posts_helper.rb +29 -29
- data/app/helpers/help_center/support_threads_helper.rb +28 -28
- data/app/jobs/help_center/support_post_notification_job.rb +42 -42
- data/app/jobs/help_center/support_thread_notification_job.rb +40 -40
- data/app/mailers/help_center/user_mailer.rb +28 -28
- data/app/models/support_category.rb +16 -13
- data/app/models/support_post.rb +15 -15
- data/app/models/support_subscription.rb +19 -19
- data/app/models/support_thread.rb +85 -85
- data/app/views/help_center/support_categories/_form.html.erb +39 -35
- data/app/views/help_center/support_categories/_support_thread.html.erb +25 -25
- data/app/views/help_center/support_categories/edit.html.erb +7 -7
- data/app/views/help_center/support_categories/index.html.erb +19 -19
- data/app/views/help_center/support_categories/new.html.erb +5 -5
- data/app/views/help_center/support_categories/show.html.erb +19 -20
- data/app/views/help_center/support_posts/_form.html.erb +47 -47
- data/app/views/help_center/support_posts/_support_post.html.erb +57 -57
- data/app/views/help_center/support_posts/edit.html.erb +23 -23
- data/app/views/help_center/support_threads/_form.html.erb +49 -49
- data/app/views/help_center/support_threads/_support_thread.html.erb +25 -25
- data/app/views/help_center/support_threads/edit.html.erb +7 -7
- data/app/views/help_center/support_threads/index.html.erb +19 -19
- data/app/views/help_center/support_threads/new.html.erb +5 -5
- data/app/views/help_center/support_threads/show.html.erb +29 -42
- data/app/views/help_center/user_mailer/new_post.html.erb +9 -9
- data/app/views/help_center/user_mailer/new_thread.html.erb +9 -9
- data/app/views/layouts/help_center.html.erb +130 -128
- data/app/views/shared/_category_actions.html.erb +16 -0
- data/app/views/shared/_spacer.html.erb +1 -1
- data/app/views/shared/_thread_actions.html.erb +16 -0
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/config/locales/en.yml +56 -55
- data/config/routes.rb +24 -24
- data/db/migrate/20170417012930_create_support_categories.rb +19 -19
- data/db/migrate/20170417012931_create_support_threads.rb +18 -18
- data/db/migrate/20170417012933_create_support_subscriptions.rb +11 -11
- data/help_center.gemspec +27 -29
- data/lib/generators/help_center/controllers_generator.rb +13 -13
- data/lib/generators/help_center/helpers_generator.rb +13 -13
- data/lib/generators/help_center/views_generator.rb +13 -13
- data/lib/help_center.rb +23 -23
- data/lib/help_center/engine.rb +10 -10
- data/lib/help_center/slack.rb +22 -22
- data/lib/help_center/support_user.rb +10 -10
- data/lib/help_center/version.rb +3 -3
- metadata +7 -19
- data/help_center-0.0.1.gem +0 -0
@@ -1,29 +1,29 @@
|
|
1
|
-
module HelpCenter::SupportPostsHelper
|
2
|
-
# Override this to use avatars from other places than Gravatar
|
3
|
-
def avatar_tag(email)
|
4
|
-
gravatar_image_tag(email, gravatar: { size: 40 }, class: "rounded avatar")
|
5
|
-
end
|
6
|
-
|
7
|
-
def support_category_link(category)
|
8
|
-
link_to category.name, help_center.support_category_path(category),
|
9
|
-
style: "color: #{category.color}"
|
10
|
-
end
|
11
|
-
|
12
|
-
# Override this method to provide your own content formatting like Markdown
|
13
|
-
def formatted_content(text)
|
14
|
-
simple_format(text)
|
15
|
-
end
|
16
|
-
|
17
|
-
def support_post_classes(support_post)
|
18
|
-
klasses = ["support-post", "card", "mb-3"]
|
19
|
-
klasses << "solved" if support_post.solved?
|
20
|
-
klasses << "original-poster" if support_post.user == @support_thread.user
|
21
|
-
klasses
|
22
|
-
end
|
23
|
-
|
24
|
-
def support_user_badge(user)
|
25
|
-
if user.respond_to?(:moderator) && user.moderator?
|
26
|
-
content_tag :span, "Mod", class: "badge badge-default"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
1
|
+
module HelpCenter::SupportPostsHelper
|
2
|
+
# Override this to use avatars from other places than Gravatar
|
3
|
+
def avatar_tag(email)
|
4
|
+
gravatar_image_tag(email, gravatar: { size: 40 }, class: "rounded avatar")
|
5
|
+
end
|
6
|
+
|
7
|
+
def support_category_link(category)
|
8
|
+
link_to category.name, help_center.support_category_path(category),
|
9
|
+
style: "color: #{category.color}"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Override this method to provide your own content formatting like Markdown
|
13
|
+
def formatted_content(text)
|
14
|
+
simple_format(text)
|
15
|
+
end
|
16
|
+
|
17
|
+
def support_post_classes(support_post)
|
18
|
+
klasses = ["support-post", "card", "mb-3"]
|
19
|
+
klasses << "solved" if support_post.solved?
|
20
|
+
klasses << "original-poster" if support_post.user == @support_thread.user
|
21
|
+
klasses
|
22
|
+
end
|
23
|
+
|
24
|
+
def support_user_badge(user)
|
25
|
+
if user.respond_to?(:moderator) && user.moderator?
|
26
|
+
content_tag :span, "Mod", class: "badge badge-default"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
|
-
module HelpCenter::SupportThreadsHelper
|
2
|
-
# Used for flagging links in the navbar as active
|
3
|
-
def support_link_to(path, opts={}, &block)
|
4
|
-
link_to path, class: support_link_class(path, opts), &block
|
5
|
-
end
|
6
|
-
|
7
|
-
def support_link_class(matches, opts={})
|
8
|
-
case matches
|
9
|
-
when Array
|
10
|
-
"active" if matches.any?{ |m| request.path.starts_with?(m) }
|
11
|
-
when String
|
12
|
-
"active" if opts.fetch(:exact, false) ? request.path == matches : request.path.starts_with?(matches)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# A nice hack to manipulate the layout so we can have sub-layouts
|
17
|
-
# without any changes in the user's application.
|
18
|
-
#
|
19
|
-
# We use this for rendering the sidebar layout for all the support pages
|
20
|
-
#
|
21
|
-
# https://mattbrictson.com/easier-nested-layouts-in-rails
|
22
|
-
#
|
23
|
-
def parent_layout(layout)
|
24
|
-
@view_flow.set(:layout, output_buffer)
|
25
|
-
output = render(
|
26
|
-
self.output_buffer = ActionView::OutputBuffer.new(output)
|
27
|
-
end
|
28
|
-
end
|
1
|
+
module HelpCenter::SupportThreadsHelper
|
2
|
+
# Used for flagging links in the navbar as active
|
3
|
+
def support_link_to(path, opts={}, &block)
|
4
|
+
link_to path, class: support_link_class(path, opts), &block
|
5
|
+
end
|
6
|
+
|
7
|
+
def support_link_class(matches, opts={})
|
8
|
+
case matches
|
9
|
+
when Array
|
10
|
+
"active" if matches.any?{ |m| request.path.starts_with?(m) }
|
11
|
+
when String
|
12
|
+
"active" if opts.fetch(:exact, false) ? request.path == matches : request.path.starts_with?(matches)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# A nice hack to manipulate the layout so we can have sub-layouts
|
17
|
+
# without any changes in the user's application.
|
18
|
+
#
|
19
|
+
# We use this for rendering the sidebar layout for all the support pages
|
20
|
+
#
|
21
|
+
# https://mattbrictson.com/easier-nested-layouts-in-rails
|
22
|
+
#
|
23
|
+
def parent_layout(layout)
|
24
|
+
@view_flow.set(:layout, output_buffer)
|
25
|
+
output = render(template: "layouts/#{layout}")
|
26
|
+
self.output_buffer = ActionView::OutputBuffer.new(output)
|
27
|
+
end
|
28
|
+
end
|
@@ -1,42 +1,42 @@
|
|
1
|
-
class HelpCenter::SupportPostNotificationJob < ApplicationJob
|
2
|
-
include HelpCenter::Engine.routes.url_helpers
|
3
|
-
|
4
|
-
def perform(support_post)
|
5
|
-
send_emails(support_post) if HelpCenter.send_email_notifications
|
6
|
-
send_webhook(support_post) if HelpCenter.send_slack_notifications
|
7
|
-
end
|
8
|
-
|
9
|
-
def send_emails(support_post)
|
10
|
-
support_thread = support_post.support_thread
|
11
|
-
users = support_thread.subscribed_users - [support_post.user]
|
12
|
-
users.each do |user|
|
13
|
-
HelpCenter::UserMailer.new_post(support_post, user).deliver_later
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def send_webhook(support_post)
|
18
|
-
slack_webhook_url = Rails.application.secrets.help_center_slack_url
|
19
|
-
return if slack_webhook_url.blank?
|
20
|
-
|
21
|
-
support_thread = support_post.support_thread
|
22
|
-
payload = {
|
23
|
-
fallback: "#{support_post.user.name} replied to <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_post))}|#{support_thread.title}>",
|
24
|
-
pretext: "#{support_post.user.name} replied to <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_post))}|#{support_thread.title}>",
|
25
|
-
fields: [
|
26
|
-
{
|
27
|
-
title: "Thread",
|
28
|
-
value: support_thread.title,
|
29
|
-
short: true
|
30
|
-
},
|
31
|
-
{
|
32
|
-
title: "Posted By",
|
33
|
-
value: support_post.user.name,
|
34
|
-
short: true,
|
35
|
-
},
|
36
|
-
],
|
37
|
-
ts: support_post.created_at.to_i
|
38
|
-
}
|
39
|
-
|
40
|
-
HelpCenter::Slack.new(slack_webhook_url).post(payload)
|
41
|
-
end
|
42
|
-
end
|
1
|
+
class HelpCenter::SupportPostNotificationJob < ApplicationJob
|
2
|
+
include HelpCenter::Engine.routes.url_helpers
|
3
|
+
|
4
|
+
def perform(support_post)
|
5
|
+
send_emails(support_post) if HelpCenter.send_email_notifications
|
6
|
+
send_webhook(support_post) if HelpCenter.send_slack_notifications
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_emails(support_post)
|
10
|
+
support_thread = support_post.support_thread
|
11
|
+
users = support_thread.subscribed_users - [support_post.user]
|
12
|
+
users.each do |user|
|
13
|
+
HelpCenter::UserMailer.new_post(support_post, user).deliver_later
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_webhook(support_post)
|
18
|
+
slack_webhook_url = Rails.application.secrets.help_center_slack_url
|
19
|
+
return if slack_webhook_url.blank?
|
20
|
+
|
21
|
+
support_thread = support_post.support_thread
|
22
|
+
payload = {
|
23
|
+
fallback: "#{support_post.user.name} replied to <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_post))}|#{support_thread.title}>",
|
24
|
+
pretext: "#{support_post.user.name} replied to <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_post))}|#{support_thread.title}>",
|
25
|
+
fields: [
|
26
|
+
{
|
27
|
+
title: "Thread",
|
28
|
+
value: support_thread.title,
|
29
|
+
short: true
|
30
|
+
},
|
31
|
+
{
|
32
|
+
title: "Posted By",
|
33
|
+
value: support_post.user.name,
|
34
|
+
short: true,
|
35
|
+
},
|
36
|
+
],
|
37
|
+
ts: support_post.created_at.to_i
|
38
|
+
}
|
39
|
+
|
40
|
+
HelpCenter::Slack.new(slack_webhook_url).post(payload)
|
41
|
+
end
|
42
|
+
end
|
@@ -1,40 +1,40 @@
|
|
1
|
-
class HelpCenter::SupportThreadNotificationJob < ApplicationJob
|
2
|
-
include HelpCenter::Engine.routes.url_helpers
|
3
|
-
|
4
|
-
def perform(support_thread)
|
5
|
-
send_emails(support_thread) if HelpCenter.send_email_notifications
|
6
|
-
send_webhook(support_thread) if HelpCenter.send_slack_notifications
|
7
|
-
end
|
8
|
-
|
9
|
-
def send_emails(support_thread)
|
10
|
-
support_thread.notify_users.each do |user|
|
11
|
-
HelpCenter::UserMailer.new_thread(support_thread, user).deliver_later
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def send_webhook(support_thread)
|
16
|
-
slack_webhook_url = Rails.application.secrets.simple_discussion_slack_url
|
17
|
-
return if slack_webhook_url.blank?
|
18
|
-
|
19
|
-
support_post = support_thread.support_posts.first
|
20
|
-
payload = {
|
21
|
-
fallback: "A new discussion was started: <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_posts))}|#{support_thread.title}>",
|
22
|
-
pretext: "A new discussion was started: <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_posts))}|#{support_thread.title}>",
|
23
|
-
fields: [
|
24
|
-
{
|
25
|
-
title: "Thread",
|
26
|
-
value: support_thread.title,
|
27
|
-
short: true
|
28
|
-
},
|
29
|
-
{
|
30
|
-
title: "Posted By",
|
31
|
-
value: support_post.user.name,
|
32
|
-
short: true,
|
33
|
-
},
|
34
|
-
],
|
35
|
-
ts: support_post.created_at.to_i
|
36
|
-
}
|
37
|
-
|
38
|
-
HelpCenter::Slack.new(slack_webhook_url).post(payload)
|
39
|
-
end
|
40
|
-
end
|
1
|
+
class HelpCenter::SupportThreadNotificationJob < ApplicationJob
|
2
|
+
include HelpCenter::Engine.routes.url_helpers
|
3
|
+
|
4
|
+
def perform(support_thread)
|
5
|
+
send_emails(support_thread) if HelpCenter.send_email_notifications
|
6
|
+
send_webhook(support_thread) if HelpCenter.send_slack_notifications
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_emails(support_thread)
|
10
|
+
support_thread.notify_users.each do |user|
|
11
|
+
HelpCenter::UserMailer.new_thread(support_thread, user).deliver_later
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def send_webhook(support_thread)
|
16
|
+
slack_webhook_url = Rails.application.secrets.simple_discussion_slack_url
|
17
|
+
return if slack_webhook_url.blank?
|
18
|
+
|
19
|
+
support_post = support_thread.support_posts.first
|
20
|
+
payload = {
|
21
|
+
fallback: "A new discussion was started: <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_posts))}|#{support_thread.title}>",
|
22
|
+
pretext: "A new discussion was started: <#{support_thread_url(support_thread, anchor: ActionView::RecordIdentifier.dom_id(support_posts))}|#{support_thread.title}>",
|
23
|
+
fields: [
|
24
|
+
{
|
25
|
+
title: "Thread",
|
26
|
+
value: support_thread.title,
|
27
|
+
short: true
|
28
|
+
},
|
29
|
+
{
|
30
|
+
title: "Posted By",
|
31
|
+
value: support_post.user.name,
|
32
|
+
short: true,
|
33
|
+
},
|
34
|
+
],
|
35
|
+
ts: support_post.created_at.to_i
|
36
|
+
}
|
37
|
+
|
38
|
+
HelpCenter::Slack.new(slack_webhook_url).post(payload)
|
39
|
+
end
|
40
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
|
-
class HelpCenter::UserMailer < ApplicationMailer
|
2
|
-
# You can set the default `from` address in ApplicationMailer
|
3
|
-
|
4
|
-
helper HelpCenter::SupportPostsHelper
|
5
|
-
helper HelpCenter::Engine.routes.url_helpers
|
6
|
-
|
7
|
-
def new_thread(support_thread, recipient)
|
8
|
-
@support_thread = support_thread
|
9
|
-
@support_post = support_thread.support_posts.first
|
10
|
-
@recipient = recipient
|
11
|
-
|
12
|
-
mail(
|
13
|
-
to: "#{@recipient.name} <#{@recipient.email}>",
|
14
|
-
subject: @support_thread.title
|
15
|
-
)
|
16
|
-
end
|
17
|
-
|
18
|
-
def new_post(support_post, recipient)
|
19
|
-
@support_post = support_post
|
20
|
-
@support_thread = support_post.support_thread
|
21
|
-
@recipient = recipient
|
22
|
-
|
23
|
-
mail(
|
24
|
-
to: "#{@recipient.name} <#{@recipient.email}>",
|
25
|
-
subject: "New post in #{@support_thread.title}"
|
26
|
-
)
|
27
|
-
end
|
28
|
-
end
|
1
|
+
class HelpCenter::UserMailer < ApplicationMailer
|
2
|
+
# You can set the default `from` address in ApplicationMailer
|
3
|
+
|
4
|
+
helper HelpCenter::SupportPostsHelper
|
5
|
+
helper HelpCenter::Engine.routes.url_helpers
|
6
|
+
|
7
|
+
def new_thread(support_thread, recipient)
|
8
|
+
@support_thread = support_thread
|
9
|
+
@support_post = support_thread.support_posts.first
|
10
|
+
@recipient = recipient
|
11
|
+
|
12
|
+
mail(
|
13
|
+
to: "#{@recipient.name} <#{@recipient.email}>",
|
14
|
+
subject: @support_thread.title
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def new_post(support_post, recipient)
|
19
|
+
@support_post = support_post
|
20
|
+
@support_thread = support_post.support_thread
|
21
|
+
@recipient = recipient
|
22
|
+
|
23
|
+
mail(
|
24
|
+
to: "#{@recipient.name} <#{@recipient.email}>",
|
25
|
+
subject: "New post in #{@support_thread.title}"
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -1,13 +1,16 @@
|
|
1
|
-
class SupportCategory < ApplicationRecord
|
2
|
-
extend FriendlyId
|
3
|
-
friendly_id :name, use: :slugged
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
class SupportCategory < ApplicationRecord
|
2
|
+
extend FriendlyId
|
3
|
+
friendly_id :name, use: :slugged
|
4
|
+
|
5
|
+
has_many :support_threads
|
6
|
+
has_rich_text :description
|
7
|
+
|
8
|
+
scope :sorted, ->{ order(position: :asc) }
|
9
|
+
|
10
|
+
validates :name, :slug, :color, presence: true
|
11
|
+
|
12
|
+
def color
|
13
|
+
colour = super
|
14
|
+
colour.start_with?("#") ? colour : "##{colour}"
|
15
|
+
end
|
16
|
+
end
|
data/app/models/support_post.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
class SupportPost < ApplicationRecord
|
2
|
-
belongs_to :support_thread, counter_cache: true, touch: true
|
3
|
-
belongs_to :user
|
4
|
-
has_many :reactions, as: :reactable
|
5
|
-
|
6
|
-
validates :user_id, :body, presence: true
|
7
|
-
|
8
|
-
scope :sorted, ->{ order(:created_at) }
|
9
|
-
|
10
|
-
after_update :solve_support_thread, if: :solved?
|
11
|
-
|
12
|
-
def solve_support_thread
|
13
|
-
support_thread.update(solved: true)
|
14
|
-
end
|
15
|
-
end
|
1
|
+
class SupportPost < ApplicationRecord
|
2
|
+
belongs_to :support_thread, counter_cache: true, touch: true
|
3
|
+
belongs_to :user
|
4
|
+
has_many :reactions, as: :reactable
|
5
|
+
|
6
|
+
validates :user_id, :body, presence: true
|
7
|
+
|
8
|
+
scope :sorted, ->{ order(:created_at) }
|
9
|
+
|
10
|
+
after_update :solve_support_thread, if: :solved?
|
11
|
+
|
12
|
+
def solve_support_thread
|
13
|
+
support_thread.update(solved: true)
|
14
|
+
end
|
15
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
class SupportSubscription < ApplicationRecord
|
2
|
-
belongs_to :support_thread
|
3
|
-
belongs_to :user
|
4
|
-
|
5
|
-
scope :optin, ->{ where(subscription_type: :optin) }
|
6
|
-
scope :optout, ->{ where(subscription_type: :optout) }
|
7
|
-
|
8
|
-
validates :subscription_type, presence: true, inclusion: { in: %w{ optin optout } }
|
9
|
-
validates :user_id, uniqueness: { scope: :support_thread_id }
|
10
|
-
|
11
|
-
def toggle!
|
12
|
-
case subscription_type
|
13
|
-
when "optin"
|
14
|
-
update(subscription_type: "optout")
|
15
|
-
when "optout"
|
16
|
-
update(subscription_type: "optin")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
class SupportSubscription < ApplicationRecord
|
2
|
+
belongs_to :support_thread
|
3
|
+
belongs_to :user
|
4
|
+
|
5
|
+
scope :optin, ->{ where(subscription_type: :optin) }
|
6
|
+
scope :optout, ->{ where(subscription_type: :optout) }
|
7
|
+
|
8
|
+
validates :subscription_type, presence: true, inclusion: { in: %w{ optin optout } }
|
9
|
+
validates :user_id, uniqueness: { scope: :support_thread_id }
|
10
|
+
|
11
|
+
def toggle!
|
12
|
+
case subscription_type
|
13
|
+
when "optin"
|
14
|
+
update(subscription_type: "optout")
|
15
|
+
when "optout"
|
16
|
+
update(subscription_type: "optin")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,85 +1,85 @@
|
|
1
|
-
class SupportThread < ApplicationRecord
|
2
|
-
extend FriendlyId
|
3
|
-
friendly_id :title, use: :slugged
|
4
|
-
|
5
|
-
belongs_to :support_category
|
6
|
-
belongs_to :user
|
7
|
-
has_many :support_posts
|
8
|
-
has_many :support_subscriptions
|
9
|
-
has_many :optin_subscribers, ->{ where(support_subscriptions: { subscription_type: :optin }) }, through: :support_subscriptions, source: :user
|
10
|
-
has_many :optout_subscribers, ->{ where(support_subscriptions: { subscription_type: :optout }) }, through: :support_subscriptions, source: :user
|
11
|
-
has_many :users, through: :support_posts
|
12
|
-
|
13
|
-
has_rich_text :content
|
14
|
-
|
15
|
-
accepts_nested_attributes_for :support_posts
|
16
|
-
|
17
|
-
validates :support_category, presence: true
|
18
|
-
validates :user_id, :title, presence: true
|
19
|
-
validates_associated :support_posts
|
20
|
-
|
21
|
-
scope :pinned_first, ->{ order(pinned: :desc) }
|
22
|
-
scope :solved, ->{ where(solved: true) }
|
23
|
-
scope :sorted, ->{ order(position: :asc) }
|
24
|
-
scope :unpinned, ->{ where.not(pinned: true) }
|
25
|
-
scope :unsolved, ->{ where.not(solved: true) }
|
26
|
-
|
27
|
-
def subscribed_users
|
28
|
-
(users + optin_subscribers).uniq - optout_subscribers
|
29
|
-
end
|
30
|
-
|
31
|
-
def subscription_for(user)
|
32
|
-
return nil if user.nil?
|
33
|
-
support_subscriptions.find_by(user_id: user.id)
|
34
|
-
end
|
35
|
-
|
36
|
-
def subscribed?(user)
|
37
|
-
return false if user.nil?
|
38
|
-
|
39
|
-
subscription = subscription_for(user)
|
40
|
-
|
41
|
-
if subscription.present?
|
42
|
-
subscription.subscription_type == "optin"
|
43
|
-
else
|
44
|
-
support_posts.where(user_id: user.id).any?
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def toggle_subscription(user)
|
49
|
-
subscription = subscription_for(user)
|
50
|
-
|
51
|
-
if subscription.present?
|
52
|
-
subscription.toggle!
|
53
|
-
elsif support_posts.where(user_id: user.id).any?
|
54
|
-
support_subscriptions.create(user: user, subscription_type: "optout")
|
55
|
-
else
|
56
|
-
support_subscriptions.create(user: user, subscription_type: "optin")
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def subscribed_reason(user)
|
61
|
-
return I18n.t('.not_receiving_notifications') if user.nil?
|
62
|
-
|
63
|
-
subscription = subscription_for(user)
|
64
|
-
|
65
|
-
if subscription.present?
|
66
|
-
if subscription.subscription_type == "optout"
|
67
|
-
I18n.t('.ignoring_thread')
|
68
|
-
elsif subscription.subscription_type == "optin"
|
69
|
-
I18n.t('.receiving_notifications_because_subscribed')
|
70
|
-
end
|
71
|
-
elsif support_posts.where(user_id: user.id).any?
|
72
|
-
I18n.t('.receiving_notifications_because_posted')
|
73
|
-
else
|
74
|
-
I18n.t('.not_receiving_notifications')
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# These are the users to notify on a new thread. Currently this does nothing,
|
79
|
-
# but you can override this to provide whatever functionality you like here.
|
80
|
-
#
|
81
|
-
# For example: You might use this to send all moderators an email of new threads.
|
82
|
-
def notify_users
|
83
|
-
[]
|
84
|
-
end
|
85
|
-
end
|
1
|
+
class SupportThread < ApplicationRecord
|
2
|
+
extend FriendlyId
|
3
|
+
friendly_id :title, use: :slugged
|
4
|
+
|
5
|
+
belongs_to :support_category
|
6
|
+
belongs_to :user
|
7
|
+
has_many :support_posts
|
8
|
+
has_many :support_subscriptions
|
9
|
+
has_many :optin_subscribers, ->{ where(support_subscriptions: { subscription_type: :optin }) }, through: :support_subscriptions, source: :user
|
10
|
+
has_many :optout_subscribers, ->{ where(support_subscriptions: { subscription_type: :optout }) }, through: :support_subscriptions, source: :user
|
11
|
+
has_many :users, through: :support_posts
|
12
|
+
|
13
|
+
has_rich_text :content
|
14
|
+
|
15
|
+
accepts_nested_attributes_for :support_posts
|
16
|
+
|
17
|
+
validates :support_category, presence: true
|
18
|
+
validates :user_id, :title, presence: true
|
19
|
+
validates_associated :support_posts
|
20
|
+
|
21
|
+
scope :pinned_first, ->{ order(pinned: :desc) }
|
22
|
+
scope :solved, ->{ where(solved: true) }
|
23
|
+
scope :sorted, ->{ order(position: :asc) }
|
24
|
+
scope :unpinned, ->{ where.not(pinned: true) }
|
25
|
+
scope :unsolved, ->{ where.not(solved: true) }
|
26
|
+
|
27
|
+
def subscribed_users
|
28
|
+
(users + optin_subscribers).uniq - optout_subscribers
|
29
|
+
end
|
30
|
+
|
31
|
+
def subscription_for(user)
|
32
|
+
return nil if user.nil?
|
33
|
+
support_subscriptions.find_by(user_id: user.id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def subscribed?(user)
|
37
|
+
return false if user.nil?
|
38
|
+
|
39
|
+
subscription = subscription_for(user)
|
40
|
+
|
41
|
+
if subscription.present?
|
42
|
+
subscription.subscription_type == "optin"
|
43
|
+
else
|
44
|
+
support_posts.where(user_id: user.id).any?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def toggle_subscription(user)
|
49
|
+
subscription = subscription_for(user)
|
50
|
+
|
51
|
+
if subscription.present?
|
52
|
+
subscription.toggle!
|
53
|
+
elsif support_posts.where(user_id: user.id).any?
|
54
|
+
support_subscriptions.create(user: user, subscription_type: "optout")
|
55
|
+
else
|
56
|
+
support_subscriptions.create(user: user, subscription_type: "optin")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def subscribed_reason(user)
|
61
|
+
return I18n.t('.not_receiving_notifications') if user.nil?
|
62
|
+
|
63
|
+
subscription = subscription_for(user)
|
64
|
+
|
65
|
+
if subscription.present?
|
66
|
+
if subscription.subscription_type == "optout"
|
67
|
+
I18n.t('.ignoring_thread')
|
68
|
+
elsif subscription.subscription_type == "optin"
|
69
|
+
I18n.t('.receiving_notifications_because_subscribed')
|
70
|
+
end
|
71
|
+
elsif support_posts.where(user_id: user.id).any?
|
72
|
+
I18n.t('.receiving_notifications_because_posted')
|
73
|
+
else
|
74
|
+
I18n.t('.not_receiving_notifications')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# These are the users to notify on a new thread. Currently this does nothing,
|
79
|
+
# but you can override this to provide whatever functionality you like here.
|
80
|
+
#
|
81
|
+
# For example: You might use this to send all moderators an email of new threads.
|
82
|
+
def notify_users
|
83
|
+
[]
|
84
|
+
end
|
85
|
+
end
|