]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8300 display cumulative facets
authorStas Vilchik <vilchiks@gmail.com>
Thu, 3 Nov 2016 14:18:49 +0000 (15:18 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 4 Nov 2016 08:08:46 +0000 (09:08 +0100)
server/sonar-web/src/main/js/apps/projects/filters/CoverageFilter.js
server/sonar-web/src/main/js/apps/projects/filters/IssuesFilter.js
server/sonar-web/src/main/js/apps/projects/store/facets/reducer.js
server/sonar-web/src/main/js/apps/projects/store/utils.js
server/sonar-web/src/main/js/helpers/ratings.js

index 5ac1adec4c397931e0aef9265c15f45528ba4601..0a9f3434166e8adba59ee3a869c77277e2b8470f 100644 (file)
@@ -35,7 +35,7 @@ export default class CoverageFilter extends React.Component {
   };
 
   getFacetValueForOption = (facet, option) => {
-    const map = ['*-30.0', '30.0-50.0', '50.0-70.0', '70.0-80.0', '80.0-*'];
+    const map = ['80.0-*', '70.0-80.0', '50.0-70.0', '30.0-50.0', '*-30.0'];
     return facet[map[option - 1]];
   };
 
@@ -43,7 +43,7 @@ export default class CoverageFilter extends React.Component {
     return (
         <FilterContainer
             property="coverage"
-            options={[5, 4, 3, 2, 1]}
+            options={[1, 2, 3, 4, 5]}
             renderName={() => 'Coverage'}
             renderOption={this.renderOption}
             getFacetValueForOption={this.getFacetValueForOption}
index c24f6654b539f874a7a220654a009932ab745374..c955ae24906c9d1114e3607b66062d612c43ec70 100644 (file)
@@ -26,6 +26,9 @@ export default class IssuesFilter extends React.Component {
     return (
         <span>
           <Rating value={option} small={true}/>
+          {option > 1 && option < 5 && (
+              <span className="note spacer-left">and worse</span>
+          )}
         </span>
     );
   };
index 4da4c0e9fd3c2594203d4442ecdadae8113e5154..802e8d36eddd66acc509e8b04d6b225ceae24eba 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import flatMap from 'lodash/flatMap';
+import sumBy from 'lodash/sumBy';
 import { createMap } from '../../../../components/store/generalReducers';
 import { RECEIVE_PROJECTS } from '../projects/actions';
 import { mapMetricToProperty } from '../utils';
 
+const CUMULATIVE_FACETS = [
+  'reliability',
+  'security',
+  'maintainability',
+  'coverage',
+  'duplications',
+  'size'
+];
+
+const REVERSED_FACETS = [
+  'coverage'
+];
+
 const mapFacetValues = values => {
   const map = {};
   values.forEach(value => {
@@ -30,11 +44,27 @@ const mapFacetValues = values => {
   return map;
 };
 
+const cumulativeMapFacetValues = values => {
+  const map = {};
+  let sum = sumBy(values, value => value.count);
+  values.forEach((value, index) => {
+    map[value.val] = index > 0 && index < values.length - 1 ? sum : value.count;
+    sum -= value.count;
+  });
+  return map;
+};
+
 const getFacetsMap = facets => {
   const map = {};
   facets.forEach(facet => {
     const property = mapMetricToProperty(facet.property);
-    map[property] = mapFacetValues(facet.values);
+    const { values } = facet;
+    if (REVERSED_FACETS.includes(property)) {
+      values.reverse();
+    }
+    map[property] = CUMULATIVE_FACETS.includes(property) ?
+        cumulativeMapFacetValues(values) :
+        mapFacetValues(values);
   });
   return map;
 };
index ac937893b183e84f994a6f34f6333632c44bcee0..d2422b8ee85041a3b69c5cd9f7c6c7f3a4de4529 100644 (file)
@@ -42,18 +42,26 @@ export const parseUrlQuery = urlQuery => ({
   'size': getAsNumericRating(urlQuery['size']),
 });
 
+const convertIssuesRating = (metric, rating) => {
+  if (rating > 1 && rating < 5) {
+    return `${metric} >= ${rating}`;
+  } else {
+    return `${metric} = ${rating}`;
+  }
+};
+
 const convertCoverage = coverage => {
   switch (coverage) {
     case 1:
-      return 'coverage < 30';
+      return 'coverage >= 80';
     case 2:
-      return 'coverage >= 30 and coverage < 50';
+      return 'coverage < 80';
     case 3:
-      return 'coverage >= 50 and coverage < 70';
+      return 'coverage < 70';
     case 4:
-      return 'coverage >= 70 and coverage < 80';
+      return 'coverage < 50';
     case 5:
-      return 'coverage >= 80';
+      return 'coverage < 30';
     default:
       return '';
   }
@@ -64,11 +72,11 @@ const convertDuplications = duplications => {
     case 1:
       return 'duplicated_lines_density < 3';
     case 2:
-      return 'duplicated_lines_density >= 3 and duplicated_lines_density < 5';
+      return 'duplicated_lines_density >= 3';
     case 3:
-      return 'duplicated_lines_density >= 5 and duplicated_lines_density < 10';
+      return 'duplicated_lines_density >= 5';
     case 4:
-      return 'duplicated_lines_density >= 10 duplicated_lines_density < 20';
+      return 'duplicated_lines_density >= 10';
     case 5:
       return 'duplicated_lines_density >= 20';
     default:
@@ -81,11 +89,11 @@ const convertSize = size => {
     case 1:
       return 'ncloc < 1000';
     case 2:
-      return 'ncloc >= 1000 and ncloc < 10000';
+      return 'ncloc >= 1000';
     case 3:
-      return 'ncloc >= 10000 and ncloc < 100000';
+      return 'ncloc >= 10000';
     case 4:
-      return 'ncloc >= 100000 ncloc < 500000';
+      return 'ncloc >= 100000';
     case 5:
       return 'ncloc >= 500000';
     default:
@@ -113,15 +121,15 @@ export const convertToFilter = query => {
   }
 
   if (query['reliability'] != null) {
-    conditions.push('reliability_rating = ' + query['reliability']);
+    conditions.push(convertIssuesRating('reliability_rating', query['reliability']));
   }
 
   if (query['security'] != null) {
-    conditions.push('security_rating = ' + query['security']);
+    conditions.push(convertIssuesRating('security_rating', query['security']));
   }
 
   if (query['maintainability'] != null) {
-    conditions.push('sqale_rating = ' + query['maintainability']);
+    conditions.push(convertIssuesRating('sqale_rating', query['maintainability']));
   }
 
   return conditions.join(' and ');
index 1d8347316d88acb872e400a9e720ed90ee5dd03b..3c6d110676e978c6f7f87f89215e1847f8e90776 100644 (file)
@@ -26,20 +26,20 @@ const checkNumberRating = coverageRating => {
 export const getCoverageRatingLabel = rating => {
   checkNumberRating(rating);
 
-  const mapping = ['< 30%', '30–50%', '50–70%', '70–80%', '> 80%'];
+  const mapping = ['> 80%', '< 80%', '< 70%', '< 50%', '< 30%'];
   return mapping[rating - 1];
 };
 
 export const getCoverageRatingAverageValue = rating => {
   checkNumberRating(rating);
-  const mapping = [15, 40, 60, 75, 90];
+  const mapping = [90, 75, 60, 40, 15];
   return mapping[rating - 1];
 };
 
 export const getDuplicationsRatingLabel = rating => {
   checkNumberRating(rating);
 
-  const mapping = ['< 3%', '3–5%', '5–10%', '10–20%', '> 20%'];
+  const mapping = ['< 3%', '> 3%', '> 5%', '> 10%', '> 20%'];
   return mapping[rating - 1];
 };
 
@@ -52,7 +52,7 @@ export const getDuplicationsRatingAverageValue = rating => {
 export const getSizeRatingLabel = rating => {
   checkNumberRating(rating);
 
-  const mapping = ['< 1k', '1k–10k', '10k–100k', '100k–500k', '> 500k'];
+  const mapping = ['< 1k', '> 1k', '> 10k', '> 100k', '> 500k'];
   return mapping[rating - 1];
 };