1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/*
* SonarQube
* Copyright (C) 2009-2022 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 withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
import DeferredSpinner from '../../../components/ui/DeferredSpinner';
import { fillBranchLike } from '../../../helpers/branch-like';
import { Hotspot, HotspotStatusOption } from '../../../types/security-hotspots';
import { Component } from '../../../types/types';
import { CurrentUser } from '../../../types/users';
import { HotspotHeader } from './HotspotHeader';
import HotspotReviewHistoryAndComments from './HotspotReviewHistoryAndComments';
import HotspotSnippetContainer from './HotspotSnippetContainer';
import './HotspotViewer.css';
import HotspotViewerTabs from './HotspotViewerTabs';
import StatusUpdateSuccessModal from './StatusUpdateSuccessModal';
export interface HotspotViewerRendererProps {
component: Component;
currentUser: CurrentUser;
hotspot?: Hotspot;
hotspotsReviewedMeasure?: string;
lastStatusChangedTo?: HotspotStatusOption;
loading: boolean;
commentTextRef: React.RefObject<HTMLTextAreaElement>;
onCloseStatusUpdateSuccessModal: () => void;
onUpdateHotspot: (statusUpdate?: boolean, statusOption?: HotspotStatusOption) => Promise<void>;
onShowCommentForm: () => void;
onSwitchFilterToStatusOfUpdatedHotspot: () => void;
onLocationClick: (index: number) => void;
showStatusUpdateSuccessModal: boolean;
selectedHotspotLocation?: number;
}
export function HotspotViewerRenderer(props: HotspotViewerRendererProps) {
const {
component,
currentUser,
hotspot,
hotspotsReviewedMeasure,
loading,
lastStatusChangedTo,
showStatusUpdateSuccessModal,
commentTextRef,
selectedHotspotLocation
} = props;
return (
<DeferredSpinner className="big-spacer-left big-spacer-top" loading={loading}>
{showStatusUpdateSuccessModal && (
<StatusUpdateSuccessModal
hotspotsReviewedMeasure={hotspotsReviewedMeasure}
lastStatusChangedTo={lastStatusChangedTo}
onClose={props.onCloseStatusUpdateSuccessModal}
onSwitchFilterToStatusOfUpdatedHotspot={props.onSwitchFilterToStatusOfUpdatedHotspot}
/>
)}
{hotspot && (
<div className="big-padded hotspot-content">
<HotspotHeader hotspot={hotspot} onUpdateHotspot={props.onUpdateHotspot} />
<HotspotViewerTabs
codeTabContent={
<HotspotSnippetContainer
branchLike={fillBranchLike(hotspot.project.branch, hotspot.project.pullRequest)}
component={component}
hotspot={hotspot}
onCommentButtonClick={props.onShowCommentForm}
onLocationSelect={props.onLocationClick}
selectedHotspotLocation={selectedHotspotLocation}
/>
}
hotspot={hotspot}
selectedHotspotLocation={selectedHotspotLocation}
/>
<HotspotReviewHistoryAndComments
commentTextRef={commentTextRef}
currentUser={currentUser}
hotspot={hotspot}
onCommentUpdate={props.onUpdateHotspot}
/>
</div>
)}
</DeferredSpinner>
);
}
export default withCurrentUserContext(HotspotViewerRenderer);
|