Skip to content

Commit ac7f35e

Browse files
Merge pull request #1483 from devtron-labs/user-permissions-injob
feat: User permissions in Job
2 parents 5835f4a + da6f427 commit ac7f35e

File tree

24 files changed

+938
-284
lines changed

24 files changed

+938
-284
lines changed

src/components/Jobs/JobDetails/JobDetails.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ export default function JobDetails() {
3030
const { appId } = useParams<{ appId: string }>()
3131
const [jobName, setJobName] = useState('')
3232
const [appMetaInfo, setAppMetaInfo] = useState<AppMetaInfo>()
33+
const [jobListLoading, setJobListLoading] = useState<boolean>(false)
3334

3435
useEffect(() => {
35-
getAppMetaInfoRes()
36+
setJobListLoading(true)
37+
getAppMetaInfoRes().finally(() => setJobListLoading(false))
3638
}, [appId])
3739

3840
const getAppMetaInfoRes = async (): Promise<AppMetaInfo> => {
@@ -47,6 +49,9 @@ export default function JobDetails() {
4749
showError(err)
4850
}
4951
}
52+
if (jobListLoading) {
53+
return <Progressing pageLoader />
54+
}
5055

5156
return (
5257
<div className="job-details-page">

src/components/apiTokens/CreateAPIToken.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ function CreateAPIToken({
9494
action: ActionTypes.VIEW,
9595
entityName: [],
9696
})
97-
const [k8sPermission, setK8sPermission] = useState<any[]>([]);
97+
const [k8sPermission, setK8sPermission] = useState<any[]>([])
9898
const [customDate, setCustomDate] = useState<Moment>(null)
9999
const validationRules = new ValidationRules()
100100

src/components/apiTokens/authorization.utils.ts

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export const getDateInMilliseconds = (days) => {
3333
}
3434

3535
export const getSelectedEnvironments = (permission) => {
36-
if (permission.accessType === ACCESS_TYPE_MAP.DEVTRON_APPS) {
37-
return getSelectedPermissionValues(permission.environment)
36+
if (permission.accessType === ACCESS_TYPE_MAP.DEVTRON_APPS || permission.entity === EntityTypes.JOB) {
37+
return getSelectedPermissionValues(permission.environment)
3838
} else {
3939
let allFutureCluster = {}
4040
let envList = ''
@@ -83,25 +83,36 @@ export const createUserPermissionPayload = (
8383
(permission) =>
8484
permission.team?.value && permission.environment.length && permission.entityName.length,
8585
)
86-
.map((permission) => ({
87-
...permission,
88-
action: permission.action.value,
89-
team: permission.team.value,
90-
environment: getSelectedEnvironments(permission),
91-
entityName: getSelectedPermissionValues(permission.entityName),
92-
})),
93-
...k8sPermission.map((permission) => ({
94-
...permission,
95-
entity: EntityTypes.CLUSTER,
96-
action: permission.action.value,
97-
cluster: permission.cluster.label,
98-
group: permission.group.value === '*' ? '' : permission.group.value,
99-
kind: permission.kind.value === '*' ? '' : permission.kind.label,
100-
namespace: permission.namespace.value === '*' ? '' : permission.namespace.value,
101-
resource: permission.resource.find((entity) => entity.value === '*')
86+
.map((permission) => {
87+
const payload = {
88+
...permission,
89+
action: permission.action.value,
90+
team: permission.team.value,
91+
environment: getSelectedEnvironments(permission),
92+
entityName: getSelectedPermissionValues(permission.entityName),
93+
entity: permission.entity,
94+
...(permission.entity === EntityTypes.JOB && {
95+
workflow: permission.workflow?.length
96+
? permission.workflow.find((workflow) => workflow.value === '*')
97+
? ''
98+
: permission.workflow.map((workflow) => workflow.value).join(',')
99+
: '',
100+
}),
101+
}
102+
return payload
103+
}),
104+
...k8sPermission.map((permission) => ({
105+
...permission,
106+
entity: EntityTypes.CLUSTER,
107+
action: permission.action.value,
108+
cluster: permission.cluster.label,
109+
group: permission.group.value === '*' ? '' : permission.group.value,
110+
kind: permission.kind.value === '*' ? '' : permission.kind.label,
111+
namespace: permission.namespace.value === '*' ? '' : permission.namespace.value,
112+
resource: permission.resource.find((entity) => entity.value === '*')
102113
? ''
103-
: permission.resource.map((entity) => entity.value).join(',')
104-
}))
114+
: permission.resource.map((entity) => entity.value).join(','),
115+
})),
105116
],
106117
superAdmin: isSuperAdminAccess,
107118
}

src/components/app/Overview/Overview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ export default function AppOverview({ appMetaInfo, getAppMetaInfoRes, filteredEn
443443
<RadioGroup.Radio value={OVERVIEW_TABS.ABOUT}>About</RadioGroup.Radio>
444444
<RadioGroup.Radio value={OVERVIEW_TABS.JOB_PIPELINES}>Job Pipelines</RadioGroup.Radio>
445445
</RadioGroup>
446-
<div className="flexbox-col dc__gap-12">{contentToRender[activeTab]()}</div>
446+
<div className="flexbox-col dc__gap-12">{contentToRender[activeTab]?.()}</div>
447447
</div>
448448
)
449449
} else if (isHelmChart) {
@@ -468,7 +468,7 @@ export default function AppOverview({ appMetaInfo, getAppMetaInfoRes, filteredEn
468468
<RadioGroup.Radio value={OVERVIEW_TABS.ABOUT}>About</RadioGroup.Radio>
469469
<RadioGroup.Radio value={OVERVIEW_TABS.ENVIRONMENTS}>Environments</RadioGroup.Radio>
470470
</RadioGroup>
471-
<div className="flexbox-col dc__gap-12">{contentToRender[activeTab]()}</div>
471+
<div className="flexbox-col dc__gap-12">{contentToRender[activeTab]?.()}</div>
472472
</div>
473473
)
474474
}

src/components/app/details/appConfig/appConfig.scss

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@
2323
}
2424
}
2525

26-
&:not(.hide-app-config-help) {
27-
&.hide-external-links {
28-
grid-template-rows: 110px repeat(6, 32px) 1fr auto;
29-
}
30-
}
31-
3226
&.job-compose__side-nav {
3327
grid-template-rows: 110px repeat(4, 32px) 1fr;
3428

src/components/common/header/HeaderWithCreateButton/HeaderWithCreateButton.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,21 +80,19 @@ export default function HeaderWithCreateButton({ headerName, isSuperAdmin }) {
8080
</div>
8181
</div>
8282
</div>
83-
{isSuperAdmin && (
84-
<div
85-
className="create-modal-child cursor"
86-
onClick={openCreateJobModel}
87-
data-testid="create-job-button-in-dropdown"
88-
>
89-
<JobIcon className="icon-dim-20 scn-7" />
90-
<div className="ml-8">
91-
<strong>Job</strong>
92-
<div>
93-
Jobs allow manual and automated <br /> execution of developer actions.
94-
</div>
83+
<div
84+
className="create-modal-child cursor"
85+
onClick={openCreateJobModel}
86+
data-testid="create-job-button-in-dropdown"
87+
>
88+
<JobIcon className="icon-dim-20 scn-7" />
89+
<div className="ml-8">
90+
<strong>Job</strong>
91+
<div>
92+
Jobs allow manual and automated <br /> execution of developer actions.
9593
</div>
9694
</div>
97-
)}
95+
</div>
9896
</Modal>
9997
)
10098
}

src/components/common/helpers/Helpers.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,7 @@ export function createClusterEnvGroup<T>(
953953
value: obj[optionValue ? optionValue : optionLabel],
954954
description: obj['description'],
955955
isVirtualEnvironment: obj['isVirtualEnvironment'],
956+
isClusterCdActive: obj['isClusterCdActive'],
956957
}
957958
: obj,
958959
)

src/components/common/navigation/Navigation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const NavigationList = [
4545
icon: JobsIcon,
4646
href: URLS.JOB,
4747
isAvailableInEA: false,
48-
markOnlyForSuperAdmin: true,
48+
markOnlyForSuperAdmin: false,
4949
},
5050
{
5151
title: 'Application Groups',

src/components/common/navigation/NavigationRoutes.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ export default function NavigationRoutes() {
410410
/>
411411
</Route>,
412412
]}
413-
{isSuperAdmin && !window._env_.K8S_CLIENT && (
413+
{!window._env_.K8S_CLIENT && (
414414
<Route path={URLS.JOB}>
415415
<AppContext.Provider value={contextValue}>
416416
<Jobs />

0 commit comments

Comments
 (0)