help_center 0.0.4 → 0.0.5

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +12 -12
  3. data/.gitignore +10 -10
  4. data/CHANGELOG.md +1 -1
  5. data/CODE_OF_CONDUCT.md +74 -74
  6. data/Gemfile +6 -6
  7. data/LICENSE.txt +21 -21
  8. data/README.md +164 -155
  9. data/Rakefile +10 -10
  10. data/app/assets/stylesheets/help_center.scss +139 -119
  11. data/app/controllers/help_center/application_controller.rb +37 -37
  12. data/app/controllers/help_center/notifications_controller.rb +19 -19
  13. data/app/controllers/help_center/support_categories_controller.rb +58 -17
  14. data/app/controllers/help_center/support_posts_controller.rb +72 -72
  15. data/app/controllers/help_center/support_threads_controller.rb +16 -6
  16. data/app/helpers/help_center/support_posts_helper.rb +29 -29
  17. data/app/helpers/help_center/support_threads_helper.rb +28 -28
  18. data/app/jobs/help_center/support_post_notification_job.rb +42 -42
  19. data/app/jobs/help_center/support_thread_notification_job.rb +40 -40
  20. data/app/mailers/help_center/user_mailer.rb +28 -28
  21. data/app/models/support_category.rb +13 -13
  22. data/app/models/support_post.rb +15 -15
  23. data/app/models/support_subscription.rb +19 -19
  24. data/app/models/support_thread.rb +85 -85
  25. data/app/views/help_center/support_categories/_form.html.erb +35 -0
  26. data/app/views/help_center/support_categories/_support_thread.html.erb +25 -0
  27. data/app/views/help_center/support_categories/edit.html.erb +7 -0
  28. data/app/views/help_center/support_categories/index.html.erb +19 -0
  29. data/app/views/help_center/support_categories/new.html.erb +5 -0
  30. data/app/views/help_center/support_categories/show.html.erb +20 -0
  31. data/app/views/help_center/support_threads/_form.html.erb +6 -4
  32. data/app/views/help_center/support_threads/edit.html.erb +7 -7
  33. data/app/views/help_center/support_threads/index.html.erb +1 -1
  34. data/app/views/help_center/support_threads/new.html.erb +5 -5
  35. data/app/views/help_center/support_threads/show.html.erb +42 -1
  36. data/app/views/layouts/help_center.html.erb +37 -13
  37. data/app/views/shared/_spacer.html.erb +1 -1
  38. data/bin/console +14 -14
  39. data/bin/setup +8 -8
  40. data/config/locales/en.yml +55 -52
  41. data/config/routes.rb +24 -24
  42. data/db/migrate/20170417012930_create_support_categories.rb +19 -19
  43. data/db/migrate/20170417012931_create_support_threads.rb +18 -18
  44. data/db/migrate/20170417012932_create_support_posts.rb +12 -12
  45. data/db/migrate/20170417012933_create_support_subscriptions.rb +11 -11
  46. data/help_center.gemspec +29 -29
  47. data/lib/generators/help_center/controllers_generator.rb +13 -13
  48. data/lib/generators/help_center/helpers_generator.rb +13 -13
  49. data/lib/generators/help_center/views_generator.rb +13 -13
  50. data/lib/help_center.rb +23 -24
  51. data/lib/help_center/engine.rb +10 -10
  52. data/lib/help_center/slack.rb +22 -22
  53. data/lib/help_center/support_user.rb +10 -10
  54. data/lib/help_center/version.rb +3 -3
  55. metadata +11 -8
  56. data/.travis.yml +0 -5
  57. data/app/views/help_center/support_threads/_article.html.erb +0 -32
  58. data/lib/help_center/will_paginate.rb +0 -53
