From 1de495806592ec053c70322de93f797019a448d3 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Fri, 29 Jun 2018 17:10:48 +0200 Subject: [PATCH] SONAR-10677 Reduce amount of DOM nodes on Projects page (#456) --- .../apps/projects/components/ProjectCard.tsx | 1 + .../projects/components/ProjectCardLeak.tsx | 5 +- .../components/ProjectCardOverall.tsx | 5 +- .../apps/projects/components/ProjectsList.tsx | 63 ++++++++++++++++--- .../__tests__/ProjectCardLeak-test.tsx | 10 +-- .../__tests__/ProjectCardOverall-test.tsx | 12 ++-- .../ProjectCardLeak-test.tsx.snap | 5 ++ .../ProjectCardOverall-test.tsx.snap | 5 ++ .../__snapshots__/ProjectsList-test.tsx.snap | 26 +++----- 9 files changed, 88 insertions(+), 44 deletions(-) diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCard.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCard.tsx index 05d94b9e787..d572edb0d5b 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCard.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCard.tsx @@ -23,6 +23,7 @@ import ProjectCardOverall from './ProjectCardOverall'; import { Project } from '../types'; interface Props { + height: number; organization?: { key: string }; project: Project; type?: string; diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLeak.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLeak.tsx index c0328c25e07..b6a3c63c2b4 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLeak.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardLeak.tsx @@ -31,18 +31,19 @@ import { translate, translateWithParameters } from '../../../helpers/l10n'; import { Project } from '../types'; interface Props { + height: number; organization?: { key: string }; project: Project; } -export default function ProjectCardLeak({ organization, project }: Props) { +export default function ProjectCardLeak({ height, organization, project }: Props) { const { measures } = project; const isPrivate = project.visibility === 'private'; const hasTags = project.tags.length > 0; return ( -
+
{project.isFavorite != null && ( diff --git a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx index 72d44b470f7..f653d14975d 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/ProjectCardOverall.tsx @@ -30,18 +30,19 @@ import { translate, translateWithParameters } from '../../../helpers/l10n'; import { Project } from '../types'; interface Props { + height: number; organization?: { key: string }; project: Project; } -export default function ProjectCardOverall({ organization, project }: Props) { +export default function ProjectCardOverall({ height, organization, project }: Props) { const { measures } = project; const isPrivate = project.visibility === 'private'; const hasTags = project.tags.length > 0; return ( -
+
{project.isFavorite !== undefined && ( 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 491da7f539b..a019fca6cbf 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 @@ -18,6 +18,9 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import * as React from 'react'; +import { AutoSizer } from 'react-virtualized/dist/commonjs/AutoSizer'; +import { List, ListRowProps } from 'react-virtualized/dist/commonjs/List'; +import { WindowScroller } from 'react-virtualized/dist/commonjs/WindowScroller'; import ProjectCard from './ProjectCard'; import NoFavoriteProjects from './NoFavoriteProjects'; import EmptyInstance from './EmptyInstance'; @@ -36,6 +39,10 @@ interface Props { } export default class ProjectsList extends React.PureComponent { + getCardHeight = () => { + return this.props.cardType === 'leak' ? 159 : 143; + }; + renderNoProjects() { const { isFavorite, isFiltered, query } = this.props; if (isFiltered) { @@ -44,21 +51,57 @@ export default class ProjectsList extends React.PureComponent { return isFavorite ? : ; } + renderRow = ({ index, key, style }: ListRowProps) => { + const project = this.props.projects[index]; + const height = this.getCardHeight(); + return ( +
+ +
+ ); + }; + + renderList() { + const cardHeight = this.getCardHeight(); + return ( + + {({ height, isScrolling, registerChild, onChildScroll, scrollTop }) => ( + + {({ width }) => ( +
+ +
+ )} +
+ )} +
+ ); + } + render() { const { projects } = this.props; return (
- {projects.length > 0 - ? projects.map(project => ( - - )) - : this.renderNoProjects()} + {projects.length > 0 ? this.renderList() : this.renderNoProjects()}
); } diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLeak-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLeak-test.tsx index 70bf9401111..3a25da57bf3 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLeak-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLeak-test.tsx @@ -40,7 +40,7 @@ const PROJECT = { }; it('should display analysis date and leak start date', () => { - const card = shallow(); + const card = shallow(); expect(card.find('.project-card-dates').exists()).toBeTruthy(); expect(card.find('.project-card-dates').find('DateFromNow')).toHaveLength(1); expect(card.find('.project-card-dates').find('DateTimeFormatter')).toHaveLength(1); @@ -48,14 +48,14 @@ it('should display analysis date and leak start date', () => { it('should not display analysis date or leak start date', () => { const project = { ...PROJECT, analysisDate: undefined }; - const card = shallow(); + const card = shallow(); expect(card.find('.project-card-dates').exists()).toBeFalsy(); }); it('should display tags', () => { const project = { ...PROJECT, tags: ['foo', 'bar'] }; expect( - shallow() + shallow() .find('TagsList') .exists() ).toBeTruthy(); @@ -64,12 +64,12 @@ it('should display tags', () => { it('should private badge', () => { const project = { ...PROJECT, visibility: 'private' }; expect( - shallow() + shallow() .find('PrivateBadge') .exists() ).toBeTruthy(); }); it('should display the leak measures and quality gate', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardOverall-test.tsx b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardOverall-test.tsx index 10dc9eaa739..fc3e58bbd80 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardOverall-test.tsx +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardOverall-test.tsx @@ -40,12 +40,12 @@ const PROJECT = { it('should display analysis date (and not leak period) when defined', () => { expect( - shallow() + shallow() .find('.project-card-dates') .exists() ).toBeTruthy(); expect( - shallow() + shallow() .find('.project-card-dates') .exists() ).toBeFalsy(); @@ -54,7 +54,7 @@ it('should display analysis date (and not leak period) when defined', () => { it('should not display the quality gate', () => { const project = { ...PROJECT, analysisDate: undefined }; expect( - shallow() + shallow() .find('ProjectCardOverallQualityGate') .exists() ).toBeFalsy(); @@ -63,7 +63,7 @@ it('should not display the quality gate', () => { it('should display tags', () => { const project = { ...PROJECT, tags: ['foo', 'bar'] }; expect( - shallow() + shallow() .find('TagsList') .exists() ).toBeTruthy(); @@ -72,12 +72,12 @@ it('should display tags', () => { it('should private badge', () => { const project = { ...PROJECT, visibility: 'private' }; expect( - shallow() + shallow() .find('PrivateBadge') .exists() ).toBeTruthy(); }); it('should display the overall measures and quality gate', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardLeak-test.tsx.snap b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardLeak-test.tsx.snap index deca57a4c53..fa106ed2ac6 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardLeak-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardLeak-test.tsx.snap @@ -4,6 +4,11 @@ exports[`should display the leak measures and quality gate 1`] = `
- -
`; -- 2.39.5