import { TooltipsContainer } from '../../../components/mixins/tooltips-mixin';
import { getCustomGraph, getGraph } from '../../../helpers/storage';
import { METRICS, HISTORY_METRICS_LIST } from '../utils';
-import { getDisplayedHistoryMetrics } from '../../projectActivity/utils';
+import { DEFAULT_GRAPH, getDisplayedHistoryMetrics } from '../../projectActivity/utils';
import type { Component, History, MeasuresList, Period } from '../types';
import '../styles.css';
loadHistory(component: Component) {
let graphMetrics = getDisplayedHistoryMetrics(getGraph(), getCustomGraph());
if (!graphMetrics || graphMetrics.length <= 0) {
- graphMetrics = getDisplayedHistoryMetrics('overview', []);
+ graphMetrics = getDisplayedHistoryMetrics(DEFAULT_GRAPH, []);
}
const metrics = uniq(HISTORY_METRICS_LIST.concat(graphMetrics));
import { minBy } from 'lodash';
import { AutoSizer } from 'react-virtualized';
import {
+ DEFAULT_GRAPH,
getDisplayedHistoryMetrics,
generateSeries,
getSeriesMetricType,
getDisplayedMetrics = (graph: string, customMetrics: Array<string>): Array<string> => {
const metrics: Array<string> = getDisplayedHistoryMetrics(graph, customMetrics);
if (!metrics || metrics.length <= 0) {
- return getDisplayedHistoryMetrics('overview', customMetrics);
+ return getDisplayedHistoryMetrics(DEFAULT_GRAPH, customMetrics);
}
return metrics;
};
import React from 'react';
import { shallow } from 'enzyme';
import PreviewGraphTooltips from '../PreviewGraphTooltips';
+import { DEFAULT_GRAPH } from '../../../projectActivity/utils';
const SERIES_OVERVIEW = [
{
const DEFAULT_PROPS = {
formatValue: val => 'Formated.' + val,
- graph: 'overview',
+ graph: DEFAULT_GRAPH,
graphWidth: 150,
metrics: METRICS,
selectedDate: new Date('2011-10-01T22:01:00.000Z'),
const QUERY = {
category: '',
from: new Date('2017-04-27T08:21:32+0200'),
- graph: 'overview',
+ graph: utils.DEFAULT_GRAPH,
project: 'foo',
to: undefined,
selectedDate: undefined,
utils.getAnalysesByVersionByDay(ANALYSES, {
category: '',
customMetrics: [],
- graph: 'overview',
+ graph: utils.DEFAULT_GRAPH,
project: 'foo'
})
).toMatchSnapshot();
utils.getAnalysesByVersionByDay(ANALYSES, {
category: 'QUALITY_PROFILE',
customMetrics: [],
- graph: 'overview',
+ graph: utils.DEFAULT_GRAPH,
project: 'foo'
})
).toMatchSnapshot();
utils.getAnalysesByVersionByDay(ANALYSES, {
category: '',
customMetrics: [],
- graph: 'overview',
+ graph: utils.DEFAULT_GRAPH,
project: 'foo',
to: new Date('2017-06-09T11:12:27+0200'),
from: new Date('2017-05-18T14:13:07+0200')
describe('getDisplayedHistoryMetrics', () => {
const customMetrics = ['foo', 'bar'];
it('should return only displayed metrics on the graph', () => {
- expect(utils.getDisplayedHistoryMetrics('overview', [])).toEqual([
+ expect(utils.getDisplayedHistoryMetrics(utils.DEFAULT_GRAPH, [])).toEqual([
'bugs',
'code_smells',
'vulnerabilities'
describe('getHistoryMetrics', () => {
const customMetrics = ['foo', 'bar'];
it('should return all metrics', () => {
- expect(utils.getHistoryMetrics('overview', [])).toEqual([
+ expect(utils.getHistoryMetrics(utils.DEFAULT_GRAPH, [])).toEqual([
'bugs',
'code_smells',
'vulnerabilities',
import GraphsTooltipsContentEvents from './GraphsTooltipsContentEvents';
import GraphsTooltipsContentCoverage from './GraphsTooltipsContentCoverage';
import GraphsTooltipsContentDuplication from './GraphsTooltipsContentDuplication';
-import GraphsTooltipsContentOverview from './GraphsTooltipsContentOverview';
+import GraphsTooltipsContentIssues from './GraphsTooltipsContentIssues';
+import { DEFAULT_GRAPH } from '../utils';
import type { Event, MeasureHistory } from '../types';
import type { Serie } from '../../../components/charts/AdvancedTimeline';
if (!point || (!point.y && point.y !== 0)) {
return null;
}
- if (this.props.graph === 'overview') {
+ if (this.props.graph === DEFAULT_GRAPH) {
return (
- <GraphsTooltipsContentOverview
+ <GraphsTooltipsContentIssues
key={serie.name}
measuresHistory={measuresHistory}
name={serie.name}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+// @flow
+import React from 'react';
+import classNames from 'classnames';
+import ChartLegendIcon from '../../../components/icons-components/ChartLegendIcon';
+import Rating from '../../../components/ui/Rating';
+import type { MeasureHistory } from '../types';
+
+type Props = {
+ measuresHistory: Array<MeasureHistory>,
+ name: string,
+ style: string,
+ tooltipIdx: number,
+ translatedName: string,
+ value: string
+};
+
+const METRIC_RATING = {
+ bugs: 'reliability_rating',
+ vulnerabilities: 'security_rating',
+ code_smells: 'sqale_rating'
+};
+
+export default function GraphsTooltipsContentIssues(props: Props) {
+ const rating = props.measuresHistory.find(
+ measure => measure.metric === METRIC_RATING[props.name]
+ );
+ if (!rating || !rating.history[props.tooltipIdx]) {
+ return null;
+ }
+ const ratingValue = rating.history[props.tooltipIdx].value;
+ return (
+ <tr key={props.name} className="project-activity-graph-tooltip-issues-line">
+ <td className="thin">
+ <ChartLegendIcon
+ className={classNames(
+ 'spacer-right line-chart-legend',
+ 'line-chart-legend-' + props.style
+ )}
+ />
+ </td>
+ <td className="text-right spacer-right">
+ <span className="project-activity-graph-tooltip-value">
+ {props.value}
+ </span>
+ {ratingValue && <Rating className="spacer-left" small={true} value={ratingValue} />}
+ </td>
+ <td>
+ {props.translatedName}
+ </td>
+ </tr>
+ );
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-// @flow
-import React from 'react';
-import classNames from 'classnames';
-import ChartLegendIcon from '../../../components/icons-components/ChartLegendIcon';
-import Rating from '../../../components/ui/Rating';
-import type { MeasureHistory } from '../types';
-
-type Props = {
- measuresHistory: Array<MeasureHistory>,
- name: string,
- style: string,
- tooltipIdx: number,
- translatedName: string,
- value: string
-};
-
-const METRIC_RATING = {
- bugs: 'reliability_rating',
- vulnerabilities: 'security_rating',
- code_smells: 'sqale_rating'
-};
-
-export default function GraphsTooltipsContentOverview(props: Props) {
- const rating = props.measuresHistory.find(
- measure => measure.metric === METRIC_RATING[props.name]
- );
- if (!rating || !rating.history[props.tooltipIdx]) {
- return null;
- }
- const ratingValue = rating.history[props.tooltipIdx].value;
- return (
- <tr key={props.name} className="project-activity-graph-tooltip-overview-line">
- <td className="thin">
- <ChartLegendIcon
- className={classNames(
- 'spacer-right line-chart-legend',
- 'line-chart-legend-' + props.style
- )}
- />
- </td>
- <td className="text-right spacer-right">
- <span className="project-activity-graph-tooltip-value">
- {props.value}
- </span>
- {ratingValue && <Rating className="spacer-left" small={true} value={ratingValue} />}
- </td>
- <td>
- {props.translatedName}
- </td>
- </tr>
- );
-}
import { getCustomGraph, getGraph } from '../../../helpers/storage';
import {
customMetricsChanged,
+ DEFAULT_GRAPH,
getHistoryMetrics,
isCustomGraph,
parseQuery,
// if there is no filter, but there are saved preferences in the localStorage
const graph = getGraph();
- return !filtered && graph != null && graph !== 'overview';
+ return !filtered && graph != null && graph !== DEFAULT_GRAPH;
}
};
import React from 'react';
import { shallow } from 'enzyme';
import GraphHistory from '../GraphHistory';
+import { DEFAULT_GRAPH } from '../../utils';
const SERIES = [
{
const DEFAULT_PROPS = {
events: [],
- graph: 'overview',
+ graph: DEFAULT_GRAPH,
graphEndDate: null,
graphStartDate: null,
leakPeriodDate: '2017-05-16T13:50:02+0200',
import React from 'react';
import { shallow } from 'enzyme';
import GraphsHistory from '../GraphsHistory';
+import { DEFAULT_GRAPH } from '../../utils';
const ANALYSES = [
{
const DEFAULT_PROPS = {
analyses: ANALYSES,
eventFilter: '',
- graph: 'overview',
+ graph: DEFAULT_GRAPH,
graphs: [SERIES],
graphEndDate: null,
graphStartDate: null,
import React from 'react';
import { shallow } from 'enzyme';
import GraphsTooltips from '../GraphsTooltips';
+import { DEFAULT_GRAPH } from '../../utils';
-const SERIES_OVERVIEW = [
+const SERIES_ISSUES = [
{
name: 'bugs',
translatedName: 'Bugs',
const DEFAULT_PROPS = {
formatValue: val => 'Formated.' + val,
- graph: 'overview',
+ graph: DEFAULT_GRAPH,
graphWidth: 500,
measuresHistory: [],
selectedDate: new Date('2011-10-01T22:01:00.000Z'),
- series: SERIES_OVERVIEW,
+ series: SERIES_ISSUES,
tooltipIdx: 0,
tooltipPos: 666
};
-it('should render correctly for overview graphs', () => {
+it('should render correctly for issues graphs', () => {
expect(shallow(<GraphsTooltips {...DEFAULT_PROPS} />)).toMatchSnapshot();
});
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import React from 'react';
+import { shallow } from 'enzyme';
+import GraphsTooltipsContentIssues from '../GraphsTooltipsContentIssues';
+
+const MEASURES_ISSUES = [
+ {
+ metric: 'bugs',
+ history: [
+ {
+ date: '2011-10-01T22:01:00.000Z',
+ value: '500'
+ },
+ {
+ date: '2011-10-25T10:27:41.000Z',
+ value: '1.2k'
+ }
+ ]
+ },
+ {
+ metric: 'reliability_rating',
+ history: [
+ {
+ date: '2011-10-01T22:01:00.000Z'
+ },
+ {
+ date: '2011-10-25T10:27:41.000Z',
+ value: '5.0'
+ }
+ ]
+ }
+];
+
+const DEFAULT_PROPS = {
+ measuresHistory: MEASURES_ISSUES,
+ name: 'bugs',
+ style: '2',
+ tooltipIdx: 1,
+ translatedName: 'Bugs',
+ value: '1.2k'
+};
+
+it('should render correctly', () => {
+ expect(shallow(<GraphsTooltipsContentIssues {...DEFAULT_PROPS} />)).toMatchSnapshot();
+});
+
+it('should render correctly when rating data is missing', () => {
+ expect(
+ shallow(<GraphsTooltipsContentIssues {...DEFAULT_PROPS} tooltipIdx={0} value="500" />)
+ ).toMatchSnapshot();
+});
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-import React from 'react';
-import { shallow } from 'enzyme';
-import GraphsTooltipsContentOverview from '../GraphsTooltipsContentOverview';
-
-const MEASURES_OVERVIEW = [
- {
- metric: 'bugs',
- history: [
- {
- date: '2011-10-01T22:01:00.000Z',
- value: '500'
- },
- {
- date: '2011-10-25T10:27:41.000Z',
- value: '1.2k'
- }
- ]
- },
- {
- metric: 'reliability_rating',
- history: [
- {
- date: '2011-10-01T22:01:00.000Z'
- },
- {
- date: '2011-10-25T10:27:41.000Z',
- value: '5.0'
- }
- ]
- }
-];
-
-const DEFAULT_PROPS = {
- measuresHistory: MEASURES_OVERVIEW,
- name: 'bugs',
- style: '2',
- tooltipIdx: 1,
- translatedName: 'Bugs',
- value: '1.2k'
-};
-
-it('should render correctly', () => {
- expect(shallow(<GraphsTooltipsContentOverview {...DEFAULT_PROPS} />)).toMatchSnapshot();
-});
-
-it('should render correctly when rating data is missing', () => {
- expect(
- shallow(<GraphsTooltipsContentOverview {...DEFAULT_PROPS} tooltipIdx={0} value="500" />)
- ).toMatchSnapshot();
-});
deleteAnalysis: () => {},
deleteEvent: () => {},
loading: false,
- query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' },
+ query: { category: '', graph: 'issues', project: 'org.sonarsource.sonarqube:sonarqube' },
updateQuery: () => {}
};
]
}
],
- query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' },
+ query: { category: '', graph: 'issues', project: 'org.sonarsource.sonarqube:sonarqube' },
updateQuery: () => {}
};
import React from 'react';
import { shallow } from 'enzyme';
import ProjectActivityGraphs from '../ProjectActivityGraphs';
+import { DEFAULT_GRAPH } from '../../utils';
const ANALYSES = [
{
}
],
metrics: METRICS,
- query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' },
+ query: { category: '', graph: DEFAULT_GRAPH, project: 'org.sonarsource.sonarqube:sonarqube' },
updateQuery: () => {}
};
>
<GraphHistory
events={Array []}
- graph="overview"
+ graph="issues"
graphEndDate={null}
graphStartDate={null}
isCustom={false}
>
<GraphHistory
events={Array []}
- graph="overview"
+ graph="issues"
graphEndDate={null}
graphStartDate={null}
isCustom={false}
/>
<GraphHistory
events={Array []}
- graph="overview"
+ graph="issues"
graphEndDate={null}
graphStartDate={null}
isCustom={false}
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`should render correctly for overview graphs 1`] = `
+exports[`should render correctly for issues graphs 1`] = `
<BubblePopup
customClass="bubble-popup-right"
position={
className="width-100"
>
<tbody>
- <GraphsTooltipsContentOverview
+ <GraphsTooltipsContentIssues
measuresHistory={Array []}
name="bugs"
style="0"
translatedName="Bugs"
value="Formated.3"
/>
- <GraphsTooltipsContentOverview
+ <GraphsTooltipsContentIssues
measuresHistory={Array []}
name="code_smells"
style="1"
translatedName="Code Smells"
value="Formated.18"
/>
- <GraphsTooltipsContentOverview
+ <GraphsTooltipsContentIssues
measuresHistory={Array []}
name="vulnerabilities"
style="2"
--- /dev/null
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`should render correctly 1`] = `
+<tr
+ className="project-activity-graph-tooltip-issues-line"
+>
+ <td
+ className="thin"
+ >
+ <ChartLegendIcon
+ className="spacer-right line-chart-legend line-chart-legend-2"
+ />
+ </td>
+ <td
+ className="text-right spacer-right"
+ >
+ <span
+ className="project-activity-graph-tooltip-value"
+ >
+ 1.2k
+ </span>
+ <Rating
+ className="spacer-left"
+ muted={false}
+ small={true}
+ value="5.0"
+ />
+ </td>
+ <td>
+ Bugs
+ </td>
+</tr>
+`;
+
+exports[`should render correctly when rating data is missing 1`] = `
+<tr
+ className="project-activity-graph-tooltip-issues-line"
+>
+ <td
+ className="thin"
+ >
+ <ChartLegendIcon
+ className="spacer-right line-chart-legend line-chart-legend-2"
+ />
+ </td>
+ <td
+ className="text-right spacer-right"
+ >
+ <span
+ className="project-activity-graph-tooltip-value"
+ >
+ 500
+ </span>
+ </td>
+ <td>
+ Bugs
+ </td>
+</tr>
+`;
+++ /dev/null
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`should render correctly 1`] = `
-<tr
- className="project-activity-graph-tooltip-overview-line"
->
- <td
- className="thin"
- >
- <ChartLegendIcon
- className="spacer-right line-chart-legend line-chart-legend-2"
- />
- </td>
- <td
- className="text-right spacer-right"
- >
- <span
- className="project-activity-graph-tooltip-value"
- >
- 1.2k
- </span>
- <Rating
- className="spacer-left"
- muted={false}
- small={true}
- value="5.0"
- />
- </td>
- <td>
- Bugs
- </td>
-</tr>
-`;
-
-exports[`should render correctly when rating data is missing 1`] = `
-<tr
- className="project-activity-graph-tooltip-overview-line"
->
- <td
- className="thin"
- >
- <ChartLegendIcon
- className="spacer-right line-chart-legend line-chart-legend-2"
- />
- </td>
- <td
- className="text-right spacer-right"
- >
- <span
- className="project-activity-graph-tooltip-value"
- >
- 500
- </span>
- </td>
- <td>
- Bugs
- </td>
-</tr>
-`;
query={
Object {
"category": "",
- "graph": "overview",
+ "graph": "issues",
"project": "org.sonarsource.sonarqube:sonarqube",
}
}
query={
Object {
"category": "",
- "graph": "overview",
+ "graph": "issues",
"project": "org.sonarsource.sonarqube:sonarqube",
}
}
>
<ProjectActivityGraphsHeader
addCustomMetric={[Function]}
- graph="overview"
+ graph="issues"
metrics={
Array [
Object {
]
}
eventFilter=""
- graph="overview"
+ graph="issues"
graphEndDate={null}
graphStartDate={null}
graphs={
margin-top: 1px;
}
-.project-activity-graph-tooltip-overview-line {
+.project-activity-graph-tooltip-issues-line {
height: 26px;
padding-bottom: 4px;
}
import type { Serie } from '../../components/charts/AdvancedTimeline';
export const EVENT_TYPES = ['VERSION', 'QUALITY_GATE', 'QUALITY_PROFILE', 'OTHER'];
-export const GRAPH_TYPES = ['overview', 'coverage', 'duplications', 'custom'];
+export const DEFAULT_GRAPH = 'issues';
+export const GRAPH_TYPES = ['issues', 'coverage', 'duplications', 'custom'];
export const GRAPHS_METRICS_DISPLAYED = {
- overview: ['bugs', 'code_smells', 'vulnerabilities'],
+ issues: ['bugs', 'code_smells', 'vulnerabilities'],
coverage: ['uncovered_lines', 'lines_to_cover'],
duplications: ['duplicated_lines', 'ncloc']
};
export const GRAPHS_METRICS = {
- overview: GRAPHS_METRICS_DISPLAYED['overview'].concat([
+ issues: GRAPHS_METRICS_DISPLAYED['issues'].concat([
'reliability_rating',
'security_rating',
'sqale_rating'
const parseGraph = (value?: string): string => {
const graph = parseAsString(value);
- return GRAPH_TYPES.includes(graph) ? graph : 'overview';
+ return GRAPH_TYPES.includes(graph) ? graph : DEFAULT_GRAPH;
};
-const serializeGraph = (value: string): ?string => (value === 'overview' ? undefined : value);
+const serializeGraph = (value: string): ?string => (value === DEFAULT_GRAPH ? undefined : value);
export const parseQuery = (urlQuery: RawQuery): Query => ({
category: parseAsString(urlQuery['category']),
export const saveGraph = (graph: ?string) => save(PROJECT_ACTIVITY_GRAPH, graph);
export const getGraph = (): string =>
- window.localStorage.getItem(PROJECT_ACTIVITY_GRAPH) || 'overview';
+ window.localStorage.getItem(PROJECT_ACTIVITY_GRAPH) || 'issues';
project_activity.delete_analysis.question=Are you sure you want to delete this analysis from the project history?
project_activity.filter_events=Filter events
-project_activity.graphs.overview=Overview
+project_activity.graphs.issues=Issues
project_activity.graphs.coverage=Coverage
project_activity.graphs.duplications=Duplications
project_activity.graphs.custom=Custom