diff --git a/app/controllers/errs_controller.rb b/app/controllers/errs_controller.rb index cdff01c..f1b4585 100644 --- a/app/controllers/errs_controller.rb +++ b/app/controllers/errs_controller.rb @@ -1,9 +1,9 @@ class ErrsController < ApplicationController include ActionView::Helpers::TextHelper - before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several] - before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several] - before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several] + before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several] + before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several] + before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several] @@ -108,6 +108,17 @@ class ErrsController < ApplicationController end + def merge_several + if @selected_problems.length < 2 + flash[:notice] = "You must select at least two errors to merge" + else + @merged_problem = Problem.merge!(@selected_problems) + flash[:notice] = "#{@selected_problems.count} errors have been merged." + end + redirect_to :back + end + + def destroy_several @selected_problems.each(&:destroy) flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted." diff --git a/app/models/problem.rb b/app/models/problem.rb index 7546225..a0d0df5 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -54,6 +54,19 @@ class Problem end + def self.merge!(*problems) + problems = problems.flatten.uniq + merged_problem = problems.shift + problems.each do |problem| + merged_problem.errs.concat Err.where(:problem_id => problem.id) + problem.errs(true) # reload problem.errs (should be empty) before problem.destroy + problem.destroy + end + merged_problem.cache_notice_attributes + merged_problem + end + + def cache_notice_attributes(notice=nil) notice ||= notices.first diff --git a/app/views/errs/_table.html.haml b/app/views/errs/_table.html.haml index aacffd0..7ae8eb2 100644 --- a/app/views/errs/_table.html.haml +++ b/app/views/errs/_table.html.haml @@ -34,6 +34,7 @@ = will_paginate @problems, :previous_label => '« Previous', :next_label => 'Next »' .tab-bar %ul + %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path diff --git a/config/routes.rb b/config/routes.rb index e74afb6..7b95ad3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,6 +14,7 @@ Errbit::Application.routes.draw do post :destroy_several post :resolve_several post :unresolve_several + post :merge_several get :all end end diff --git a/spec/controllers/errs_controller_spec.rb b/spec/controllers/errs_controller_spec.rb index 9885abd..4cccb35 100644 --- a/spec/controllers/errs_controller_spec.rb +++ b/spec/controllers/errs_controller_spec.rb @@ -413,8 +413,8 @@ describe ErrsController do describe "Bulk Actions" do before(:each) do sign_in Factory(:admin) - @problem1 = Factory(:problem, :resolved => true) - @problem2 = Factory(:problem, :resolved => false) + @problem1 = Factory(:err, :problem => Factory(:problem, :resolved => true)).problem + @problem2 = Factory(:err, :problem => Factory(:problem, :resolved => false)).problem end it "should apply to multiple problems" do @@ -422,6 +422,25 @@ describe ErrsController do assigns(:selected_problems).should == [@problem1, @problem2] end + it "should require at least one problem" do + post :resolve_several, :problems => [] + request.flash[:notice].should match(/You have not selected any/) + end + + context "POST /errs/merge_several" do + it "should require at least two problems" do + post :merge_several, :problems => [@problem1.id.to_s] + request.flash[:notice].should match(/You must select at least two/) + end + + it "should merge the problems" do + lambda { + post :merge_several, :problems => [@problem1.id.to_s, @problem2.id.to_s] + assigns(:merged_problem).reload.errs.length.should == 2 + }.should change(Problem, :count).by(-1) + end + end + context "POST /errs/resolve_several" do it "should resolve the issue" do post :resolve_several, :problems => [@problem2.id.to_s] diff --git a/spec/models/problem_spec.rb b/spec/models/problem_spec.rb index effb977..1b80868 100644 --- a/spec/models/problem_spec.rb +++ b/spec/models/problem_spec.rb @@ -78,6 +78,21 @@ describe Problem do end + context "#merge!" do + it "collects the Errs from several problems into one and deletes the other problems" do + problem1 = Factory(:err).problem + problem2 = Factory(:err).problem + problem1.errs.length.should == 1 + problem2.errs.length.should == 1 + + lambda { + merged_problem = Problem.merge!(problem1, problem2) + merged_problem.reload.errs.length.should == 2 + }.should change(Problem, :count).by(-1) + end + end + + context "Scopes" do context "resolved" do it 'only finds resolved Problems' do -- libgit2 0.21.2