Skip to content

Commit 8540f75

Browse files
author
Mukul Tayal
committed
Merge branch 'main' of https://github.com/devtron-labs/dashboard into log-download
2 parents 9298b4c + 448ec3a commit 8540f75

File tree

19 files changed

+236
-60
lines changed

19 files changed

+236
-60
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"homepage": "/dashboard",
66
"dependencies": {
7-
"@devtron-labs/devtron-fe-common-lib": "0.0.58",
7+
"@devtron-labs/devtron-fe-common-lib": "0.0.60",
88
"@rjsf/core": "^5.13.3",
99
"@rjsf/utils": "^5.13.3",
1010
"@rjsf/validator-ajv8": "^5.13.3",

src/components/EnvironmentOverride/DeploymentTemplateOverrideForm.tsx

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect, useMemo, useState } from 'react'
1+
import React, { useEffect, useMemo, useRef, useState } from 'react'
22
import { useParams } from 'react-router-dom'
33
import { toast } from 'react-toastify'
44
import YAML from 'yaml'
@@ -27,11 +27,14 @@ import {
2727
validateBasicView,
2828
} from '../deploymentConfig/DeploymentConfig.utils'
2929
import CodeEditor from '../CodeEditor/CodeEditor'
30+
import * as jsonpatch from 'fast-json-patch'
3031

