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 | ... | ... |