Skip to content

Commit 26e24cd

Browse files
authored
Merge pull request #2611 from devtron-labs/feature/approval-policy-exceptions
feat: Approval Policy Exceptions
2 parents 5d02ca2 + 385509b commit 26e24cd

37 files changed

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

src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/AppComposeRouter.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ const AppComposeRouter = () => {
151151
onErrorRedirectURL={lastUnlockedStage}
152152
appName={currentAppName}
153153
envName=""
154+
isExceptionUser={false}
154155
isTemplateView={isTemplateView}
155156
/>
156157
</Route>,
@@ -168,6 +169,7 @@ const AppComposeRouter = () => {
168169
onErrorRedirectURL={lastUnlockedStage}
169170
appName={currentAppName}
170171
envName=""
172+
isExceptionUser={false}
171173
isTemplateView={isTemplateView}
172174
/>
173175
</Route>,
@@ -242,6 +244,10 @@ const AppComposeRouter = () => {
242244
)}
243245
reloadEnvironments={reloadEnvironments}
244246
fetchEnvConfig={fetchEnvConfig}
247+
isExceptionUser={
248+
approvalConfigMapForBaseConfiguration?.[ApprovalConfigDataKindType.deploymentTemplate]
249+
.isExceptionUser ?? false
250+
}
245251
isTemplateView={isTemplateView}
246252
/>
247253
</Route>
@@ -290,6 +296,10 @@ const AppComposeRouter = () => {
290296
onErrorRedirectURL={lastUnlockedStage}
291297
appName={currentAppName}
292298
envName=""
299+
isExceptionUser={
300+
approvalConfigMapForBaseConfiguration?.[ApprovalConfigDataKindType.configMap]
301+
.isExceptionUser
302+
}
293303
isTemplateView={isTemplateView}
294304
/>
295305
</Route>,
@@ -308,6 +318,10 @@ const AppComposeRouter = () => {
308318
onErrorRedirectURL={lastUnlockedStage}
309319
appName={currentAppName}
310320
envName=""
321+
isExceptionUser={
322+
approvalConfigMapForBaseConfiguration?.[ApprovalConfigDataKindType.configSecret]
323+
.isExceptionUser
324+
}
311325
isTemplateView={isTemplateView}
312326
/>
313327
</Route>,

src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/CompareConfigView.tsx

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

1717
import { importComponentFromFELibrary } from '@Components/common'
18-
import { ReactComponent as ICCheck } from '@Icons/ic-check.svg'
1918
import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg'
2019
import { DeploymentHistoryDiffView, ErrorScreenManager } from '@devtron-labs/devtron-fe-common-lib'
2120
import { CompareConfigViewProps } from './types'
@@ -42,9 +41,8 @@ const CompareConfigView = ({
4241
}: CompareConfigViewProps) => (
4342
<div className={`flexbox-col ${className ?? ''}`}>
4443
<div className="dc__grid-half bg__primary dc__position-sticky dc__top-0 dc__zi-10">
45-
<div className="dc__border-right px-12 py-6 flexbox dc__gap-8 dc__border-bottom dc__align-items-center">
46-
<ICCheck className="scn-9 icon-dim-16 dc__no-shrink" />
47-
<span className="cn-9 fs-12 fw-6 lh-20">Published</span>
44+
<div className="dc__border-right px-12 py-6 dc__border-bottom">
45+
<span className="cn-9 fs-12 fw-6 lh-20">Comparing with Published</span>
4846
</div>
4947

5048
<div className="px-12 py-6 dc__gap-8 dc__border-bottom flexbox dc__align-items-center">

src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigToolbar.tsx

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

1717
import { Fragment } from 'react'
18+
import ReactGA from 'react-ga4'
1819
import {
1920
Button,
2021
ButtonStyleType,
@@ -26,6 +27,7 @@ import {
2627
ComponentSizeType,
2728
InvalidYAMLTippyWrapper,
2829
ToggleResolveScopedVariables,
30+
Icon,
2931
} from '@devtron-labs/devtron-fe-common-lib'
3032
import { useParams } from 'react-router-dom'
3133
import { importComponentFromFELibrary } from '@Components/common'
@@ -40,6 +42,7 @@ import SelectMergeStrategy from './SelectMergeStrategy'
4042
const ProtectionViewTabGroup = importComponentFromFELibrary('ProtectionViewTabGroup', null, 'function')
4143
const MergePatchWithTemplateCheckbox = importComponentFromFELibrary('MergePatchWithTemplateCheckbox', null, 'function')
4244
const ConfigApproversInfoTippy = importComponentFromFELibrary('ConfigApproversInfoTippy', null, 'function')
45+
const ExpressEditButton = importComponentFromFELibrary('ExpressEditButton', null, 'function')
4346
const ProtectConfigShowCommentsButton = importComponentFromFELibrary(
4447
'ProtectConfigShowCommentsButton',
4548
null,
@@ -114,6 +117,7 @@ const ConfigToolbar = ({
114117
isApprovalPolicyConfigured = false,
115118
isApprovalPending,
116119
isDraftPresent,
120+
isUnpublished = false,
117121
draftId,
118122
draftVersionId,
119123
requestedUserId,
@@ -125,6 +129,10 @@ const ConfigToolbar = ({
125129
isPublishedConfigPresent = true,
126130
headerMessage,
127131
showDeleteOverrideDraftEmptyState,
132+
133+
isExceptionUser,
134+
isExpressEditView,
135+
expressEditButtonConfig,
128136
}: ConfigToolbarProps) => {
129137
const { envId } = useParams<BaseURLParams>()
130138
const isDisabled = disableAllActions || !!parsingError
@@ -148,9 +156,9 @@ const ConfigToolbar = ({
148156

149157
const isEditView = !!(
150158
configHeaderTab === ConfigHeaderTabType.VALUES &&
151-
(isApprovalPolicyConfigured && isDraftPresent
152-
? selectedProtectionViewTab === ProtectConfigTabsType.EDIT_DRAFT
153-
: true)
159+
(!isApprovalPolicyConfigured ||
160+
!isDraftPresent ||
161+
selectedProtectionViewTab === ProtectConfigTabsType.EDIT_DRAFT)
154162
)
155163

156164
const showProtectedTabs =
@@ -159,7 +167,28 @@ const ConfigToolbar = ({
159167
configHeaderTab === ConfigHeaderTabType.VALUES &&
160168
!!ProtectionViewTabGroup
161169

170+
const hideMergeStrategy =
171+
!mergeStrategy ||
172+
!envId ||
173+
showDeleteOverrideDraftEmptyState ||
174+
(!isEditView && !(isPublishedValuesView && !!isPublishedConfigPresent))
175+
176+
const showExpressEditButton =
177+
!!ExpressEditButton && isExceptionUser && !isExpressEditView && isEditView && !showDeleteOverrideDraftEmptyState
178+
162179
const getLHSActionNodes = (): JSX.Element => {
180+
if (isExpressEditView) {
181+
return (
182+
<>
183+
<div className="flex dc__gap-6">
184+
<Icon name="ic-pencil" color="N700" />
185+
<p className="m-0 fs-12 lh-18 cn-9">Editing Published</p>
186+
</div>
187+
{(children || !hideMergeStrategy) && <div className="divider__secondary" />}
188+
</>
189+
)
190+
}
191+
163192
if (configHeaderTab === ConfigHeaderTabType.INHERITED) {
164193
return (
165194
<div className="flexbox dc__align-items-center dc__gap-6">
@@ -186,6 +215,7 @@ const ConfigToolbar = ({
186215
selectedTab={selectedProtectionViewTab}
187216
handleProtectionViewTabChange={handleProtectionViewTabChange}
188217
isApprovalPending={isApprovalPending}
218+
hasPublishedConfig={isPublishedConfigPresent}
189219
isDisabled={isDisabled}
190220
parsingError={parsingError}
191221
restoreLastSavedYAML={restoreLastSavedYAML}
@@ -224,7 +254,7 @@ const ConfigToolbar = ({
224254
const shouldRenderCommentsView = !!isDraftPresent
225255
const hasNothingToRender = !shouldRenderApproverInfoTippy && !shouldRenderCommentsView
226256

227-
if (!isApprovalPolicyConfigured || hasNothingToRender) {
257+
if (!isApprovalPolicyConfigured || hasNothingToRender || isExpressEditView) {
228258
return null
229259
}
230260

@@ -293,12 +323,7 @@ const ConfigToolbar = ({
293323
}
294324

295325
const renderSelectMergeStrategy = () => {
296-
if (
297-
!mergeStrategy ||
298-
!envId ||
299-
showDeleteOverrideDraftEmptyState ||
300-
(!isEditView && !(isPublishedValuesView && !!isPublishedConfigPresent))
301-
) {
326+
if (hideMergeStrategy) {
302327
return null
303328
}
304329

@@ -391,11 +416,28 @@ const ConfigToolbar = ({
391416
{renderSelectMergeStrategy()}
392417
</div>
393418

394-
{isPublishedValuesView && !isPublishedConfigPresent ? null : (
419+
{(showExpressEditButton || !isPublishedValuesView || isPublishedConfigPresent) && (
395420
<div className="flexbox dc__align-items-center dc__gap-8">
396-
{renderProtectedConfigActions()}
397-
{renderReadmeAndScopedVariablesBlock()}
398-
{renderPopupMenu()}
421+
{showExpressEditButton && (
422+
<ExpressEditButton
423+
disabled={isUnpublished}
424+
{...(expressEditButtonConfig ?? {})}
425+
onClick={() => {
426+
ReactGA.event({
427+
category: 'APP_EXPRESS_EDIT_ACCESSED',
428+
action: 'APP_EXPRESS_EDIT_ACCESSED',
429+
})
430+
expressEditButtonConfig?.onClick?.()
431+
}}
432+
/>
433+
)}
434+
{isPublishedValuesView && !isPublishedConfigPresent ? null : (
435+
<>
436+
{renderProtectedConfigActions()}
437+
{renderReadmeAndScopedVariablesBlock()}
438+
{renderPopupMenu()}
439+
</>
440+
)}
399441
</div>
400442
)}
401443
</div>

src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DTChartSelector.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,7 @@ const DTChartSelector = ({
212212
restoreLastSavedTemplate,
213213
migratedFrom,
214214
}: DTChartSelectorProps) => {
215-
const filteredCharts = selectedChart
216-
? charts
217-
.filter((cv) => cv.name === selectedChart.name)
218-
.sort((a, b) => versionComparatorBySortOrder(a.version, b.version))
219-
: []
215+
const filteredCharts = selectedChart ? charts.filter((cv) => cv.name === selectedChart.name) : []
220216

221217
const onSelectChartVersion = (selected: SelectPickerOptionType) => {
222218
selectChart(charts.find((chart) => chart.id === selected.value) || selectedChart)

src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeleteOverrideDialog.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ const DeleteOverrideDialog = ({
3838
const { appId, envId } = useParams<BaseURLParams>()
3939

4040
const handleDelete = async () => {
41-
await deleteOverrideDeploymentTemplate(environmentConfigId, Number(appId), Number(envId), isTemplateView)
41+
await deleteOverrideDeploymentTemplate({
42+
id: environmentConfigId,
43+
appId: Number(appId),
44+
envId: Number(envId),
45+
isTemplateView,
46+
})
4247
handleReload()
4348
}
4449

0 commit comments

Comments
 (0)