Skip to content

Commit

Permalink
Merge branch 'develop' of github.com:devtron-labs/dashboard into feat…
Browse files Browse the repository at this point in the history
…/build-cache
  • Loading branch information
Elessar1802 committed Dec 20, 2024
2 parents 5293807 + 667fcc4 commit 67c239b
Show file tree
Hide file tree
Showing 36 changed files with 507 additions and 266 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ LOGIN_DT_LOGO=
SIDEBAR_DT_LOGO=
ENABLE_EXTERNAL_ARGO_CD=false
API_BATCH_SIZE=20
SERVICE_WORKER_TIMEOUT='3'
SERVICE_WORKER_TIMEOUT=3
ENABLE_RESOURCE_SCAN=false
FEATURE_USER_DEFINED_GITOPS_REPO_ENABLE=false
ENABLE_RESOURCE_SCAN_V2=false
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"private": true,
"homepage": "/dashboard",
"dependencies": {
"@devtron-labs/devtron-fe-common-lib": "1.2.17-beta-2",
"@devtron-labs/devtron-fe-common-lib": "1.3.0-beta-10",
"@esbuild-plugins/node-globals-polyfill": "0.2.3",
"@rjsf/core": "^5.13.3",
"@rjsf/utils": "^5.13.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ const ConfigToolbar = ({
mergeStrategy,
handleMergeStrategyChange,
hidePatchOption,
isMergeStrategySelectorDisabled,

showEnableReadMeButton,
handleEnableReadmeView,
Expand Down Expand Up @@ -276,7 +277,7 @@ const ConfigToolbar = ({
<SelectMergeStrategy
mergeStrategy={mergeStrategy}
handleMergeStrategyChange={handleMergeStrategyChange}
isDisabled={isDisabled}
isDisabled={isDisabled || isMergeStrategySelectorDisabled}
variant={isEditView ? 'dropdown' : 'text'}
hidePatchOption={hidePatchOption}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import {
isConfigTypeNonDraftOrPublished,
isConfigTypePublished,
getAppEnvDeploymentConfigPayload,
getIdentifierIdBasedOnConfiguration,
} from './utils'
import { getDeploymentTemplateData, getManifestData } from './service.utils'
import { DeploymentConfigComparisonDataType } from './types'
Expand Down Expand Up @@ -550,6 +551,28 @@ export const DeploymentConfigCompare = ({
)?.chartRefId ?? null
: null

if (identifierId) {
currentSearchParams.set(
'identifierId',
getIdentifierIdBasedOnConfiguration({
identifierId,
isManifestView: _isManifestView,
previousDeployments: currentEnvOptions.previousDeployments,
}),
)
}

if (compareWithIdentifierId) {
currentSearchParams.set(
'compareWithIdentifierId',
getIdentifierIdBasedOnConfiguration({
identifierId: compareWithIdentifierId,
isManifestView: _isManifestView,
previousDeployments: compareEnvOptions.previousDeployments,
}),
)
}

if (_compareWithManifestChartRefId) {
currentSearchParams.set('compareWithManifestChartRefId', String(_compareWithManifestChartRefId))
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { getAppEnvDeploymentConfig } from '@devtron-labs/devtron-fe-common-lib'
import { getAppEnvDeploymentConfig, TemplateListDTO } from '@devtron-labs/devtron-fe-common-lib'
import { getManifestData } from './service.utils'
import { AppEnvDeploymentConfigQueryParamsType } from '../../AppConfig.types'

type ManifestComparisonDataType = {
isManifestComparison: true
Expand All @@ -17,3 +18,9 @@ type AppConfigComparisonDataType = {
}

export type DeploymentConfigComparisonDataType = ManifestComparisonDataType | AppConfigComparisonDataType

export interface SetIdentifierIdBasedOnConfigurationProps {
identifierId: AppEnvDeploymentConfigQueryParamsType['identifierId']
isManifestView: boolean
previousDeployments: TemplateListDTO[]
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
GetAppEnvDeploymentConfigProps,
} from '../../AppConfig.types'
import { BASE_CONFIGURATIONS } from '../../AppConfig.constants'
import { SetIdentifierIdBasedOnConfigurationProps } from './types'

export const getPreviousDeploymentOptionValue = (identifierId: number, pipelineId?: number, chartRefId?: number) => {
if (identifierId && pipelineId) {
Expand Down Expand Up @@ -239,10 +240,16 @@ export const getEnvironmentConfigTypeOptions = (
: []),
{
label: 'Previous deployments',
options: previousDeploymentsList.map(({ finishedOn, chartVersion, pipelineId, wfrId, chartRefId }) => ({
label: `${moment(finishedOn).format(Moment12HourFormat)} (v${chartVersion})`,
value: getPreviousDeploymentOptionValue(wfrId, pipelineId, isManifestView ? chartRefId : null),
})),
options: previousDeploymentsList.map(
({ finishedOn, chartVersion, pipelineId, wfrId, chartRefId, deploymentTemplateHistoryId }) => ({
label: `${moment(finishedOn).format(Moment12HourFormat)} (v${chartVersion})`,
value: getPreviousDeploymentOptionValue(
isManifestView ? deploymentTemplateHistoryId : wfrId,
pipelineId,
isManifestView ? chartRefId : null,
),
}),
),
},
]

Expand Down Expand Up @@ -321,6 +328,18 @@ export const getAppEnvDeploymentConfigPayload = ({
envName,
}),
configType,
wfrId: identifierId,
[configType === AppEnvDeploymentConfigType.DEFAULT_VERSION ? 'identifierId' : 'wfrId']: identifierId,
pipelineId,
}) as const

export const getIdentifierIdBasedOnConfiguration = ({
identifierId,
isManifestView,
previousDeployments,
}: SetIdentifierIdBasedOnConfigurationProps) => {
const _identifierId = isManifestView
? previousDeployments.find((prev) => prev.wfrId === identifierId)?.deploymentTemplateHistoryId ?? null
: previousDeployments.find((prev) => prev.deploymentTemplateHistoryId === identifierId)?.wfrId ?? null

return String(_identifierId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ export type ConfigToolbarProps = {
mergeStrategy: OverrideMergeStrategyType
handleMergeStrategyChange: (strategy: OverrideMergeStrategyType) => void
hidePatchOption?: boolean
isMergeStrategySelectorDisabled?: boolean

/**
* Used to place toggle editor view and chart selectors in deployment template
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ import {
PermissionConfigurationFormProvider,
usePermissionConfiguration,
} from '../Shared/components/PermissionConfigurationForm'
import { createUserPermissionPayload, isDirectPermissionFormComplete } from '../utils'
import { createUserPermissionPayload, validateDirectPermissionForm } from '../utils'
import { getDefaultUserStatusAndTimeout } from '../libUtils'
import { importComponentFromFELibrary } from '../../../../components/common'

Expand Down Expand Up @@ -163,7 +163,7 @@ const CreateAPIToken = ({
}

const handleGenerateAPIToken = async () => {
if (!isDirectPermissionFormComplete(directPermission, setDirectPermission)) {
if (!validateDirectPermissionForm(directPermission, setDirectPermission).isValid) {
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ import {
PermissionConfigurationFormProvider,
usePermissionConfiguration,
} from '../Shared/components/PermissionConfigurationForm'
import { createUserPermissionPayload, isDirectPermissionFormComplete } from '../utils'
import { createUserPermissionPayload, validateDirectPermissionForm } from '../utils'
import { getDefaultUserStatusAndTimeout } from '../libUtils'

const showStatus = !!importComponentFromFELibrary('StatusHeaderCell', null, 'function')
Expand Down Expand Up @@ -107,7 +107,7 @@ const EditAPIToken = ({
}

const handleUpdatedToken = async (tokenId) => {
if (!isDirectPermissionFormComplete(directPermission, setDirectPermission)) {
if (!validateDirectPermissionForm(directPermission, setDirectPermission).isValid) {
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import {
PermissionConfigurationForm,
usePermissionConfiguration,
} from '../../Shared/components/PermissionConfigurationForm'
import { getIsSuperAdminPermission, getRoleFilters, isDirectPermissionFormComplete } from '../../utils'
import { getIsSuperAdminPermission, getRoleFilters, validateDirectPermissionForm } from '../../utils'
import { excludeKeyAndClusterValue } from '../../Shared/components/K8sObjectPermissions/utils'

const PermissionGroupForm = ({ isAddMode }: { isAddMode: boolean }) => {
Expand Down Expand Up @@ -93,7 +93,7 @@ const PermissionGroupForm = ({ isAddMode }: { isAddMode: boolean }) => {
setName((_name) => ({ ..._name, error: 'Group name is mandatory' }))
return
}
if (!isSuperAdminPermission && !isDirectPermissionFormComplete(directPermission, setDirectPermission)) {
if (!isSuperAdminPermission && !validateDirectPermissionForm(directPermission, setDirectPermission).isValid) {
return
}
setSubmitting(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
ACCESS_TYPE_MAP,
EntityTypes,
} from '@devtron-labs/devtron-fe-common-lib'
import { ActionTypes } from '../../../constants'
import { ActionTypes, DEFAULT_ACCESS_TYPE_TO_ERROR_MAP } from '../../../constants'
import { HELM_APP_UNASSIGNED_PROJECT, SELECT_ALL_VALUE, SERVER_MODE } from '../../../../../../config'
import { importComponentFromFELibrary, mapByKey } from '../../../../../../components/common'
import K8sPermissions from '../K8sObjectPermissions/K8sPermissions.component'
Expand Down Expand Up @@ -61,11 +61,12 @@ import {
getEnvironmentOptions,
getNavLinksConfig,
} from './utils'
import { getWorkflowOptions } from '../../../utils'
import { getWorkflowOptions, validateDirectPermissionForm } from '../../../utils'
import { AppPermissionsDetailType, DirectPermissionRow } from './types'
import { APIRoleFilter, ChartGroupPermissionsFilter, DirectPermissionsRoleFilter } from '../../../types'
import { getDefaultStatusAndTimeout } from '../../../libUtils'
import { JobList } from '../../../../../../components/Jobs/Types'
import { AccessTypeToErrorMapType } from '../PermissionConfigurationForm/types'

const handleApprovalPermissionChange = importComponentFromFELibrary('handleApprovalPermissionChange', null, 'function')

Expand All @@ -88,6 +89,9 @@ const AppPermissions = () => {
const [appsList, setAppsList] = useState<AppPermissionsDetailType['appsList']>(new Map())
const [appsListHelmApps, setAppsListHelmApps] = useState<AppPermissionsDetailType['appsListHelmApps']>(new Map())
const [jobsList, setJobsList] = useState<AppPermissionsDetailType['jobsList']>(new Map())
const [accessTypeToErrorMap, setAccessTypeToErrorMap] = useState<AccessTypeToErrorMapType>(
structuredClone(DEFAULT_ACCESS_TYPE_TO_ERROR_MAP),
)

// To store the mapping and minimize the number of API calls
const projectToJobListRef = useRef<
Expand Down Expand Up @@ -861,6 +865,16 @@ const AppPermissions = () => {
pathname: `${url}/${tabName}`,
})

const handleNavLinkClick = () => {
// Validate the direct permission form on tab switch to show the error state
const { accessTypeToErrorMap: _accessTypeToErrorMap } = validateDirectPermissionForm(
directPermission,
setDirectPermission,
false,
)
setAccessTypeToErrorMap(_accessTypeToErrorMap)
}

useEffect(() => {
if (!isDataLoading) {
if (!data) {
Expand Down Expand Up @@ -895,7 +909,7 @@ const AppPermissions = () => {
<div className="flexbox-col dc__gap-12">
<div className="dc__border-bottom-n1">
<TabGroup
tabs={navLinksConfig.flatMap(({ isHidden, label, tabName }) =>
tabs={navLinksConfig.flatMap(({ isHidden, label, tabName, accessType }) =>
!isHidden
? {
id: tabName,
Expand All @@ -904,7 +918,9 @@ const AppPermissions = () => {
props: {
to: _getNavLinkUrl(tabName),
'data-testid': tabName,
onClick: handleNavLinkClick,
},
showError: accessTypeToErrorMap[accessType],
}
: [],
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,32 @@ import { DirectPermissionRow } from './types'
export const getNavLinksConfig = (serverMode: SERVER_MODE, superAdmin: boolean) =>
[
{
// Access type is applicable for direct permissions only
accessType: ACCESS_TYPE_MAP.DEVTRON_APPS,
tabName: 'devtron-apps',
label: 'Devtron Apps',
isHidden: serverMode === SERVER_MODE.EA_ONLY,
},
{
accessType: ACCESS_TYPE_MAP.HELM_APPS,
tabName: 'helm-apps',
label: 'Helm Apps',
isHidden: false,
},
{
accessType: ACCESS_TYPE_MAP.JOBS,
tabName: 'jobs',
label: 'Jobs',
isHidden: serverMode === SERVER_MODE.EA_ONLY,
},
{
accessType: null,
tabName: 'kubernetes-objects',
label: 'Kubernetes Resources',
isHidden: !superAdmin,
},
{
accessType: null,
tabName: 'chart-groups',
label: 'Chart Groups',
isHidden: serverMode === SERVER_MODE.EA_ONLY,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,8 @@ export interface PermissionConfigurationFormContext {
*/
showStatus: boolean
}

export type AccessTypeToErrorMapType = Record<
PermissionConfigurationFormContext['directPermission'][number]['accessType'],
boolean
>
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import {
PermissionConfigurationForm,
usePermissionConfiguration,
} from '../../Shared/components/PermissionConfigurationForm'
import { createUserPermissionPayload, isDirectPermissionFormComplete } from '../../utils'
import { createUserPermissionPayload, validateDirectPermissionForm } from '../../utils'
import { excludeKeyAndClusterValue } from '../../Shared/components/K8sObjectPermissions/utils'
import { getCreatableChipStyle } from '../utils'
import { getDefaultUserStatusAndTimeout } from '../../libUtils'
Expand Down Expand Up @@ -138,9 +138,10 @@ const UserForm = ({ isAddMode }: { isAddMode: boolean }) => {
}

const handleSubmit = async () => {
if (!validateForm() || !isDirectPermissionFormComplete(directPermission, setDirectPermission)) {
if (!validateForm() || !validateDirectPermissionForm(directPermission, setDirectPermission).isValid) {
return
}

setSubmitting(true)

const payload = createUserPermissionPayload({
Expand Down
9 changes: 8 additions & 1 deletion src/Pages/GlobalConfigurations/Authorization/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
* limitations under the License.
*/

import { getCommonSelectStyle, EntityTypes } from '@devtron-labs/devtron-fe-common-lib'
import { getCommonSelectStyle, EntityTypes, ACCESS_TYPE_MAP } from '@devtron-labs/devtron-fe-common-lib'
import { SELECT_ALL_VALUE } from '../../../config'
import { APIRoleFilter } from './types'
import { getDefaultStatusAndTimeout } from './libUtils'
import { importComponentFromFELibrary } from '../../../components/common'
import { groupHeaderStyle } from '../../../components/v2/common/ReactSelect.utils'
import { AccessTypeToErrorMapType } from './Shared/components/PermissionConfigurationForm/types'

/**
* Permission types for users and permission groups
Expand Down Expand Up @@ -91,3 +92,9 @@ export const IMAGE_APPROVER_ACTION = importComponentFromFELibrary('IMAGE_APPROVE
export const CONFIG_APPROVER_ACTION = importComponentFromFELibrary('CONFIG_APPROVER_ACTION', {}, 'function')
export const ARTIFACT_PROMOTER_ACTION = importComponentFromFELibrary('ARTIFACT_PROMOTER_ACTION', {}, 'function')
export const TERMINAL_EXEC_ACTION = importComponentFromFELibrary('TERMINAL_EXEC_ACTION', {}, 'function')

export const DEFAULT_ACCESS_TYPE_TO_ERROR_MAP: AccessTypeToErrorMapType = {
[ACCESS_TYPE_MAP.DEVTRON_APPS]: false,
[ACCESS_TYPE_MAP.HELM_APPS]: false,
[ACCESS_TYPE_MAP.JOBS]: false,
} as const
Loading

0 comments on commit 67c239b

Please sign in to comment.