diff options
Diffstat (limited to 'server')
38 files changed, 31 insertions, 1385 deletions
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')} <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> - <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> - <span className="overview-gate-condition-itself"> - {window.t('quality_gates.operator', this.props.condition.op, 'short')} - <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> - <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> - <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> - <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> - <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> - <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> - <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> - <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> - <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> - <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> - <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 %> |