Skip to content

Commit 67f6b66

Browse files
committed
feat: Implement bulk deployment modal enhancements and improve error handling
1 parent ce9e834 commit 67f6b66

File tree

4 files changed

+34
-35
lines changed

4 files changed

+34
-35
lines changed

src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
475475

476476
const onShowBulkCDModal = (e) => {
477477
setBulkTriggerType(e.currentTarget.dataset.triggerType)
478+
setShowBulkCDModal(true)
478479
}
479480

480481
const hideBulkCIModal = () => {

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ const BulkDeployModal = ({ handleClose, stageType, workflows, isVirtualEnvironme
357357

358358
const updatedWarningMessage =
359359
baseBulkCDDetailMap[appId].warningMessage ||
360-
deploymentWindowMap[appId].warningMessage ||
360+
deploymentWindowMap[appId]?.warningMessage ||
361361
parsedTagsWarning
362362

363363
// In case of search and reload even though method gives whole state, will only update deploymentWindowMetadata, warningMessage and materialResponse
@@ -409,7 +409,8 @@ const BulkDeployModal = ({ handleClose, stageType, workflows, isVirtualEnvironme
409409
return bulkCDDetailsMap
410410
}
411411

412-
const [isLoadingAppInfoMap, appInfoMap, , , unTypedSetAppInfoMap] = useAsync(() => getInitialAppList({}))
412+
const [isLoadingAppInfoMap, _appInfoMap, , , unTypedSetAppInfoMap] = useAsync(() => getInitialAppList({}))
413+
const appInfoMap: typeof _appInfoMap = _appInfoMap || {}
413414
const setAppInfoMap: Dispatch<SetStateAction<typeof appInfoMap>> = unTypedSetAppInfoMap
414415

415416
const reloadOrSearchSelectedApp = async (searchText?: string) => {
@@ -1064,11 +1065,7 @@ const BulkDeployModal = ({ handleClose, stageType, workflows, isVirtualEnvironme
10641065
<div className="flex-grow-1 dc__overflow-auto bg__tertiary w-100">{renderContent()}</div>
10651066
</div>
10661067

1067-
{isLoadingAppInfoMap || showStrategyFeasibilityPage ? null : (
1068-
<div className="flexbox dc__content-space dc__gap-12 py-16 px-20 border__primary--top dc__no-shrink">
1069-
{renderFooter()}
1070-
</div>
1071-
)}
1068+
{isLoadingAppInfoMap || showStrategyFeasibilityPage ? null : renderFooter()}
10721069
</div>
10731070

10741071
{showResistanceBox && (

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

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
CDMaterialType,
1212
CommonNodeAttr,
1313
ComponentSizeType,
14-
ConditionalWrap,
1514
DEPLOYMENT_WINDOW_TYPE,
1615
DeploymentNodeType,
1716
ErrorScreenManager,
@@ -49,6 +48,7 @@ import { getIsMaterialApproved } from '../cdMaterials.utils'
4948
import { TriggerViewContext } from '../config'
5049
import { TRIGGER_VIEW_PARAMS } from '../Constants'
5150
import { FilterConditionViews, HandleRuntimeParamChange, TriggerViewContextType } from '../types'
51+
import { BULK_DEPLOY_ACTIVE_IMAGE_TAG, BULK_DEPLOY_LATEST_IMAGE_TAG } from './constants'
5252
import ImageSelectionCTA from './ImageSelectionCTA'
5353
import MaterialListEmptyState from './MaterialListEmptyState'
5454
import MaterialListSkeleton from './MaterialListSkeleton'
@@ -77,10 +77,6 @@ const MissingPluginBlockState = importComponentFromFELibrary('MissingPluginBlock
7777
const PolicyEnforcementMessage = importComponentFromFELibrary('PolicyEnforcementMessage')
7878
const TriggerBlockedError = importComponentFromFELibrary('TriggerBlockedError', null, 'function')
7979

80-
const renderMaterialListBodyWrapper = (children: JSX.Element) => (
81-
<div className="flexbox-col py-16 px-20 dc__overflow-auto">{children}</div>
82-
)
83-
8480
const DeployImageContent = ({
8581
appId,
8682
envId,
@@ -117,8 +113,6 @@ const DeployImageContent = ({
117113
const { isSuperAdmin } = useMainContext()
118114
const { onClickApprovalNode } = useContext<TriggerViewContextType>(TriggerViewContext)
119115

120-
const { triggerBlockedInfo, warningMessage, materialError } = appInfoMap[appId] || {}
121-
122116
const isExceptionUser = materialResponse?.deploymentApprovalInfo?.approvalConfigData?.isExceptionUser ?? false
123117
const requestedUserId = materialResponse?.requestedUserId
124118
const isApprovalConfigured = getIsApprovalPolicyConfigured(
@@ -140,9 +134,11 @@ const DeployImageContent = ({
140134
app.materialResponse?.appReleaseTagNames?.forEach((tag) => tagNames.add(tag))
141135
})
142136

143-
return Array.from(tagNames)
144-
.sort(stringComparatorBySortOrder)
145-
.map((tag) => ({ label: tag, value: tag }))
137+
return [BULK_DEPLOY_LATEST_IMAGE_TAG, BULK_DEPLOY_ACTIVE_IMAGE_TAG].concat(
138+
Array.from(tagNames)
139+
.sort(stringComparatorBySortOrder)
140+
.map((tag) => ({ label: tag, value: tag })),
141+
)
146142
}, [appInfoMap])
147143

148144
const selectedTagOption = useMemo(() => {
@@ -431,11 +427,11 @@ const DeployImageContent = ({
431427
return <TriggerBlockedError stageType={stageType} />
432428
}
433429

434-
if (!!warningMessage && !app.showPluginWarning) {
430+
if (!!app.warningMessage && !app.showPluginWarning) {
435431
return (
436432
<div className="flex left top dc__gap-4">
437433
<Icon name="ic-warning" color={null} size={14} />
438-
<span className="fw-4 fs-12 cy-7 dc__truncate">{warningMessage}</span>
434+
<span className="fw-4 fs-12 cy-7 dc__truncate">{app.warningMessage}</span>
439435
</div>
440436
)
441437
}
@@ -457,8 +453,8 @@ const DeployImageContent = ({
457453
const renderSidebar = () => {
458454
if (isBulkTrigger) {
459455
return (
460-
<div className="flexbox-col h-100 dc__overflow-auto">
461-
<div className="dc__position-sticky dc__top-0 pt-12 bg__primary">
456+
<div className="flexbox-col h-100 dc__overflow-auto bg__primary">
457+
<div className="dc__position-sticky dc__top-0 pt-12 bg__primary dc__zi-1">
462458
{showRuntimeParams && (
463459
<div className="px-16 pb-8">
464460
<RuntimeParamTabs
@@ -477,7 +473,7 @@ const DeployImageContent = ({
477473
{currentSidebarTab === CDMaterialSidebarType.IMAGE && (
478474
<>
479475
<span className="px-16">Select image by release tag</span>
480-
<div className="tag-selection-dropdown px-16 pt-6 pb-12 dc__zi-1">
476+
<div className="tag-selection-dropdown px-16 pt-6 pb-12">
481477
<SelectPicker
482478
name="bulk-cd-trigger__select-tag"
483479
inputId="bulk-cd-trigger__select-tag"
@@ -494,7 +490,9 @@ const DeployImageContent = ({
494490
</div>
495491
</>
496492
)}
497-
<span className="dc__border-bottom fw-6 fs-13 cn-7 py-8 px-16">APPLICATIONS</span>
493+
<div className="dc__border-bottom py-8 px-16 w-100">
494+
<span className="fw-6 fs-13 cn-7">APPLICATIONS</span>
495+
</div>
498496
</div>
499497

500498
{sortedAppValues.map((appDetails) => (
@@ -681,7 +679,7 @@ const DeployImageContent = ({
681679
const renderEmptyView = (): JSX.Element => {
682680
const selectedApp = appInfoMap[+appId]
683681

684-
if (triggerBlockedInfo?.blockedBy === TriggerBlockType.MANDATORY_TAG) {
682+
if (selectedApp.triggerBlockedInfo?.blockedBy === TriggerBlockType.MANDATORY_TAG) {
685683
return <TriggerBlockEmptyState stageType={stageType} appId={appId} />
686684
}
687685

@@ -698,8 +696,14 @@ const DeployImageContent = ({
698696
)
699697
}
700698

701-
if (materialError) {
702-
return <ErrorScreenManager code={materialError.code} reload={reloadMaterials} on404Redirect={handleClose} />
699+
if (selectedApp.materialError) {
700+
return (
701+
<ErrorScreenManager
702+
code={selectedApp.materialError.code}
703+
reload={reloadMaterials}
704+
on404Redirect={handleClose}
705+
/>
706+
)
703707
}
704708

705709
return (
@@ -713,7 +717,7 @@ const DeployImageContent = ({
713717

714718
const renderContent = () => {
715719
if (isBulkTrigger) {
716-
const { areMaterialsLoading } = appInfoMap[+appId] || {}
720+
const { areMaterialsLoading, triggerBlockedInfo, materialError } = appInfoMap[+appId] || {}
717721
if (currentSidebarTab === CDMaterialSidebarType.IMAGE && areMaterialsLoading) {
718722
return <MaterialListSkeleton />
719723
}
@@ -872,13 +876,10 @@ const DeployImageContent = ({
872876
)}
873877

874878
<div
875-
className={`flex-grow-1 dc__overflow-auto h-100 ${isPreOrPostCD && !isBulkTrigger ? 'display-grid cd-material__container-with-sidebar' : 'flexbox-col flex-grow-1 py-16 px-20'}`}
879+
className={`flex-grow-1 dc__overflow-auto h-100 ${isPreOrPostCD || isBulkTrigger ? 'display-grid cd-material__container-with-sidebar' : 'flexbox-col flex-grow-1 py-16 px-20'}`}
876880
>
877881
{renderSidebar()}
878-
879-
<ConditionalWrap condition={isPreOrPostCD && !isBulkTrigger} wrap={renderMaterialListBodyWrapper}>
880-
{renderContent()}
881-
</ConditionalWrap>
882+
<div className="flexbox-col py-16 px-20 dc__overflow-auto">{renderContent()}</div>
882883
</div>
883884
</>
884885
)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ export const getIsCDTriggerBlockedThroughConsequences = (
8181
) => {
8282
switch (stageType) {
8383
case DeploymentNodeType.PRECD:
84-
return cdPolicyConsequences.pre.isBlocked
84+
return cdPolicyConsequences?.pre?.isBlocked
8585
case DeploymentNodeType.POSTCD:
86-
return cdPolicyConsequences.post.isBlocked
86+
return cdPolicyConsequences?.post?.isBlocked
8787
case DeploymentNodeType.CD:
88-
return cdPolicyConsequences.node.isBlocked
88+
return cdPolicyConsequences?.node?.isBlocked
8989
default:
9090
return false
9191
}

0 commit comments

Comments
 (0)