Skip to content

Commit 8fc1c44

Browse files
committed
feat: Refactor BulkDeployModal and DeployImageContent to improve image tag handling and remove unused constants
1 parent 27ca8bd commit 8fc1c44

File tree

5 files changed

+61
-55
lines changed

5 files changed

+61
-55
lines changed

src/components/app/details/triggerView/DeployImageModal/BulkDeployModal.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
AnimatedDeployButton,
66
API_STATUS_CODES,
77
ApiQueuingWithBatch,
8+
BULK_DEPLOY_ACTIVE_IMAGE_TAG,
9+
BULK_DEPLOY_LATEST_IMAGE_TAG,
810
ButtonStyleType,
911
CDMaterialResponseType,
1012
CDMaterialServiceEnum,
@@ -64,7 +66,6 @@ import { getModuleInfo } from '@Components/v2/devtronStackManager/DevtronStackMa
6466

6567
import { getIsMaterialApproved } from '../cdMaterials.utils'
6668
import { FilterConditionViews } from '../types'
67-
import { BULK_DEPLOY_ACTIVE_IMAGE_TAG, BULK_DEPLOY_LATEST_IMAGE_TAG } from './constants'
6869
import DeployImageContent from './DeployImageContent'
6970
import DeployImageHeader from './DeployImageHeader'
7071
import { loadOlderImages } from './service'

src/components/app/details/triggerView/DeployImageModal/DeployImageContent.tsx

Lines changed: 54 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { useHistory } from 'react-router-dom'
33