3132
const ConfigToolbar = importComponentFromFELibrary('ConfigToolbar', DeploymentConfigToolbar)
3233
const SaveChangesModal = importComponentFromFELibrary('SaveChangesModal')
3334
const DeleteOverrideDraftModal = importComponentFromFELibrary('DeleteOverrideDraftModal')
3435
const DeploymentTemplateLockedDiff = importComponentFromFELibrary('DeploymentTemplateLockedDiff')
36+
const applyPatches=importComponentFromFELibrary('applyPatches', null, 'function')
37+
3538
export default function DeploymentTemplateOverrideForm({
3639
state,
3740
isConfigProtectionEnabled,
@@ -66,6 +69,9 @@ export default function DeploymentTemplateOverrideForm({
6669
allowed: false,
6770
})
6871
const [disableSaveEligibleChanges, setDisableSaveEligibleChanges] = useState(false)
72+
const [hideLockedKeys, setHideLockedKeys] = useState(false)
73+
const hideLockKeysToggled = useRef(false)
74+
const removedPatches = useRef<Array<jsonpatch.Operation>>([])
6975

7076
useEffect(() => {
7177
// Reset editor value on delete override action
@@ -105,10 +111,15 @@ export default function DeploymentTemplateOverrideForm({
105111

106112
const prepareDataToSave = (envOverrideValuesWithBasic, includeInDraft?: boolean) => {
107113
let valuesOverride = envOverrideValuesWithBasic || obj || state.duplicate
114+
115+
if (applyPatches && hideLockedKeys) {
116+
valuesOverride = applyPatches(valuesOverride, removedPatches.current)
117+
}
118+
108119
if (state.showLockedTemplateDiff) {
109120
// if locked keys
110121
if (!lockedConfigKeysWithLockType.allowed) {
111-
valuesOverride = getUnlockedJSON(lockedOverride, lockedConfigKeysWithLockType.config)
122+
valuesOverride = getUnlockedJSON(lockedOverride, lockedConfigKeysWithLockType.config, true).newDocument
112123
} else {
113124
// if allowed keys
114125
valuesOverride = getLockedJSON(lockedOverride, lockedConfigKeysWithLockType.config)
@@ -216,9 +227,10 @@ export default function DeploymentTemplateOverrideForm({
216227
//loading state for checking locked changes
217228
dispatch({ type: DeploymentConfigStateActionTypes.lockChangesLoading, payload: true })
218229
}
230+
const payload = prepareDataToSave(envOverrideValuesWithBasic, false)
219231
const deploymentTemplateResp = isConfigProtectionEnabled
220232
? await checkForProtectedLockedChanges()
221-
: await api(+appId, +envId, prepareDataToSave(envOverrideValuesWithBasic, false))
233+
: await api(+appId, +envId, payload)
222234
if (deploymentTemplateResp.result.isLockConfigError && !saveEligibleChanges) {
223235
//checking if any locked changes and opening drawer to show eligible and locked ones
224236
setLockedOverride(deploymentTemplateResp.result?.lockedOverride)
@@ -232,6 +244,11 @@ export default function DeploymentTemplateOverrideForm({
232244

233245
if (envOverrideValuesWithBasic) {
234246
editorOnChange(YAML.stringify(envOverrideValuesWithBasic, { indent: 2 }), true)
247+
} else {
248+
dispatch({
249+
type: DeploymentConfigStateActionTypes.tempFormData,
250+
payload: YAML.stringify(deploymentTemplateResp.result.envOverrideValues),
251+
})
235252
}
236253
toast.success(
237254
<div className="toast">
@@ -354,6 +371,7 @@ export default function DeploymentTemplateOverrideForm({
354371
openComparison: state.showReadme && state.selectedTabIndex === 2,
355372
},
356373
})
374+
hideLockKeysToggled.current = true
357375
}
358376

359377
const handleComparisonClick = () => {
@@ -366,6 +384,9 @@ export default function DeploymentTemplateOverrideForm({
366384
const handleTabSelection = (index: number) => {
367385
if (state.unableToParseYaml) return
368386

387+
//setting true to update codeditor values with current locked keys checkbox value
388+
hideLockKeysToggled.current = true
389+
369390
dispatch({
370391
type: DeploymentConfigStateActionTypes.selectedTabIndex,
371392
payload:
@@ -508,6 +529,9 @@ export default function DeploymentTemplateOverrideForm({
508529
: YAML.stringify(state.data.globalConfig, { indent: 2 })
509530
} else if (state.tempFormData) {
510531
codeEditorValue = state.tempFormData
532+
if (applyPatches && hideLockedKeys) {
533+
codeEditorValue = YAML.stringify(applyPatches(YAML.parse(state.tempFormData), removedPatches.current))
534+
}
511535
} else {
512536
const isOverridden = state.latestDraft?.action === 3 ? state.isDraftOverriden : !!state.duplicate
513537
codeEditorValue = isOverridden
@@ -571,6 +595,9 @@ export default function DeploymentTemplateOverrideForm({
571595
<DeploymentTemplateReadOnlyEditorView
572596
value={isValuesOverride ? getCodeEditorValue(true) : manifestDataRHS}
573597
isEnvOverride={true}
598+
lockedConfigKeysWithLockType={lockedConfigKeysWithLockType}
599+
hideLockedKeys={hideLockedKeys}
600+
removedPatches={removedPatches}
574601
/>
575602
)
576603
} else if (state.loadingManifestOverride) {
@@ -581,7 +608,7 @@ export default function DeploymentTemplateOverrideForm({
581608
)
582609
} else {
583610
return (
584-
<DeploymentTemplateEditorView
611+
< DeploymentTemplateEditorView
585612
isEnvOverride={true}
586613
value={isValuesOverride ? getCodeEditorValue(false) : manifestDataRHS}
587614
defaultValue={
@@ -606,6 +633,10 @@ export default function DeploymentTemplateOverrideForm({
606633
convertVariables={convertVariablesOverride}
607634
setConvertVariables={setConvertVariables}
608635
groupedData={groupedData}
636+
hideLockedKeys={hideLockedKeys}
637+
lockedConfigKeysWithLockType={lockedConfigKeysWithLockType}
638+
hideLockKeysToggled={hideLockKeysToggled}
639+
removedPatches={removedPatches}
609640
/>
610641
)
611642
}
@@ -703,6 +734,11 @@ export default function DeploymentTemplateOverrideForm({
703734
componentType={3}
704735
setShowLockedDiffForApproval={setShowLockedDiffForApproval}
705736
setLockedConfigKeysWithLockType={setLockedConfigKeysWithLockType}
737+
lockedConfigKeysWithLockType={lockedConfigKeysWithLockType}
738+
setHideLockedKeys={setHideLockedKeys}
739+
hideLockedKeys={hideLockedKeys}
740+
hideLockKeysToggled={hideLockKeysToggled}
741+
inValidYaml={state.unableToParseYaml}
706742
/>
707743
{state.selectedTabIndex !== 2 && !state.showReadme && renderOverrideInfoStrip()}
708744
{renderValuesView()}

src/components/cdPipeline/BuildCD.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ export default function BuildCD({
150150
? GeneratedHelmPush.DO_NOT_PUSH
151151
: GeneratedHelmPush.PUSH
152152
_form.allowedDeploymentTypes = selection.allowedDeploymentTypes
153+
_form.isDigestEnforcedForEnv = _form.environments.find((env) => env.id == selection.id)?.isDigestEnforcedForEnv
153154
setFormDataErrorObj(_formDataErrorObj)
154155
setFormData(_form)
155156
} else {

src/components/cdPipeline/NewCDPipeline.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ export default function NewCDPipeline({
263263
description: env.description,
264264
isVirtualEnvironment: env.isVirtualEnvironment,
265265
allowedDeploymentTypes: env.allowedDeploymentTypes || [],
266+
isDigestEnforcedForEnv: env.isDigestEnforcedForEnv,
266267
}
267268
})
268269
sortObjectArrayAlphabetically(list, 'name')
@@ -447,7 +448,7 @@ export default function NewCDPipeline({
447448
form.enableCustomTag = pipelineConfigFromRes.enableCustomTag
448449
form.customTagStage = pipelineConfigFromRes.customTagStage
449450
form.isDigestEnforcedForEnv = pipelineConfigFromRes.isDigestEnforcedForEnv
450-
form.isDigestEnforcedForPipeline = pipelineConfigFromRes.isDigestEnforcedForEnv || pipelineConfigFromRes.isDigestEnforcedForPipeline
451+
form.isDigestEnforcedForPipeline = pipelineConfigFromRes.isDigestEnforcedForPipeline
451452

452453
if (pipelineConfigFromRes?.preDeployStage) {
453454
if(pipelineConfigFromRes.preDeployStage.steps?.length > 0){

src/components/cdPipeline/PullImageDigestToggle.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react'
33
import Tippy from '@tippyjs/react'
44
import { ReactComponent as DockerWithImage } from '../../assets/icons/ic-docker-with-image.svg'
55
import { PullImageDigestToggleType } from './types'
6-
import { DIGEST_DISABLE_TOGGLE_MESSAGE } from '../../config'
6+
import { DIGEST_DISABLE_TOGGLE_MESSAGE_FOR_PIPELINE, DIGEST_DISABLE_TOGGLE_MESSAGE_GLOBAL_ONLY } from '../../config'
77

88
function PullImageDigestToggle({ formData, setFormData }: PullImageDigestToggleType): JSX.Element {
99
const handleImageDigestToggle = (): void => {
@@ -12,19 +12,29 @@ function PullImageDigestToggle({ formData, setFormData }: PullImageDigestToggleT
1212
setFormData(_formData)
1313
}
1414

15+
const getContentText = () => {
16+
let text = ''
17+
if (formData.isDigestEnforcedForPipeline && formData.isDigestEnforcedForEnv) {
18+
text = DIGEST_DISABLE_TOGGLE_MESSAGE_FOR_PIPELINE
19+
} else if (formData.isDigestEnforcedForEnv) {
20+
text = DIGEST_DISABLE_TOGGLE_MESSAGE_GLOBAL_ONLY
21+
}
22+
return text
23+
}
24+
1525
const renderDogestToggle = () => {
1626
return (
1727
<ConditionalWrap
1828
condition={formData.isDigestEnforcedForEnv}
1929
wrap={(children) => (
20-
<Tippy className="default-tt w-200" content={DIGEST_DISABLE_TOGGLE_MESSAGE}>
30+
<Tippy className="default-tt w-200" content={getContentText()}>
2131
<div>{children}</div>
2232
</Tippy>
2333
)}
2434
>
2535
<div className={`w-32 h-20 ${formData.isDigestEnforcedForEnv ? 'dc__opacity-0_4' : ''}`}>
2636
<Toggle
27-
selected={formData.isDigestEnforcedForPipeline}
37+
selected={formData.isDigestEnforcedForPipeline || formData.isDigestEnforcedForEnv}
2838
onSelect={handleImageDigestToggle}
2939
dataTestId="create-build-pipeline-image-pull-digest-toggle"
3040
disabled={formData.isDigestEnforcedForEnv}

src/components/cdPipeline/cdPipeline.types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export interface Environment {
5858
isClusterCdActive: boolean
5959
isVirtualEnvironment?: boolean
6060
allowedDeploymentTypes?: DeploymentAppTypes[]
61+
isDigestEnforcedForEnv?: boolean
6162
}
6263
export interface CommonError {
6364
isValid: boolean
@@ -135,6 +136,7 @@ export interface PipelineConfig {
135136
userApprovalConfig?: {
136137
requiredCount: number
137138
}
139+
isDigestEnforcedForEnv?: boolean
138140
}
139141

140142
export interface BasicCDPipelineModalProps {

src/components/ciPipeline/SourceMaterials.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ export const SourceMaterials: React.FC<SourceMaterialsProps> = function (props)
225225
}
226226
/>
227227
{/* Note: In case Error is not shown added height*/}
228-
{errorObj?.isValid && <div className="h-24"></div>}
228+
{(errorObj?.isValid || islinkedCI) && <div className="h-24"></div>}
229229
</div>
230230
)}
231231

@@ -247,11 +247,12 @@ export const SourceMaterials: React.FC<SourceMaterialsProps> = function (props)
247247
)
248248
}}
249249
error={
250-
errorObj && !errorObj.isValid
251-
&& props.validationRules?.sourceValue(_materials[index].regex).message
250+
errorObj &&
251+
!errorObj.isValid &&
252+
props.validationRules?.sourceValue(_materials[index].regex).message
252253
}
253254
/>
254-
{/* Note: In case Error is not shown */}
255+
{/* Note: In case Error is not shown */}
255256
{errorObj?.isValid && <div className="h-24"></div>}
256257
</div>
257258
)}

0 commit comments

Comments
 (0)