radesk 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f7b38ad11a78e20bbeae91ceda73bcaa435ccc4
4
- data.tar.gz: f8e6211a2b5a4e7acdee34acad6cddc138483c81
3
+ metadata.gz: cc951107bd076dc1fa44b4c559672d1d8f368fff
4
+ data.tar.gz: 8dbf8b5bd494980eed407be55f7f836d66989136
5
5
  SHA512:
6
- metadata.gz: 6e4e2b7b1172f28bb91c20e9636602417ac1fcba77660f91be54744aa61ba3900654d1e03183055e826138fbc0b285f8949c72d170894a3d81dd02a5c2335e34
7
- data.tar.gz: dd66ec2fff5b137b90c58ec552760c9a4d4751d506fa471c5f7f1e760d986237d21bbd36b75dea21cfc23c734450ae3a80ec92f55b4f2dcadec5d5073442c6e2
6
+ metadata.gz: 1f5572478e61d09ba31065e1fc8a7356784076d13f763c6a0d20fa5ed6c16eacbbb40522114e3d21bcd96512976a472ed148d8f3f1383e70fd56de29cdd27879
7
+ data.tar.gz: 21a91363a3e735fddce8cbc3fc50d0dea6d87fd94693f492c0ff3eeeaf65ca2eaf593acb0c9df3c0afc26f8e0489927f3dbedec7542f3a6af84160bf1570896d
@@ -28,6 +28,8 @@ $light_color: #f6f6f6;
28
28
  margin: 0 auto;
29
29
  }
30
30
 
