From 04cdb2ec8738b2aa542b0cadaee273dd18c7ad3d Mon Sep 17 00:00:00 2001 From: damau Date: Thu, 14 Feb 2013 11:06:14 +0000 Subject: [PATCH] adds a search bar to issues closes issue #367 --- app/controllers/problems_controller.rb | 23 +++++++++++++---------- app/models/problem.rb | 37 ++++++++++++++++++++++++------------- app/views/apps/show.html.haml | 8 +++++++- app/views/problems/index.html.haml | 15 ++++++++++++--- app/views/problems/search.js.haml | 5 +++++ config/routes.rb | 1 + spec/models/problem_spec.rb | 15 +++++++++++++-- 7 files changed, 75 insertions(+), 29 deletions(-) create mode 100644 app/views/problems/search.js.haml diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb index 3e37a07..b747e43 100644 --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -7,8 +7,8 @@ class ProblemsController < ApplicationController def index app_scope = current_user.admin? ? App.all : current_user.apps - - @problems = Problem.for_apps(app_scope).in_env(params[:environment]).unresolved.ordered_by(@sort, @order) + @all_errs = params[:all_errs] + @problems = Problem.for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(@all_errs).ordered_by(@sort, @order) @selected_problems = params[:problems] || [] respond_to do |format| format.html do @@ -18,11 +18,11 @@ class ProblemsController < ApplicationController end end - def all - app_scope = current_user.admin? ? App.all : current_user.apps - @problems = Problem.for_apps(app_scope).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page) - @selected_problems = params[:problems] || [] - end +# def all +# app_scope = current_user.admin? ? App.all : current_user.apps +# @problems = Problem.for_apps(app_scope).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page) +# @selected_problems = params[:problems] || [] +# end def show @notices = @problem.notices.reverse_ordered.page(params[:notice]).per(1) @@ -92,9 +92,12 @@ class ProblemsController < ApplicationController end def search - app_scope = current_user.admin? ? App.all : current_user.apps - - @problems = Problem.for_apps(app_scope).in_env(params[:environment]).unresolved.ordered_by(@sort, @order) + if params[:app_id] + app_scope = App.where(:_id => params[:app_id]) + else + app_scope = current_user.admin? ? App.all : current_user.apps + end + @problems = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(@sort, @order) @selected_problems = params[:problems] || [] @problems = @problems.page(params[:page]).per(current_user.per_page) render :content_type => 'text/javascript' diff --git a/app/models/problem.rb b/app/models/problem.rb index 78be8e2..5549ff5 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -40,19 +40,27 @@ class Problem has_many :comments, :inverse_of => :err, :dependent => :destroy before_create :cache_app_attributes - + scope :resolved, where(:resolved => true) scope :unresolved, where(:resolved => false) scope :ordered, order_by(:last_notice_at.desc) scope :for_apps, lambda {|apps| where(:app_id.in => apps.all.map(&:id))} validates_presence_of :last_notice_at, :first_notice_at - - + + + def self.all_else_unresolved all + if all + find(:all) + else + where(:resolved => false) + end + end + def self.in_env(env) env.present? ? where(:environment => env) : scoped end - + def notices Notice.for_errs(errs).ordered end @@ -60,20 +68,20 @@ class Problem def comments_allowed? Errbit::Config.allow_comments_with_issue_tracker || !app.issue_tracker_configured? end - + def resolve! self.update_attributes!(:resolved => true, :resolved_at => Time.now) end - + def unresolve! self.update_attributes!(:resolved => false, :resolved_at => nil) end - + def unresolved? !resolved? end - - + + def self.merge!(*problems) problems = problems.flatten.uniq merged_problem = problems.shift @@ -85,11 +93,11 @@ class Problem merged_problem.reset_cached_attributes merged_problem end - + def merged? errs.length > 1 end - + def unmerge! problem_errs = errs.to_a problem_errs.shift @@ -102,7 +110,7 @@ class Problem end end - + def self.ordered_by(sort, order) case sort when "app"; order_by(["app_name", order]) @@ -171,6 +179,10 @@ class Problem (app.issue_tracker_configured? && app.issue_tracker.label) || nil end + def self.search(value) + where.or(error_class: /#{value}/i).or(where: /#{value}/i).or(message: /#{value}/i).or(app_name: /#{value}/i).or(environment: /#{value}/i) + end + private def attribute_count_increase(name, value) counter, index = send(name), attribute_index(value) @@ -195,6 +207,5 @@ class Problem def attribute_index(value) Digest::MD5.hexdigest(value.to_s) end - end diff --git a/app/views/apps/show.html.haml b/app/views/apps/show.html.haml index 05194a1..65c42af 100644 --- a/app/views/apps/show.html.haml +++ b/app/views/apps/show.html.haml @@ -82,7 +82,13 @@ - if @app.problems.any? %h3.clear Errors - = render 'problems/table', :problems => @problems + %section + = form_tag search_problems_path(:all_errs => @all_errs, :app_id => @app.id), :method => :get, :remote => true do + = text_field_tag :search, params[:search], :placeholder => 'Search for issues' + %br + %section + .problem_table{:id => 'problem_table'} + = render 'problems/table', :problems => @problems - else %h3.clear No errs have been caught yet, make sure you setup your app = render 'configuration_instructions', :app => @app diff --git a/app/views/problems/index.html.haml b/app/views/problems/index.html.haml index 74267b8..beed17b 100644 --- a/app/views/problems/index.html.haml +++ b/app/views/problems/index.html.haml @@ -1,6 +1,15 @@ -- content_for :title, 'Unresolved Errors' +- content_for :title, @all_errs ? 'All Errors' : 'Unresolved Errors' - content_for :head do = auto_discovery_link_tag :atom, problems_path(User.token_authentication_key => current_user.authentication_token, :format => "atom"), :title => "Errbit notices at #{request.host}" - content_for :action_bar do - = link_to 'show resolved', all_problems_path, :class => 'button' -= render 'table', :problems => @problems + - if @all_errs + = link_to 'hide resolved', problems_path, :class => 'button' + - else + = link_to 'show resolved', problems_path(:all_errs => true), :class => 'button' +%section + = form_tag search_problems_path(:all_errs => @all_errs), :method => :get, :remote => true do + = text_field_tag :search, params[:search], :placeholder => 'Search for issues' +%br +%section + .problem_table{:id => 'problem_table'} + = render 'problems/table', :problems => @problems diff --git a/app/views/problems/search.js.haml b/app/views/problems/search.js.haml new file mode 100644 index 0000000..ada5a9c --- /dev/null +++ b/app/views/problems/search.js.haml @@ -0,0 +1,5 @@ +$("#problem_table").empty().append("#{escape_javascript(render('problems/table', :problems => @problems))}"); +$.getScript('/assets/errbit.js') +$("#flash-messages").empty() + + diff --git a/config/routes.rb b/config/routes.rb index 5ff11a4..4ea10e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,6 +22,7 @@ Errbit::Application.routes.draw do post :merge_several post :unmerge_several get :all + get :search, :format => [:js] end end diff --git a/spec/models/problem_spec.rb b/spec/models/problem_spec.rb index 2a72283..d72c851 100644 --- a/spec/models/problem_spec.rb +++ b/spec/models/problem_spec.rb @@ -185,9 +185,20 @@ describe Problem do Problem.unresolved.all.should include(unresolved) end end - end - + context "searching" do + it 'finds the correct record' do + find = Fabricate(:problem, :resolved => false, :error_class => 'theErrorclass::other', + :message => "other", :where => 'errorclass', :environment => 'development', :app_name => 'other') + dont_find = Fabricate(:problem, :resolved => false, :error_class => "Batman", + :message => 'todo', :where => 'classerror', :environment => 'development', :app_name => 'other') + Problem.search("theErrorClass").unresolved.should include(find) + Problem.search("theErrorClass").unresolved.should_not include(dont_find) + end + end + end + + context "notice counter cache" do before do @app = Fabricate(:app) -- libgit2 0.21.2