Project

General

Profile

Feature #37973 » enable_to_display_watchers_count_on_issues_list.patch

Takenori TAKAKI, 2023-05-19 07:13

View differences:

app/models/issue.rb
1184 1184
    end
1185 1185
  end
1186 1186

  
1187
  def watchers_count
1188
    @watchers_count ||= self.watchers.count(:id)
1189
  end
1190

  
1187 1191
  # Preloads relations for a collection of issues
1188 1192
  def self.load_relations(issues)
1189 1193
    if issues.any?
app/models/issue_query.rb
45 45
    QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true),
46 46
    QueryColumn.new(:fixed_version, :sortable => lambda {Version.fields_for_order_statement},
47 47
                    :groupable => true),
48
    QueryColumn.new(
49
      :watchers_count,
50
      :sortable =>
51
        lambda do
52
          "COALESCE((SELECT COUNT(user_id) FROM #{Watcher.table_name}" \
53
          " WHERE #{Watcher.table_name}.watchable_type = 'Issue'" \
54
          " AND #{Watcher.table_name}.watchable_id = #{Issue.table_name}.id), 0)"
55
        end,
56
      :default_order => 'desc'),
48 57
    QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date", :groupable => true),
49 58
    QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date", :groupable => true),
50 59
    QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours",
app/views/watchers/_set_watcher.js.erb
1
<% selector = ".#{watcher_css(watched)}" %>
2
$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript watcher_link(watched, user) %>")});
3
$('#watchers').html('<%= escape_javascript(render(:partial => 'watchers/watchers', :locals => {:watched => watched.first})) %>');
1
var back_url = $('input[name="back_url"]').val() || '';
2
if (back_url.length > 0) {
3
  window.location.href = back_url;
4
} else {
5
  <% selector = ".#{watcher_css(watched)}" %>
6
  $("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript watcher_link(watched, user) %>")});
7
  $('#watchers').html('<%= escape_javascript(render(:partial => 'watchers/watchers', :locals => {:watched => watched.first})) %>');
8
}
app/views/watchers/create.js.erb
3 3
         render(:partial => 'watchers/new',
4 4
                :locals => {:watchables => @watchables, :users => @users})) %>');
5 5

  
6
<% if @watchables.size == 1 %>
7
  <%= render(:partial => 'watchers/set_watcher',
8
             :locals => {:watched => @watchables, :user => User.current}) %>
9
<% end %>
6
<%= render(:partial => 'watchers/set_watcher',
7
           :locals => {:watched => @watchables, :user => User.current}) %>
config/locales/en.yml
369 369
  field_parent_title: Parent page
370 370
  field_editable: Editable
371 371
  field_watcher: Watcher
372
  field_watchers_count: Watchers count
372 373
  field_content: Content
373 374
  field_group_by: Group results by
374 375
  field_sharing: Sharing
config/locales/ja.yml
328 328
  field_parent_title: 親ページ
329 329
  field_editable: 編集可能
330 330
  field_watcher: ウォッチャー
331
  field_watchers_count: ウォッチ数
331 332
  field_content: 内容
332 333
  field_group_by: グループ条件
333 334
  field_sharing: 共有
test/functional/issues_controller_test.rb
1377 1377
    assert_equal hours.sort.reverse, hours
1378 1378
  end
1379 1379

  
1380
  def test_index_sort_by_watchers_count
1381
    Watcher.delete_all
1382
    User.find([2, 3]).each do |user|
1383
      Watcher.create!(:user => user, :watchable => Issue.find(1))
1384
    end
1385
    Watcher.create!(:user => User.find(2), :watchable => Issue.find(2))
1386
    get(:index, :params => {:sort => 'watchers_count:desc'})
1387
    assert_response :success
1388
    assert_equal [2, 1, 0], issues_in_list.map {|issue| issue.watchers_count}.first(3)
1389
  end
1390

  
1380 1391
  def test_index_sort_by_user_custom_field
1381 1392
    cf = IssueCustomField.
1382 1393
           create!(
test/unit/issue_test.rb
3524 3524
    r = Issue.like('issue today')
3525 3525
    assert_include Issue.find(7), r
3526 3526
  end
3527

  
3528
  def test_watchers_count
3529
    issue = Issue.generate!
3530
    User.find([2, 3]).each do |user|
3531
      Watcher.create!(:user => user, :watchable => issue)
3532
    end
3533
    assert_equal 2, issue.watchers_count
3534
  end
3527 3535
end
(4-4/4)