Commit 04cdb2ec8738b2aa542b0cadaee273dd18c7ad3d
1 parent
7fd532c9
Exists in
master
and in
1 other branch
adds a search bar to issues closes issue #367
Showing
7 changed files
with
75 additions
and
29 deletions
Show diff stats
app/controllers/problems_controller.rb
... | ... | @@ -7,8 +7,8 @@ class ProblemsController < ApplicationController |
7 | 7 | |
8 | 8 | def index |
9 | 9 | app_scope = current_user.admin? ? App.all : current_user.apps |
10 | - | |
11 | - @problems = Problem.for_apps(app_scope).in_env(params[:environment]).unresolved.ordered_by(@sort, @order) | |
10 | + @all_errs = params[:all_errs] | |
11 | + @problems = Problem.for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(@all_errs).ordered_by(@sort, @order) | |
12 | 12 | @selected_problems = params[:problems] || [] |
13 | 13 | respond_to do |format| |
14 | 14 | format.html do |
... | ... | @@ -18,11 +18,11 @@ class ProblemsController < ApplicationController |
18 | 18 | end |
19 | 19 | end |
20 | 20 | |
21 | - def all | |
22 | - app_scope = current_user.admin? ? App.all : current_user.apps | |
23 | - @problems = Problem.for_apps(app_scope).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page) | |
24 | - @selected_problems = params[:problems] || [] | |
25 | - end | |
21 | +# def all | |
22 | +# app_scope = current_user.admin? ? App.all : current_user.apps | |
23 | +# @problems = Problem.for_apps(app_scope).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page) | |
24 | +# @selected_problems = params[:problems] || [] | |
25 | +# end | |
26 | 26 | |
27 | 27 | def show |
28 | 28 | @notices = @problem.notices.reverse_ordered.page(params[:notice]).per(1) |
... | ... | @@ -92,9 +92,12 @@ class ProblemsController < ApplicationController |
92 | 92 | end |
93 | 93 | |
94 | 94 | def search |
95 | - app_scope = current_user.admin? ? App.all : current_user.apps | |
96 | - | |
97 | - @problems = Problem.for_apps(app_scope).in_env(params[:environment]).unresolved.ordered_by(@sort, @order) | |
95 | + if params[:app_id] | |
96 | + app_scope = App.where(:_id => params[:app_id]) | |
97 | + else | |
98 | + app_scope = current_user.admin? ? App.all : current_user.apps | |
99 | + end | |
100 | + @problems = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(@sort, @order) | |
98 | 101 | @selected_problems = params[:problems] || [] |
99 | 102 | @problems = @problems.page(params[:page]).per(current_user.per_page) |
100 | 103 | render :content_type => 'text/javascript' | ... | ... |
app/models/problem.rb
... | ... | @@ -40,19 +40,27 @@ class Problem |
40 | 40 | has_many :comments, :inverse_of => :err, :dependent => :destroy |
41 | 41 | |
42 | 42 | before_create :cache_app_attributes |
43 | - | |
43 | + | |
44 | 44 | scope :resolved, where(:resolved => true) |
45 | 45 | scope :unresolved, where(:resolved => false) |
46 | 46 | scope :ordered, order_by(:last_notice_at.desc) |
47 | 47 | scope :for_apps, lambda {|apps| where(:app_id.in => apps.all.map(&:id))} |
48 | 48 | |
49 | 49 | validates_presence_of :last_notice_at, :first_notice_at |
50 | - | |
51 | - | |
50 | + | |
51 | + | |
52 | + def self.all_else_unresolved all | |
53 | + if all | |
54 | + find(:all) | |
55 | + else | |
56 | + where(:resolved => false) | |
57 | + end | |
58 | + end | |
59 | + | |
52 | 60 | def self.in_env(env) |
53 | 61 | env.present? ? where(:environment => env) : scoped |
54 | 62 | end |
55 | - | |
63 | + | |
56 | 64 | def notices |
57 | 65 | Notice.for_errs(errs).ordered |
58 | 66 | end |
... | ... | @@ -60,20 +68,20 @@ class Problem |
60 | 68 | def comments_allowed? |
61 | 69 | Errbit::Config.allow_comments_with_issue_tracker || !app.issue_tracker_configured? |
62 | 70 | end |
63 | - | |
71 | + | |
64 | 72 | def resolve! |
65 | 73 | self.update_attributes!(:resolved => true, :resolved_at => Time.now) |
66 | 74 | end |
67 | - | |
75 | + | |
68 | 76 | def unresolve! |
69 | 77 | self.update_attributes!(:resolved => false, :resolved_at => nil) |
70 | 78 | end |
71 | - | |
79 | + | |
72 | 80 | def unresolved? |
73 | 81 | !resolved? |
74 | 82 | end |
75 | - | |
76 | - | |
83 | + | |
84 | + | |
77 | 85 | def self.merge!(*problems) |
78 | 86 | problems = problems.flatten.uniq |
79 | 87 | merged_problem = problems.shift |
... | ... | @@ -85,11 +93,11 @@ class Problem |
85 | 93 | merged_problem.reset_cached_attributes |
86 | 94 | merged_problem |
87 | 95 | end |
88 | - | |
96 | + | |
89 | 97 | def merged? |
90 | 98 | errs.length > 1 |
91 | 99 | end |
92 | - | |
100 | + | |
93 | 101 | def unmerge! |
94 | 102 | problem_errs = errs.to_a |
95 | 103 | problem_errs.shift |
... | ... | @@ -102,7 +110,7 @@ class Problem |
102 | 110 | end |
103 | 111 | end |
104 | 112 | |
105 | - | |
113 | + | |
106 | 114 | def self.ordered_by(sort, order) |
107 | 115 | case sort |
108 | 116 | when "app"; order_by(["app_name", order]) |
... | ... | @@ -171,6 +179,10 @@ class Problem |
171 | 179 | (app.issue_tracker_configured? && app.issue_tracker.label) || nil |
172 | 180 | end |
173 | 181 | |
182 | + def self.search(value) | |
183 | + where.or(error_class: /#{value}/i).or(where: /#{value}/i).or(message: /#{value}/i).or(app_name: /#{value}/i).or(environment: /#{value}/i) | |
184 | + end | |
185 | + | |
174 | 186 | private |
175 | 187 | def attribute_count_increase(name, value) |
176 | 188 | counter, index = send(name), attribute_index(value) |
... | ... | @@ -195,6 +207,5 @@ class Problem |
195 | 207 | def attribute_index(value) |
196 | 208 | Digest::MD5.hexdigest(value.to_s) |
197 | 209 | end |
198 | - | |
199 | 210 | end |
200 | 211 | ... | ... |
app/views/apps/show.html.haml
... | ... | @@ -82,7 +82,13 @@ |
82 | 82 | |
83 | 83 | - if @app.problems.any? |
84 | 84 | %h3.clear Errors |
85 | - = render 'problems/table', :problems => @problems | |
85 | + %section | |
86 | + = form_tag search_problems_path(:all_errs => @all_errs, :app_id => @app.id), :method => :get, :remote => true do | |
87 | + = text_field_tag :search, params[:search], :placeholder => 'Search for issues' | |
88 | + %br | |
89 | + %section | |
90 | + .problem_table{:id => 'problem_table'} | |
91 | + = render 'problems/table', :problems => @problems | |
86 | 92 | - else |
87 | 93 | %h3.clear No errs have been caught yet, make sure you setup your app |
88 | 94 | = render 'configuration_instructions', :app => @app | ... | ... |
app/views/problems/index.html.haml
1 | -- content_for :title, 'Unresolved Errors' | |
1 | +- content_for :title, @all_errs ? 'All Errors' : 'Unresolved Errors' | |
2 | 2 | - content_for :head do |
3 | 3 | = auto_discovery_link_tag :atom, problems_path(User.token_authentication_key => current_user.authentication_token, :format => "atom"), :title => "Errbit notices at #{request.host}" |
4 | 4 | - content_for :action_bar do |
5 | - = link_to 'show resolved', all_problems_path, :class => 'button' | |
6 | -= render 'table', :problems => @problems | |
5 | + - if @all_errs | |
6 | + = link_to 'hide resolved', problems_path, :class => 'button' | |
7 | + - else | |
8 | + = link_to 'show resolved', problems_path(:all_errs => true), :class => 'button' | |
9 | +%section | |
10 | + = form_tag search_problems_path(:all_errs => @all_errs), :method => :get, :remote => true do | |
11 | + = text_field_tag :search, params[:search], :placeholder => 'Search for issues' | |
12 | +%br | |
13 | +%section | |
14 | + .problem_table{:id => 'problem_table'} | |
15 | + = render 'problems/table', :problems => @problems | ... | ... |
config/routes.rb
spec/models/problem_spec.rb
... | ... | @@ -185,9 +185,20 @@ describe Problem do |
185 | 185 | Problem.unresolved.all.should include(unresolved) |
186 | 186 | end |
187 | 187 | end |
188 | - end | |
189 | - | |
190 | 188 | |
189 | + context "searching" do | |
190 | + it 'finds the correct record' do | |
191 | + find = Fabricate(:problem, :resolved => false, :error_class => 'theErrorclass::other', | |
192 | + :message => "other", :where => 'errorclass', :environment => 'development', :app_name => 'other') | |
193 | + dont_find = Fabricate(:problem, :resolved => false, :error_class => "Batman", | |
194 | + :message => 'todo', :where => 'classerror', :environment => 'development', :app_name => 'other') | |
195 | + Problem.search("theErrorClass").unresolved.should include(find) | |
196 | + Problem.search("theErrorClass").unresolved.should_not include(dont_find) | |
197 | + end | |
198 | + end | |
199 | + end | |
200 | + | |
201 | + | |
191 | 202 | context "notice counter cache" do |
192 | 203 | before do |
193 | 204 | @app = Fabricate(:app) | ... | ... |