import { TooltipsContainer } from '../../../components/mixins/tooltips-mixin'; | import { TooltipsContainer } from '../../../components/mixins/tooltips-mixin'; | ||||
import { getCustomGraph, getGraph } from '../../../helpers/storage'; | import { getCustomGraph, getGraph } from '../../../helpers/storage'; | ||||
import { METRICS, HISTORY_METRICS_LIST } from '../utils'; | 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 type { Component, History, MeasuresList, Period } from '../types'; | ||||
import '../styles.css'; | import '../styles.css'; | ||||
loadHistory(component: Component) { | loadHistory(component: Component) { | ||||
let graphMetrics = getDisplayedHistoryMetrics(getGraph(), getCustomGraph()); | let graphMetrics = getDisplayedHistoryMetrics(getGraph(), getCustomGraph()); | ||||
if (!graphMetrics || graphMetrics.length <= 0) { | if (!graphMetrics || graphMetrics.length <= 0) { | ||||
graphMetrics = getDisplayedHistoryMetrics('overview', []); | |||||
graphMetrics = getDisplayedHistoryMetrics(DEFAULT_GRAPH, []); | |||||
} | } | ||||
const metrics = uniq(HISTORY_METRICS_LIST.concat(graphMetrics)); | const metrics = uniq(HISTORY_METRICS_LIST.concat(graphMetrics)); |
import { minBy } from 'lodash'; | import { minBy } from 'lodash'; | ||||
import { AutoSizer } from 'react-virtualized'; | import { AutoSizer } from 'react-virtualized'; | ||||
import { | import { | ||||
DEFAULT_GRAPH, | |||||
getDisplayedHistoryMetrics, | getDisplayedHistoryMetrics, | ||||
generateSeries, | generateSeries, | ||||
getSeriesMetricType, | getSeriesMetricType, | ||||
getDisplayedMetrics = (graph: string, customMetrics: Array<string>): Array<string> => { | getDisplayedMetrics = (graph: string, customMetrics: Array<string>): Array<string> => { | ||||
const metrics: Array<string> = getDisplayedHistoryMetrics(graph, customMetrics); | const metrics: Array<string> = getDisplayedHistoryMetrics(graph, customMetrics); | ||||
if (!metrics || metrics.length <= 0) { | if (!metrics || metrics.length <= 0) { | ||||
return getDisplayedHistoryMetrics('overview', customMetrics); | |||||
return getDisplayedHistoryMetrics(DEFAULT_GRAPH, customMetrics); | |||||
} | } | ||||
return metrics; | return metrics; | ||||
}; | }; |
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import PreviewGraphTooltips from '../PreviewGraphTooltips'; | import PreviewGraphTooltips from '../PreviewGraphTooltips'; | ||||
import { DEFAULT_GRAPH } from '../../../projectActivity/utils'; | |||||
const SERIES_OVERVIEW = [ | const SERIES_OVERVIEW = [ | ||||
{ | { | ||||
const DEFAULT_PROPS = { | const DEFAULT_PROPS = { | ||||
formatValue: val => 'Formated.' + val, | formatValue: val => 'Formated.' + val, | ||||
graph: 'overview', | |||||
graph: DEFAULT_GRAPH, | |||||
graphWidth: 150, | graphWidth: 150, | ||||
metrics: METRICS, | metrics: METRICS, | ||||
selectedDate: new Date('2011-10-01T22:01:00.000Z'), | selectedDate: new Date('2011-10-01T22:01:00.000Z'), |
const QUERY = { | const QUERY = { | ||||
category: '', | category: '', | ||||
from: new Date('2017-04-27T08:21:32+0200'), | from: new Date('2017-04-27T08:21:32+0200'), | ||||
graph: 'overview', | |||||
graph: utils.DEFAULT_GRAPH, | |||||
project: 'foo', | project: 'foo', | ||||
to: undefined, | to: undefined, | ||||
selectedDate: undefined, | selectedDate: undefined, | ||||
utils.getAnalysesByVersionByDay(ANALYSES, { | utils.getAnalysesByVersionByDay(ANALYSES, { | ||||
category: '', | category: '', | ||||
customMetrics: [], | customMetrics: [], | ||||
graph: 'overview', | |||||
graph: utils.DEFAULT_GRAPH, | |||||
project: 'foo' | project: 'foo' | ||||
}) | }) | ||||
).toMatchSnapshot(); | ).toMatchSnapshot(); | ||||
utils.getAnalysesByVersionByDay(ANALYSES, { | utils.getAnalysesByVersionByDay(ANALYSES, { | ||||
category: 'QUALITY_PROFILE', | category: 'QUALITY_PROFILE', | ||||
customMetrics: [], | customMetrics: [], | ||||
graph: 'overview', | |||||
graph: utils.DEFAULT_GRAPH, | |||||
project: 'foo' | project: 'foo' | ||||
}) | }) | ||||
).toMatchSnapshot(); | ).toMatchSnapshot(); | ||||
utils.getAnalysesByVersionByDay(ANALYSES, { | utils.getAnalysesByVersionByDay(ANALYSES, { | ||||
category: '', | category: '', | ||||
customMetrics: [], | customMetrics: [], | ||||
graph: 'overview', | |||||
graph: utils.DEFAULT_GRAPH, | |||||
project: 'foo', | project: 'foo', | ||||
to: new Date('2017-06-09T11:12:27+0200'), | to: new Date('2017-06-09T11:12:27+0200'), | ||||
from: new Date('2017-05-18T14:13:07+0200') | from: new Date('2017-05-18T14:13:07+0200') | ||||
describe('getDisplayedHistoryMetrics', () => { | describe('getDisplayedHistoryMetrics', () => { | ||||
const customMetrics = ['foo', 'bar']; | const customMetrics = ['foo', 'bar']; | ||||
it('should return only displayed metrics on the graph', () => { | it('should return only displayed metrics on the graph', () => { | ||||
expect(utils.getDisplayedHistoryMetrics('overview', [])).toEqual([ | |||||
expect(utils.getDisplayedHistoryMetrics(utils.DEFAULT_GRAPH, [])).toEqual([ | |||||
'bugs', | 'bugs', | ||||
'code_smells', | 'code_smells', | ||||
'vulnerabilities' | 'vulnerabilities' | ||||
describe('getHistoryMetrics', () => { | describe('getHistoryMetrics', () => { | ||||
const customMetrics = ['foo', 'bar']; | const customMetrics = ['foo', 'bar']; | ||||
it('should return all metrics', () => { | it('should return all metrics', () => { | ||||
expect(utils.getHistoryMetrics('overview', [])).toEqual([ | |||||
expect(utils.getHistoryMetrics(utils.DEFAULT_GRAPH, [])).toEqual([ | |||||
'bugs', | 'bugs', | ||||
'code_smells', | 'code_smells', | ||||
'vulnerabilities', | 'vulnerabilities', |
import GraphsTooltipsContentEvents from './GraphsTooltipsContentEvents'; | import GraphsTooltipsContentEvents from './GraphsTooltipsContentEvents'; | ||||
import GraphsTooltipsContentCoverage from './GraphsTooltipsContentCoverage'; | import GraphsTooltipsContentCoverage from './GraphsTooltipsContentCoverage'; | ||||
import GraphsTooltipsContentDuplication from './GraphsTooltipsContentDuplication'; | 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 { Event, MeasureHistory } from '../types'; | ||||
import type { Serie } from '../../../components/charts/AdvancedTimeline'; | import type { Serie } from '../../../components/charts/AdvancedTimeline'; | ||||
if (!point || (!point.y && point.y !== 0)) { | if (!point || (!point.y && point.y !== 0)) { | ||||
return null; | return null; | ||||
} | } | ||||
if (this.props.graph === 'overview') { | |||||
if (this.props.graph === DEFAULT_GRAPH) { | |||||
return ( | return ( | ||||
<GraphsTooltipsContentOverview | |||||
<GraphsTooltipsContentIssues | |||||
key={serie.name} | key={serie.name} | ||||
measuresHistory={measuresHistory} | measuresHistory={measuresHistory} | ||||
name={serie.name} | name={serie.name} |
code_smells: 'sqale_rating' | code_smells: 'sqale_rating' | ||||
}; | }; | ||||
export default function GraphsTooltipsContentOverview(props: Props) { | |||||
export default function GraphsTooltipsContentIssues(props: Props) { | |||||
const rating = props.measuresHistory.find( | const rating = props.measuresHistory.find( | ||||
measure => measure.metric === METRIC_RATING[props.name] | measure => measure.metric === METRIC_RATING[props.name] | ||||
); | ); | ||||
} | } | ||||
const ratingValue = rating.history[props.tooltipIdx].value; | const ratingValue = rating.history[props.tooltipIdx].value; | ||||
return ( | return ( | ||||
<tr key={props.name} className="project-activity-graph-tooltip-overview-line"> | |||||
<tr key={props.name} className="project-activity-graph-tooltip-issues-line"> | |||||
<td className="thin"> | <td className="thin"> | ||||
<ChartLegendIcon | <ChartLegendIcon | ||||
className={classNames( | className={classNames( |
import { getCustomGraph, getGraph } from '../../../helpers/storage'; | import { getCustomGraph, getGraph } from '../../../helpers/storage'; | ||||
import { | import { | ||||
customMetricsChanged, | customMetricsChanged, | ||||
DEFAULT_GRAPH, | |||||
getHistoryMetrics, | getHistoryMetrics, | ||||
isCustomGraph, | isCustomGraph, | ||||
parseQuery, | parseQuery, | ||||
// if there is no filter, but there are saved preferences in the localStorage | // if there is no filter, but there are saved preferences in the localStorage | ||||
const graph = getGraph(); | const graph = getGraph(); | ||||
return !filtered && graph != null && graph !== 'overview'; | |||||
return !filtered && graph != null && graph !== DEFAULT_GRAPH; | |||||
} | } | ||||
}; | }; | ||||
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import GraphHistory from '../GraphHistory'; | import GraphHistory from '../GraphHistory'; | ||||
import { DEFAULT_GRAPH } from '../../utils'; | |||||
const SERIES = [ | const SERIES = [ | ||||
{ | { | ||||
const DEFAULT_PROPS = { | const DEFAULT_PROPS = { | ||||
events: [], | events: [], | ||||
graph: 'overview', | |||||
graph: DEFAULT_GRAPH, | |||||
graphEndDate: null, | graphEndDate: null, | ||||
graphStartDate: null, | graphStartDate: null, | ||||
leakPeriodDate: '2017-05-16T13:50:02+0200', | leakPeriodDate: '2017-05-16T13:50:02+0200', |
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import GraphsHistory from '../GraphsHistory'; | import GraphsHistory from '../GraphsHistory'; | ||||
import { DEFAULT_GRAPH } from '../../utils'; | |||||
const ANALYSES = [ | const ANALYSES = [ | ||||
{ | { | ||||
const DEFAULT_PROPS = { | const DEFAULT_PROPS = { | ||||
analyses: ANALYSES, | analyses: ANALYSES, | ||||
eventFilter: '', | eventFilter: '', | ||||
graph: 'overview', | |||||
graph: DEFAULT_GRAPH, | |||||
graphs: [SERIES], | graphs: [SERIES], | ||||
graphEndDate: null, | graphEndDate: null, | ||||
graphStartDate: null, | graphStartDate: null, |
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import GraphsTooltips from '../GraphsTooltips'; | import GraphsTooltips from '../GraphsTooltips'; | ||||
import { DEFAULT_GRAPH } from '../../utils'; | |||||
const SERIES_OVERVIEW = [ | |||||
const SERIES_ISSUES = [ | |||||
{ | { | ||||
name: 'bugs', | name: 'bugs', | ||||
translatedName: 'Bugs', | translatedName: 'Bugs', | ||||
const DEFAULT_PROPS = { | const DEFAULT_PROPS = { | ||||
formatValue: val => 'Formated.' + val, | formatValue: val => 'Formated.' + val, | ||||
graph: 'overview', | |||||
graph: DEFAULT_GRAPH, | |||||
graphWidth: 500, | graphWidth: 500, | ||||
measuresHistory: [], | measuresHistory: [], | ||||
selectedDate: new Date('2011-10-01T22:01:00.000Z'), | selectedDate: new Date('2011-10-01T22:01:00.000Z'), | ||||
series: SERIES_OVERVIEW, | |||||
series: SERIES_ISSUES, | |||||
tooltipIdx: 0, | tooltipIdx: 0, | ||||
tooltipPos: 666 | tooltipPos: 666 | ||||
}; | }; | ||||
it('should render correctly for overview graphs', () => { | |||||
it('should render correctly for issues graphs', () => { | |||||
expect(shallow(<GraphsTooltips {...DEFAULT_PROPS} />)).toMatchSnapshot(); | expect(shallow(<GraphsTooltips {...DEFAULT_PROPS} />)).toMatchSnapshot(); | ||||
}); | }); | ||||
*/ | */ | ||||
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import GraphsTooltipsContentOverview from '../GraphsTooltipsContentOverview'; | |||||
import GraphsTooltipsContentIssues from '../GraphsTooltipsContentIssues'; | |||||
const MEASURES_OVERVIEW = [ | |||||
const MEASURES_ISSUES = [ | |||||
{ | { | ||||
metric: 'bugs', | metric: 'bugs', | ||||
history: [ | history: [ | ||||
]; | ]; | ||||
const DEFAULT_PROPS = { | const DEFAULT_PROPS = { | ||||
measuresHistory: MEASURES_OVERVIEW, | |||||
measuresHistory: MEASURES_ISSUES, | |||||
name: 'bugs', | name: 'bugs', | ||||
style: '2', | style: '2', | ||||
tooltipIdx: 1, | tooltipIdx: 1, | ||||
}; | }; | ||||
it('should render correctly', () => { | it('should render correctly', () => { | ||||
expect(shallow(<GraphsTooltipsContentOverview {...DEFAULT_PROPS} />)).toMatchSnapshot(); | |||||
expect(shallow(<GraphsTooltipsContentIssues {...DEFAULT_PROPS} />)).toMatchSnapshot(); | |||||
}); | }); | ||||
it('should render correctly when rating data is missing', () => { | it('should render correctly when rating data is missing', () => { | ||||
expect( | expect( | ||||
shallow(<GraphsTooltipsContentOverview {...DEFAULT_PROPS} tooltipIdx={0} value="500" />) | |||||
shallow(<GraphsTooltipsContentIssues {...DEFAULT_PROPS} tooltipIdx={0} value="500" />) | |||||
).toMatchSnapshot(); | ).toMatchSnapshot(); | ||||
}); | }); |
deleteAnalysis: () => {}, | deleteAnalysis: () => {}, | ||||
deleteEvent: () => {}, | deleteEvent: () => {}, | ||||
loading: false, | loading: false, | ||||
query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
query: { category: '', graph: 'issues', project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
updateQuery: () => {} | updateQuery: () => {} | ||||
}; | }; | ||||
] | ] | ||||
} | } | ||||
], | ], | ||||
query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
query: { category: '', graph: 'issues', project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
updateQuery: () => {} | updateQuery: () => {} | ||||
}; | }; | ||||
import React from 'react'; | import React from 'react'; | ||||
import { shallow } from 'enzyme'; | import { shallow } from 'enzyme'; | ||||
import ProjectActivityGraphs from '../ProjectActivityGraphs'; | import ProjectActivityGraphs from '../ProjectActivityGraphs'; | ||||
import { DEFAULT_GRAPH } from '../../utils'; | |||||
const ANALYSES = [ | const ANALYSES = [ | ||||
{ | { | ||||
} | } | ||||
], | ], | ||||
metrics: METRICS, | metrics: METRICS, | ||||
query: { category: '', graph: 'overview', project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
query: { category: '', graph: DEFAULT_GRAPH, project: 'org.sonarsource.sonarqube:sonarqube' }, | |||||
updateQuery: () => {} | updateQuery: () => {} | ||||
}; | }; | ||||
> | > | ||||
<GraphHistory | <GraphHistory | ||||
events={Array []} | events={Array []} | ||||
graph="overview" | |||||
graph="issues" | |||||
graphEndDate={null} | graphEndDate={null} | ||||
graphStartDate={null} | graphStartDate={null} | ||||
isCustom={false} | isCustom={false} | ||||
> | > | ||||
<GraphHistory | <GraphHistory | ||||
events={Array []} | events={Array []} | ||||
graph="overview" | |||||
graph="issues" | |||||
graphEndDate={null} | graphEndDate={null} | ||||
graphStartDate={null} | graphStartDate={null} | ||||
isCustom={false} | isCustom={false} | ||||
/> | /> | ||||
<GraphHistory | <GraphHistory | ||||
events={Array []} | events={Array []} | ||||
graph="overview" | |||||
graph="issues" | |||||
graphEndDate={null} | graphEndDate={null} | ||||
graphStartDate={null} | graphStartDate={null} | ||||
isCustom={false} | isCustom={false} |
// Jest Snapshot v1, https://goo.gl/fbAQLP | // Jest Snapshot v1, https://goo.gl/fbAQLP | ||||
exports[`should render correctly for overview graphs 1`] = ` | |||||
exports[`should render correctly for issues graphs 1`] = ` | |||||
<BubblePopup | <BubblePopup | ||||
customClass="bubble-popup-right" | customClass="bubble-popup-right" | ||||
position={ | position={ | ||||
className="width-100" | className="width-100" | ||||
> | > | ||||
<tbody> | <tbody> | ||||
<GraphsTooltipsContentOverview | |||||
<GraphsTooltipsContentIssues | |||||
measuresHistory={Array []} | measuresHistory={Array []} | ||||
name="bugs" | name="bugs" | ||||
style="0" | style="0" | ||||
translatedName="Bugs" | translatedName="Bugs" | ||||
value="Formated.3" | value="Formated.3" | ||||
/> | /> | ||||
<GraphsTooltipsContentOverview | |||||
<GraphsTooltipsContentIssues | |||||
measuresHistory={Array []} | measuresHistory={Array []} | ||||
name="code_smells" | name="code_smells" | ||||
style="1" | style="1" | ||||
translatedName="Code Smells" | translatedName="Code Smells" | ||||
value="Formated.18" | value="Formated.18" | ||||
/> | /> | ||||
<GraphsTooltipsContentOverview | |||||
<GraphsTooltipsContentIssues | |||||
measuresHistory={Array []} | measuresHistory={Array []} | ||||
name="vulnerabilities" | name="vulnerabilities" | ||||
style="2" | style="2" |
exports[`should render correctly 1`] = ` | exports[`should render correctly 1`] = ` | ||||
<tr | <tr | ||||
className="project-activity-graph-tooltip-overview-line" | |||||
className="project-activity-graph-tooltip-issues-line" | |||||
> | > | ||||
<td | <td | ||||
className="thin" | className="thin" | ||||
exports[`should render correctly when rating data is missing 1`] = ` | exports[`should render correctly when rating data is missing 1`] = ` | ||||
<tr | <tr | ||||
className="project-activity-graph-tooltip-overview-line" | |||||
className="project-activity-graph-tooltip-issues-line" | |||||
> | > | ||||
<td | <td | ||||
className="thin" | className="thin" |
query={ | query={ | ||||
Object { | Object { | ||||
"category": "", | "category": "", | ||||
"graph": "overview", | |||||
"graph": "issues", | |||||
"project": "org.sonarsource.sonarqube:sonarqube", | "project": "org.sonarsource.sonarqube:sonarqube", | ||||
} | } | ||||
} | } | ||||
query={ | query={ | ||||
Object { | Object { | ||||
"category": "", | "category": "", | ||||
"graph": "overview", | |||||
"graph": "issues", | |||||
"project": "org.sonarsource.sonarqube:sonarqube", | "project": "org.sonarsource.sonarqube:sonarqube", | ||||
} | } | ||||
} | } |
> | > | ||||
<ProjectActivityGraphsHeader | <ProjectActivityGraphsHeader | ||||
addCustomMetric={[Function]} | addCustomMetric={[Function]} | ||||
graph="overview" | |||||
graph="issues" | |||||
metrics={ | metrics={ | ||||
Array [ | Array [ | ||||
Object { | Object { | ||||
] | ] | ||||
} | } | ||||
eventFilter="" | eventFilter="" | ||||
graph="overview" | |||||
graph="issues" | |||||
graphEndDate={null} | graphEndDate={null} | ||||
graphStartDate={null} | graphStartDate={null} | ||||
graphs={ | graphs={ |
margin-top: 1px; | margin-top: 1px; | ||||
} | } | ||||
.project-activity-graph-tooltip-overview-line { | |||||
.project-activity-graph-tooltip-issues-line { | |||||
height: 26px; | height: 26px; | ||||
padding-bottom: 4px; | padding-bottom: 4px; | ||||
} | } |
import type { Serie } from '../../components/charts/AdvancedTimeline'; | import type { Serie } from '../../components/charts/AdvancedTimeline'; | ||||
export const EVENT_TYPES = ['VERSION', 'QUALITY_GATE', 'QUALITY_PROFILE', 'OTHER']; | 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 = { | export const GRAPHS_METRICS_DISPLAYED = { | ||||
overview: ['bugs', 'code_smells', 'vulnerabilities'], | |||||
issues: ['bugs', 'code_smells', 'vulnerabilities'], | |||||
coverage: ['uncovered_lines', 'lines_to_cover'], | coverage: ['uncovered_lines', 'lines_to_cover'], | ||||
duplications: ['duplicated_lines', 'ncloc'] | duplications: ['duplicated_lines', 'ncloc'] | ||||
}; | }; | ||||
export const GRAPHS_METRICS = { | export const GRAPHS_METRICS = { | ||||
overview: GRAPHS_METRICS_DISPLAYED['overview'].concat([ | |||||
issues: GRAPHS_METRICS_DISPLAYED['issues'].concat([ | |||||
'reliability_rating', | 'reliability_rating', | ||||
'security_rating', | 'security_rating', | ||||
'sqale_rating' | 'sqale_rating' | ||||
const parseGraph = (value?: string): string => { | const parseGraph = (value?: string): string => { | ||||
const graph = parseAsString(value); | 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 => ({ | export const parseQuery = (urlQuery: RawQuery): Query => ({ | ||||
category: parseAsString(urlQuery['category']), | category: parseAsString(urlQuery['category']), |
export const saveGraph = (graph: ?string) => save(PROJECT_ACTIVITY_GRAPH, graph); | export const saveGraph = (graph: ?string) => save(PROJECT_ACTIVITY_GRAPH, graph); | ||||
export const getGraph = (): string => | 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.delete_analysis.question=Are you sure you want to delete this analysis from the project history? | ||||
project_activity.filter_events=Filter events | project_activity.filter_events=Filter events | ||||
project_activity.graphs.overview=Overview | |||||
project_activity.graphs.issues=Issues | |||||
project_activity.graphs.coverage=Coverage | project_activity.graphs.coverage=Coverage | ||||
project_activity.graphs.duplications=Duplications | project_activity.graphs.duplications=Duplications | ||||
project_activity.graphs.custom=Custom | project_activity.graphs.custom=Custom |