radesk 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/radesk/radesk.js.coffee +4 -0
- data/app/assets/stylesheets/radesk/radesk.css.scss +41 -19
- data/app/controllers/radesk/admin/activities_controller.rb +11 -0
- data/app/controllers/radesk/admin/admin_controller.rb +9 -0
- data/app/controllers/radesk/admin/categories_controller.rb +2 -3
- data/app/controllers/radesk/admin/users_controller.rb +18 -0
- data/app/controllers/radesk/answers_controller.rb +9 -11
- data/app/controllers/radesk/application_controller.rb +5 -1
- data/app/controllers/radesk/tickets_controller.rb +23 -13
- data/app/controllers/radesk/uploads_controller.rb +18 -0
- data/app/helpers/radesk/activities_helper.rb +11 -0
- data/app/helpers/radesk/application_helper.rb +9 -0
- data/app/mailers/radesk/user_mailer.rb +5 -4
- data/app/models/radesk/activity.rb +6 -0
- data/app/models/radesk/answer.rb +7 -3
- data/app/models/radesk/concerns/access.rb +9 -0
- data/app/models/radesk/ticket.rb +8 -5
- data/app/models/radesk/upload.rb +9 -0
- data/app/views/layouts/radesk/application.html.haml +6 -5
- data/app/views/radesk/admin/activities/_answer.html.haml +1 -0
- data/app/views/radesk/admin/activities/_ticket.html.haml +1 -0
- data/app/views/radesk/admin/activities/index.html.haml +16 -0
- data/app/views/radesk/admin/categories/_form.html.haml +3 -1
- data/app/views/radesk/admin/categories/edit.html.haml +1 -2
- data/app/views/radesk/admin/categories/index.html.haml +11 -9
- data/app/views/radesk/admin/categories/new.html.haml +1 -2
- data/app/views/radesk/admin/users/show.html.haml +3 -0
- data/app/views/radesk/answers/_form.html.haml +24 -0
- data/app/views/radesk/answers/_list.html.haml +29 -13
- data/app/views/radesk/answers/_upload_fields.html.haml +2 -0
- data/app/views/radesk/answers/edit.html.haml +1 -6
- data/app/views/radesk/tickets/_form.html.haml +5 -4
- data/app/views/radesk/tickets/_list.html.haml +23 -0
- data/app/views/radesk/tickets/index.html.haml +13 -24
- data/app/views/radesk/tickets/new.html.haml +1 -2
- data/app/views/radesk/tickets/show.html.haml +4 -35
- data/app/views/radesk/uploads/destroy.js.erb +1 -0
- data/config/locales/en.yml +51 -0
- data/config/locales/zh-CN.yml +37 -0
- data/config/routes.rb +9 -0
- data/db/migrate/20150112111134_remove_message_from_radesk_tickets.rb +5 -0
- data/db/migrate/20150112182604_create_radesk_uploads.rb +11 -0
- data/db/migrate/20150114194722_create_radesk_activities.rb +11 -0
- data/lib/generators/radesk/dummy/templates/Rakefile +6 -0
- data/lib/generators/radesk/dummy/templates/app/assets/javascripts/application.js +13 -0
- data/lib/generators/radesk/dummy/templates/app/assets/stylesheets/application.css +15 -0
- data/lib/generators/radesk/dummy/templates/app/controllers/application_controller.rb +5 -0
- data/lib/generators/radesk/dummy/templates/app/helpers/application_helper.rb +2 -0
- data/lib/generators/radesk/dummy/templates/app/models/user.rb +10 -0
- data/lib/generators/radesk/dummy/templates/app/views/layouts/application.html.erb +14 -0
- data/lib/generators/radesk/dummy/templates/bin/bundle +3 -0
- data/lib/generators/radesk/dummy/templates/bin/rails +4 -0
- data/lib/generators/radesk/dummy/templates/bin/rake +4 -0
- data/lib/generators/radesk/dummy/templates/bin/setup +29 -0
- data/lib/generators/radesk/dummy/templates/config.ru +4 -0
- data/lib/generators/radesk/dummy/templates/config/application.rb +31 -0
- data/lib/generators/radesk/dummy/templates/config/boot.rb +5 -0
- data/lib/generators/radesk/dummy/templates/config/database.yml +25 -0
- data/lib/generators/radesk/dummy/templates/config/environment.rb +5 -0
- data/lib/generators/radesk/dummy/templates/config/environments/development.rb +44 -0
- data/lib/generators/radesk/dummy/templates/config/environments/production.rb +79 -0
- data/lib/generators/radesk/dummy/templates/config/environments/test.rb +42 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/assets.rb +11 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/backtrace_silencers.rb +7 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/cookies_serializer.rb +3 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/devise.rb +259 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/filter_parameter_logging.rb +4 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/inflections.rb +16 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/mime_types.rb +4 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/session_store.rb +3 -0
- data/lib/generators/radesk/dummy/templates/config/initializers/wrap_parameters.rb +14 -0
- data/lib/generators/radesk/dummy/templates/config/locales/devise.en.yml +60 -0
- data/lib/generators/radesk/dummy/templates/config/locales/en.yml +23 -0
- data/lib/generators/radesk/dummy/templates/config/routes.rb +3 -0
- data/lib/generators/radesk/dummy/templates/config/secrets.yml +22 -0
- data/lib/generators/radesk/dummy/templates/db/migrate/20150108203658_devise_create_users.rb +42 -0
- data/lib/generators/radesk/dummy/templates/public/404.html +67 -0
- data/lib/generators/radesk/dummy/templates/public/422.html +67 -0
- data/lib/generators/radesk/dummy/templates/public/500.html +66 -0
- data/lib/generators/radesk/dummy/templates/public/favicon.ico +0 -0
- data/lib/generators/radesk/dummy_generator.rb +13 -0
- data/lib/generators/radesk/install/templates/initializer.rb +2 -0
- data/lib/radesk.rb +8 -0
- data/lib/radesk/version.rb +1 -1
- metadata +176 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2ed092bc42cc7e458336c1c4e0a11904dd13474
|
4
|
+
data.tar.gz: aa72ca554c26ad3e28e5c2f9eb1ee33959e2c6c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74b0cd8822399fde34cb6f7dbbe22867fd35fb1391ff42d73b78a942387d628a816db73f4fa044283604b3acb57b0e7c0d2672e3634674ff555d212376ce8e33
|
7
|
+
data.tar.gz: c53a78034253365ac4c094d052abd55e6a028c4084e5d7512fbffa63c817bdedbebd3ca138e96d7ee0c34f5c6cb70d0e9475a63522e73aa7965b0a0ad3796515
|
@@ -11,7 +11,7 @@ $light_color: #f6f6f6;
|
|
11
11
|
}
|
12
12
|
}
|
13
13
|
a {
|
14
|
-
color: $dark_color;
|
14
|
+
color: $dark_color;
|
15
15
|
text-decoration: none;
|
16
16
|
&:hover {
|
17
17
|
color: $main_color;
|
@@ -28,8 +28,6 @@ $light_color: #f6f6f6;
|
|
28
28
|
margin: 0 auto;
|
29
29
|
}
|
30
30
|
|
31
|
-
|
32
|
-
|
33
31
|
.notice {
|
34
32
|
background: $main_color;
|
35
33
|
color: #fff;
|
@@ -125,34 +123,29 @@ $light_color: #f6f6f6;
|
|
125
123
|
|
126
124
|
.ticket {
|
127
125
|
margin-bottom: 40px;
|
128
|
-
.message {
|
129
|
-
font-size: 14px;
|
130
|
-
line-height: 20px;
|
131
|
-
}
|
132
|
-
.info {
|
133
|
-
margin-bottom: 20px;
|
134
|
-
color: darken($light_color, 20%);
|
135
|
-
span {
|
136
|
-
margin-left: 10px;
|
137
|
-
}
|
138
|
-
}
|
139
126
|
}
|
140
127
|
|
141
128
|
.answers {
|
142
129
|
margin-bottom: 40px;
|
143
130
|
.answer {
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
131
|
+
margin-bottom: 20px;
|
132
|
+
padding-bottom: 20px;
|
133
|
+
border-bottom: 1px solid $light_color;
|
134
|
+
&:last-child {
|
135
|
+
border: none;
|
149
136
|
}
|
150
137
|
.info {
|
151
138
|
margin-bottom: 10px;
|
152
139
|
color: darken($light_color, 20%);
|
140
|
+
.private {
|
141
|
+
color: $main_color;
|
142
|
+
}
|
153
143
|
span {
|
154
144
|
margin-left: 10px;
|
155
145
|
}
|
146
|
+
a {
|
147
|
+
color: darken($light_color, 20%);
|
148
|
+
}
|
156
149
|
}
|
157
150
|
.message {
|
158
151
|
font-size: 14px;
|
@@ -161,6 +154,19 @@ $light_color: #f6f6f6;
|
|
161
154
|
}
|
162
155
|
}
|
163
156
|
|
157
|
+
.uploads {
|
158
|
+
padding-top: 20px;
|
159
|
+
.file {
|
160
|
+
margin-bottom: 3px;
|
161
|
+
.fa {
|
162
|
+
margin-right: 3px;
|
163
|
+
}
|
164
|
+
a {
|
165
|
+
color: darken($light_color, 20%);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
164
170
|
.btn {
|
165
171
|
display: inline-block;
|
166
172
|
padding: 8px 13px;
|
@@ -212,6 +218,22 @@ $light_color: #f6f6f6;
|
|
212
218
|
margin-right: 5px;
|
213
219
|
}
|
214
220
|
}
|
221
|
+
.beside {
|
222
|
+
display: inline-block;
|
223
|
+
margin-left: 10px;
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
228
|
+
.add-something {
|
229
|
+
padding-top: 100px;
|
230
|
+
.title {
|
231
|
+
font-size: 20px;
|
232
|
+
margin-bottom: 5px;
|
233
|
+
}
|
234
|
+
.description {
|
235
|
+
color: darken($light_color, 20%);
|
236
|
+
margin-bottom: 20px;
|
215
237
|
}
|
216
238
|
}
|
217
239
|
}
|
@@ -2,10 +2,9 @@ require_dependency "radesk/application_controller"
|
|
2
2
|
|
3
3
|
module Radesk
|
4
4
|
module Admin
|
5
|
-
class CategoriesController <
|
5
|
+
class CategoriesController < AdminController
|
6
6
|
before_action :set_category, only: [:show, :destroy, :edit, :update]
|
7
|
-
|
8
|
-
|
7
|
+
|
9
8
|
def index
|
10
9
|
@categories = Category.all
|
11
10
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_dependency "radesk/application_controller"
|
2
|
+
|
3
|
+
module Radesk
|
4
|
+
module Admin
|
5
|
+
class UsersController < AdminController
|
6
|
+
before_action :set_user, only: [:show]
|
7
|
+
|
8
|
+
def show
|
9
|
+
@tickets = Radesk::Ticket.where(:user_id => @user).page(params[:page]).per(20)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def set_user
|
14
|
+
@user = Radesk.user_class_name.constantize.find(params[:id])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,19 +2,20 @@ require_dependency "radesk/application_controller"
|
|
2
2
|
|
3
3
|
module Radesk
|
4
4
|
class AnswersController < ApplicationController
|
5
|
-
|
6
|
-
|
5
|
+
include Radesk::ActivitiesHelper
|
6
|
+
|
7
7
|
before_action :radesk_authorize!
|
8
|
+
before_action :set_answer, only: [:edit, :update, :destroy]
|
9
|
+
before_filter -> { radesk_check_access(@answer) }, only: [:edit, :update, :destroy]
|
8
10
|
|
9
11
|
def create
|
10
12
|
@answer = Answer.new(answer_params)
|
11
|
-
@answer.user_id =
|
13
|
+
@answer.user_id = radesk_current_user.id
|
12
14
|
@answer.ticket_id = params[:ticket_id]
|
13
15
|
|
14
16
|
if @answer.save
|
15
|
-
|
16
|
-
|
17
|
-
end
|
17
|
+
UserMailer.new_answer(@answer).deliver_now
|
18
|
+
add_activity(@answer, 'create')
|
18
19
|
redirect_to @answer.ticket, notice: 'Answer was successfully created.'
|
19
20
|
else
|
20
21
|
redirect_to :back, notice: @answer.errors.full_messages.first
|
@@ -26,6 +27,7 @@ module Radesk
|
|
26
27
|
|
27
28
|
def update
|
28
29
|
if @answer.update(answer_params)
|
30
|
+
add_activity(@answer, 'update')
|
29
31
|
redirect_to @answer.ticket, notice: 'Answer was successfully updated.'
|
30
32
|
else
|
31
33
|
render :edit
|
@@ -42,12 +44,8 @@ module Radesk
|
|
42
44
|
@answer = Answer.find(params[:id])
|
43
45
|
end
|
44
46
|
|
45
|
-
def check_access
|
46
|
-
redirect_to :back unless @answer.has_access?(radesk_current_user)
|
47
|
-
end
|
48
|
-
|
49
47
|
def answer_params
|
50
|
-
params.require(:answer).permit(:message, :private)
|
48
|
+
params.require(:answer).permit(:message, :private, :uploads_attributes => [:id, :file])
|
51
49
|
end
|
52
50
|
end
|
53
51
|
end
|
@@ -6,11 +6,15 @@ module Radesk
|
|
6
6
|
helper_method :radesk_current_user
|
7
7
|
|
8
8
|
def radesk_authorize!
|
9
|
-
redirect_to
|
9
|
+
redirect_to Radesk.sign_in_path if !(radesk_current_user)
|
10
10
|
end
|
11
11
|
|
12
12
|
def radesk_authorize_admin!
|
13
13
|
redirect_to root_path if !(radesk_current_user.radesk_admin?)
|
14
14
|
end
|
15
|
+
|
16
|
+
def radesk_check_access(object)
|
17
|
+
redirect_to root_path unless object.has_access?(radesk_current_user)
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
@@ -2,13 +2,20 @@ require_dependency "radesk/application_controller"
|
|
2
2
|
|
3
3
|
module Radesk
|
4
4
|
class TicketsController < ApplicationController
|
5
|
-
|
6
|
-
|
5
|
+
include Radesk::ActivitiesHelper
|
6
|
+
|
7
7
|
before_action :radesk_authorize!
|
8
|
+
before_action :set_ticket, only: [:show, :edit, :update, :destroy, :open, :close]
|
9
|
+
before_action :set_tickets, only: [:index, :category]
|
10
|
+
before_filter -> { radesk_check_access(@ticket) }, only: [:show, :edit, :update, :destroy, :open, :close]
|
8
11
|
|
9
12
|
def index
|
10
|
-
|
11
|
-
|
13
|
+
end
|
14
|
+
|
15
|
+
def category
|
16
|
+
@category = Radesk::Category.find(params[:id])
|
17
|
+
@tickets = @tickets.where(:category_id => @category)
|
18
|
+
render :index
|
12
19
|
end
|
13
20
|
|
14
21
|
def show
|
@@ -20,13 +27,16 @@ module Radesk
|
|
20
27
|
|
21
28
|
def new
|
22
29
|
@ticket = Ticket.new
|
30
|
+
@ticket.answers.build
|
23
31
|
end
|
24
32
|
|
25
33
|
def create
|
26
34
|
@ticket = Ticket.new(ticket_params)
|
27
35
|
@ticket.user_id = send(Radesk.current_user_method_name).id
|
36
|
+
@ticket.answers.first.user = radesk_current_user
|
28
37
|
|
29
38
|
if @ticket.save
|
39
|
+
add_activity(@ticket, 'create')
|
30
40
|
redirect_to @ticket, notice: 'Ticket was successfully created.'
|
31
41
|
else
|
32
42
|
render :new
|
@@ -38,6 +48,7 @@ module Radesk
|
|
38
48
|
|
39
49
|
def update
|
40
50
|
if @ticket.update(ticket_params)
|
51
|
+
add_activity(@ticket, 'update')
|
41
52
|
redirect_to @ticket, notice: 'Ticket was successfully updated.'
|
42
53
|
else
|
43
54
|
render :edit
|
@@ -45,21 +56,19 @@ module Radesk
|
|
45
56
|
end
|
46
57
|
|
47
58
|
def destroy
|
48
|
-
|
49
|
-
|
50
|
-
redirect_to tickets_url, notice: 'Ticket was successfully destroyed.'
|
51
|
-
else
|
52
|
-
redirect_to :back
|
53
|
-
end
|
59
|
+
@ticket.destroy
|
60
|
+
redirect_to tickets_url, notice: 'Ticket was successfully destroyed.'
|
54
61
|
end
|
55
62
|
|
56
63
|
def open
|
57
64
|
@ticket.update(:closed => false)
|
65
|
+
add_activity(@ticket, 'open')
|
58
66
|
render 'update_status'
|
59
67
|
end
|
60
68
|
|
61
69
|
def close
|
62
70
|
@ticket.update(:closed => true)
|
71
|
+
add_activity(@ticket, 'close')
|
63
72
|
render 'update_status'
|
64
73
|
end
|
65
74
|
|
@@ -68,12 +77,13 @@ module Radesk
|
|
68
77
|
@ticket = Ticket.find(params[:id])
|
69
78
|
end
|
70
79
|
|
71
|
-
def
|
72
|
-
|
80
|
+
def set_tickets
|
81
|
+
@tickets = Ticket.includes(Radesk.user_class_name.downcase.to_sym).all.page(params[:page]).per(20)
|
82
|
+
@tickets = @tickets.where(:user_id => radesk_current_user.id) unless radesk_current_user.try(:radesk_admin?)
|
73
83
|
end
|
74
84
|
|
75
85
|
def ticket_params
|
76
|
-
params.require(:ticket).permit(:title, :message, :closed, :category_id)
|
86
|
+
params.require(:ticket).permit(:title, :message, :closed, :category_id, :answers_attributes => [:id, :message])
|
77
87
|
end
|
78
88
|
end
|
79
89
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_dependency "radesk/application_controller"
|
2
|
+
|
3
|
+
module Radesk
|
4
|
+
class UploadsController < ApplicationController
|
5
|
+
before_action :radesk_authorize!
|
6
|
+
before_action :set_upload, only: [:destroy]
|
7
|
+
before_filter -> { radesk_check_access(@upload.answer) }, only: [:destroy]
|
8
|
+
|
9
|
+
def destroy
|
10
|
+
@upload.destroy
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def set_upload
|
15
|
+
@upload = Radesk::Upload.find(params[:id])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Radesk
|
2
|
+
module ActivitiesHelper
|
3
|
+
def add_activity(trackable, action = params[:action])
|
4
|
+
Radesk::Activity.create(:user_id => radesk_current_user, :action => action, :trackable => trackable)
|
5
|
+
end
|
6
|
+
|
7
|
+
def destroy_activities(trackable)
|
8
|
+
Radesk::Activity.where(:trackable_id => trackable.id).destroy_all
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,4 +1,13 @@
|
|
1
1
|
module Radesk
|
2
2
|
module ApplicationHelper
|
3
|
+
def link_to_add_fields(name = nil, f, association, partial, &block)
|
4
|
+
new_object = f.object.send(association).klass.new
|
5
|
+
fields = f.fields_for association, new_object do |builder|
|
6
|
+
render :partial => "radesk/#{partial}", :locals => { :f => builder }
|
7
|
+
end
|
8
|
+
link_to '#', class: "add_fields", data: { id: new_object.object_id, fields: fields.gsub("\n", "") } do
|
9
|
+
name || capture(&block)
|
10
|
+
end
|
11
|
+
end
|
3
12
|
end
|
4
13
|
end
|
@@ -2,10 +2,11 @@ module Radesk
|
|
2
2
|
class UserMailer < ActionMailer::Base
|
3
3
|
default :from => Radesk.email_from
|
4
4
|
|
5
|
-
def new_answer(
|
6
|
-
@ticket =
|
7
|
-
|
8
|
-
|
5
|
+
def new_answer(answer)
|
6
|
+
@ticket = answer.ticket
|
7
|
+
if answer.user.id != answer.ticket.user.id && !answer.private?
|
8
|
+
mail(:to => @ticket.user.email, :subject => 'New answer')
|
9
|
+
end
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
data/app/models/radesk/answer.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
module Radesk
|
2
2
|
class Answer < ActiveRecord::Base
|
3
|
+
include Radesk::Concerns::Access
|
4
|
+
include Radesk::ActivitiesHelper
|
5
|
+
|
3
6
|
belongs_to :user, :class_name => Radesk.user_class_name.to_s, :foreign_key => :user_id
|
4
7
|
belongs_to :ticket
|
8
|
+
has_many :uploads
|
9
|
+
|
10
|
+
accepts_nested_attributes_for :uploads
|
5
11
|
|
6
12
|
validates_presence_of :message
|
7
13
|
|
8
14
|
scope :without_private, -> { where(:private => false) }
|
9
15
|
|
10
|
-
|
11
|
-
self.user_id == user.id || user.try(:radesk_admin?)
|
12
|
-
end
|
16
|
+
after_destroy { |answer| destroy_activities(answer) }
|
13
17
|
end
|
14
18
|
end
|
data/app/models/radesk/ticket.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
module Radesk
|
2
2
|
class Ticket < ActiveRecord::Base
|
3
|
+
include Radesk::Concerns::Access
|
4
|
+
include Radesk::ActivitiesHelper
|
5
|
+
|
3
6
|
belongs_to :user, :class_name => Radesk.user_class_name.to_s, :foreign_key => :user_id
|
4
7
|
belongs_to :category
|
5
|
-
has_many :answers
|
8
|
+
has_many :answers, :dependent => :destroy
|
9
|
+
|
10
|
+
accepts_nested_attributes_for :answers
|
6
11
|
|
7
|
-
validates_presence_of :title
|
12
|
+
validates_presence_of :title
|
8
13
|
|
9
14
|
default_scope { order('closed ASC').order('id DESC') }
|
10
15
|
|
11
|
-
|
12
|
-
self.user_id == user.id || user.try(:radesk_admin?)
|
13
|
-
end
|
16
|
+
after_destroy { |ticket| destroy_activities(ticket) }
|
14
17
|
end
|
15
18
|
end
|