radesk 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/radesk/radesk.js.coffee +4 -0
  3. data/app/assets/stylesheets/radesk/radesk.css.scss +41 -19
  4. data/app/controllers/radesk/admin/activities_controller.rb +11 -0
  5. data/app/controllers/radesk/admin/admin_controller.rb +9 -0
  6. data/app/controllers/radesk/admin/categories_controller.rb +2 -3
  7. data/app/controllers/radesk/admin/users_controller.rb +18 -0
  8. data/app/controllers/radesk/answers_controller.rb +9 -11
  9. data/app/controllers/radesk/application_controller.rb +5 -1
  10. data/app/controllers/radesk/tickets_controller.rb +23 -13
  11. data/app/controllers/radesk/uploads_controller.rb +18 -0
  12. data/app/helpers/radesk/activities_helper.rb +11 -0
  13. data/app/helpers/radesk/application_helper.rb +9 -0
  14. data/app/mailers/radesk/user_mailer.rb +5 -4
  15. data/app/models/radesk/activity.rb +6 -0
  16. data/app/models/radesk/answer.rb +7 -3
  17. data/app/models/radesk/concerns/access.rb +9 -0
  18. data/app/models/radesk/ticket.rb +8 -5
  19. data/app/models/radesk/upload.rb +9 -0
  20. data/app/views/layouts/radesk/application.html.haml +6 -5
  21. data/app/views/radesk/admin/activities/_answer.html.haml +1 -0
  22. data/app/views/radesk/admin/activities/_ticket.html.haml +1 -0
  23. data/app/views/radesk/admin/activities/index.html.haml +16 -0
  24. data/app/views/radesk/admin/categories/_form.html.haml +3 -1
  25. data/app/views/radesk/admin/categories/edit.html.haml +1 -2
  26. data/app/views/radesk/admin/categories/index.html.haml +11 -9
  27. data/app/views/radesk/admin/categories/new.html.haml +1 -2
  28. data/app/views/radesk/admin/users/show.html.haml +3 -0
  29. data/app/views/radesk/answers/_form.html.haml +24 -0
  30. data/app/views/radesk/answers/_list.html.haml +29 -13
  31. data/app/views/radesk/answers/_upload_fields.html.haml +2 -0
  32. data/app/views/radesk/answers/edit.html.haml +1 -6
  33. data/app/views/radesk/tickets/_form.html.haml +5 -4
  34. data/app/views/radesk/tickets/_list.html.haml +23 -0
  35. data/app/views/radesk/tickets/index.html.haml +13 -24
  36. data/app/views/radesk/tickets/new.html.haml +1 -2
  37. data/app/views/radesk/tickets/show.html.haml +4 -35
  38. data/app/views/radesk/uploads/destroy.js.erb +1 -0
  39. data/config/locales/en.yml +51 -0
  40. data/config/locales/zh-CN.yml +37 -0
  41. data/config/routes.rb +9 -0
  42. data/db/migrate/20150112111134_remove_message_from_radesk_tickets.rb +5 -0
  43. data/db/migrate/20150112182604_create_radesk_uploads.rb +11 -0
  44. data/db/migrate/20150114194722_create_radesk_activities.rb +11 -0
  45. data/lib/generators/radesk/dummy/templates/Rakefile +6 -0
  46. data/lib/generators/radesk/dummy/templates/app/assets/javascripts/application.js +13 -0
  47. data/lib/generators/radesk/dummy/templates/app/assets/stylesheets/application.css +15 -0
  48. data/lib/generators/radesk/dummy/templates/app/controllers/application_controller.rb +5 -0
  49. data/lib/generators/radesk/dummy/templates/app/helpers/application_helper.rb +2 -0
  50. data/lib/generators/radesk/dummy/templates/app/models/user.rb +10 -0
  51. data/lib/generators/radesk/dummy/templates/app/views/layouts/application.html.erb +14 -0
  52. data/lib/generators/radesk/dummy/templates/bin/bundle +3 -0
  53. data/lib/generators/radesk/dummy/templates/bin/rails +4 -0
  54. data/lib/generators/radesk/dummy/templates/bin/rake +4 -0
  55. data/lib/generators/radesk/dummy/templates/bin/setup +29 -0
  56. data/lib/generators/radesk/dummy/templates/config.ru +4 -0
  57. data/lib/generators/radesk/dummy/templates/config/application.rb +31 -0
  58. data/lib/generators/radesk/dummy/templates/config/boot.rb +5 -0
  59. data/lib/generators/radesk/dummy/templates/config/database.yml +25 -0
  60. data/lib/generators/radesk/dummy/templates/config/environment.rb +5 -0
  61. data/lib/generators/radesk/dummy/templates/config/environments/development.rb +44 -0
  62. data/lib/generators/radesk/dummy/templates/config/environments/production.rb +79 -0
  63. data/lib/generators/radesk/dummy/templates/config/environments/test.rb +42 -0
  64. data/lib/generators/radesk/dummy/templates/config/initializers/assets.rb +11 -0
  65. data/lib/generators/radesk/dummy/templates/config/initializers/backtrace_silencers.rb +7 -0
  66. data/lib/generators/radesk/dummy/templates/config/initializers/cookies_serializer.rb +3 -0
  67. data/lib/generators/radesk/dummy/templates/config/initializers/devise.rb +259 -0
  68. data/lib/generators/radesk/dummy/templates/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/lib/generators/radesk/dummy/templates/config/initializers/inflections.rb +16 -0
  70. data/lib/generators/radesk/dummy/templates/config/initializers/mime_types.rb +4 -0
  71. data/lib/generators/radesk/dummy/templates/config/initializers/session_store.rb +3 -0
  72. data/lib/generators/radesk/dummy/templates/config/initializers/wrap_parameters.rb +14 -0
  73. data/lib/generators/radesk/dummy/templates/config/locales/devise.en.yml +60 -0
  74. data/lib/generators/radesk/dummy/templates/config/locales/en.yml +23 -0
  75. data/lib/generators/radesk/dummy/templates/config/routes.rb +3 -0
  76. data/lib/generators/radesk/dummy/templates/config/secrets.yml +22 -0
  77. data/lib/generators/radesk/dummy/templates/db/migrate/20150108203658_devise_create_users.rb +42 -0
  78. data/lib/generators/radesk/dummy/templates/public/404.html +67 -0
  79. data/lib/generators/radesk/dummy/templates/public/422.html +67 -0
  80. data/lib/generators/radesk/dummy/templates/public/500.html +66 -0
  81. data/lib/generators/radesk/dummy/templates/public/favicon.ico +0 -0
  82. data/lib/generators/radesk/dummy_generator.rb +13 -0
  83. data/lib/generators/radesk/install/templates/initializer.rb +2 -0
  84. data/lib/radesk.rb +8 -0
  85. data/lib/radesk/version.rb +1 -1
  86. metadata +176 -46
