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) | ... | ... |