diff --git a/app/assets/stylesheets/tickets/ticket_index.scss b/app/assets/stylesheets/tickets/ticket_index.scss index 41a8f19..5179e98 100644 --- a/app/assets/stylesheets/tickets/ticket_index.scss +++ b/app/assets/stylesheets/tickets/ticket_index.scss @@ -18,6 +18,10 @@ body { } } +#main-wrap .wrap-inner{ + padding : 20px; +} + .ticket-search-wrap { font-family: $main-font; diff --git a/app/controllers/admin/tickets_controller.rb b/app/controllers/admin/tickets_controller.rb index bf42212..0c524fd 100644 --- a/app/controllers/admin/tickets_controller.rb +++ b/app/controllers/admin/tickets_controller.rb @@ -32,13 +32,47 @@ class Admin::TicketsController < OrbitAdminController def my_tickets if params[:type] == "history" - @tickets = Ticket.where(:taken_by => current_user.id).closed.group_by(&:category) + if params[:keywords].present? + @tickets = search_tickets + @tickets = @tickets.where(:taken_by => current_user.id).closed.group_by(&:category) + else + @tickets = Ticket.where(:taken_by => current_user.id).closed.group_by(&:category) + end else - @tickets = Ticket.where(:taken_by => current_user.id).commenced.desc(:urgent).group_by(&:category) + if params[:keywords].present? + @tickets = search_tickets + @tickets = @tickets.where(:taken_by => current_user.id).commenced.desc(:urgent).group_by(&:category) + else + @tickets = Ticket.where(:taken_by => current_user.id).commenced.desc(:urgent).group_by(&:category) + end end @categories = @tickets.keys end + def tagged_tickets + tqrs = TicketQueryResponse.where(:user_tags.in => [current_user.id.to_s], :read_by.nin => [current_user.id.to_s]) + @unread_tickets = [] + @read_tickets = [] + tqrs.each do |tqr| + @unread_tickets << tqr.ticket_query.ticket if !tqr.ticket_query.nil? && !tqr.ticket_query.ticket.nil? + end + tqrs = TicketQueryResponse.where(:user_tags.in => [current_user.id.to_s], :read_by.in => [current_user.id.to_s]) + tqrs.each do |tqr| + @read_tickets << tqr.ticket_query.ticket if !tqr.ticket_query.nil? && !tqr.ticket_query.ticket.nil? + end + @read_tickets.uniq! + @unread_tickets.uniq! + if params[:keywords].present? + tickets = search_tickets + @read_tickets = @read_tickets & tickets + @unread_tickets = @unread_tickets & tickets + end + @unread_tickets = @unread_tickets.group_by(&:category) + @read_tickets = @read_tickets.group_by(&:category) + @unread_tickets_categories = @unread_tickets.keys + @read_tickets_categories = @read_tickets.keys + end + def show @ticket = Ticket.find(params[:id]) rescue nil @categories = ModuleApp.find_by_key("ticket").categories @@ -138,36 +172,7 @@ class Admin::TicketsController < OrbitAdminController end def search - statuses = ["open","commenced","closed"] - if params[:keywords].present? - keywords = params[:keywords] - type = (keywords.is_i? ? (keywords.length == 8 ? "number" : "text") : "text") - if type == "text" - regex = Regexp.new(/[a-z]+:/) - matches = keywords.scan(regex) - if !matches.blank? - smart_field = matches.first - if @smart_search_fields.include?(smart_field) - type = "smart" - keywords = keywords.sub(smart_field,"") - end - end - end - end - case type - when "number" - @tickets = Ticket.where(:status.in => statuses, :uid => keywords) - when "text" - @tickets = Ticket.where(:status.in => statuses) - @tickets = search_data(@tickets,[:subject, :uid, :status, :site_type, :ticket_creater_id, :ticket_creater_name]) - regex = Regexp.new(".*"+keywords+".*", "i") - sites = RegisteredSite.any_of({:title => regex},{:site_domain => regex}) - sites.each do |site| - @tickets = (@tickets | site.tickets.where(:status.in => statuses)) - end - when "smart" - @tickets = smart_search(statuses,nil,smart_field,keywords) - end + @tickets = search_tickets if !@tickets.nil? @tickets = @tickets.group_by(&:category) @categories = @tickets.keys @@ -220,7 +225,7 @@ class Admin::TicketsController < OrbitAdminController end def tickets_by_category - @table_fields = [:ticket_number, :site_name, :subject, :created_at, :tags, :status, :taken_by, :urgent] + @table_fields = [:tagged, :ticket_number, :site_name, :subject, :created_at, :tags, :status, :taken_by, :urgent] statuses = params["type"] == "history" ? ["closed"] : ["open","commenced"] @category = Category.find(params[:category_id]) rescue nil if params[:keywords].present? @@ -239,11 +244,11 @@ class Admin::TicketsController < OrbitAdminController end end if type.nil? - @tickets = Ticket.where(:category_id => @category.id, :status.in => statuses).order_by(sort).page(params[:page]).per(15) + @tickets = Ticket.where(:category_id => @category.id, :status.in => statuses).order_by(sort) else case type when "number" - @tickets = Ticket.where(:category_id => @category.id, :status.in => statuses, :uid => keywords).order_by(sort).page(params[:page]).per(15) + @tickets = Ticket.where(:category_id => @category.id, :status.in => statuses, :uid => keywords).order_by(sort) when "text" @tickets = Ticket.where(:category_id => @category.id, :status.in => statuses).order_by(sort) @tickets = search_data(@tickets,[:subject, :uid, :status, :site_type, :ticket_creater_id, :ticket_creater_name]) @@ -252,17 +257,51 @@ class Admin::TicketsController < OrbitAdminController sites.each do |site| @tickets = (@tickets | site.tickets.where(:category_id => @category.id, :status.in => statuses)) end - @tickets = Kaminari.paginate_array(@tickets).page(params[:page]).per(15) when "smart" @tickets = smart_search(statuses,@category,smart_field,keywords) @tickets = @tickets.order_by(sort) rescue @tickets - @tickets = Kaminari.paginate_array(@tickets).page(params[:page]).per(15) end end if !@category.nil? + @tickets = @tickets.where(:taken_by => current_user.id) if params[:takenby].present? + @tickets = Kaminari.paginate_array(@tickets).page(params[:page]).per(15) if !@tickets.nil? end private + def search_tickets + statuses = ["open","commenced","closed"] + if params[:keywords].present? + keywords = params[:keywords] + type = (keywords.is_i? ? (keywords.length == 8 ? "number" : "text") : "text") + if type == "text" + regex = Regexp.new(/[a-z]+:/) + matches = keywords.scan(regex) + if !matches.blank? + smart_field = matches.first + if @smart_search_fields.include?(smart_field) + type = "smart" + keywords = keywords.sub(smart_field,"") + end + end + end + end + case type + when "number" + tickets = Ticket.where(:status.in => statuses, :uid => keywords) + when "text" + tickets = Ticket.where(:status.in => statuses) + tickets = search_data(tickets,[:subject, :uid, :status, :site_type, :ticket_creater_id, :ticket_creater_name]) + regex = Regexp.new(".*"+keywords+".*", "i") + sites = RegisteredSite.any_of({:title => regex},{:site_domain => regex}) + sites.each do |site| + tickets = (tickets | site.tickets.where(:status.in => statuses)) + end + when "smart" + tickets = smart_search(statuses,nil,smart_field,keywords) + end + tickets + end + def can_mark_urgent?(ticket) tickets = Ticket.where(:category_id => ticket.category_id, :urgent => true).count return tickets < 5 diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 2609e18..7543fad 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -45,4 +45,33 @@ class Ticket def registered_site_domain self.registered_site.site_domain end + + def self.get_ticket_unread_count_for_user(user) + tqrs = TicketQueryResponse.where(:user_tags.in => [user.id.to_s], :read_by.nin => [user.id.to_s]) + unread_tickets = [] + tqrs.each do |tqr| + unread_tickets << tqr.ticket_query.ticket if !tqr.ticket_query.nil? && !tqr.ticket_query.ticket.nil? + end + unread_tickets.uniq! + unread_tickets.count + end + + def tagged_status(user) + queries = self.ticket_queries + status = "not_tagged" + queries.each do |query| + tqrs = query.ticket_query_responses.where(:user_tags.in => [user.id.to_s]) + if tqrs.count > 0 + tqrs = query.ticket_query_responses.where(:user_tags.in => [user.id.to_s], :read_by.in => [user.id.to_s]) + if tqrs.count > 0 + status = "read" + else + status = "tagged" + end + else + status = "not_tagged" + end + end + status + end end \ No newline at end of file diff --git a/app/views/admin/tickets/_search_form.html.erb b/app/views/admin/tickets/_search_form.html.erb index 5b96088..2af463d 100644 --- a/app/views/admin/tickets/_search_form.html.erb +++ b/app/views/admin/tickets/_search_form.html.erb @@ -4,7 +4,7 @@ Search tickets -
+ " method="get" id="search-form"> + <% if params[:type] == "history" %> + + <% end %> + <% if params[:takenby].present? %> + + <% end %> + <% if params[:tagged].present? %> + + <% end %>
<% if params[:keywords].present? %>
- + "> Search result for "<%= params[:keywords] %>"
<% end %> diff --git a/app/views/admin/tickets/_ticket_by_c.html.erb b/app/views/admin/tickets/_ticket_by_c.html.erb index c5ed33c..54cc550 100644 --- a/app/views/admin/tickets/_ticket_by_c.html.erb +++ b/app/views/admin/tickets/_ticket_by_c.html.erb @@ -6,8 +6,19 @@ when "commenced" badge_class = "badge-success" end + + case ticket_by_c.tagged_status(current_user) + when "not_tagged" + tagged_class = "fa-minus" + when "tagged" + tagged_class = "fa-eye-slash" + when "read" + tagged_class = "fa-eye" + end + %> + <%= ticket_by_c.uid %> <% if !ticket_by_c.registered_site.nil? %> diff --git a/app/views/admin/tickets/my_tickets.html.erb b/app/views/admin/tickets/my_tickets.html.erb index 6684859..9ec194f 100644 --- a/app/views/admin/tickets/my_tickets.html.erb +++ b/app/views/admin/tickets/my_tickets.html.erb @@ -1,22 +1,49 @@ <% content_for :page_specific_css do %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" %> + <%= stylesheet_link_tag "tickets/ticket_index" %> + <% end %> -<%= render :partial => "search_form" %> -
-<% if params[:type] == "history" %> - View my current tickets -<% else %> - View my past tickets -<% end %> -
-
+<%= render :partial => "search_form", locals: {:form_action => "/admin/tickets/my_tickets"} %> +
+

