diff options
author | Philippe Perrin <philippe.perrin@sonarsource.com> | 2020-02-07 14:45:12 +0100 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2020-02-21 20:46:19 +0100 |
commit | 92bdc9faf99a89c0c70945198045b1de81db2ed7 (patch) | |
tree | 28d31ab41b171eb6d562136d91d716169dc18ec2 /server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx | |
parent | 7421f46c36752c57290af1c53ea2e57e0cfa32fa (diff) | |
download | sonarqube-92bdc9faf99a89c0c70945198045b1de81db2ed7.tar.gz sonarqube-92bdc9faf99a89c0c70945198045b1de81db2ed7.zip |
SONAR-12754 Assignee change are made directly from the main screen
Diffstat (limited to 'server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx')
-rw-r--r-- | server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx b/server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx new file mode 100644 index 00000000000..898dcbe5074 --- /dev/null +++ b/server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx @@ -0,0 +1,144 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import * as React from 'react'; +import { Helmet } from 'react-helmet-async'; +import DeferredSpinner from 'sonar-ui-common/components/ui/DeferredSpinner'; +import { translate } from 'sonar-ui-common/helpers/l10n'; +import A11ySkipTarget from '../../app/components/a11y/A11ySkipTarget'; +import Suggestions from '../../app/components/embed-docs-modal/Suggestions'; +import ScreenPositionHelper from '../../components/common/ScreenPositionHelper'; +import { isBranch } from '../../helpers/branch-like'; +import { BranchLike } from '../../types/branch-like'; +import { + HotspotFilters, + HotspotStatusFilter, + HotspotUpdate, + RawHotspot +} from '../../types/security-hotspots'; +import EmptyHotspotsPage from './components/EmptyHotspotsPage'; +import FilterBar from './components/FilterBar'; +import HotspotList from './components/HotspotList'; +import HotspotViewer from './components/HotspotViewer'; +import './styles.css'; + +export interface SecurityHotspotsAppRendererProps { + branchLike?: BranchLike; + filters: HotspotFilters; + hotspots: RawHotspot[]; + hotspotsReviewedMeasure?: string; + hotspotsTotal?: number; + isProject: boolean; + isStaticListOfHotspots: boolean; + loading: boolean; + loadingMeasure: boolean; + loadingMore: boolean; + onChangeFilters: (filters: Partial<HotspotFilters>) => void; + onHotspotClick: (key: string) => void; + onLoadMore: () => void; + onShowAllHotspots: () => void; + onUpdateHotspot: (hotspot: HotspotUpdate) => void; + selectedHotspotKey?: string; + securityCategories: T.StandardSecurityCategories; +} + +export default function SecurityHotspotsAppRenderer(props: SecurityHotspotsAppRendererProps) { + const { + branchLike, + hotspots, + hotspotsReviewedMeasure, + hotspotsTotal, + isProject, + isStaticListOfHotspots, + loading, + loadingMeasure, + loadingMore, + securityCategories, + selectedHotspotKey, + filters + } = props; + + return ( + <div id="security_hotspots"> + <FilterBar + filters={filters} + hotspotsReviewedMeasure={hotspotsReviewedMeasure} + isProject={isProject} + isStaticListOfHotspots={isStaticListOfHotspots} + loadingMeasure={loadingMeasure} + onBranch={isBranch(branchLike)} + onChangeFilters={props.onChangeFilters} + onShowAllHotspots={props.onShowAllHotspots} + /> + <ScreenPositionHelper> + {({ top }) => ( + <div className="wrapper" style={{ top }}> + <Suggestions suggestions="security_hotspots" /> + <Helmet title={translate('hotspots.page')} /> + + <A11ySkipTarget anchor="security_hotspots_main" /> + + {loading ? ( + <DeferredSpinner className="huge-spacer-left big-spacer-top" /> + ) : ( + <> + {hotspots.length === 0 ? ( + <EmptyHotspotsPage + filtered={ + filters.assignedToMe || + (isBranch(branchLike) && filters.sinceLeakPeriod) || + filters.status !== HotspotStatusFilter.TO_REVIEW + } + isStaticListOfHotspots={isStaticListOfHotspots} + /> + ) : ( + <div className="layout-page"> + <div className="sidebar"> + <HotspotList + hotspots={hotspots} + hotspotsTotal={hotspotsTotal} + isStaticListOfHotspots={isStaticListOfHotspots} + loadingMore={loadingMore} + onHotspotClick={props.onHotspotClick} + onLoadMore={props.onLoadMore} + securityCategories={securityCategories} + selectedHotspotKey={selectedHotspotKey} + statusFilter={filters.status} + /> + </div> + <div className="main"> + {selectedHotspotKey && ( + <HotspotViewer + branchLike={branchLike} + hotspotKey={selectedHotspotKey} + onUpdateHotspot={props.onUpdateHotspot} + securityCategories={securityCategories} + /> + )} + </div> + </div> + )} + </> + )} + </div> + )} + </ScreenPositionHelper> + </div> + ); +} |