@@ -0,0 +1,9 @@
1
+ module Radesk
2
+ class Upload < ActiveRecord::Base
3
+ belongs_to :answer
4
+
5
+ has_attached_file :file
6
+
7
+ validates_attachment_content_type :file, :content_type => /\Aimage\/.*\Z/
8
+ end
9
+ end
@@ -14,11 +14,12 @@
14
14
  = flash[:notice]
15
15
  .nav
16
16
  .wrap
17
- = link_to 'Home', '/'
18
- = link_to 'Tickets', tickets_path
17
+ = link_to t('radesk.ui.home'), Radesk.home_path
18
+ = link_to t('radesk.ui.tickets.index'), tickets_path
19
19
  - if radesk_current_user.try(:radesk_admin?)
20
- = link_to 'Categories', admin_categories_path
20
+ = link_to t('radesk.ui.categories.index'), admin_categories_path
21
+ = link_to t('radesk.ui.activities.index'), admin_activities_path
21
22
  %span.pull-right
22
- Logged as administrator
23
+ = t('radesk.ui.logged_as_admin')
23
24
  .wrap
24
- = yield
25
+ = yield
@@ -0,0 +1 @@
1
+ = link_to object.ticket.title, ticket_path(object.ticket)
@@ -0,0 +1 @@
1
+ = link_to object.title, ticket_path(object)
@@ -0,0 +1,16 @@
1
+ %h1
2
+ = t('radesk.ui.activities.index')
3
+ %table.table
4
+ - @activities.each do |activity|
5
+ %tr
6
+ %td
7
+ %strong
8
+ = link_to activity.trackable.user.email, admin_user_path(activity.trackable.user)
9
+ = t("radesk.ui.activities.#{activity.trackable.class.name.split('::').last.downcase}.#{activity.action}")
10
+ %strong
11
+ = render "radesk/admin/activities/#{activity.trackable.class.name.split('::').last.downcase}", :object => activity.trackable
12
+ = time_ago_in_words(activity.created_at)
13
+ = t('radesk.ui.ago')
14
+
15
+
16
+ = paginate @activities
@@ -4,4 +4,6 @@
4
4
  = f.label :title
