From 64bd4d4c4d77e9c60a7ca51e625f4748ea18c653 Mon Sep 17 00:00:00 2001 From: Wouter Admiraal Date: Tue, 12 Feb 2019 11:08:52 +0100 Subject: [PATCH] SONAR-11719 Update measures page for Prs anad SLBs --- .../component-measures/components/App.tsx | 6 +- .../components/MeasureHeader.tsx | 2 +- .../components/MeasureOverview.tsx | 16 ++- .../sidebar/DomainFacet.tsx | 24 +++-- .../sidebar/FacetMeasureValue.tsx | 8 +- .../component-measures/sidebar/Sidebar.tsx | 18 ++-- .../sidebar/__tests__/DomainFacet-test.tsx | 96 +++++++++--------- .../__tests__/FacetMeasureValue-test.tsx | 9 +- .../sidebar/__tests__/Sidebar-test.tsx | 99 ++++++++++--------- .../__snapshots__/DomainFacet-test.tsx.snap | 13 ++- .../FacetMeasureValue-test.tsx.snap | 13 +++ .../__snapshots__/Sidebar-test.tsx.snap | 4 +- .../main/js/apps/component-measures/utils.ts | 33 +++---- 13 files changed, 182 insertions(+), 159 deletions(-) diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/App.tsx b/server/sonar-web/src/main/js/apps/component-measures/components/App.tsx index 551d4d9f80d..0603e1a269b 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/components/App.tsx @@ -285,8 +285,8 @@ export class App extends React.PureComponent { const { branchLike } = this.props; const { measures } = this.state; const query = parseQuery(this.props.location.query); - const hasOverview = hasFullMeasures(branchLike); - const displayOverview = hasOverview && hasBubbleChart(query.metric); + const showFullMeasures = hasFullMeasures(branchLike); + const displayOverview = hasBubbleChart(query.metric); const metric = this.getSelectedMetric(query, displayOverview); return ( @@ -302,9 +302,9 @@ export class App extends React.PureComponent {
diff --git a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureHeader.tsx b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureHeader.tsx index 842c72ff5b8..5b9929b9447 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/components/MeasureHeader.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/components/MeasureHeader.tsx @@ -54,7 +54,7 @@ export default function MeasureHeader(props: Props) { { render() { const { branchLike, component, leakPeriod, rootComponent } = this.props; const { paging } = this.state; + const displayLeak = hasFullMeasures(branchLike); return (
@@ -163,9 +164,14 @@ export default class MeasureOverview extends React.PureComponent {
- {leakPeriod && ( - - )} + {leakPeriod && + displayLeak && ( + + )}
{!this.props.loading && this.renderContent()} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.tsx b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.tsx index c81765cde2f..3574939f942 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/DomainFacet.tsx @@ -41,11 +41,11 @@ import { interface Props { domain: { name: string; measures: T.MeasureEnhanced[] }; - hasOverview: boolean; onChange: (metric: string) => void; onToggle: (property: string) => void; open: boolean; selected: string; + showFullMeasures: boolean; } export default class DomainFacet extends React.PureComponent { @@ -74,11 +74,21 @@ export default class DomainFacet extends React.PureComponent { }; hasOverview = (domain: string) => { - return this.props.hasOverview && hasBubbleChart(domain); + return this.props.showFullMeasures && hasBubbleChart(domain); }; renderItemFacetStat = (item: T.MeasureEnhanced) => { - return hasFacetStat(item.metric.key) ? : null; + return hasFacetStat(item.metric.key) ? ( + + ) : null; + }; + + renderCategoryItem = (item: string) => { + return this.props.showFullMeasures || item === 'new_code_category' ? ( + + {translate('component_measures.facet_category', item)} + + ) : null; }; renderItemsFacet = () => { @@ -98,13 +108,7 @@ export default class DomainFacet extends React.PureComponent { return sortedItems.map( item => typeof item === 'string' ? ( - - - {!this.props.hasOverview && item === 'overall_category' - ? translate('component_measures.facet_category', item, 'estimated') - : translate('component_measures.facet_category', item)} - - + this.renderCategoryItem(item) ) : ( +
) => void; } @@ -53,25 +53,23 @@ export default class Sidebar extends React.PureComponent { }; render() { - const { hasOverview } = this.props; + const { showFullMeasures } = this.props; return (
- {hasOverview && ( - - )} + {groupByDomains(this.props.measures).map(domain => ( ))}
diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/DomainFacet-test.tsx b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/DomainFacet-test.tsx index a570fda9252..9aa6e8655dc 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/DomainFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/DomainFacet-test.tsx @@ -21,59 +21,21 @@ import * as React from 'react'; import { shallow } from 'enzyme'; import DomainFacet from '../DomainFacet'; -const DOMAIN = { - name: 'Reliability', - measures: [ - { - metric: { - id: '1', - key: 'bugs', - type: 'INT', - name: 'Bugs', - domain: 'Reliability' - }, - value: '5', - periods: [{ index: 1, value: '5' }], - leak: '5' - }, - { - metric: { - id: '2', - key: 'new_bugs', - type: 'INT', - name: 'New Bugs', - domain: 'Reliability' - }, - periods: [{ index: 1, value: '5' }], - leak: '5' - } - ] -}; - -const PROPS = { - domain: DOMAIN, - hasOverview: true, - onChange: () => {}, - onToggle: () => {}, - open: true, - selected: 'foo' -}; - it('should display facet item list', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallowRender()).toMatchSnapshot(); }); it('should display facet item list with bugs selected', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallowRender({ selected: 'bugs' })).toMatchSnapshot(); }); it('should render closed', () => { - const wrapper = shallow(); + const wrapper = shallowRender({ open: false }); expect(wrapper.find('FacetItemsList')).toHaveLength(0); }); it('should render without overview', () => { - const wrapper = shallow(); + const wrapper = shallowRender({ showFullMeasures: false }); expect( wrapper .find('FacetItem') @@ -82,11 +44,6 @@ it('should render without overview', () => { ).toBe(false); }); -it('should use "estimated" label for overall measures ', () => { - const wrapper = shallow(); - expect(wrapper.find('.facet-name').map(w => w.text())).toMatchSnapshot(); -}); - it('should not display subtitles of new measures if there is none', () => { const domain = { name: 'Reliability', @@ -98,7 +55,7 @@ it('should not display subtitles of new measures if there is none', () => { ] }; - expect(shallow()).toMatchSnapshot(); + expect(shallowRender({ domain })).toMatchSnapshot(); }); it('should not display subtitles of new measures if there is none, even on last line', () => { @@ -112,5 +69,46 @@ it('should not display subtitles of new measures if there is none, even on last ] }; - expect(shallow()).toMatchSnapshot(); + expect(shallowRender({ domain })).toMatchSnapshot(); }); + +function shallowRender(props: Partial = {}) { + return shallow( + {}} + onToggle={() => {}} + open={true} + selected={'foo'} + showFullMeasures={true} + {...props} + /> + ); +} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.tsx b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.tsx index dabd5a35884..48fdd522edb 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/FacetMeasureValue-test.tsx @@ -46,9 +46,14 @@ const LEAK_MEASURE = { }; it('should display measure value', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); it('should display leak measure value', () => { - expect(shallow()).toMatchSnapshot(); + expect( + shallow() + ).toMatchSnapshot(); + expect( + shallow() + ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/Sidebar-test.tsx b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/Sidebar-test.tsx index a47cd75fe49..aee555edc2a 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/Sidebar-test.tsx +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/Sidebar-test.tsx @@ -21,61 +21,64 @@ import * as React from 'react'; import { shallow } from 'enzyme'; import Sidebar from '../Sidebar'; -const MEASURES = [ - { - metric: { - id: '1', - key: 'lines_to_cover', - type: 'INT', - name: 'Lines to Cover', - domain: 'Coverage' - }, - value: '431', - periods: [{ index: 1, value: '70' }], - leak: '70' - }, - { - metric: { - id: '2', - key: 'coverage', - type: 'PERCENT', - name: 'Coverage', - domain: 'Coverage' - }, - value: '99.3', - periods: [{ index: 1, value: '0.0999999999999943' }], - leak: '0.0999999999999943' - }, - { - metric: { - id: '3', - key: 'duplicated_lines_density', - type: 'PERCENT', - name: 'Duplicated Lines (%)', - domain: 'Duplications' - }, - value: '3.2', - periods: [{ index: 1, value: '0.0' }], - leak: '0.0' - } -]; - -const PROPS = { - hasOverview: true, - measures: MEASURES, - selectedMetric: 'duplicated_lines_density', - updateQuery: () => {} -}; - it('should display two facets', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallowRender()).toMatchSnapshot(); }); it('should correctly toggle facets', () => { - const wrapper = shallow(); + const wrapper = shallowRender(); expect(wrapper.state('openFacets').bugs).toBeUndefined(); (wrapper.instance() as Sidebar).toggleFacet('bugs'); expect(wrapper.state('openFacets').bugs).toBeTruthy(); (wrapper.instance() as Sidebar).toggleFacet('bugs'); expect(wrapper.state('openFacets').bugs).toBeFalsy(); }); + +function shallowRender(props = {}) { + return shallow( + {}} + {...props} + /> + ); +} diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.tsx.snap b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.tsx.snap index 25deb6dc14a..8fbc7721286 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/DomainFacet-test.tsx.snap @@ -60,6 +60,7 @@ exports[`should display facet item list 1`] = ` onClick={[Function]} stat={ `; - -exports[`should use "estimated" label for overall measures 1`] = ` -Array [ - "component_measures.facet_category.new_code_category", - "component_measures.facet_category.overall_category.estimated", -] -`; diff --git a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.tsx.snap b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.tsx.snap index 94bc6ea97f5..104dad272ff 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/component-measures/sidebar/__tests__/__snapshots__/FacetMeasureValue-test.tsx.snap @@ -13,6 +13,19 @@ exports[`should display leak measure value 1`] = `
`; +exports[`should display leak measure value 2`] = ` +
+ +
+`; + exports[`should display measure value 1`] = `
`; diff --git a/server/sonar-web/src/main/js/apps/component-measures/utils.ts b/server/sonar-web/src/main/js/apps/component-measures/utils.ts index 52e39e4e059..b28a82613cc 100644 --- a/server/sonar-web/src/main/js/apps/component-measures/utils.ts +++ b/server/sonar-web/src/main/js/apps/component-measures/utils.ts @@ -23,8 +23,13 @@ import { bubbles } from './config/bubbles'; import { getLocalizedMetricName } from '../../helpers/l10n'; import { enhanceMeasure } from '../../components/measure/utils'; import { cleanQuery, parseAsString, RawQuery, serializeString } from '../../helpers/query'; -import { isLongLivingBranch, isMainBranch } from '../../helpers/branches'; -import { getDisplayMetrics } from '../../helpers/measures'; +import { + isLongLivingBranch, + isMainBranch, + isPullRequest, + isShortLivingBranch +} from '../../helpers/branches'; +import { getDisplayMetrics, isDiffMetric } from '../../helpers/measures'; export type View = 'list' | 'tree' | 'treemap'; @@ -152,25 +157,13 @@ export function getMeasuresPageMetricKeys( metrics: { [key: string]: T.Metric }, branch?: T.BranchLike ) { - if (!hasFullMeasures(branch)) { - return [ - 'coverage', - 'new_coverage', - 'new_lines_to_cover', - 'new_uncovered_lines', - 'new_line_coverage', - 'new_conditions_to_cover', - 'new_uncovered_conditions', - 'new_branch_coverage', - - 'duplicated_lines_density', - 'new_duplicated_lines_density', - 'new_duplicated_lines', - 'new_duplicated_blocks' - ]; - } + const metricKeys = getDisplayMetrics(Object.values(metrics)).map(metric => metric.key); - return getDisplayMetrics(Object.values(metrics)).map(metric => metric.key); + if (isPullRequest(branch) || isShortLivingBranch(branch)) { + return metricKeys.filter(key => isDiffMetric(key)); + } else { + return metricKeys; + } } export function getBubbleMetrics(domain: string, metrics: { [key: string]: T.Metric }) { -- 2.39.5