contextNavHeightRaw: 9 * grid,
+ pagePadding: '20px',
+
// different
defaultShadow: '0 6px 12px rgba(0, 0, 0, 0.175)',
const header = translate('overview.badges.title');
const fullBadgeOptions = { branch, project, ...badgeOptions };
return (
- <>
+ <div className="overview-meta-card">
<button className="js-project-badges" onClick={this.handleOpen}>
{translate('overview.badges.get_badge')}
</button>
</footer>
</Modal>
)}
- </>
+ </div>
);
}
}
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`should display the modal after click 1`] = `
-<React.Fragment>
+<div
+ className="overview-meta-card"
+>
<button
className="js-project-badges"
onClick={[Function]}
>
overview.badges.get_badge
</button>
-</React.Fragment>
+</div>
`;
exports[`should display the modal after click 2`] = `
</div>
</div>
- <div className="page-sidebar-fixed">
+ <div className="overview-sidebar page-sidebar-fixed">
<Meta
branch={branchName}
component={component}
return (
<div className="overview-meta-card">
- <h4 className="overview-meta-header">{translate('project_activity.page')}</h4>
+ <h4 className="overview-meta-header">
+ {translate('overview.project_activity', this.props.component.qualifier)}
+ </h4>
<PreviewGraph
branch={this.props.branch}
import AnalysesList from '../events/AnalysesList';
import { Visibility, Component, Metric } from '../../../app/types';
import { History } from '../../../api/time-machine';
+import { translate } from '../../../helpers/l10n';
import { MeasureEnhanced } from '../../../helpers/measures';
interface Props {
const isProject = qualifier === 'TRK';
const isPrivate = visibility === Visibility.Private;
- const hasDescription = !!description;
- const hasQualityProfiles = Array.isArray(qualityProfiles) && qualityProfiles.length > 0;
- const hasQualityGate = !!qualityGate;
-
- const shouldShowQualityProfiles = isProject && hasQualityProfiles;
- const shouldShowQualityGate = isProject && hasQualityGate;
- const hasOrganization = component.organization != null && organizationsEnabled;
-
return (
<div className="overview-meta">
- {hasDescription && (
- <div className="overview-meta-card overview-meta-description">{description}</div>
- )}
-
- <MetaSize branch={branch} component={component} measures={this.props.measures} />
-
- {isProject && (
- <MetaTags component={component} onComponentChange={this.props.onComponentChange} />
- )}
+ <div className="overview-meta-card">
+ <h4 className="overview-meta-header">
+ {translate('overview.about_this_project', qualifier)}
+ </h4>
+ {description !== undefined && <p className="overview-meta-description">{description}</p>}
+ {isProject && (
+ <MetaTags component={component} onComponentChange={this.props.onComponentChange} />
+ )}
+ <MetaSize branch={branch} component={component} measures={this.props.measures} />
+ </div>
<AnalysesList
branch={branch}
qualifier={component.qualifier}
/>
- {shouldShowQualityGate && (
- <MetaQualityGate
- gate={qualityGate}
- organization={hasOrganization && component.organization}
- />
- )}
-
- {shouldShowQualityProfiles && (
- <MetaQualityProfiles
- component={component}
- customOrganizations={organizationsEnabled}
- organization={component.organization}
- profiles={qualityProfiles}
- />
+ {isProject && (
+ <div className="overview-meta-card">
+ {qualityGate && (
+ <MetaQualityGate
+ organization={organizationsEnabled ? component.organization : undefined}
+ qualityGate={qualityGate}
+ />
+ )}
+
+ {qualityProfiles &&
+ qualityProfiles.length > 0 && (
+ <MetaQualityProfiles
+ headerClassName={qualityGate ? 'big-spacer-top' : undefined}
+ organization={organizationsEnabled ? component.organization : undefined}
+ profiles={qualityProfiles}
+ />
+ )}
+ </div>
)}
{isProject && <MetaLinks component={component} />}
- <MetaKey component={component} />
-
- {hasOrganization && <MetaOrganizationKey component={component} />}
+ <div className="overview-meta-card">
+ <MetaKey componentKey={component.key} qualifier={component.qualifier} />
+ {organizationsEnabled && <MetaOrganizationKey organization={component.organization} />}
+ </div>
{onSonarCloud &&
isProject &&
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-import React from 'react';
-import { translate } from '../../../helpers/l10n';
-
-const MetaKey = ({ component }) => {
- return (
- <div className="overview-meta-card">
- <h4 className="overview-meta-header">{translate('key')}</h4>
- <input
- className="overview-key"
- type="text"
- value={component.key}
- readOnly={true}
- onClick={e => e.target.select()}
- />
- </div>
- );
-};
-
-export default MetaKey;
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import * as React from 'react';
+import ClipboardButton from '../../../components/controls/ClipboardButton';
+import { translate } from '../../../helpers/l10n';
+
+interface Props {
+ componentKey: string;
+ qualifier: string;
+}
+
+export default function MetaKey({ componentKey, qualifier }: Props) {
+ return (
+ <>
+ <h4 className="overview-meta-header">{translate('overview.project_key', qualifier)}</h4>
+ <div className="display-flex-center">
+ <input className="overview-key" type="text" value={componentKey} readOnly={true} />
+ <ClipboardButton className="little-spacer-left" copyValue={componentKey} />
+ </div>
+ </>
+ );
+}
import { getProjectLinks, ProjectLink } from '../../../api/projectLinks';
import { orderLinks } from '../../project-admin/links/utils';
import { LightComponent } from '../../../app/types';
+import { translate } from '../../../helpers/l10n';
interface Props {
component: LightComponent;
return (
<div className="overview-meta-card">
+ <h4 className="overview-meta-header">{translate('overview.external_links')}</h4>
<ul className="overview-meta-list">
{orderedLinks.map(link => <MetaLink key={link.id} link={link} />)}
</ul>
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-import React from 'react';
-import { translate } from '../../../helpers/l10n';
-
-const MetaOrganizationKey = ({ component }) => {
- return (
- <div className="overview-meta-card">
- <h4 className="overview-meta-header">{translate('organization_key')}</h4>
- <input
- className="overview-key"
- type="text"
- value={component.organization}
- readOnly={true}
- onClick={e => e.target.select()}
- />
- </div>
- );
-};
-
-export default MetaOrganizationKey;
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import * as React from 'react';
+import { translate } from '../../../helpers/l10n';
+import ClipboardButton from '../../../components/controls/ClipboardButton';
+
+interface Props {
+ organization: string;
+}
+
+export default function MetaOrganizationKey({ organization }: Props) {
+ return (
+ <>
+ <h4 className="overview-meta-header big-spacer-top">{translate('organization_key')}</h4>
+ <div className="display-flex-center">
+ <input className="overview-key" type="text" value={organization} readOnly={true} />
+ <ClipboardButton className="little-spacer-left" copyValue={organization} />
+ </div>
+ </>
+ );
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-import React from 'react';
-import { Link } from 'react-router';
-import { translate } from '../../../helpers/l10n';
-import { getQualityGateUrl } from '../../../helpers/urls';
-
-const MetaQualityGate = ({ gate, organization }) => {
- return (
- <div className="overview-meta-card">
- <h4 className="overview-meta-header">{translate('overview.quality_gate')}</h4>
-
- <ul className="overview-meta-list">
- <li>
- {gate.isDefault && (
- <span className="note spacer-right">{'(' + translate('default') + ')'}</span>
- )}
- <Link to={getQualityGateUrl(gate.key, organization)}>{gate.name}</Link>
- </li>
- </ul>
- </div>
- );
-};
-
-export default MetaQualityGate;
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import * as React from 'react';
+import { Link } from 'react-router';
+import { translate } from '../../../helpers/l10n';
+import { getQualityGateUrl } from '../../../helpers/urls';
+
+interface Props {
+ organization?: string;
+ qualityGate: { isDefault?: boolean; key: string; name: string };
+}
+
+export default function MetaQualityGate({ qualityGate, organization }: Props) {
+ return (
+ <>
+ <h4 className="overview-meta-header">{translate('overview.quality_gate')}</h4>
+
+ <ul className="overview-meta-list">
+ <li>
+ {qualityGate.isDefault && (
+ <span className="note spacer-right">{'(' + translate('default') + ')'}</span>
+ )}
+ <Link to={getQualityGateUrl(qualityGate.key, organization)}>{qualityGate.name}</Link>
+ </li>
+ </ul>
+ </>
+ );
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2018 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-// @flow
-import React from 'react';
-import { connect } from 'react-redux';
-import { Link } from 'react-router';
-import Tooltip from '../../../components/controls/Tooltip';
-import { translate, translateWithParameters } from '../../../helpers/l10n';
-import { getQualityProfileUrl } from '../../../helpers/urls';
-import { searchRules } from '../../../api/rules';
-import { getLanguages } from '../../../store/rootReducer';
-
-class MetaQualityProfiles extends React.PureComponent {
- /*:: mounted: boolean; */
-
- /*:: props: {
- component: { organization: string },
- customOrganizations: boolean,
- languages: { [string]: { name: string } },
- organization: string | void;
- profiles: Array<{ key: string, language: string, name: string }>
- };
-*/
-
- state = {
- deprecatedByKey: {}
- };
-
- componentDidMount() {
- this.mounted = true;
- this.loadDeprecatedRules();
- }
-
- componentWillUnmount() {
- this.mounted = false;
- }
-
- loadDeprecatedRules() {
- const requests = this.props.profiles.map(profile =>
- this.loadDeprecatedRulesForProfile(profile.key)
- );
- Promise.all(requests).then(
- responses => {
- if (this.mounted) {
- const deprecatedByKey = {};
- responses.forEach((count, i) => {
- const profileKey = this.props.profiles[i].key;
- deprecatedByKey[profileKey] = count;
- });
- this.setState({ deprecatedByKey });
- }
- },
- () => {}
- );
- }
-
- loadDeprecatedRulesForProfile(profileKey) {
- const data = {
- activation: 'true',
- organization: this.props.organization,
- ps: 1,
- qprofile: profileKey,
- statuses: 'DEPRECATED'
- };
- return searchRules(data).then(r => r.total);
- }
-
- getDeprecatedRulesCount(profile) {
- const count = this.state.deprecatedByKey[profile.key];
- return count || 0;
- }
-
- renderProfile(profile) {
- const languageFromStore = this.props.languages[profile.language];
- const languageName = languageFromStore ? languageFromStore.name : profile.language;
-
- const path = this.props.customOrganizations
- ? getQualityProfileUrl(profile.name, profile.language, this.props.component.organization)
- : getQualityProfileUrl(profile.name, profile.language);
-
- const inner = (
- <div className="text-ellipsis">
- <span className="note spacer-right">{'(' + languageName + ')'}</span>
- <Link to={path}>{profile.name}</Link>
- </div>
- );
-
- const count = this.getDeprecatedRulesCount(profile);
-
- if (count > 0) {
- const tooltip = translateWithParameters('overview.deprecated_profile', count);
- return (
- <Tooltip key={profile.key} overlay={tooltip}>
- <li className="overview-deprecated-rules">{inner}</li>
- </Tooltip>
- );
- }
-
- return <li key={profile.key}>{inner}</li>;
- }
-
- render() {
- const { profiles } = this.props;
-
- return (
- <div className="overview-meta-card">
- <h4 className="overview-meta-header">{translate('overview.quality_profiles')}</h4>
-
- <ul className="overview-meta-list">
- {profiles.map(profile => this.renderProfile(profile))}
- </ul>
- </div>
- );
- }
-}
-
-const mapStateToProps = state => ({
- languages: getLanguages(state)
-});
-
-export default connect(mapStateToProps)(MetaQualityProfiles);
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Link } from 'react-router';
+import * as classNames from 'classnames';
+import Tooltip from '../../../components/controls/Tooltip';
+import { translate, translateWithParameters } from '../../../helpers/l10n';
+import { getQualityProfileUrl } from '../../../helpers/urls';
+import { searchRules } from '../../../api/rules';
+import { getLanguages } from '../../../store/rootReducer';
+
+interface StateProps {
+ languages: { [key: string]: { name: string } };
+}
+
+interface OwnProps {
+ headerClassName?: string;
+ organization?: string;
+ profiles: { key: string; language: string; name: string }[];
+}
+
+interface State {
+ deprecatedByKey: { [key: string]: number };
+}
+
+class MetaQualityProfiles extends React.PureComponent<StateProps & OwnProps, State> {
+ mounted: boolean;
+ state: State = { deprecatedByKey: {} };
+
+ componentDidMount() {
+ this.mounted = true;
+ this.loadDeprecatedRules();
+ }
+
+ componentWillUnmount() {
+ this.mounted = false;
+ }
+
+ loadDeprecatedRules() {
+ const requests = this.props.profiles.map(profile =>
+ this.loadDeprecatedRulesForProfile(profile.key)
+ );
+ Promise.all(requests).then(
+ responses => {
+ if (this.mounted) {
+ const deprecatedByKey: { [key: string]: number } = {};
+ responses.forEach((count, i) => {
+ const profileKey = this.props.profiles[i].key;
+ deprecatedByKey[profileKey] = count;
+ });
+ this.setState({ deprecatedByKey });
+ }
+ },
+ () => {}
+ );
+ }
+
+ loadDeprecatedRulesForProfile(profileKey: string) {
+ const data = {
+ activation: 'true',
+ organization: this.props.organization,
+ ps: 1,
+ qprofile: profileKey,
+ statuses: 'DEPRECATED'
+ };
+ return searchRules(data).then(r => r.total);
+ }
+
+ getDeprecatedRulesCount(profile: { key: string }) {
+ const count = this.state.deprecatedByKey[profile.key];
+ return count || 0;
+ }
+
+ renderProfile(profile: { key: string; language: string; name: string }) {
+ const languageFromStore = this.props.languages[profile.language];
+ const languageName = languageFromStore ? languageFromStore.name : profile.language;
+
+ const path = getQualityProfileUrl(profile.name, profile.language, this.props.organization);
+
+ const inner = (
+ <div className="text-ellipsis">
+ <span className="note spacer-right">{'(' + languageName + ')'}</span>
+ <Link to={path}>{profile.name}</Link>
+ </div>
+ );
+
+ const count = this.getDeprecatedRulesCount(profile);
+
+ if (count > 0) {
+ const tooltip = translateWithParameters('overview.deprecated_profile', count);
+ return (
+ <Tooltip key={profile.key} overlay={tooltip}>
+ <li className="overview-deprecated-rules">{inner}</li>
+ </Tooltip>
+ );
+ }
+
+ return <li key={profile.key}>{inner}</li>;
+ }
+
+ render() {
+ const { headerClassName, profiles } = this.props;
+
+ return (
+ <>
+ <h4 className={classNames('overview-meta-header', headerClassName)}>
+ {translate('overview.quality_profiles')}
+ </h4>
+
+ <ul className="overview-meta-list">
+ {profiles.map(profile => this.renderProfile(profile))}
+ </ul>
+ </>
+ );
+ }
+}
+
+const mapStateToProps = (state: any) => ({
+ languages: getLanguages(state)
+});
+
+export default connect<StateProps, {}, OwnProps>(mapStateToProps)(MetaQualityProfiles);
}
return (
- <div id="overview-size" className="overview-meta-card">
+ <div className="big-spacer-top" id="overview-size">
{this.props.component.qualifier === 'APP' && this.renderProjects()}
{this.renderLoC(ncloc)}
{this.renderLoCDistribution()}
if (this.canUpdateTags()) {
return (
- <div className="overview-meta-card overview-meta-tags" ref={card => (this.card = card)}>
+ <div className="big-spacer-top overview-meta-tags" ref={card => (this.card = card)}>
<button
className="button-link"
onClick={this.handleClick}
);
} else {
return (
- <div className="overview-meta-card overview-meta-tags">
+ <div className="big-spacer-top overview-meta-tags">
<TagsList
allowUpdate={false}
className="note"
exports[`should open the tag selector on click 1`] = `
<div
- className="overview-meta-card overview-meta-tags"
+ className="big-spacer-top overview-meta-tags"
>
<button
className="button-link"
exports[`should open the tag selector on click 2`] = `
<div
- className="overview-meta-card overview-meta-tags"
+ className="big-spacer-top overview-meta-tags"
>
<button
className="button-link"
exports[`should open the tag selector on click 3`] = `
<div
- className="overview-meta-card overview-meta-tags"
+ className="big-spacer-top overview-meta-tags"
>
<button
className="button-link"
exports[`should render with tags and admin rights 1`] = `
<div
- className="overview-meta-card overview-meta-tags"
+ className="big-spacer-top overview-meta-tags"
>
<button
className="button-link"
exports[`should render without tags and admin rights 1`] = `
<div
- className="overview-meta-card overview-meta-tags"
+ className="big-spacer-top overview-meta-tags"
>
<TagsList
allowUpdate={false}
transition: transform 0.5s ease, opacity 0.5s ease;
}
+.overview-sidebar {
+ margin-top: calc(-1 * var(--pagePadding));
+ margin-bottom: calc(-1 * var(--pagePadding));
+ margin-left: var(--pagePadding);
+ padding-left: calc(var(--pagePadding) - 1px);
+ padding-top: var(--pagePadding);
+ padding-bottom: var(--pagePadding);
+ border-left: 1px solid var(--barBorderColor);
+}
+
/*
* Title
*/
.overview-meta-card {
min-width: 200px;
- padding-bottom: 20px;
box-sizing: border-box;
}
+.overview-meta-card + .overview-meta-card {
+ margin-top: calc(2 * var(--gridSize));
+ padding-top: calc(2 * var(--gridSize) - 1px);
+ border-top: 1px solid var(--barBorderColor);
+}
+
.overview-meta-description {
+ margin-top: calc(-0.5 * var(--gridSize));
line-height: 1.5;
+ color: var(--secondFontColor);
}
.overview-meta-header {
+ margin-bottom: calc(0.5 * var(--gridSize));
color: var(--baseFontColor);
}
}
.overview-analysis + .overview-analysis {
- margin-top: 8px;
- padding-top: 8px;
- border-top: 1px solid var(--barBorderColor);
+ margin-top: calc(2 * var(--gridSize));
}
.overview-analysis-graph {
overview.started_on_x=Started on {0}
overview.last_analysis_on_x=Last analysis on {0}
overview.on_new_code=On New Code
+overview.about_this_project.APP=About This Application
+overview.about_this_project.TRK=About This Project
+overview.about_this_project.BRC=About This Sub-Project
+overview.about_this_project.DIR=About This Directory
+overview.project_activity.APP=Application Activity
+overview.project_activity.TRK=Project Activity
+overview.project_activity.BRC=Sub-Project Activity
+overview.project_activity.DIR=Directory Activity
+overview.external_links=External Links
+overview.project_key.APP=Application Key
+overview.project_key.TRK=Project Key
+overview.project_key.BRC=Sub-Project Key
+overview.project_key.DIR=Directory Key
overview.metric.code_smells=Code Smells
overview.metric.new_code_smells=New Code Smells