Skip to content

Commit 844dc64

Browse files
Merge branch 'main' into feat/cm-based-default-cluster-show
2 parents 8ad5a16 + 90886b6 commit 844dc64

23 files changed

+876
-56
lines changed
Lines changed: 8 additions & 0 deletions
Loading

src/assets/icons/ic-hibernate-3.svg

Lines changed: 5 additions & 0 deletions
Loading
Lines changed: 6 additions & 0 deletions
Loading
Lines changed: 14 additions & 0 deletions
Loading

src/assets/icons/ic-unhibernate.svg

Lines changed: 5 additions & 0 deletions
Loading

src/components/ApplicationGroup/AppGroup.service.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
CheckPermissionResponse,
2020
CheckPermissionType,
2121
ConfigAppListType,
22+
EditDescRequestResponse,
2223
EnvAppType,
2324
EnvDeploymentStatusType,
2425
EnvGroupListResponse,
@@ -193,7 +194,7 @@ export const getAppGroupList = (envId: number): Promise<AppGroupList> => {
193194
return get(`${Routes.APP_LIST_GROUP}/${envId}`)
194195
}
195196

196-
export const getEnvGroupList = (envId: number, filterParentType?:string): Promise<EnvGroupListResponse> => {
197+
export const getEnvGroupList = (envId: number, filterParentType?:string): Promise<EnvGroupListResponse> => {
197198
let filterParentTypeQuery = ''
198199
if (filterParentType) {
199200
filterParentTypeQuery = `?groupType=${filterParentType}`
@@ -223,3 +224,7 @@ export const deleteEnvGroup = (envId: string, groupId: string, filterParentType?
223224
}
224225
return trash(`${Routes.ENVIRONMENT}/${envId}/${Routes.GROUP}/${groupId}${filterParentTypeQuery}`)
225226
}
227+
228+
export const editDescription = (payload): Promise<EditDescRequestResponse> => {
229+
return put(Routes.ENVIRONMENT, payload)
230+
}

src/components/ApplicationGroup/AppGroup.types.ts

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from '@devtron-labs/devtron-fe-common-lib'
88
import { MultiValue } from 'react-select'
99
import { WebhookPayloads, WorkflowNodeType, WorkflowType } from '../app/details/triggerView/types'
10-
import { OptionType } from '../app/types'
10+
import { EditDescRequest, OptionType } from '../app/types'
1111
import { AppFilterTabs, BulkResponseStatus } from './Constants'
1212

1313
interface BulkTriggerAppDetailType {
@@ -205,8 +205,11 @@ export interface AppInfoListType {
205205
appStatus: string
206206
deploymentStatus: string
207207
lastDeployed: string
208+
lastDeployedImage?: string
209+
lastDeployedBy?: string
208210
appId: number
209211
envId: number
212+
pipelineId?: number
210213
}
211214

212215
export interface AppListDataType {
@@ -267,6 +270,9 @@ export interface AppGroupDetailDefaultType {
267270
appGroupListData?: AppGroupListType
268271
isVirtualEnv?: boolean
269272
envName?: string
273+
description?: string
274+
getAppListData?: () => Promise<void>
275+
handleSaveDescription?: (description: string) => Promise<void>
270276
}
271277

272278
interface CIPipeline {
@@ -323,6 +329,8 @@ export interface ApplistEnvType {
323329
appName: string
324330
appStatus: string
325331
lastDeployedTime: string
332+
lastDeployedBy?: string
333+
lastDeployedImage?: string
326334
}
327335

328336
export interface AppGroupListType {
@@ -331,6 +339,11 @@ export interface AppGroupListType {
331339
clusterName: string
332340
environmentId: number
333341
apps: ApplistEnvType[]
342+
description?: string
343+
environmentType?: 'Non-Production' | 'Production'
344+
createdOn?: string
345+
createdBy?: string
346+
clusterId?: number
334347
}
335348
export interface ConfigAppListType extends ResponseType {
336349
result?: ConfigAppList[]
@@ -388,7 +401,57 @@ export interface SearchBarType {
388401
setSearchApplied: React.Dispatch<React.SetStateAction<boolean>>
389402
}
390403

404+
export interface EditDescRequestResponse extends ResponseType {
405+
result?: EditDescRequest
406+
}
407+
391408
export enum FilterParentType {
392409
app = 'env-group',
393410
env = 'app-group',
394-
}
411+
}
412+
413+
export interface HibernateStatusRowType {
414+
rowData: HibernateResponseRowType
415+
index: number
416+
isHibernateOperation: boolean
417+
isVirtualEnv?: boolean
418+
}
419+
420+
export interface HibernateResponseRowType {
421+
id: number
422+
appName: string
423+
success: boolean
424+
authError?: boolean
425+
error?: string
426+
skipped?: string
427+
}
428+
429+
export interface BaseModalProps {
430+
selectedAppIds: number[]
431+
envName: string
432+
envId: string
433+
setAppStatusResponseList: React.Dispatch<React.SetStateAction<any[]>>
434+
setShowHibernateStatusDrawer: React.Dispatch<React.SetStateAction<StatusDrawer>>
435+
}
436+
437+
export interface HibernateModalProps extends BaseModalProps {
438+
setOpenHiberateModal: React.Dispatch<React.SetStateAction<boolean>>
439+
}
440+
441+
export interface UnhibernateModalProps extends BaseModalProps {
442+
setOpenUnhiberateModal: React.Dispatch<React.SetStateAction<boolean>>
443+
}
444+
445+
export interface StatusDrawer {
446+
hibernationOperation: boolean
447+
showStatus: boolean
448+
}
449+
450+
export interface ManageAppsResponse {
451+
appName: string
452+
id: number
453+
success: boolean
454+
skipped?: string
455+
error?: string
456+
authError?: boolean
457+
}

src/components/ApplicationGroup/AppGroupAppFilter.components.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export const Option = (props): JSX.Element => {
8282
}
8383

8484
const renderOptionIcon = (): JSX.Element => {
85+
8586
if (selectedFilterTab === AppFilterTabs.APP_FILTER) {
8687
if (props.isSelected || props.isFocused) {
8788
return (
@@ -92,7 +93,9 @@ export const Option = (props): JSX.Element => {
9293
)
9394
}
9495
} else {
95-
if (props.isFocused) {
96+
// hide edit and delete icon for predefined filter
97+
if (props.isFocused && props.data.value !== props.data.label) {
98+
// for predefined filter, value and label are same (done in fe)
9699
return (
97100
<div className="flex">
98101
<Tippy className="default-tt" arrow={false} content="Edit group">

src/components/ApplicationGroup/AppGroupAppFilter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default function AppGroupAppFilter() {
1818
groupFilterOptions,
1919
selectedGroupFilter,
2020
setSelectedGroupFilter,
21-
filterParentType
21+
filterParentType,
2222
}: AppGroupAppFilterContextType = useAppGroupAppFilterContext()
2323
const [appFilterAppInput, setAppFilterAppInput] = useState('')
2424
const [appFilterGroupInput, setAppFilterGroupInput] = useState('')

src/components/ApplicationGroup/AppGroupDetailsRoute.tsx

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ import { EnvSelector } from './EnvSelector'
2323
import EmptyFolder from '../../assets/img/Empty-folder.png'
2424
import { AppFilterTabs, EMPTY_LIST_MESSAGING, ENV_APP_GROUP_GA_EVENTS, NO_ACCESS_TOAST_MESSAGE } from './Constants'
2525
import { ReactComponent as Settings } from '../../assets/icons/ic-settings.svg'
26-
import { deleteEnvGroup, getAppGroupList, getEnvAppList, getEnvGroupList, appGroupPermission } from './AppGroup.service'
26+
import {
27+
deleteEnvGroup,
28+
getAppGroupList,
29+
getEnvAppList,
30+
getEnvGroupList,
31+
appGroupPermission,
32+
editDescription,
33+
} from './AppGroup.service'
2734
import {
2835
AppGroupAdminType,
2936
AppGroupAppFilterContextType,
@@ -36,7 +43,7 @@ import {
3643
GroupOptionType,
3744
} from './AppGroup.types'
3845
import { MultiValue } from 'react-select'
39-
import { OptionType } from '../app/types'
46+
import { EditDescRequest, OptionType } from '../app/types'
4047
import AppGroupAppFilter from './AppGroupAppFilter'
4148
import EnvCIDetails from './Details/EnvCIDetails/EnvCIDetails'
4249
import EnvCDDetails from './Details/EnvCDDetails/EnvCDDetails'
@@ -76,6 +83,9 @@ export default function AppGroupDetailsRoute({ isSuperAdmin }: AppGroupAdminType
7683
const [isVirtualEnv, setIsVirtualEnv] = useState<boolean>(false)
7784
const [isPopupBox, setIsPopupBox] = useState(false)
7885
const [mapUnauthorizedApp, setMapUnauthorizedApp] = useState<Map<string, boolean>>(new Map())
86+
const [description, setDescription] = useState<string>(
87+
appGroupListData?.description ? appGroupListData?.description : '',
88+
)
7989

8090
useEffect(() => {
8191
if (envList?.result) {
@@ -96,19 +106,21 @@ export default function AppGroupDetailsRoute({ isSuperAdmin }: AppGroupAdminType
96106
setSelectedGroupFilter([])
97107
setAppListOptions([])
98108
setAppGroupListData(null)
109+
setDescription('')
99110
}
100111
}, [envId])
101112

102113
const getSavedFilterData = async (groupId?: number): Promise<void> => {
103114
setSelectedAppList([])
104115
setAppListLoading(true)
105116
const { result } = await getEnvGroupList(+envId)
117+
106118
if (result) {
107119
const _groupFilterOption = []
108120
let _selectedGroup
109121
for (const group of result) {
110122
const processedGroupData = {
111-
value: group.id.toString(),
123+
value: group.id ? group.id.toString() : group.name,
112124
label: group.name,
113125
appIds: group.appIds,
114126
description: group.description,
@@ -136,11 +148,32 @@ export default function AppGroupDetailsRoute({ isSuperAdmin }: AppGroupAdminType
136148
setAppListLoading(false)
137149
}
138150

151+
const handleSaveDescription = async (value: string) => {
152+
const payload: EditDescRequest = {
153+
id: appGroupListData.environmentId,
154+
environment_name: appGroupListData.environmentName,
155+
cluster_id: appGroupListData.clusterId,
156+
namespace: appGroupListData.namespace,
157+
active: true,
158+
default: !(appGroupListData.environmentType === 'Non-Production'),
159+
description: value?.trim(),
160+
}
161+
try {
162+
await editDescription(payload)
163+
toast.success('Successfully saved')
164+
setDescription(value?.trim())
165+
} catch (err) {
166+
showError(err)
167+
throw err
168+
}
169+
}
170+
139171
const getAppListData = async (): Promise<void> => {
140172
setSelectedAppList([])
141173
setAppListLoading(true)
142174
const { result } = await getAppGroupList(+envId)
143175
setAppGroupListData(result)
176+
setDescription(result.description)
144177
if (result.apps?.length) {
145178
setAppListOptions(
146179
result.apps
@@ -322,7 +355,7 @@ export default function AppGroupDetailsRoute({ isSuperAdmin }: AppGroupAdminType
322355
_appListData.apps = _filteredApps
323356
}
324357
return _appListData
325-
}, [selectedAppList, appGroupListData?.apps])
358+
}, [selectedAppList, appGroupListData?.apps, appGroupListData?.description])
326359

327360
const renderRoute = () => {
328361
if (loading || appListLoading) {
@@ -344,6 +377,9 @@ export default function AppGroupDetailsRoute({ isSuperAdmin }: AppGroupAdminType
344377
filteredAppIds={_filteredAppsIds}
345378
appGroupListData={filteredAppListData}
346379
isVirtualEnv={isVirtualEnv}
380+
getAppListData={getAppListData}
381+
handleSaveDescription={handleSaveDescription}
382+
description={description}
347383
/>
348384
</Route>
349385
<Route path={`${path}/${URLS.APP_TRIGGER}`}>

0 commit comments

Comments
 (0)