From: Grégoire Aubert Date: Fri, 11 Aug 2017 14:05:21 +0000 (+0200) Subject: SONAR-9806 Add the quality gate metric back for Views and Subviews X-Git-Tag: 6.6-RC1~612 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b061ff846dbab20e26e348b9e940de671d5296de;p=sonarqube.git SONAR-9806 Add the quality gate metric back for Views and Subviews --- diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js b/server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js index bcf1739c38c..38672597858 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js +++ b/server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js @@ -43,7 +43,10 @@ const mapStateToProps = (state, ownProps) => ({ }); const banQualityGate = (component: Component): Array => { - const bannedMetrics = ['alert_status']; + const bannedMetrics = []; + if (!['VW', 'SVW'].includes(component.qualifier)) { + bannedMetrics.push('alert_status'); + } if (component.qualifier === 'APP') { bannedMetrics.push('releasability_rating', 'releasability_effort'); } diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js index 0a403474482..3b5552955bb 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js +++ b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js @@ -196,7 +196,7 @@ export default class MeasureContent extends React.PureComponent { const component = this.state.components.find( component => component.refKey === componentKey || component.key === componentKey ); - if (component && component.qualifier === 'TRK') { + if (component && component.refKey != null) { if (this.props.view === 'treemap') { this.props.router.push(getProjectUrl(componentKey)); } @@ -315,7 +315,8 @@ export default class MeasureContent extends React.PureComponent { - {metric == null && } + {metric == null && + } {metric != null && measure != null &&
diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js index ec33171709a..e17f12a8589 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js +++ b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js @@ -23,7 +23,7 @@ import Select from 'react-select'; import ListIcon from '../../../components/icons-components/ListIcon'; import TreeIcon from '../../../components/icons-components/TreeIcon'; import TreemapIcon from '../../../components/icons-components/TreemapIcon'; -import { hasTreemap } from '../utils'; +import { hasList, hasTree, hasTreemap } from '../utils'; import { translate } from '../../../helpers/l10n'; import type { Metric } from '../../../store/metrics/actions'; @@ -40,27 +40,31 @@ export default class MeasureViewSelect extends React.PureComponent { getOptions = () => { const { metric } = this.props; const options = []; - options.push({ - value: 'list', - label: ( -
- - {translate('component_measures.tab.list')} -
- ), - icon: - }); - options.push({ - value: 'tree', - label: ( -
- - {translate('component_measures.tab.tree')} -
- ), - icon: - }); - if (hasTreemap(metric.type)) { + if (hasList(metric.key)) { + options.push({ + value: 'list', + label: ( +
+ + {translate('component_measures.tab.list')} +
+ ), + icon: + }); + } + if (hasTree(metric.key)) { + options.push({ + value: 'tree', + label: ( +
+ + {translate('component_measures.tab.tree')} +
+ ), + icon: + }); + } + if (hasTreemap(metric.key, metric.type)) { options.push({ value: 'treemap', label: ( diff --git a/server/sonar-web/src/main/js/apps/component-measures/config/domains.js b/server/sonar-web/src/main/js/apps/component-measures/config/domains.js index 9f10d6f7b28..274f09a5e86 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/config/domains.js +++ b/server/sonar-web/src/main/js/apps/component-measures/config/domains.js @@ -116,7 +116,7 @@ export const domains = { }, Releasability: { - order: ['alert_status'] + order: ['releasability_rating', 'releasability_effort', 'alert_status'] }, Issues: { diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js index 0efc611f94e..7bdea166fd9 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.js @@ -27,7 +27,7 @@ import FacetItemsList from '../../../components/facet/FacetItemsList'; import FacetMeasureValue from './FacetMeasureValue'; import IssueTypeIcon from '../../../components/ui/IssueTypeIcon'; import Tooltip from '../../../components/controls/Tooltip'; -import { filterMeasures, hasBubbleChart, sortMeasures } from '../utils'; +import { filterMeasures, hasBubbleChart, hasFacetStat, sortMeasures } from '../utils'; import { getLocalizedMetricDomain, getLocalizedMetricName, @@ -119,7 +119,9 @@ export default class DomainFacet extends React.PureComponent { } onClick={this.props.onChange} - stat={} + stat={ + hasFacetStat(measure.metric.key) ? : null + } value={measure.metric.key} /> )} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/Sidebar.js b/server/sonar-web/src/main/js/apps/component-measures/sidebar/Sidebar.js index f74f751656d..465439125af 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/Sidebar.js +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/Sidebar.js @@ -21,7 +21,7 @@ import React from 'react'; import ProjectOverviewFacet from './ProjectOverviewFacet'; import DomainFacet from './DomainFacet'; -import { groupByDomains, KNOWN_DOMAINS, PROJECT_OVERVEW } from '../utils'; +import { getDefaultView, groupByDomains, KNOWN_DOMAINS, PROJECT_OVERVEW } from '../utils'; import type { MeasureEnhanced } from '../../../components/measure/types'; import type { Query } from '../types'; @@ -67,9 +67,10 @@ export default class Sidebar extends React.PureComponent { })); }; - resetSelection = () => ({ selected: null, view: 'list' }); + resetSelection = (metric: string) => ({ selected: null, view: getDefaultView(metric) }); - changeMetric = (metric: string) => this.props.updateQuery({ metric, ...this.resetSelection() }); + changeMetric = (metric: string) => + this.props.updateQuery({ metric, ...this.resetSelection(metric) }); render() { return ( diff --git a/server/sonar-web/src/main/js/apps/component-measures/utils.js b/server/sonar-web/src/main/js/apps/component-measures/utils.js index a1cd1d3c2ac..0ae0a1dfa15 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/utils.js +++ b/server/sonar-web/src/main/js/apps/component-measures/utils.js @@ -112,11 +112,25 @@ export const groupByDomains = memoize((measures: Array): Array< ]); }); -export const hasTreemap = (metricType: string): boolean => - ['PERCENT', 'RATING', 'LEVEL'].includes(metricType); +export const getDefaultView = (metric: string): string => { + if (!hasList(metric)) { + return 'tree'; + } + return DEFAULT_VIEW; +}; + +export const hasList = (metric: string): boolean => + !['releasability_rating', 'releasability_effort'].includes(metric); + +export const hasTree = (metric: string): boolean => metric !== 'alert_status'; + +export const hasTreemap = (metric: string, type: string): boolean => + ['PERCENT', 'RATING', 'LEVEL'].includes(type) && hasTree(metric); export const hasBubbleChart = (domainName: string): boolean => bubbles[domainName] != null; +export const hasFacetStat = (metric: string): boolean => metric !== 'alert_status'; + export const getBubbleMetrics = (domain: string, metrics: { [string]: Metric }) => { const conf = bubbles[domain]; return { @@ -129,11 +143,24 @@ export const getBubbleMetrics = (domain: string, metrics: { [string]: Metric }) export const isProjectOverview = (metric: string) => metric === PROJECT_OVERVEW; -export const parseQuery = memoize((urlQuery: RawQuery): Query => ({ - metric: parseAsString(urlQuery['metric']) || DEFAULT_METRIC, - selected: parseAsString(urlQuery['selected']), - view: parseAsString(urlQuery['view']) || DEFAULT_VIEW -})); +const parseView = memoize((rawView?: string, metric: string) => { + const view = parseAsString(rawView) || DEFAULT_VIEW; + if (!hasTree(metric)) { + return 'list'; + } else if (view === 'list' && !hasList(metric)) { + return 'tree'; + } + return view; +}); + +export const parseQuery = memoize((urlQuery: RawQuery): Query => { + const metric = parseAsString(urlQuery['metric']) || DEFAULT_METRIC; + return { + metric, + selected: parseAsString(urlQuery['selected']), + view: parseView(urlQuery['view'], metric) + }; +}); export const serializeQuery = memoize((query: Query): RawQuery => { return cleanQuery({