summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-11-16 11:57:08 +0000
committerRémy Coutable <remy@rymai.me>2016-11-16 11:57:08 +0000
commitcfcf5460b55c8f6245dd59e4531cd4b3b7abf114 (patch)
tree03b1a563021d133132e9c3665d2fbac18a861e5f
parent05be65f3731ebbe569c51a78ef72e30bf26aa8d0 (diff)
parent3d13096f7198ed1ec4b7c568977877452f842394 (diff)
downloadgitlab-ce-cfcf5460b55c8f6245dd59e4531cd4b3b7abf114.tar.gz
Merge branch 'fix_navigation_bar_issuables_counters' into 'master'
Navigation bar issuables counters reflects dashboard issuables counters Adds a 2 minute cache on navigation bar issuables counters. The counters on dashboard/issues and dashboard/merge_requests are cached while the navigation bar issuables counters were not. Users read incoherent issuables count throughout the application. Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/23882 See merge request !7368
-rw-r--r--app/helpers/issuables_helper.rb11
-rw-r--r--app/views/layouts/nav/_dashboard.html.haml4
-rw-r--r--changelogs/unreleased/fix_navigation_bar_issuables_counters.yml4
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb44
4 files changed, 61 insertions, 2 deletions
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 8b97cf07fb9..ce2cabd7a3a 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -136,8 +136,19 @@ module IssuablesHelper
html.html_safe
end
+ def cached_assigned_issuables_count(assignee, issuable_type, state)
+ cache_key = hexdigest(['assigned_issuables_count', assignee.id, issuable_type, state].join('-'))
+ Rails.cache.fetch(cache_key, expires_in: 2.minutes) do
+ assigned_issuables_count(assignee, issuable_type, state)
+ end
+ end
+
private
+ def assigned_issuables_count(assignee, issuable_type, state)
+ assignee.public_send("assigned_#{issuable_type}").public_send(state).count
+ end
+
def sidebar_gutter_collapsed?
cookies[:collapsed_gutter] == 'true'
end
diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml
index a0356feef95..2a6d9cda379 100644
--- a/app/views/layouts/nav/_dashboard.html.haml
+++ b/app/views/layouts/nav/_dashboard.html.haml
@@ -26,12 +26,12 @@
= link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues' do
%span
Issues
- %span.count= number_with_delimiter(current_user.assigned_issues.opened.count)
+ %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :issues, :opened))
= nav_link(path: 'dashboard#merge_requests') do
= link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'dashboard-shortcuts-merge_requests' do
%span
Merge Requests
- %span.count= number_with_delimiter(current_user.assigned_merge_requests.opened.count)
+ %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :merge_requests, :opened))
= nav_link(controller: 'dashboard/snippets') do
= link_to dashboard_snippets_path, title: 'Snippets' do
%span
diff --git a/changelogs/unreleased/fix_navigation_bar_issuables_counters.yml b/changelogs/unreleased/fix_navigation_bar_issuables_counters.yml
new file mode 100644
index 00000000000..0f7f8155f91
--- /dev/null
+++ b/changelogs/unreleased/fix_navigation_bar_issuables_counters.yml
@@ -0,0 +1,4 @@
+---
+title: Navigation bar issuables counters reflects dashboard issuables counters
+merge_request: 7368
+author: Lucas Deschamps
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
new file mode 100644
index 00000000000..41dcfe439c2
--- /dev/null
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -0,0 +1,44 @@
+require 'spec_helper'
+
+describe 'Navigation bar counter', feature: true, js: true, caching: true do
+ let(:user) { create(:user) }
+ let(:project) { create(:empty_project, namespace: user.namespace) }
+ let(:issue) { create(:issue, project: project) }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ before do
+ issue.update(assignee: user)
+ merge_request.update(assignee: user)
+ login_as(user)
+ end
+
+ it 'reflects dashboard issues count' do
+ visit issues_dashboard_path
+
+ expect_counters('issues', '1')
+
+ issue.update(assignee: nil)
+ visit issues_dashboard_path
+
+ expect_counters('issues', '1')
+ end
+
+ it 'reflects dashboard merge requests count' do
+ visit merge_requests_dashboard_path
+
+ expect_counters('merge_requests', '1')
+
+ merge_request.update(assignee: nil)
+ visit merge_requests_dashboard_path
+
+ expect_counters('merge_requests', '1')
+ end
+
+ def expect_counters(issuable_type, count)
+ dashboard_count = find('li.active span.badge')
+ nav_count = find(".dashboard-shortcuts-#{issuable_type} span.count")
+
+ expect(nav_count).to have_content(count)
+ expect(dashboard_count).to have_content(count)
+ end
+end