]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15865 Disabling new code toogle for portfolio when search is apply
authorMathieu Suen <mathieu.suen@sonarsource.com>
Tue, 25 Jan 2022 15:31:56 +0000 (16:31 +0100)
committersonartech <sonartech@sonarsource.com>
Thu, 27 Jan 2022 20:03:05 +0000 (20:03 +0000)
server/sonar-web/src/main/js/apps/code/components/PortfolioNewCodeToggle.tsx
server/sonar-web/src/main/js/apps/code/components/Search.tsx
server/sonar-web/src/main/js/apps/code/components/__tests__/PortfolioNewCodeToggle-test.tsx
server/sonar-web/src/main/js/apps/code/components/__tests__/Search-test.tsx
server/sonar-web/src/main/js/apps/code/components/__tests__/__snapshots__/PortfolioNewCodeToggle-test.tsx.snap
server/sonar-web/src/main/js/apps/code/components/__tests__/__snapshots__/Search-test.tsx.snap
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index b69acfffd56f9231cc9b377dec5466e7882e96de..fe5b0c1b44bec2598a839b1964da53c37c2d35b5 100644 (file)
  */
 import * as React from 'react';
 import { Button } from '../../../components/controls/buttons';
+import Tooltip from '../../../components/controls/Tooltip';
 import { translate } from '../../../helpers/l10n';
 
 export interface PortfolioNewCodeToggleProps {
+  enabled: boolean;
   showNewCode: boolean;
   onNewCodeToggle: (newSelected: boolean) => void;
 }
 
 export default function PortfolioNewCodeToggle(props: PortfolioNewCodeToggleProps) {
-  const { showNewCode } = props;
+  const { showNewCode, enabled } = props;
   return (
-    <div className="big-spacer-right">
-      <div className="button-group">
+    <Tooltip
+      overlay={translate('code_viewer.portfolio_code_toggle_disabled.help')}
+      visible={enabled ? false : undefined}>
+      <div className="big-spacer-right button-group">
         <Button
+          disabled={!enabled}
           className={showNewCode ? 'button-active' : undefined}
           onClick={() => props.onNewCodeToggle(true)}>
           {translate('projects.view.new_code')}
         </Button>
         <Button
+          disabled={!enabled}
           className={showNewCode ? undefined : 'button-active'}
           onClick={() => props.onNewCodeToggle(false)}>
           {translate('projects.view.overall_code')}
         </Button>
       </div>
-    </div>
+    </Tooltip>
   );
 }
index 188c4dff9c1f430403aeb427aaa6e7c0f61671f6..740504eabd97de2ee92bcbd283793075cd4487e9 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { omit } from 'lodash';
+import { isEmpty, omit } from 'lodash';
 import * as React from 'react';
 import { getTree } from '../../../api/components';
 import SearchBox from '../../../components/controls/SearchBox';
