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 | 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 < ApplicationController | @@ -108,6 +108,17 @@ class ErrsController < 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 => '« Previous', :next_label => 'Next »' | 34 | = will_paginate @problems, :previous_label => '« Previous', :next_label => 'Next »' |
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 |