*/
import { differenceBy } from 'lodash';
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { Outlet } from 'react-router-dom';
import { getProjectAlmBinding, validateProjectAlmBinding } from '../../api/alm-settings';
import { getBranches, getPullRequests } from '../../api/branches';
isMainBranch,
isPullRequest,
} from '../../helpers/branch-like';
+import { translateWithParameters } from '../../helpers/l10n';
import { HttpStatus } from '../../helpers/request';
import { getPortfolioUrl } from '../../helpers/urls';
import {
return (
<div>
+ <Helmet
+ defer={false}
+ titleTemplate={translateWithParameters(
+ 'page_title.template.with_instance',
+ component?.name ?? ''
+ )}
+ />
{component &&
!([ComponentQualifier.File, ComponentQualifier.TestFile] as string[]).includes(
component.qualifier
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
+import { translate } from '../../helpers/l10n';
export default function FormattingHelp() {
return (
<div className="page page-limited">
+ <Helmet defer={false} title={translate('formatting.page')} />
<h2 className="spacer-bottom">Formatting Syntax</h2>
<table className="width-100 data zebra">
<thead>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { setSimpleSettingValue } from '../../api/settings';
import { Button } from '../../components/controls/buttons';
import { whenLoggedIn } from '../../components/hoc/whenLoggedIn';
return (
<div className="plugin-risk-consent-page">
+ <Helmet defer={false} title={translate('plugin_risk_consent.page')} />
<div className="plugin-risk-consent-content boxed-group">
<div className="boxed-group-inner text-center">
<h1 className="big-spacer-bottom">{translate('plugin_risk_consent.title')}</h1>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import ResetPasswordForm from '../../components/common/ResetPasswordForm';
import { whenLoggedIn } from '../../components/hoc/whenLoggedIn';
import { translate } from '../../helpers/l10n';
export function ResetPassword({ currentUser }: ResetPasswordProps) {
return (
<div className="page-wrapper-simple">
+ <Helmet defer={false} title={translate('my_account.reset_password.page')} />
<div className="page-simple">
<h1 className="text-center huge">{translate('my_account.reset_password')}</h1>
<p className="text-center huge-spacer-top huge-spacer-bottom">
<div
className="page page-limited"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="formatting.page"
+ />
<h2
className="spacer-bottom"
>
<div
className="plugin-risk-consent-page"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="plugin_risk_consent.page"
+ />
<div
className="plugin-risk-consent-content boxed-group"
>
<div
className="page-wrapper-simple"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="my_account.reset_password.page"
+ />
<div
className="page-simple"
>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
-import { Helmet } from 'react-helmet-async';
import Favorite from '../../../../components/controls/Favorite';
import { ProjectAlmBindingResponse } from '../../../../types/alm-settings';
import { BranchLike } from '../../../../types/branch-like';
const { branchLikes, component, currentBranchLike, currentUser, projectBinding } = props;
return (
- <>
- <Helmet title={component.name} />
- <div className="display-flex-center flex-shrink">
- <Breadcrumb component={component} currentBranchLike={currentBranchLike} />
- {isLoggedIn(currentUser) && (
- <Favorite
- className="spacer-left"
- component={component.key}
- favorite={Boolean(component.isFavorite)}
- qualifier={component.qualifier}
+ <div className="display-flex-center flex-shrink">
+ <Breadcrumb component={component} currentBranchLike={currentBranchLike} />
+ {isLoggedIn(currentUser) && (
+ <Favorite
+ className="spacer-left"
+ component={component.key}
+ favorite={Boolean(component.isFavorite)}
+ qualifier={component.qualifier}
+ />
+ )}
+ {currentBranchLike && (
+ <>
+ <BranchLikeNavigation
+ branchLikes={branchLikes}
+ component={component}
+ currentBranchLike={currentBranchLike}
+ projectBinding={projectBinding}
/>
- )}
- {currentBranchLike && (
- <>
- <BranchLikeNavigation
- branchLikes={branchLikes}
- component={component}
- currentBranchLike={currentBranchLike}
- projectBinding={projectBinding}
- />
- <CurrentBranchLikeMergeInformation currentBranchLike={currentBranchLike} />
- </>
- )}
- </div>
- </>
+ <CurrentBranchLikeMergeInformation currentBranchLike={currentBranchLike} />
+ </>
+ )}
+ </div>
);
}
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`should render correctly 1`] = `
-<Fragment>
- <Helmet
- defer={true}
- encodeSpecialCharacters={true}
- prioritizeSeoTags={false}
- title="MyProject"
- />
- <div
- className="display-flex-center flex-shrink"
- >
- <Breadcrumb
- component={
- {
- "breadcrumbs": [],
- "key": "my-project",
- "name": "MyProject",
- "qualifier": "TRK",
- "qualityGate": {
- "isDefault": true,
- "key": "30",
+<div
+ className="display-flex-center flex-shrink"
+>
+ <Breadcrumb
+ component={
+ {
+ "breadcrumbs": [],
+ "key": "my-project",
+ "name": "MyProject",
+ "qualifier": "TRK",
+ "qualityGate": {
+ "isDefault": true,
+ "key": "30",
+ "name": "Sonar way",
+ },
+ "qualityProfiles": [
+ {
+ "deleted": false,
+ "key": "my-qp",
+ "language": "ts",
"name": "Sonar way",
},
- "qualityProfiles": [
- {
- "deleted": false,
- "key": "my-qp",
- "language": "ts",
- "name": "Sonar way",
- },
- ],
- "tags": [],
- }
+ ],
+ "tags": [],
+ }
+ }
+ currentBranchLike={
+ {
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": false,
+ "name": "branch-11",
}
- currentBranchLike={
+ }
+ />
+ <Favorite
+ className="spacer-left"
+ component="my-project"
+ favorite={false}
+ qualifier="TRK"
+ />
+ <withAvailableFeaturesContext(Component)
+ branchLikes={
+ [
{
"analysisDate": "2018-01-01",
"excludedFromPurge": true,
"isMain": false,
"name": "branch-11",
- }
- }
- />
- <Favorite
- className="spacer-left"
- component="my-project"
- favorite={false}
- qualifier="TRK"
- />
- <withAvailableFeaturesContext(Component)
- branchLikes={
- [
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": false,
- "name": "branch-11",
- },
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": false,
- "name": "branch-1",
- },
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": true,
- "name": "master",
- },
- {
- "analysisDate": "2018-01-01",
- "base": "master",
- "branch": "feature/foo/bar",
- "key": "1",
- "target": "master",
- "title": "PR-1",
- },
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": false,
- "name": "branch-12",
- },
- {
- "analysisDate": "2018-01-01",
- "base": "master",
- "branch": "feature/foo/bar",
- "key": "2",
- "target": "master",
- "title": "PR-2",
- },
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": false,
- "name": "branch-3",
- },
- {
- "analysisDate": "2018-01-01",
- "excludedFromPurge": true,
- "isMain": false,
- "name": "branch-2",
- },
- {
- "analysisDate": "2018-01-01",
- "base": "master",
- "branch": "feature/foo/bar",
- "isOrphan": true,
- "key": "2",
- "target": "llb-100",
- "title": "PR-2",
- },
- ]
- }
- component={
+ },
{
- "breadcrumbs": [],
- "key": "my-project",
- "name": "MyProject",
- "qualifier": "TRK",
- "qualityGate": {
- "isDefault": true,
- "key": "30",
- "name": "Sonar way",
- },
- "qualityProfiles": [
- {
- "deleted": false,
- "key": "my-qp",
- "language": "ts",
- "name": "Sonar way",
- },
- ],
- "tags": [],
- }
- }
- currentBranchLike={
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": false,
+ "name": "branch-1",
+ },
+ {
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": true,
+ "name": "master",
+ },
+ {
+ "analysisDate": "2018-01-01",
+ "base": "master",
+ "branch": "feature/foo/bar",
+ "key": "1",
+ "target": "master",
+ "title": "PR-1",
+ },
{
"analysisDate": "2018-01-01",
"excludedFromPurge": true,
"isMain": false,
- "name": "branch-11",
- }
- }
- />
- <Memo(CurrentBranchLikeMergeInformation)
- currentBranchLike={
+ "name": "branch-12",
+ },
+ {
+ "analysisDate": "2018-01-01",
+ "base": "master",
+ "branch": "feature/foo/bar",
+ "key": "2",
+ "target": "master",
+ "title": "PR-2",
+ },
{
"analysisDate": "2018-01-01",
"excludedFromPurge": true,
"isMain": false,
- "name": "branch-11",
- }
+ "name": "branch-3",
+ },
+ {
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": false,
+ "name": "branch-2",
+ },
+ {
+ "analysisDate": "2018-01-01",
+ "base": "master",
+ "branch": "feature/foo/bar",
+ "isOrphan": true,
+ "key": "2",
+ "target": "llb-100",
+ "title": "PR-2",
+ },
+ ]
+ }
+ component={
+ {
+ "breadcrumbs": [],
+ "key": "my-project",
+ "name": "MyProject",
+ "qualifier": "TRK",
+ "qualityGate": {
+ "isDefault": true,
+ "key": "30",
+ "name": "Sonar way",
+ },
+ "qualityProfiles": [
+ {
+ "deleted": false,
+ "key": "my-qp",
+ "language": "ts",
+ "name": "Sonar way",
+ },
+ ],
+ "tags": [],
+ }
+ }
+ currentBranchLike={
+ {
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": false,
+ "name": "branch-11",
}
- />
- </div>
-</Fragment>
+ }
+ />
+ <Memo(CurrentBranchLikeMergeInformation)
+ currentBranchLike={
+ {
+ "analysisDate": "2018-01-01",
+ "excludedFromPurge": true,
+ "isMain": false,
+ "name": "branch-11",
+ }
+ }
+ />
+</div>
`;
import A11ySkipTarget from '../../components/a11y/A11ySkipTarget';
import Suggestions from '../../components/embed-docs-modal/Suggestions';
import handleRequiredAuthentication from '../../helpers/handleRequiredAuthentication';
-import { translate } from '../../helpers/l10n';
+import { translate, translateWithParameters } from '../../helpers/l10n';
import { CurrentUser, LoggedInUser } from '../../types/users';
import './account.css';
import Nav from './components/Nav';
return (
<div id="account-page">
<Suggestions suggestions="account" />
- <Helmet defaultTitle={title} defer={false} titleTemplate={`%s - ${title}`} />
+ <Helmet
+ defaultTitle={title}
+ defer={false}
+ titleTemplate={translateWithParameters(
+ 'page_title.template.with_category',
+ translate('my_account.page')
+ )}
+ />
<A11ySkipTarget anchor="account_main" />
<header className="account-header">
<div className="account-container clearfix">
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import HelpTooltip from '../../../components/controls/HelpTooltip';
import { whenLoggedIn } from '../../../components/hoc/whenLoggedIn';
import { translate } from '../../../helpers/l10n';
return (
<div className="account-body account-container account-profile">
+ <Helmet defer={false} title={translate('my_account.profile')} />
<div className="boxed-group">
{renderLogin()}
{renderEmail()}
if (!types) {
return (
<div className="page page-limited">
+ <Helmet defer={false} title={translate('background_tasks.page')} />
<i className="spinner" />
</div>
);
<div
className="page page-limited"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="background_tasks.page"
+ />
<i
className="spinner"
/>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { SubmitButton } from '../../components/controls/buttons';
import { Location } from '../../components/hoc/withRouter';
import { Alert } from '../../components/ui/Alert';
return (
<div className="page-wrapper-simple">
+ <Helmet defer={false} title={translate('users.change_admin_password.page')} />
<div className="page-simple">
{success ? (
<Alert variant="success">
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import withAvailableFeatures, {
WithAvailableFeaturesProps,
} from '../../../app/components/available-features/withAvailableFeatures';
import withComponentContext from '../../../app/components/componentContext/withComponentContext';
import Suggestions from '../../../components/embed-docs-modal/Suggestions';
import { isPullRequest } from '../../../helpers/branch-like';
+import { translate } from '../../../helpers/l10n';
import { ProjectAlmBindingResponse } from '../../../types/alm-settings';
import { BranchLike } from '../../../types/branch-like';
import { isPortfolioLike } from '../../../types/component';
return null;
}
- return isPullRequest(branchLike) ? (
- <main>
- <Suggestions suggestions="pull_requests" />
- <PullRequestOverview branchLike={branchLike} component={component} />
- </main>
- ) : (
- <main>
- <Suggestions suggestions="overview" />
+ return (
+ <>
+ <Helmet defer={false} title={translate('overview.page')} />
+ {isPullRequest(branchLike) ? (
+ <main>
+ <Suggestions suggestions="pull_requests" />
+ <PullRequestOverview branchLike={branchLike} component={component} />
+ </main>
+ ) : (
+ <main>
+ <Suggestions suggestions="overview" />
- {!component.analysisDate && (
- <EmptyOverview
- branchLike={branchLike}
- branchLikes={branchLikes}
- component={component}
- hasAnalyses={isPending || isInProgress}
- projectBinding={projectBinding}
- />
- )}
+ {!component.analysisDate && (
+ <EmptyOverview
+ branchLike={branchLike}
+ branchLikes={branchLikes}
+ component={component}
+ hasAnalyses={isPending || isInProgress}
+ projectBinding={projectBinding}
+ />
+ )}
- {component.analysisDate && (
- <BranchOverview
- branch={branchLike}
- branchesEnabled={branchSupportEnabled}
- component={component}
- projectBinding={projectBinding}
- />
+ {component.analysisDate && (
+ <BranchOverview
+ branch={branchLike}
+ branchesEnabled={branchSupportEnabled}
+ component={component}
+ projectBinding={projectBinding}
+ />
+ )}
+ </main>
)}
- </main>
+ </>
);
}
import classNames from 'classnames';
import { debounce } from 'lodash';
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { getNewCodePeriod, resetNewCodePeriod, setNewCodePeriod } from '../../../api/newCodePeriod';
import withAppStateContext from '../../../app/components/app-state/withAppStateContext';
import withAvailableFeatures, {
return (
<>
<Suggestions suggestions="project_baseline" />
+ <Helmet defer={false} title={translate('project_baseline.page')} />
<div className="page page-limited">
<AppHeader canAdmin={!!appState.canAdmin} />
{loading ? (
<Suggestions
suggestions="project_baseline"
/>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_baseline.page"
+ />
<div
className="page page-limited"
>
<Suggestions
suggestions="project_baseline"
/>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_baseline.page"
+ />
<div
className="page page-limited"
>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import withComponentContext from '../../../app/components/componentContext/withComponentContext';
import { translate } from '../../../helpers/l10n';
import { BranchLike } from '../../../types/branch-like';
return (
<div className="page page-limited" id="project-branch-like">
<header className="page-header">
+ <Helmet defer={false} title={translate('project_branch_pull_request.page')} />
<h1>{translate('project_branch_pull_request.page')}</h1>
<LifetimeInformation />
</header>
<header
className="page-header"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_branch_pull_request.page"
+ />
<h1>
project_branch_pull_request.page
</h1>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { getActivity } from '../../api/ce';
import { getStatus } from '../../api/project-dump';
import withAvailableFeatures, {
return (
<div className="page page-limited" id="project-dump">
+ <Helmet defer={false} title={translate('project_dump.page')} />
<header className="page-header">
<h1 className="page-title">{translate('project_dump.page')}</h1>
<div className="page-description">
className="page page-limited"
id="project-dump"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_dump.page"
+ />
<header
className="page-header"
>
className="page page-limited"
id="project-dump"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_dump.page"
+ />
<header
className="page-header"
>
className="page page-limited"
id="project-dump"
>
+ <Helmet
+ defer={false}
+ encodeSpecialCharacters={true}
+ prioritizeSeoTags={false}
+ title="project_dump.page"
+ />
<header
className="page-header"
>
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import { Location } from '../../../components/hoc/withRouter';
import { Alert } from '../../../components/ui/Alert';
import DeferredSpinner from '../../../components/ui/DeferredSpinner';
<h1 className="login-title text-center big-spacer-bottom">
{translate('login.login_to_sonarqube')}
</h1>
-
+ <Helmet defer={false} title={translate('login.page')} />
{loading ? (
<DeferredSpinner loading={loading} timeout={0} />
) : (
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
+import { Helmet } from 'react-helmet-async';
import Link from '../../../components/common/Link';
import { getCookie } from '../../../helpers/cookies';
import { translate } from '../../../helpers/l10n';
const message = decodeURIComponent(getCookie('AUTHENTICATION-ERROR') || '');
return (
<div className="page-wrapper-simple" id="bd">
+ <Helmet defer={false} title={translate('unauthorized.page')} />
<div className="page-simple" id="nonav">
<div className="text-center">
<p id="unauthorized">{translate('unauthorized.message')}</p>
function Wrapper({ children }: { children: React.ReactElement }) {
return (
<IntlProvider defaultLocale="en" locale="en">
- <MemoryRouter initialEntries={[pathname]}>
- <Routes>
- <Route path="*" element={children} />
- </Routes>
- </MemoryRouter>
+ <HelmetProvider>
+ <MemoryRouter initialEntries={[pathname]}>
+ <Routes>
+ <Route path="*" element={children} />
+ </Routes>
+ </MemoryRouter>
+ </HelmetProvider>
</IntlProvider>
);
}
page_title.template.default=%s - SonarQube
page_title.template.with_category=%s - {0} - SonarQube
+page_title.template.with_instance={0} - %s - SonarQube
overview.page=Overview
code.page=Code
permissions.page=Permissions
#
#------------------------------------------------------------------------------
-quality_profiles.page_title_changelog_x={0} - Quality profile changelog
-quality_profiles.page_title_compare_x={0} - Quality profile comparison
+quality_profiles.page_title_changelog_x={0} Changelog
+quality_profiles.page_title_compare_x={0} Comparison
quality_profiles.new_profile=New Quality Profile
quality_profiles.compare_with=Compare with
quality_profiles.filter_by=Filter profiles by
user.login_or_email_used_as_scm_account=Login and email are automatically considered as SCM accounts
user.x_deleted={0} (deleted)
+login.page=Log in
login.login_to_sonarqube=Log in to SonarQube
login.login_with_x=Log in with {0}
login.more_options=More options
login.authentication_failed=Authentication failed
login.logout_failed=Logout failed
+unauthorized.page=Unauthorized
unauthorized.message=You're not authorized to access this page. Please contact the administrator.
unauthorized.reason=Reason:
my_account.add_project.bitbucketcloud=Bitbucket Cloud
my_account.add_project.github=GitHub
my_account.add_project.gitlab=GitLab
+my_account.reset_password.page=Update password
my_account.reset_password=Update your password
my_account.reset_password.explain=This account should not use the default password.
# HELP
#
#------------------------------------------------------------------------------
+formatting.page=Formatting
formatting.helplink=Formatting Help
formatting.example.link=For a hyperlink, write: [link label](https://www.domain.com)
marketplace.risk_consent.installation=You can install plugins directly from the list below after you acknowledge the risk.
marketplace.risk_consent.action=I understand the risk
+plugin_risk_consent.page=Plugin risk consent
plugin_risk_consent.title=Installation of plugins
plugin_risk_consent.description=A plugin has been detected.
plugin_risk_consent.description2=Plugins are not provided by SonarSource and are therefore installed at your own risk. SonarSource disclaims all liability for installing and using such plugins.
users.tokens.new_token_created=New token "{0}" has been created. Make sure you copy it now, you won't be able to see it again!
users.generate_new_token=Generate New Token
users.new_token=New token value
+users.change_admin_password.page=Change password
users.change_admin_password.instance_is_at_risk=Secure your SonarQube instance
users.change_admin_password.header=Default Administrator credentials are still used
users.change_admin_password.description=Your SonarQube instance is still using default administrator credentials. You must change the password for the 'admin' account to secure your SonarQube instance.