From 008a6d3ea04cacebbc2e7b5efdfddcfa024eb48e Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Wed, 24 Dec 2014 16:42:46 +0100 Subject: [PATCH] SONAR-5820 Add query filter --- .../facets/coding-rules-query-facet.hbs | 3 + .../src/main/js/coding-rules/controller.js | 2 +- .../src/main/js/coding-rules/facets-view.js | 4 + .../js/coding-rules/facets/query-facet.js | 40 ++ .../tests/coding-rules-page-query-facet.js | 47 +++ .../coding-rules-page-query-facet/app.json | 168 ++++++++ .../search-query.json | 371 ++++++++++++++++++ .../coding-rules-page-query-facet/search.json | 371 ++++++++++++++++++ .../coding-rules-page-should-show-facets.js | 2 +- .../less/components/search-navigator.less | 8 + 10 files changed, 1014 insertions(+), 2 deletions(-) create mode 100644 server/sonar-web/src/main/hbs/coding-rules/facets/coding-rules-query-facet.hbs create mode 100644 server/sonar-web/src/main/js/coding-rules/facets/query-facet.js create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet.js create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/app.json create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/search-query.json create mode 100644 server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/search.json diff --git a/server/sonar-web/src/main/hbs/coding-rules/facets/coding-rules-query-facet.hbs b/server/sonar-web/src/main/hbs/coding-rules/facets/coding-rules-query-facet.hbs new file mode 100644 index 00000000000..7f30a435cb7 --- /dev/null +++ b/server/sonar-web/src/main/hbs/coding-rules/facets/coding-rules-query-facet.hbs @@ -0,0 +1,3 @@ +
+ +
diff --git a/server/sonar-web/src/main/js/coding-rules/controller.js b/server/sonar-web/src/main/js/coding-rules/controller.js index 1404f0bf1cb..c731ee16c43 100644 --- a/server/sonar-web/src/main/js/coding-rules/controller.js +++ b/server/sonar-web/src/main/js/coding-rules/controller.js @@ -6,7 +6,7 @@ define([ var $ = jQuery; return Controller.extend({ - allFacets: ['languages', 'repositories', 'tags', 'qprofile', 'debt_characteristics', 'severities', 'statuses', + allFacets: ['q', 'languages', 'repositories', 'tags', 'qprofile', 'debt_characteristics', 'severities', 'statuses', 'available_since', 'inheritance', 'active_severities'], facetsFromServer: ['languages', 'repositories', 'tags'], pageSize: 200, diff --git a/server/sonar-web/src/main/js/coding-rules/facets-view.js b/server/sonar-web/src/main/js/coding-rules/facets-view.js index 2172fd24f33..ac85233ba5a 100644 --- a/server/sonar-web/src/main/js/coding-rules/facets-view.js +++ b/server/sonar-web/src/main/js/coding-rules/facets-view.js @@ -1,6 +1,7 @@ define([ 'components/navigator/facets-view', 'coding-rules/facets/base-facet', + 'coding-rules/facets/query-facet', 'coding-rules/facets/language-facet', 'coding-rules/facets/repository-facet', 'coding-rules/facets/quality-profile-facet', @@ -13,6 +14,7 @@ define([ ], function (FacetsView, BaseFacet, + QueryFacet, LanguageFacet, RepositoryFacet, QualityProfileFacet, @@ -27,6 +29,8 @@ define([ getItemView: function (model) { switch (model.get('property')) { + case 'q': + return QueryFacet; case 'languages': return LanguageFacet; case 'repositories': diff --git a/server/sonar-web/src/main/js/coding-rules/facets/query-facet.js b/server/sonar-web/src/main/js/coding-rules/facets/query-facet.js new file mode 100644 index 00000000000..b11f74aa8d7 --- /dev/null +++ b/server/sonar-web/src/main/js/coding-rules/facets/query-facet.js @@ -0,0 +1,40 @@ +define([ + 'coding-rules/facets/base-facet', + 'templates/coding-rules' +], function (BaseFacet, Templates) { + + return BaseFacet.extend({ + template: Templates['coding-rules-query-facet'], + + initialize: function () { + this.applyFacetDebounced = _.debounce(this.applyFacet, 1000); + }, + + events: function () { + return _.extend(BaseFacet.prototype.events.apply(this, arguments), { + 'change input': 'applyFacet', + 'keyup input': 'applyFacetDebounced' + }); + }, + + onRender: function () { + this.$el.attr('data-property', this.model.get('property')); + var value = this.options.app.state.get('query').q; + if (value != null) { + this.$('input').val(value); + } + var that = this; + setTimeout(function () { + that.$('input').focus(); + }, 100); + }, + + applyFacet: function() { + var obj = {}, + property = this.model.get('property'); + obj[property] = this.$('input').val(); + this.options.app.state.updateFilter(obj); + } + }); + +}); diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet.js b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet.js new file mode 100644 index 00000000000..a412d423382 --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet.js @@ -0,0 +1,47 @@ +/* global casper:false */ + +var lib = require('../lib'); + +lib.initMessages(); +lib.changeWorkingDirectory('coding-rules-page-query-facet'); + + +casper.test.begin('coding-rules-page-query-facet', 3, function (test) { + casper + .start(lib.buildUrl('coding-rules'), function () { + lib.setDefaultViewport(); + + lib.mockRequest('/api/l10n/index', '{}'); + lib.mockRequestFromFile('/api/rules/app', 'app.json'); + lib.mockRequestFromFile('/api/rules/search', 'search-query.json', { data: { q: 'query' } }); + lib.mockRequestFromFile('/api/rules/search', 'search.json'); + }) + + .then(function () { + casper.waitForSelector('.coding-rule'); + }) + + .then(function () { + test.assertSelectorContains('#coding-rules-total', '609'); + casper.evaluate(function () { + jQuery('[data-property="q"] input').val('query').change(); + }); + casper.waitForSelectorTextChange('#coding-rules-total'); + }) + + .then(function () { + test.assertSelectorContains('#coding-rules-total', '4'); + casper.evaluate(function () { + jQuery('[data-property="q"] input').val('').change(); + }); + casper.waitForSelectorTextChange('#coding-rules-total'); + }) + + .then(function () { + test.assertSelectorContains('#coding-rules-total', '609'); + }) + + .run(function () { + test.done(); + }); +}); diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/app.json b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/app.json new file mode 100644 index 00000000000..4f3319c8707 --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/app.json @@ -0,0 +1,168 @@ +{ + "canWrite": false, + "qualityprofiles": [ + { + "key": "java-default-with-mojo-conventions-49307", + "name": "Default - Maven Conventions", + "lang": "java", + "parentKey": "java-top-profile-without-formatting-conventions-50037" + }, + { + "key": "java-default-with-sonarsource-conventions-27339", + "name": "Default - SonarSource conventions", + "lang": "java", + "parentKey": "java-top-profile-without-formatting-conventions-50037" + }, + { + "key": "java-top-profile-without-formatting-conventions-50037", + "name": "Default - Top", + "lang": "java" + }, + { + "key": "java-findbugs-14954", + "name": "FindBugs", + "lang": "java" + }, + { + "key": "java-for-sq-java-plugin-only-92289", + "name": "For SQ Java Plugin Only", + "lang": "java", + "parentKey": "java-default-with-sonarsource-conventions-27339" + }, + { + "key": "java-for-sq-only-95381", + "name": "For SQ Only", + "lang": "java", + "parentKey": "java-default-with-sonarsource-conventions-27339" + }, + { + "key": "php-psr-2-06315", + "name": "PSR-2", + "lang": "php" + }, + { + "key": "java-sonar-way-80423", + "name": "Sonar way", + "lang": "java" + }, + { + "key": "js-sonar-way", + "name": "Sonar way", + "lang": "js" + }, + { + "key": "php-sonar-way-05548", + "name": "Sonar way", + "lang": "php" + }, + { + "key": "py-sonar-way-80265", + "name": "Sonar way", + "lang": "py" + }, + { + "key": "java-without-findbugs", + "name": "Without Findbugs", + "lang": "java" + } + ], + "languages": { + "py": "Python", + "js": "JavaScript", + "php": "PHP", + "java": "Java" + }, + "repositories": [ + { + "key": "common-java", + "name": "Common SonarQube", + "language": "java" + }, + { + "key": "common-js", + "name": "Common SonarQube", + "language": "js" + }, + { + "key": "common-php", + "name": "Common SonarQube", + "language": "php" + }, + { + "key": "common-py", + "name": "Common SonarQube", + "language": "py" + }, + { + "key": "Pylint", + "name": "Pylint", + "language": "py" + }, + { + "key": "javascript", + "name": "SonarQube", + "language": "js" + }, + { + "key": "php", + "name": "SonarQube", + "language": "php" + }, + { + "key": "python", + "name": "SonarQube", + "language": "py" + }, + { + "key": "squid", + "name": "SonarQube", + "language": "java" + } + ], + "statuses": { + "BETA": "Beta", + "DEPRECATED": "Deprecated", + "READY": "Ready" + }, + "characteristics": { + "UNDERSTANDABILITY": "Maintainability: Understandability", + "MAINTAINABILITY": "Maintainability", + "TIME_ZONE_RELATED_PORTABILITY": "Portability: Time zone related portability", + "READABILITY": "Maintainability: Readability", + "SECURITY_FEATURES": "Security: Security features", + "ARCHITECTURE_RELIABILITY": "Reliability: Architecture related reliability", + "OS_RELATED_PORTABILITY": "Portability: OS related portability", + "EXCEPTION_HANDLING": "Reliability: Exception handling", + "LOGIC_CHANGEABILITY": "Changeability: Logic related changeability", + "SOFTWARE_RELATED_PORTABILITY": "Portability: Software related portability", + "INPUT_VALIDATION_AND_REPRESENTATION": "Security: Input validation and representation", + "LANGUAGE_RELATED_PORTABILITY": "Portability: Language related portability", + "ERRORS": "Security: Errors", + "SECURITY": "Security", + "RELIABILITY": "Reliability", + "PORTABILITY": "Portability", + "HARDWARE_RELATED_PORTABILITY": "Portability: Hardware related portability", + "SYNCHRONIZATION_RELIABILITY": "Reliability: Synchronization related reliability", + "TRANSPORTABILITY": "Reusability: Transportability", + "COMPILER_RELATED_PORTABILITY": "Portability: Compiler related portability", + "RESOURCE_RELIABILITY": "Reliability: Resource", + "CPU_EFFICIENCY": "Efficiency: Processor use", + "EFFICIENCY": "Efficiency", + "CHANGEABILITY": "Changeability", + "DATA_CHANGEABILITY": "Changeability: Data related changeability", + "API_ABUSE": "Security: API abuse", + "ARCHITECTURE_CHANGEABILITY": "Changeability: Architecture related changeability", + "UNIT_TESTS": "Reliability: Unit tests", + "INSTRUCTION_RELIABILITY": "Reliability: Instruction related reliability", + "REUSABILITY": "Reusability", + "MODULARITY": "Reusability: Modularity", + "UNIT_TESTABILITY": "Testability: Unit level testability", + "TESTABILITY": "Testability", + "INTEGRATION_TESTABILITY": "Testability: Integration level testability", + "NETWORK_USE": "Efficiency: Network use", + "MEMORY_EFFICIENCY": "Efficiency: Memory use", + "DATA_RELIABILITY": "Reliability: Data related reliability", + "FAULT_TOLERANCE": "Reliability: Fault tolerance", + "LOGIC_RELIABILITY": "Reliability: Logic related reliability" + } +} diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/search-query.json b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/search-query.json new file mode 100644 index 00000000000..3dc49f0bca3 --- /dev/null +++ b/server/sonar-web/src/main/js/tests/e2e/tests/coding-rules-page-query-facet/search-query.json @@ -0,0 +1,371 @@ +{ + "total": 4, + "p": 1, + "ps": 25, + "rules": [ + { + "key": "squid:S2077", + "name": "Values passed to SQL commands should be sanitized", + "lang": "java", + "langName": "Java", + "sysTags": [ + "cwe", + "owasp-top10", + "security", + "sql" + ], + "tags": [ + "custom-tag" + ] + }, + { + "key": "php:S107", + "name": "Functions should not have too many parameters", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "brain-overload" + ], + "tags": [] + }, + { + "key": "php:S1192", + "name": "String literals should not be duplicated", + "lang": "php", + "langName": "PHP", + "sysTags": [], + "tags": [] + }, + { + "key": "php:S1145", + "name": "\"if\" statement conditions should not always evaluate to \"true\" or to \"false\"", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "bug", + "cwe", + "security" + ], + "tags": [] + }, + { + "key": "php:S108", + "name": "Nested blocks of code should not be left empty", + "lang": "php", + "langName": "PHP", + "sysTags": [], + "tags": [] + }, + { + "key": "php:S1301", + "name": "\"switch\" statements should have at least 3 \"case\" clauses", + "lang": "php", + "langName": "PHP", + "sysTags": [], + "tags": [] + }, + { + "key": "php:S103", + "name": "Lines should not be too long", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "convention" + ], + "tags": [] + }, + { + "key": "php:S1144", + "name": "Unused private method should be removed", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "unused" + ], + "tags": [] + }, + { + "key": "php:S105", + "name": "Tabulation characters should not be used", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "convention", + "psr2" + ], + "tags": [] + }, + { + "key": "php:S1481", + "name": "Unused local variables should be removed", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "unused" + ], + "tags": [] + }, + { + "key": "php:S1142", + "name": "Functions should not contain too many return statements", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "brain-overload" + ], + "tags": [] + }, + { + "key": "php:S104", + "name": "Files should not have too many lines", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "brain-overload" + ], + "tags": [] + }, + { + "key": "php:S1605", + "name": "PHP 4 style calls to parent constructors should not be used in PHP5 \"__construct\" functions", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "convention" + ], + "tags": [] + }, + { + "key": "php:S1448", + "name": "Classes should not have too many methods", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "brain-overload" + ], + "tags": [] + }, + { + "key": "php:S1603", + "name": "PHP 4 constructor declarations should not be used", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "pitfail" + ], + "tags": [] + }, + { + "key": "php:S1779", + "name": "Only LF character (Unix-like) should be used to end lines", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "convention", + "psr2" + ], + "tags": [] + }, + { + "key": "php:S1185", + "name": "Overriding methods should do more than simply call the same method in the super class", + "lang": "php", + "langName": "PHP", + "sysTags": [], + "tags": [] + }, + { + "key": "php:S1600", + "name": "Deprecated predefined variables should not be used", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "pitfail" + ], + "tags": [] + }, + { + "key": "php:S1109", + "name": "A close curly brace should be located at the beginning of a line", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "convention" + ], + "tags": [] + }, + { + "key": "php:S2001", + "name": "Functions deprecated in PHP 5 should not be used", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "obsolete" + ], + "tags": [] + }, + { + "key": "php:S2002", + "name": "Errors should not be silenced", + "lang": "php", + "langName": "PHP", + "sysTags": [ + "pitfail" + ], + "tags": [] + }, + { + "key": "php:S2000", + "name": "Files should not contain characters before \"