5
5
  = f.text_field :title, :class => 'form-control', :required => true
6
6
  .form-group.text-right
7
- = f.submit 'Save Category', :class => 'btn'
7
+ - if params[:action] == :edit
8
+ = link_to t('radesk.ui.delete'), admin_category_path(@category), :class => 'btn btn-clear', :method => :delete
9
+ = f.submit t('radesk.ui.categories.save'), :class => 'btn'
@@ -1,3 +1,2 @@
1
- %h1
2
- Edit category
1
+ %h1= t('radesk.ui.categories.edit')
3
2
  = render 'form'
@@ -1,14 +1,16 @@
1
- %h1
2
- Categories
3
- = link_to "New Category", new_admin_category_path, :class => 'btn pull-right'
4
1
  - if @categories.any?
2
+ %h1
3
+ = t('radesk.ui.categories.index')
4
+ = link_to t('radesk.ui.categories.new'), new_admin_category_path, :class => 'btn pull-right'
5
5
  %table.table
6
6
  - @categories.each do |category|
7
7
  %tr
8
8
  %td
9
- = category.title
10
- %td.text-right
11
- = link_to edit_admin_category_path(category) do
12
- %i.fa.fa-pencil.light
13
- = link_to admin_category_path(category), :method => :delete do
14
- %i.fa.fa-close.light
9
+ = link_to category.title, edit_admin_category_path(category)
10
+ - else
11
+ .add-something.text-center
12
+ .title
13
+ = t('radesk.ui.categories.not_found')
14
+ .description
15
+ = t('radesk.ui.but_you_can_create')
16
+ = link_to t('radesk.ui.categories.new'), new_admin_category_path, :class => 'btn'
@@ -1,4 +1,3 @@
1
- %h1
2
- New category
1
+ %h1= t('radesk.ui.categories.new')
3
2
  .form
4
3
  = render 'form'
@@ -0,0 +1,3 @@
1
+ %h1
2
+ = @user.email
3
+ = render 'radesk/tickets/list', :tickets => @tickets
@@ -0,0 +1,24 @@
1
+ = form_for [ticket, answer] do |f|
2
+ .form-group
3
+ = f.text_area :message, :class => 'form-control textarea', :rows => 5, :required => true
4
+ - if answer.uploads.size > 0
5
+ .form-group
6
+ .uploads
7
+ - answer.uploads.each do |upload|
8
+ .file{ :class => "upload-#{upload.id}" }
9
+ %i.fa.fa-file-o
10
+ = link_to upload.file_file_name, upload.file.url, :target => "_blank"
11
+ = link_to upload_path(upload.id), :method => :delete, :remote => true do
12
+ %i.fa.fa-close
13
+ = f.fields_for :uploads, answer.uploads.build do |upload|
14
+ = render 'radesk/answers/upload_fields', :f => upload
15
+ .form-group
16
+ = link_to_add_fields f, :uploads, 'answers/upload_fields' do
17
+ %i.fa.fa-plus
18
+ Add file
19
+ .form-group
20
+ = f.submit t('radesk.ui.answers.post'), :class => 'btn'
21
+ - if radesk_current_user.radesk_admin?
22
+ = f.label :private, :class => 'beside' do
23
+ = f.check_box :private, :class => 'form-control'
24
+ = t('radesk.ui.answers.mark_as_private')
@@ -1,19 +1,35 @@
1
1
  - answers.each do |answer|
