1
1
import React , { useContext , useEffect , useState } from 'react'
2
- import { ReactComponent as Close } from '../../assets/icons/ic-close.svg'
3
- import { ReactComponent as Add } from '../../assets/icons/ic-add.svg'
4
- import { ReactComponent as QuestionIcon } from '../v2/assets/icons/ic-question.svg'
5
- import { ReactComponent as HelpIcon } from '../../assets/icons/ic-help.svg'
2
+ import { CIBuildConfigType , CIBuildType , noop } from '@devtron-labs/devtron-fe-common-lib'
6
3
import CIConfig from '../ciConfig/CIConfig'
4
+ import DockerArgs from './DockerArgs'
5
+ import CustomImageTags from './CustomImageTags'
6
+ import TargetPlatformSelector from '../ciConfig/TargetPlatformSelector'
7
7
import { ComponentStates } from '../EnvironmentOverride/EnvironmentOverrides.type'
8
8
import { AdvancedConfigOptionsProps , CIConfigParentState } from '../ciConfig/types'
9
9
import { DockerConfigOverrideKeys } from '../ciPipeline/types'
10
- import { CIBuildConfigType , CIBuildType , CustomInput , noop , TippyCustomized , TippyTheme } from '@devtron-labs/devtron-fe-common-lib'
11
- import { getTargetPlatformMap } from '../ciConfig/CIConfig.utils'
12
- import TargetPlatformSelector from '../ciConfig/TargetPlatformSelector'
13
10
import { OptionType } from '../app/types'
14
- import '../ciConfig/CIConfig.scss '
15
- import CustomImageTags from './CustomImageTags '
11
+ import { DockerArgsAction , HandleDockerArgsUpdateType } from './types '
12
+ import { getTargetPlatformMap } from '../ciConfig/CIConfig.utils '
16
13
import { pipelineContext } from '../workflowEditor/workflowEditor'
14
+ import '../ciConfig/CIConfig.scss'
17
15
18
16
export default function AdvancedConfigOptions ( {
19
17
ciPipeline,
20
18
} : AdvancedConfigOptionsProps ) {
21
- const {
22
- formData,
23
- setFormData,
24
- loadingState,
25
- setLoadingState,
26
- formDataErrorObj,
27
- setFormDataErrorObj
28
- } = useContext ( pipelineContext )
19
+ const { formData, setFormData, loadingState, setLoadingState, formDataErrorObj, setFormDataErrorObj } =
20
+ useContext ( pipelineContext )
29
21
const [ collapsedSection , setCollapsedSection ] = useState < boolean > ( false )
22
+ // TODO: Should be getting that from formData, redundant state
30
23
const [ allowOverride , setAllowOverride ] = useState < boolean > ( ciPipeline ?. isDockerConfigOverridden ?? false )
31
24
const [ parentState , setParentState ] = useState < CIConfigParentState > ( {
32
25
loadingState : ComponentStates . loading ,
@@ -41,7 +34,13 @@ export default function AdvancedConfigOptions({
41
34
const targetPlatformMap = getTargetPlatformMap ( )
42
35
const [ selectedTargetPlatforms , setSelectedTargetPlatforms ] = useState < OptionType [ ] > ( [ ] )
43
36
const [ showCustomPlatformWarning , setShowCustomPlatformWarning ] = useState < boolean > ( false )
44
-
37
+
38
+ const isGlobalAndNotBuildpack =
39
+ ! allowOverride && parentState . ciConfig ?. ciBuildConfig . ciBuildType !== CIBuildType . BUILDPACK_BUILD_TYPE
40
+ const isCurrentCITypeBuildpack = parentState . currentCIBuildType === CIBuildType . BUILDPACK_BUILD_TYPE
41
+ const hasParentLoaded = parentState ?. loadingState === ComponentStates . loaded
42
+ const showNonBuildpackOptions = hasParentLoaded && ( isGlobalAndNotBuildpack || ! isCurrentCITypeBuildpack )
43
+
45
44
useEffect ( ( ) => {
46
45
if ( parentState . ciConfig ) {
47
46
populateCurrentPlatformsData ( )
@@ -69,31 +68,28 @@ export default function AdvancedConfigOptions({
69
68
setShowCustomPlatformWarning ( _customTargetPlatform )
70
69
}
71
70
72
- const addDockerArg = ( ) : void => {
71
+ // All updates to docker args will be handled here, which will will be further merged into formData on introduction of reducer
72
+ const handleDockerArgsUpdate = ( { action, argData } : HandleDockerArgsUpdateType ) => {
73
73
const _form = { ...formData }
74
74
75
- if ( _form . args . length > 0 ) {
76
- _form . args . unshift ( { key : '' , value : '' } )
77
- } else {
78
- _form . args . push ( { key : '' , value : '' } )
79
- }
75
+ switch ( action ) {
76
+ case DockerArgsAction . ADD :
77
+ _form . args . unshift ( { key : '' , value : '' } )
78
+ break
80
79
81
- setFormData ( _form )
82
- }
80
+ case DockerArgsAction . UPDATE_KEY :
81
+ _form . args [ argData . index ] [ 'key' ] = argData . value
82
+ break
83
83
84
- const handleDockerArgChange = ( event , index : number , key : 'key' | 'value' ) : void => {
85
- const _form = { ...formData }
86
- _form . args [ index ] [ key ] = event . target . value
87
- setFormData ( _form )
88
- }
84
+ case DockerArgsAction . UPDATE_VALUE :
85
+ _form . args [ argData . index ] [ 'value' ] = argData . value
86
+ break
89
87
90
- const removeDockerArgs = ( index : number ) : void => {
91
- const _form = { ...formData }
92
- const newArgs = [ ]
93
- for ( let i = 0 ; i < _form . args . length ; i ++ ) {
94
- if ( index != i ) newArgs . push ( _form . args [ i ] )
88
+ case DockerArgsAction . DELETE :
89
+ _form . args = _form . args . filter ( ( _ , index ) => index !== argData . index )
90
+ break
95
91
}
96
- _form . args = newArgs
92
+
97
93
setFormData ( _form )
98
94
}
99
95
@@ -151,71 +147,6 @@ export default function AdvancedConfigOptions({
151
147
setFormData ( _form )
152
148
}
153
149
154
- const renderDockerArgs = ( ) => {
155
- return (
156
- < div >
157
- < h3 className = "flex left fs-13 fw-6 cn-9 lh-20 m-0" >
158
- Docker build arguments
159
- < TippyCustomized
160
- theme = { TippyTheme . white }
161
- className = "w-300"
162
- placement = "top"
163
- Icon = { HelpIcon }
164
- iconClass = "fcv-5"
165
- heading = "Docker Build Arguments"
166
- infoText = "Key/value pair will be appended as docker build arguments (--build-args)."
167
- showCloseButton = { true }
168
- trigger = "click"
169
- interactive = { true }
170
- >
171
- < QuestionIcon className = "icon-dim-16 fcn-6 ml-4 cursor" />
172
- </ TippyCustomized >
173
- </ h3 >
174
- < p className = "fs-13 fw-4 cn-7 lh-20 m-0" > Override docker build configurations for this pipeline.</ p >
175
- < div className = "pointer cb-5 fw-6 fs-13 flexbox content-fit lh-32 mt-8" onClick = { addDockerArg } data-testid = "create-build-pipeline-docker-args-add-parameter-button" >
176
- < Add className = "add-icon mt-6" />
177
- Add parameter
178
- </ div >
179
- { formData . args . length > 0 &&
180
- formData . args . map ( ( arg , index ) => {
181
- return (
182
- < div className = "flexbox justify-space" key = { `build-${ index } ` } >
183
- < div className = "mt-8 w-100" >
184
- < CustomInput
185
- name = "arg-key"
186
- data-testid = { `docker-arg-key-${ index } ` }
187
- rootClassName = "w-100 dc__top-radius-4 pl-10 pr-10 pt-6 pb-6 en-2 bw-1"
188
- autoComplete = "off"
189
- placeholder = "Key"
190
- type = "text"
191
- value = { arg . key }
192
- onChange = { ( event ) => {
193
- handleDockerArgChange ( event , index , 'key' )
194
- } }
195
- />
196
- < textarea
197
- data-testid = { `docker-arg-value-${ index } ` }
198
- className = "build__value w-100 dc__bottom-radius-4 dc__no-top-border pl-10 pr-10 pt-6 pb-6 en-2 bw-1"
199
- value = { arg . value }
200
- onChange = { ( event ) => {
201
- handleDockerArgChange ( event , index , 'value' )
202
- } }
203
- placeholder = "Value"
204
- />
205
- </ div >
206
- < Close
207
- className = "icon-dim-24 pointer mt-6 ml-6"
208
- onClick = { ( ) => {
209
- removeDockerArgs ( index )
210
- } }
211
- />
212
- </ div >
213
- )
214
- } ) }
215
- </ div >
216
- )
217
- }
218
-
219
150
const toggleAdvancedOptions = ( ) : void => {
220
151
setCollapsedSection ( ! collapsedSection )
221
152
}
@@ -240,6 +171,7 @@ export default function AdvancedConfigOptions({
240
171
className = { `allow-config-override flex h-28 ml-auto cta ${ allowOverride ? 'delete' : 'ghosted' } ` }
241
172
data-testid = { `create-build-pipeline-${ allowOverride ? 'delete' : 'allow' } -override-button` }
242
173
onClick = { toggleAllowOverride }
174
+ type = "button"
243
175
>
244
176
{ `${ allowOverride ? 'Delete' : 'Allow' } Override` }
245
177
</ button >
@@ -256,33 +188,35 @@ export default function AdvancedConfigOptions({
256
188
setLoadingStateFromParent = { setLoadingState }
257
189
/>
258
190
259
- { parentState ?. loadingState === ComponentStates . loaded &&
260
- parentState . currentCIBuildType !== CIBuildType . BUILDPACK_BUILD_TYPE && (
261
- < >
262
- < div className = "white-card white-card__docker-config dc__position-rel mb-15" >
263
- < TargetPlatformSelector
264
- allowOverride = { allowOverride }
265
- selectedTargetPlatforms = { selectedTargetPlatforms }
266
- setSelectedTargetPlatforms = { setSelectedTargetPlatforms }
267
- showCustomPlatformWarning = { showCustomPlatformWarning }
268
- setShowCustomPlatformWarning = { setShowCustomPlatformWarning }
269
- targetPlatformMap = { targetPlatformMap }
270
- targetPlatform = { targetPlatforms }
271
- configOverrideView = { true }
272
- updateDockerConfigOverride = { updateDockerConfigOverride }
273
- />
274
- </ div >
275
- < CustomImageTags
276
- savedTagPattern = { parentState . selectedCIPipeline . customTag ?. tagPattern }
277
- formData = { formData }
278
- setFormData = { setFormData }
279
- formDataErrorObj = { formDataErrorObj }
280
- setFormDataErrorObj = { setFormDataErrorObj }
281
- />
282
-
283
- { renderDockerArgs ( ) }
284
- </ >
285
- ) }
191
+ { showNonBuildpackOptions && (
192
+ < div className = "white-card white-card__docker-config dc__position-rel mb-15" >
193
+ < TargetPlatformSelector
194
+ allowOverride = { allowOverride }
195
+ selectedTargetPlatforms = { selectedTargetPlatforms }
196
+ setSelectedTargetPlatforms = { setSelectedTargetPlatforms }
197
+ showCustomPlatformWarning = { showCustomPlatformWarning }
198
+ setShowCustomPlatformWarning = { setShowCustomPlatformWarning }
199
+ targetPlatformMap = { targetPlatformMap }
200
+ targetPlatform = { targetPlatforms }
201
+ configOverrideView = { true }
202
+ updateDockerConfigOverride = { updateDockerConfigOverride }
203
+ />
204
+ </ div >
205
+ ) }
206
+
207
+ { hasParentLoaded && (
208
+ < CustomImageTags
209
+ savedTagPattern = { parentState . selectedCIPipeline . customTag ?. tagPattern }
210
+ formData = { formData }
211
+ setFormData = { setFormData }
212
+ formDataErrorObj = { formDataErrorObj }
213
+ setFormDataErrorObj = { setFormDataErrorObj }
214
+ />
215
+ ) }
216
+
217
+ { showNonBuildpackOptions && (
218
+ < DockerArgs args = { formData . args } handleDockerArgsUpdate = { handleDockerArgsUpdate } />
219
+ ) }
286
220
</ div >
287
221
</ div >
288
222
)
0 commit comments