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 1 class ErrsController < ApplicationController
2 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 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 122 def destroy_several
112 123 @selected_problems.each(&:destroy)
113 124 flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted."
... ...
app/models/problem.rb
... ... @@ -54,6 +54,19 @@ class Problem
54 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 71 def cache_notice_attributes(notice=nil)
59 72 notice ||= notices.first
... ...
app/views/errs/_table.html.haml
... ... @@ -34,6 +34,7 @@
34 34 = will_paginate @problems, :previous_label => '&laquo; Previous', :next_label => 'Next &raquo;'
35 35 .tab-bar
36 36 %ul
  37 + %li= submit_tag 'Merge', :id => 'merge_errs', :class => 'button', 'data-action' => merge_several_errs_path
37 38 %li= submit_tag 'Resolve', :id => 'resolve_errs', :class => 'button', 'data-action' => resolve_several_errs_path
38 39 %li= submit_tag 'Unresolve', :id => 'unresolve_errs', :class => 'button', 'data-action' => unresolve_several_errs_path
39 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 14 post :destroy_several
15 15 post :resolve_several
16 16 post :unresolve_several
  17 + post :merge_several
17 18 get :all
18 19 end
19 20 end
... ...
spec/controllers/errs_controller_spec.rb
... ... @@ -413,8 +413,8 @@ describe ErrsController do
413 413 describe "Bulk Actions" do
414 414 before(:each) do
415 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 418 end
419 419  
420 420 it "should apply to multiple problems" do
... ... @@ -422,6 +422,25 @@ describe ErrsController do
422 422 assigns(:selected_problems).should == [@problem1, @problem2]
423 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 444 context "POST /errs/resolve_several" do
426 445 it "should resolve the issue" do
427 446 post :resolve_several, :problems => [@problem2.id.to_s]
... ...
spec/models/problem_spec.rb
... ... @@ -78,6 +78,21 @@ describe Problem do
78 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 96 context "Scopes" do
82 97 context "resolved" do
83 98 it 'only finds resolved Problems' do
... ...