aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStas Vilchik <vilchiks@gmail.com>2015-09-15 17:54:25 +0200
committerStas Vilchik <vilchiks@gmail.com>2015-09-16 10:12:15 +0200
commit1e26480cb2c8341bce5c9f028d020a520d68bae8 (patch)
treeb224baea056d1aa1d4f84656f5a9a46c980e5538
parent3c445bc471c8ca2b11df44015bbe7b8997a61ccc (diff)
downloadsonarqube-1e26480cb2c8341bce5c9f028d020a520d68bae8.tar.gz
sonarqube-1e26480cb2c8341bce5c9f028d020a520d68bae8.zip
SONAR-6331 revert overview page
-rw-r--r--it/it-tests/src/test/resources/server/ServerTest/url_ending_by_jsp.html4
-rw-r--r--it/it-tests/src/test/resources/ui/i18n/default-locale-is-english.html6
-rw-r--r--it/it-tests/src/test/resources/ui/i18n/french-locale.html6
-rw-r--r--it/it-tests/src/test/resources/ui/i18n/locale-with-france-country.html6
-rw-r--r--it/it-tests/src/test/resources/ui/i18n/locale-with-swiss-country.html6
-rw-r--r--server/sonar-web/Gruntfile.coffee1
-rw-r--r--server/sonar-web/src/main/js/apps/nav/component/component-nav-menu.jsx26
-rw-r--r--server/sonar-web/src/main/js/apps/nav/links-mixin.jsx3
-rw-r--r--server/sonar-web/src/main/js/apps/overview/app.jsx22
-rw-r--r--server/sonar-web/src/main/js/apps/overview/card.jsx7
-rw-r--r--server/sonar-web/src/main/js/apps/overview/cards.jsx7
-rw-r--r--server/sonar-web/src/main/js/apps/overview/empty.jsx13
-rw-r--r--server/sonar-web/src/main/js/apps/overview/gate-condition.jsx35
-rw-r--r--server/sonar-web/src/main/js/apps/overview/gate-conditions.jsx21
-rw-r--r--server/sonar-web/src/main/js/apps/overview/gate.jsx24
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/donut.jsx41
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/drilldown-link.jsx96
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/gate-link.jsx8
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/issues-link.jsx11
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/measure-variation.jsx11
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/measure.jsx11
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/period-label.jsx15
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/profile-link.jsx8
-rw-r--r--server/sonar-web/src/main/js/apps/overview/helpers/rating.jsx12
-rw-r--r--server/sonar-web/src/main/js/apps/overview/leak-coverage.jsx46
-rw-r--r--server/sonar-web/src/main/js/apps/overview/leak-dups.jsx43
-rw-r--r--server/sonar-web/src/main/js/apps/overview/leak-issues.jsx70
-rw-r--r--server/sonar-web/src/main/js/apps/overview/leak-size.jsx31
-rw-r--r--server/sonar-web/src/main/js/apps/overview/leak.jsx32
-rw-r--r--server/sonar-web/src/main/js/apps/overview/main.jsx101
-rw-r--r--server/sonar-web/src/main/js/apps/overview/meta.jsx67
-rw-r--r--server/sonar-web/src/main/js/apps/overview/nutshell-coverage.jsx47
-rw-r--r--server/sonar-web/src/main/js/apps/overview/nutshell-dups.jsx47
-rw-r--r--server/sonar-web/src/main/js/apps/overview/nutshell-issues.jsx69
-rw-r--r--server/sonar-web/src/main/js/apps/overview/nutshell-size.jsx35
-rw-r--r--server/sonar-web/src/main/js/apps/overview/nutshell.jsx23
-rw-r--r--server/sonar-web/src/main/js/components/common/handlebars-extensions.js4
-rw-r--r--server/sonar-web/src/main/js/helpers/Url.jsx2
-rw-r--r--server/sonar-web/src/main/less/pages.less1
-rw-r--r--server/sonar-web/src/main/less/pages/overview.less190
-rw-r--r--server/sonar-web/src/main/webapp/WEB-INF/app/controllers/dashboard_controller.rb30
-rw-r--r--server/sonar-web/src/main/webapp/WEB-INF/app/controllers/overview_controller.rb29
-rw-r--r--server/sonar-web/src/main/webapp/WEB-INF/app/views/overview/index.html.erb177
-rw-r--r--sonar-core/src/main/resources/org/sonar/l10n/core.properties32
44 files changed, 45 insertions, 1431 deletions
diff --git a/it/it-tests/src/test/resources/server/ServerTest/url_ending_by_jsp.html b/it/it-tests/src/test/resources/server/ServerTest/url_ending_by_jsp.html
index ffb2216a1b3..4e8715c3d18 100644
--- a/it/it-tests/src/test/resources/server/ServerTest/url_ending_by_jsp.html
+++ b/it/it-tests/src/test/resources/server/ServerTest/url_ending_by_jsp.html
@@ -9,12 +9,12 @@
<tbody>
<tr>
<td>open</td>
- <td>/sonar/overview/index/myproject.jsp</td>
+ <td>/sonar/dashboard/index/myproject.jsp</td>
<td></td>
</tr>
<tr>
<td>waitForElementPresent</td>
- <td>css=.overview</td>
+ <td>css=#dashboard</td>
<td></td>
</tr>
</table>
diff --git a/it/it-tests/src/test/resources/ui/i18n/default-locale-is-english.html b/it/it-tests/src/test/resources/ui/i18n/default-locale-is-english.html
index 71123d9ce0c..f2e23f196a1 100644
--- a/it/it-tests/src/test/resources/ui/i18n/default-locale-is-english.html
+++ b/it/it-tests/src/test/resources/ui/i18n/default-locale-is-english.html
@@ -15,17 +15,17 @@
<tbody>
<tr>
<td>open</td>
- <td>/sonar/overview/index?id=sample&locale=foo</td>
+ <td>/sonar/dashboard/index?id=sample&locale=foo</td>
<td></td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.navbar-context</td>
+ <td>css=#content</td>
<td>regexp:.*Jan.*|.*Feb.*|.*Mar.*|.*Apr.*|.*May.*|.*Jun.*|.*Jul.*|.*Aug.*|.*Sep.*|.*Oct.*|.*Nov.*|.*Dec.*</td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.overview</td>
+ <td>css=#content</td>
<td>*0.0%*</td>
</tr>
</tbody>
diff --git a/it/it-tests/src/test/resources/ui/i18n/french-locale.html b/it/it-tests/src/test/resources/ui/i18n/french-locale.html
index 8fd6d8db3dd..74f2f320a02 100644
--- a/it/it-tests/src/test/resources/ui/i18n/french-locale.html
+++ b/it/it-tests/src/test/resources/ui/i18n/french-locale.html
@@ -15,17 +15,17 @@
<tbody>
<tr>
<td>open</td>
- <td>/sonar/overview/index?id=sample&locale=fr</td>
+ <td>/sonar/dashboard/index?id=sample&locale=fr</td>
<td></td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.navbar-context</td>
+ <td>css=#content</td>
<td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.overview</td>
+ <td>css=#content</td>
<td>*0,0%*</td>
</tr>
</tbody>
diff --git a/it/it-tests/src/test/resources/ui/i18n/locale-with-france-country.html b/it/it-tests/src/test/resources/ui/i18n/locale-with-france-country.html
index e8c6431f414..e65cd5e95bf 100644
--- a/it/it-tests/src/test/resources/ui/i18n/locale-with-france-country.html
+++ b/it/it-tests/src/test/resources/ui/i18n/locale-with-france-country.html
@@ -15,17 +15,17 @@
<tbody>
<tr>
<td>open</td>
- <td>/sonar/overview/index?id=sample&locale=fr-FR</td>
+ <td>/sonar/dashboard/index?id=sample&locale=fr-FR</td>
<td></td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.navbar-context</td>
+ <td>css=#content</td>
<td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.overview</td>
+ <td>css=#content</td>
<td>*0,0%*</td>
</tr>
</tbody>
diff --git a/it/it-tests/src/test/resources/ui/i18n/locale-with-swiss-country.html b/it/it-tests/src/test/resources/ui/i18n/locale-with-swiss-country.html
index 6073c0f5127..888f5d8f3a8 100644
--- a/it/it-tests/src/test/resources/ui/i18n/locale-with-swiss-country.html
+++ b/it/it-tests/src/test/resources/ui/i18n/locale-with-swiss-country.html
@@ -15,17 +15,17 @@
<tbody>
<tr>
<td>open</td>
- <td>/sonar/overview/index?id=sample&locale=fr-CH</td>
+ <td>/sonar/dashboard/index?id=sample&locale=fr-CH</td>
<td></td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.navbar-context</td>
+ <td>css=#content</td>
<td>regexp:.*jan.*|.*fév.*|.*mar.*|.*avr.*|.*mai.*|.*juin.*|.*juil.*|.*août.*|.*sept.*|.*oct.*|.*nov.*|.*déc.*</td>
</tr>
<tr>
<td>waitForText</td>
- <td>css=.overview</td>
+ <td>css=#content</td>
<td>*0.0%*</td>
</tr>
</tbody>
diff --git a/server/sonar-web/Gruntfile.coffee b/server/sonar-web/Gruntfile.coffee
index 3e0626d7789..2a35ef057db 100644
--- a/server/sonar-web/Gruntfile.coffee
+++ b/server/sonar-web/Gruntfile.coffee
@@ -149,7 +149,6 @@ module.exports = (grunt) ->
'build-app:measures'
'build-app:metrics'
'build-app:nav'
- 'build-app:overview'
'build-app:project-permissions'
'build-app:provisioning'
'build-app:quality-gates'
diff --git a/server/sonar-web/src/main/js/apps/nav/component/component-nav-menu.jsx b/server/sonar-web/src/main/js/apps/nav/component/component-nav-menu.jsx
index c3679649e63..ae156463086 100644
--- a/server/sonar-web/src/main/js/apps/nav/component/component-nav-menu.jsx
+++ b/server/sonar-web/src/main/js/apps/nav/component/component-nav-menu.jsx
@@ -8,14 +8,24 @@ const SETTINGS_URLS = [
'/project/deletion'
];
-const MORE_URLS = ['/dashboards', '/dashboard', '/plugins/resource'];
-
export default React.createClass({
mixins: [DashboardNameMixin, LinksMixin],
renderOverviewLink() {
- const url = `/overview/index?id=${encodeURIComponent(this.props.component.key)}`;
- return this.renderLink(url, window.t('overview.page'), '/overview');
+ if (_.size(this.props.component.dashboards) === 0) {
+ return null;
+ }
+ let firstDashboard = _.first(this.props.component.dashboards);
+ let url = `/dashboard/index?id=${encodeURIComponent(this.props.component.key)}`;
+ let name = this.getLocalizedDashboardName(firstDashboard.name);
+ return this.renderLink(url, name, () => {
+ /* eslint eqeqeq: 0 */
+ let pathMatch = window.location.pathname === `${window.baseUrl}/dashboard` ||
+ window.location.pathname === `${window.baseUrl}/dashboard/index`;
+ let params = window.getQueryParams();
+ let paramMatch = !params['did'] || params['did'] == firstDashboard.key;
+ return pathMatch && paramMatch ? 'active' : null;
+ });
},
renderComponentsLink() {
@@ -156,12 +166,8 @@ export default React.createClass({
},
renderMore() {
- let isActive = MORE_URLS.some(url => {
- return window.location.href.indexOf(url) !== -1;
- }),
- className = 'dropdown' + (isActive ? ' active' : '');
return (
- <li className={className}>
+ <li className="dropdown">
<a className="dropdown-toggle" data-toggle="dropdown" href="#">
{window.t('more')}&nbsp;<i className="icon-dropdown"></i>
</a>
@@ -175,7 +181,7 @@ export default React.createClass({
},
renderDashboards() {
- let dashboards = (this.props.component.dashboards || []).map(d => {
+ let dashboards = _.rest(this.props.component.dashboards || []).map(d => {
let url = `/dashboard?id=${encodeURIComponent(this.props.component.key)}&did=${d.key}`;
let name = this.getLocalizedDashboardName(d.name);
return this.renderLink(url, name);
diff --git a/server/sonar-web/src/main/js/apps/nav/links-mixin.jsx b/server/sonar-web/src/main/js/apps/nav/links-mixin.jsx
index e807c5a26d0..7e9d76121aa 100644
--- a/server/sonar-web/src/main/js/apps/nav/links-mixin.jsx
+++ b/server/sonar-web/src/main/js/apps/nav/links-mixin.jsx
@@ -7,8 +7,9 @@ export default {
renderLink(url, title, highlightUrl = url) {
let fullUrl = window.baseUrl + url;
+ let check = _.isFunction(highlightUrl) ? highlightUrl : this.activeLink;
return (
- <li key={highlightUrl} className={this.activeLink(highlightUrl)}>
+ <li key={highlightUrl} className={check(highlightUrl)}>
<a href={fullUrl}>{title}</a>
</li>
);
diff --git a/server/sonar-web/src/main/js/apps/overview/app.jsx b/server/sonar-web/src/main/js/apps/overview/app.jsx
deleted file mode 100644
index 475b1c0348f..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/app.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react';
-import Main from './main';
-import Empty from './empty';
-
-const $ = jQuery;
-
-export default {
- start(options) {
- $('html').toggleClass('dashboard-page', options.component.hasSnapshot);
- window.requestMessages().done(() => {
- const el = document.querySelector(options.el);
- const inner = options.component.hasSnapshot ? (
- <Main
- component={options.component}
- gate={options.gate}
- measures={options.measures}
- leak={options.leak}/>
- ) : <Empty/>;
- React.render(inner, el);
- });
- }
-};
diff --git a/server/sonar-web/src/main/js/apps/overview/card.jsx b/server/sonar-web/src/main/js/apps/overview/card.jsx
deleted file mode 100644
index a22146246d3..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/card.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- return <li className="overview-card">{this.props.children}</li>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/cards.jsx b/server/sonar-web/src/main/js/apps/overview/cards.jsx
deleted file mode 100644
index 3d69cf8bf3a..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/cards.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- return <ul className="overview-cards">{this.props.children}</ul>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/empty.jsx b/server/sonar-web/src/main/js/apps/overview/empty.jsx
deleted file mode 100644
index 78c5320a1f8..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/empty.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- return (
- <div className="panel">
- <div className="alert alert-warning">
- {window.t('provisioning.no_analysis')}
- </div>
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/gate-condition.jsx b/server/sonar-web/src/main/js/apps/overview/gate-condition.jsx
deleted file mode 100644
index cd2c4ec4f18..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/gate-condition.jsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import {periodLabel, getPeriodDate} from './helpers/period-label';
-import DrilldownLink from './helpers/drilldown-link';
-
-export default React.createClass({
- render() {
- const
- metricName = window.t('metric', this.props.condition.metric.name, 'name'),
- threshold = this.props.condition.level === 'ERROR' ?
- this.props.condition.error : this.props.condition.warning,
- iconClassName = 'icon-alert-' + this.props.condition.level.toLowerCase(),
- period = this.props.condition.period ?
- `(${periodLabel(this.props.component.periods, this.props.condition.period)})` : null,
- periodDate = getPeriodDate(this.props.component.periods, this.props.condition.period);
-
- return (
- <div>
- <h4 className="overview-gate-condition-metric">{metricName} {period}</h4>
- <div className="overview-gate-condition-value">
- <i className={iconClassName}></i>&nbsp;
- <DrilldownLink component={this.props.component.key} metric={this.props.condition.metric.name}
- period={this.props.condition.period} periodDate={periodDate}>
- <Measure value={this.props.condition.actual} type={this.props.condition.metric.type}/>
- </DrilldownLink>&nbsp;
- <span className="overview-gate-condition-itself">
- {window.t('quality_gates.operator', this.props.condition.op, 'short')}&nbsp;
- <Measure value={threshold} type={this.props.condition.metric.type}/>
- </span>
- </div>
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/gate-conditions.jsx b/server/sonar-web/src/main/js/apps/overview/gate-conditions.jsx
deleted file mode 100644
index dddac46e6e4..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/gate-conditions.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import Cards from './cards';
-import Card from './card';
-import GateCondition from './gate-condition';
-
-export default React.createClass({
- render() {
- const conditions = this.props.gate.conditions
- .filter((c) => {
- return c.level !== 'OK';
- })
- .map((c) => {
- return (
- <Card key={c.metric.name}>
- <GateCondition condition={c} component={this.props.component}/>
- </Card>
- );
- });
- return <Cards>{conditions}</Cards>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/gate.jsx b/server/sonar-web/src/main/js/apps/overview/gate.jsx
deleted file mode 100644
index f805da9cd6a..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/gate.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import GateConditions from './gate-conditions';
-
-export default React.createClass({
- render() {
- if (!this.props.gate || !this.props.gate.level) {
- return null;
- }
-
- const
- badgeClassName = 'badge badge-' + this.props.gate.level.toLowerCase(),
- badgeText = window.t('overview.gate', this.props.gate.level);
-
- return (
- <div className="overview-gate">
- <div className="overview-title">
- {window.t('overview.quality_gate')}
- <span className={badgeClassName}>{badgeText}</span>
- </div>
- <GateConditions gate={this.props.gate} component={this.props.component}/>
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/donut.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/donut.jsx
deleted file mode 100644
index 58ba8a36736..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/donut.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from 'react';
-
-const Sector = React.createClass({
- render() {
- const arc = d3.svg.arc()
- .outerRadius(this.props.radius)
- .innerRadius(this.props.radius - this.props.thickness);
- return <path d={arc(this.props.data)} style={{ fill: this.props.fill }}></path>;
- }
-});
-
-export default React.createClass({
- getDefaultProps() {
- return {
- size: 30,
- thickness: 6
- };
- },
-
- render() {
- const radius = this.props.size / 2;
- const pie = d3.layout.pie().sort(null)
- .value(d => {
- return d.value
- });
- const data = this.props.data;
- const sectors = pie(data).map((d, i) => {
- return <Sector
- key={i}
- data={d}
- fill={data[i].fill}
- radius={radius}
- thickness={this.props.thickness}/>;
- });
- return (
- <svg width={this.props.size} height={this.props.size}>
- <g transform={`translate(${radius}, ${radius})`}>{sectors}</g>
- </svg>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/drilldown-link.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/drilldown-link.jsx
deleted file mode 100644
index 57b2996d26b..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/drilldown-link.jsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import React from 'react';
-import IssuesLink from './issues-link';
-
-export default React.createClass({
- render() {
- if (this.isIssueMeasure()) {
- return this.renderIssuesLink();
- }
-
- let params = { id: this.props.component, metric: this.props.metric };
- if (this.props.period) {
- params.period = this.props.period;
- }
-
- const
- query = Object.keys(params).map(key => {
- return `${key}=${encodeURIComponent(params[key])}`;
- }).join('&'),
- url = `${baseUrl}/drilldown/measures?${query}`;
-
- return <a href={url}>{this.props.children}</a>;
- },
-
- isIssueMeasure() {
- const ISSUE_MEASURES = [
- 'violations',
- 'blocker_violations',
- 'critical_violations',
- 'major_violations',
- 'minor_violations',
- 'info_violations',
- 'new_blocker_violations',
- 'new_critical_violations',
- 'new_major_violations',
- 'new_minor_violations',
- 'new_info_violations',
- 'open_issues',
- 'reopened_issues',
- 'confirmed_issues',
- 'false_positive_issues'
- ];
- return ISSUE_MEASURES.indexOf(this.props.metric) !== -1;
- },
-
- propsToIssueParams() {
- let params = {};
- if (this.props.periodDate) {
- params.createdAfter = moment(this.props.periodDate).format('YYYY-MM-DDTHH:mm:ssZZ');
- }
- switch (this.props.metric) {
- case 'blocker_violations':
- case 'new_blocker_violations':
- _.extend(params, { resolved: 'false', severities: 'BLOCKER' });
- break;
- case 'critical_violations':
- case 'new_critical_violations':
- _.extend(params, { resolved: 'false', severities: 'CRITICAL' });
- break;
- case 'major_violations':
- case 'new_major_violations':
- _.extend(params, { resolved: 'false', severities: 'MAJOR' });
- break;
- case 'minor_violations':
- case 'new_minor_violations':
- _.extend(params, { resolved: 'false', severities: 'MINOR' });
- break;
- case 'info_violations':
- case 'new_info_violations':
- _.extend(params, { resolved: 'false', severities: 'INFO' });
- break;
- case 'open_issues':
- _.extend(params, { resolved: 'false', statuses: 'OPEN' });
- break;
- case 'reopened_issues':
- _.extend(params, { resolved: 'false', statuses: 'REOPENED' });
- break;
- case 'confirmed_issues':
- _.extend(params, { resolved: 'false', statuses: 'CONFIRMED' });
- break;
- case 'false_positive_issues':
- _.extend(params, { resolutions: 'FALSE-POSITIVE' });
- break;
- default:
- _.extend(params, { resolved: 'false' });
- }
- return params;
- },
-
- renderIssuesLink() {
- return (
- <IssuesLink component={this.props.component} params={this.propsToIssueParams()}>
- {this.props.children}
- </IssuesLink>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/gate-link.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/gate-link.jsx
deleted file mode 100644
index 7a5e63d9e15..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/gate-link.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- const url = `${baseUrl}/quality_gates/show/${this.props.gate}`;
- return <a href={url}>{this.props.children}</a>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/issues-link.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/issues-link.jsx
deleted file mode 100644
index 365bee7d643..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/issues-link.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- const params = Object.keys(this.props.params).map((key) => {
- return `${key}=${encodeURIComponent(this.props.params[key])}`;
- }).join('|'),
- url = `${baseUrl}/component_issues/index?id=${encodeURIComponent(this.props.component)}#${params}`;
- return <a href={url}>{this.props.children}</a>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/measure-variation.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/measure-variation.jsx
deleted file mode 100644
index 8c84737524e..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/measure-variation.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- if (this.props.value == null || isNaN(this.props.value)) {
- return null;
- }
- const formatted = window.formatMeasureVariation(this.props.value, this.props.type);
- return <span>{formatted}</span>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/measure.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/measure.jsx
deleted file mode 100644
index 078e1257dbb..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/measure.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- if (this.props.value == null || isNaN(this.props.value)) {
- return null;
- }
- const formatted = window.formatMeasure(this.props.value, this.props.type);
- return <span>{formatted}</span>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/period-label.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/period-label.jsx
deleted file mode 100644
index 996ea01f96b..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/period-label.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-export let periodLabel = (periods, periodIndex) => {
- let period = _.findWhere(periods, { index: periodIndex });
- if (!period) {
- return null;
- }
- return window.tp(`overview.period.${period.mode}`, period.modeParam);
-};
-
-export let getPeriodDate = (periods, periodIndex) => {
- let period = _.findWhere(periods, { index: periodIndex });
- if (!period) {
- return null;
- }
- return moment(period.date).toDate();
-};
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/profile-link.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/profile-link.jsx
deleted file mode 100644
index 3d22d8f4c3d..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/profile-link.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- const url = `${baseUrl}/profiles/show?key=${encodeURIComponent(this.props.profile)}`;
- return <a href={url}>{this.props.children}</a>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/helpers/rating.jsx b/server/sonar-web/src/main/js/apps/overview/helpers/rating.jsx
deleted file mode 100644
index 9b37f948908..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/helpers/rating.jsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react';
-
-export default React.createClass({
- render() {
- if (this.props.value == null || isNaN(this.props.value)) {
- return null;
- }
- const formatted = window.formatMeasure(this.props.value, 'RATING');
- const className = 'rating rating-' + formatted;
- return <span className={className}>{formatted}</span>;
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/leak-coverage.jsx b/server/sonar-web/src/main/js/apps/overview/leak-coverage.jsx
deleted file mode 100644
index 6106e8732db..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/leak-coverage.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import MeasureVariation from './helpers/measure-variation';
-import DrilldownLink from './helpers/drilldown-link';
-import Donut from './helpers/donut';
-
-export default React.createClass({
- render() {
- const
- newCoverage = parseInt(this.props.leak.newCoverage, 10),
- tests = this.props.leak.tests,
- donutData = [
- { value: newCoverage, fill: '#85bb43' },
- { value: 100 - newCoverage, fill: '#d4333f' }
- ];
-
- if (newCoverage == null || isNaN(newCoverage)) {
- return null;
- }
-
- return (
- <Card>
- <div className="measures">
- <div className="measures-chart">
- <Donut data={donutData} size="47"/>
- </div>
- <div className="measure measure-big" data-metric="new_coverage">
- <span className="measure-value">
- <DrilldownLink component={this.props.component.key} metric="new_coverage" period="3">
- <Measure value={newCoverage} type="PERCENT"/>
- </DrilldownLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.new_coverage')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top measures-chart-indent">
- <li>
- <span><MeasureVariation value={tests} type="SHORT_INT"/></span>&nbsp;
- <span>{window.t('overview.metric.tests')}</span>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/leak-dups.jsx b/server/sonar-web/src/main/js/apps/overview/leak-dups.jsx
deleted file mode 100644
index 80ff5441d27..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/leak-dups.jsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React from 'react';
-import Card from './card';
-import MeasureVariation from './helpers/measure-variation';
-import DrilldownLink from './helpers/drilldown-link';
-import Donut from './helpers/donut';
-
-export default React.createClass({
- render() {
- const
- density = this.props.leak.duplications,
- lines = this.props.leak.duplicatedLines,
- donutData = [
- { value: density, fill: '#f3ca8e' },
- { value: 100 - density, fill: '#e6e6e6' }
- ];
-
- if (density == null) {
- return null;
- }
-
- return (
- <Card>
- <div className="measures">
- <div className="measures-chart">
- <Donut data={donutData} size="47"/>
- </div>
- <div className="measure measure-big" data-metric="duplicated_lines_density">
- <span className="measure-value">
- <MeasureVariation value={density} type="PERCENT"/>
- </span>
- <span className="measure-name">{window.t('overview.metric.duplications')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top measures-chart-indent">
- <li>
- <span><MeasureVariation value={lines} type="SHORT_INT"/></span>&nbsp;
- <span>{window.t('overview.metric.duplicated_lines')}</span>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/leak-issues.jsx b/server/sonar-web/src/main/js/apps/overview/leak-issues.jsx
deleted file mode 100644
index 558eb8e95bc..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/leak-issues.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import MeasureVariation from './helpers/measure-variation';
-import IssuesLink from './helpers/issues-link';
-import DrilldownLink from './helpers/drilldown-link';
-import SeverityIcon from 'components/shared/severity-icon';
-import StatusIcon from 'components/shared/status-icon';
-import SeverityHelper from 'components/shared/severity-helper';
-import {getPeriodDate} from './helpers/period-label';
-
-export default React.createClass({
- render() {
- const
- newDebt = this.props.leak.newDebt,
- issues = this.props.leak.newIssues,
- blockerIssues = this.props.leak.newBlockerIssues,
- criticalIssues = this.props.leak.newCriticalIssues,
- issuesToReview = this.props.leak.newOpenIssues + this.props.leak.newReopenedIssues,
- periodDate = moment(getPeriodDate(this.props.component.periods, '3')).format('YYYY-MM-DDTHH:mm:ssZZ');
-
- return (
- <Card>
- <div className="measures">
- <div className="measure measure-big" data-metric="sqale_index">
- <span className="measure-value">
- <IssuesLink component={this.props.component.key}
- params={{ resolved: 'false', createdAfter: periodDate, facetMode: 'debt' }}>
- <Measure value={newDebt} type="SHORT_WORK_DUR"/>
- </IssuesLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.new_debt')}</span>
- </div>
- <div className="measure measure-big" data-metric="violations">
- <span className="measure-value">
- <IssuesLink component={this.props.component.key}
- params={{ resolved: 'false', createdAfter: periodDate }}>
- <Measure value={issues} type="SHORT_INT"/>
- </IssuesLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.new_issues')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top">
- <li>
- <span><SeverityIcon severity="BLOCKER"/></span>&nbsp;
- <IssuesLink component={this.props.component.key}
- params={{ resolved: 'false', createdAfter: periodDate, severities: 'BLOCKER' }}>
- <MeasureVariation value={blockerIssues} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- <li>
- <span><SeverityIcon severity="CRITICAL"/></span>&nbsp;
- <IssuesLink component={this.props.component.key}
- params={{ resolved: 'false', createdAfter: periodDate, severities: 'CRITICAL' }}>
- <MeasureVariation value={criticalIssues} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- <li>
- <span><StatusIcon status="OPEN"/></span>&nbsp;
- <IssuesLink component={this.props.component.key}
- params={{ resolved: 'false', createdAfter: periodDate, statuses: 'OPEN,REOPENED' }}>
- <MeasureVariation value={issuesToReview} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/leak-size.jsx b/server/sonar-web/src/main/js/apps/overview/leak-size.jsx
deleted file mode 100644
index 80cecebd141..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/leak-size.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react';
-import Card from './card';
-import MeasureVariation from './helpers/measure-variation';
-import DrilldownLink from './helpers/drilldown-link';
-
-export default React.createClass({
- render() {
- const
- lines = this.props.leak.lines,
- files = this.props.leak.files;
-
- return (
- <Card>
- <div className="measures">
- <div className="measure measure-big" data-metric="lines">
- <span className="measure-value">
- <MeasureVariation value={lines} type="SHORT_INT"/>
- </span>
- <span className="measure-name">{window.t('overview.metric.lines')}</span>
- </div>
- <div className="measure measure-big" data-metric="files">
- <span className="measure-value">
- <MeasureVariation value={files} type="SHORT_INT"/>
- </span>
- <span className="measure-name">{window.t('overview.metric.files')}</span>
- </div>
- </div>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/leak.jsx b/server/sonar-web/src/main/js/apps/overview/leak.jsx
deleted file mode 100644
index 06dc5501a59..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/leak.jsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react';
-import Cards from './cards';
-import LeakIssues from './leak-issues';
-import LeakCoverage from './leak-coverage';
-import LeakSize from './leak-size';
-import LeakDups from './leak-dups';
-import {periodLabel} from './helpers/period-label';
-
-export default React.createClass({
- render() {
- if (_.size(this.props.component.periods) < 3) {
- return null;
- }
-
- const period = periodLabel(this.props.component.periods, '3');
-
- return (
- <div className="overview-leak">
- <div className="overview-title">
- {window.t('overview.water_leak')}
- <span className="overview-leak-period">{period}</span>
- </div>
- <Cards>
- <LeakIssues component={this.props.component} leak={this.props.leak} measures={this.props.measures}/>
- <LeakCoverage component={this.props.component} leak={this.props.leak}/>
- <LeakDups component={this.props.component} leak={this.props.leak}/>
- <LeakSize component={this.props.component} leak={this.props.leak}/>
- </Cards>
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/main.jsx b/server/sonar-web/src/main/js/apps/overview/main.jsx
deleted file mode 100644
index 5a9408f0821..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/main.jsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import React from 'react';
-import Gate from './gate';
-import Leak from './leak';
-import Nutshell from './nutshell';
-import Meta from './meta';
-import {getPeriodDate} from './helpers/period-label';
-
-const $ = jQuery;
-
-export default React.createClass({
- getInitialState() {
- return { leak: this.props.leak, measures: this.props.measures };
- },
-
- componentDidMount() {
- if (this._hasWaterLeak()) {
- this.requestLeakIssues();
- this.requestLeakDebt();
- }
- this.requestNutshellIssues();
- this.requestNutshellDebt();
- },
-
- _hasWaterLeak() {
- return !!_.findWhere(this.props.component.periods, { index: '3' });
- },
-
- _requestIssues(data) {
- const url = `${baseUrl}/api/issues/search`;
- data.ps = 1;
- data.componentUuids = this.props.component.id;
- return $.get(url, data);
- },
-
- requestLeakIssues() {
- const createdAfter = moment(getPeriodDate(this.props.component.periods, '3')).format('YYYY-MM-DDTHH:mm:ssZZ');
- this._requestIssues({ resolved: 'false', createdAfter, facets: 'severities,statuses' }).done(r => {
- const
- severitiesFacet = _.findWhere(r.facets, { property: 'severities' }).values,
- statusesFacet = _.findWhere(r.facets, { property: 'statuses' }).values;
-
- this.setState({
- leak: _.extend({}, this.state.leak, {
- newIssues: r.total,
- newBlockerIssues: _.findWhere(severitiesFacet, { val: 'BLOCKER' }).count,
- newCriticalIssues: _.findWhere(severitiesFacet, { val: 'CRITICAL' }).count,
- newOpenIssues: _.findWhere(statusesFacet, { val: 'OPEN' }).count,
- newReopenedIssues: _.findWhere(statusesFacet, { val: 'REOPENED' }).count
- })
- });
- });
- },
-
- requestNutshellIssues() {
- this._requestIssues({ resolved: 'false', facets: 'severities,statuses' }).done(r => {
- const
- severitiesFacet = _.findWhere(r.facets, { property: 'severities' }).values,
- statusesFacet = _.findWhere(r.facets, { property: 'statuses' }).values;
-
- this.setState({
- measures: _.extend({}, this.state.measures, {
- issues: r.total,
- blockerIssues: _.findWhere(severitiesFacet, { val: 'BLOCKER' }).count,
- criticalIssues: _.findWhere(severitiesFacet, { val: 'CRITICAL' }).count,
- openIssues: _.findWhere(statusesFacet, { val: 'OPEN' }).count,
- reopenedIssues: _.findWhere(statusesFacet, { val: 'REOPENED' }).count
- })
- });
- });
- },
-
- requestLeakDebt() {
- const createdAfter = moment(getPeriodDate(this.props.component.periods, '3')).format('YYYY-MM-DDTHH:mm:ssZZ');
- this._requestIssues({ resolved: 'false', createdAfter, facets: 'severities', facetMode: 'debt' }).done(r => {
- this.setState({
- leak: _.extend({}, this.state.leak, { newDebt: r.debtTotal })
- });
- });
- },
-
- requestNutshellDebt() {
- this._requestIssues({ resolved: 'false', facets: 'severities', facetMode: 'debt' }).done(r => {
- this.setState({
- measures: _.extend({}, this.state.measures, { debt: r.debtTotal })
- });
- });
- },
-
- render() {
- return (
- <div className="overview">
- <div className="overview-main">
- <Gate component={this.props.component} gate={this.props.gate}/>
- <Leak component={this.props.component} leak={this.state.leak} measures={this.state.measures}/>
- <Nutshell component={this.props.component} measures={this.state.measures}/>
- </div>
- <Meta component={this.props.component}/>
- </div>
- );
- }
-})
diff --git a/server/sonar-web/src/main/js/apps/overview/meta.jsx b/server/sonar-web/src/main/js/apps/overview/meta.jsx
deleted file mode 100644
index 8951b60453c..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/meta.jsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import React from 'react';
-import ProfileLink from './helpers/profile-link';
-import GateLink from './helpers/gate-link';
-
-export default React.createClass({
- render() {
- const
- profiles = (this.props.component.profiles || []).map(profile => {
- return (
- <li key={profile.key}>
- <span className="note little-spacer-right">({profile.language})</span>
- <ProfileLink profile={profile.key}>{profile.name}</ProfileLink>
- </li>
- );
- }),
- links = (this.props.component.links || []).map(link => {
- const iconClassName = `little-spacer-right icon-color-link icon-${link.type}`;
- return (
- <li key={link.type}>
- <i className={iconClassName}></i>
- <a href={link.href} target="_blank">{link.name}</a>
- </li>
- );
- });
-
- const descriptionCard = this.props.component.description ? (
- <div className="overview-card">
- <div className="overview-meta-description">{this.props.component.description}</div>
- </div>
- ) : null,
-
- linksCard = _.size(this.props.component.links) > 0 ? (
- <div className="overview-card">
- <ul className="overview-meta-list">{links}</ul>
- </div>
- ) : null,
-
- profilesCard = _.size(this.props.component.profiles) > 0 ? (
- <div className="overview-card">
- <h4 className="overview-meta-header">{window.t('overview.quality_profiles')}</h4>
- <ul className="overview-meta-list">{profiles}</ul>
- </div>
- ) : null,
-
- gateCard = this.props.component.gate ? (
- <div className="overview-card">
- <h4 className="overview-meta-header">{window.t('overview.quality_gate')}</h4>
- <ul className="overview-meta-list">
- <li>
- {this.props.component.gate.isDefault ?
- <span className="note little-spacer-right">(Default)</span> : null}
- <GateLink gate={this.props.component.gate.key}>{this.props.component.gate.name}</GateLink>
- </li>
- </ul>
- </div>
- ) : null;
-
- return (
- <div className="overview-meta">
- {descriptionCard}
- {linksCard}
- {profilesCard}
- {gateCard}
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/nutshell-coverage.jsx b/server/sonar-web/src/main/js/apps/overview/nutshell-coverage.jsx
deleted file mode 100644
index 763353983cb..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/nutshell-coverage.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import DrilldownLink from './helpers/drilldown-link';
-import Donut from './helpers/donut';
-
-export default React.createClass({
- render() {
- const
- coverage = this.props.measures.coverage,
- tests = this.props.measures.tests,
- donutData = [
- { value: coverage, fill: '#85bb43' },
- { value: 100 - coverage, fill: '#d4333f' }
- ];
-
- if (coverage == null) {
- return null;
- }
-
- return (
- <Card>
- <div className="measures">
- <div className="measures-chart">
- <Donut data={donutData} size="47"/>
- </div>
- <div className="measure measure-big">
- <span className="measure-value">
- <DrilldownLink component={this.props.component.key} metric="overall_coverage">
- <Measure value={coverage} type="PERCENT"/>
- </DrilldownLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.coverage')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top measures-chart-indent">
- <li>
- <DrilldownLink component={this.props.component.key} metric="tests">
- <Measure value={tests} type="SHORT_INT"/>
- </DrilldownLink>&nbsp;
- <span>{window.t('overview.metric.tests')}</span>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/nutshell-dups.jsx b/server/sonar-web/src/main/js/apps/overview/nutshell-dups.jsx
deleted file mode 100644
index 827dc45ae5e..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/nutshell-dups.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import DrilldownLink from './helpers/drilldown-link';
-import Donut from './helpers/donut';
-
-export default React.createClass({
- render() {
- const
- density = this.props.measures.duplications,
- lines = this.props.measures.duplicatedLines,
- donutData = [
- { value: density, fill: '#f3ca8e' },
- { value: 100 - density, fill: '#e6e6e6' }
- ];
-
- if (density == null) {
- return null;
- }
-
- return (
- <Card>
- <div className="measures">
- <div className="measures-chart">
- <Donut data={donutData} size="47"/>
- </div>
- <div className="measure measure-big">
- <span className="measure-value">
- <DrilldownLink component={this.props.component.key} metric="duplicated_lines_density">
- <Measure value={density} type="PERCENT"/>
- </DrilldownLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.duplications')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top measures-chart-indent">
- <li>
- <DrilldownLink component={this.props.component.key} metric="duplicated_lines">
- <Measure value={lines} type="SHORT_INT"/>
- </DrilldownLink>&nbsp;
- <span>{window.t('overview.metric.duplicated_lines')}</span>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/nutshell-issues.jsx b/server/sonar-web/src/main/js/apps/overview/nutshell-issues.jsx
deleted file mode 100644
index d61332cbb01..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/nutshell-issues.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import Rating from './helpers/rating';
-import IssuesLink from './helpers/issues-link';
-import DrilldownLink from './helpers/drilldown-link';
-import SeverityIcon from 'components/shared/severity-icon';
-import SeverityHelper from 'components/shared/severity-helper';
-import StatusIcon from 'components/shared/status-icon';
-
-export default React.createClass({
- render() {
- const
- debt = this.props.measures.debt,
- rating = this.props.measures.sqaleRating,
- issues = this.props.measures.issues,
- blockerIssues = this.props.measures.blockerIssues,
- criticalIssues = this.props.measures.criticalIssues,
- issuesToReview = this.props.measures.openIssues + this.props.measures.reopenedIssues;
-
- return (
- <Card>
- <div className="measures">
- <div className="measure measure-big" data-metric="sqale_rating">
- <DrilldownLink component={this.props.component.key} metric="sqale_rating">
- <Rating value={rating}/>
- </DrilldownLink>
- </div>
- <div className="measure measure-big" data-metric="sqale_index">
- <span className="measure-value">
- <IssuesLink component={this.props.component.key} params={{ resolved: 'false', facetMode: 'debt' }}>
- <Measure value={debt} type="SHORT_WORK_DUR"/>
- </IssuesLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.debt')}</span>
- </div>
- <div className="measure measure-big" data-metric="violations">
- <span className="measure-value">
- <IssuesLink component={this.props.component.key} params={{ resolved: 'false' }}>
- <Measure value={issues} type="SHORT_INT"/>
- </IssuesLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.issues')}</span>
- </div>
- </div>
- <ul className="list-inline big-spacer-top">
- <li>
- <span><SeverityIcon severity="BLOCKER"/></span>&nbsp;
- <IssuesLink component={this.props.component.key} params={{ resolved: 'false', severities: 'BLOCKER' }}>
- <Measure value={blockerIssues} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- <li>
- <span><SeverityIcon severity="CRITICAL"/></span>&nbsp;
- <IssuesLink component={this.props.component.key} params={{ resolved: 'false', severities: 'CRITICAL' }}>
- <Measure value={criticalIssues} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- <li>
- <span><StatusIcon status="OPEN"/></span>&nbsp;
- <IssuesLink component={this.props.component.key} params={{ resolved: 'false', statuses: 'OPEN,REOPENED' }}>
- <Measure value={issuesToReview} type="SHORT_INT"/>
- </IssuesLink>
- </li>
- </ul>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/nutshell-size.jsx b/server/sonar-web/src/main/js/apps/overview/nutshell-size.jsx
deleted file mode 100644
index 366d29c2e7a..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/nutshell-size.jsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import React from 'react';
-import Card from './card';
-import Measure from './helpers/measure';
-import DrilldownLink from './helpers/drilldown-link';
-
-export default React.createClass({
- render() {
- const
- lines = this.props.measures['lines'],
- files = this.props.measures['files'];
-
- return (
- <Card>
- <div className="measures">
- <div className="measure measure-big" data-metric="lines">
- <span className="measure-value">
- <DrilldownLink component={this.props.component.key} metric="lines">
- <Measure value={lines} type="SHORT_INT"/>
- </DrilldownLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.lines')}</span>
- </div>
- <div className="measure measure-big" data-metric="files">
- <span className="measure-value">
- <DrilldownLink component={this.props.component.key} metric="files">
- <Measure value={files} type="SHORT_INT"/>
- </DrilldownLink>
- </span>
- <span className="measure-name">{window.t('overview.metric.files')}</span>
- </div>
- </div>
- </Card>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/apps/overview/nutshell.jsx b/server/sonar-web/src/main/js/apps/overview/nutshell.jsx
deleted file mode 100644
index d645bfaf52e..00000000000
--- a/server/sonar-web/src/main/js/apps/overview/nutshell.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from 'react';
-import Cards from './cards';
-import NutshellIssues from './nutshell-issues';
-import NutshellCoverage from './nutshell-coverage';
-import NutshellSize from './nutshell-size';
-import NutshellDups from './nutshell-dups';
-
-export default React.createClass({
- render() {
- const props = { measures: this.props.measures, component: this.props.component };
- return (
- <div className="overview-nutshell">
- <div className="overview-title">{window.t('overview.project_in_a_nutshell')}</div>
- <Cards>
- <NutshellIssues {...props}/>
- <NutshellCoverage {...props}/>
- <NutshellDups {...props}/>
- <NutshellSize {...props}/>
- </Cards>
- </div>
- );
- }
-});
diff --git a/server/sonar-web/src/main/js/components/common/handlebars-extensions.js b/server/sonar-web/src/main/js/components/common/handlebars-extensions.js
index 6e5d8e03a74..bddf43df1f6 100644
--- a/server/sonar-web/src/main/js/components/common/handlebars-extensions.js
+++ b/server/sonar-web/src/main/js/components/common/handlebars-extensions.js
@@ -33,10 +33,6 @@
return baseUrl + '/dashboard/index?id=' + encodeURIComponent(componentKey);
});
- Handlebars.registerHelper('componentOverviewPermalink', function (componentKey) {
- return baseUrl + '/overview/index?id=' + encodeURIComponent(componentKey);
- });
-
Handlebars.registerHelper('componentDashboardPermalink', function (componentKey, dashboardKey) {
var params = [
{ key: 'id', value: componentKey },
diff --git a/server/sonar-web/src/main/js/helpers/Url.jsx b/server/sonar-web/src/main/js/helpers/Url.jsx
index e88ddb55808..7fa21b44f0f 100644
--- a/server/sonar-web/src/main/js/helpers/Url.jsx
+++ b/server/sonar-web/src/main/js/helpers/Url.jsx
@@ -2,5 +2,5 @@ export function getProjectUrl(project) {
if (typeof project !== 'string') {
throw new TypeError("Project ID or KEY should be passed");
}
- return `${window.baseUrl}/overview?id=${encodeURIComponent(project)}`;
+ return `${window.baseUrl}/dashboard?id=${encodeURIComponent(project)}`;
}
diff --git a/server/sonar-web/src/main/less/pages.less b/server/sonar-web/src/main/less/pages.less
index b0e1b6ce99a..91623b3d1f3 100644
--- a/server/sonar-web/src/main/less/pages.less
+++ b/server/sonar-web/src/main/less/pages.less
@@ -7,4 +7,3 @@
@import "pages/quality-gates";
@import "pages/maintenance";
@import "pages/login";
-@import "pages/overview";
diff --git a/server/sonar-web/src/main/less/pages/overview.less b/server/sonar-web/src/main/less/pages/overview.less
deleted file mode 100644
index e4ec6a5bb44..00000000000
--- a/server/sonar-web/src/main/less/pages/overview.less
+++ /dev/null
@@ -1,190 +0,0 @@
-@import (reference) "../variables";
-@import (reference) "../mixins";
-@import (reference) "../init/type";
-
-.overview {
- display: table;
- width: 100%;
- min-height: ~"calc(100vh - @{navbarGlobalHeight} - @{navbarContextHeight} - @{pageFooterHeight})";
-}
-
-.overview-main {
- display: table-cell;
- vertical-align: top;
- .box-sizing(border-box);
- background-color: #fff;
-}
-
-.overview-gate {
- .clearfix;
- padding: 50px 30px;
-}
-
-.overview-gate-box {
- float: left;
- .size(120px, 70px);
- padding: 10px;
- .box-sizing(border-box);
- line-height: 24px;
- color: #fff;
- font-size: 16px;
- font-weight: 300;
-}
-
-.overview-gate-box-error { background-color: @red; }
-
-.overview-gate-box-warn { background-color: @orange; }
-
-.overview-gate-box-ok { background-color: @green; }
-
-.overview-gate-conditions {
- line-height: 70px;
- font-size: 0;
- white-space: nowrap;
- overflow: hidden;
-
- & > li {
- display: inline-block;
- vertical-align: middle;
- padding: 0 20px;
- .box-sizing(border-box);
- font-size: @baseFontSize;
- line-height: 1;
- }
-}
-
-.overview-gate-condition-metric {
- //color: mix(@baseFontColor, @barBackgroundColor, 70%);
- font-weight: 300;
- font-size: 15px;
- //letter-spacing: 0.03em;
-}
-
-.overview-gate-condition-value {
- margin-top: 8px;
- font-weight: 300;
- font-size: 20px;
-
- i {
- position: relative;
- top: -1px;
- }
-}
-
-.overview-gate-condition-itself {
- padding-left: 4px;
- color: mix(@baseFontColor, @barBackgroundColor, 70%);
- font-size: 13px;
-}
-
-.overview-gate-condition-level {
- margin-top: 8px;
-}
-
-.overview-leak {
- padding: 50px 30px;
- border-top: 1px solid @barBorderColor;
- border-bottom: 1px solid @barBorderColor;
-}
-
-.overview-title {
- margin-bottom: 20px;
- font-size: 24px;
- font-weight: 300;
-
- & > .badge {
- position: relative;
- top: -2px;
- margin-left: 15px;
- padding: 8px 15px;
- font-size: 16px;
- }
-}
-
-.overview-leak-period {
- margin-left: 10px;
- font-size: 16px;
-}
-
-.overview-nutshell {
- padding: 50px 30px;
-}
-
-.overview-cards {
-}
-
-.overview-card {
- display: inline-block;
- vertical-align: top;
- width: 200px;
- margin-right: 30px;
- .box-sizing(border-box);
-
- &:last-child { margin-right: 0; }
-
- .overview-main & {
- font-weight: 300;
- font-size: 14px;
- }
-}
-
-.overview-measure {
- font-size: 28px;
-}
-
-.overview-measure-label {
- font-size: 16px;
-}
-
-.overview-meta {
- display: table-cell;
- vertical-align: top;
- width: 180px;
- padding: 30px;
- border-left: 1px solid @barBorderColor;
- background-color: @barBackgroundColor;
-
- .panel {
- border: none !important;
- }
-}
-
-.overview-meta-description {
- line-height: 1.5;
-}
-
-.overview-meta-header {
- color: #797979;
-}
-
-.overview-meta-list {
- & > li {
- padding-bottom: 4px;
- .text-ellipsis;
- }
-}
-
-@media (max-width: 1200px) {
- .overview {
- display: block;
- }
-
- .overview-main {
- display: block;
- }
-
- .overview-meta {
- display: block;
- width: auto;
- border-top: 1px solid @barBorderColor;
- border-left: none;
- }
-}
-
-@media (min-width: 1201px) {
- .overview-meta .overview-card {
- width: 180px;
- margin-right: 0;
- margin-bottom: 30px;
- }
-}
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/dashboard_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/dashboard_controller.rb
index 9c084dea979..7c6fdc34a30 100644
--- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/dashboard_controller.rb
+++ b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/dashboard_controller.rb
@@ -17,8 +17,6 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-include ERB::Util
-
class DashboardController < ApplicationController
SECTION=Navigation::SECTION_RESOURCE
@@ -27,24 +25,20 @@ class DashboardController < ApplicationController
def index
load_resource()
- if @resource && @resource.display_dashboard? && !params[:did] && !params[:name]
- overview_url = url_for({:controller => 'overview', :action => :index}) + '?id=' + url_encode(@resource.key)
- return redirect_to overview_url
- end
- if !@resource || @resource.display_dashboard?
- redirect_if_bad_component()
- load_dashboard()
- load_authorized_widget_definitions()
- else
- if !@resource || !@snapshot
+ if !@resource || @resource.display_dashboard?
redirect_if_bad_component()
+ load_dashboard()
+ load_authorized_widget_definitions()
else
- # display the layout of the parent without the sidebar, usually the directory, but display the file viewers
- @hide_sidebar = true
- @file = @resource
- @project = @snapshot.parent.project
- @metric=params[:metric]
- render :action => 'no_dashboard'
+ if !@resource || !@snapshot
+ redirect_if_bad_component()
+ else
+ # display the layout of the parent without the sidebar, usually the directory, but display the file viewers
+ @hide_sidebar = true
+ @file = @resource
+ @project = @snapshot.parent.project
+ @metric=params[:metric]
+ render :action => 'no_dashboard'
end
end
end
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/overview_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/overview_controller.rb
deleted file mode 100644
index 746bc651be8..00000000000
--- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/overview_controller.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# SonarQube, open source software quality management tool.
-# Copyright (C) 2008-2014 SonarSource
-# mailto:contact AT sonarsource DOT com
-#
-# SonarQube 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.
-#
-# SonarQube 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.
-#
-class OverviewController < ApplicationController
- before_filter :init_resource_for_user_role
-
- SECTION=Navigation::SECTION_RESOURCE
-
- def index
-
- end
-
-end
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/views/overview/index.html.erb b/server/sonar-web/src/main/webapp/WEB-INF/app/views/overview/index.html.erb
deleted file mode 100644
index f95b57d8e3e..00000000000
--- a/server/sonar-web/src/main/webapp/WEB-INF/app/views/overview/index.html.erb
+++ /dev/null
@@ -1,177 +0,0 @@
-<%
- links_size = @resource.project_links.size
-
- profiles = []
- if @snapshot
- qprofiles_measure = @snapshot.measure(Metric::QUALITY_PROFILES)
- if qprofiles_measure && !qprofiles_measure.data.blank?
- profiles = JSON.parse qprofiles_measure.data
- end
- end
- profiles_size = profiles.size
-
- is_gate_default = false
- gate = nil
- gate_id = Property.value('sonar.qualitygate', @resource && @resource.id, nil)
- unless gate_id
- gate_id=Property.value('sonar.qualitygate', nil, nil)
- is_gate_default = false || gate_id
- end
- if gate_id
- gate = Internal.quality_gates.get(gate_id.to_i)
- end
-%>
-
-<%
- if @snapshot
- m = @snapshot.measure(Metric::QUALITY_GATE_DETAILS)
- if m && !m.data.blank?
- details = JSON.parse m.data
- m.alert_status = details['level']
- raw_conditions = details['conditions']
- conditions = []
- missing_metric = false
- raw_conditions.each do |condition|
- if metric(condition['metric']).nil?
- missing_metric = true
- else
- conditions << condition
- end
- end
- alert_metric = metric(Metric::ALERT_STATUS)
- end
- end
-%>
-
-<% content_for :extra_script do %>
- <script>
- (function () {
- var component = {
- id: '<%= @resource.uuid %>',
- key: '<%= @resource.key %>',
- description: '<%= @resource.description %>',
- hasSnapshot: <%= @snapshot ? true : false %>,
- periods: [
- <%
- if @snapshot && @snapshot.project_snapshot.periods?
- (1..5).each do |index|
- if @snapshot.period_mode(index)
- %>
- {
- index: '<%= index -%>',
- mode: '<%= @snapshot.period_mode(index) -%>',
- modeParam: '<%= @snapshot.period_param(index) -%>',
- date: '<%= @snapshot.period_datetime(index).to_date.strftime('%FT%T%z') -%>'
- },
- <% end %>
- <% end %>
- <% end %>
- ],
- links: [
- <% @resource.project_links.sort.each_with_index do |link, index| %>
- {
- name: '<%= escape_javascript link.name -%>',
- type: '<%= escape_javascript link.link_type -%>',
- href: '<%= escape_javascript link.href -%>'
- }<% if index < links_size - 1 %>, <% end -%>
- <% end %>
- ],
- profiles: [
- <% profiles.each_with_index do |profile, index| %>
- {
- name: '<%= escape_javascript profile['name'] -%>',
- key: '<%= escape_javascript profile['key']-%>',
- language: '<%= escape_javascript Api::Utils.language_name(profile['language']) -%>'
- }<% if index < profiles_size - 1 %>, <% end -%>
- <% end %>
- ],
- <% if gate %>
- gate: {
- name: '<%= escape_javascript gate.getName() -%>',
- key: <%= escape_javascript gate_id -%>,
- isDefault: <%= is_gate_default -%>
- }
- <% end %>
- };
-
- <% if m %>
- var gate = {
- level: '<%= m.alert_status -%>',
- conditions: [
- <% conditions.sort_by {|condition| [ -condition['level'].length, metric(condition['metric']).short_name] }.each do |condition| %>
- <% metric = metric(condition['metric']) %>
- {
- level: '<%= escape_javascript condition['level'] %>',
- metric: {
- name: '<%= escape_javascript metric.name %>',
- type: '<%= escape_javascript metric.value_type %>'
- },
- op: '<%= escape_javascript condition['op'] %>',
- period: '<%= condition['period'] %>',
- warning: '<%= escape_javascript condition['warning'] %>',
- error: '<%= escape_javascript condition['error'] %>',
- actual: '<%= escape_javascript condition['actual'] %>',
- },
- <% end %>
- ]
- };
- <% else %>
- var gate = null;
- <% end %>
-
- var measures = {
- <% if @snapshot %>
-
- // issues
- <% if @snapshot.measure('sqale_rating') %>
- sqaleRating: '<%= @snapshot.measure('sqale_rating').value -%>',
- <% else %>
- sqaleRating: 'A',
- <% end %>
-
- // coverage
- <% if @snapshot.measure('overall_coverage') %>
- coverage: '<%= @snapshot.measure('overall_coverage').value -%>',
- <% end %>
- <% if @snapshot.measure('tests') %>
- tests: '<%= @snapshot.measure('tests').value -%>',
- <% end %>
-
- // duplications
- duplications: '<%= @snapshot.measure('duplicated_lines_density').value -%>',
- duplicatedLines: '<%= @snapshot.measure('duplicated_lines').value -%>',
- duplicatedBlocks: '<%= @snapshot.measure('duplicated_blocks').value -%>',
-
- // size
- lines: '<%= @snapshot.measure('lines').value -%>',
- files: '<%= @snapshot.measure('files').value -%>'
- <% end %>
- };
-
- var leak = {
- <% if @snapshot %>
- // coverage
- <% if @snapshot.measure('new_overall_coverage') %>
- newCoverage: '<%= @snapshot.measure('new_overall_coverage').variation(3) -%>',
- <% end %>
- <% if @snapshot.measure('tests') %>
- tests: '<%= @snapshot.measure('tests').variation(3) -%>',
- <% end %>
-
- // duplications
- duplications: '<%= @snapshot.measure('duplicated_lines_density').variation(3) -%>',
- duplicatedLines: '<%= @snapshot.measure('duplicated_lines').variation(3) -%>',
- duplicatedBlocks: '<%= @snapshot.measure('duplicated_blocks').variation(3) -%>',
-
- // size
- lines: '<%= @snapshot.measure('lines').variation(3) -%>',
- files: '<%= @snapshot.measure('files').variation(3) -%>'
- <% end %>
- };
-
- require(['apps/overview/app'], function (App) {
- App.start({ el: '#content', component: component, gate: gate, measures: measures, leak: leak });
- });
- })();
- </script>
-<% end %>
diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties
index 8590692e193..7ad9f19649f 100644
--- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties
+++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties
@@ -3032,35 +3032,3 @@ update_center.status.COMPATIBLE=Compatible
update_center.status.INCOMPATIBLE=Incompatible
update_center.status.REQUIRES_SYSTEM_UPGRADE=Requires system update
update_center.status.DEPS_REQUIRE_SYSTEM_UPGRADE=Some of dependencies requires system update
-
-
-
-#------------------------------------------------------------------------------
-#
-# OVERVIEW
-#
-#------------------------------------------------------------------------------
-overview.quality_gate=Quality Gate
-overview.quality_profiles=Quality Profiles
-overview.water_leak=Water Leak
-overview.project_in_a_nutshell=Project In a Nutshell
-
-overview.metric.new_coverage=New Coverage
-overview.metric.tests=tests
-overview.metric.duplications=Duplications
-overview.metric.duplicated_lines=lines
-overview.metric.debt=Debt
-overview.metric.issues=Issues
-overview.metric.new_debt=New Debt
-overview.metric.new_issues=New Issues
-overview.metric.lines=Lines
-overview.metric.files=Files
-overview.metric.coverage=Coverage
-
-overview.period.previous_version=since {0}
-overview.period.previous_analysis=since previous analysis
-overview.period.days=last {0} days
-
-overview.gate.ERROR=Failed
-overview.gate.WARN=Warning
-overview.gate.OK=Passed