Skip to content

Commit f364282

Browse files
committed
chore: extract logic for managed fields from useEffect to handler in cluster terminal
1 parent f0ad0bb commit f364282

File tree

5 files changed

+88
-41
lines changed

5 files changed

+88
-41
lines changed

src/components/ClusterNodes/ClusterManifest.tsx

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { ReactComponent as WarningIcon } from '../../assets/icons/ic-warning.svg
1111
import { ReactComponent as Close } from '../../assets/icons/ic-cross.svg'
1212
import { defaultManifestErrorText, manifestCommentsRegex } from './constants'
1313
import { EditModeType } from '../v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/terminal/constants'
14+
import { getTrimmedManifestData } from '../v2/appDetails/k8Resource/nodeDetail/nodeDetail.util'
1415

1516
export default function ClusterManifest({
1617
terminalAccessId,
@@ -22,6 +23,9 @@ export default function ClusterManifest({
2223
selectTerminalTab,
2324
hideManagedFields,
2425
}: ClusterManifestType) {
26+
// Manifest data with managed fields
27+
const [originalManifest, setOriginalManifest] = useState('')
28+
// Manifest data that we would be comparing with the edited manifest
2529
const [defaultManifest, setDefaultManifest] = useState('')
2630
const [manifestValue, setManifest] = useState('')
2731
const [loading, setLoading] = useState<boolean>(true)
@@ -33,8 +37,10 @@ export default function ClusterManifest({
3337
getClusterManifest(terminalAccessId)
3438
.then((response) => {
3539
const _manifest = YAML.stringify(response.result?.manifest)
36-
setDefaultManifest(_manifest)
37-
setManifest(_manifest)
40+
setOriginalManifest(_manifest)
41+
const trimmedManifest = YAML.stringify(getTrimmedManifestData(response.result?.manifest))
42+
setDefaultManifest(trimmedManifest)
43+
setManifest(trimmedManifest)
3844
setLoading(false)
3945
setManifestAvailable(true)
4046
})
@@ -52,6 +58,7 @@ export default function ClusterManifest({
5258
}
5359
}, [terminalAccessId])
5460

61+
// NOTE: Check if we can replace this useEffect since manifestMode changes on events.
5562
useEffect(() => {
5663
const regex = manifestCommentsRegex
5764
if (manifestMode === EditModeType.NON_EDIT) {
@@ -80,6 +87,23 @@ export default function ClusterManifest({
8087
}
8188
}, [manifestMode])
8289

90+
const displayManifest = (() => {
91+
if (manifestMode === EditModeType.NON_EDIT) {
92+
if (hideManagedFields) {
93+
return defaultManifest
94+
}
95+
return originalManifest
96+
}
97+
98+
return manifestValue
99+
})()
100+
101+
const handleEditorChange = (value: string) => {
102+
if (manifestMode !== EditModeType.NON_EDIT) {
103+
setManifest(value)
104+
}
105+
}
106+
83107
const switchToEditMode = (): void => {
84108
setManifestMode(EditModeType.EDIT)
85109
}
@@ -112,10 +136,10 @@ export default function ClusterManifest({
112136
defaultValue={defaultManifest}
113137
theme="vs-dark--dt"
114138
height="100%"
115-
value={manifestValue}
139+
value={displayManifest}
116140
mode={MODES.YAML}
117141
noParsing
118-
onChange={setManifest}
142+
onChange={handleEditorChange}
119143
readOnly={manifestMode !== EditModeType.EDIT && manifestMode !== EditModeType.REVIEW}
120144
diffView={manifestMode === EditModeType.REVIEW}
121145
/>

src/components/ClusterNodes/ClusterTerminal.tsx

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -821,23 +821,20 @@ export default function ClusterTerminal({
821821
}
822822
}
823823

824-
// TODO: Move into common component for deployment
825-
const renderHideManagedFields = () => {
826-
return (
827-
<div className="pt-6 pb-6 pl-8 pr-8 top">
828-
<Checkbox
829-
rootClassName="mb-0-imp h-20"
830-
isChecked={hideManagedFields}
831-
value={CHECKBOX_VALUE.CHECKED}
832-
onChange={handleToggleManagedFields}
833-
>
834-
<span className="mr-5 cn-9 fs-12" data-testid="hide-pods-managed-fields">
835-
Hide Managed Fields
836-
</span>
837-
</Checkbox>
838-
</div>
839-
)
840-
}
824+
const renderHideManagedFields = () => (
825+
<div className="pt-6 pb-6 pl-12 pr-8 top">
826+
<Checkbox
827+
rootClassName="mb-0-imp h-18"
828+
isChecked={hideManagedFields}
829+
value={CHECKBOX_VALUE.CHECKED}
830+
onChange={handleToggleManagedFields}
831+
>
832+
<span className="mr-5 cn-9 fs-12 lh-18" data-testid="hide-pods-managed-fields">
833+
Hide Managed Fields
834+
</span>
835+
</Checkbox>
836+
</div>
837+
)
841838

842839
const closeManifetsPopup = (isClose: boolean): void => {
843840
setManifestButtonState(EditModeType.REVIEW)
@@ -846,6 +843,8 @@ export default function ClusterTerminal({
846843
}
847844

848845
const hideShell: boolean = !(connectTerminal && isPodCreated && !selectedTabIndex)
846+
const showManagedFieldsCheckbox: boolean =
847+
selectedTabIndex === 2 && isManifestAvailable && manifestButtonState === EditModeType.NON_EDIT
849848

850849
const fullScreenClassWrapper = isFullScreen ? 'cluster-full_screen' : 'cluster-terminal-view-container'
851850
const nodeDetailsPageClassWrapper = isNodeDetailsPage || isClusterDetailsPage ? '' : 'node-terminal'
@@ -975,7 +974,7 @@ export default function ClusterTerminal({
975974
buttonSelectionState: manifestButtonState,
976975
setManifestButtonState: setManifestButtonState,
977976
},
978-
...(selectedTabIndex === 2 && isManifestAvailable
977+
...(showManagedFieldsCheckbox
979978
? [
980979
{
981980
type: TerminalWrapperType.CUSTOM_COMPONENT,

src/components/v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/Manifest.component.tsx

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import {
2323
EA_MANIFEST_SECRET_EDIT_MODE_INFO_TEXT,
2424
EA_MANIFEST_SECRET_INFO_TEXT,
2525
} from '../../../../../../config/constantMessaging'
26-
import { MANIFEST_KEY_FIELDS } from '../../../../../../config/constants'
2726
import { MODES } from '../../../../../../config'
2827
import { EMPTY_YAML_ERROR, SAVE_DATA_VALIDATION_ERROR_MSG } from '../../../../values/chartValuesDiff/ChartValuesView.constants'
28+
import { getTrimmedManifestData } from '../nodeDetail.util'
2929

3030
function ManifestComponent({
3131
selectedTab,
@@ -138,7 +138,7 @@ function ManifestComponent({
138138
toggleManagedFields(false)
139139
const jsonManifestData = YAML.parse(activeManifestEditorData)
140140
if (jsonManifestData?.metadata?.managedFields) {
141-
setTrimedManifestEditorData(trimManifestData(jsonManifestData))
141+
setTrimedManifestEditorData(getTrimmedManifestData(jsonManifestData, true) as string)
142142
}
143143
}
144144
}, [isEditmode])
@@ -152,27 +152,16 @@ function ManifestComponent({
152152
useEffect(() => {
153153
setTrimedManifestEditorData(activeManifestEditorData)
154154
if (activeTab === 'Live manifest') {
155-
let jsonManifestData = YAML.parse(activeManifestEditorData)
155+
const jsonManifestData = YAML.parse(activeManifestEditorData)
156156
if (jsonManifestData?.metadata?.managedFields) {
157157
toggleManagedFields(true)
158158
if (hideManagedFields) {
159-
setTrimedManifestEditorData(trimManifestData(jsonManifestData))
159+
setTrimedManifestEditorData(getTrimmedManifestData(jsonManifestData, true) as string)
160160
}
161161
}
162162
}
163163
}, [activeManifestEditorData, hideManagedFields, activeTab])
164164

165-
//For External
166-
const trimManifestData = (jsonManifestData: object): string => {
167-
const _trimedManifestData = JSON.stringify(jsonManifestData, (key, value) => {
168-
if (key === MANIFEST_KEY_FIELDS.METADATA) {
169-
value[MANIFEST_KEY_FIELDS.MANAGED_FIELDS] = undefined
170-
}
171-
return value
172-
})
173-
return _trimedManifestData
174-
}
175-
176165
const handleEditorValueChange = (codeEditorData: string) => {
177166
if (activeTab === 'Live manifest' && isEditmode) {
178167
setModifiedManifest(codeEditorData)

src/components/v2/appDetails/k8Resource/nodeDetail/nodeDetail.type.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { OptionType } from '@devtron-labs/devtron-fe-common-lib';
1+
import { OptionType } from '@devtron-labs/devtron-fe-common-lib'
22
import React from 'react'
3-
import {Options, OptionsBase } from "../../appDetails.type";
3+
import {Options, OptionsBase } from '../../appDetails.type'
4+
import { MANIFEST_KEY_FIELDS } from '../../../../../config'
45

56
export enum NodeDetailTab {
67
EVENTS = 'EVENTS',
@@ -68,3 +69,18 @@ export interface ResponsePayload {
6869
manifest: string
6970
}
7071
}
72+
73+
74+
interface ManagedFields {
75+
[key: string]: any
76+
}
77+
78+
interface ManifestMetadata {
79+
[MANIFEST_KEY_FIELDS.MANAGED_FIELDS]?: ManagedFields[]
80+
[key: string]: any
81+
}
82+
83+
export interface ManifestData {
84+
[MANIFEST_KEY_FIELDS.METADATA]?: ManifestMetadata
85+
[key: string]: any
86+
}

src/components/v2/appDetails/k8Resource/nodeDetail/nodeDetail.util.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import {
99
SelectedResourceType,
1010
} from '../../appDetails.type'
1111
import IndexStore from '../../index.store'
12-
import { NodeDetailTab } from './nodeDetail.type'
12+
import { ManifestData, NodeDetailTab } from './nodeDetail.type'
1313
import { multiSelectStyles } from '../../../common/ReactSelectCustomization'
1414
import { sortOptionsByLabel } from '../../../../common'
15+
import { MANIFEST_KEY_FIELDS } from '../../../../../config'
1516

1617
export const getNodeDetailTabs = (nodeType: NodeType, isResourceBrowserTab?: boolean) => {
1718
if (nodeType.toLowerCase() === NodeType.Pod.toLowerCase()) {
@@ -386,4 +387,22 @@ export const selectStyles = {
386387
...base,
387388
padding: '0 8px',
388389
}),
389-
}
390+
}
391+
392+
/**
393+
* @description This function is used to trim the manifest data by removing the managed fields from the manifest data
394+
*/
395+
export const getTrimmedManifestData = (
396+
manifestData: ManifestData,
397+
returnAsString: boolean = false,
398+
): ManifestData | string => {
399+
if (manifestData[MANIFEST_KEY_FIELDS.METADATA]) {
400+
const { [MANIFEST_KEY_FIELDS.MANAGED_FIELDS]: _, ...metadata } = manifestData[MANIFEST_KEY_FIELDS.METADATA]
401+
402+
return returnAsString
403+
? JSON.stringify({ ...manifestData, [MANIFEST_KEY_FIELDS.METADATA]: metadata })
404+
: { ...manifestData, [MANIFEST_KEY_FIELDS.METADATA]: metadata }
405+
}
406+
407+
return returnAsString ? JSON.stringify(manifestData) : manifestData
408+
}

0 commit comments

Comments
 (0)