Commit 8e57c5874792340236e6db0bce6d9a9b2aa945d0

Authored by Bob Lail
1 parent b65d58fd
Exists in master and in 1 other branch production

added a 'Merge' bulk action

app/controllers/errs_controller.rb
1 class ErrsController < ApplicationController 1 class ErrsController < ApplicationController
2 include ActionView::Helpers::TextHelper 2 include ActionView::Helpers::TextHelper
3 3
4 - before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several]  
5 - before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several]  
6 - before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several] 4 + before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several]
  5 + before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several]
  6 + before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several]
7 7
8 8
9 9
@@ -108,6 +108,17 @@ class ErrsController &lt; ApplicationController @@ -108,6 +108,17 @@ class ErrsController &lt; ApplicationController
108 end 108 end
109 109
110 110
  111 + def merge_several
  112 + if @selected_problems.length < 2
  113 + flash[:notice] = "You must select at least two errors to merge"
  114 + else
  115 + @merged_problem = Problem.merge!(@selected_problems)
  116 + flash[:notice] = "#{@selected_problems.count} errors have been merged."
  117 + end
  118 + redirect_to :back
  119 + end
  120 +
  121 +
111 def destroy_several 122 def destroy_several
112 @selected_problems.each(&:destroy) 123 @selected_problems.each(&:destroy)
113 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted." 124 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted."
app/models/problem.rb
@@ -54,6 +54,19 @@ class Problem @@ -54,6 +54,19 @@ class Problem
54 end 54 end
55 55
56 56
  57 + def self.merge!(*problems)
  58 + problems = problems.flatten.uniq
  59 + merged_problem = problems.shift
  60 + problems.each do |problem|
  61 + merged_problem.errs.concat Err.where(:problem_id => problem.id)
  62 + problem.errs(true) # reload problem.errs (should be empty) before problem.destroy
  63 + problem.destroy
  64 + end
  65 + merged_problem.cache_notice_attributes
  66 + merged_problem
  67 + end
  68 +
  69 +
57 70
58 def cache_notice_attributes(notice=nil) 71 def cache_notice_attributes(notice=nil)
59 notice ||= notices.first 72 notice ||= notices.first
app/views/errs/_table.html.haml
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 = will_paginate @problems, :previous_label => '&laquo; Previous', :next_label => 'Next &raquo;' 34 = will_paginate @problems, :previous_label => '&laquo; Previous', :next_label => 'Next &raquo;'
35 .tab-bar 35 .tab-bar
36 %ul 36 %ul
  37 + %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path
37 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path 38 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path
38 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path 39 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path
39 %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path 40 %li= submit_tag 'Delete', :id => 'delete_errs', :class => 'button', 'data-action' => destroy_several_errs_path
config/routes.rb
@@ -14,6 +14,7 @@ Errbit::Application.routes.draw do @@ -14,6 +14,7 @@ Errbit::Application.routes.draw do
14 post :destroy_several 14 post :destroy_several
15 post :resolve_several 15 post :resolve_several
16 post :unresolve_several 16 post :unresolve_several
  17 + post :merge_several
17 get :all 18 get :all
18 end 19 end
19 end 20 end
spec/controllers/errs_controller_spec.rb
@@ -413,8 +413,8 @@ describe ErrsController do @@ -413,8 +413,8 @@ describe ErrsController do
413 describe "Bulk Actions" do 413 describe "Bulk Actions" do
414 before(:each) do 414 before(:each) do
415 sign_in Factory(:admin) 415 sign_in Factory(:admin)
416 - @problem1 = Factory(:problem, :resolved => true)  
417 - @problem2 = Factory(:problem, :resolved => false) 416 + @problem1 = Factory(:err, :problem => Factory(:problem, :resolved => true)).problem
  417 + @problem2 = Factory(:err, :problem => Factory(:problem, :resolved => false)).problem
418 end 418 end
419 419
420 it "should apply to multiple problems" do 420 it "should apply to multiple problems" do
@@ -422,6 +422,25 @@ describe ErrsController do @@ -422,6 +422,25 @@ describe ErrsController do
422 assigns(:selected_problems).should == [@problem1, @problem2] 422 assigns(:selected_problems).should == [@problem1, @problem2]
423 end 423 end
424 424
  425 + it "should require at least one problem" do
  426 + post :resolve_several, :problems => []
  427 + request.flash[:notice].should match(/You have not selected any/)
  428 + end
  429 +
  430 + context "POST /errs/merge_several" do
  431 + it "should require at least two problems" do
  432 + post :merge_several, :problems => [@problem1.id.to_s]
  433 + request.flash[:notice].should match(/You must select at least two/)
  434 + end
  435 +
  436 + it "should merge the problems" do
  437 + lambda {
  438 + post :merge_several, :problems => [@problem1.id.to_s, @problem2.id.to_s]
  439 + assigns(:merged_problem).reload.errs.length.should == 2
  440 + }.should change(Problem, :count).by(-1)
  441 + end
  442 + end
  443 +
425 context "POST /errs/resolve_several" do 444 context "POST /errs/resolve_several" do
426 it "should resolve the issue" do 445 it "should resolve the issue" do
427 post :resolve_several, :problems => [@problem2.id.to_s] 446 post :resolve_several, :problems => [@problem2.id.to_s]
spec/models/problem_spec.rb
@@ -78,6 +78,21 @@ describe Problem do @@ -78,6 +78,21 @@ describe Problem do
78 end 78 end
79 79
80 80
  81 + context "#merge!" do
  82 + it "collects the Errs from several problems into one and deletes the other problems" do
  83 + problem1 = Factory(:err).problem
  84 + problem2 = Factory(:err).problem
  85 + problem1.errs.length.should == 1
  86 + problem2.errs.length.should == 1
  87 +
  88 + lambda {
  89 + merged_problem = Problem.merge!(problem1, problem2)
  90 + merged_problem.reload.errs.length.should == 2
  91 + }.should change(Problem, :count).by(-1)
  92 + end
  93 + end
  94 +
  95 +
81 context "Scopes" do 96 context "Scopes" do
82 context "resolved" do 97 context "resolved" do
83 it 'only finds resolved Problems' do 98 it 'only finds resolved Problems' do