});
const banQualityGate = (component: Component): Array<Measure> => {
- 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');
}
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));
}
</div>
</div>
</div>
- {metric == null && <MetricNotFound className="layout-page-main-inner measure-details-content" />}
+ {metric == null &&
+ <MetricNotFound className="layout-page-main-inner measure-details-content" />}
{metric != null &&
measure != null &&
<div className="layout-page-main-inner measure-details-content">
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';
getOptions = () => {
const { metric } = this.props;
const options = [];
- options.push({
- value: 'list',
- label: (
- <div>
- <ListIcon className="little-spacer-right" />
- {translate('component_measures.tab.list')}
- </div>
- ),
- icon: <ListIcon />
- });
- options.push({
- value: 'tree',
- label: (
- <div>
- <TreeIcon className="little-spacer-right" />
- {translate('component_measures.tab.tree')}
- </div>
- ),
- icon: <TreeIcon />
- });
- if (hasTreemap(metric.type)) {
+ if (hasList(metric.key)) {
+ options.push({
+ value: 'list',
+ label: (
+ <div>
+ <ListIcon className="little-spacer-right" />
+ {translate('component_measures.tab.list')}
+ </div>
+ ),
+ icon: <ListIcon />
+ });
+ }
+ if (hasTree(metric.key)) {
+ options.push({
+ value: 'tree',
+ label: (
+ <div>
+ <TreeIcon className="little-spacer-right" />
+ {translate('component_measures.tab.tree')}
+ </div>
+ ),
+ icon: <TreeIcon />
+ });
+ }
+ if (hasTreemap(metric.key, metric.type)) {
options.push({
value: 'treemap',
label: (
},
Releasability: {
- order: ['alert_status']
+ order: ['releasability_rating', 'releasability_effort', 'alert_status']
},
Issues: {
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,
</Tooltip>
}
onClick={this.props.onChange}
- stat={<FacetMeasureValue measure={measure} />}
+ stat={
+ hasFacetStat(measure.metric.key) ? <FacetMeasureValue measure={measure} /> : null
+ }
value={measure.metric.key}
/>
)}
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';
}));
};
- 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 (
]);
});
-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 {
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({