aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx
diff options
context:
space:
mode:
authorPhilippe Perrin <philippe.perrin@sonarsource.com>2020-02-07 14:45:12 +0100
committerSonarTech <sonartech@sonarsource.com>2020-02-21 20:46:19 +0100
commit92bdc9faf99a89c0c70945198045b1de81db2ed7 (patch)
tree28d31ab41b171eb6d562136d91d716169dc18ec2 /server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsAppRenderer.tsx
parent7421f46c36752c57290af1c53ea2e57e0cfa32fa (diff)
downloadsonarqube-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.tsx144
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>
+ );
+}