Skip to content

Commit 0bbd5b0

Browse files
authored
Merge pull request #2246 from devtron-labs/feat/mandatory-tags-cd
feat: mandatory tags blocks trigger
2 parents 97c7066 + bc72bbe commit 0bbd5b0

22 files changed

+389
-332
lines changed

.eslintignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ src/components/app/Overview/utils.tsx
9393
src/components/app/ResourceTreeNodes.tsx
9494
src/components/app/ResponsiveDrawer.tsx
9595
src/components/app/WebWorker.ts
96-
src/components/app/appLabelCommon.tsx
9796
src/components/app/create/CreateApp.tsx
9897
src/components/app/create/validationRules.ts
9998
src/components/app/details/AboutAppInfoModal.tsx

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": "1.3.0",
7+
"@devtron-labs/devtron-fe-common-lib": "1.3.0-beta-7",
88
"@esbuild-plugins/node-globals-polyfill": "0.2.3",
99
"@rjsf/core": "^5.13.3",
1010
"@rjsf/utils": "^5.13.3",

src/components/ApplicationGroup/AppGroup.types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export interface BulkCDDetailTypeResponse {
7272
export interface BulkCDDetailType
7373
extends BulkTriggerAppDetailType,
7474
Pick<CDMaterialProps, 'isTriggerBlockedDueToPlugin' | 'configurePluginURL' | 'consequence'>,
75-
Partial<Pick<CommonNodeAttr, 'showPluginWarning'>> {
75+
Partial<Pick<CommonNodeAttr, 'showPluginWarning' | 'triggerBlockedInfo'>> {
7676
cdPipelineName?: string
7777
cdPipelineId?: string
7878
stageType?: DeploymentNodeType
@@ -613,4 +613,11 @@ export enum AppGroupUrlFilters {
613613

614614
export interface AppGroupUrlFiltersType extends Record<AppGroupUrlFilters, string[]> {}
615615

616+
export interface SetFiltersInLocalStorageParamsType {
617+
filterParentType: FilterParentType
618+
resourceId: string
619+
resourceList: MultiValue<OptionType>
620+
groupList: MultiValue<GroupOptionType>
621+
}
622+
616623
export type AppEnvLocalStorageKeyType = `${string}__filter`

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

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,25 @@ import {
4141
ToastManager,
4242
ToastVariantType,
4343
CommonNodeAttr,
44+
TriggerBlockType,
4445
RuntimePluginVariables,
4546
uploadCDPipelineFile,
4647
UploadFileProps,
4748
} from '@devtron-labs/devtron-fe-common-lib'
4849
import { useHistory, useLocation } from 'react-router-dom'
49-
import { ReactComponent as Close } from '../../../../assets/icons/ic-cross.svg'
50-
import { ReactComponent as DeployIcon } from '../../../../assets/icons/ic-nav-rocket.svg'
51-
import { ReactComponent as PlayIcon } from '../../../../assets/icons/ic-play-medium.svg'
52-
import { ReactComponent as Error } from '../../../../assets/icons/ic-warning.svg'
53-
import { ReactComponent as UnAuthorized } from '../../../../assets/icons/ic-locked.svg'
54-
import { ReactComponent as Tag } from '../../../../assets/icons/ic-tag.svg'
50+
import { ReactComponent as Close } from '@Icons/ic-cross.svg'
51+
import { ReactComponent as DeployIcon } from '@Icons/ic-nav-rocket.svg'
52+
import { ReactComponent as PlayIcon } from '@Icons/ic-play-medium.svg'
53+
import { ReactComponent as Error } from '@Icons/ic-warning.svg'
54+
import { ReactComponent as UnAuthorized } from '@Icons/ic-locked.svg'
55+
import { ReactComponent as Tag } from '@Icons/ic-tag.svg'
5556
import emptyPreDeploy from '../../../../assets/img/empty-pre-deploy.png'
5657
import notAuthorized from '../../../../assets/img/ic-not-authorized.svg'
5758
import CDMaterial from '../../../app/details/triggerView/cdMaterial'
5859
import { BulkSelectionEvents, MATERIAL_TYPE, RuntimeParamsErrorState } from '../../../app/details/triggerView/types'
5960
import { BulkCDDetailType, BulkCDTriggerType } from '../../AppGroup.types'
6061
import { BULK_CD_DEPLOYMENT_STATUS, BULK_CD_MATERIAL_STATUS, BULK_CD_MESSAGING, BUTTON_TITLE } from '../../Constants'
6162
import TriggerResponseModal from './TriggerResponseModal'
62-
import { EmptyView } from '../../../app/details/cicdHistory/History.components'
6363
import { ReactComponent as MechanicalOperation } from '../../../../assets/img/ic-mechanical-operation.svg'
6464
import { importComponentFromFELibrary } from '../../../common'
6565
import { BULK_ERROR_MESSAGES } from './constants'
@@ -79,6 +79,8 @@ const getDeploymentWindowStateAppGroup = importComponentFromFELibrary(
7979
const RuntimeParamTabs = importComponentFromFELibrary('RuntimeParamTabs', null, 'function')
8080
const MissingPluginBlockState = importComponentFromFELibrary('MissingPluginBlockState', null, 'function')
8181
const PolicyEnforcementMessage = importComponentFromFELibrary('PolicyEnforcementMessage')
82+
const TriggerBlockedError = importComponentFromFELibrary('TriggerBlockedError', null, 'function')
83+
const TriggerBlockEmptyState = importComponentFromFELibrary('TriggerBlockEmptyState', null, 'function')
8284
const validateRuntimeParameters = importComponentFromFELibrary(
8385
'validateRuntimeParameters',
8486
() => ({ isValid: true, cellError: {} }),
@@ -389,6 +391,10 @@ export default function BulkCDTrigger({
389391
}
390392

391393
const renderEmptyView = (): JSX.Element => {
394+
if (selectedApp.triggerBlockedInfo?.blockedBy === TriggerBlockType.MANDATORY_TAG) {
395+
return <TriggerBlockEmptyState stageType={selectedApp.stageType} appId={selectedApp.appId} />
396+
}
397+
392398
if (selectedApp.isTriggerBlockedDueToPlugin) {
393399
const commonNodeAttrType: CommonNodeAttr['type'] =
394400
selectedApp.stageType === DeploymentNodeType.PRECD ? 'PRECD' : 'POSTCD'
@@ -403,16 +409,16 @@ export default function BulkCDTrigger({
403409

404410
if (unauthorizedAppList[selectedApp.appId]) {
405411
return (
406-
<EmptyView
407-
imgSrc={notAuthorized}
412+
<GenericEmptyState
413+
image={notAuthorized}
408414
title={BULK_CD_MESSAGING.unauthorized.title}
409415
subTitle={BULK_CD_MESSAGING.unauthorized.subTitle}
410416
/>
411417
)
412418
}
413419
return (
414-
<EmptyView
415-
imgSrc={emptyPreDeploy}
420+
<GenericEmptyState
421+
image={emptyPreDeploy}
416422
title={`${selectedApp.name} ${BULK_CD_MESSAGING[stage].title}`}
417423
subTitle={BULK_CD_MESSAGING[stage].subTitle}
418424
/>
@@ -457,11 +463,14 @@ export default function BulkCDTrigger({
457463
)
458464
}
459465

466+
if (app.triggerBlockedInfo?.blockedBy === TriggerBlockType.MANDATORY_TAG) {
467+
return <TriggerBlockedError stageType={app.stageType} />
468+
}
469+
460470
if (!!warningMessage && !app.showPluginWarning) {
461471
return (
462472
<div className="flex left top dc__gap-4">
463473
<Error className="icon-dim-12 dc__no-shrink mt-5 warning-icon-y7" />
464-
465474
<span className="fw-4 fs-12 cy-7 dc__truncate">{warningMessage}</span>
466475
</div>
467476
)

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ import {
4646
ToastManager,
4747
ToastVariantType,
4848
BlockedStateData,
49+
getStageTitle,
50+
TriggerBlockType,
4951
RuntimePluginVariables,
50-
uploadCIPipelineFile,
5152
} from '@devtron-labs/devtron-fe-common-lib'
5253
import Tippy from '@tippyjs/react'
5354
import {
@@ -1764,7 +1765,10 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
17641765
const stageType = DeploymentNodeType[_selectedNode.type]
17651766
const isTriggerBlockedDueToPlugin =
17661767
_selectedNode.isTriggerBlocked && _selectedNode.showPluginWarning
1767-
const stageText = stageType === DeploymentNodeType.PRECD ? 'Pre-Deployment' : 'Post-Deployment'
1768+
const isTriggerBlockedDueToMandatoryTags =
1769+
_selectedNode.isTriggerBlocked &&
1770+
_selectedNode.triggerBlockedInfo?.blockedBy === TriggerBlockType.MANDATORY_TAG
1771+
const stageText = getStageTitle(stageType)
17681772

17691773
_selectedAppWorkflowList.push({
17701774
workFlowId: wf.id,
@@ -1798,7 +1802,11 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou
17981802
true,
17991803
),
18001804
consequence: _selectedNode.pluginBlockState,
1801-
warningMessage: isTriggerBlockedDueToPlugin ? `${stageText} is blocked` : '',
1805+
warningMessage:
1806+
isTriggerBlockedDueToPlugin || isTriggerBlockedDueToMandatoryTags
1807+
? `${stageText} is blocked`
1808+
: '',
1809+
triggerBlockedInfo: _selectedNode.triggerBlockedInfo,
18021810
})
18031811
} else {
18041812
let warningMessage = ''

src/components/app/Overview/Overview.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -341,20 +341,23 @@ export default function AppOverview({ appMetaInfo, getAppMetaInfoRes, filteredEn
341341
}
342342

343343
const renderLabelTags = () => (
344-
<div className="flexbox-col dc__gap-12">
345-
<div className="flexbox flex-justify dc__gap-10">
346-
<div className="flexbox flex-align-center dc__gap-8 fs-13 fw-6 lh-20 cn-9">
347-
<TagIcon className="tags-icon icon-dim-20" />
348-
Tags
344+
<div>
345+
<div className="flexbox-col dc__gap-12">
346+
<div className="flexbox flex-justify dc__gap-10">
347+
<div className="flexbox flex-align-center dc__gap-8 fs-13 fw-6 lh-20 cn-9">
348+
<TagIcon className="tags-icon icon-dim-20" />
349+
Tags
350+
</div>
351+
<EditIcon className="icon-dim-16 cursor mw-16" onClick={toggleTagsUpdateModal} />
349352
</div>
350-
<EditIcon className="icon-dim-16 cursor mw-16" onClick={toggleTagsUpdateModal} />
353+
<TagChipsContainer
354+
appType={appType}
355+
labelTags={currentLabelTags}
356+
onAddTagButtonClick={toggleTagsUpdateModal}
357+
resourceName={resourceName}
358+
whiteBackground
359+
/>
351360
</div>
352-
<TagChipsContainer
353-
labelTags={currentLabelTags}
354-
onAddTagButtonClick={toggleTagsUpdateModal}
355-
resourceName={resourceName}
356-
whiteBackground
357-
/>
358361
{MandatoryTagWarning && (
359362
<MandatoryTagWarning
360363
labelTags={currentLabelTags}

src/components/app/Overview/TagChipsContainer.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,20 @@
1414
* limitations under the License.
1515
*/
1616

17-
import React from 'react'
1817
import Tippy from '@tippyjs/react'
19-
import { ReactComponent as InjectTag } from '../../../assets/icons/inject-tag.svg'
18+
import { ReactComponent as InjectTag } from '@Icons/inject-tag.svg'
2019
import { TagChipsContainerType } from '../types'
20+
import { APP_TYPE } from '@Config/constants'
2121

2222
export default function TagChipsContainer({
23+
appType,
2324
labelTags,
2425
onAddTagButtonClick,
2526
resourceName,
2627
whiteBackground = false,
2728
}: TagChipsContainerType) {
2829
return (
29-
<div className="flex left flex-wrap dc__gap-8" data-testid="tag-chip-container">
30+
<div className="flex left flex-wrap dc__gap-6" data-testid="tag-chip-container">
3031
{labelTags.length > 0 ? (
3132
labelTags.map((tag, index) => (
3233
<div key={tag.id} className="display-grid grid-auto-flow-column">
@@ -37,7 +38,9 @@ export default function TagChipsContainer({
3738
!tag.value ? ' br-4' : ' dc__left-radius-4'
3839
}`}
3940
>
40-
{tag.propagate && <InjectTag className="icon-dim-16 mt-2 mr-4 mw-16" />}
41+
{appType !== APP_TYPE.HELM_CHART && tag.propagate && (
42+
<InjectTag className="icon-dim-16 mt-2 mr-4 mw-16" />
43+
)}
4144
<Tippy
4245
className="default-tt dc__word-break-all"
4346
arrow={false}

src/components/app/appLabelCommon.tsx

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

0 commit comments

Comments
 (0)