Project

General

Profile

Patch #4331 » 0001-Add-a-second-action-menu-to-IssuesController-show.-4.patch

Eric Davis, 2009-12-03 19:28

View differences:

app/controllers/watchers_controller.rb
72 72
  
73 73
  def set_watcher(user, watching)
74 74
    @watched.set_watcher(user, watching)
75
    if params[:replace].present?
76
      if params[:replace].is_a? Array
77
        replace_ids = params[:replace]
78
      else
79
        replace_ids = [params[:replace]]
80
      end
81
    else
82
      replace_ids = 'watcher'
83
    end
75 84
    respond_to do |format|
76 85
      format.html { redirect_to :back }
77
      format.js { render(:update) {|page| page.replace_html 'watcher', watcher_link(@watched, user)} }
86
      format.js do
87
        render(:update) do |page|
88
          replace_ids.each do |replace_id|
89
            page.replace_html replace_id, watcher_link(@watched, user, :replace => replace_ids)
90
          end
91
        end
92
      end
78 93
    end
79 94
  rescue ::ActionController::RedirectBackError
80 95
    render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true
app/helpers/watchers_helper.rb
16 16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 17

  
18 18
module WatchersHelper
19
  def watcher_tag(object, user)
20
    content_tag("span", watcher_link(object, user), :id => 'watcher')
19

  
20
  # Valid options
21
  # * :id - the element id
22
  # * :replace - a string or array of element ids that will be
23
  #   replaced
24
  def watcher_tag(object, user, options={:replace => 'watcher'})
25
    id = options[:id]
26
    id ||= options[:replace] if options[:replace].is_a? String
27
    content_tag("span", watcher_link(object, user, options), :id => id)
21 28
  end
22 29
  
23
  def watcher_link(object, user)
30
  # Valid options
31
  # * :replace - a string or array of element ids that will be
32
  #   replaced
33
  def watcher_link(object, user, options={:replace => 'watcher'})
24 34
    return '' unless user && user.logged? && object.respond_to?('watched_by?')
25 35
    watched = object.watched_by?(user)
26 36
    url = {:controller => 'watchers',
27 37
           :action => (watched ? 'unwatch' : 'watch'),
28 38
           :object_type => object.class.to_s.underscore,
29
           :object_id => object.id}           
39
           :object_id => object.id,
40
           :replace => options[:replace]}
30 41
    link_to_remote((watched ? l(:button_unwatch) : l(:button_watch)),
31 42
                   {:url => url},
32 43
                   :href => url_for(url),
app/views/issues/_action_menu.rhtml
1
<div class="contextual">
2
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
3
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time-add' %>
4
<% replace_watcher ||= 'watcher' %>
5
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
6
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
7
<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
8
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
9
</div>
app/views/issues/show.rhtml
1
<div class="contextual">
2
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
3
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time-add' %>
4
<%= watcher_tag(@issue, User.current) %>
5
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
6
<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
7
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
8
</div>
1
<%= render :partial => 'action_menu' %>
9 2

  
10 3
<h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
11 4

  
......
93 86
<%= render :partial => 'history', :locals => { :journals => @journals } %>
94 87
</div>
95 88
<% end %>
89

  
90
<%= render :partial => 'action_menu', :locals => {:replace_watcher => 'watcher2' } %>
91

  
96 92
<div style="clear: both;"></div>
97 93

  
98 94
<% if authorize_for('issues', 'edit') %>
test/functional/watchers_controller_test.rb
47 47
    end
48 48
    assert Issue.find(1).watched_by?(User.find(3))
49 49
  end
50

  
51
  def test_watch_with_multiple_replacements
52
    @request.session[:user_id] = 3
53
    assert_difference('Watcher.count') do
54
      xhr :post, :watch, :object_type => 'issue', :object_id => '1', :replace => ['watch_item_1','watch_item_2']
55
      assert_response :success
56
      assert_select_rjs :replace_html, 'watch_item_1'
57
      assert_select_rjs :replace_html, 'watch_item_2'
58
    end
59
  end
50 60
  
51 61
  def test_unwatch
52 62
    @request.session[:user_id] = 3
......
57 67
    end
58 68
    assert !Issue.find(1).watched_by?(User.find(3))
59 69
  end
60
  
70

  
71
  def test_unwatch_with_multiple_replacements
72
    @request.session[:user_id] = 3
73
    assert_difference('Watcher.count', -1) do
74
      xhr :post, :unwatch, :object_type => 'issue', :object_id => '2', :replace => ['watch_item_1', 'watch_item_2']
75
      assert_response :success
76
      assert_select_rjs :replace_html, 'watch_item_1'
77
      assert_select_rjs :replace_html, 'watch_item_2'
78
    end
79
    assert !Issue.find(1).watched_by?(User.find(3))
80
  end
81

  
61 82
  def test_new_watcher
62 83
    @request.session[:user_id] = 2
63 84
    assert_difference('Watcher.count') do
(2-2/2)