]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19633 Some links are badly formatted when SQ is configured with a root URL
authorstanislavh <stanislav.honcharov@sonarsource.com>
Wed, 5 Jul 2023 12:03:51 +0000 (14:03 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 6 Jul 2023 20:03:12 +0000 (20:03 +0000)
server/sonar-web/src/main/js/apps/projectDump/components/Export.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileExporters.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/ProfileExporters-test.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/SamlAuthenticationTab.tsx
server/sonar-web/src/main/js/components/common/FormattingTips.tsx
server/sonar-web/src/main/js/helpers/urls.ts

index 2e3f9fe9dcb83e1d4a864fd03418f7216fc66bef..c97edfef2fca5fb5ea4f1648b78decb3a31c4747 100644 (file)
@@ -25,7 +25,6 @@ import DateFromNow from '../../../components/intl/DateFromNow';
 import DateTimeFormatter from '../../../components/intl/DateTimeFormatter';
 import { Alert } from '../../../components/ui/Alert';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
-import { getBaseUrl } from '../../../helpers/system';
 import { DumpStatus, DumpTask } from '../../../types/project-dump';
 
 interface Props {
@@ -100,7 +99,7 @@ export default class Export extends React.Component<Props> {
 
   renderWhenExportFailed() {
     const { componentKey } = this.props;
-    const detailsUrl = `${getBaseUrl()}/project/background_tasks?id=${encodeURIComponent(
+    const detailsUrl = `/project/background_tasks?id=${encodeURIComponent(
       componentKey
     )}&status=FAILED&taskType=PROJECT_EXPORT`;
 
index ae138ecec41689a4caaf121a195dca9cb31a6175..a8569f1c1cd24f3cf3ba4f06e8d9f4e68a8377ec 100644 (file)
@@ -22,7 +22,6 @@ import { getQualityProfileExporterUrl } from '../../../api/quality-profiles';
 import Link from '../../../components/common/Link';
 import { Alert } from '../../../components/ui/Alert';
 import { translate } from '../../../helpers/l10n';
-import { getBaseUrl } from '../../../helpers/system';
 import { Exporter, Profile } from '../types';
 
 interface Props {
@@ -30,42 +29,34 @@ interface Props {
   profile: Profile;
 }
 
-export default class ProfileExporters extends React.PureComponent<Props> {
-  getExportUrl(exporter: Exporter) {
-    const { profile } = this.props;
-    return `${getBaseUrl()}${getQualityProfileExporterUrl(exporter, profile)}`;
-  }
-
-  render() {
-    const { exporters, profile } = this.props;
-    const exportersForLanguage = exporters.filter((e) => e.languages.includes(profile.language));
+export default function ProfileExporters({ exporters, profile }: Props) {
+  const exportersForLanguage = exporters.filter((e) => e.languages.includes(profile.language));
 
-    if (exportersForLanguage.length === 0) {
-      return null;
-    }
+  if (exportersForLanguage.length === 0) {
+    return null;
+  }
 
-    return (
-      <div className="boxed-group quality-profile-exporters">
-        <h2>{translate('quality_profiles.exporters')}</h2>
-        <div className="boxed-group-inner">
-          <Alert className="big-spacer-bottom" variant="warning">
-            {translate('quality_profiles.exporters.deprecated')}
-          </Alert>
-          <ul>
-            {exportersForLanguage.map((exporter, index) => (
-              <li
-                className={index > 0 ? 'spacer-top' : undefined}
-                data-key={exporter.key}
-                key={exporter.key}
-              >
-                <Link to={this.getExportUrl(exporter)} target="_blank">
-                  {exporter.name}
-                </Link>
-              </li>
-            ))}
-          </ul>
-        </div>
+  return (
+    <div className="boxed-group quality-profile-exporters">
+      <h2>{translate('quality_profiles.exporters')}</h2>
+      <div className="boxed-group-inner">
+        <Alert className="big-spacer-bottom" variant="warning">
+          {translate('quality_profiles.exporters.deprecated')}
+        </Alert>
+        <ul>
+          {exportersForLanguage.map((exporter, index) => (
+            <li
+              className={index > 0 ? 'spacer-top' : undefined}
+              data-key={exporter.key}
+              key={exporter.key}
+            >
+              <Link to={getQualityProfileExporterUrl(exporter, profile)} target="_blank">
+                {exporter.name}
+              </Link>
+            </li>
+          ))}
+        </ul>
       </div>
-    );
-  }
+    </div>
+  );
 }
index 061197515125e646f3541861b395aeda76614562..ca8d96a1520555e615028679f3cf89a4668d5f48 100644 (file)
@@ -20,6 +20,7 @@
 import { shallow } from 'enzyme';
 import * as React from 'react';
 import { mockQualityProfile, mockQualityProfileExporter } from '../../../../helpers/testMocks';
+import { FCProps } from '../../../../types/misc';
 import ProfileExporters from '../ProfileExporters';
 
 it('should render correctly', () => {
@@ -27,9 +28,9 @@ it('should render correctly', () => {
   expect(wrapper).toMatchSnapshot();
 });
 
-function shallowRender(props: Partial<ProfileExporters['props']> = {}) {
+function shallowRender(props: Partial<FCProps<typeof ProfileExporters>> = {}) {
   const profile = mockQualityProfile();
-  return shallow<ProfileExporters>(
+  return shallow(
     <ProfileExporters
       exporters={[mockQualityProfileExporter({ languages: [profile.language] })]}
       profile={profile}
index edc40991d95275174c2db92678f78d18c3772679..edd22a7a4d6fd0a6ac663f2a404f8f0fb9f45192 100644 (file)
@@ -30,7 +30,6 @@ import DeleteIcon from '../../../../components/icons/DeleteIcon';
 import EditIcon from '../../../../components/icons/EditIcon';
 import { Alert } from '../../../../components/ui/Alert';
 import { translate } from '../../../../helpers/l10n';
-import { getBaseUrl } from '../../../../helpers/system';
 import { ExtendedSettingDefinition } from '../../../../types/settings';
 import { useSaveValueMutation } from '../../queries/settings';
 import { getPropertyName } from '../../utils';
@@ -150,11 +149,7 @@ export default function SamlAuthenticationTab(props: SamlAuthenticationProps) {
               </Button>
             </div>
             <div>
-              <Link
-                className="button spacer-right"
-                target="_blank"
-                to={`${getBaseUrl()}${CONFIG_TEST_PATH}`}
-              >
+              <Link className="button spacer-right" target="_blank" to={CONFIG_TEST_PATH}>
                 {translate('settings.authentication.saml.form.test')}
               </Link>
               <Button className="spacer-right" onClick={handleCreateConfiguration}>
index 8405308bf1805e77e24d472d1b35c2d41a67080c..3ea9e7b7bea1c2a4561eb4df75cbfd078023ed61 100644 (file)
@@ -20,6 +20,7 @@
 import { Link, Note } from 'design-system';
 import React from 'react';
 import { translate } from '../../helpers/l10n';
+import { getBaseUrl } from '../../helpers/system';
 import { getFormattingHelpUrl } from '../../helpers/urls';
 
 export interface FormattingTipsProps {
@@ -30,7 +31,7 @@ export default function FormattingTips({ className }: FormattingTipsProps) {
   const handleClick = React.useCallback((evt: React.MouseEvent<HTMLAnchorElement>) => {
     evt.preventDefault();
     window.open(
-      getFormattingHelpUrl(),
+      `${getBaseUrl()}${getFormattingHelpUrl()}`,
       'Formatting',
       'height=300,width=600,scrollbars=1,resizable=1'
     );
index 4945c1be868e12ffef957b8206666a92f679b7ad..b6bf974eb3d530c84ab1f1a59f4f31f5a4b245b0 100644 (file)
@@ -361,7 +361,7 @@ export function getRuleUrl(rule: string) {
 }
 
 export function getFormattingHelpUrl(): string {
-  return getBaseUrl() + '/formatting/help';
+  return '/formatting/help';
 }
 
 export function getCodeUrl(