From 980cb9cb6854597e5adbad6fe2536f87cb519bd1 Mon Sep 17 00:00:00 2001 From: Jeremy Davis Date: Tue, 12 Feb 2019 17:55:08 +0100 Subject: [PATCH] SONARCLOUD-380 Trigger member sync when importing ALM org - Remove team button and refactor modals - Sync members after importing alm organization - Update AlmOrganization type and introduce mock function - Add info box when importing or binding organization - Remove manage team button in bound org empty state if member sync --- .../main/js/app/components/StartupModal.tsx | 14 +-- .../main/js/app/styles/components/modals.css | 77 ++++++------- .../src/main/js/app/styles/init/misc.css | 4 + server/sonar-web/src/main/js/app/types.d.ts | 9 +- .../create/components/BillingFormShim.tsx | 2 +- .../components/UpgradeOrganizationModal.tsx | 13 +-- .../UpgradeOrganizationModal-test.tsx.snap | 3 +- .../organization/AlmApplicationInstalling.tsx | 6 +- .../organization/AutoOrganizationBind.tsx | 19 ++- .../organization/AutoOrganizationCreate.tsx | 25 +++- .../organization/CreateOrganization.tsx | 51 ++------- .../organization/OrganizationDetailsForm.tsx | 5 +- .../organization/RemoteOrganizationChoose.tsx | 8 +- .../__tests__/AutoOrganizationBind-test.tsx | 12 +- .../__tests__/AutoOrganizationCreate-test.tsx | 15 +-- .../AutoPersonalOrganizationBind-test.tsx | 12 +- .../__tests__/CreateOrganization-test.tsx | 31 ++--- .../ManualOrganizationCreate-test.tsx | 11 +- .../__tests__/PlanSelect-test.tsx | 5 +- .../organization/__tests__/PlanStep-test.tsx | 12 +- .../RemoteOrganizationChoose-test.tsx | 11 +- .../AutoOrganizationBind-test.tsx.snap | 29 ++++- .../AutoOrganizationCreate-test.tsx.snap | 37 ++++-- ...AutoPersonalOrganizationBind-test.tsx.snap | 7 +- .../CreateOrganization-test.tsx.snap | 22 ++-- .../ManualOrganizationCreate-test.tsx.snap | 7 +- .../__snapshots__/PlanStep-test.tsx.snap | 7 +- .../RemoteOrganizationChoose-test.tsx.snap | 4 +- .../organization/__tests__/actions-test.ts | 85 ++++++++++++++ .../js/apps/create/organization/actions.ts | 51 +++++++++ .../organizationMembers/MembersListHeader.tsx | 6 +- .../organizationMembers/MembersPageHeader.tsx | 5 +- .../organizationMembers/SyncMemberForm.tsx | 24 ++-- .../MembersPageHeader-test.tsx.snap | 2 +- .../SyncMemberForm-test.tsx.snap | 108 ++++++++++-------- .../organizations/__tests__/actions-test.ts | 56 +++++++++ .../src/main/js/apps/organizations/actions.ts | 42 +++---- .../components/OrganizationEmpty.tsx | 17 ++- .../__tests__/OrganizationEmpty-test.tsx | 49 ++++---- .../OrganizationEmpty-test.tsx.snap | 29 +++++ .../tutorials/onboarding/OnboardingModal.tsx | 33 ++---- .../tutorials/onboarding/OnboardingPage.tsx | 43 +++---- .../__tests__/OnboardingModal-test.tsx | 4 - .../OnboardingModal-test.tsx.snap | 46 +++----- .../src/main/js/apps/tutorials/styles.css | 1 - .../teamOnboarding/TeamOnboardingModal.tsx | 69 ----------- .../TeamOnboardingModal-test.tsx.snap | 61 ---------- .../js/components/controls/ConfirmButton.tsx | 15 ++- .../js/components/controls/ConfirmModal.tsx | 17 ++- .../src/main/js/components/controls/Modal.tsx | 17 ++- .../__tests__/ConfirmButton-test.tsx} | 26 ++++- .../__snapshots__/ConfirmButton-test.tsx.snap | 20 ++++ .../OnboardingProjectIcon.tsx | 3 +- .../icons-components/OnboardingTeamIcon.tsx | 33 ------ .../helpers/__tests__/almIntegrations-test.ts | 28 +++-- .../src/main/js/helpers/almIntegrations.ts | 4 +- .../src/main/js/helpers/testMocks.ts | 15 +++ .../resources/org/sonar/l10n/core.properties | 18 +-- 58 files changed, 747 insertions(+), 638 deletions(-) create mode 100644 server/sonar-web/src/main/js/apps/create/organization/__tests__/actions-test.ts create mode 100644 server/sonar-web/src/main/js/apps/create/organization/actions.ts create mode 100644 server/sonar-web/src/main/js/apps/organizations/__tests__/actions-test.ts delete mode 100644 server/sonar-web/src/main/js/apps/tutorials/teamOnboarding/TeamOnboardingModal.tsx delete mode 100644 server/sonar-web/src/main/js/apps/tutorials/teamOnboarding/__tests__/__snapshots__/TeamOnboardingModal-test.tsx.snap rename server/sonar-web/src/main/js/{apps/tutorials/teamOnboarding/__tests__/TeamOnboardingModal-test.tsx => components/controls/__tests__/ConfirmButton-test.tsx} (62%) create mode 100644 server/sonar-web/src/main/js/components/controls/__tests__/__snapshots__/ConfirmButton-test.tsx.snap delete mode 100644 server/sonar-web/src/main/js/components/icons-components/OnboardingTeamIcon.tsx diff --git a/server/sonar-web/src/main/js/app/components/StartupModal.tsx b/server/sonar-web/src/main/js/app/components/StartupModal.tsx index 45cf0a3d7b4..c5d84e6c8eb 100644 --- a/server/sonar-web/src/main/js/app/components/StartupModal.tsx +++ b/server/sonar-web/src/main/js/app/components/StartupModal.tsx @@ -36,9 +36,6 @@ const LicensePromptModal = lazyLoad( () => import('../../apps/marketplace/components/LicensePromptModal'), 'LicensePromptModal' ); -const TeamOnboardingModal = lazyLoad(() => - import('../../apps/tutorials/teamOnboarding/TeamOnboardingModal') -); interface StateProps { canAdmin?: boolean; @@ -63,8 +60,7 @@ type Props = StateProps & DispatchProps & OwnProps & WithRouterProps; enum ModalKey { license, - onboarding, - teamOnboarding + onboarding } interface State { @@ -113,10 +109,6 @@ export class StartupModal extends React.PureComponent { this.props.router.push({ pathname: `/projects/create`, state }); }; - openTeamOnboarding = () => { - this.setState({ modal: ModalKey.teamOnboarding }); - }; - tryAutoOpenLicense = () => { const { canAdmin, currentEdition, currentUser } = this.props; const hasLicenseManager = hasMessage('license.prompt.title'); @@ -161,12 +153,8 @@ export class StartupModal extends React.PureComponent { )} - {modal === ModalKey.teamOnboarding && ( - - )} ); } diff --git a/server/sonar-web/src/main/js/app/styles/components/modals.css b/server/sonar-web/src/main/js/app/styles/components/modals.css index 7a1b8a4e72b..370030f2a61 100644 --- a/server/sonar-web/src/main/js/app/styles/components/modals.css +++ b/server/sonar-web/src/main/js/app/styles/components/modals.css @@ -30,6 +30,10 @@ transition: all 0.2s ease; } +.modal.sonarcloud { + border-radius: 3px; +} + .modal:focus, .ReactModal__Content:focus { outline: none; @@ -83,67 +87,53 @@ } .modal-container { - max-height: 70vh; + max-height: 60vh; padding: 10px; box-sizing: border-box; overflow: auto; } -.modal-head { - padding: 0 10px; - background-color: var(--gray94); - border-bottom: 1px solid #ddd; -} - -.modal-head h1, -.modal-head h2 { - line-height: 30px; - min-height: 30px; +.modal.sonarcloud .modal-container { + border-top: 1px solid var(--barBorderColor); + margin-top: var(--pagePadding); } -.modal-body { - padding: 10px; +.modal.sonarcloud .modal-container > :last-child { + margin-bottom: var(--pagePadding); } -.modal-simple { - border-radius: 3px; +.modal-head { + padding: 0 10px; + background-color: var(--gray94); + border-bottom: 1px solid var(--disableGrayBorder); } -.modal-simple-head { - padding: var(--pagePadding) calc(2 * var(--pagePadding)); +.modal.sonarcloud .modal-head { + background-color: transparent; + border-bottom: none; + padding: var(--pagePadding) calc(2 * var(--pagePadding)) 0; } -.modal-simple-head h1 { - margin-top: var(--pagePadding); - font-size: var(--hugeFontSize); - font-weight: bold; +.modal-head h1, +.modal-head h2 { line-height: 30px; + min-height: 30px; } -.modal-simple-head h2 { +.modal.sonarcloud .modal-head h1, +.modal.sonarcloud .modal-head h2 { + margin-top: var(--gridSize); font-size: var(--bigFontSize); font-weight: bold; - line-height: 24px; -} - -.modal-simple-body { - padding: 0 calc(2 * var(--pagePadding)) var(--pagePadding); + line-height: 30px; } -.modal-simple-foot { - padding: calc(2 * var(--pagePadding)) calc(2 * var(--pagePadding)); - border-radius: 3px; +.modal-body { + padding: 10px; } -.modal-simple-foot-action { - display: flex; - justify-content: space-between; - align-items: center; +.modal.sonarcloud .modal-body { padding: var(--pagePadding) calc(2 * var(--pagePadding)); - border-top: 1px solid var(--barBorderColor); - background-color: var(--barBackgroundColor); - text-align: right; - border-radius: 3px; } .modal-field, @@ -293,16 +283,23 @@ .modal-foot { padding: 10px; - border-top: 1px solid #ccc; + border-top: 1px solid var(--disableGrayBorder); background-color: var(--gray94); text-align: right; } +.modal.sonarcloud .modal-foot { + padding: var(--pagePadding); + border-top: 1px solid var(--barBorderColor); + background-color: var(--barBackgroundColor); + border-radius: 3px; +} + .modal-foot button, .modal-foot .button, .modal-foot input[type='submit'], .modal-foot input[type='button'] { - margin-right: 10px; + margin-left: var(--gridSize); } .modal-error, diff --git a/server/sonar-web/src/main/js/app/styles/init/misc.css b/server/sonar-web/src/main/js/app/styles/init/misc.css index 71ac4dc098c..06637e62f6d 100644 --- a/server/sonar-web/src/main/js/app/styles/init/misc.css +++ b/server/sonar-web/src/main/js/app/styles/init/misc.css @@ -257,6 +257,10 @@ td.big-spacer-top { width: 400px !important; } +.abs-width-600 { + width: 600px !important; +} + .justify { margin-bottom: -1em; text-align: justify; diff --git a/server/sonar-web/src/main/js/app/types.d.ts b/server/sonar-web/src/main/js/app/types.d.ts index 9f70f1e0f97..45d8d3e0dc2 100644 --- a/server/sonar-web/src/main/js/app/types.d.ts +++ b/server/sonar-web/src/main/js/app/types.d.ts @@ -27,6 +27,7 @@ declare namespace T { } export interface AlmOrganization extends OrganizationBase { + almUrl: string; key: string; personal: boolean; privateRepos: number; @@ -502,7 +503,7 @@ declare namespace T { export interface Organization extends OrganizationBase { actions?: OrganizationActions; - alm?: OrganizationAlm; + alm?: { key: string; membersSync: boolean; url: string }; adminPages?: Extension[]; canUpdateProjectsVisibilityToPrivate?: boolean; guarded?: boolean; @@ -513,12 +514,6 @@ declare namespace T { subscription?: OrganizationSubscription; } - export interface OrganizationAlm { - key: string; - membersSync: boolean; - url: string; - } - export interface OrganizationBase { avatar?: string; description?: string; diff --git a/server/sonar-web/src/main/js/apps/create/components/BillingFormShim.tsx b/server/sonar-web/src/main/js/apps/create/components/BillingFormShim.tsx index 1eb726cf2ad..97327f7b95b 100644 --- a/server/sonar-web/src/main/js/apps/create/components/BillingFormShim.tsx +++ b/server/sonar-web/src/main/js/apps/create/components/BillingFormShim.tsx @@ -23,7 +23,7 @@ interface ChildrenProps { onSubmit: React.FormEventHandler; processingUpgrade: boolean; renderFormFields: () => React.ReactNode; - renderNextCharge: () => React.ReactNode; + renderNextCharge: (className?: string) => React.ReactNode; renderRecap: () => React.ReactNode; renderSubmitButton: (submitText?: string) => React.ReactNode; renderSubmitGroup: (submitText?: string) => React.ReactNode; diff --git a/server/sonar-web/src/main/js/apps/create/components/UpgradeOrganizationModal.tsx b/server/sonar-web/src/main/js/apps/create/components/UpgradeOrganizationModal.tsx index 269f5be6e00..dfaca7bc0f0 100644 --- a/server/sonar-web/src/main/js/apps/create/components/UpgradeOrganizationModal.tsx +++ b/server/sonar-web/src/main/js/apps/create/components/UpgradeOrganizationModal.tsx @@ -75,9 +75,8 @@ export default class UpgradeOrganizationModal extends React.PureComponent -
+ shouldCloseOnOverlayClick={false}> +

{header}

(
-
+

{renderRecap()}

-