+ + Tickets + +

<% @categories.each do |category| %> -
-

<%= category.title %>

-
- <%= render :partial => "ticket", :collection => @tickets[category] %> +
+

+ + <%= category.title %> +

+ <%= render :partial => "ticket", :collection => @tickets[category] %> +
- -
<% end %>
diff --git a/app/views/admin/tickets/tagged_tickets.html.erb b/app/views/admin/tickets/tagged_tickets.html.erb new file mode 100644 index 0000000..f241ba5 --- /dev/null +++ b/app/views/admin/tickets/tagged_tickets.html.erb @@ -0,0 +1,49 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" %> + <%= stylesheet_link_tag "tickets/ticket_index" %> +<% end %> +<%= render :partial => "search_form", locals: {:form_action => "/admin/tickets/tagged_tickets"} %> +
+
+

+ + Unread Tags +

+ <% @unread_tickets_categories.each do |category| %> +
+

+ + <%= category.title %> +

+ <%= render :partial => "ticket", :collection => @unread_tickets[category] %> + +
+ <% end %> +
+

+ + Read Tags +

+<% @read_tickets_categories.each do |category| %> +
+

+ + <%= category.title %> +

+ <%= render :partial => "ticket", :collection => @read_tickets[category] %> + +
+<% end %> +
+ \ No newline at end of file diff --git a/app/views/admin/tickets/tickets_by_category.html.erb b/app/views/admin/tickets/tickets_by_category.html.erb index 4586d25..8a56901 100644 --- a/app/views/admin/tickets/tickets_by_category.html.erb +++ b/app/views/admin/tickets/tickets_by_category.html.erb @@ -1,31 +1,14 @@ <% content_for :page_specific_css do %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" %> + <%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" %> + <%= stylesheet_link_tag "tickets/ticket_index" %> <% end %>
<% if !@category.nil? %>

