]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-18964 Add column "Last SonarLint connection" to users list
authorAmbroise C <ambroise.christea@sonarsource.com>
Thu, 13 Apr 2023 09:06:14 +0000 (11:06 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 13 Apr 2023 20:03:05 +0000 (20:03 +0000)
server/sonar-web/src/main/js/apps/users/UsersList.tsx
server/sonar-web/src/main/js/apps/users/__tests__/UsersApp-it.tsx
server/sonar-web/src/main/js/apps/users/components/UserListItem.tsx
server/sonar-web/src/main/js/apps/users/components/__tests__/UserListItem-test.tsx
server/sonar-web/src/main/js/apps/users/components/__tests__/__snapshots__/UserListItem-test.tsx.snap
server/sonar-web/src/main/js/types/users.ts
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 8d20e705bbebe73d1477e3fbfb0569552e614be8..2b230b8cabdfa90fdf93f8c08064055d2978a2c0 100644 (file)
@@ -19,6 +19,7 @@
  */
 import * as React from 'react';
 import { CurrentUserContext } from '../../app/components/current-user/CurrentUserContext';
+import HelpTooltip from '../../components/controls/HelpTooltip';
 import { translate } from '../../helpers/l10n';
 import { IdentityProvider } from '../../types/types';
 import { isLoggedIn, User } from '../../types/users';
@@ -51,6 +52,13 @@ export default function UsersList({
             <th className="nowrap" />
             <th className="nowrap">{translate('my_profile.scm_accounts')}</th>
             <th className="nowrap">{translate('users.last_connection')}</th>
+            <th className="nowrap">
+              {translate('users.last_sonarlint_connection')}
+              <HelpTooltip
+                className="sw-ml-1"
+                overlay={translate('users.last_sonarlint_connection.help_text')}
+              />
+            </th>
             <th className="nowrap">{translate('my_profile.groups')}</th>
             <th className="nowrap">{translate('users.tokens')}</th>
             {(manageProvider === undefined || users.some((u) => !u.managed)) && (
index 23fce172487f8e961a532258d66a8e1f56c03174..e3df7e0e1eb7ce98e728fd63ef249dc313a0b42d 100644 (file)
@@ -39,16 +39,16 @@ const ui = {
   managedFilter: byRole('button', { name: 'managed' }),
   localFilter: byRole('button', { name: 'local' }),
   showMore: byRole('button', { name: 'show_more' }),
-  aliceRow: byRole('row', { name: 'AM Alice Merveille alice.merveille never' }),
+  aliceRow: byRole('row', { name: 'AM Alice Merveille alice.merveille never never' }),
   aliceRowWithLocalBadge: byRole('row', {
-    name: 'AM Alice Merveille alice.merveille local never',
+    name: 'AM Alice Merveille alice.merveille local never never',
   }),
   aliceUpdateGroupButton: byRole('button', { name: 'users.update_users_groups.alice.merveille' }),
   aliceUpdateButton: byRole('button', { name: 'users.manage_user.alice.merveille' }),
   alicedDeactivateButton: byRole('button', { name: 'users.deactivate' }),
   bobUpdateGroupButton: byRole('button', { name: 'users.update_users_groups.bob.marley' }),
   bobUpdateButton: byRole('button', { name: 'users.manage_user.bob.marley' }),
-  bobRow: byRole('row', { name: 'BM Bob Marley bob.marley never' }),
+  bobRow: byRole('row', { name: 'BM Bob Marley bob.marley never never' }),
   loginInput: byRole('textbox', { name: /login/ }),
   userNameInput: byRole('textbox', { name: /name/ }),
   passwordInput: byLabelText(/password/),
index 4d7ed05085f927a564804449fc7e3251e56756f1..601eb637aeae4819daa2ab8194f027089d992f7d 100644 (file)
@@ -62,12 +62,15 @@ export default function UserListItem(props: UserListItemProps) {
         user={user}
         manageProvider={manageProvider}
       />
-      <td className="thin nowrap text-middle">
+      <td className="thin text-middle">
         <UserScmAccounts scmAccounts={user.scmAccounts || []} />
       </td>
       <td className="thin nowrap text-middle">
         <DateFromNow date={user.lastConnectionDate} hourPrecision={true} />
       </td>
+      <td className="thin nowrap text-middle">
+        <DateFromNow date={user.sonarLintLastConnectionDate} hourPrecision={true} />
+      </td>
       <td className="thin nowrap text-middle">
         <UserGroups
           groups={user.groups || []}
index cfd69e9e579d0f3b56bddf00269d993fba008b27..76b5871668529d49f3be9b9d672a222420d5fb4e 100644 (file)
@@ -29,6 +29,7 @@ jest.mock('../../../../components/intl/DateTimeFormatter');
 const user: User = {
   active: true,
   lastConnectionDate: '2019-01-18T15:06:33+0100',
+  sonarLintLastConnectionDate: '2019-01-16T15:06:33+0100',
   local: false,
   login: 'obi',
   name: 'One',
index 513b7808d29c3b7700cad173ad70098adb774d94..536a0a54c2777870e74d720586a4d459048c6114 100644 (file)
@@ -20,11 +20,12 @@ exports[`should render correctly 1`] = `
         "managed": false,
         "name": "One",
         "scmAccounts": [],
+        "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
       }
     }
   />
   <td
-    className="thin nowrap text-middle"
+    className="thin text-middle"
   >
     <UserScmAccounts
       scmAccounts={[]}
@@ -38,6 +39,14 @@ exports[`should render correctly 1`] = `
       hourPrecision={true}
     />
   </td>
+  <td
+    className="thin nowrap text-middle"
+  >
+    <DateFromNow
+      date="2019-01-16T15:06:33+0100"
+      hourPrecision={true}
+    />
+  </td>
   <td
     className="thin nowrap text-middle"
   >
@@ -53,6 +62,7 @@ exports[`should render correctly 1`] = `
           "managed": false,
           "name": "One",
           "scmAccounts": [],
+          "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
         }
       }
     />
@@ -84,6 +94,7 @@ exports[`should render correctly 1`] = `
           "managed": false,
           "name": "One",
           "scmAccounts": [],
+          "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
         }
       }
     />
@@ -111,11 +122,12 @@ exports[`should render correctly without last connection date 1`] = `
         "managed": false,
         "name": "One",
         "scmAccounts": [],
+        "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
       }
     }
   />
   <td
-    className="thin nowrap text-middle"
+    className="thin text-middle"
   >
     <UserScmAccounts
       scmAccounts={[]}
@@ -129,6 +141,14 @@ exports[`should render correctly without last connection date 1`] = `
       hourPrecision={true}
     />
   </td>
+  <td
+    className="thin nowrap text-middle"
+  >
+    <DateFromNow
+      date="2019-01-16T15:06:33+0100"
+      hourPrecision={true}
+    />
+  </td>
   <td
     className="thin nowrap text-middle"
   >
@@ -144,6 +164,7 @@ exports[`should render correctly without last connection date 1`] = `
           "managed": false,
           "name": "One",
           "scmAccounts": [],
+          "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
         }
       }
     />
@@ -175,6 +196,7 @@ exports[`should render correctly without last connection date 1`] = `
           "managed": false,
           "name": "One",
           "scmAccounts": [],
+          "sonarLintLastConnectionDate": "2019-01-16T15:06:33+0100",
         }
       }
     />
index b5a5f55ba4c02e95e2a82f14bb9314880e5c317b..c40de0fde6cd1d1b67b00084a91cba1be1569c34 100644 (file)
@@ -76,6 +76,7 @@ export interface User extends UserBase {
   externalProvider?: string;
   groups?: string[];
   lastConnectionDate?: string;
+  sonarLintLastConnectionDate?: string;
   local: boolean;
   managed: boolean;
   scmAccounts?: string[];
index 6290e025737797a5ea27be161ccfe42f7ac23aba..3d879075e4b52528b791547b049ef6533c8df277 100644 (file)
@@ -4397,6 +4397,8 @@ users.cannot_update_delegated_user=You cannot update the name and email of this
 users.minimum_x_characters=Minimum {0} characters
 users.email=Email
 users.last_connection=Last connection
+users.last_sonarlint_connection=Last SonarLint connection
+users.last_sonarlint_connection.help_text=The last time the user connected to this instance through SonarLint in connected mode.
 users.update_users_groups=Update {0}'s group membership
 users.update_groups=Update Groups
 users.manage_user=Update {0}