]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11289 Always display plus menu on SonarCloud
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>
Thu, 11 Oct 2018 15:09:18 +0000 (17:09 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 12 Oct 2018 18:20:58 +0000 (20:20 +0200)
server/sonar-web/src/main/js/app/components/nav/global/GlobalNav.tsx
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavPlus.tsx
server/sonar-web/src/main/js/app/components/nav/global/__tests__/GlobalNavPlus-test.tsx
server/sonar-web/src/main/js/app/components/nav/global/__tests__/__snapshots__/GlobalNav-test.tsx.snap
server/sonar-web/src/main/js/app/components/nav/global/__tests__/__snapshots__/GlobalNavPlus-test.tsx.snap

index 4e7138114d8e98968423b00b51992c74fa34174c..513ee90f6d9ff793cf4c1e51393aceea90cca1ed 100644 (file)
@@ -27,7 +27,7 @@ import GlobalNavUserContainer from './GlobalNavUserContainer';
 import Search from '../../search/Search';
 import EmbedDocsPopupHelper from '../../embed-docs-modal/EmbedDocsPopupHelper';
 import * as theme from '../../../theme';
-import { isLoggedIn, CurrentUser, AppState, hasGlobalPermission } from '../../../types';
+import { CurrentUser, AppState } from '../../../types';
 import NavBar from '../../../../components/nav/NavBar';
 import { lazyLoad } from '../../../../components/lazyLoad';
 import { getCurrentUser, getAppState, Store } from '../../../../store/rootReducer';
@@ -52,18 +52,6 @@ type Props = StateProps & OwnProps;
 export class GlobalNav extends React.PureComponent<Props> {
   static contextTypes = { openProjectOnboarding: PropTypes.func };
 
-  shouldRenderNavPlus = () => {
-    const { currentUser } = this.props;
-    if (!isLoggedIn(currentUser)) {
-      return false;
-    }
-    return (
-      hasGlobalPermission(currentUser, 'provisioning') ||
-      hasGlobalPermission(currentUser, 'applicationcreator') ||
-      hasGlobalPermission(currentUser, 'portfoliocreator')
-    );
-  };
-
   render() {
     return (
       <NavBar className="navbar-global" height={theme.globalNavHeightRaw} id="global-navigation">
@@ -75,13 +63,11 @@ export class GlobalNav extends React.PureComponent<Props> {
           {isSonarCloud() && <GlobalNavExplore location={this.props.location} />}
           <EmbedDocsPopupHelper suggestions={this.props.suggestions} />
           <Search appState={this.props.appState} currentUser={this.props.currentUser} />
-          {this.shouldRenderNavPlus() && (
-            <GlobalNavPlus
-              appState={this.props.appState}
-              currentUser={this.props.currentUser}
-              openProjectOnboarding={this.context.openProjectOnboarding}
-            />
-          )}
+          <GlobalNavPlus
+            appState={this.props.appState}
+            currentUser={this.props.currentUser}
+            openProjectOnboarding={this.context.openProjectOnboarding}
+          />
           <GlobalNavUserContainer {...this.props} />
         </ul>
       </NavBar>
index 47a424a0e54aec68f98be138dc86128a44d116d8..9da8d2ac45d6382328e1865b1f3bbd4edbecbfff 100644 (file)
@@ -98,9 +98,8 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
     });
   };
 
-  renderCreateProject() {
-    const { currentUser } = this.props;
-    if (!hasGlobalPermission(currentUser, 'provisioning')) {
+  renderCreateProject(canCreateProject: boolean) {
+    if (!canCreateProject) {
       return null;
     }
     return (
@@ -112,8 +111,8 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
     );
   }
 
-  renderCreateOrganization() {
-    if (!isSonarCloud()) {
+  renderCreateOrganization(canCreateOrg: boolean) {
+    if (!canCreateOrg) {
       return null;
     }
 
@@ -145,11 +144,12 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
 
   render() {
     const { currentUser } = this.props;
-    const canCreateProject = hasGlobalPermission(currentUser, 'provisioning');
     const canCreateApplication = hasGlobalPermission(currentUser, 'applicationcreator');
+    const canCreateOrg = isSonarCloud();
     const canCreatePortfolio = hasGlobalPermission(currentUser, 'portfoliocreator');
+    const canCreateProject = isSonarCloud() || hasGlobalPermission(currentUser, 'provisioning');
 
-    if (!canCreateProject && !canCreateApplication && !canCreatePortfolio) {
+    if (!canCreateProject && !canCreateApplication && !canCreatePortfolio && !canCreateOrg) {
       return null;
     }
 
@@ -165,8 +165,8 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
         <Dropdown
           overlay={
             <ul className="menu">
-              {this.renderCreateProject()}
-              {this.renderCreateOrganization()}
+              {this.renderCreateProject(canCreateProject)}
+              {this.renderCreateOrganization(canCreateOrg)}
               {this.renderCreatePortfolio(
                 canCreateApplication || canCreatePortfolio,
                 defaultQualifier
index b74fe72c2990cf830a91d6efc00e229e89c2cd2d..b4a77bf8216d94facc7ab91a7efad8adf4af93c5 100644 (file)
@@ -52,6 +52,11 @@ it('should display create new organization on SonarCloud only', () => {
   expect(getOverlayWrapper(getWrapper())).toMatchSnapshot();
 });
 
+it('should display new organization and new project on SonarCloud', () => {
+  (isSonarCloud as jest.Mock).mockReturnValue(true);
+  expect(getOverlayWrapper(getWrapper({}, []))).toMatchSnapshot();
+});
+
 it('should display create portfolio and application', () => {
   checkOpenCreatePortfolio(['applicationcreator', 'portfoliocreator'], undefined);
 });
index 62c2757d57b4d3b0a779b37a110f90d751ac8404..f785691d5157ca603702ec9953fee08752110c01 100644 (file)
@@ -56,6 +56,21 @@ exports[`should render for SonarCloud 1`] = `
         }
       }
     />
+    <LazyLoader
+      appState={
+        Object {
+          "canAdmin": false,
+          "globalPages": Array [],
+          "organizationsEnabled": false,
+          "qualifiers": Array [],
+        }
+      }
+      currentUser={
+        Object {
+          "isLoggedIn": false,
+        }
+      }
+    />
     <Connect(GlobalNavUser)
       appState={
         Object {
@@ -130,6 +145,21 @@ exports[`should render for SonarQube 1`] = `
         }
       }
     />
+    <LazyLoader
+      appState={
+        Object {
+          "canAdmin": false,
+          "globalPages": Array [],
+          "organizationsEnabled": false,
+          "qualifiers": Array [],
+        }
+      }
+      currentUser={
+        Object {
+          "isLoggedIn": false,
+        }
+      }
+    />
     <Connect(GlobalNavUser)
       appState={
         Object {
index a54b7dfefcb4ae4bd7368fee01bfc6593bb89b45..0660c2be47c862b46f1d532a699ce5e11840127d 100644 (file)
@@ -84,3 +84,29 @@ exports[`should display create portfolio and application 1`] = `
   my_account.create_new_portfolio_application
 </a>
 `;
+
+exports[`should display new organization and new project on SonarCloud 1`] = `
+<ul
+  className="menu"
+>
+  <li>
+    <a
+      className="js-new-project"
+      href="#"
+      onClick={[Function]}
+    >
+      provisioning.create_new_project
+    </a>
+  </li>
+  <li>
+    <Link
+      className="js-new-organization"
+      onlyActiveOnIndex={false}
+      style={Object {}}
+      to="/create-organization"
+    >
+      my_account.create_new_organization
+    </Link>
+  </li>
+</ul>
+`;