]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22853 Correctly navigate user in case of sync failure (#11591)
authorSarath Nair <91882341+sarath-nair-sonarsource@users.noreply.github.com>
Fri, 23 Aug 2024 08:43:56 +0000 (10:43 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 23 Aug 2024 20:02:33 +0000 (20:02 +0000)
server/sonar-web/src/main/js/app/components/AlmSynchronisationWarning.tsx
server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx
server/sonar-web/src/main/js/app/components/GitLabSynchronisationWarning.tsx
server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index be2ee41fbd7b61cbb3111baaf78cefc3f9d69542..c7b7663fa7cd9b948544c52c460683dfa7c7eec0 100644 (file)
@@ -25,20 +25,23 @@ import { CheckIcon, FlagMessage, FlagWarningIcon, themeColor } from 'design-syst
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { translate, translateWithParameters } from '../../helpers/l10n';
+import { AlmKeys } from '../../types/alm-settings';
 import { AlmSyncStatus } from '../../types/provisioning';
 import { TaskStatuses } from '../../types/tasks';
 
 interface SynchronisationWarningProps {
   data: AlmSyncStatus;
+  provisionedBy: AlmKeys.GitHub | AlmKeys.GitLab;
   short?: boolean;
 }
 
 interface LastSyncProps {
   info: AlmSyncStatus['lastSync'];
+  provisionedBy: AlmKeys.GitHub | AlmKeys.GitLab;
   short?: boolean;
 }
 
-function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
+function LastSyncAlert({ info, provisionedBy, short }: Readonly<LastSyncProps>) {
   if (info === undefined) {
     return null;
   }
@@ -62,21 +65,24 @@ function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
           {warningMessage ? (
             <FormattedMessage
               defaultMessage={translate(
-                'settings.authentication.github.synchronization_successful.with_warning',
+                'settings.authentication.synchronization_successful.with_warning',
               )}
-              id="settings.authentication.github.synchronization_successful.with_warning"
+              id="settings.authentication.synchronization_successful.with_warning"
               values={{
                 date: formattedDate,
                 details: (
-                  <Link className="sw-ml-2" to="/admin/settings?category=authentication&tab=github">
-                    {translate('settings.authentication.github.synchronization_details_link')}
+                  <Link
+                    className="sw-ml-2"
+                    to={`/admin/settings?category=authentication&tab=${provisionedBy}`}
+                  >
+                    {translate('settings.authentication.synchronization_details_link')}
                   </Link>
                 ),
               }}
             />
           ) : (
             translateWithParameters(
-              'settings.authentication.github.synchronization_successful',
+              'settings.authentication.synchronization_successful',
               formattedDate,
             )
           )}
@@ -86,14 +92,15 @@ function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
       <FlagMessage variant="error">
         <div>
           <FormattedMessage
-            defaultMessage={translate(
-              'settings.authentication.github.synchronization_failed_short',
-            )}
-            id="settings.authentication.github.synchronization_failed_short"
+            defaultMessage={translate('settings.authentication.synchronization_failed_short')}
+            id="settings.authentication.synchronization_failed_short"
             values={{
               details: (
-                <Link className="sw-ml-2" to="/admin/settings?category=authentication&tab=github">
-                  {translate('settings.authentication.github.synchronization_details_link')}
+                <Link
+                  className="sw-ml-2"
+                  to={`/admin/settings?category=authentication&tab=${provisionedBy}`}
+                >
+                  {translate('settings.authentication.synchronization_details_link')}
                 </Link>
               ),
             }}
@@ -114,7 +121,7 @@ function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
           {status === TaskStatuses.Success ? (
             <>
               {translateWithParameters(
-                'settings.authentication.github.synchronization_successful',
+                'settings.authentication.synchronization_successful',
                 formattedDate,
               )}
 
@@ -126,7 +133,7 @@ function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
             <React.Fragment key={`synch-alert-${finishedAt}`}>
               <div>
                 {translateWithParameters(
-                  'settings.authentication.github.synchronization_failed',
+                  'settings.authentication.synchronization_failed',
                   formattedDate,
                 )}
               </div>
@@ -146,16 +153,14 @@ function LastSyncAlert({ info, short }: Readonly<LastSyncProps>) {
   );
 }
 
-export default function AlmSynchronisationWarning({
-  data,
-  short,
-}: Readonly<SynchronisationWarningProps>) {
+export default function AlmSynchronisationWarning(props: Readonly<SynchronisationWarningProps>) {
+  const { data, provisionedBy, short } = props;
   const loadingLabel =
     data.nextSync &&
     translate(
       data.nextSync.status === TaskStatuses.Pending
-        ? 'settings.authentication.github.synchronization_pending'
-        : 'settings.authentication.github.synchronization_in_progress',
+        ? 'settings.authentication.synchronization_pending'
+        : 'settings.authentication.synchronization_in_progress',
     );
 
   return (
@@ -168,7 +173,7 @@ export default function AlmSynchronisationWarning({
         </div>
       )}
 
-      <LastSyncAlert short={short} info={data.lastSync} />
+      <LastSyncAlert short={short} info={data.lastSync} provisionedBy={provisionedBy} />
     </>
   );
 }
index 12c1592adb77d67a23f60ec887e76911633be5f6..3a6c1eb24c1296f041280a23f48509513cca418e 100644 (file)
@@ -19,6 +19,7 @@
  */
 import * as React from 'react';
 import { useGitHubSyncStatusQuery } from '../../queries/identity-provider/github';
+import { AlmKeys } from '../../types/alm-settings';
 import AlmSynchronisationWarning from './AlmSynchronisationWarning';
 
 interface Props {
@@ -32,7 +33,7 @@ function GitHubSynchronisationWarning({ short }: Readonly<Props>) {
     return null;
   }
 
-  return <AlmSynchronisationWarning short={short} data={data} />;
+  return <AlmSynchronisationWarning short={short} data={data} provisionedBy={AlmKeys.GitHub} />;
 }
 
 export default GitHubSynchronisationWarning;
index 806882fa76bd42f1f1bf3457d94ca880b18c0ae0..4afc872b933648bf45ea342199043bdb19c989b5 100644 (file)
@@ -19,6 +19,7 @@
  */
 import * as React from 'react';
 import { useGitLabSyncStatusQuery } from '../../queries/identity-provider/gitlab';
+import { AlmKeys } from '../../types/alm-settings';
 import AlmSynchronisationWarning from './AlmSynchronisationWarning';
 
 interface Props {
@@ -32,7 +33,7 @@ function GitLabSynchronisationWarning({ short }: Readonly<Props>) {
     return null;
   }
 
-  return <AlmSynchronisationWarning short={short} data={data} />;
+  return <AlmSynchronisationWarning short={short} data={data} provisionedBy={AlmKeys.GitLab} />;
 }
 
 export default GitLabSynchronisationWarning;
index 42eda7113ff67409823c26dd179a6fa10ee9ec7f..2201fe6f32a6be5619877149fcd69db58f45e333 100644 (file)
@@ -152,6 +152,7 @@ const ui = {
   githubProvisioningSuccess: byText(/synchronization_successful/),
   githubProvisioningWarning: byText(/synchronization_successful.with_warning/),
   githubProvisioningAlert: byText(/synchronization_failed_short/),
+  githubProvisioningAlertDetailsLink: byText(/synchronization_failed_short/).byRole('link'),
   expiresInSelector: byRole('combobox', { name: 'users.tokens.expires_in' }),
 };
 
@@ -673,6 +674,10 @@ describe('in manage mode', () => {
       });
       renderUsersApp([Feature.GithubProvisioning]);
       expect(await ui.githubProvisioningAlert.find()).toBeInTheDocument();
+      expect(ui.githubProvisioningAlertDetailsLink.get()).toHaveAttribute(
+        'href',
+        '/admin/settings?category=authentication&tab=github',
+      );
       expect(screen.queryByText('Error Message')).not.toBeInTheDocument();
       expect(ui.githubProvisioningSuccess.query()).not.toBeInTheDocument();
     });
index d5961c4c853953b2063c0728b6434ed4892e8960..061841c2f798910ebee0993cdeda836f9bc1cb95 100644 (file)
@@ -1601,14 +1601,7 @@ settings.authentication.github.form.allowUsersToSignUp.description=Allow new use
 settings.authentication.github.form.projectVisibility.name=Provision project visibility
 settings.authentication.github.form.projectVisibility.description=Change project visibility based on GitHub repository visibility. If disabled, every provisioned project will be private in SonarQube and visible only to users with explicit GitHub permissions for the corresponding repository. Changes take effect at the next synchronization.
 settings.authentication.github.synchronize_now=Synchronize now
-settings.authentication.github.synchronization_in_progress=Synchronization is in progress.
-settings.authentication.github.synchronization_pending=Synchronization is pending.
 settings.authentication.github.synchronization_finish=Synchronization is done.
-settings.authentication.github.synchronization_successful=Last synchronization was done {0} ago.
-settings.authentication.github.synchronization_successful.with_warning=Last synchronization was done {date} ago with warnings. {details}
-settings.authentication.github.synchronization_failed=Last synchronization failed {0} ago.
-settings.authentication.github.synchronization_failed_short=Last synchronization failed. {details}
-settings.authentication.github.synchronization_details_link=More details
 settings.authentication.github.configuration.validation.details=View details
 settings.authentication.github.configuration.validation.valid.short=Configuration is valid.
 settings.authentication.github.configuration.validation.valid=Configuration is valid for {0}. {1} organizations will be synced.
@@ -1679,6 +1672,13 @@ settings.authentication.gitlab.configuration.insecure=BitBucket Authentication a
 # COMMON
 settings.authentication.configuration.validity_check_loading=Checking the configuration
 settings.authentication.configuration.test=Test configuration
+settings.authentication.synchronization_pending=Synchronization is pending.
+settings.authentication.synchronization_in_progress=Synchronization is in progress.
+settings.authentication.synchronization_successful.with_warning=Last synchronization was done {date} ago with warnings. {details}
+settings.authentication.synchronization_details_link=More details
+settings.authentication.synchronization_successful=Last synchronization was done {0} ago.
+settings.authentication.synchronization_failed_short=Last synchronization failed. {details}
+settings.authentication.synchronization_failed=Last synchronization failed {0} ago.
 
 # SAML
 settings.authentication.form.create.saml=New SAML configuration