Commit 8e57c5874792340236e6db0bce6d9a9b2aa945d0
1 parent
b65d58fd
Exists in
master
and in
1 other branch
added a 'Merge' bulk action
Showing
6 changed files
with
65 additions
and
5 deletions
Show diff stats
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 < 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 => '« Previous', :next_label => 'Next »' |
| 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
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 | ... | ... |