From bcbfe5a552421a106e34f9fd64ffb5c54b34d823 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Tue, 10 Mar 2015 09:51:56 +0100 Subject: [PATCH] SONAR-5726 apply feedback --- .../widgets/_widget-issue-filter-limit.hbs | 1 + .../widget-issue-filter-action-plans.hbs | 4 + .../widgets/widget-issue-filter-assignees.hbs | 4 + .../widget-issue-filter-resolutions.hbs | 4 + .../widget-issue-filter-severities.hbs | 4 + .../widgets/widget-issue-filter-statuses.hbs | 4 + .../main/hbs/widgets/widget-issue-filter.hbs | 4 + .../src/main/js/widgets/issue-filter.js | 18 +++- .../src/test/js/global-issue-filter-widget.js | 100 ++++++++++++++---- .../test/js/project-issue-filter-widget.js | 28 ++--- .../unresolved-issues-by-reporter.json | 44 ++++++++ .../resources/org/sonar/l10n/core.properties | 3 +- 12 files changed, 181 insertions(+), 37 deletions(-) create mode 100644 server/sonar-web/src/main/hbs/widgets/_widget-issue-filter-limit.hbs create mode 100644 server/sonar-web/src/test/json/global-issues-filter-widget/unresolved-issues-by-reporter.json diff --git a/server/sonar-web/src/main/hbs/widgets/_widget-issue-filter-limit.hbs b/server/sonar-web/src/main/hbs/widgets/_widget-issue-filter-limit.hbs new file mode 100644 index 00000000000..6da82834180 --- /dev/null +++ b/server/sonar-web/src/main/hbs/widgets/_widget-issue-filter-limit.hbs @@ -0,0 +1 @@ +
{{tp 'max_items_reached' maxResults}}
diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-action-plans.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-action-plans.hbs index cec1a9a6748..07c9b17f40c 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-action-plans.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-action-plans.hbs @@ -20,3 +20,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-assignees.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-assignees.hbs index 3e1add4abd2..494104f3ee9 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-assignees.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-assignees.hbs @@ -20,3 +20,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-resolutions.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-resolutions.hbs index 8c03461b619..50827ba41bb 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-resolutions.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-resolutions.hbs @@ -20,3 +20,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-severities.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-severities.hbs index 98b255ce640..99f8f487c1f 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-severities.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-severities.hbs @@ -17,3 +17,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-statuses.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-statuses.hbs index b27fc32964f..70d5a57c765 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-statuses.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter-statuses.hbs @@ -17,3 +17,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter.hbs b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter.hbs index ffb3e072557..dc78bba0232 100644 --- a/server/sonar-web/src/main/hbs/widgets/widget-issue-filter.hbs +++ b/server/sonar-web/src/main/hbs/widgets/widget-issue-filter.hbs @@ -16,3 +16,7 @@ {{/each}} + +{{#if maxResultsReached}} + {{> '_widget-issue-filter-limit'}} +{{/if}} diff --git a/server/sonar-web/src/main/js/widgets/issue-filter.js b/server/sonar-web/src/main/js/widgets/issue-filter.js index c8d27bf5196..03479ae361a 100644 --- a/server/sonar-web/src/main/js/widgets/issue-filter.js +++ b/server/sonar-web/src/main/js/widgets/issue-filter.js @@ -20,6 +20,7 @@ define(['templates/widgets'], function () { var $ = jQuery, + FACET_LIMIT = 15, defaultComparator = function (item) { return -item.count; }, @@ -119,6 +120,16 @@ define(['templates/widgets'], function () { } } }, + 'reporters': { + label: function (item, r) { + if (_.isArray(r.users)) { + var reporter = _.findWhere(r.users, { login: item.val }); + if (reporter != null) { + return reporter.name; + } + } + } + }, 'actionPlans': { template: 'widget-issue-filter-action-plans', label: function (item, r) { @@ -139,7 +150,7 @@ define(['templates/widgets'], function () { }, 'createdAt': { comparator: function (item) { - return moment(item.val).toDate(); + return -moment(item.val).unix(); }, label: function (item, r, items, index, query) { var beginning = moment(item.val), @@ -284,8 +295,11 @@ define(['templates/widgets'], function () { if (_.isArray(r.facets) && r.facets.length === 1) { // save response object, but do not trigger repaint that.model.set({ rawResponse: r }, { silent: true }); + var items = that.sortItems(that.withLabels(that.withLink(that.filterItems(r.facets[0].values)))); that.model.set({ - items: that.sortItems(that.withLabels(that.withLink(that.filterItems(r.facets[0].values)))), + items: items, + maxResultsReached: r.facets[0].values.length >= FACET_LIMIT, + maxResults: items.length, total: r.total }); } diff --git a/server/sonar-web/src/test/js/global-issue-filter-widget.js b/server/sonar-web/src/test/js/global-issue-filter-widget.js index ac2f5f78acf..128006d6041 100644 --- a/server/sonar-web/src/test/js/global-issue-filter-widget.js +++ b/server/sonar-web/src/test/js/global-issue-filter-widget.js @@ -545,6 +545,66 @@ casper.test.begin(testName('Unresolved Unassigned Issues By Assignee'), 6, funct }); +casper.test.begin(testName('Unresolved Issues By Reporter'), 12, function (test) { + casper + .start(lib.buildUrl('issue-filter-widget'), function () { + lib.setDefaultViewport(); + + lib.mockRequest('/api/l10n/index', '{}'); + lib.mockRequestFromFile('/api/issues/search', 'unresolved-issues-by-reporter.json', + { data: { resolved: 'false' } }); + }) + + .then(function () { + casper.evaluate(function () { + require(['/js/widgets/issue-filter.js'], function (IssueFilter) { + window.requestMessages().done(function () { + new IssueFilter({ + el: '#issue-filter-widget', + query: 'resolved=false', + distributionAxis: 'reporters' + }); + }); + }); + }); + }) + + .then(function () { + casper.waitForSelector('#issue-filter-widget > table'); + }) + + .then(function () { + // check count + test.assertElementCount('tr', 4); + + // check order and values + test.assertSelectorContains('tr:nth-child(1)', '6851'); + test.assertSelectorContains('tr:nth-child(2)', '698'); + test.assertSelectorContains('tr:nth-child(3)', '504'); + test.assertSelectorContains('tr:nth-child(4)', '426'); + + // check links + test.assertExists('tr:nth-child(1) a[href="/issues/search#resolved=false"]'); + test.assertExists('tr:nth-child(2) a[href="/issues/search#resolved=false|reporters=first.user"]'); + test.assertExists('tr:nth-child(3) a[href="/issues/search#resolved=false|reporters=second.user"]'); + test.assertExists('tr:nth-child(4) a[href="/issues/search#resolved=false|reporters=third.user"]'); + + // check labels + test.assertSelectorContains('tr:nth-child(2)', 'First User'); + test.assertSelectorContains('tr:nth-child(3)', 'Second User'); + test.assertSelectorContains('tr:nth-child(4)', 'Third User'); + }) + + .then(function () { + lib.sendCoverage(); + }) + + .run(function () { + test.done(); + }); +}); + + casper.test.begin(testName('Unresolved Issues By Language'), 15, function (test) { casper .start(lib.buildUrl('issue-filter-widget'), function () { @@ -759,28 +819,28 @@ casper.test.begin(testName('Unresolved Issues By Date'), 18, function (test) { // check order and values test.assertSelectorContains('tr:nth-child(1)', '6851'); - test.assertSelectorContains('tr:nth-child(2)', '72'); - test.assertSelectorContains('tr:nth-child(3)', '64'); + test.assertSelectorContains('tr:nth-child(2)', '1724'); + test.assertSelectorContains('tr:nth-child(3)', '3729'); test.assertSelectorContains('tr:nth-child(4)', '1262'); - test.assertSelectorContains('tr:nth-child(5)', '3729'); - test.assertSelectorContains('tr:nth-child(6)', '1724'); + test.assertSelectorContains('tr:nth-child(5)', '64'); + test.assertSelectorContains('tr:nth-child(6)', '72'); // check links test.assertExists('tr:nth-child(1) a[href="/issues/search#resolved=false"]'); - test.assertExists('tr:nth-child(2) a[href="/issues/search#resolved=false|createdAfter=2011-01-01|createdBefore=2011-12-31"]'); - test.assertExists('tr:nth-child(3) a[href="/issues/search#resolved=false|createdAfter=2012-01-01|createdBefore=2012-12-31"]'); - test.assertExists('tr:nth-child(4) a[href="/issues/search#resolved=false|createdAfter=2013-01-01|createdBefore=2013-12-31"]'); - test.assertExists('tr:nth-child(5) a[href="/issues/search#resolved=false|createdAfter=2014-01-01|createdBefore=2014-12-31"]'); // do not check createdBefore value, because it is set dynamically to *now* - test.assertExists('tr:nth-child(6) a[href^="/issues/search#resolved=false|createdAfter=2015-01-01|createdBefore="]'); + test.assertExists('tr:nth-child(2) a[href^="/issues/search#resolved=false|createdAfter=2015-01-01|createdBefore="]'); + test.assertExists('tr:nth-child(3) a[href="/issues/search#resolved=false|createdAfter=2014-01-01|createdBefore=2014-12-31"]'); + test.assertExists('tr:nth-child(4) a[href="/issues/search#resolved=false|createdAfter=2013-01-01|createdBefore=2013-12-31"]'); + test.assertExists('tr:nth-child(5) a[href="/issues/search#resolved=false|createdAfter=2012-01-01|createdBefore=2012-12-31"]'); + test.assertExists('tr:nth-child(6) a[href="/issues/search#resolved=false|createdAfter=2011-01-01|createdBefore=2011-12-31"]'); // check labels - test.assertSelectorContains('tr:nth-child(2)', 'January 1 2011 – December 31 2011'); - test.assertSelectorContains('tr:nth-child(3)', 'January 1 2012 – December 31 2012'); - test.assertSelectorContains('tr:nth-child(4)', 'January 1 2013 – December 31 2013'); - test.assertSelectorContains('tr:nth-child(5)', 'January 1 2014 – December 31 2014'); // do not check label fully, because it is set dynamically using *now* - test.assertSelectorContains('tr:nth-child(6)', 'January 1 2015 – '); + test.assertSelectorContains('tr:nth-child(2)', 'January 1 2015 – '); + test.assertSelectorContains('tr:nth-child(3)', 'January 1 2014 – December 31 2014'); + test.assertSelectorContains('tr:nth-child(4)', 'January 1 2013 – December 31 2013'); + test.assertSelectorContains('tr:nth-child(5)', 'January 1 2012 – December 31 2012'); + test.assertSelectorContains('tr:nth-child(6)', 'January 1 2011 – December 31 2011'); }) .then(function () { @@ -827,20 +887,20 @@ casper.test.begin(testName('Unresolved Issues on a Limited Period By Date'), 12, // check order and values test.assertSelectorContains('tr:nth-child(1)', '6851'); - test.assertSelectorContains('tr:nth-child(2)', '49'); + test.assertSelectorContains('tr:nth-child(2)', '47'); test.assertSelectorContains('tr:nth-child(3)', '48'); - test.assertSelectorContains('tr:nth-child(4)', '47'); + test.assertSelectorContains('tr:nth-child(4)', '49'); // check links test.assertExists('tr:nth-child(1) a[href="/issues/search#resolved=false|createdAfter=2015-02-16|createdBefore=2015-02-18"]'); - test.assertExists('tr:nth-child(2) a[href="/issues/search#resolved=false|createdAfter=2015-02-16|createdBefore=2015-02-17"]'); + test.assertExists('tr:nth-child(2) a[href="/issues/search#resolved=false|createdAfter=2015-02-18|createdBefore=2015-02-19"]'); test.assertExists('tr:nth-child(3) a[href="/issues/search#resolved=false|createdAfter=2015-02-17|createdBefore=2015-02-18"]'); - test.assertExists('tr:nth-child(4) a[href="/issues/search#resolved=false|createdAfter=2015-02-18|createdBefore=2015-02-19"]'); + test.assertExists('tr:nth-child(4) a[href="/issues/search#resolved=false|createdAfter=2015-02-16|createdBefore=2015-02-17"]'); // check labels - test.assertSelectorContains('tr:nth-child(2)', 'February 16 2015'); + test.assertSelectorContains('tr:nth-child(2)', 'February 18 2015'); test.assertSelectorContains('tr:nth-child(3)', 'February 17 2015'); - test.assertSelectorContains('tr:nth-child(4)', 'February 18 2015'); + test.assertSelectorContains('tr:nth-child(4)', 'February 16 2015'); }) .then(function () { diff --git a/server/sonar-web/src/test/js/project-issue-filter-widget.js b/server/sonar-web/src/test/js/project-issue-filter-widget.js index 25e69cdeff8..961c79a987c 100644 --- a/server/sonar-web/src/test/js/project-issue-filter-widget.js +++ b/server/sonar-web/src/test/js/project-issue-filter-widget.js @@ -125,28 +125,28 @@ casper.test.begin(testName('Unresolved Issues By Date'), 18, function (test) { // check order and values test.assertSelectorContains('tr:nth-child(1)', '6851'); - test.assertSelectorContains('tr:nth-child(2)', '72'); - test.assertSelectorContains('tr:nth-child(3)', '64'); + test.assertSelectorContains('tr:nth-child(2)', '1724'); + test.assertSelectorContains('tr:nth-child(3)', '3729'); test.assertSelectorContains('tr:nth-child(4)', '1262'); - test.assertSelectorContains('tr:nth-child(5)', '3729'); - test.assertSelectorContains('tr:nth-child(6)', '1724'); + test.assertSelectorContains('tr:nth-child(5)', '64'); + test.assertSelectorContains('tr:nth-child(6)', '72'); // check links test.assertExists('tr:nth-child(1) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false"]'); - test.assertExists('tr:nth-child(2) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2011-01-01|createdBefore=2011-12-31"]'); - test.assertExists('tr:nth-child(3) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2012-01-01|createdBefore=2012-12-31"]'); - test.assertExists('tr:nth-child(4) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2013-01-01|createdBefore=2013-12-31"]'); - test.assertExists('tr:nth-child(5) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2014-01-01|createdBefore=2014-12-31"]'); // do not check createdBefore value, because it is set dynamically to *now* - test.assertExists('tr:nth-child(6) a[href^="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2015-01-01|createdBefore="]'); + test.assertExists('tr:nth-child(2) a[href^="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2015-01-01|createdBefore="]'); + test.assertExists('tr:nth-child(3) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2014-01-01|createdBefore=2014-12-31"]'); + test.assertExists('tr:nth-child(4) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2013-01-01|createdBefore=2013-12-31"]'); + test.assertExists('tr:nth-child(5) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2012-01-01|createdBefore=2012-12-31"]'); + test.assertExists('tr:nth-child(6) a[href="/component_issues/index?id=org.codehaus.sonar%3Asonar#resolved=false|createdAfter=2011-01-01|createdBefore=2011-12-31"]'); // check labels - test.assertSelectorContains('tr:nth-child(2)', 'January 1 2011 – December 31 2011'); - test.assertSelectorContains('tr:nth-child(3)', 'January 1 2012 – December 31 2012'); - test.assertSelectorContains('tr:nth-child(4)', 'January 1 2013 – December 31 2013'); - test.assertSelectorContains('tr:nth-child(5)', 'January 1 2014 – December 31 2014'); // do not check label fully, because it is set dynamically using *now* - test.assertSelectorContains('tr:nth-child(6)', 'January 1 2015 – '); + test.assertSelectorContains('tr:nth-child(2)', 'January 1 2015 – '); + test.assertSelectorContains('tr:nth-child(3)', 'January 1 2014 – December 31 2014'); + test.assertSelectorContains('tr:nth-child(4)', 'January 1 2013 – December 31 2013'); + test.assertSelectorContains('tr:nth-child(5)', 'January 1 2012 – December 31 2012'); + test.assertSelectorContains('tr:nth-child(6)', 'January 1 2011 – December 31 2011'); }) .then(function () { diff --git a/server/sonar-web/src/test/json/global-issues-filter-widget/unresolved-issues-by-reporter.json b/server/sonar-web/src/test/json/global-issues-filter-widget/unresolved-issues-by-reporter.json new file mode 100644 index 00000000000..1a245077c5b --- /dev/null +++ b/server/sonar-web/src/test/json/global-issues-filter-widget/unresolved-issues-by-reporter.json @@ -0,0 +1,44 @@ +{ + "total": 6851, + "p": 1, + "ps": 1, + "users": [ + { + "login": "second.user", + "name": "Second User", + "active": true, + "email": "second.user@example.com" + }, + { + "login": "third.user", + "name": "Third User", + "active": true, + "email": "third.user@example.com" + }, + { + "login": "first.user", + "name": "First User", + "active": true, + "email": "first.user@example.com" + } + ], + "facets": [ + { + "property": "reporters", + "values": [ + { + "val": "first.user", + "count": 698 + }, + { + "val": "second.user", + "count": 504 + }, + { + "val": "third.user", + "count": 426 + } + ] + } + ] +} diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index d979e3fc24e..ed6d84bc7bd 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -88,6 +88,7 @@ load_verb=Load login=Login major=Major max=Max +max_items_reached=Only the first {0} components are displayed me=Me min=Min minor=Minor @@ -1340,7 +1341,7 @@ widget.issue_filter.insufficient_privileges_warning=Widget cannot be displayed: widget.issue_filter.property.distributionAxis.option.severities.name=By Severity widget.issue_filter.property.distributionAxis.option.projectUuids.name=By Project widget.issue_filter.property.distributionAxis.option.statuses.name=By Status -widget.issue_filter.property.distributionAxis.option.createdAt.name=New Issues +widget.issue_filter.property.distributionAxis.option.createdAt.name=By Creation Date widget.issue_filter.property.distributionAxis.option.actionPlans.name=By Action Plan widget.issue_filter.property.distributionAxis.option.assignees.name=By Assignee widget.issue_filter.property.distributionAxis.option.tags.name=By Tag -- 2.39.5