]> source.dussan.org Git - sonarqube.git/commitdiff
Apply feedbacks
authorPascal Mugnier <pascal.mugnier@sonarsource.com>
Wed, 10 Oct 2018 08:35:04 +0000 (10:35 +0200)
committerSonarTech <sonartech@sonarsource.com>
Wed, 10 Oct 2018 18:20:59 +0000 (20:20 +0200)
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/apps/permissions/global/components/AllHoldersList.tsx
server/sonar-web/src/main/js/apps/permissions/project/components/AllHoldersList.tsx
server/sonar-web/src/main/js/apps/permissions/shared/components/HoldersList.tsx
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 1f67682cdc8e9175b1160835d306460455043159..47a424a0e54aec68f98be138dc86128a44d116d8 100644 (file)
@@ -23,10 +23,11 @@ import CreateFormShim from '../../../../apps/portfolio/components/CreateFormShim
 import Dropdown from '../../../../components/controls/Dropdown';
 import PlusIcon from '../../../../components/icons-components/PlusIcon';
 import { AppState, hasGlobalPermission, CurrentUser } from '../../../types';
-import { getPortfolioAdminUrl } from '../../../../helpers/urls';
+import { getPortfolioAdminUrl, getPortfolioUrl } from '../../../../helpers/urls';
 import { getExtensionStart } from '../../extensions/utils';
 import { isSonarCloud } from '../../../../helpers/system';
 import { translate } from '../../../../helpers/l10n';
