Skip to content

Commit 9197bea

Browse files
authored
Merge pull request #691 from devtron-labs/feat/deployment-exception
feat: Deployment Without Approval (Exception)
2 parents 71bb435 + afd87c8 commit 9197bea

24 files changed

+230
-51
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devtron-labs/devtron-fe-common-lib",
3-
"version": "1.12.0-pre-3",
3+
"version": "1.12.0-pre-4",
44
"description": "Supporting common component library",
55
"type": "module",
66
"main": "dist/index.js",

src/Assets/IconV2/ic-checks.svg

Lines changed: 3 additions & 0 deletions
Loading

src/Assets/IconV2/ic-key.svg

Lines changed: 3 additions & 0 deletions
Loading

src/Assets/IconV2/ic-timeout-two-dash.svg renamed to src/Assets/IconV2/ic-selected.svg

Lines changed: 2 additions & 3 deletions
Loading

src/Assets/IconV2/ic-timeout-dash.svg

Lines changed: 21 additions & 0 deletions
Loading

src/Common/Types.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -231,25 +231,27 @@ interface InfoColourBarTextConfigType {
231231
actionButtonConfig?: ButtonProps
232232
}
233233

234-
type InfoColourBarMessageProp = {
235-
message: ReactNode
236-
linkText?: ReactNode
237-
redirectLink?: string
238-
linkOnClick?: () => void
239-
linkClass?: string
240-
internalLink?: boolean
241-
242-
textConfig?: never
243-
} | {
244-
textConfig: InfoColourBarTextConfigType
245-
246-
message?: never
247-
linkText?: never
248-
redirectLink?: never
249-
linkOnClick?: () => never
250-
linkClass?: never
251-
internalLink?: never
252-
}
234+
type InfoColourBarMessageProp =
235+
| {
236+
message: ReactNode
237+
linkText?: ReactNode
238+
redirectLink?: string
239+
linkOnClick?: () => void
240+
linkClass?: string
241+
internalLink?: boolean
242+
243+
textConfig?: never
244+
}
245+
| {
246+
textConfig: InfoColourBarTextConfigType
247+
248+
message?: never
249+
linkText?: never
250+
redirectLink?: never
251+
linkOnClick?: () => never
252+
linkClass?: never
253+
internalLink?: never
254+
}
253255