@@ -1,72 +1,72 @@
1
- class HelpCenter::SupportPostsController < HelpCenter::ApplicationController
2
- before_action :authenticate_user!
3
- before_action :set_support_thread
4
- before_action :set_support_post, only: [:edit, :update, :destroy]
5
- before_action :require_mod_or_author_for_post!, only: [:edit, :update, :destroy]
6
- before_action :require_mod_or_author_for_thread!, only: [:solved, :unsolved]
7
-
8
- def create
9
- @support_post = @support_thread.support_posts.new(support_post_params)
10
- @support_post.user_id = current_user.id
11
-
12
- if @support_post.save
13
- HelpCenter::SupportPostNotificationJob.perform_later(@support_post)
14
- redirect_to help_center.support_thread_path(@support_thread, anchor: "support_post_#{@support_post.id}")
15
- else
16
- render template: "help_center/support_threads/show"
17
- end
18
- end
19
-
20
- def edit
21
- end
22
-
23
- def update
24
- if @support_post.update(support_post_params)
25
- redirect_to help_center.support_thread_path(@support_thread)
26
- else
27
- render action: :edit
28
- end
29
- end
30
-
31
- def destroy
32
- @support_post.destroy!
33
- redirect_to help_center.support_thread_path(@support_thread)
34
- end
35
-
36
- def solved
37
- @support_post = @support_thread.support_posts.find(params[:id])
38
-
39
- @support_thread.support_posts.update_all(solved: false)
40
- @support_post.update_column(:solved, true)
41
- @support_thread.update_column(:solved, true)
42
-
43
- redirect_to help_center.support_thread_path(@support_thread, anchor: ActionView::RecordIdentifier.dom_id(@support_post))
44
- end
45
-
46
- def unsolved
47
- @support_post = @support_thread.support_posts.find(params[:id])
48
-
49
- @support_thread.support_posts.update_all(solved: false)
50
- @support_thread.update_column(:solved, false)
51
-
52
- redirect_to help_center.support_thread_path(@support_thread, anchor: ActionView::RecordIdentifier.dom_id(@support_post))
53
- end
54
-
55
- private
56
-
57
- def set_support_thread
58
- @support_thread = SupportThread.friendly.find(params[:support_thread_id])
59
- end
60
-
61
- def set_support_post
62
- if is_moderator?
63
- @support_post = @support_thread.support_posts.find(params[:id])
64
- else
65
- @support_post = current_user.support_posts.find(params[:id])
66
- end
67
- end
68
-
69
- def support_post_params
70
- params.require(:support_post).permit(:body)
71
- end
72
- end
1
+ class HelpCenter::SupportPostsController < HelpCenter::ApplicationController
2
+ before_action :authenticate_user!
3
+ before_action :set_support_thread
4
+ before_action :set_support_post, only: [:edit, :update, :destroy]
5
+ before_action :require_mod_or_author_for_post!, only: [:edit, :update, :destroy]
6
+ before_action :require_mod_or_author_for_thread!, only: [:solved, :unsolved]
7
+
8
+ def create
9
+ @support_post = @support_thread.support_posts.new(support_post_params)
10
+ @support_post.user_id = current_user.id
11
+
12
+ if @support_post.save
13
+ HelpCenter::SupportPostNotificationJob.perform_later(@support_post)
14
+ redirect_to help_center.support_thread_path(@support_thread, anchor: "support_post_#{@support_post.id}")
15
+ else
16
+ render template: "help_center/support_threads/show"
17
+ end
18
+ end
19
+
20
+ def edit
21
+ end
22
+
23
+ def update
24
+ if @support_post.update(support_post_params)
25
+ redirect_to help_center.support_thread_path(@support_thread)
26
+ else
27
+ render action: :edit
28
+ end
29
+ end
30
+
31
+ def destroy
32
+ @support_post.destroy!
33
+ redirect_to help_center.support_thread_path(@support_thread)
34
+ end
35
+
36
+ def solved
37
+ @support_post = @support_thread.support_posts.find(params[:id])
38
+
39
+ @support_thread.support_posts.update_all(solved: false)
40
+ @support_post.update_column(:solved, true)
41
+ @support_thread.update_column(:solved, true)
42
+
43
+ redirect_to help_center.support_thread_path(@support_thread, anchor: ActionView::RecordIdentifier.dom_id(@support_post))
44
+ end
45
+
46
+ def unsolved
47
+ @support_post = @support_thread.support_posts.find(params[:id])
48
+
49
+ @support_thread.support_posts.update_all(solved: false)
50
+ @support_thread.update_column(:solved, false)
51
+
52
+ redirect_to help_center.support_thread_path(@support_thread, anchor: ActionView::RecordIdentifier.dom_id(@support_post))
53
+ end
54
+
55
+ private
56
+
57
+ def set_support_thread
58
+ @support_thread = SupportThread.friendly.find(params[:support_thread_id])
59
+ end
60
+
61
+ def set_support_post
62
+ if is_moderator?
63
+ @support_post = @support_thread.support_posts.find(params[:id])
64
+ else
65
+ @support_post = current_user.support_posts.find(params[:id])
66
+ end
67
+ end
68
+
69
+ def support_post_params
70
+ params.require(:support_post).permit(:body)
71
+ end
72
+ end
@@ -1,29 +1,34 @@
1
1
  class HelpCenter::SupportThreadsController < HelpCenter::ApplicationController