31
+
32
+
31
33
  .notice {
32
34
  background: $main_color;
33
35
  color: #fff;
@@ -36,7 +38,7 @@ $light_color: #f6f6f6;
36
38
 
37
39
  .nav {
38
40
  border-bottom: 1px solid darken($light_color, 5%);
39
- padding: 12px 0;
41
+ line-height: 40px;
40
42
  margin-bottom: 40px;
41
43
  a {
42
44
  font-weight: bold;
@@ -68,7 +70,7 @@ $light_color: #f6f6f6;
68
70
  }
69
71
  }
70
72
 
71
- .tickets {
73
+ .table {
72
74
  width: 100%;
73
75
  border-collapse: collapse;
74
76
  margin-bottom: 20px;
@@ -112,6 +114,15 @@ $light_color: #f6f6f6;
112
114
  }
113
115
  }
114
116
 
117
+ .ticket-category {
118
+ background: $light_color;
119
+ border: 1px solid darken($light_color, 5%);
120
+ padding: 5px 7px;
121
+ border-radius: 3px;
122
+ font-size: 10px;
123
+ color: $dark_color;
124
+ }
125
+
115
126
  .ticket {
116
127
  margin-bottom: 40px;
117
128
  .message {
@@ -121,18 +132,27 @@ $light_color: #f6f6f6;
121
132
  .info {
122
133
  margin-bottom: 20px;
123
134
  color: darken($light_color, 20%);
135
+ span {
136
+ margin-left: 10px;
137
+ }
124
138
  }
125
139
  }
126
140
 
127
141
  .answers {
128
142
  margin-bottom: 40px;
129
143
  .answer {
130
- padding-top: 20px;
131
- margin-bottom: 20px;
144
+ padding: 20px 0;
132
145
  border-top: 1px solid darken($light_color, 5%);
146
+ &.private {
147
+ background: $light_color;
148
+ padding: 20px;
149
+ }
133
150
  .info {
134
151
  margin-bottom: 10px;
135
152
  color: darken($light_color, 20%);
153
+ span {
154
+ margin-left: 10px;
155
+ }
136
156
  }
137
157
  .message {
138
158
  font-size: 14px;
@@ -143,9 +163,7 @@ $light_color: #f6f6f6;
143
163
 
144
164
  .btn {
145
165
  display: inline-block;
146
- height: 34px;
147
- line-height: 34px;
148
- padding: 0 13px;
166
+ padding: 8px 13px;
149
167
  background: $main_color;
150
168
  border: 1px solid $main_color;
151
169
  color: #fff;
@@ -167,30 +185,32 @@ $light_color: #f6f6f6;
167
185
 
168
186
  .form {
169
187
  overflow: hidden;
170
- padding: 20px 20px 0;
171
188
  margin-bottom: 40px;
172
- background: #fff;
173
- border-radius: 3px;
174
189
  .form-group {
175
190
  margin-bottom: 20px;
176
191
  label {
177
192
  display: block;
178
193
  margin-bottom: 5px;
179
- color: $main_color;
180
- font-weight: bold;
181
194
  }
182
195
  .form-control {
183
- background: #fff;
184
- width: 100%;
185
- border: 1px solid darken($light_color, 5%);
186
- border-radius: 5px;
187
- font-family: 'Arial';
188
- font-size: 12px;
189
- box-sizing: border-box;
190
- padding: 10px;
196
+ &[type=text], &.textarea, &.select {
197
+ background: #fff;
198
+ width: 100%;
199
+ border: 1px solid darken($light_color, 5%);
200
+ border-radius: 5px;
201
+ font-family: 'Arial';
202
+ font-size: 12px;
203
+ box-sizing: border-box;
204
+ -webkit-appearance: none;
205
+ padding: 10px;
206
+ }
191
207
  &:focus {
192
208
  outline: none;
193
209
  }
210
+ &[type=checkbox] {
211
+ vertical-align: text-top;
212
+ margin-right: 5px;
213
+ }
194
214
  }
195
215
  }
196
216
  }
@@ -0,0 +1,56 @@
1
+ require_dependency "radesk/application_controller"
2
+
3
+ module Radesk
4
+ module Admin
5
+ class CategoriesController < ApplicationController
6
+ before_action :set_category, only: [:show, :destroy, :edit, :update]
7
+ before_action :radesk_authorize_admin!
8
+
9
+ def index
10
+ @categories = Category.all
11
+ end
12
+
13
+ def show
14
+ end
15
+
16
+ def new
17
+ @category = Category.new
18
+ end
19
+
20
+ def create
21
+ @category = Category.new(category_params)
22
+
23
+ if @category.save
24
+ redirect_to admin_categories_path, notice: 'Category was successfully created.'
25
+ else
26
+ redirect_to admin_categories_path
27
+ end
28
+ end
29
+
30
+ def edit
31
+ end
32
+
33
+ def update
34
+ if @category.update(category_params)
35
+ redirect_to admin_categories_path, notice: 'Category was successfully updated.'
36
+ else
37
+ render :edit
38
+ end
39
+ end
40
+
41
+ def destroy
42
+ @category.destroy
43
+ redirect_to admin_categories_path, notice: 'Category was successfully destroyed.'
44
+ end
45
+
46
+ private
47
+ def set_category
48
+ @category = Category.find(params[:id])
49
+ end
50
+
51
+ def category_params
52
+ params.require(:category).permit(:title)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -12,7 +12,7 @@ module Radesk
12
12
  @answer.ticket_id = params[:ticket_id]
13
13
 
14
14
  if @answer.save
15
- if @answer.user.id != @answer.ticket.user.id
15
+ if @answer.user.id != @answer.ticket.user.id && !@answer.user.radesk_admin?
16
16
  UserMailer.new_answer(@answer.ticket.id).deliver
17
17
  end
18
18
  redirect_to @answer.ticket, notice: 'Answer was successfully created.'
@@ -21,6 +21,9 @@ module Radesk
21
21
  end
22
22
  end
23
23
 
24
+ def edit
25
+ end
26
+
24
27
  def update
25
28
  if @answer.update(answer_params)
26
29
  redirect_to @answer.ticket, notice: 'Answer was successfully updated.'
@@ -44,7 +47,7 @@ module Radesk
44
47
  end
45
48
 
46
49
  def answer_params
47
- params.require(:answer).permit(:message)
50
+ params.require(:answer).permit(:message, :private)
48
51
  end
49
52
  end
50
53
  end
@@ -8,5 +8,9 @@ module Radesk
8
8
  def radesk_authorize!
9
9
  redirect_to '/' if !(radesk_current_user)
10
10
  end
11
+
12
+ def radesk_authorize_admin!
13
+ redirect_to root_path if !(radesk_current_user.radesk_admin?)
14
+ end
11
15
  end
12
16
  end
@@ -2,17 +2,24 @@ require_dependency "radesk/application_controller"
2
2
 
3
3
  module Radesk
4
4
  class TicketsController < ApplicationController
5
- before_action :set_ticket, only: [:show, :destroy, :open, :close]
5
+ before_action :set_ticket, only: [:show, :edit, :update, :destroy, :open, :close]
6
+ before_action :check_access, only: [:show, :edit, :update, :destroy]
6
7
  before_action :radesk_authorize!
7
8
 
8
9
  def index
9
- @tickets = Ticket.includes(Radesk.user_class_name.downcase.to_sym).all.page(params[:page]).per(10)
10
+ @tickets = Ticket.includes(Radesk.user_class_name.downcase.to_sym).all.page(params[:page]).per(20)
10
11
  @tickets = @tickets.where(:user_id => radesk_current_user.id) unless radesk_current_user.try(:radesk_admin?)
11
- @ticket = Ticket.new
12
12
  end
13
13
 
14
14
  def show
15
15
  @answers = @ticket.answers.includes(Radesk.user_class_name.downcase.to_sym)
16
+ unless radesk_current_user.radesk_admin?
17
+ @answers = @answers.without_private
18
+ end
19
+ end
20
+
21
+ def new
22
+ @ticket = Ticket.new
16
23
  end
17
24
 
18
25
  def create
@@ -22,7 +29,18 @@ module Radesk
22
29
  if @ticket.save
23
30
  redirect_to @ticket, notice: 'Ticket was successfully created.'
24
31
  else
25
- redirect_to tickets_path
32
+ render :new
33
+ end
34
+ end
35
+
36
+ def edit
37
+ end
38
+
39
+ def update
40
+ if @ticket.update(ticket_params)
41
+ redirect_to @ticket, notice: 'Ticket was successfully updated.'
42
+ else
43
+ render :edit
26
44
  end
27
45
  end
28
46
 
@@ -50,8 +68,12 @@ module Radesk
50
68
  @ticket = Ticket.find(params[:id])
51
69
  end
52
70
 
71
+ def check_access
72
+ redirect_to :back unless @ticket.has_access?(radesk_current_user)
73
+ end
74
+
53
75
  def ticket_params
54
- params.require(:ticket).permit(:title, :message, :closed)
76
+ params.require(:ticket).permit(:title, :message, :closed, :category_id)
55
77
  end
56
78
  end
57
79
  end
@@ -1,10 +1,12 @@
1
1
  module Radesk
2
2
  class Answer < ActiveRecord::Base
3
3
  belongs_to :user, :class_name => Radesk.user_class_name.to_s, :foreign_key => :user_id
4
- belongs_to :ticket, :counter_cache => true
4
+ belongs_to :ticket
5
5
 
6
6
  validates_presence_of :message
7
7
 
8
+ scope :without_private, -> { where(:private => false) }
9
+
8
10
  def has_access?(user)
9
11
  self.user_id == user.id || user.try(:radesk_admin?)
10
12
  end
@@ -0,0 +1,7 @@
1
+ module Radesk
2
+ class Category < ActiveRecord::Base
3
+ has_many :tickets
4
+
5
+ validates_presence_of :title
6
+ end
7
+ end
@@ -1,10 +1,15 @@
1
1
  module Radesk
2
2
  class Ticket < ActiveRecord::Base
3
3
  belongs_to :user, :class_name => Radesk.user_class_name.to_s, :foreign_key => :user_id
4
+ belongs_to :category
4
5
  has_many :answers
5
6
 
6
7
  validates_presence_of :title, :message
7
8
 
8
9
  default_scope { order('closed ASC').order('id DESC') }
10
+
11
+ def has_access?(user)
12
+ self.user_id == user.id || user.try(:radesk_admin?)
13
+ end
9
14
  end
10
15
  end
@@ -6,7 +6,7 @@
6
6
  = stylesheet_link_tag "radesk/application", media: "all"
7
7
  = javascript_include_tag "radesk/application"
8
8
  = csrf_meta_tags
9
- %body{ :style => 'margin: 0; background: #f6f6f6;' }
9
+ %body{ :style => 'margin: 0;' }
10
10
  #radesk
11
11
  - if flash[:notice]
12
12
  .notice
@@ -17,6 +17,7 @@
17
17
  = link_to 'Home', '/'
18
18
  = link_to 'Tickets', tickets_path
19
19
  - if radesk_current_user.try(:radesk_admin?)
20
+ = link_to 'Categories', admin_categories_path
20
21
  %span.pull-right
21
22
  Logged as administrator
22
23
  .wrap
@@ -0,0 +1,7 @@
1
+ .form
2
+ = form_for [:admin, @category] do |f|
3
+ .form-group
4
+ = f.label :title
5
+ = f.text_field :title, :class => 'form-control', :required => true
6
+ .form-group.text-right
7
+ = f.submit 'Save Category', :class => 'btn'
@@ -0,0 +1,3 @@
1
+ %h1
2
+ Edit category
3
+ = render 'form'
@@ -0,0 +1,14 @@
1
+ %h1
2
+ Categories
3
+ = link_to "New Category", new_admin_category_path, :class => 'btn pull-right'
4
+ - if @categories.any?
5
+ %table.table
6
+ - @categories.each do |category|
7
+ %tr
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
@@ -0,0 +1,4 @@
1
+ %h1
2
+ New category
3
+ .form
4
+ = render 'form'
@@ -1,14 +1,18 @@
1
1
  - answers.each do |answer|
2
- .answer
2
+ .answer{ :class => ('private' if answer.private?) }
3
3
  .info
4
- Added
5
- %span
6
- = answer.created_at.strftime("%e %b %k:%M")
4
+ - if answer.private?
5
+ %strong
6
+ Private answer
7
+ = "#{time_ago_in_words(answer.created_at)} ago"
8
+ = answer.created_at.strftime("(%-d %b %k:%M)")
7
9
  by
8
- %span
9
- = answer.user.email
10
+ = answer.user.email
10
11
  - if answer.has_access?(radesk_current_user)
11
- %span.pull-right
12
+ %span
13
+ = link_to edit_ticket_answer_path(answer.ticket, answer) do
14
+ %i.fa.fa-pencil.light
15
+ %span
12
16
  = link_to ticket_answer_path(answer.ticket, answer), :method => :delete do
13
17
  %i.fa.fa-close.light
14
18
  .message
@@ -0,0 +1,7 @@
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'
@@ -5,6 +5,9 @@
5
5
  = f.text_field :title, :class => 'form-control', :required => true
6
6
  .form-group
7
7
  = f.label :message
8
- = f.text_area :message, :class => 'form-control', :rows => 10, :required => true
8
+ = f.text_area :message, :class => 'form-control textarea', :rows => 10, :required => true
9
+ .form-group
10
+ = f.label :category_id
11
+ = f.select :category_id, Radesk::Category.all.map{ |c| [c.title, c.id] }, {}, :class => 'form-control select'
9
12
  .form-group.text-right
10
- = f.submit 'Create New Ticket', :class => 'btn'
13
+ = f.submit 'Save Ticket', :class => 'btn'
@@ -1,11 +1,8 @@
1
- %h1
2
- Helpdesk
3
- .create_ticket
4
- = render 'form'
5
1
  - if @tickets.any?
6
2
  %h1
7
- Tickets history
8
- %table.tickets
3
+ Tickets
4
+ = link_to "New Ticket", new_ticket_path, :class => 'btn pull-right'
5
+ %table.table
9
6
  %tbody
10
7
  - @tickets.each do |ticket|
11
8
  %tr
@@ -19,12 +16,11 @@
19
16
  = ticket.title.truncate(100)
20
17
  %span.message
21
18
  = ticket.message.truncate(100)
22
- - if radesk_current_user.try(:radesk_admin?)
23
- %td.user
24
- = ticket.user.email
25
- %td.last-answer
26
- %i.fa{ :class => "fa-comment#{'-o' unless ticket.answers.any? && ticket.answers.last.user != radesk_current_user}" }
27
- = ticket.answers.size
19
+ %td
20
+ - if ticket.category
21
+ %span.ticket-category
22
+ = ticket.category.title
28
23
  %td.created_at.text-right
29
- = ticket.created_at.strftime("%e %b %k:%M")
24
+ = "#{time_ago_in_words(ticket.created_at)} ago"
25
+ = ticket.created_at.strftime("(%-d %b %k:%M)")
30
26
  = paginate @tickets
@@ -1,4 +1,4 @@
1
1
  %h1
2
- Create New Ticket
2
+ Have a problem?
3
3
  .form
4
4
  = render 'form'
@@ -4,29 +4,39 @@
4
4
  = @ticket.title
5
5
  .ticket
6
6
  .info
7
- Created
8
- %span
9
- = @ticket.created_at.strftime("%e %b %k:%M")
7
+ = "#{time_ago_in_words(@ticket.created_at)} ago"
8
+ = @ticket.created_at.strftime("(%-d %b %k:%M)")
10
9
  by
11
- %span
12
- = @ticket.user.email
10
+ = @ticket.user.email
13
11
  - if radesk_current_user.try(:radesk_admin?)
14
- %span.pull-right
12
+ %span
13
+ = link_to edit_ticket_path(@ticket) do
14
+ %i.fa.fa-pencil.light
15
+ %span
15
16
  = link_to ticket_path(@ticket), :method => :delete do
16
17
  %i.fa.fa-close.light
18
+ - if @ticket.category
19
+ %span.ticket-category
20
+ = @ticket.category.title
17
21
  .message
18
22
  = @ticket.message
19
23
 
20
24
  - if @ticket.answers.any?
21
25
  %h2
22
- Answers
26
+ = pluralize(@answers.count, 'answer')
23
27
  .answers
24
28
  = render 'radesk/answers/list', :answers => @answers
29
+ %h2
30
+ Your Answer
25
31
  .create_answer
26
32
  .form
27
33
  = form_for [@ticket, @ticket.answers.build] do |f|
28
34
  .form-group
29
- = f.label :message, 'Add Your Answer'
30
- = f.text_area :message, :class => 'form-control', :rows => 5, :required => true
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
31
41
  .form-group.text-right
32
42
  = f.submit 'Post Answer', :class => 'btn'
data/config/routes.rb CHANGED
@@ -4,7 +4,11 @@ Radesk::Engine.routes.draw do
4
4
  get 'open'
5
5
  get 'close'
6
6
  end
7
- resources :answers
7
+ resources :answers, :except => [:index, :show, :new]
8
+ end
9
+
10
+ namespace :admin do
11
+ resources :categories, :except => [:show]
8
12
  end
9
13
 
10
14
  root 'tickets#index'
@@ -0,0 +1,5 @@
1
+ class AddPrivateToRadeskAnswers < ActiveRecord::Migration
2
+ def change
3
+ add_column :radesk_answers, :private, :boolean, :default => false
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class CreateRadeskCategories < ActiveRecord::Migration
2
+ def change
3
+ create_table :radesk_categories do |t|
4
+ t.string :title
5
+
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddCategoryIdToRadeskTickets < ActiveRecord::Migration
2
+ def change
3
+ add_column :radesk_tickets, :category_id, :integer
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Radesk
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radesk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Novikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-01 00:00:00.000000000 Z
11
+ date: 2015-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -189,6 +189,7 @@ files:
189
189
  - app/assets/javascripts/radesk/application.js
190
190
  - app/assets/stylesheets/radesk/application.css
191
191
  - app/assets/stylesheets/radesk/radesk.css.scss
192
+ - app/controllers/radesk/admin/categories_controller.rb
192
193
  - app/controllers/radesk/answers_controller.rb
193
194
  - app/controllers/radesk/application_controller.rb
194
195
  - app/controllers/radesk/tickets_controller.rb
@@ -197,9 +198,15 @@ files:
197
198
  - app/helpers/radesk/tickets_helper.rb
198
199
  - app/mailers/radesk/user_mailer.rb
199
200
  - app/models/radesk/answer.rb
201
+ - app/models/radesk/category.rb
200
202
  - app/models/radesk/ticket.rb
201
203
  - app/views/layouts/radesk/application.html.haml
204
+ - app/views/radesk/admin/categories/_form.html.haml
205
+ - app/views/radesk/admin/categories/edit.html.haml
206
+ - app/views/radesk/admin/categories/index.html.haml
207
+ - app/views/radesk/admin/categories/new.html.haml
202
208
  - app/views/radesk/answers/_list.html.haml
209
+ - app/views/radesk/answers/edit.html.haml
203
210
  - app/views/radesk/tickets/_form.html.haml
204
211
  - app/views/radesk/tickets/_status.html.haml
205
212
  - app/views/radesk/tickets/edit.html.haml
@@ -211,7 +218,9 @@ files:
211
218
  - config/routes.rb
212
219
  - db/migrate/20141226165609_create_radesk_tickets.rb
213
220
  - db/migrate/20141227023319_create_radesk_answers.rb
214
- - db/migrate/20141231165849_add_answers_count_to_radesk_tickets.rb
221
+ - db/migrate/20150101175807_add_private_to_radesk_answers.rb
222
+ - db/migrate/20150102192027_create_radesk_categories.rb
223
+ - db/migrate/20150103122745_add_category_id_to_radesk_tickets.rb
215
224
  - lib/generators/radesk/install/templates/initializer.rb
216
225
  - lib/generators/radesk/install_generator.rb
217
226
  - lib/radesk.rb
@@ -1,5 +0,0 @@
1
- class AddAnswersCountToRadeskTickets < ActiveRecord::Migration
2
- def change
3
- add_column :radesk_tickets, :answers_count, :integer, :default => 0
4
- end
5
- end