From 991c93480ded1d1a3c5cabb34722c9736ac2affc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Wed, 18 Jul 2018 15:09:43 +0200 Subject: [PATCH] SONARCLOUD-54 Better empty organization message for projects page --- .../apps/projects/components/AllProjects.tsx | 1 + .../projects/components/EmptyInstance.tsx | 48 +++++++++++++-- .../apps/projects/components/ProjectsList.tsx | 11 +++- .../components/__tests__/AllProjects-test.tsx | 2 +- .../__tests__/EmptyInstance-test.tsx | 35 ++++++++++- .../__tests__/ProjectsList-test.tsx | 1 + .../__snapshots__/AllProjects-test.tsx.snap | 5 ++ .../__snapshots__/EmptyInstance-test.tsx.snap | 60 ++++++++++++++++++- .../__snapshots__/ProjectsList-test.tsx.snap | 8 ++- .../resources/org/sonar/l10n/core.properties | 4 +- 10 files changed, 160 insertions(+), 15 deletions(-) diff --git a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx index 7f436bc9535..a97b447e3a1 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx @@ -295,6 +295,7 @@ export default class AllProjects extends React.PureComponent { {this.state.projects && ( -

{translate('projects.no_projects.empty_instance')}

- - ); +interface Props { + organization?: Organization; + currentUser: CurrentUser; +} + +export default class EmptyInstance extends React.PureComponent { + static contextTypes = { + openProjectOnboarding: PropTypes.func + }; + + render() { + const { currentUser, organization } = this.props; + const showNewProjectButton = isSonarCloud() + ? organization && organization.canProvisionProjects + : isLoggedIn(currentUser); + + return ( +
+

+ {showNewProjectButton + ? translate('projects.no_projects.empty_instance.new_project') + : translate('projects.no_projects.empty_instance')} +

+ {showNewProjectButton && ( +
+

+ {translate('projects.no_projects.empty_instance.how_to_add_projects')} +

+

+ +

+
+ )} +
+ ); + } } diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectsList.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectsList.tsx index 23cf0206096..3567bf0c620 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectsList.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectsList.tsx @@ -28,10 +28,11 @@ import EmptyFavoriteSearch from './EmptyFavoriteSearch'; import EmptySearch from '../../../components/common/EmptySearch'; import { Project } from '../types'; import { Query } from '../query'; -import { Organization } from '../../../app/types'; +import { Organization, CurrentUser } from '../../../app/types'; interface Props { cardType?: string; + currentUser: CurrentUser; isFavorite: boolean; isFiltered: boolean; organization: Organization | undefined; @@ -45,11 +46,15 @@ export default class ProjectsList extends React.PureComponent { }; renderNoProjects() { - const { isFavorite, isFiltered, query } = this.props; + const { currentUser, isFavorite, isFiltered, organization, query } = this.props; if (isFiltered) { return isFavorite ? : ; } - return isFavorite ? : ; + return isFavorite ? ( + + ) : ( + + ); } renderRow = ({ index, key, style }: ListRowProps) => { diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx index babf7c999e0..a6894a80b0a 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx @@ -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. */ -/* eslint-disable import/order */ +/* eslint-disable import/order, camelcase */ import * as React from 'react'; import { shallow } from 'enzyme'; import AllProjects, { Props } from '../AllProjects'; diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/EmptyInstance-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/EmptyInstance-test.tsx index df59bbe7d66..8ecfec660f3 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/EmptyInstance-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/EmptyInstance-test.tsx @@ -20,7 +20,38 @@ import * as React from 'react'; import { shallow } from 'enzyme'; import EmptyInstance from '../EmptyInstance'; +import { isSonarCloud } from '../../../../helpers/system'; -it('renders', () => { - expect(shallow()).toMatchSnapshot(); +jest.mock('../../../../helpers/system', () => ({ + isSonarCloud: jest.fn() +})); + +it('renders correctly for SQ', () => { + (isSonarCloud as jest.Mock).mockReturnValue(false); + expect( + shallow() + ).toMatchSnapshot(); + expect( + shallow() + ).toMatchSnapshot(); +}); + +it('renders correctly for SC', () => { + (isSonarCloud as jest.Mock).mockReturnValue(true); + expect( + shallow( + + ) + ).toMatchSnapshot(); + expect( + shallow( + + ) + ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsList-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsList-test.tsx index fd28e6c2481..95e84383c53 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsList-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsList-test.tsx @@ -35,6 +35,7 @@ function shallowRender(props?: any) { return shallow( @@ -9,3 +9,61 @@ exports[`renders 1`] = ` `; + +exports[`renders correctly for SC 2`] = ` +
+

+ projects.no_projects.empty_instance.new_project +

+
+

+ projects.no_projects.empty_instance.how_to_add_projects +

+

+ +

+
+
+`; + +exports[`renders correctly for SQ 1`] = ` +
+

+ projects.no_projects.empty_instance +

+
+`; + +exports[`renders correctly for SQ 2`] = ` +
+

+ projects.no_projects.empty_instance.new_project +

+
+

+ projects.no_projects.empty_instance.how_to_add_projects +

+

+ +

+
+
+`; diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsList-test.tsx.snap b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsList-test.tsx.snap index 7dcb16317c2..3fa14ab99ee 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsList-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsList-test.tsx.snap @@ -19,7 +19,13 @@ exports[`renders different types of "no projects" 1`] = `
- +
`; diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index e007b3aea60..e5d4e15fc1a 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -739,7 +739,9 @@ issue_bulk_change.no_match=There is no issue matching your filter selection projects.page=Projects projects._projects=projects -projects.no_projects.empty_instance=Once you analyze some projects, they will show up here. +projects.no_projects.empty_instance=There is no visible project yet. +projects.no_projects.empty_instance.new_project=Once you analyze some projects, they will show up here. +projects.no_projects.empty_instance.how_to_add_projects=Here is how you can analyse new projects projects.no_favorite_projects=You don't have any favorite projects yet. projects.no_favorite_projects.engagement=Discover and mark as favorites projects you are interested in to have a quick access to them. projects.no_favorite_projects.how_to_add_projects=Here is how to add projects to this page -- 2.39.5