2
- .answer{ :class => ('private' if answer.private?) }
2
+ .answer
3
3
  .info
4
4
  - if answer.private?
5
- %strong
6
- Private answer
7
- = "#{time_ago_in_words(answer.created_at)} ago"
5
+ %strong.private
6
+ %i.fa.fa-lock
7
+ = t('radesk.ui.answers.private')
8
+ = time_ago_in_words(answer.created_at)
9
+ = t('radesk.ui.ago')
8
10
  = answer.created_at.strftime("(%-d %b %k:%M)")
9
- by
10
- = answer.user.email
11
+ = t('radesk.ui.by')
12
+ = link_to_if radesk_current_user.try(:radesk_admin?), answer.user.email, admin_user_path(answer.user)
11
13
  - if answer.has_access?(radesk_current_user)
12
- %span
13
- = link_to edit_ticket_answer_path(answer.ticket, answer) do
14
- %i.fa.fa-pencil.light
15
- %span
16
- = link_to ticket_answer_path(answer.ticket, answer), :method => :delete do
17
- %i.fa.fa-close.light
14
+ - if answers.first == answer
15
+ %span
16
+ = link_to edit_ticket_path(answer.ticket) do
17
+ %i.fa.fa-pencil.light
18
+ %span
19
+ = link_to ticket_path(answer.ticket), :method => :delete do
20
+ %i.fa.fa-close.light
21
+ - else
22
+ %span
23
+ = link_to edit_ticket_answer_path(answer.ticket, answer) do
24
+ %i.fa.fa-pencil.light
25
+ %span
26
+ = link_to ticket_answer_path(answer.ticket, answer), :method => :delete do
27
+ %i.fa.fa-close.light
18
28
  .message
19
- = answer.message
29
+ = answer.message
30
+ - if answer.uploads.size > 0
31
+ .uploads
32
+ - answer.uploads.each do |upload|
33
+ .file
34
+ %i.fa.fa-file-o
35
+ = link_to upload.file_file_name, upload.file.url, :target => "_blank"
@@ -0,0 +1,2 @@
1
+ .form-group
2
+ = f.file_field :file
@@ -1,7 +1,2 @@
1
1
  .form
2
- = form_for [@answer.ticket, @answer] do |f|
3
- .form-group
4
- = f.label :message
5
- = f.text_area :message, :class => 'form-control', :rows => 10, :required => true
6
- .form-group.text-right
7
- = f.submit 'Save Answer', :class => 'btn'
2
+ = render 'form', :ticket => @answer.ticket, :answer => @answer
@@ -4,10 +4,11 @@
4
4
  = f.label :title
5
5
  = f.text_field :title, :class => 'form-control', :required => true
6
6
  .form-group
7
- = f.label :message
8
- = f.text_area :message, :class => 'form-control textarea', :rows => 10, :required => true
7
+ = f.fields_for :answers, @ticket.answers.first do |answer_fields|
8
+ = answer_fields.label :message
9
+ = answer_fields.text_area :message, :class => 'form-control textarea', :rows => 10, :required => true
9
10
  .form-group
10
11
  = f.label :category_id
11
- = f.select :category_id, Radesk::Category.all.map{ |c| [c.title, c.id] }, {}, :class => 'form-control select'
12
+ = f.select :category_id, Radesk::Category.all.map{ |c| [c.title, c.id] }, { :prompt => 'No category' }, :class => 'form-control select'
12
13
  .form-group.text-right
