1
- import { useContext , useState } from 'react'
1
+ import { useContext } from 'react'
2
2
import { useHistory } from 'react-router-dom'
3
3
4
4
import {
@@ -25,18 +25,19 @@ import {
25
25
MaterialInfo ,
26
26
Progressing ,
27
27
SearchBar ,
28
+ SegmentedControlProps ,
28
29
useMainContext ,
29
30
} from '@devtron-labs/devtron-fe-common-lib'
30
31
31
32
import { importComponentFromFELibrary } from '@Components/common'
32
33
33
34
import { TriggerViewContext } from '../config'
34
35
import { TRIGGER_VIEW_PARAMS } from '../Constants'
35
- import { TriggerViewContextType } from '../types'
36
+ import { FilterConditionViews , HandleRuntimeParamChange , TriggerViewContextType } from '../types'
36
37
import ImageSelectionCTA from './ImageSelectionCTA'
37
38
import MaterialListEmptyState from './MaterialListEmptyState'
38
39
import RuntimeParamsSidebar from './RuntimeParamsSidebar'
39
- import { DeployImageContentProps } from './types'
40
+ import { DeployImageContentProps , ImageSelectionCTAProps , RuntimeParamsSidebarProps } from './types'
40
41
import {
41
42
getApprovedImageClass ,
42
43
getConsumedAndAvailableMaterialList ,
@@ -71,51 +72,27 @@ const DeployImageContent = ({
71
72
pipelineId,
72
73
handleClose,
73
74
isRedirectedFromAppDetails,
74
- isSearchApplied,
75
- searchText,
76
75
onSearchApply,
77
- onSearchTextChange,
78
- filterView,
79
- showConfiguredFilters,
80
76
stageType,
81
- currentSidebarTab,
82
- handleRuntimeParamsChange,
83
- runtimeParamsErrorState,
84
- handleRuntimeParamsError,
85
77
uploadRuntimeParamsFile,
86
- handleSidebarTabChange,
87
78
appName,
88
- materialInEditModeMap,
89
79
isSecurityModuleInstalled,
90
80
envName,
91
- handleShowAppliedFilters,
92
81
reloadMaterials,
93
82
parentEnvironmentName,
94
83
isVirtualEnvironment,
95
- handleImageSelection,
96
- setAppReleaseTagNames,
97
- toggleCardMode,
98
- setTagsEditable,
99
- updateCurrentAppMaterial,
100
- handleEnableFiltersView,
101
- handleFilterTabsChange,
102
84
loadOlderImages,
103
- isLoadingOlderImages,
104
85
policyConsequences,
105
- handleAllImagesView,
106
- showAppliedFilters,
107
- handleDisableFiltersView,
108
- handleDisableAppliedFiltersView,
109
86
triggerType,
110
- appliedFilterList,
87
+ deployViewState,
88
+ setDeployViewState,
89
+ setMaterialResponse,
111
90
} : DeployImageContentProps ) => {
112
91
const history = useHistory ( )
113
92
const { isSuperAdmin } = useMainContext ( )
114
93
115
94
const { onClickApprovalNode } = useContext < TriggerViewContextType > ( TriggerViewContext )
116
95
117
- const [ showSearchBar , setShowSearchBar ] = useState < boolean > ( false )
118
-
119
96
const isExceptionUser = materialResponse ?. deploymentApprovalInfo ?. approvalConfigData ?. isExceptionUser ?? false
120
97
const requestedUserId = materialResponse ?. requestedUserId
121
98
const isApprovalConfigured = getIsApprovalPolicyConfigured (
@@ -131,6 +108,22 @@ const DeployImageContent = ({
131
108
const runtimeParamsList = materialResponse ?. runtimeParams || [ ]
132
109
const isCDNode = stageType === DeploymentNodeType . CD
133
110
111
+ const {
112
+ searchText,
113
+ appliedSearchText,
114
+ filterView,
115
+ showConfiguredFilters,
116
+ currentSidebarTab,
117
+ runtimeParamsErrorState,
118
+ materialInEditModeMap,
119
+ showAppliedFilters,
120
+ appliedFilterList,
121
+ isLoadingOlderImages,
122
+ showSearchBar,
123
+ } = deployViewState
124
+
125
+ const isSearchApplied = ! ! appliedSearchText
126
+
134
127
const { consumedImage, materialList, eligibleImagesCount } = getConsumedAndAvailableMaterialList ( {
135
128
isApprovalConfigured,
136
129
isExceptionUser,
@@ -144,6 +137,93 @@ const DeployImageContent = ({
144
137
const showActionBar = FilterActionBar && ! isSearchApplied && ! ! resourceFilters ?. length && ! showConfiguredFilters
145
138
const areNoMoreImagesPresent = materials . length >= materialResponse ?. totalCount
146
139
140
+ const handleSidebarTabChange : RuntimeParamsSidebarProps [ 'handleSidebarTabChange' ] = ( e ) => {
141
+ setDeployViewState ( ( prevState ) => ( {
142
+ ...prevState ,
143
+ currentSidebarTab : e . target . value as CDMaterialSidebarType ,
144
+ } ) )
145
+ }
146
+
147
+ const onSearchTextChange = ( newSearchText : string ) => {
148
+ setDeployViewState ( ( prevState ) => ( {
149
+ ...prevState ,
150
+ searchText : newSearchText ,
151
+ } ) )
152
+ }
153
+
154
+ const handleAllImagesView = ( ) => {
155
+ setDeployViewState ( ( prevState ) => ( {
156
+ ...prevState ,
157
+ filterView : FilterConditionViews . ALL ,
158
+ } ) )
159
+ }
160
+
161
+ const handleFilterTabsChange : SegmentedControlProps [ 'onChange' ] = ( selectedSegment ) => {
162
+ const { value } = selectedSegment
163
+ setDeployViewState ( ( prevState ) => ( {
164
+ ...prevState ,
165
+ filterView : value as FilterConditionViews ,
166
+ } ) )
167
+ }
168
+
169
+ const handleShowConfiguredFilters = ( ) => {
170
+ setDeployViewState ( ( prevState ) => ( {
171
+ ...prevState ,
172
+ showConfiguredFilters : true ,
173
+ } ) )
174
+ }
175
+
176
+ const handleExitFiltersView = ( ) => {
177
+ setDeployViewState ( ( prevState ) => ( {
178
+ ...prevState ,
179
+ showConfiguredFilters : false ,
180
+ } ) )
181
+ }
182
+
183
+ const handleDisableAppliedFiltersView = ( ) => {
184
+ setDeployViewState ( ( prevState ) => ( {
185
+ ...prevState ,
186
+ appliedFilterList : [ ] ,
187
+ showAppliedFilters : false ,
188
+ } ) )
189
+ }
190
+
191
+ const getHandleShowAppliedFilters = ( materialData : CDMaterialType ) => ( ) => {
192
+ setDeployViewState ( ( prevState ) => ( {
193
+ ...prevState ,
194
+ appliedFilterList : materialData ?. appliedFilters ?? [ ] ,
195
+ showAppliedFilters : true ,
196
+ } ) )
197
+ }
198
+
199
+ const handleShowSearchBar = ( ) => {
200
+ setDeployViewState ( ( prevState ) => ( {
201
+ ...prevState ,
202
+ showSearchBar : true ,
203
+ } ) )
204
+ }
205
+
206
+ const handleImageSelection : ImageSelectionCTAProps [ 'handleImageSelection' ] = ( materialIndex ) => {
207
+ const updatedMaterialList = materialList . map ( ( material , index ) => ( {
208
+ ...material ,
209
+ isSelected : index === materialIndex ,
210
+ } ) )
211
+
212
+ setMaterialResponse ( ( prevData ) => {
213
+ const updatedMaterialResponse = structuredClone ( prevData )
214
+ updatedMaterialResponse . materials = updatedMaterialList
215
+ return updatedMaterialResponse
216
+ } )
217
+ }
218
+
219
+ const setAppReleaseTagNames : ImageTaggingContainerType [ 'setAppReleaseTagNames' ] = ( appReleaseTagNames ) => {
220
+ setMaterialResponse ( ( prevData ) => {
221
+ const updatedMaterialResponse = structuredClone ( prevData )
222
+ updatedMaterialResponse . appReleaseTagNames = appReleaseTagNames
223
+ return updatedMaterialResponse
224
+ } )
225
+ }
226
+
147
227
const viewAllImages = ( ) => {
148
228
if ( isRedirectedFromAppDetails ) {
149
229
history . push ( {
@@ -155,10 +235,6 @@ const DeployImageContent = ({
155
235
}
156
236
}
157
237
158
- const handleShowSearchBar = ( ) => {
159
- setShowSearchBar ( true )
160
- }
161
-
162
238
const renderSearch = ( ) => (
163
239
< SearchBar
164
240
initialSearchText = { searchText }
@@ -173,6 +249,63 @@ const DeployImageContent = ({
173
249
/>
174
250
)
175
251
252
+ const updateCurrentAppMaterial : ImageTaggingContainerType [ 'updateCurrentAppMaterial' ] = (
253
+ matId ,
254
+ imageReleaseTags ,
255
+ imageComment ,
256
+ ) => {
257
+ const updatedMaterialList = materialList . map ( ( material ) => {
258
+ if ( + material . id === + matId ) {
259
+ return {
260
+ ...material ,
261
+ imageReleaseTags,
262
+ imageComment,
263
+ }
264
+ }
265
+ return material
266
+ } )
267
+
268
+ setMaterialResponse ( ( prevData ) => {
269
+ const updatedMaterialResponse = structuredClone ( prevData )
270
+ updatedMaterialResponse . materials = updatedMaterialList
271
+ return updatedMaterialResponse
272
+ } )
273
+ }
274
+
275
+ const setTagsEditable : ImageTaggingContainerType [ 'setTagsEditable' ] = ( tagsEditable ) => {
276
+ setMaterialResponse ( ( prevData ) => {
277
+ const updatedMaterialResponse = structuredClone ( prevData )
278
+ updatedMaterialResponse . tagsEditable = tagsEditable
279
+ return updatedMaterialResponse
280
+ } )
281
+ }
282
+
283
+ const handleRuntimeParamsChange : HandleRuntimeParamChange = ( updatedRuntimeParamsList ) => {
284
+ setMaterialResponse ( ( prevData ) => {
285
+ const updatedMaterialResponse = structuredClone ( prevData )
286
+ updatedMaterialResponse . runtimeParams = updatedRuntimeParamsList
287
+ return updatedMaterialResponse
288
+ } )
289
+ }
290
+
291
+ const handleRuntimeParamsError = ( updatedRuntimeParamsErrorState : typeof runtimeParamsErrorState ) => {
292
+ setDeployViewState ( ( prevState ) => ( {
293
+ ...prevState ,
294
+ runtimeParamsErrorState : updatedRuntimeParamsErrorState ,
295
+ } ) )
296
+ }
297
+
298
+ const toggleCardMode : ImageTaggingContainerType [ 'toggleCardMode' ] = ( index : number ) => {
299
+ setDeployViewState ( ( prevState ) => {
300
+ const newMaterialInEditModeMap = new Map ( prevState . materialInEditModeMap )
301
+ newMaterialInEditModeMap . set ( index , ! newMaterialInEditModeMap . get ( index ) )
302
+ return {
303
+ ...prevState ,
304
+ materialInEditModeMap : newMaterialInEditModeMap ,
305
+ }
306
+ } )
307
+ }
308
+
176
309
const getImageTagContainerProps = ( mat : CDMaterialType ) : ImageTaggingContainerType => ( {
177
310
ciPipelineId : null ,
178
311
artifactId : + mat . id ,
@@ -229,7 +362,7 @@ const DeployImageContent = ({
229
362
appliedFiltersTimestamp = { handleUTCTime ( materialData . appliedFiltersTimestamp ) }
230
363
envName = { envName }
231
364
// Should not use Arrow function here but seems like no choice
232
- showConfiguredFilters = { ( ) => handleShowAppliedFilters ( materialData ) }
365
+ showConfiguredFilters = { getHandleShowAppliedFilters ( materialData ) }
233
366
filterState = { materialData . appliedFiltersState }
234
367
dataSource = { materialData . dataSource }
235
368
deploymentWindowArtifactMetadata = { materialData . deploymentWindowArtifactMetadata }
@@ -361,7 +494,7 @@ const DeployImageContent = ({
361
494
isFromBulkCD = { isBulkTrigger }
362
495
resourceFilters = { showConfiguredFilters ? resourceFilters : appliedFilterList }
363
496
handleDisableFiltersView = {
364
- showConfiguredFilters ? handleDisableFiltersView : handleDisableAppliedFiltersView
497
+ showConfiguredFilters ? handleExitFiltersView : handleDisableAppliedFiltersView
365
498
}
366
499
envName = { envName }
367
500
closeModal = { handleClose }
@@ -411,7 +544,7 @@ const DeployImageContent = ({
411
544
consumedImage . length ,
412
545
) }
413
546
onChange = { handleFilterTabsChange }
414
- handleEnableFiltersView = { handleEnableFiltersView }
547
+ handleEnableFiltersView = { handleShowConfiguredFilters }
415
548
initialTab = { filterView }
416
549
/>
417
550
) : (
@@ -466,7 +599,7 @@ const DeployImageContent = ({
466
599
loadOlderImages = { loadOlderImages }
467
600
onSearchApply = { onSearchApply }
468
601
eligibleImagesCount = { eligibleImagesCount }
469
- handleEnableFiltersView = { handleEnableFiltersView }
602
+ handleEnableFiltersView = { handleShowConfiguredFilters }
470
603
handleAllImagesView = { handleAllImagesView }
471
604
/>
472
605
) : (
0 commit comments