<%= @category.title %><%= " - history" if params[:type] == "history" %> -
- - <% if params[:keywords].present? %> - " style="font-size:20px;"> - Searched for <%= params[:keywords] %> - <% end %> - -
+ <%= render :partial => "search_form", locals: {:form_action => "/admin/tickets/category/#{@category.id.to_s}"} %>

<% h = request.original_fullpath.split("?")[1] %> <% if params[:type] == "history" %> @@ -53,7 +36,7 @@ <% if !@tickets.nil? && @tickets.count > 0 %> <%= render :partial => "ticket_by_c", :collection => @tickets %> <% else %> - No tickets. + No tickets. <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index f7e1679..c447c5e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2,4 +2,5 @@ en: tickets: tickets: Tickets my_tickets: My Tickets + tickets_tagged: Tickets Tagged all: All diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 15d8640..3f3b3cd 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -2,4 +2,5 @@ zh_tw: tickets: tickets: Tickets my_tickets: My Tickets + tickets_tagged: Tickets Tagged all: All diff --git a/config/routes.rb b/config/routes.rb index fa6065a..872f40e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,7 @@ Rails.application.routes.draw do delete "ticket/delete_response" => 'tickets#delete_response' get "tickets/category/:category_id" => 'tickets#tickets_by_category' get "tickets/my_tickets" => 'tickets#my_tickets' + get "tickets/tagged_tickets" => 'tickets#tagged_tickets' post "comments/read" => 'tickets#mark_response_read' resources :tickets do get "start" diff --git a/lib/tickets/engine.rb b/lib/tickets/engine.rb index 3a72a14..a4a175c 100644 --- a/lib/tickets/engine.rb +++ b/lib/tickets/engine.rb @@ -26,6 +26,12 @@ module Tickets :active_for_action=>{'admin/tickets'=>"my_tickets"}, :available_for => 'users' + context_link 'tickets.tickets_tagged', + :link_path=>"admin_tickets_tagged_tickets_path" , + :priority=>2, + :active_for_action=>{'admin/tickets'=>"tagged_tickets"}, + :available_for => 'users' + context_link 'categories', :link_path=>"admin_module_app_categories_path" , :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'ticket').id}",