13
- = f.submit 'Save Ticket', :class => 'btn'
14
+ = f.submit t('radesk.ui.tickets.save'), :class => 'btn'
@@ -0,0 +1,23 @@
1
+ %table.table
2
+ %tbody
3
+ - tickets.each do |ticket|
4
+ %tr
5
+ %td.status
6
+ %span{ :class => "ticket-status-#{ticket.id}"}
7
+ = render 'radesk/tickets/status', :ticket => ticket
8
+ %td
9
+ .title
10
+ = link_to ticket do
11
+ %strong
12
+ = ticket.title.truncate(100)
13
+ - if ticket.answers.first
14
+ %span.message
15
+ = ticket.answers.first.message.truncate(100)
16
+ %td
17
+ - if ticket.category
18
+ = link_to ticket.category.title, category_tickets_path(ticket.category), :class => 'ticket-category'
19
+ %td.created_at.text-right
20
+ = time_ago_in_words(ticket.created_at)
21
+ = t('radesk.ui.ago')
22
+ = ticket.created_at.strftime("(%-d %b %k:%M)")
23
+ = paginate tickets
@@ -1,26 +1,15 @@
1
1
  - if @tickets.any?
2
2
  %h1
3
- Tickets
4
- = link_to "New Ticket", new_ticket_path, :class => 'btn pull-right'
5
- %table.table
6
- %tbody
7
- - @tickets.each do |ticket|
8
- %tr
9
- %td.status
10
- %span{ :class => "ticket-status-#{ticket.id}"}
11
- = render 'status', :ticket => ticket
12
- %td
13
- .title
14
- = link_to ticket do
15
- %strong
16
- = ticket.title.truncate(100)
17
- %span.message
18
- = ticket.message.truncate(100)
19
- %td
20
- - if ticket.category
21
- %span.ticket-category
22
- = ticket.category.title
23
- %td.created_at.text-right
24
- = "#{time_ago_in_words(ticket.created_at)} ago"
25
- = ticket.created_at.strftime("(%-d %b %k:%M)")
26
- = paginate @tickets
3
+ = t('radesk.ui.tickets.index')
4
+ = link_to t('radesk.ui.tickets.new'), new_ticket_path, :class => 'btn pull-right'
5
+ - if params[:action] == 'category'
6
+ = t('radesk.ui.tickets.within')
7
+ = @category.title
8
+ = render 'list', :tickets => @tickets
9
+ - else
10
+ .add-something.text-center
11
+ .title
12
+ = t('radesk.ui.tickets.not_found')
13
+ .description
14
+ = t('radesk.ui.but_you_can_create')
15
+ = link_to t('radesk.ui.tickets.new'), new_ticket_path, :class => 'btn'
@@ -1,4 +1,3 @@
1
- %h1
2
- Have a problem?
1
+ %h1= t('radesk.ui.tickets.new')
3
2
  .form
4
3
  = render 'form'
@@ -2,41 +2,10 @@
2
2
  %span{ :class => "ticket-status-#{@ticket.id}"}
3
3
  = render 'status', :ticket => @ticket
4
4
  = @ticket.title
5
- .ticket
6
- .info
7
- = "#{time_ago_in_words(@ticket.created_at)} ago"
8
- = @ticket.created_at.strftime("(%-d %b %k:%M)")
9
- by
10
- = @ticket.user.email
11
- - if radesk_current_user.try(:radesk_admin?)
12
- %span
13
- = link_to edit_ticket_path(@ticket) do
14
- %i.fa.fa-pencil.light
15
- %span
16
- = link_to ticket_path(@ticket), :method => :delete do
17
- %i.fa.fa-close.light
18
- - if @ticket.category
19
- %span.ticket-category
20
- = @ticket.category.title
21
- .message
22
- = @ticket.message
23
-
24
- - if @ticket.answers.any?
25
- %h2
26
- = pluralize(@answers.count, 'answer')
27
- .answers
28
- = render 'radesk/answers/list', :answers => @answers
5
+ .answers
6
+ = render 'radesk/answers/list', :answers => @answers
29
7
  %h2
30
- Your Answer
8
+ = t('radesk.ui.answers.your')
31
9
  .create_answer
