helpdesk 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +28 -0
- data/app/assets/javascripts/helpdesk/admin/dashboard.js +2 -0
- data/app/assets/javascripts/helpdesk/admin/tickets.js +20 -0
- data/app/assets/javascripts/helpdesk/application.js +19 -0
- data/app/assets/javascripts/helpdesk/ckeditor.js +11 -0
- data/app/assets/javascripts/helpdesk/dashboard.js +2 -0
- data/app/assets/javascripts/helpdesk/faqs.js +2 -0
- data/app/assets/javascripts/helpdesk/subscribers.js +2 -0
- data/app/assets/stylesheets/helpdesk/admin/bootstrap_overrides.css +8 -0
- data/app/assets/stylesheets/helpdesk/admin/dashboard.css +4 -0
- data/app/assets/stylesheets/helpdesk/admin/tickets.css +44 -0
- data/app/assets/stylesheets/helpdesk/admin.css +8 -0
- data/app/assets/stylesheets/helpdesk/application.css +16 -0
- data/app/assets/stylesheets/helpdesk/dashboard.css +4 -0
- data/app/assets/stylesheets/helpdesk/faqs.css.scss +3 -0
- data/app/assets/stylesheets/helpdesk/imports.css.sass +0 -0
- data/app/assets/stylesheets/helpdesk/subscribers.css.scss +3 -0
- data/app/assets/stylesheets/helpdesk/tickets.css.sass +49 -0
- data/app/controllers/helpdesk/admin/base_controller.rb +32 -0
- data/app/controllers/helpdesk/admin/dashboard_controller.rb +6 -0
- data/app/controllers/helpdesk/admin/faqs_controller.rb +100 -0
- data/app/controllers/helpdesk/admin/subscribers_controller.rb +49 -0
- data/app/controllers/helpdesk/admin/ticket_types_controller.rb +52 -0
- data/app/controllers/helpdesk/admin/tickets_controller.rb +76 -0
- data/app/controllers/helpdesk/application_controller.rb +20 -0
- data/app/controllers/helpdesk/dashboard_controller.rb +26 -0
- data/app/controllers/helpdesk/faqs_controller.rb +7 -0
- data/app/controllers/helpdesk/subscribers_controller.rb +62 -0
- data/app/controllers/helpdesk/tickets_controller.rb +91 -0
- data/app/helpers/helpdesk/admin/dashboard_helper.rb +6 -0
- data/app/helpers/helpdesk/admin/tickets_helper.rb +13 -0
- data/app/helpers/helpdesk/dashboard_helper.rb +4 -0
- data/app/helpers/helpdesk/faqs_helper.rb +4 -0
- data/app/helpers/helpdesk/helpdesk_helper.rb +59 -0
- data/app/helpers/helpdesk/subscribers_helper.rb +4 -0
- data/app/helpers/helpdesk/tickets_helper.rb +7 -0
- data/app/mailers/helpdesk/notifications_mailer.rb +42 -0
- data/app/models/helpdesk/comment.rb +31 -0
- data/app/models/helpdesk/faq.rb +12 -0
- data/app/models/helpdesk/subscriber.rb +10 -0
- data/app/models/helpdesk/ticket.rb +85 -0
- data/app/models/helpdesk/ticket_type.rb +13 -0
- data/app/views/helpdesk/admin/dashboard/index.html.erb +2 -0
- data/app/views/helpdesk/admin/faqs/_form.html.haml +20 -0
- data/app/views/helpdesk/admin/faqs/_menu.html.haml +9 -0
- data/app/views/helpdesk/admin/faqs/edit.html.haml +11 -0
- data/app/views/helpdesk/admin/faqs/index.html.haml +59 -0
- data/app/views/helpdesk/admin/faqs/new.html.haml +7 -0
- data/app/views/helpdesk/admin/faqs/show.html.haml +19 -0
- data/app/views/helpdesk/admin/subscribers/_form.html.haml +12 -0
- data/app/views/helpdesk/admin/subscribers/_menu.html.haml +9 -0
- data/app/views/helpdesk/admin/subscribers/edit.html.haml +10 -0
- data/app/views/helpdesk/admin/subscribers/index.html.haml +31 -0
- data/app/views/helpdesk/admin/subscribers/new.html.haml +7 -0
- data/app/views/helpdesk/admin/ticket_types/_form.html.haml +20 -0
- data/app/views/helpdesk/admin/ticket_types/_menu.html.haml +11 -0
- data/app/views/helpdesk/admin/ticket_types/edit.html.haml +10 -0
- data/app/views/helpdesk/admin/ticket_types/index.html.haml +28 -0
- data/app/views/helpdesk/admin/ticket_types/new.html.haml +8 -0
- data/app/views/helpdesk/admin/ticket_types/show.html.haml +11 -0
- data/app/views/helpdesk/admin/tickets/_form.html.haml +23 -0
- data/app/views/helpdesk/admin/tickets/_menu.html.haml +17 -0
- data/app/views/helpdesk/admin/tickets/_ticket.html.haml +59 -0
- data/app/views/helpdesk/admin/tickets/edit.html.haml +30 -0
- data/app/views/helpdesk/admin/tickets/index.html.haml +42 -0
- data/app/views/helpdesk/admin/tickets/list.html.haml +18 -0
- data/app/views/helpdesk/admin/tickets/new.html.haml +4 -0
- data/app/views/helpdesk/admin/tickets/show.html.haml +36 -0
- data/app/views/helpdesk/dashboard/index.html.erb +3 -0
- data/app/views/helpdesk/faqs/index.html.haml +20 -0
- data/app/views/helpdesk/notifications_mailer/comment_by_helpdesk_confirmation.html.haml +15 -0
- data/app/views/helpdesk/notifications_mailer/comment_by_helpdesk_notification.html.haml +19 -0
- data/app/views/helpdesk/notifications_mailer/comment_by_requester_confirmation.html.haml +16 -0
- data/app/views/helpdesk/notifications_mailer/comment_by_requester_notification.html.haml +27 -0
- data/app/views/helpdesk/notifications_mailer/ticket_created_confirmation.html.haml +16 -0
- data/app/views/helpdesk/notifications_mailer/ticket_created_notification.html.haml +21 -0
- data/app/views/helpdesk/subscribers/_form.html.erb +37 -0
- data/app/views/helpdesk/subscribers/edit.html.erb +6 -0
- data/app/views/helpdesk/subscribers/index.html.erb +31 -0
- data/app/views/helpdesk/subscribers/new.html.erb +5 -0
- data/app/views/helpdesk/subscribers/show.html.erb +30 -0
- data/app/views/helpdesk/tickets/_form.html.haml +36 -0
- data/app/views/helpdesk/tickets/_menu.html.haml +10 -0
- data/app/views/helpdesk/tickets/_ticket.html.haml +54 -0
- data/app/views/helpdesk/tickets/index.html.haml +16 -0
- data/app/views/helpdesk/tickets/new.html.haml +4 -0
- data/app/views/helpdesk/tickets/show.html.haml +38 -0
- data/app/views/layouts/helpdesk/_topmenu.html.haml +28 -0
- data/app/views/layouts/helpdesk/_topuser.html.haml +32 -0
- data/app/views/layouts/helpdesk/admin.html.haml +35 -0
- data/app/views/layouts/helpdesk/user.html.haml +33 -0
- data/app/views/layouts/mailer_layout.html.haml +20 -0
- data/config/initializers/globalize.rb +4 -0
- data/config/initializers/simple_form.rb +117 -0
- data/config/locales/helpdesk.en.yml +111 -0
- data/config/locales/helpdesk.pl.yml +119 -0
- data/config/locales/helpdesk_routes.yml +6 -0
- data/config/locales/simple_form.en.yml +24 -0
- data/config/locales/simple_form.pl.yml +15 -0
- data/config/routes.rb +22 -0
- data/db/migrate/20120420104051_create_helpdesk_tickets.rb +14 -0
- data/db/migrate/20120423113938_create_helpdesk_comments.rb +12 -0
- data/db/migrate/20130521105605_create_helpdesk_ticket_types.rb +36 -0
- data/db/migrate/20130522085614_create_helpdesk_faqs.rb +17 -0
- data/db/migrate/20130522090420_create_helpdesk_subscribers.rb +13 -0
- data/lib/generators/helpdesk/install_generator.rb +35 -0
- data/lib/generators/helpdesk/templates/README +31 -0
- data/lib/generators/helpdesk/templates/helpdesk.rb +33 -0
- data/lib/helpdesk/engine.rb +29 -0
- data/lib/helpdesk/version.rb +3 -0
- data/lib/helpdesk.rb +39 -0
- data/lib/tasks/prepare_ci_env.rake +27 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- metadata +508 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class SubscribersController < Helpdesk::ApplicationController
|
3
|
+
|
4
|
+
|
5
|
+
def new
|
6
|
+
@subscriber = Subscriber.new
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html # new.html.erb
|
10
|
+
format.json { render json: @subscriber }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def create
|
15
|
+
@subscriber = Subscriber.new(subscriber_params)
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
if @subscriber.save
|
19
|
+
format.html { redirect_to @subscriber, notice: 'Subscriber was successfully created.' }
|
20
|
+
format.json { render json: @subscriber, status: :created, location: @subscriber }
|
21
|
+
else
|
22
|
+
format.html { render action: "new" }
|
23
|
+
format.json { render json: @subscriber.errors, status: :unprocessable_entity }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# PUT /subscribers/1
|
29
|
+
# PUT /subscribers/1.json
|
30
|
+
def update
|
31
|
+
@subscriber = Subscriber.find(params[:id])
|
32
|
+
|
33
|
+
respond_to do |format|
|
34
|
+
if @subscriber.update_attributes(subscriber_params)
|
35
|
+
format.html { redirect_to @subscriber, notice: 'Subscriber was successfully updated.' }
|
36
|
+
format.json { head :no_content }
|
37
|
+
else
|
38
|
+
format.html { render action: "edit" }
|
39
|
+
format.json { render json: @subscriber.errors, status: :unprocessable_entity }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# DELETE /subscribers/1
|
45
|
+
# DELETE /subscribers/1.json
|
46
|
+
def destroy
|
47
|
+
@subscriber = Subscriber.find(params[:id])
|
48
|
+
@subscriber.destroy
|
49
|
+
|
50
|
+
respond_to do |format|
|
51
|
+
format.html { redirect_to subscribers_url }
|
52
|
+
format.json { head :no_content }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def subscriber_params
|
59
|
+
params.require(:subscriber).permit(:email,:lang, :name)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class TicketsController < Helpdesk::ApplicationController
|
3
|
+
|
4
|
+
helper TicketsHelper
|
5
|
+
|
6
|
+
# GET /tickets
|
7
|
+
# GET /tickets.json
|
8
|
+
def index
|
9
|
+
if params[:tickets] == 'closed'
|
10
|
+
@tickets = Helpdesk::Ticket.where(:requester_id => helpdesk_user.id).closed.page(params[:page])
|
11
|
+
@tickets_count = Helpdesk::Ticket.where(:requester_id => helpdesk_user.id).active.count
|
12
|
+
else
|
13
|
+
@tickets = Helpdesk::Ticket.where(:requester_id => helpdesk_user.id).active.page(params[:page])
|
14
|
+
@tickets_count = @tickets.size
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.html # index.html.erb
|
20
|
+
format.json { render json: @tickets }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# GET /tickets/1
|
25
|
+
# GET /tickets/1.json
|
26
|
+
def show
|
27
|
+
@tickets_count = Helpdesk::Ticket.where(:requester_id => helpdesk_user.id).active.count
|
28
|
+
@ticket = Helpdesk::Ticket.find(params[:id])
|
29
|
+
|
30
|
+
respond_to do |format|
|
31
|
+
format.html # show.html.erb
|
32
|
+
format.json { render json: @ticket }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# GET /tickets/new
|
37
|
+
# GET /tickets/new.json
|
38
|
+
def new
|
39
|
+
@tickets_count = Helpdesk::Ticket.where(:requester_id => helpdesk_user.id).active.count
|
40
|
+
@ticket = Helpdesk::Ticket.new
|
41
|
+
@ticket.status = Helpdesk::Ticket::STATUSES[0][0]
|
42
|
+
|
43
|
+
respond_to do |format|
|
44
|
+
format.html # new.html.erb
|
45
|
+
format.json { render json: @ticket }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def create
|
50
|
+
@ticket = Helpdesk::Ticket.new(ticket_params)
|
51
|
+
@ticket.requester = helpdesk_user
|
52
|
+
@ticket.status = Helpdesk::Ticket::STATUSES[0][0]
|
53
|
+
|
54
|
+
respond_to do |format|
|
55
|
+
if @ticket.save
|
56
|
+
format.html { redirect_to tickets_url, notice: 'Ticket was successfully created.' }
|
57
|
+
format.json { render json: @ticket, status: :created, location: @ticket }
|
58
|
+
else
|
59
|
+
format.html { render action: "new" }
|
60
|
+
format.json { render json: @ticket.errors, status: :unprocessable_entity }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# PUT /tickets/1
|
66
|
+
# PUT /tickets/1.json
|
67
|
+
def update
|
68
|
+
@ticket = Helpdesk::Ticket.find(params[:id])
|
69
|
+
|
70
|
+
respond_to do |format|
|
71
|
+
if @ticket.update_attributes(ticket_params)
|
72
|
+
puts ticket_params
|
73
|
+
puts paramsp
|
74
|
+
format.html { redirect_to @ticket, notice: 'Ticket was successfully updated.' }
|
75
|
+
format.json { head :no_content }
|
76
|
+
else
|
77
|
+
format.html { render action: "edit" }
|
78
|
+
format.json { render json: @ticket.errors, status: :unprocessable_entity }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def ticket_params
|
87
|
+
params.require(:ticket).permit( :ticket_type_id, :subject, :description,comments_attributes:[:author_id, :comment, :public])
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
module Admin::TicketsHelper
|
3
|
+
def humanize_with_i18n(string, scope = [])
|
4
|
+
I18n.t string, scope: scope, default: string.humanize
|
5
|
+
end
|
6
|
+
|
7
|
+
# The method prefix tells me that this should be in an object
|
8
|
+
# But it doesn't belong in our model, does it?
|
9
|
+
def tickets_statuses_for_select
|
10
|
+
Helpdesk::Ticket::STATUSES.map { |s| [humanize_with_i18n(s[0].to_s,'helpdesk.tickets.statuses'),s[0]] }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
module HelpdeskHelper
|
3
|
+
|
4
|
+
|
5
|
+
def menu_left(title,&block)
|
6
|
+
panel_menu(title,'default',&block)
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def panel_menu(title,type,&block)
|
11
|
+
content_tag(:div,class: "panel panel-#{type}") do
|
12
|
+
content_tag(:div ,class: 'panel-heading') do
|
13
|
+
content_tag(:h3 ,title,class:'panel-title')
|
14
|
+
end +
|
15
|
+
content_tag( :ul, class: 'nav nav-pills nav-stacked ') do
|
16
|
+
capture(&block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def panel(title,type,&block)
|
23
|
+
content_tag(:div,class: "panel panel-#{type}") do
|
24
|
+
content_tag(:div ,class: 'panel-heading') do
|
25
|
+
content_tag(:h3 ,title,class:'panel-title')
|
26
|
+
end +
|
27
|
+
content_tag( :div, class: 'panel-body') do
|
28
|
+
capture(&block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def menu_li(lbl, path, *args)
|
35
|
+
options = args.extract_options!
|
36
|
+
(options[:class].nil? ? options.merge!(:class => "active") : options[:class] += " active" ) if url_for(path) == request.fullpath
|
37
|
+
content_tag(:li, link_to(lbl, path), options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def status_label(lbl,cls)
|
41
|
+
content_tag(:span, class: "label #{cls}") do
|
42
|
+
lbl
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def badge(num,css='pull-right')
|
47
|
+
raw("<span class=\"badge #{css}\">#{num}</span> ")
|
48
|
+
end
|
49
|
+
|
50
|
+
def ico(name)
|
51
|
+
raw("<i class=\"glyphicon glyphicon-#{name}\"></i> ")
|
52
|
+
end
|
53
|
+
|
54
|
+
def parent_layout(layout)
|
55
|
+
@view_flow.set(:layout,output_buffer)
|
56
|
+
self.output_buffer = render(:file => "layouts/#{layout}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Helpdesk::NotificationsMailer < ActionMailer::Base
|
2
|
+
|
3
|
+
layout 'mailer_layout'
|
4
|
+
|
5
|
+
def ticket_created_notification(ticket)
|
6
|
+
@ticket = ticket
|
7
|
+
mail(:subject=>"#{Helpdesk.helpdesk_name} | #{ticket.subject}",
|
8
|
+
:to => Helpdesk.email)
|
9
|
+
end
|
10
|
+
|
11
|
+
def ticket_created_confirmation(ticket)
|
12
|
+
@ticket = ticket
|
13
|
+
mail(:subject=>"#{Helpdesk.helpdesk_name} | #{ticket.subject}",
|
14
|
+
:to => ticket.requester.email)
|
15
|
+
end
|
16
|
+
|
17
|
+
def comment_by_requester_notification(comment)
|
18
|
+
@comment = comment
|
19
|
+
mail(:subject=>"#{Helpdesk.helpdesk_name} | #{comment.ticket.subject}",
|
20
|
+
:to => Helpdesk.email)
|
21
|
+
end
|
22
|
+
|
23
|
+
def comment_by_requester_confirmation(comment)
|
24
|
+
@comment = comment
|
25
|
+
mail(:subject=>"#{Helpdesk.helpdesk_name} | #{comment.ticket.subject}",
|
26
|
+
:to => comment.ticket.requester.email)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def comment_by_helpdesk_notification(comment)
|
31
|
+
@comment = comment
|
32
|
+
mail(:subject=>"#{Helpdesk.helpdesk_name} | #{comment.ticket.subject}",
|
33
|
+
:to => comment.ticket.requester.email)
|
34
|
+
end
|
35
|
+
|
36
|
+
def comment_by_helpdesk_confirmation(comment)
|
37
|
+
@comment = comment
|
38
|
+
mail(:subject=>"#{t('helpdesk.name')} | #{comment.ticket.subject}",
|
39
|
+
:to => Helpdesk.email)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class Comment < ActiveRecord::Base
|
3
|
+
belongs_to :author, :class_name => Helpdesk.user_class.to_s
|
4
|
+
belongs_to :ticket
|
5
|
+
|
6
|
+
default_scope -> {includes(:author).order('id ASC')}
|
7
|
+
scope :pub, -> { where(:public, true)}
|
8
|
+
|
9
|
+
after_create :send_email
|
10
|
+
after_create :check_reopen
|
11
|
+
|
12
|
+
def check_reopen
|
13
|
+
if ticket.requester == author
|
14
|
+
ticket.update_column(:status ,:waiting)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def send_email
|
20
|
+
if self.public?
|
21
|
+
if ticket.requester == author
|
22
|
+
Helpdesk::NotificationsMailer.comment_by_requester_notification(self).deliver if ticket.requester
|
23
|
+
Helpdesk::NotificationsMailer.comment_by_requester_confirmation(self).deliver if Helpdesk.send_confirmation_emails
|
24
|
+
else
|
25
|
+
Helpdesk::NotificationsMailer.comment_by_helpdesk_notification(self).deliver if ticket.requester
|
26
|
+
Helpdesk::NotificationsMailer.comment_by_helpdesk_confirmation(self).deliver if Helpdesk.send_confirmation_emails
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class Faq < ActiveRecord::Base
|
3
|
+
translates :title, :text
|
4
|
+
accepts_nested_attributes_for :translations
|
5
|
+
#attr_accessible :active, :position, :text, :title,:translations_attributes
|
6
|
+
|
7
|
+
default_scope order('position ASC').includes(:translations)
|
8
|
+
|
9
|
+
scope :active, where('active = ? ', true)
|
10
|
+
scope :inactive, where('active = ? ', false)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class Subscriber < ActiveRecord::Base
|
3
|
+
attr_accessible :confirmed, :email, :hashcode, :lang, :name
|
4
|
+
scope :confirmed, where('confirmed = ? ',true)
|
5
|
+
scope :unconfirmed, where('confirmed = ? ',false)
|
6
|
+
|
7
|
+
validates_presence_of :email
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class Ticket < ActiveRecord::Base
|
3
|
+
|
4
|
+
STATUSES = [
|
5
|
+
[ :new, 'label-primary',3],
|
6
|
+
[ :open, 'label-warning',2],
|
7
|
+
[ :waiting, 'label-info',2],
|
8
|
+
[ :solved, 'label-success',0],
|
9
|
+
[ :not_fixable, 'label-default',-1],
|
10
|
+
[ :unreachable, 'label-default',-1],
|
11
|
+
[ :bug, 'label-default',-1]
|
12
|
+
]
|
13
|
+
STATUS_BY_KEY = Hash[*STATUSES.map { |i| [i[0], i[1]] }.flatten]
|
14
|
+
STATUS_CLASS_BY_KEY= Hash[*STATUSES.map { |i| [i[0], i[1]] }.flatten]
|
15
|
+
STATUS_STATUS_BY_KEY= Hash[*STATUSES.map { |i| [i[0], i[2]] }.flatten]
|
16
|
+
OPEN_STATUSES_KEYS = STATUSES.map { |i| (i[2]>0 ? i[0] : nil)}.compact
|
17
|
+
|
18
|
+
|
19
|
+
belongs_to :requester, :class_name => Helpdesk.user_class.to_s
|
20
|
+
belongs_to :assignee, :class_name => Helpdesk.user_class.to_s
|
21
|
+
belongs_to :ticket_type, :class_name => Helpdesk::TicketType
|
22
|
+
has_many :comments, -> {order("created_at DESC")},:dependent => :destroy
|
23
|
+
|
24
|
+
|
25
|
+
scope :active, -> {where('status IN (?) ',OPEN_STATUSES_KEYS)}
|
26
|
+
scope :unassigned, -> {where('status IN (?) ',OPEN_STATUSES_KEYS).where('assignee_id is null')}
|
27
|
+
scope :closed, -> { where('status NOT IN (?)',OPEN_STATUSES_KEYS)}
|
28
|
+
default_scope -> { includes(:comments=>[:author])
|
29
|
+
.includes(:requester)
|
30
|
+
.includes(:assignee)
|
31
|
+
.includes(:ticket_type)
|
32
|
+
.order('id DESC')}
|
33
|
+
|
34
|
+
validates_presence_of :description,:requester_id,:ticket_type_id
|
35
|
+
|
36
|
+
accepts_nested_attributes_for :comments,:reject_if => lambda { |a| a[:comment].blank? }
|
37
|
+
|
38
|
+
|
39
|
+
before_create :set_subject
|
40
|
+
before_create :set_status
|
41
|
+
after_create :send_email
|
42
|
+
|
43
|
+
def set_status
|
44
|
+
if self.status.blank?
|
45
|
+
self.status = :new
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_subject
|
50
|
+
if self.created_at.nil?
|
51
|
+
time = Time.now
|
52
|
+
else
|
53
|
+
time = self.created_at
|
54
|
+
end
|
55
|
+
|
56
|
+
new_subject = "#{sprintf '%02d',time.year-2000}#{sprintf '%02d',time.month}#{sprintf '%02d',time.day}"
|
57
|
+
|
58
|
+
day_num = Helpdesk::Ticket.where(created_at: Date.today.beginning_of_day..Date.today.end_of_day).count+1
|
59
|
+
new_subject += "-#{sprintf '%04d',day_num}: "
|
60
|
+
self.subject = new_subject + subject.to_s
|
61
|
+
self.subject.strip!
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
def send_email
|
67
|
+
Helpdesk::NotificationsMailer.ticket_created_notification(self).deliver
|
68
|
+
unless requester.email.empty?
|
69
|
+
Helpdesk::NotificationsMailer.ticket_created_confirmation(self).deliver if Helpdesk.send_confirmation_emails
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def open?
|
74
|
+
if self.status.blank? || STATUS_STATUS_BY_KEY[self.status.to_sym] > 0
|
75
|
+
true
|
76
|
+
else
|
77
|
+
false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Helpdesk
|
2
|
+
class TicketType < ActiveRecord::Base
|
3
|
+
translates :title
|
4
|
+
accepts_nested_attributes_for :translations
|
5
|
+
#attr_accessible :active, :position,:title,:translations_attributes,:tr_class
|
6
|
+
|
7
|
+
default_scope ->{order('position ASC')}
|
8
|
+
|
9
|
+
scope :active, -> {where(:active, true)}
|
10
|
+
scope :inactive, -> {where(:active, false)}
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
= simple_form_for [:admin,@faq],:html => {:novalidate => true} do |f|
|
2
|
+
- if @faq.errors.any?
|
3
|
+
#error_explanation
|
4
|
+
%h2= "#{pluralize(@faq.errors.count, "error")} prohibited this faq from being saved:"
|
5
|
+
%ul
|
6
|
+
- @faq.errors.full_messages.each do |msg|
|
7
|
+
%li= msg
|
8
|
+
= f.input :active
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
- I18n.available_locales.each do |locale|
|
13
|
+
%h1
|
14
|
+
= locale
|
15
|
+
= f.globalize_fields_for locale do |g|
|
16
|
+
= g.input :title
|
17
|
+
= g.input :text, :as => :ckeditor, :input_html => { :ckeditor => {:width=>'100%',:height => 200,:toolbar => 'Full'} }
|
18
|
+
|
19
|
+
|
20
|
+
= f.submit 'Save', :class=>'btn btn-primary'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
- content_for :left do
|
2
|
+
= menu_left t('helpdesk.faqs.title') do
|
3
|
+
= menu_li ico('pencil') + t('helpdesk.faqs.new'), new_admin_faq_url
|
4
|
+
%li.divider
|
5
|
+
= menu_li ico('envelope') + "#{t('helpdesk.faqs.active')} (#{Helpdesk::Faq.active.count})", admin_faqs_url(:faqs => 'active')
|
6
|
+
|
7
|
+
= menu_li ico('info-sign') + "#{t('helpdesk.faqs.inactive')} (#{Helpdesk::Faq.inactive.count})", admin_faqs_url(:faqs => 'inactive')
|
8
|
+
%li.divider
|
9
|
+
= menu_li ico('list') + t('helpdesk.faqs.all'), admin_faqs_url(:faqs => 'all')
|
@@ -0,0 +1,59 @@
|
|
1
|
+
= render 'menu'
|
2
|
+
|
3
|
+
- content_for :title do
|
4
|
+
-if params[:faqs] && params[:faqs] == 'active'
|
5
|
+
= t('helpdesk.faqs.active')
|
6
|
+
-elsif params[:faqs] && params[:faqs] == 'inactive'
|
7
|
+
= t('helpdesk.faqs.inactive')
|
8
|
+
-else
|
9
|
+
= t('helpdesk.faqs.all')
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
%ul.unstyled#faqs
|
15
|
+
- @faqs.each do |faq|
|
16
|
+
%li.row{id:"faqs_#{faq.id}",style:'padding:5px 0px;'}
|
17
|
+
%div.handle.span2{style:'cursor:move'}
|
18
|
+
%span
|
19
|
+
= ico('move')
|
20
|
+
%span.badge.badge-info
|
21
|
+
= "link#{faq.id}"
|
22
|
+
- if faq.active
|
23
|
+
%span.label.label-success
|
24
|
+
= t('helpdesk.faqs.faq.active')
|
25
|
+
- else
|
26
|
+
%span.label
|
27
|
+
= t('helpdesk.faqs.faq.inactive')
|
28
|
+
%div.span5
|
29
|
+
= faq.title
|
30
|
+
%div.span2
|
31
|
+
= link_to t('helpdesk.show'), admin_faq_path(faq), class: 'btn btn-info btn-mini'
|
32
|
+
= link_to t('helpdesk.edit'), edit_admin_faq_path(faq),class: 'btn btn-primary btn-mini'
|
33
|
+
= link_to t('helpdesk.destroy'), admin_faq_path(faq), method: :delete, data: { confirm: 'Are you sure?' },class: 'btn btn-danger btn-mini'
|
34
|
+
|
35
|
+
|
36
|
+
- content_for :scripts do
|
37
|
+
:javascript
|
38
|
+
$(document).ready(function(){
|
39
|
+
$('#faqs').sortable({
|
40
|
+
axis: 'y',
|
41
|
+
dropOnEmpty: false,
|
42
|
+
handle: '.handle',
|
43
|
+
cursor: 'crosshair',
|
44
|
+
items: 'li',
|
45
|
+
opacity: 0.4,
|
46
|
+
scroll: true,
|
47
|
+
update: function(){
|
48
|
+
$.ajax({
|
49
|
+
type: 'post',
|
50
|
+
data: $('#faqs').sortable('serialize'),
|
51
|
+
dataType: 'script',
|
52
|
+
complete: function(request){
|
53
|
+
$('#faqs').effect('highlight');
|
54
|
+
},
|
55
|
+
url: '#{sort_admin_faqs_path}'
|
56
|
+
})
|
57
|
+
}
|
58
|
+
});
|
59
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
= render 'menu'
|
2
|
+
|
3
|
+
%p#notice= notice
|
4
|
+
|
5
|
+
%p
|
6
|
+
%b Aktywne:
|
7
|
+
= @faq.active
|
8
|
+
%p
|
9
|
+
%b Title:
|
10
|
+
= @faq.title
|
11
|
+
%p
|
12
|
+
%b Text:
|
13
|
+
= raw @faq.text
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
= link_to 'Edit', edit_admin_faq_path(@faq)
|
18
|
+
\|
|
19
|
+
= link_to 'Back', admin_faqs_path
|
@@ -0,0 +1,12 @@
|
|
1
|
+
= simple_form_for [:admin,@subscriber] do |f|
|
2
|
+
- if @subscriber.errors.any?
|
3
|
+
#error_explanation
|
4
|
+
%h2= "#{pluralize(@subscriber.errors.count, "error")} prohibited this subscriber from being saved:"
|
5
|
+
%ul
|
6
|
+
- @subscriber.errors.full_messages.each do |msg|
|
7
|
+
%li= msg
|
8
|
+
|
9
|
+
= f.input :confirmed
|
10
|
+
= f.input :name
|
11
|
+
= f.input :email
|
12
|
+
= f.submit 'Save',:class=>'btn btn-primary'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
- content_for :left do
|
2
|
+
= menu_left t('helpdesk.subscribers.title') do
|
3
|
+
= menu_li ico('pencil') + t('helpdesk.subscribers.new'), new_admin_subscriber_url
|
4
|
+
%li.divider
|
5
|
+
= menu_li ico('envelope') + "#{t('helpdesk.subscribers.confirmed')} (#{Helpdesk::Subscriber.confirmed.count})", admin_subscribers_url(:subscribers => 'confirmed')
|
6
|
+
|
7
|
+
= menu_li ico('info-sign') + "#{t('helpdesk.subscribers.unconfirmed')} (#{Helpdesk::Subscriber.unconfirmed.count})", admin_subscribers_url(:subscribers => 'unconfirmed')
|
8
|
+
%li.divider
|
9
|
+
= menu_li ico('list') + t('helpdesk.subscribers.all'), admin_subscribers_url(:subscribers => 'all')
|
@@ -0,0 +1,31 @@
|
|
1
|
+
= render 'menu'
|
2
|
+
|
3
|
+
- content_for :title do
|
4
|
+
Subscribers
|
5
|
+
|
6
|
+
%table.table.table-hover
|
7
|
+
%tr
|
8
|
+
%th Confirmed
|
9
|
+
%th Name
|
10
|
+
%th Email
|
11
|
+
%th Lang
|
12
|
+
%th Created
|
13
|
+
%th
|
14
|
+
%th
|
15
|
+
|
16
|
+
- @subscribers.each do |subscriber|
|
17
|
+
%tr
|
18
|
+
%td
|
19
|
+
- if subscriber.confirmed
|
20
|
+
= ico('ok')
|
21
|
+
%td= subscriber.send Helpdesk.display_user.to_sym
|
22
|
+
%td= subscriber.email
|
23
|
+
|
24
|
+
%td= subscriber.lang
|
25
|
+
%td= I18n::l(subscriber.created_at, :format=>:short)
|
26
|
+
/ %td= link_to 'Show', admin_subscriber_path(subscriber)
|
27
|
+
%td= link_to 'Edit', edit_admin_subscriber_path(subscriber)
|
28
|
+
%td= link_to 'Destroy', admin_subscriber_path(subscriber), method: :delete, data: { confirm: 'Are you sure?' }
|
29
|
+
= paginate @subscribers
|
30
|
+
%br
|
31
|
+
|