@@ -133,13 +133,14 @@ export class Search extends React.PureComponent<Props, State> {
 
   render() {
     const { component, newCodeSelected } = this.props;
-    const { loading } = this.state;
+    const { loading, query } = this.state;
     const isPortfolio = ['VW', 'SVW', 'APP'].includes(component.qualifier);
 
     return (
       <div className="code-search" id="code-search">
         {isPortfolio && (
           <PortfolioNewCodeToggle
+            enabled={isEmpty(query)}
             onNewCodeToggle={this.props.onNewCodeToggle}
             showNewCode={newCodeSelected}
           />
index 7ac8ef235ad5eb548d435f394b19965e2d71c13c..458246b4af13f845d8a66ada3688873812684072 100644 (file)
 import { shallow } from 'enzyme';
 import * as React from 'react';
 import { Button } from '../../../../components/controls/buttons';
+import Tooltip from '../../../../components/controls/Tooltip';
 import PortfolioNewCodeToggle, { PortfolioNewCodeToggleProps } from '../PortfolioNewCodeToggle';
 
 it('renders correctly', () => {
   expect(shallowRender()).toMatchSnapshot();
 });
 
+it('should show tooltips when disabled', () => {
+  const wrapper = shallowRender({ enabled: false });
+  expect(wrapper.find(Tooltip).props().visible).toBeUndefined();
+  wrapper.setProps({ enabled: true });
+  expect(wrapper.find(Tooltip).props().visible).toBe(false);
+});
+
 it('should toggle correctly', () => {
   const onNewCodeToggle = jest.fn();
   const wrapper = shallowRender({ onNewCodeToggle });
@@ -46,6 +54,11 @@ it('should toggle correctly', () => {
 
 function shallowRender(props?: Partial<PortfolioNewCodeToggleProps>) {
   return shallow(
-    <PortfolioNewCodeToggle showNewCode={true} onNewCodeToggle={jest.fn()} {...props} />
+    <PortfolioNewCodeToggle
+      showNewCode={true}
+      enabled={true}
+      onNewCodeToggle={jest.fn()}
+      {...props}
+    />
   );
 }
index e050a1d9092b00fca3f126bc7e79345a398e9d59..b816ba31631efaa5d1717e271587203b2a6bc5ce 100644 (file)
@@ -44,7 +44,13 @@ it('should render correcly', () => {
   expect(shallowRender()).toMatchSnapshot();
   expect(
     shallowRender({ component: mockComponent({ qualifier: ComponentQualifier.Portfolio }) })
-  ).toMatchSnapshot('node code toggle for portfolio');
+  ).toMatchSnapshot('new code toggle for portfolio');
+  expect(
+    shallowRender({
+      component: mockComponent({ qualifier: ComponentQualifier.Portfolio }),
+      location: mockLocation({ query: { id: 'foo', search: 'bar' } })
+    })
+  ).toMatchSnapshot('new code toggle for portfolio disabled');
 });
 
 it('should search correct query on mount', async () => {
index 0a91ab15adfd3b246f117f21ed01a5a8a51a5831..c8e72a5fdf5620a832c593e08ab6d48006acb1ca 100644 (file)
@@ -1,23 +1,26 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`renders correctly 1`] = `
-<div
-  className="big-spacer-right"
+<Tooltip
+  overlay="code_viewer.portfolio_code_toggle_disabled.help"
+  visible={false}
 >
   <div
-    className="button-group"
+    className="big-spacer-right button-group"
   >
     <Button
       className="button-active"
+      disabled={false}
       onClick={[Function]}
     >
       projects.view.new_code
     </Button>
     <Button
+      disabled={false}
       onClick={[Function]}
     >
       projects.view.overall_code
     </Button>
   </div>
-</div>
+</Tooltip>
 `;
index 5ca52b0c45136554fee249ce4151f31253f0d10c..ab28840e91c82851d7b2eebb9f70e398d4192a02 100644 (file)
@@ -19,12 +19,13 @@ exports[`should render correcly 1`] = `
 </div>
 `;
 
-exports[`should render correcly: node code toggle for portfolio 1`] = `
+exports[`should render correcly: new code toggle for portfolio 1`] = `
 <div
   className="code-search"
   id="code-search"
 >
   <PortfolioNewCodeToggle
+    enabled={true}
     onNewCodeToggle={[MockFunction]}
     showNewCode={false}
   />
@@ -41,3 +42,27 @@ exports[`should render correcly: node code toggle for portfolio 1`] = `
   />
 </div>
 `;
+
+exports[`should render correcly: new code toggle for portfolio disabled 1`] = `
+<div
+  className="code-search"
+  id="code-search"
+>
+  <PortfolioNewCodeToggle
+    enabled={false}
+    onNewCodeToggle={[MockFunction]}
+    showNewCode={false}
+  />
+  <SearchBox
+    minLength={3}
+    onChange={[Function]}
+    onKeyDown={[Function]}
+    placeholder="code.search_placeholder.portfolio"
+    value="bar"
+  />
+  <DeferredSpinner
+    className="spacer-left"
+    loading={true}
+  />
+</div>
+`;
index 3528fb722c52b97d7b7049b8fa4076830d1cd4e1..7b88aed98feab4eb498e4590754ee41dd800d98b 100644 (file)
@@ -1418,7 +1418,7 @@ code_viewer.no_source_code_displayed_due_to_empty_analysis.VW=No projects, appli
 code_viewer.no_source_code_displayed_due_to_empty_analysis.SVW=No projects, applications, or portfolios in this portfolio.
 code_viewer.no_source_code_displayed_due_to_security=Due to security settings, no source code can be displayed.
 code_viewer.no_source_code_displayed_due_to_source_removed=The file was removed, no source code can be displayed.
-
+code_viewer.portfolio_code_toggle_disabled.help=New Code and Overall Code measures are not available when searching for projects or applications.
 
 #------------------------------------------------------------------------------
 #