254256
export type InfoColourBarType = InfoColourBarMessageProp & {
255257
classname: string
@@ -848,7 +850,7 @@ export interface Strategy {
848850
default?: boolean
849851
}
850852

851-
export interface CDStage extends Partial<Pick<CommonNodeAttr, 'triggerBlockedInfo' | 'isTriggerBlocked' >> {
853+
export interface CDStage extends Partial<Pick<CommonNodeAttr, 'triggerBlockedInfo' | 'isTriggerBlocked'>> {
852854
status: string
853855
name: string
854856
triggerType: 'AUTOMATIC' | 'MANUAL'
@@ -860,7 +862,9 @@ export interface CDStageConfigMapSecretNames {
860862
secrets: any[]
861863
}
862864

863-
export interface PrePostDeployStageType extends MandatoryPluginBaseStateType, Partial<Pick<CommonNodeAttr, 'triggerBlockedInfo'>> {
865+
export interface PrePostDeployStageType
866+
extends MandatoryPluginBaseStateType,
867+
Partial<Pick<CommonNodeAttr, 'triggerBlockedInfo'>> {
864868
isValid: boolean
865869
steps: TaskErrorObj[]
866870
triggerType: string

src/Shared/Components/AnimatedDeployButton/AnimatedDeployButton.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ import { motion } from 'framer-motion'
2020
import DeployAudio from '@Sounds/DeployAudio.mp3'
2121
import { ComponentSizeType } from '@Shared/constants'
2222

23-
import { Button } from '../Button'
23+
import { Button, ButtonStyleType } from '../Button'
2424
import { Icon } from '../Icon'
2525
import { AnimatedDeployButtonProps } from './types'
2626

2727
import './animatedDeployButton.scss'
2828

29-
const AnimatedDeployButton = ({ isVirtualEnvironment, onButtonClick }: AnimatedDeployButtonProps) => {
29+
const AnimatedDeployButton = ({
30+
isLoading,
31+
isVirtualEnvironment,
32+
onButtonClick,
33+
exceptionUserConfig,
34+
isBulkCDTrigger,
35+
}: AnimatedDeployButtonProps) => {
3036
const audioRef = useRef<HTMLAudioElement>(null)
3137
const timeoutRef = useRef<ReturnType<typeof setTimeout>>(null)
3238
const isAudioEnabled: boolean = window._env_.FEATURE_ACTION_AUDIOS_ENABLE
@@ -36,6 +42,7 @@ const AnimatedDeployButton = ({ isVirtualEnvironment, onButtonClick }: AnimatedD
3642
rotate: 45,
3743
},
3844
}
45+
const isExceptionUser = exceptionUserConfig?.canDeploy || exceptionUserConfig?.isImageApprover
3946

4047
const handleButtonClick = async (e: SyntheticEvent) => {
4148
if (clicked) {
@@ -66,7 +73,12 @@ const AnimatedDeployButton = ({ isVirtualEnvironment, onButtonClick }: AnimatedD
6673
<motion.div whileHover="hover" className={`${clicked ? 'hide-button-text' : ''}`}>
6774
<Button
6875
dataTestId="cd-trigger-deploy-button"
69-
text={`Deploy${isVirtualEnvironment ? ' to isolated env' : ''}`}
76+
isLoading={isLoading}
77+
text={
78+
exceptionUserConfig?.canDeploy
79+
? 'Deploy without approval'
80+
: `Deploy${isVirtualEnvironment ? ' to isolated env' : ''}`
81+
}
7082
startIcon={
7183
<motion.div
7284
variants={svgMotionVariants}
@@ -88,6 +100,13 @@ const AnimatedDeployButton = ({ isVirtualEnvironment, onButtonClick }: AnimatedD
88100
}
89101
size={ComponentSizeType.large}
90102
onClick={handleButtonClick}
103+
style={isExceptionUser ? ButtonStyleType.warning : ButtonStyleType.default}
104+
showTooltip={isExceptionUser}
105+
tooltipProps={{
106+
content: isBulkCDTrigger
107+
? 'You are authorized to deploy as an exception user for some applications'
108+
: 'You are authorized to deploy as an exception user',
109+
}}
91110
/>
92111
{/* Disabling es-lint as captions are not required */}
93112
{/* eslint-disable-next-line jsx-a11y/media-has-caption */}

src/Shared/Components/AnimatedDeployButton/types.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
*/
1616

1717
export interface AnimatedDeployButtonProps {
18+
isLoading?: boolean
1819
isVirtualEnvironment: boolean
1920
onButtonClick: (e, disableDeployButton: boolean) => void
21+
exceptionUserConfig?: {
22+
canDeploy: boolean
23+
isImageApprover: boolean
24+
}
25+
isBulkCDTrigger?: boolean
2026
}

src/Shared/Components/CICDHistory/Artifacts.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,14 @@ export const CIListItem = ({
6767
selectedEnvironmentName,
6868
renderCIListHeader,
6969
targetPlatforms,
70+
isDeploymentWithoutApproval,
7071
}: CIListItemType) => {
71-
const headerMetaDataPresent =
72-
!!getIsApprovalPolicyConfigured(userApprovalMetadata?.approvalConfigData) ||
73-
!!appliedFilters?.length ||
74-
!!promotionApprovalMetadata?.promotedFromType
72+
const showCIListHeader =
73+
!!renderCIListHeader &&
74+
(!!getIsApprovalPolicyConfigured(userApprovalMetadata?.approvalConfigData) ||
75+
!!appliedFilters?.length ||
76+
!!promotionApprovalMetadata?.promotedFromType ||
77+
isDeploymentWithoutApproval)
7578

7679
return (
7780
<>
@@ -83,20 +86,20 @@ export const CIListItem = ({
8386
</div>
8487
)}
8588

86-
{headerMetaDataPresent &&
87-
renderCIListHeader &&
89+
{showCIListHeader &&
8890
renderCIListHeader({
8991
userApprovalMetadata,
9092
triggeredBy,
9193
appliedFilters,
9294
appliedFiltersTimestamp,
9395
promotionApprovalMetadata,
9496
selectedEnvironmentName,
97+
isDeploymentWithoutApproval,
9598
})}
9699

97100
<div
98101
className={`dc__h-fit-content ci-artifact image-tag-parent-card bg__primary br-4 dc__border p-12 w-100 dc__mxw-800 ci-artifact--${type} ${
99-
headerMetaDataPresent && renderCIListHeader ? 'dc__no-top-radius dc__no-top-border' : ''
102+
showCIListHeader ? 'dc__no-top-radius dc__no-top-border' : ''
100103
}`}
101104
data-testid="hover-on-report-artifact"
102105
>

0 commit comments

Comments
 (0)