]> source.dussan.org Git - sonarqube.git/commitdiff
SONARCLOUD-43 pass organization for manual project creation (#723)
authorStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 19 Sep 2018 09:55:00 +0000 (11:55 +0200)
committerSonarTech <sonartech@sonarsource.com>
Tue, 25 Sep 2018 18:21:00 +0000 (20:21 +0200)
server/sonar-web/src/main/js/app/components/StartupModal.tsx
server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/EmptyInstance-test.tsx.snap
server/sonar-web/src/main/js/apps/projects/create/CreateProjectPage.tsx
server/sonar-web/src/main/js/apps/projects/create/ManualProjectCreate.tsx
server/sonar-web/src/main/js/apps/projects/create/utils.ts

index 49863fa9ffc5ed86b519c1c03fb1119c373d952f..a5f0263139aed28f49dc850b4943e28a211c97e5 100644 (file)
@@ -120,10 +120,10 @@ export class StartupModal extends React.PureComponent<Props, State> {
     this.props.router.push({ pathname: '/create-organization', state: { paid: true } });
   };
 
-  openProjectOnboarding = () => {
+  openProjectOnboarding = (organization?: string) => {
     if (isSonarCloud()) {
       this.setState({ automatic: false, modal: undefined });
-      this.props.router.push(`/projects/create`);
+      this.props.router.push({ pathname: `/projects/create`, query: { organization } });
     } else {
       this.setState({ modal: ModalKey.projectOnboarding });
     }
index a9f09ca7664329c8f2fa1cf1fa136eaf9562e368..974d80815fbdd85ec08446c8266c05121a0576aa 100644 (file)
@@ -34,6 +34,12 @@ export default class EmptyInstance extends React.PureComponent<Props> {
     openProjectOnboarding: PropTypes.func
   };
 
+  analyzeNewProject = () => {
+    const { organization } = this.props;
+    const organizationKey = organization && organization.key;
+    this.context.openProjectOnboarding(organizationKey);
+  };
+
   render() {
     const { currentUser, organization } = this.props;
     const showNewProjectButton = isSonarCloud()
@@ -53,7 +59,7 @@ export default class EmptyInstance extends React.PureComponent<Props> {
               {translate('projects.no_projects.empty_instance.how_to_add_projects')}
             </p>
             <p className="big-spacer-top">
-              <Button onClick={this.context.openProjectOnboarding}>
+              <Button onClick={this.analyzeNewProject}>
                 {translate('embed_docs.analyze_new_project')}
               </Button>
             </p>
index d903a5771aa0dac0c8eafdc5fb32feff8438f931..89bb1bcf659abb2275af3a848d8ec8eb32fd83c1 100644 (file)
@@ -26,7 +26,9 @@ exports[`renders correctly for SC 2`] = `
     <p
       className="big-spacer-top"
     >
-      <Button>
+      <Button
+        onClick={[Function]}
+      >
         embed_docs.analyze_new_project
       </Button>
     </p>
@@ -60,7 +62,9 @@ exports[`renders correctly for SQ 2`] = `
     <p
       className="big-spacer-top"
     >
-      <Button>
+      <Button
+        onClick={[Function]}
+      >
         embed_docs.analyze_new_project
       </Button>
     </p>
index 7e27c4accff2992b4773de293010b6e3605fe3ea..f3c9b4a961d6842bb1aee2861c412fe31419866d 100644 (file)
@@ -151,6 +151,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
     const displayManual = parseQuery(this.props.location.query).manual;
     const header = translate('onboarding.create_project.header');
     const hasAutoProvisioning = this.canAutoCreate() && identityProvider;
+    const query = parseQuery(this.props.location.query);
     return (
       <>
         <Helmet title={header} titleTemplate="%s" />
@@ -197,6 +198,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
                 <ManualProjectCreate
                   currentUser={currentUser}
                   onProjectCreate={this.handleProjectCreate}
+                  organization={query.organization}
                 />
               ) : (
                 <AutoProjectCreate
index 9b6c21429deb5bc00ea0450ab583fbf06c0f01ea..1101f6484eff04475d083368c0b4931af28f002f 100644 (file)
@@ -41,6 +41,7 @@ interface DispatchProps {
 interface OwnProps {
   currentUser: LoggedInUser;
   onProjectCreate: (projectKeys: string[]) => void;
+  organization?: string;
 }
 
 type Props = OwnProps & StateProps & DispatchProps;
@@ -60,8 +61,7 @@ export class ManualProjectCreate extends React.PureComponent<Props, State> {
     this.state = {
       projectName: '',
       projectKey: '',
-      selectedOrganization:
-        props.userOrganizations.length === 1 ? props.userOrganizations[0].key : '',
+      selectedOrganization: this.getInitialSelectedOrganization(props),
       submitting: false
     };
   }
@@ -74,6 +74,16 @@ export class ManualProjectCreate extends React.PureComponent<Props, State> {
     this.mounted = false;
   }
 
+  getInitialSelectedOrganization(props: Props) {
+    if (props.organization) {
+      return props.organization;
+    } else if (props.userOrganizations.length === 1) {
+      return props.userOrganizations[0].key;
+    } else {
+      return '';
+    }
+  }
+
   handleFormSubmit = (event: React.FormEvent<HTMLFormElement>) => {
     event.preventDefault();
 
index 64a746fc61cc90ce7cb6d6f557d4d617bc2bafa8..ed3f0b178fb47b80773f2de717063012d0d27b63 100644 (file)
@@ -23,19 +23,22 @@ import {
   RawQuery,
   parseAsBoolean,
   serializeOptionalBoolean,
-  parseAsOptionalString
+  parseAsOptionalString,
+  serializeString
 } from '../../../helpers/query';
 
 export interface Query {
   error?: string;
   manual: boolean;
+  organization?: string;
 }
 
 export const parseQuery = memoize(
   (urlQuery: RawQuery): Query => {
     return {
       error: parseAsOptionalString(urlQuery['error']),
-      manual: parseAsBoolean(urlQuery['manual'], false)
+      manual: parseAsBoolean(urlQuery['manual'], false),
+      organization: parseAsOptionalString(urlQuery['organization'])
     };
   }
 );
@@ -43,6 +46,7 @@ export const parseQuery = memoize(
 export const serializeQuery = memoize(
   (query: Query): RawQuery =>
     cleanQuery({
-      manual: serializeOptionalBoolean(query.manual || undefined)
+      manual: serializeOptionalBoolean(query.manual || undefined),
+      organization: serializeString(query.organization)
     })
 );