]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7024 show project specific dispatcher labels
authorStas Vilchik <stas.vilchik@sonarsource.com>
Thu, 21 Sep 2017 08:37:47 +0000 (10:37 +0200)
committerEric Hartmann <hartmann.eric@gmail.Com>
Mon, 2 Oct 2017 11:03:35 +0000 (13:03 +0200)
server/sonar-web/src/main/js/apps/account/notifications/NotificationsList.js
server/sonar-web/src/main/js/apps/account/notifications/ProjectNotifications.js
server/sonar-web/src/main/js/apps/account/notifications/__tests__/NotificationsList-test.js
server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/NotificationsList-test.js.snap
server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/ProjectNotifications-test.js.snap
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 2c90aee9251560d11e1ae257a74e0b58b1e4ffed..af7a219e3503d128188ac318874a497b57d9192e 100644 (file)
@@ -19,7 +19,7 @@
  */
 import React from 'react';
 import Checkbox from '../../../components/controls/Checkbox';
-import { translate } from '../../../helpers/l10n';
+import { translate, hasMessage } from '../../../helpers/l10n';
 /*:: import type {
   Notification,
   NotificationsState,
@@ -33,6 +33,7 @@ export default class NotificationsList extends React.PureComponent {
     onRemove: (n: Notification) => void,
     channels: ChannelsState,
     checkboxId: (string, string) => string,
+    project?: boolean,
     types: TypesState,
     notifications: NotificationsState
   };
@@ -52,6 +53,15 @@ export default class NotificationsList extends React.PureComponent {
     }
   }
 
+  getDispatcherLabel(dispatcher /*: string */) {
+    const globalMessageKey = ['notification.dispatcher', dispatcher];
+    const projectMessageKey = [...globalMessageKey, 'project'];
+    const shouldUseProjectMessage = this.props.project && hasMessage(...projectMessageKey);
+    return shouldUseProjectMessage
+      ? translate(...projectMessageKey)
+      : translate(...globalMessageKey);
+  }
+
   render() {
     const { channels, checkboxId, types } = this.props;
 
@@ -59,7 +69,7 @@ export default class NotificationsList extends React.PureComponent {
       <tbody>
         {types.map(type => (
           <tr key={type}>
-            <td>{translate('notification.dispatcher', type)}</td>
+            <td>{this.getDispatcherLabel(type)}</td>
             {channels.map(channel => (
               <td key={channel} className="text-center">
                 <Checkbox
index 750440be1f1582a28446dc216dd5035d11b244a0..481f754b10bc950544d15c92b5c9f485d8356c52 100644 (file)
@@ -99,6 +99,7 @@ class ProjectNotifications extends React.PureComponent {
           checkboxId={(d, c) => `project-notification-${project.key}-${d}-${c}`}
           onAdd={n => this.handleAddNotification(n)}
           onRemove={n => this.handleRemoveNotification(n)}
+          project={true}
         />
       </table>
     );
index 6ad339b88ebb0beecb1c8b6991ac2c7461243c64..19ad4fa3f53717f591b2bb3a41ad57bdb58136dd 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+/* eslint-disable import/first */
+jest.mock('../../../../helpers/l10n', () => {
+  const l10n = require.requireActual('../../../../helpers/l10n');
+  l10n.hasMessage = jest.fn();
+  return l10n;
+});
+
 import React from 'react';
 import { shallow } from 'enzyme';
 import NotificationsList from '../NotificationsList';
 import Checkbox from '../../../../components/controls/Checkbox';
+import { hasMessage } from '../../../../helpers/l10n';
 
 const channels = ['channel1', 'channel2'];
 const types = ['type1', 'type2'];
@@ -31,6 +39,10 @@ const notifications = [
 ];
 const checkboxId = (t, c) => `checkbox-io-${t}-${c}`;
 
+beforeEach(() => {
+  hasMessage.mockImplementation(() => false).mockClear();
+});
+
 it('should match snapshot', () => {
   expect(
     shallow(
@@ -46,6 +58,25 @@ it('should match snapshot', () => {
   ).toMatchSnapshot();
 });
 
+it('renders project-specific labels', () => {
+  hasMessage.mockImplementation(() => true);
+  expect(
+    shallow(
+      <NotificationsList
+        onAdd={jest.fn()}
+        onRemove={jest.fn()}
+        channels={channels}
+        checkboxId={checkboxId}
+        project={true}
+        types={types}
+        notifications={notifications}
+      />
+    )
+  ).toMatchSnapshot();
+  expect(hasMessage).toBeCalledWith('notification.dispatcher', 'type1', 'project');
+  expect(hasMessage).toBeCalledWith('notification.dispatcher', 'type2', 'project');
+});
+
 it('should call `onAdd` and `onRemove`', () => {
   const onAdd = jest.fn();
   const onRemove = jest.fn();
index 8035cb42916e8b047810f436201528729300cee4..3ca417ef0a0e646eccfb7a19c03eccfaef6ea9d0 100644 (file)
@@ -1,5 +1,60 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`renders project-specific labels 1`] = `
+<tbody>
+  <tr>
+    <td>
+      notification.dispatcher.type1.project
+    </td>
+    <td
+      className="text-center"
+    >
+      <Checkbox
+        checked={true}
+        id="checkbox-io-type1-channel1"
+        onCheck={[Function]}
+        thirdState={false}
+      />
+    </td>
+    <td
+      className="text-center"
+    >
+      <Checkbox
+        checked={false}
+        id="checkbox-io-type1-channel2"
+        onCheck={[Function]}
+        thirdState={false}
+      />
+    </td>
+  </tr>
+  <tr>
+    <td>
+      notification.dispatcher.type2.project
+    </td>
+    <td
+      className="text-center"
+    >
+      <Checkbox
+        checked={true}
+        id="checkbox-io-type2-channel1"
+        onCheck={[Function]}
+        thirdState={false}
+      />
+    </td>
+    <td
+      className="text-center"
+    >
+      <Checkbox
+        checked={true}
+        id="checkbox-io-type2-channel2"
+        onCheck={[Function]}
+        thirdState={false}
+      />
+    </td>
+  </tr>
+</tbody>
+`;
+
 exports[`should match snapshot 1`] = `
 <tbody>
   <tr>
index d7a5a2f3e76fed35d91b6a67415833385abcbb2f..3a5f1bb6f427eb770ae104a2f47d82a96b7d1b3a 100644 (file)
@@ -74,6 +74,7 @@ exports[`should match snapshot 1`] = `
     }
     onAdd={[Function]}
     onRemove={[Function]}
+    project={true}
     types={
       Array [
         "type1",
index 469ebaa4fe6ed97ca5c75274ca5a3b65be8242b9..6ed28db4edbe947a4aca7eb01df900f1aa6c117d 100644 (file)
@@ -1862,7 +1862,8 @@ notification.dispatcher.NewIssues=New issues
 notification.dispatcher.NewAlerts=New quality gate status
 notification.dispatcher.NewFalsePositiveIssue=Issues resolved as false positive or won't fix
 notification.dispatcher.SQ-MyNewIssues=My new issues
-notification.dispatcher.CeReportTaskFailure=Report processing failure
+notification.dispatcher.CeReportTaskFailure=Background tasks in failure on my administered projects
+notification.dispatcher.CeReportTaskFailure.project=Background tasks in failure
 
 
 #------------------------------------------------------------------------------