+import { getComponentNavigation } from '../../../../api/nav';
 
 interface Props {
   appState: Pick<AppState, 'qualifiers'>;
@@ -81,8 +82,20 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
   };
 
   handleCreatePortfolio = ({ key, qualifier }: { key: string; qualifier: string }) => {
-    this.closeCreatePortfolioForm();
-    this.props.router.push(getPortfolioAdminUrl(key, qualifier));
+    return getComponentNavigation({ componentKey: key }).then(data => {
+      if (
+        data.configuration &&
+        data.configuration.extensions &&
+        data.configuration.extensions.find(
+          (item: { key: string; name: string }) => item.key === 'governance/console'
+        )
+      ) {
+        this.props.router.push(getPortfolioAdminUrl(key, qualifier));
+      } else {
+        this.props.router.push(getPortfolioUrl(key));
+      }
+      this.closeCreatePortfolioForm();
+    });
   };
 
   renderCreateProject() {
@@ -132,9 +145,14 @@ export class GlobalNavPlus extends React.PureComponent<Props & WithRouterProps,
 
   render() {
     const { currentUser } = this.props;
+    const canCreateProject = hasGlobalPermission(currentUser, 'provisioning');
     const canCreateApplication = hasGlobalPermission(currentUser, 'applicationcreator');
     const canCreatePortfolio = hasGlobalPermission(currentUser, 'portfoliocreator');
 
+    if (!canCreateProject && !canCreateApplication && !canCreatePortfolio) {
+      return null;
+    }
+
     let defaultQualifier: string | undefined;
     if (!canCreateApplication) {
       defaultQualifier = 'VW';
index 9305f1ddcbbceb778e1f105184078018a2319de8..b74fe72c2990cf830a91d6efc00e229e89c2cd2d 100644 (file)
@@ -44,11 +44,7 @@ it('opens onboarding', () => {
 });
 
 it('should display create new project link when user has permission only', () => {
-  expect(
-    getOverlayWrapper(getWrapper({}, []))
-      .find('.js-new-project')
-      .exists()
-  ).toBe(false);
+  expect(getWrapper({}, []).find('Dropdown').length).toEqual(0);
 });
 
 it('should display create new organization on SonarCloud only', () => {
index 9adccff9343b8c2901f95e710e03875688137fa1..0282227203bf76a712355b567d2da2e1d05b9cee 100644 (file)
@@ -104,11 +104,13 @@ export class AllHoldersList extends React.PureComponent<Props> {
     return (
       <>
         <HoldersList
+          filter={this.props.filter}
           groups={this.props.groups}
           loading={this.props.loading}
           onToggleGroup={this.handleToggleGroup}
           onToggleUser={this.handleToggleUser}
           permissions={permissions}
+          query={this.props.query}
           users={this.props.users}>
           <SearchForm
             filter={this.props.filter}
index f03354dad35985d8b578cd41f70298aa52fddbd6..27cd441636e48c70ba26fd76358c43a5486b933c 100644 (file)
@@ -98,11 +98,13 @@ export default class AllHoldersList extends React.PureComponent<Props> {
     return (
       <>
         <HoldersList
+          filter={this.props.filter}
           groups={this.props.groups}
           onSelectPermission={this.handleSelectPermission}
           onToggleGroup={this.handleToggleGroup}
           onToggleUser={this.handleToggleUser}
           permissions={permissions}
+          query={this.props.query}
           selectedPermission={this.props.selectedPermission}
           users={this.props.users}>
           <SearchForm
index bc916310724b579a13d0191bafd4720637aa2b72..c90341d251098037a2f8bc4d5a1314aa1012798b 100644 (file)
@@ -27,23 +27,29 @@ import { PermissionGroup, PermissionUser, PermissionDefinitions } from '../../..
 import { isPermissionDefinitionGroup } from '../../utils';
 
 interface Props {
-  loading?: boolean;
+  filter?: string;
   groups: PermissionGroup[];
+  loading?: boolean;
   onSelectPermission?: (permission: string) => void;
   onToggleGroup: (group: PermissionGroup, permission: string) => Promise<void>;
   onToggleUser: (user: PermissionUser, permission: string) => Promise<void>;
   permissions: PermissionDefinitions;
+  query?: string;
   selectedPermission?: string;
   showPublicProjectsWarning?: boolean;
   users: PermissionUser[];
 }
 
 interface State {
-  permissionsCount: { [key: string]: number };
+  initialPermissionsCount: { [key: string]: number };
 }
-
 export default class HoldersList extends React.PureComponent<Props, State> {
-  state: State = { permissionsCount: {} };
+  state: State = { initialPermissionsCount: {} };
+  componentDidUpdate(prevProps: Props) {
+    if (this.props.filter !== prevProps.filter || this.props.query !== prevProps.query) {
+      this.setState({ initialPermissionsCount: {} });
+    }
+  }
 
   isPermissionUser(item: PermissionGroup | PermissionUser): item is PermissionUser {
     return (item as PermissionUser).login !== undefined;
@@ -51,10 +57,10 @@ export default class HoldersList extends React.PureComponent<Props, State> {
 
   handleGroupToggle = (group: PermissionGroup, permission: string) => {
     const key = group.id || group.name;
-    if (this.state.permissionsCount[key] === undefined) {
+    if (this.state.initialPermissionsCount[key] === undefined) {
       this.setState(state => ({
-        permissionsCount: {
-          ...state.permissionsCount,
+        initialPermissionsCount: {
+          ...state.initialPermissionsCount,
           [key]: group.permissions.length
         }
       }));
@@ -63,10 +69,10 @@ export default class HoldersList extends React.PureComponent<Props, State> {
   };
 
   handleUserToggle = (user: PermissionUser, permission: string) => {
-    if (this.state.permissionsCount[user.login] === undefined) {
+    if (this.state.initialPermissionsCount[user.login] === undefined) {
       this.setState(state => ({
-        permissionsCount: {
-          ...state.permissionsCount,
+        initialPermissionsCount: {
+          ...state.initialPermissionsCount,
           [user.login]: user.permissions.length
         }
       }));
@@ -76,8 +82,8 @@ export default class HoldersList extends React.PureComponent<Props, State> {
 
   getItemInitialPermissionsCount = (item: PermissionGroup | PermissionUser) => {
     const key = this.isPermissionUser(item) ? item.login : item.id || item.name;
-    return this.state.permissionsCount[key] !== undefined
-      ? this.state.permissionsCount[key]
+    return this.state.initialPermissionsCount[key] !== undefined
+      ? this.state.initialPermissionsCount[key]
       : item.permissions.length;
   };
 
index 4004b7f1a286ca98aeda23b8be6aea51e997b506..1ecb09e8b4b59ee23c2c13e73300d26e1f35b67b 100644 (file)
@@ -2120,8 +2120,8 @@ permission_template.edit_permissions=Edit Permissions: {0}
 permission_template.key_pattern=Project key pattern
 permission_template.key_pattern.description=Should be a valid regular expression
 permission_template.default_for=Default for {0}
-permission_templates.project_creators=Project Creators
-permission_templates.project_creators.explanation=When a new project / portfolio / application is created, the user who creates the project will receive this permission on the project.
+permission_templates.project_creators=Project/Portfolio/Application Creators
+permission_templates.project_creators.explanation=When a new project / portfolio / application is created, the user who creates the project / portfolio / application will receive this permission on the project / portfolio / application.
 permission_templates.bulk_apply_permission_template=Bulk Apply Permission Template
 permission_templates.bulk_apply_permission_template.apply_to_selected=You're about to apply the selected permission template to {0} selected item(s).
 permission_templates.bulk_apply_permission_template.apply_to_all=You're about to apply the selected permission template to {0} item(s).