44
import {
55
API_STATUS_CODES,
6+
BULK_DEPLOY_ACTIVE_IMAGE_TAG,
7+
BULK_DEPLOY_LATEST_IMAGE_TAG,
68
Button,
79
ButtonStyleType,
810
ButtonVariantType,
@@ -48,7 +50,6 @@ import { getIsMaterialApproved } from '../cdMaterials.utils'
4850
import { TriggerViewContext } from '../config'
4951
import { TRIGGER_VIEW_PARAMS } from '../Constants'
5052
import { FilterConditionViews, HandleRuntimeParamChange, TriggerViewContextType } from '../types'
51-
import { BULK_DEPLOY_ACTIVE_IMAGE_TAG, BULK_DEPLOY_LATEST_IMAGE_TAG } from './constants'
5253
import ImageSelectionCTA from './ImageSelectionCTA'
5354
import MaterialListEmptyState from './MaterialListEmptyState'
5455
import MaterialListSkeleton from './MaterialListSkeleton'
@@ -58,6 +59,8 @@ import {
5859
getApprovedImageClass,
5960
getConsumedAndAvailableMaterialList,
6061
getFilterActionBarTabs,
62+
getIsConsumedImageAvailable,
63+
getIsExceptionUser,
6164
getIsImageApprover,
6265
getSequentialCDCardTitleProps,
6366
getTriggerArtifactInfoProps,
@@ -113,7 +116,8 @@ const DeployImageContent = ({
113116
const { isSuperAdmin } = useMainContext()
114117
const { onClickApprovalNode } = useContext<TriggerViewContextType>(TriggerViewContext)
115118

116-
const isExceptionUser = materialResponse?.deploymentApprovalInfo?.approvalConfigData?.isExceptionUser ?? false
119+
// Assumption: isExceptionUser is a global trait
120+
const isExceptionUser = getIsExceptionUser(materialResponse)
117121
const requestedUserId = materialResponse?.requestedUserId
118122
const isApprovalConfigured = getIsApprovalPolicyConfigured(
119123
materialResponse?.deploymentApprovalInfo?.approvalConfigData,
@@ -122,10 +126,9 @@ const DeployImageContent = ({
122126
const canApproverDeploy = materialResponse?.canApproverDeploy ?? false
123127
const resourceFilters = materialResponse?.resourceFilters ?? []
124128
const hideImageTaggingHardDelete = materialResponse?.hideImageTaggingHardDelete ?? false
125-
const isConsumedImageAvailable =
126-
materials.some((materialItem) => materialItem.deployed && materialItem.latest) ?? false
127-
const isPreOrPostCD = stageType === DeploymentNodeType.PRECD || stageType === DeploymentNodeType.POSTCD
128129
const runtimeParamsList = materialResponse?.runtimeParams || []
130+
const isConsumedImageAvailable = getIsConsumedImageAvailable(materials)
131+
const isPreOrPostCD = stageType === DeploymentNodeType.PRECD || stageType === DeploymentNodeType.POSTCD
129132
const isCDNode = stageType === DeploymentNodeType.CD
130133

131134
const tagOptions: SelectPickerOptionType<string>[] = useMemo(() => {
@@ -143,13 +146,33 @@ const DeployImageContent = ({
143146

144147
const selectedTagOption = useMemo(() => {
145148
const selectedTag = tagOptions.find((option) => option.value === selectedTagName)
146-
return selectedTag || { label: 'Multiple Tags', value: '' }
147-
}, [selectedTagName, tagOptions])
149+
const areMultipleTagsPresent = Object.values(appInfoMap).some((appDetails) => {
150+
const selectedImage = appDetails.materialResponse?.materials?.find(
151+
(material: CDMaterialType) => material.isSelected,
152+
)
153+
154+
if (!selectedImage) {
155+
return false
156+
}
157+
158+
return !selectedImage.imageReleaseTags?.some((tagDetails) => tagDetails.tagName === selectedTagName)
159+
})
160+
161+
if (areMultipleTagsPresent || !selectedTag) {
162+
return { label: 'Multiple Tags', value: '' }
163+
}
148164

149-
const showRuntimeParams = !!(isBulkTrigger && RuntimeParamTabs && isPreOrPostCD)
165+
return selectedTag
166+
}, [selectedTagName, tagOptions, appInfoMap])
167+
168+
const sortedAppValues = useMemo(
169+
() => Object.values(appInfoMap).sort((a, b) => stringComparatorBySortOrder(a.appName, b.appName)),
170+
[appInfoMap],
171+
)
150172

151173
const getHandleAppChange = (newAppId: number) => (e: SyntheticEvent) => {
152174
stopPropagation(e)
175+
153176
if ('key' in e && e.key !== 'Enter' && e.key !== ' ') {
154177
return
155178
}
@@ -186,11 +209,6 @@ const DeployImageContent = ({
186209
const showActionBar = FilterActionBar && !isSearchApplied && !!resourceFilters?.length && !showConfiguredFilters
187210
const areNoMoreImagesPresent = materials.length >= materialResponse?.totalCount
188211

189-
const sortedAppValues = useMemo(
190-
() => Object.values(appInfoMap || {}).sort((a, b) => stringComparatorBySortOrder(a.appName, b.appName)),
191-
[appInfoMap],
192-
)
193-
194212
const handleSidebarTabChange: RuntimeParamsSidebarProps['handleSidebarTabChange'] = (e) => {
195213
setDeployViewState((prevState) => ({
196214
...prevState,
@@ -258,15 +276,15 @@ const DeployImageContent = ({
258276
}
259277

260278
const handleImageSelection: ImageSelectionCTAProps['handleImageSelection'] = (materialIndex) => {
261-
const updatedMaterialList = materialList.map((material, index) => ({
262-
...material,
263-
isSelected: index === materialIndex,
264-
}))
265-
266279
setMaterialResponse((prevData) => {
267280
const updatedMaterialResponse = structuredClone(prevData)
268-
updatedMaterialResponse.materials = updatedMaterialList
269-
return updatedMaterialResponse
281+
return {
282+
...updatedMaterialResponse,
283+
materials: updatedMaterialResponse.materials.map((material, index) => ({
284+
...material,
285+
isSelected: index === materialIndex,
286+
})),
287+
}
270288
})
271289
}
272290

@@ -299,7 +317,7 @@ const DeployImageContent = ({
299317
placeholder: 'Search by image tag',
300318
autoFocus: true,
301319
}}
302-
dataTestId="cd-trigger-search-by-commit-hash"
320+
dataTestId="cd-trigger-search-by-image-tag"
303321
/>
304322
)
305323

@@ -308,21 +326,21 @@ const DeployImageContent = ({
308326
imageReleaseTags,
309327
imageComment,
310328
) => {
311-
const updatedMaterialList = materialList.map((material) => {
312-
if (+material.id === +matId) {
313-
return {
314-
...material,
315-
imageReleaseTags,
316-
imageComment,
317-
}
318-
}
319-
return material
320-
})
321-
322329
setMaterialResponse((prevData) => {
323330
const updatedMaterialResponse = structuredClone(prevData)
324-
updatedMaterialResponse.materials = updatedMaterialList
325-
return updatedMaterialResponse
331+
return {
332+
...updatedMaterialResponse,
333+
materials: updatedMaterialResponse.materials.map((material) => {
334+
if (+material.id === +matId) {
335+
return {
336+
...material,
337+
imageReleaseTags,
338+
imageComment,
339+
}
340+
}
341+
return material
342+
}),
343+
}
326344
})
327345
}
328346

@@ -455,7 +473,7 @@ const DeployImageContent = ({
455473
return (
456474
<div className="flexbox-col h-100 dc__overflow-auto bg__primary">
457475
<div className="dc__position-sticky dc__top-0 pt-12 bg__primary dc__zi-1">
458-
{showRuntimeParams && (
476+
{!!(RuntimeParamTabs && isPreOrPostCD) && (
459477
<div className="px-16 pb-8">
460478
<RuntimeParamTabs
461479
tabs={CD_MATERIAL_SIDEBAR_TABS}
@@ -504,6 +522,7 @@ const DeployImageContent = ({
504522
role="button"
505523
tabIndex={0}
506524
onClick={getHandleAppChange(appDetails.appId)}
525+
onKeyDown={getHandleAppChange(appDetails.appId)}
507526
>
508527
<Tooltip content={appDetails.appName}>
509528
<span className="lh-20 cn-9 fw-6 fs-13 dc__truncate">{appDetails.appName}</span>

src/components/app/details/triggerView/DeployImageModal/constants.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/components/app/details/triggerView/DeployImageModal/service.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { importComponentFromFELibrary } from '@Components/common'
1818
import { CD_MATERIAL_GA_EVENT } from '../Constants'
1919
import { FilterConditionViews, MATERIAL_TYPE } from '../types'
2020
import { GetMaterialResponseListProps, LoadOlderImagesProps } from './types'
21-
import { getIsCDTriggerBlockedThroughConsequences } from './utils'
21+
import { getIsCDTriggerBlockedThroughConsequences, getIsConsumedImageAvailable } from './utils'
2222

2323
const getPolicyConsequences: ({ appId, envId }: GetPolicyConsequencesProps) => Promise<PolicyConsequencesDTO> =
2424
importComponentFromFELibrary('getPolicyConsequences', null, 'function')
@@ -76,8 +76,7 @@ export const loadOlderImages = async ({
7676
}: LoadOlderImagesProps) => {
7777
handleAnalyticsEvent(CD_MATERIAL_GA_EVENT.FetchMoreImagesClicked)
7878

79-
const isConsumedImageAvailable =
80-
materialList.some((materialItem) => materialItem.deployed && materialItem.latest) ?? false
79+
const isConsumedImageAvailable = getIsConsumedImageAvailable(materialList)
8180

8281
const newMaterialsResponse = await genericCDMaterialsService(
8382
isRollbackTrigger ? CDMaterialServiceEnum.ROLLBACK : CDMaterialServiceEnum.CD_MATERIALS,

src/components/app/details/triggerView/DeployImageModal/utils.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,6 @@ export const getDeployButtonStyle = (
354354
}
355355
return ButtonStyleType.default
356356
}
357+
358+
export const getIsConsumedImageAvailable = (materials: CDMaterialType[]) =>
359+
materials.some((materialItem) => materialItem.deployed && materialItem.latest) ?? false

0 commit comments

Comments
 (0)