2
2
  before_action :authenticate_user!, only: [:mine, :participating, :new, :create]
3
- before_action :set_support_thread, only: [:show, :edit, :update]
3
+ before_action :set_support_thread, only: [:show, :edit, :update, :destroy]
4
4
  before_action :require_mod_or_author_for_thread!, only: [:edit, :update]
5
5
 
6
6
  def index
7
- @support_threads = SupportThread.pinned_first.sorted.includes(:user, :support_category).paginate(page: page_number)
7
+ @support_threads = SupportThread.pinned_first.sorted.includes(:user, :support_category)
8
+ @pagy, @records = pagy(@support_threads)
8
9
  end
9
10
 
10
11
  def answered
11
- @support_threads = SupportThread.solved.sorted.includes(:user, :support_category).paginate(page: page_number)
12
+ @support_threads = SupportThread.solved.sorted.includes(:user, :support_category)
13
+ @pagy, @records = pagy(@support_threads)
12
14
  render action: :index
13
15
  end
14
16
 
15
17
  def unanswered
16
- @support_threads = SupportThread.unsolved.sorted.includes(:user, :support_category).paginate(page: page_number)
18
+ @support_threads = SupportThread.unsolved.sorted.includes(:user, :support_category)
19
+ @pagy, @records = pagy(@support_threads)
17
20
  render action: :index
18
21
  end
19
22
 
20
23
  def mine
21
- @support_threads = SupportThread.where(user: current_user).sorted.includes(:user, :support_category).paginate(page: page_number)
24
+ @support_threads = SupportThread.where(user: current_user).sorted.includes(:user, :support_category)
25
+ @pagy, @records = pagy(@support_threads)
22
26
  render action: :index
23
27
  end
24
28
 
25
29
  def participating
26
- @support_threads = SupportThread.includes(:user, :support_category).joins(:support_posts).where(support_posts: { user_id: current_user.id }).distinct(support_posts: :id).sorted.paginate(page: page_number)
30
+ @support_threads = SupportThread.includes(:user, :support_category).joins(:support_posts).where(support_posts: { user_id: current_user.id }).distinct(support_posts: :id).sorted
31
+ @pagy, @records = pagy(@support_threads)
27
32
  render action: :index
28
33
  end
29
34
 
@@ -60,6 +65,11 @@ class HelpCenter::SupportThreadsController < HelpCenter::ApplicationController
60
65
  end
61
66
  end
62
67
 
68
+ def destroy
69
+ @support_thread.destroy
70
+ redirect_to help_center.support_category_path(@support_thread.support_category), notice: I18n.t('successfully_deleted')
71
+ end
72
+
63
73
  private
64
74
 
65
75
  def set_support_thread
@@ -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_support_threads_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(file: "layouts/#{layout}")
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(file: "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