32
10
  .form
33
- = form_for [@ticket, @ticket.answers.build] do |f|
34
- .form-group
35
- = f.text_area :message, :class => 'form-control textarea', :rows => 5, :required => true
36
- - if radesk_current_user.radesk_admin?
37
- .form-group.text-right
38
- = f.label :private do
39
- = f.check_box :private, :class => 'form-control'
40
- Mark as private
41
- .form-group.text-right
42
- = f.submit 'Post Answer', :class => 'btn'
11
+ = render 'radesk/answers/form', :ticket => @ticket, :answer => @ticket.answers.build
@@ -0,0 +1 @@
1
+ $(".upload-<%= @upload.id %>").hide();
@@ -0,0 +1,51 @@
1
+ en:
2
+ radesk:
3
+ ui:
4
+ home: Home
5
+ delete: Delete
6
+ by: by
7
+ ago: ago
8
+ logged_as_admin: Logged as administrator
9
+ but_you_can_create: But you can create a new one
10
+ tickets:
11
+ index: Tickets
12
+ save: Save Ticket
13
+ new: New Ticket
14
+ not_found: No tickets found
15
+ within: within
16
+ answers:
17
+ index: Answer
18
+ private: Private
19
+ your: Your Answer
20
+ mark_as_private: Mark as private
21
+ post: Post Answer
22
+ save: Save Answer
23
+ categories:
24
+ index: Categories
25
+ edit: Edit Category
26
+ save: Save Category
27
+ new: New Category
28
+ not_found: No categories found
29
+ activities:
30
+ index: Activity Feed
31
+ ticket:
32
+ create: created ticket
33
+ update: updated ticket
34
+ destroy: destroyed ticket
35
+ open: opened ticket
36
+ close: closed ticket
37
+ answer:
38
+ create: added answer to ticket
39
+ update: updated answer to ticket
40
+ destroy: destroyed answer from ticket
41
+ activerecord:
42
+ attributes:
43
+ ticket:
44
+ title: Your Question
45
+ message: Description
46
+ category_id: Category
47
+ answer:
48
+ message: Your Answer
49
+ private: Private
50
+ category:
51
+ title: Title
@@ -0,0 +1,37 @@
1
+ zh-CN:
2
+ radesk:
3
+ ui:
4
+ home: 主页
5
+ by: 属于
6
+ ago: 前制造
7
+ logged_as_admin: 登录为管理员
8
+ but_you_can_create: 但是你可以创建新的
9
+ tickets:
10
+ index: 票
11
+ save: 保存票
12
+ new: 新票
13
+ not_found: 找不到票
14
+ answers:
15
+ index: 答案
16
+ private: 私有答案
17
+ your: 您的答案
18
+ mark_as_private: 标记为私有
19
+ post: 发表答案
20
+ save: 保存答案
21
+ categories:
22
+ index: 类别
23
+ edit: 编辑类别
24
+ save: 保存类别
25
+ new: 新类别
26
+ not_found: 未找到类别
27
+ activerecord:
28
+ attributes:
29
+ ticket:
30
+ title: 您的问题
31
+ message: 说面
32
+ category_id: 类别
33
+ answer:
34
+ message: 您的答案
35
+ private: 私有
36
+ category:
37
+ title: 标题
@@ -1,14 +1,23 @@
1
1
  Radesk::Engine.routes.draw do
2
+
2
3
  resources :tickets do
3
4
  member do
4
5
  get 'open'
5
6
  get 'close'
6
7
  end
8
+ collection do
9
+ get 'category/:id' => 'tickets#category', :as => :category
10
+ end
7
11
  resources :answers, :except => [:index, :show, :new]
8
12
  end
9
13
 
14
+ resources :uploads, :only => [:destroy]
15
+
16
+
10
17
  namespace :admin do
11
18
  resources :categories, :except => [:show]
19
+ resources :users, :only => [:show]
20
+ resources :activities, :only => :index
12
21
  end
13
22
 
14
23
  root 'tickets#index'