Repository: devtron-labs/dashboard
Pull request #2703: feat: deployment status modal
Author: login: AbhishekA1509
Labels: name: PR:Ready-to-Review
description: PR:Ready-to-Review
Created: 2025-05-12T20:18:24Z | Merged: 2025-05-19T08:32:29Z

# Description
Refactor the logic for deployment timeline and update the deployment status timeline modal, and open it alongside the app status modal.

Fixes https://github.com/devtron-labs/sprint-tasks/issues/2179

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update

# How Has This Been Tested?
QA


# Checklist:

* [x] The title of the PR states what changed and the related issues number (used for the release note).
* [ ] Does this PR require documentation updates?
* [ ] I've updated documentation as required by this PR.
* [x] I have performed a self-review of my own code
* [x] I have commented my code, particularly in hard-to-understand areas





Diff:
diff --git a/package.json b/package.json
index 245f5f174b..8f4b992386 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
     "private": true,
     "homepage": "/dashboard",
     "dependencies": {
-        "@devtron-labs/devtron-fe-common-lib": "1.13.0-pre-5",
+        "@devtron-labs/devtron-fe-common-lib": "1.13.0-pre-6",
         "@esbuild-plugins/node-globals-polyfill": "0.2.3",
         "@rjsf/core": "^5.13.3",
         "@rjsf/utils": "^5.13.3",
diff --git a/src/components/app/details/appDetails/AppDetails.tsx b/src/components/app/details/appDetails/AppDetails.tsx
index 151ff7e894..a002551d95 100644
--- a/src/components/app/details/appDetails/AppDetails.tsx
+++ b/src/components/app/details/appDetails/AppDetails.tsx
@@ -21,10 +21,14 @@ import {
     ACTION_STATE,
     aggregateNodes,
     AppStatusModal,
+    AppStatusModalTabType,
     ArtifactInfoModal,
     Button,
     DeploymentAppTypes,
+    DeploymentStatusDetailsBreakdownDataType,
+    DeploymentStatusDetailsType,
     GenericEmptyState,
+    getAppDetailsURL,
     getAppsInfoForEnv,
     getIsRequestAborted,
     MODAL_TYPE,
@@ -47,12 +51,9 @@ import noGroups from '@Images/ic-feature-deploymentgroups@3x.png'
 
 import {
     DEFAULT_STATUS,
-    DEFAULT_STATUS_TEXT,
     DEPLOYMENT_STATUS,
     DEPLOYMENT_STATUS_QUERY_PARAM,
     DOCUMENTATION,
-    getAppDetailsURL,
-    HELM_DEPLOYMENT_STATUS_TEXT,
     RESOURCES_NOT_FOUND,
 } from '../../../../config'
 import { APP_DETAILS, ERROR_EMPTY_SCREEN } from '../../../../config/constantMessaging'
@@ -80,15 +81,12 @@ import { getDeploymentStatusDetail } from './appDetails.service'
 import {
     AppDetailProps,
     DeletedAppComponentType,
-    DeploymentStatusDetailsBreakdownDataType,
-    DeploymentStatusDetailsType,
     DetailsType,
     ErrorItem,
     HibernationModalTypes,
 } from './appDetails.type'
 import AppDetailsCDButton from './AppDetailsCDButton'
 import { AppMetrics } from './AppMetrics'
-import DeploymentStatusDetailModal from './DeploymentStatusDetailModal'
 import HibernateModal from './HibernateModal'
 import IssuesListingModal from './IssuesListingModal'
 import { SourceInfo } from './SourceInfo'
@@ -208,11 +206,11 @@ const Details: React.FC<DetailsType> = ({
 }) => {
     const params = useParams<{ appId: string; envId: string }>()
     const location = useLocation()
+    const { replace } = useHistory()
 
     const appDetailsFromIndexStore = IndexStore.getAppDetails()
 
-    // fixme: the state is not being set anywhere and just being drilled down
-    const [detailedStatus, toggleDetailedStatus] = useState<boolean>(false)
+    const [showAppStatusModal, setShowAppStatusModal] = useState<boolean>(false)
     const [resourceTreeFetchTimeOut, setResourceTreeFetchTimeOut] = useState<boolean>(false)
     const [urlInfo, setUrlInfo] = useState<boolean>(false)
     const [hibernateConfirmationModal, setHibernateConfirmationModal] = useState<HibernationModalTypes>(null)
@@ -235,14 +233,11 @@ const Details: React.FC<DetailsType> = ({
 
     const [loadingDetails, setLoadingDetails] = useState(true)
     const [loadingResourceTree, setLoadingResourceTree] = useState(true)
-    // State to track the loading state for the timeline data when the detailed status modal opens
-    const [isInitialTimelineDataLoading, setIsInitialTimelineDataLoading] = useState(true)
     const [errorsList, setErrorsList] = useState<ErrorItem[]>([])
     const appDetailsRef = useRef(null)
     const appDetailsRequestRef = useRef(null)
     const pollResourceTreeRef = useRef(true)
     const appDetailsAbortRef = useRef<AbortController>(null)
-    const shouldFetchTimelineRef = useRef(false)
 
     const [deploymentStatusDetailsBreakdownData, setDeploymentStatusDetailsBreakdownData] =
         useState<DeploymentStatusDetailsBreakdownDataType>({
@@ -250,7 +245,6 @@ const Details: React.FC<DetailsType> = ({
                 ? processVirtualEnvironmentDeploymentData()
                 : processDeploymentStatusDetailsData()),
             deploymentStatus: DEFAULT_STATUS,
-            deploymentStatusText: DEFAULT_STATUS_TEXT,
         })
     const isConfigDriftEnabled: boolean = window._env_.FEATURE_CONFIG_DRIFT_ENABLE && !!ConfigDriftModal
     const isExternalToolAvailable: boolean =
@@ -263,16 +257,6 @@ const Details: React.FC<DetailsType> = ({
         [appDetails],
     )
 
-    useEffect(() => {
-        const isModalOpen = location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM)
-        // Reset the loading state when the modal is closed
-        if (shouldFetchTimelineRef.current && !isModalOpen) {
-            setIsInitialTimelineDataLoading(true)
-        }
-        // The timeline should be fetched by default if the modal is open
-        shouldFetchTimelineRef.current = isModalOpen
-    }, [location.search])
-
     const clearDeploymentStatusTimer = useCallback((): void => {
         if (deploymentStatusTimer) {
             clearTimeout(deploymentStatusTimer)
@@ -308,30 +292,14 @@ const Details: React.FC<DetailsType> = ({
         ],
     )
 
-    // This is called only when timeline modal is open
-    const getDeploymentDetailStepsData = useCallback(
-        (showTimeline?: boolean): void => {
-            const shouldFetchTimeline = showTimeline ?? shouldFetchTimelineRef.current
-
-            // Deployments status details for Devtron apps
-            getDeploymentStatusDetail(params.appId, params.envId, shouldFetchTimeline)
-                .then((deploymentStatusDetailRes) => {
-                    processDeploymentStatusData(deploymentStatusDetailRes.result)
-                    // Update the loading status if the modal is open
-                    if (shouldFetchTimeline) {
-                        setIsInitialTimelineDataLoading(false)
-                    }
-                })
-                .catch(noop)
-        },
-        [
-            params.appId,
-            params.envId,
-            shouldFetchTimelineRef.current,
-            getDeploymentStatusDetail,
-            processDeploymentStatusData,
-        ],
-    )
+    const getDeploymentDetailStepsData = useCallback((): void => {
+        // Deployments status details for Devtron apps
+        getDeploymentStatusDetail(params.appId, params.envId)
+            .then((deploymentStatusDetailRes) => {
+                processDeploymentStatusData(deploymentStatusDetailRes.result)
+            })
+            .catch(noop)
+    }, [params.appId, params.envId, getDeploymentStatusDetail, processDeploymentStatusData])
 
     function clearPollingInterval() {
         if (appDetailsIntervalID) {
@@ -437,32 +405,21 @@ const Details: React.FC<DetailsType> = ({
         isIsolatedEnv: boolean,
         triggerIdToFetch?: number,
     ) {
-        const shouldFetchTimeline = shouldFetchTimelineRef.current
-
         // triggerIdToFetch represents the wfrId to fetch for any specific deployment
-        getDeploymentStatusDetail(params.appId, params.envId, shouldFetchTimeline, triggerIdToFetch?.toString())
+        getDeploymentStatusDetail(params.appId, params.envId, triggerIdToFetch?.toString())
             .then((deploymentStatusDetailRes) => {
                 if (deploymentStatusDetailRes.result) {
                     // Timelines are not applicable for helm deployments and air gapped envs
                     if (deploymentAppType === DeploymentAppTypes.HELM || isIsolatedEnv) {
-                        setDeploymentStatusDetailsBreakdownData({
-                            ...deploymentStatusDetailsBreakdownData,
-                            deploymentStatus:
-                                DEPLOYMENT_STATUS[deploymentStatusDetailRes.result.wfrStatus?.toUpperCase()],
-                            deploymentStatusText:
-                                deploymentStatusDetailRes.result.wfrStatus === HELM_DEPLOYMENT_STATUS_TEXT.PROGRESSING
-                                    ? HELM_DEPLOYMENT_STATUS_TEXT.INPROGRESS
-                                    : deploymentStatusDetailRes.result.wfrStatus,
-                            deploymentTriggerTime: deploymentStatusDetailRes.result.deploymentStartedOn,
-                            deploymentEndTime: deploymentStatusDetailRes.result.deploymentFinishedOn,
-                            triggeredBy: deploymentStatusDetailRes.result.triggeredBy,
-                        })
+                        const processedDeploymentStatusData =
+                            isVirtualEnvRef.current && processVirtualEnvironmentDeploymentData
+                                ? processVirtualEnvironmentDeploymentData(deploymentStatusDetailRes.result)
+                                : processDeploymentStatusDetailsData(deploymentStatusDetailRes.result)
+
+                        setDeploymentStatusDetailsBreakdownData(processedDeploymentStatusData)
                     } else {
                         processDeploymentStatusData(deploymentStatusDetailRes.result)
                     }
-                    if (shouldFetchTimeline) {
-                        setIsInitialTimelineDataLoading(false)
-                    }
                 }
             })
             .catch(noop)
@@ -553,12 +510,20 @@ const Details: React.FC<DetailsType> = ({
         }
     }
 
-    const hideAppDetailsStatus = (): void => {
-        toggleDetailedStatus(false)
+    const handleCloseAppStatusModal = (): void => {
+        if (showAppStatusModal) {
+            setShowAppStatusModal(false)
+        }
+
+        if (location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM)) {
+            replace({
+                search: '',
+            })
+        }
     }
 
     const showApplicationDetailedModal = (): void => {
-        toggleDetailedStatus(true)
+        setShowAppStatusModal(true)
     }
 
     const renderAppDetailsCDButton = () =>
@@ -684,6 +649,11 @@ const Details: React.FC<DetailsType> = ({
             isDeploymentBlocked={isDeploymentBlocked}
         />
     )
+
+    const updateDeploymentStatusDetailsBreakdownData = (updatedTimelines: DeploymentStatusDetailsBreakdownDataType) => {
+        setDeploymentStatusDetailsBreakdownData(updatedTimelines)
+    }
+
     const isDeploymentAppDeleting = appDetails?.deploymentAppDeleteRequest || false
     return (
         <>
@@ -692,7 +662,7 @@ const Details: React.FC<DetailsType> = ({
             >
                 <SourceInfo
                     appDetails={appDetails}
-                    setDetailed={toggleDetailedStatus}
+                    setDetailed={setShowAppStatusModal}
                     environment={environment}
                     isAppView={isAppView}
                     environments={environments}
@@ -704,7 +674,6 @@ const Details: React.FC<DetailsType> = ({
                     setRotateModal={setRotateModal}
                     loadingDetails={loadingDetails}
                     loadingResourceTree={loadingResourceTree}
-                    refetchDeploymentStatus={getDeploymentDetailStepsData}
                     toggleIssuesModal={toggleIssuesModal}
                     envId={appDetails?.environmentId}
                     ciArtifactId={appDetails?.ciArtifactId}
@@ -741,26 +710,22 @@ const Details: React.FC<DetailsType> = ({
             ) : (
                 renderAppDetails()
             )}
-            {detailedStatus && (
+            {(showAppStatusModal || (appDetails && location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM))) && (
                 <AppStatusModal
                     titleSegments={[appDetailsFromIndexStore.appName, appDetailsFromIndexStore.environmentName]}
-                    handleClose={hideAppDetailsStatus}
+                    handleClose={handleCloseAppStatusModal}
                     type="devtron-app"
                     appDetails={appDetailsFromIndexStore}
                     isConfigDriftEnabled={isConfigDriftEnabled}
                     configDriftModal={ConfigDriftModal}
+                    initialTab={
+                        showAppStatusModal ? AppStatusModalTabType.APP_STATUS : AppStatusModalTabType.DEPLOYMENT_STATUS
+                    }
+                    processVirtualEnvironmentDeploymentData={processVirtualEnvironmentDeploymentData}
+                    updateDeploymentStatusDetailsBreakdownData={updateDeploymentStatusDetailsBreakdownData}
                     debugWithAIButton={ExplainWithAIButton}
                 />
             )}
-            {location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM) && (
-                <DeploymentStatusDetailModal
-                    appName={appDetails?.appName}
-                    environmentName={appDetails?.environmentName}
-                    deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData}
-                    isVirtualEnvironment={isVirtualEnvRef.current}
-                    isLoading={isInitialTimelineDataLoading}
-                />
-            )}
             {location.search.includes('deployment-window-status') && DeploymentWindowStatusModal && (
                 <DeploymentWindowStatusModal envId={params.envId} appId={params.appId} />
             )}
@@ -910,7 +875,6 @@ const AppDetail = ({ detailsType, filteredResourceIds }: AppDetailProps) => {
                                 appDetails={null}
                                 environments={envList}
                                 environment={environment}
-                                refetchDeploymentStatus={noop}
                                 isAppView={isAppView}
                             />
                         </div>
diff --git a/src/components/app/details/appDetails/DeploymentStatusCard.tsx b/src/components/app/details/appDetails/DeploymentStatusCard.tsx
index 11efba04d9..c18b074a0c 100644
--- a/src/components/app/details/appDetails/DeploymentStatusCard.tsx
+++ b/src/components/app/details/appDetails/DeploymentStatusCard.tsx
@@ -18,10 +18,12 @@ import React from 'react'
 import { useHistory } from 'react-router-dom'
 import Tippy from '@tippyjs/react'
 
+import { DEPLOYMENT_STATUS_TEXT_MAP, PROGRESSING_DEPLOYMENT_STATUS } from '@devtron-labs/devtron-fe-common-lib'
+
 import { ReactComponent as CD } from '../../../../assets/icons/ic-CD.svg'
 import { ReactComponent as ICHelpOutline } from '../../../../assets/icons/ic-help-outline.svg'
 import { ReactComponent as Rocket } from '../../../../assets/icons/ic-paper-rocket.svg'
-import { DEPLOYMENT_STATUS, DEPLOYMENT_STATUS_QUERY_PARAM } from '../../../../config'
+import { DEPLOYMENT_STATUS_QUERY_PARAM } from '../../../../config'
 import { DeploymentStatusCardType } from './appDetails.type'
 import LoadingCard from './LoadingCard'
 import { validateMomentDate } from './utils'
@@ -31,7 +33,6 @@ const DeploymentStatusCard = ({
     cardLoading,
     hideDetails,
     isVirtualEnvironment,
-    refetchDeploymentStatus,
 }: DeploymentStatusCardType) => {
     const history = useHistory()
 
@@ -41,16 +42,9 @@ const DeploymentStatusCard = ({
             search: DEPLOYMENT_STATUS_QUERY_PARAM,
         })
     }
-    const ProgressingStateList: string[] = [
-        DEPLOYMENT_STATUS.INPROGRESS,
-        DEPLOYMENT_STATUS.PROGRESSING,
-        DEPLOYMENT_STATUS.STARTING,
-        DEPLOYMENT_STATUS.INITIATING,
-        DEPLOYMENT_STATUS.CHECKING,
-    ]
+
     const renderDeploymentStatus = () => {
-        const { triggeredBy, deploymentStatus, deploymentTriggerTime, deploymentStatusText } =
-            deploymentStatusDetailsBreakdownData
+        const { triggeredBy, deploymentStatus, deploymentTriggerTime } = deploymentStatusDetailsBreakdownData
         return (
             <>
                 <div className="app-details-info-card__top-container flex">
@@ -73,10 +67,10 @@ const DeploymentStatusCard = ({
                             <span
                                 data-testid="deployment-status-name"
                                 className={`app-summary__status-name fs-13 mr-8 fw-6 f-${deploymentStatus?.toLowerCase()} ${
-                                    ProgressingStateList.includes(deploymentStatus) ? 'dc__loading-dots' : ''
+                                    PROGRESSING_DEPLOYMENT_STATUS.includes(deploymentStatus) ? 'dc__loading-dots' : ''
                                 }`}
                             >
-                                {deploymentStatusText}
+                                {DEPLOYMENT_STATUS_TEXT_MAP[deploymentStatus] || deploymentStatus}
                             </span>
                         </div>
                     </div>
@@ -110,7 +104,6 @@ const DeploymentStatusCard = ({
     const onClickLastDeploymentStatus = (e) => {
         if (!hideDetails) {
             showDeploymentDetailedStatus(e)
-            refetchDeploymentStatus(true)
         }
     }
 
diff --git a/src/components/app/details/appDetails/DeploymentStatusDetailModal.tsx b/src/components/app/details/appDetails/DeploymentStatusDetailModal.tsx
deleted file mode 100644
index f625f1c5ec..0000000000
--- a/src/components/app/details/appDetails/DeploymentStatusDetailModal.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2024. Devtron Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { useEffect, useRef } from 'react'
-import { useHistory } from 'react-router-dom'
-import { ReactComponent as Close } from '../../../../assets/icons/ic-close.svg'
-import { DeploymentStatusDetailModalType } from './appDetails.type'
-import './appDetails.scss'
-import { Drawer, Progressing, DeploymentStatusDetailBreakdown } from '@devtron-labs/devtron-fe-common-lib'
-
-export default function DeploymentStatusDetailModal({
-    appName,
-    environmentName,
-    deploymentStatusDetailsBreakdownData,
-    isVirtualEnvironment,
-    isLoading,
-}: DeploymentStatusDetailModalType) {
-    const history = useHistory()
-    const appStatusDetailRef = useRef<HTMLDivElement>(null)
-
-    const closeStatusModal = () => {
-        history.replace({
-            search: '',
-        })
-    }
-
-    const escKeyPressHandler = (evt): void => {
-        if (evt && evt.key === 'Escape') {
-            evt.preventDefault()
-            closeStatusModal()
-        }
-    }
-    const outsideClickHandler = (evt): void => {
-        if (appStatusDetailRef.current && !appStatusDetailRef.current.contains(evt.target)) {
-            closeStatusModal()
-        }
-    }
-
-    useEffect(() => {
-        document.addEventListener('keydown', escKeyPressHandler)
-        return (): void => {
-            document.removeEventListener('keydown', escKeyPressHandler)
-        }
-    }, [escKeyPressHandler])
-
-    useEffect(() => {
-        document.addEventListener('click', outsideClickHandler)
-        return (): void => {
-            document.removeEventListener('click', outsideClickHandler)
-        }
-    }, [outsideClickHandler])
-
-    return (
-        <Drawer position="right" width="1024px">
-            <div
-                className="deployment-status-breakdown-modal-container flexbox-col h-100"
-                data-testid="deployment-status-drawer"
-                ref={appStatusDetailRef}
-            >
-                <div className="dc__box-shadow pb-12 pt-12 bg__primary">
-                    <div
-                        className="title flex dc__content-space pl-20 pr-20 show-shimmer-loading"
-                        data-testid="app-status-cross"
-                    >
-                        <div>
-                            <div className="cn-9 fs-16 fw-6 flexbox flex-align-center">
-                                Deployment status:&nbsp;
-                                {appName ?? <span className="child child-shimmer-loading w-120 h-20 mt-0-imp" />}
-                                &nbsp;/&nbsp;
-                                {environmentName ?? (
-                                    <span className="child child-shimmer-loading w-120 h-20 mt-0-imp" />
-                                )}
-                            </div>
-                            <div className="flexbox">
-                                {isLoading ? (
-                                    <span className="child child-shimmer-loading w-120 h-20" />
-                                ) : (
-                                    <span
-                                        className={`app-summary__status-name fs-13 fw-6 f-${deploymentStatusDetailsBreakdownData.deploymentStatus}`}
-                                    >
-                                        {deploymentStatusDetailsBreakdownData.deploymentStatusText}
-                                    </span>
-                                )}
-                            </div>
-                        </div>
-                        <span className="cursor" onClick={closeStatusModal}>
-                            <Close className="icon-dim-24" />
-                        </span>
-                    </div>
-                </div>
-                <div className="bcn-1 flex-grow-1 dc__overflow-auto pb-20">
-                    {isLoading ? (
-                        <Progressing />
-                    ) : (
-                        <DeploymentStatusDetailBreakdown
-                            deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData}
-                            isVirtualEnvironment={isVirtualEnvironment}
-                        />
-                    )}
-                </div>
-            </div>
-        </Drawer>
-    )
-}
diff --git a/src/components/app/details/appDetails/SourceInfo.tsx b/src/components/app/details/appDetails/SourceInfo.tsx
index a2b8bebe56..9c7cd61ddc 100644
--- a/src/components/app/details/appDetails/SourceInfo.tsx
+++ b/src/components/app/details/appDetails/SourceInfo.tsx
@@ -76,7 +76,6 @@ export const SourceInfo = ({
     loadingResourceTree = false,
     isVirtualEnvironment,
     setRotateModal = null,
-    refetchDeploymentStatus,
     toggleIssuesModal,
     envId,
     ciArtifactId,
@@ -184,7 +183,7 @@ export const SourceInfo = ({
                     >
                         <div className={`flex ${!appDetails.isVirtualEnvironment ? 'ml-16' : ''}`}>
                             {/* TODO: verify what appType needs to be passed */}
-                            <DeploymentTypeIcon deploymentAppType={appDetails?.deploymentAppType} appType={null} />
+                            <DeploymentTypeIcon deploymentAppType={appDetails.deploymentAppType} appType={null} />
                         </div>
                     </Tooltip>
                 )}
@@ -412,7 +411,6 @@ export const SourceInfo = ({
                                           appDetails?.deploymentAppType === DeploymentAppTypes.HELM || isIsolatedEnv
                                       }
                                       isVirtualEnvironment={isVirtualEnvironment}
-                                      refetchDeploymentStatus={refetchDeploymentStatus}
                                   />
                                   {appDetails?.dataSource !== 'EXTERNAL' && (
                                       <DeployedCommitCard
diff --git a/src/components/app/details/appDetails/appDetails.scss b/src/components/app/details/appDetails/appDetails.scss
index 3d1dde7968..e3b18b5085 100644
--- a/src/components/app/details/appDetails/appDetails.scss
+++ b/src/components/app/details/appDetails/appDetails.scss
@@ -1365,69 +1365,6 @@ table.resource-tree {
     }
 }
 
-.deployment-status-breakdown-container,
-.deployment-approval-container {
-    .vertical-connector {
-        border-left: 1px solid var(--N300);
-        height: 15px;
-        position: relative;
-        left: 18px;
-        width: 5px;
-    }
-    .deployment-status-breakdown-row {
-        display: flex;
-        align-items: center;
-        justify-content: left;
-
-        &.border-collapse {
-            border-radius: 4px 4px 0 0;
-        }
-    }
-
-    .pulse-highlight {
-        width: 12px;
-        height: 12px;
-        border: solid 4px var(--O200);
-        background-color: var(--O500);
-        position: relative;
-        top: 5px;
-        right: -5px;
-        border-radius: 50%;
-        animation-name: pulse;
-        animation-duration: 2s;
-        animation-iteration-count: infinite;
-        animation-timing-function: linear;
-    }
-
-    .green-tick {
-        path {
-            stroke: var(--G500);
-        }
-    }
-
-    .app-status-row {
-        display: grid;
-        grid-template-columns: 150px 200px 150px auto;
-        grid-column-gap: 16px;
-    }
-    .resource-list {
-        .app-status-row {
-            &:hover {
-                background-color: var(--bg-secondary);
-            }
-        }
-    }
-
-    .detail-tab_border {
-        border-radius: 0 0 4px 4px;
-        border-top: 0;
-    }
-}
-
-.deployment-approval-container + .deployment-status-breakdown-container {
-    padding-top: 0px;
-}
-
 .env-select {
     font-weight: 600 !important;
     color: var(--B500);
diff --git a/src/components/app/details/appDetails/appDetails.service.ts b/src/components/app/details/appDetails/appDetails.service.ts
index c2b637b8dc..8f51589b76 100644
--- a/src/components/app/details/appDetails/appDetails.service.ts
+++ b/src/components/app/details/appDetails/appDetails.service.ts
@@ -14,7 +14,13 @@
  * limitations under the License.
  */
 
-import { get, getUrlWithSearchParams, ResponseType, trash } from '@devtron-labs/devtron-fe-common-lib'
+import {
+    DeploymentStatusDetailsResponse,
+    get,
+    getUrlWithSearchParams,
+    ResponseType,
+    trash,
+} from '@devtron-labs/devtron-fe-common-lib'
 
 import { Routes } from '../../../../config'
 import { fetchWithFullRoute } from '../../../../services/fetchWithFullRoute'
@@ -24,7 +30,6 @@ import {
     DataSourceDetailsDTO,
     DataSourceDetailsQueryParams,
     DataSourceDetailsType,
-    DeploymentStatusDetailsResponse,
     ModuleConfigResponse,
 } from './appDetails.type'
 
@@ -79,7 +84,6 @@ export function deleteArgoCDAppWithNonCascade(
 export function getDeploymentStatusDetail(
     appId: string,
     envId: string,
-    showTimeline: boolean,
     triggerId?: string,
     isHelmApps?: boolean,
     installedAppVersionHistoryId?: number,
@@ -91,7 +95,7 @@ export function getDeploymentStatusDetail(
         appendUrl = Routes.DEPLOYMENT_STATUS
     }
     return get(
-        `${appendUrl}/${appId}/${envId}${`?showTimeline=${showTimeline}`}${triggerId ? `&wfrId=${triggerId}` : ``}${installedAppVersionHistoryId ? `&installedAppVersionHistoryId=${installedAppVersionHistoryId}` : ''}`,
+        `${appendUrl}/${appId}/${envId}?showTimeline=false${triggerId ? `&wfrId=${triggerId}` : ``}${installedAppVersionHistoryId ? `&installedAppVersionHistoryId=${installedAppVersionHistoryId}` : ''}`,
     )
 }
 
diff --git a/src/components/app/details/appDetails/appDetails.type.ts b/src/components/app/details/appDetails/appDetails.type.ts
index b50823465d..21cf77fccf 100644
--- a/src/components/app/details/appDetails/appDetails.type.ts
+++ b/src/components/app/details/appDetails/appDetails.type.ts
@@ -17,6 +17,7 @@
 import {
     ACTION_STATE,
     AppEnvironment,
+    DeploymentStatusDetailsBreakdownDataType,
     EnvAppsMetaDTO,
     OptionType,
     ResponseType,
@@ -64,79 +65,6 @@ export interface AppDetailsPathParams {
     envId?: string
 }
 
-export interface SyncStageResourceDetail {
-    id: number
-    cdWorkflowRunnerId: number
-    resourceGroup: string
-    resourceKind: string
-    resourceName: string
-    resourcePhase: string
-    resourceStatus: string
-    statusMessage: string
-}
-
-export interface DeploymentStatusDetailsTimelineType {
-    id: number
-    cdWorkflowRunnerId: number
-    status: string
-    statusDetail: string
-    statusTime: string
-    resourceDetails?: SyncStageResourceDetail[]
-}
-
-export interface DeploymentStatusDetailsType {
-    deploymentFinishedOn: string
-    deploymentStartedOn: string
-    triggeredBy: string
-    statusFetchCount: number
-    statusLastFetchedAt: string
-    timelines: DeploymentStatusDetailsTimelineType[]
-    wfrStatus?: string
-}
-
-export interface DeploymentStatusDetailsResponse extends ResponseType {
-    result?: DeploymentStatusDetailsType
-}
-
-interface DeploymentStatusDetailRow {
-    icon: string
-    displayText: string
-    displaySubText: string
-    time: string
-    resourceDetails?: any
-    isCollapsed?: boolean
-    kubeList?: { icon: any; message: string }[]
-    timelineStatus?: string
-}
-export interface DeploymentStatusDetailsBreakdownDataType {
-    deploymentStatus: string
-    deploymentStatusText: string
-    deploymentTriggerTime: string
-    deploymentEndTime: string
-    deploymentError: string
-    triggeredBy: string
-    nonDeploymentError: string
-    deploymentStatusBreakdown: {
-        DEPLOYMENT_INITIATED: DeploymentStatusDetailRow
-        GIT_COMMIT?: DeploymentStatusDetailRow
-        ARGOCD_SYNC?: DeploymentStatusDetailRow
-        KUBECTL_APPLY?: DeploymentStatusDetailRow
-        APP_HEALTH?: DeploymentStatusDetailRow
-        HELM_PACKAGE_GENERATED?: DeploymentStatusDetailRow
-    }
-}
-
-export interface DeploymentStatusDetailModalType {
-    appName: string
-    environmentName: string
-    deploymentStatusDetailsBreakdownData: DeploymentStatusDetailsBreakdownDataType
-    isVirtualEnvironment: boolean
-    /**
-     * Loading state for the timeline data
-     */
-    isLoading: boolean
-}
-
 export interface ModuleConfigResponse extends ResponseType {
     result?: {
         enabled: boolean
@@ -243,7 +171,6 @@ export interface DeploymentStatusCardType {
     hideDetails?: boolean
     triggeredBy?: string
     isVirtualEnvironment?: boolean
-    refetchDeploymentStatus: (showTimeline?: boolean) => void
 }
 
 export interface IssuesCardType {
diff --git a/src/components/app/types.ts b/src/components/app/types.ts
index 857a56562f..7e69e05f7b 100644
--- a/src/components/app/types.ts
+++ b/src/components/app/types.ts
@@ -25,8 +25,9 @@ import {
     AppEnvironment,
     HelmReleaseStatus,
     BaseAppMetaData,
+    DeploymentStatusDetailsBreakdownDataType,
 } from '@devtron-labs/devtron-fe-common-lib'
-import { DeploymentStatusDetailsBreakdownDataType, DetailsType, ErrorItem, HibernationModalTypes } from './details/appDetails/appDetails.type'
+import { DetailsType, ErrorItem, HibernationModalTypes } from './details/appDetails/appDetails.type'
 import { GroupFilterType } from '../ApplicationGroup/AppGroup.types'
 import { APP_TYPE } from '@Config/constants'
 import { CreateAppFormStateType } from '@Pages/App/CreateAppModal/types'
@@ -515,7 +516,6 @@ export interface SourceInfoType extends Pick<DetailsType, 'isAppView'>, Partial<
     loadingResourceTree?: boolean
     isVirtualEnvironment?: boolean
     setRotateModal?: React.Dispatch<React.SetStateAction<boolean>>
-    refetchDeploymentStatus: (showTimeline?: boolean) => void
     toggleIssuesModal?: React.Dispatch<React.SetStateAction<boolean>>
     envId?: number | string
     ciArtifactId?: number
diff --git a/src/components/common/Banner/utils.tsx b/src/components/common/Banner/utils.tsx
index a637247bfb..a0eb3699cf 100644
--- a/src/components/common/Banner/utils.tsx
+++ b/src/components/common/Banner/utils.tsx
@@ -53,7 +53,7 @@ const getVariantWithIconMap = (iconName: IconsProps['name']): Partial<Record<Ban
 const getVariantWithIconColorMap = (
     licenseType?: InfoBlockVariantType,
 ): Record<BannerVariant, IconBaseColorType | null> => ({
-    [BannerVariant.OFFLINE]: null,
+    [BannerVariant.OFFLINE]: 'N0',
     [BannerVariant.ONLINE]: null,
     [BannerVariant.VERSION_UPDATE]: null,
     [BannerVariant.INCOMPATIBLE_MICROSERVICES]: 'N0',
diff --git a/src/components/v2/appDetails/AppDetails.component.tsx b/src/components/v2/appDetails/AppDetails.component.tsx
index bde6e8deb6..4d267cfa69 100644
--- a/src/components/v2/appDetails/AppDetails.component.tsx
+++ b/src/components/v2/appDetails/AppDetails.component.tsx
@@ -15,10 +15,14 @@
  */
 
 import { useEffect, useRef, useState } from 'react'
-import { useLocation, useParams } from 'react-router-dom'
+import { useHistory, useLocation, useParams } from 'react-router-dom'
 
 import {
+    AppStatusModal,
+    AppStatusModalTabType,
     DeploymentAppTypes,
+    DeploymentStatusDetailsBreakdownDataType,
+    DeploymentStatusDetailsType,
     noop,
     processDeploymentStatusDetailsData,
     Progressing,
@@ -26,13 +30,8 @@ import {
 
 import { ClusterMetaDataBar } from '@Components/common/ClusterMetaDataBar/ClusterMetaDataBar'
 
-import { DEFAULT_STATUS, DEFAULT_STATUS_TEXT, DEPLOYMENT_STATUS, DEPLOYMENT_STATUS_QUERY_PARAM } from '../../../config'
+import { DEFAULT_STATUS, DEPLOYMENT_STATUS, DEPLOYMENT_STATUS_QUERY_PARAM } from '../../../config'
 import { getDeploymentStatusDetail } from '../../app/details/appDetails/appDetails.service'
-import {
-    DeploymentStatusDetailsBreakdownDataType,
-    DeploymentStatusDetailsType,
-} from '../../app/details/appDetails/appDetails.type'
-import DeploymentStatusDetailModal from '../../app/details/appDetails/DeploymentStatusDetailModal'
 import { importComponentFromFELibrary } from '../../common'
 import { AppLevelExternalLinks } from '../../externalLinks/ExternalLinks.component'
 import { useSharedState } from '../utils/useSharedState'
@@ -53,6 +52,7 @@ const processVirtualEnvironmentDeploymentData = importComponentFromFELibrary(
     null,
     'function',
 )
+const ExplainWithAIButton = importComponentFromFELibrary('ExplainWithAIButton', null, 'function')
 
 const AppDetailsComponent = ({
     externalLinks = [],
@@ -70,11 +70,7 @@ const AppDetailsComponent = ({
     const [appDetails] = useSharedState(IndexStore.getAppDetails(), IndexStore.getAppDetailsObservable())
     const isVirtualEnv = useRef(appDetails?.isVirtualEnvironment)
     const location = useLocation()
-    const deploymentModalShownRef = useRef(null)
-    deploymentModalShownRef.current = location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM)
-    // State to track the loading state for the timeline data when the detailed status modal opens
-    const [isInitialTimelineDataLoading, setIsInitialTimelineDataLoading] = useState(true)
-    const shouldFetchTimelineRef = useRef(false)
+    const history = useHistory()
     const isGitOps = appDetails?.deploymentAppType === DeploymentAppTypes.GITOPS
     const isManifestDownload = appDetails?.deploymentAppType === DeploymentAppTypes.MANIFEST_DOWNLOAD
 
@@ -84,7 +80,6 @@ const AppDetailsComponent = ({
                 ? processVirtualEnvironmentDeploymentData()
                 : processDeploymentStatusDetailsData()),
             deploymentStatus: DEFAULT_STATUS,
-            deploymentStatusText: DEFAULT_STATUS_TEXT,
         })
 
     useEffect(() => {
@@ -92,15 +87,6 @@ const AppDetailsComponent = ({
             getSaveTelemetry(params.appId).catch(noop)
         }
     }, [])
-    useEffect(() => {
-        const isModalOpen = location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM)
-        // Reset the loading state when the modal is closed
-        if (shouldFetchTimelineRef.current && !isModalOpen) {
-            setIsInitialTimelineDataLoading(true)
-        }
-        // The timeline should be fetched by default if the modal is open
-        shouldFetchTimelineRef.current = isModalOpen
-    }, [location.search])
 
     const clearDeploymentStatusTimer = (): void => {
         if (deploymentStatusTimer) {
@@ -108,17 +94,13 @@ const AppDetailsComponent = ({
         }
     }
 
-    const getDeploymentDetailStepsData = (showTimeline?: boolean): void => {
-        const shouldFetchTimeline = showTimeline ?? shouldFetchTimelineRef.current
-
+    const getDeploymentDetailStepsData = (): void => {
+        // TODO: Ask why are we not sending wfrId in the request in case of virtual environment?
         // Deployments status details for Helm apps
-        getDeploymentStatusDetail(params.appId, params.envId, shouldFetchTimeline, '', true)
+        getDeploymentStatusDetail(params.appId, params.envId, '', true)
             .then((deploymentStatusDetailRes) => {
                 // eslint-disable-next-line @typescript-eslint/no-use-before-define
                 processDeploymentStatusData(deploymentStatusDetailRes.result)
-                if (shouldFetchTimeline) {
-                    setIsInitialTimelineDataLoading(false)
-                }
             })
             .catch(noop)
     }
@@ -154,6 +136,18 @@ const AppDetailsComponent = ({
         setDeploymentStatusDetailsBreakdownData(processedDeploymentStatusDetailsData)
     }
 
+    const handleCloseDeploymentStatusModal = () => {
+        history.replace({
+            search: '',
+        })
+    }
+
+    const updateDeploymentStatusDetailsBreakdownData = (
+        updatedTimelineData: typeof deploymentStatusDetailsBreakdownData,
+    ) => {
+        setDeploymentStatusDetailsBreakdownData(updatedTimelineData)
+    }
+
     const renderHelmAppDetails = (): JSX.Element => {
         if (isVirtualEnv.current && VirtualAppDetailsEmptyState) {
             return <VirtualAppDetailsEmptyState environmentName={appDetails.environmentName} />
@@ -210,7 +204,7 @@ const AppDetailsComponent = ({
                                 loadingResourceTree={loadingResourceTree || !appDetails?.appType}
                                 deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData}
                                 isVirtualEnvironment={isVirtualEnv.current}
-                                refetchDeploymentStatus={getDeploymentDetailStepsData}
+                                updateDeploymentStatusDetailsBreakdownData={updateDeploymentStatusDetailsBreakdownData}
                             />
                         )}
                     </div>
@@ -230,13 +224,18 @@ const AppDetailsComponent = ({
                         renderHelmAppDetails()
                     )}
 
-                    {location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM) && (
-                        <DeploymentStatusDetailModal
-                            appName={appDetails.appName}
-                            environmentName={appDetails.environmentName}
-                            deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData}
-                            isVirtualEnvironment={isVirtualEnv.current}
-                            isLoading={isInitialTimelineDataLoading}
+                    {!loadingDetails && location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM) && (
+                        <AppStatusModal
+                            type="other-apps"
+                            titleSegments={[appDetails?.appName, appDetails?.environmentName || appDetails?.namespace]}
+                            handleClose={handleCloseDeploymentStatusModal}
+                            appDetails={appDetails}
+                            isConfigDriftEnabled={false}
+                            configDriftModal={null}
+                            initialTab={AppStatusModalTabType.DEPLOYMENT_STATUS}
+                            processVirtualEnvironmentDeploymentData={processVirtualEnvironmentDeploymentData}
+                            updateDeploymentStatusDetailsBreakdownData={updateDeploymentStatusDetailsBreakdownData}
+                            debugWithAIButton={ExplainWithAIButton}
                         />
                     )}
                 </div>
diff --git a/src/components/v2/appDetails/k8Resource/K8Resource.component.tsx b/src/components/v2/appDetails/k8Resource/K8Resource.component.tsx
index af9a0ad4db..53851f2944 100644
--- a/src/components/v2/appDetails/k8Resource/K8Resource.component.tsx
+++ b/src/components/v2/appDetails/k8Resource/K8Resource.component.tsx
@@ -137,7 +137,7 @@ export const K8ResourceComponent = ({
                         className="dc__border-right--n1 dc__overflow-hidden flexbox-col dc__no-shrink w-250"
                         data-testid="k8-resources-node-tree"
                     >
-                        <div className="pt-16 pb-15 px-16 border__secondary--bottom">
+                        <div className="pt-14 pb-13 px-16 border__secondary--bottom">
                             <StatusFilterButtonComponent
                                 nodes={nodes}
                                 selectedTab={currentFilter}
diff --git a/src/components/v2/appDetails/sourceInfo/environment.type.ts b/src/components/v2/appDetails/sourceInfo/environment.type.ts
index 06512165c5..f7d5a2d8fa 100644
--- a/src/components/v2/appDetails/sourceInfo/environment.type.ts
+++ b/src/components/v2/appDetails/sourceInfo/environment.type.ts
@@ -16,9 +16,11 @@
 
 import React from 'react'
 
-import { AppEnvironment as BaseAppEnvironmentType } from '@devtron-labs/devtron-fe-common-lib'
+import {
+    AppEnvironment as BaseAppEnvironmentType,
+    DeploymentStatusDetailsBreakdownDataType,
+} from '@devtron-labs/devtron-fe-common-lib'
 
-import { DeploymentStatusDetailsBreakdownDataType } from '../../../app/details/appDetails/appDetails.type'
 import { HelmReleaseStatus } from '../../../external-apps/ExternalAppService'
 import { AppDetails } from '../appDetails.type'
 
@@ -27,7 +29,7 @@ export interface EnvironmentStatusComponentType {
     loadingResourceTree: boolean
     deploymentStatusDetailsBreakdownData: DeploymentStatusDetailsBreakdownDataType
     isVirtualEnvironment?: boolean
-    refetchDeploymentStatus: (showTimeline?: boolean) => void
+    updateDeploymentStatusDetailsBreakdownData: (data: DeploymentStatusDetailsBreakdownDataType) => void
 }
 export interface AppEnvironment extends BaseAppEnvironmentType {
     isSelected?: boolean
diff --git a/src/components/v2/appDetails/sourceInfo/environmentStatus/EnvironmentStatus.component.tsx b/src/components/v2/appDetails/sourceInfo/environmentStatus/EnvironmentStatus.component.tsx
index fdb88172bf..32f65d6c02 100644
--- a/src/components/v2/appDetails/sourceInfo/environmentStatus/EnvironmentStatus.component.tsx
+++ b/src/components/v2/appDetails/sourceInfo/environmentStatus/EnvironmentStatus.component.tsx
@@ -26,6 +26,7 @@ import { getInstalledChartNotesDetail } from '../../appDetails.api'
 import { importComponentFromFELibrary } from '../../../../common'
 import {
     AppStatusModal,
+    AppStatusModalTabType,
     DeploymentAppTypes,
     useAsync,
 } from '@devtron-labs/devtron-fe-common-lib'
@@ -44,13 +45,18 @@ import SecurityVulnerabilityCard from '../../../../app/details/appDetails/Securi
 const AppDetailsDownloadCard = importComponentFromFELibrary('AppDetailsDownloadCard')
 const ExplainWithAIButton = importComponentFromFELibrary('ExplainWithAIButton', null, 'function')
 const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', false, 'function')
+const processVirtualEnvironmentDeploymentData = importComponentFromFELibrary(
+    'processVirtualEnvironmentDeploymentData',
+    null,
+    'function',
+)
 
 const EnvironmentStatusComponent = ({
     loadingDetails,
     loadingResourceTree,
     deploymentStatusDetailsBreakdownData,
     isVirtualEnvironment,
-    refetchDeploymentStatus,
+    updateDeploymentStatusDetailsBreakdownData,
 }: EnvironmentStatusComponentType) => {
     const [appDetails] = useSharedState(IndexStore.getAppDetails(), IndexStore.getAppDetailsObservable())
     const [showAppStatusDetail, setShowAppStatusDetail] = useState(false)
@@ -151,7 +157,6 @@ const EnvironmentStatusComponent = ({
                     deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData}
                     cardLoading={cardLoading}
                     hideDetails={false}
-                    refetchDeploymentStatus={refetchDeploymentStatus}
                     isVirtualEnvironment={isVirtualEnvironment}
                 />
             )
@@ -199,15 +204,18 @@ const EnvironmentStatusComponent = ({
             )}
             {showAppStatusDetail && (
                 <AppStatusModal
+                    type="other-apps"
                     titleSegments={[
                         appDetails?.appName,
                         appDetails?.environmentName || appDetails?.namespace,
                     ]}
                     handleClose={handleCloseAppStatusModal}
-                    type="other-apps"
                     appDetails={appDetails}
                     isConfigDriftEnabled={false}
                     configDriftModal={null}
+                    initialTab={AppStatusModalTabType.APP_STATUS}
+                    updateDeploymentStatusDetailsBreakdownData={updateDeploymentStatusDetailsBreakdownData}
+                    processVirtualEnvironmentDeploymentData={processVirtualEnvironmentDeploymentData}
                     debugWithAIButton={ExplainWithAIButton}
                 />
             )}
diff --git a/src/components/v2/devtronStackManager/DevtronStackManager.tsx b/src/components/v2/devtronStackManager/DevtronStackManager.tsx
index 83455f9e50..eaad6a54da 100644
--- a/src/components/v2/devtronStackManager/DevtronStackManager.tsx
+++ b/src/components/v2/devtronStackManager/DevtronStackManager.tsx
@@ -23,6 +23,8 @@ import {
     DevtronProgressing,
     useMainContext,
     AppStatusModal,
+    AppStatusModalTabType,
+    noop,
 } from '@devtron-labs/devtron-fe-common-lib'
 import { ModuleNameMap, SERVER_MODE, URLS } from '../../../config'
 import { ErrorBoundary, importComponentFromFELibrary, useInterval } from '../../common'
@@ -591,6 +593,9 @@ export default function DevtronStackManager({
                                         appDetails={appDetails}
                                         isConfigDriftEnabled={false}
                                         configDriftModal={null}
+                                        initialTab={AppStatusModalTabType.APP_STATUS}
+                                        processVirtualEnvironmentDeploymentData={noop}
+                                        updateDeploymentStatusDetailsBreakdownData={noop}
                                         debugWithAIButton={ExplainWithAIButton}
                                     />
                                 )}
diff --git a/src/config/constants.ts b/src/config/constants.ts
index 019a8bbf48..cab4baa01a 100644
--- a/src/config/constants.ts
+++ b/src/config/constants.ts
@@ -24,7 +24,6 @@ import {
     RegistryCredentialsType,
 } from '@devtron-labs/devtron-fe-common-lib'
 export const DEFAULT_STATUS = 'checking'
-export const DEFAULT_STATUS_TEXT = 'Checking Status'
 export const DEFAULTK8SVERSION = 'v1.16.0'
 export const TOKEN_COOKIE_NAME = 'argocd.token'
 export const DEVTRON_DEFAULT_RELEASE_NAME = 'devtron'
@@ -696,32 +695,6 @@ export const CHART_REPO_LABEL = [
     { value: 'PRIVATE', label: 'Private repository' },
 ]
 
-/**
- * @deprecated - use from fe-common
- */
-export enum TIMELINE_STATUS {
-    DEPLOYMENT_INITIATED = 'DEPLOYMENT_INITIATED',
-    GIT_COMMIT = 'GIT_COMMIT',
-    GIT_COMMIT_FAILED = 'GIT_COMMIT_FAILED',
-    ARGOCD_SYNC = 'ARGOCD_SYNC',
-    ARGOCD_SYNC_FAILED = 'ARGOCD_SYNC_FAILED',
-    KUBECTL_APPLY = 'KUBECTL_APPLY',
-    KUBECTL_APPLY_STARTED = 'KUBECTL_APPLY_STARTED',
-    KUBECTL_APPLY_SYNCED = 'KUBECTL_APPLY_SYNCED',
-    HEALTHY = 'HEALTHY',
-    APP_HEALTH = 'APP_HEALTH',
-    DEPLOYMENT_FAILED = 'FAILED',
-    FETCH_TIMED_OUT = 'TIMED_OUT',
-    UNABLE_TO_FETCH_STATUS = 'UNABLE_TO_FETCH_STATUS',
-    DEGRADED = 'DEGRADED',
-    DEPLOYMENT_SUPERSEDED = 'DEPLOYMENT_SUPERSEDED',
-    ABORTED = 'ABORTED',
-    INPROGRESS = 'INPROGRESS',
-    HELM_PACKAGE_GENERATED = 'HELM_PACKAGE_GENERATED',
-    HELM_MANIFEST_PUSHED_TO_HELM_REPO = 'HELM_MANIFEST_PUSHED_TO_HELM_REPO',
-    HELM_MANIFEST_PUSHED_TO_HELM_REPO_FAILED = 'HELM_MANIFEST_PUSHED_TO_HELM_REPO_FAILED',
-}
-
 /**
  * @deprecated - use from fe-common
  */
diff --git a/src/config/routes.ts b/src/config/routes.ts
index 6c978bbfa5..ed7b66c40e 100644
--- a/src/config/routes.ts
+++ b/src/config/routes.ts
@@ -164,11 +164,3 @@ export const getAppComposeURL = (appId: string, appStage: APP_COMPOSE_STAGE | nu
     }
     return `${_url}/${URLS.APP_GIT_CONFIG}`
 }
-
-export function getAppDetailsURL(appId: number | string, envId?: number | string): string {
-    let url = `${URLS.APP}/${appId}/${URLS.APP_DETAILS}`
-    if (envId) {
-        url = `${url}/${envId}`
-    }
-    return url
-}
diff --git a/src/css/base.scss b/src/css/base.scss
index a3a711c6b8..c9974f12de 100644
--- a/src/css/base.scss
+++ b/src/css/base.scss
@@ -800,6 +800,7 @@ button.anchor {
     &.f-not__ready,
     &.f-evicted,
     &.f-disconnect,
+    &.f-syncfail,
     &.f-superseded {
         color: var(--R500);
     }
diff --git a/yarn.lock b/yarn.lock
index 7c2db9d203..1faa20ee0c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -161,9 +161,9 @@
     "@babel/types" "^7.24.7"
 
 "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.25.9"
-  resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz"
-  integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==
+  version "7.27.1"
+  resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"
+  integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
 
 "@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0":
   version "7.25.0"
@@ -937,11 +937,9 @@
     regenerator-runtime "^0.14.0"
 
 "@babel/runtime@^7.18.6", "@babel/runtime@^7.2.0":
-  version "7.27.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762"
-  integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==
-  dependencies:
-    regenerator-runtime "^0.14.0"
+  version "7.27.1"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.1.tgz#9fce313d12c9a77507f264de74626e87fd0dc541"
+  integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==
 
 "@babel/template@^7.24.7", "@babel/template@^7.25.0":
   version "7.25.0"
@@ -1065,9 +1063,9 @@
     crelt "^1.0.5"
 
 "@codemirror/merge@^6.10.0":
-  version "6.10.0"
-  resolved "https://registry.yarnpkg.com/@codemirror/merge/-/merge-6.10.0.tgz#0a1be2a4561594f6adc1b1adcf6e7ac23d767b85"
-  integrity sha512-Omn0gU6MM5cKQGqgKoIhFjUqCNWH/nukCMLXzu/1jOdtiHsxAu3GdENBf1QYkoIC3FSgkF7X/ClOqYeUATQ4Sw==
+  version "6.10.1"
+  resolved "https://registry.yarnpkg.com/@codemirror/merge/-/merge-6.10.1.tgz#a277a24838507b3a18ea0dcb391b49644f1c814f"
+  integrity sha512-TgZD+LDa2EIeqTkptg42TAU6n3meq++rQC+e7FuCi1arEm8CRGVQw5Fygb7UIfDzFAt4QrE6SS3CPOz06D2ALg==
   dependencies:
     "@codemirror/language" "^6.0.0"
     "@codemirror/state" "^6.0.0"
@@ -1085,9 +1083,9 @@
     crelt "^1.0.5"
 
 "@codemirror/search@^6.0.0":
-  version "6.5.10"
-  resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.10.tgz#7367bfc88094d078b91c752bc74140fb565b55ee"
-  integrity sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==
+  version "6.5.11"
+  resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.11.tgz#a324ffee36e032b7f67aa31c4fb9f3e6f9f3ed63"
+  integrity sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==
   dependencies:
     "@codemirror/state" "^6.0.0"
     "@codemirror/view" "^6.0.0"
@@ -1111,9 +1109,9 @@
     "@lezer/highlight" "^1.0.0"
 
 "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
-  version "6.36.5"
-  resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.5.tgz#bb99b971322b9a3f8c7013f0ef6c4a511c0d750a"
-  integrity sha512-cd+FZEUlu3GQCYnguYm3EkhJ8KJVisqqUsCOKedBoAt/d9c76JUUap6U0UrpElln5k6VyrEOYliMuDAKIeDQLg==
+  version "6.36.8"
+  resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.8.tgz#d72e59d2b2d99bb5f177178f63e11cef6e605b94"
+  integrity sha512-yoRo4f+FdnD01fFt4XpfpMCcCAo9QvZOtbrXExn4SqzH32YC6LgzqxfLZw/r6Ge65xyY03mK/UfUqrVw1gFiFg==
   dependencies:
     "@codemirror/state" "^6.5.0"
     style-mod "^4.1.0"
@@ -1126,10 +1124,10 @@
   dependencies:
     "@jridgewell/trace-mapping" "0.3.9"
 
-"@devtron-labs/devtron-fe-common-lib@1.13.0-pre-5":
-  version "1.13.0-pre-5"
-  resolved "https://registry.yarnpkg.com/@devtron-labs/devtron-fe-common-lib/-/devtron-fe-common-lib-1.13.0-pre-5.tgz#b120e8a883e25abc15ef45dc541e3d9af8440759"
-  integrity sha512-g2h1fxObo9KZyRsZekpB7rF67zsPLK2pVzBdvN9LMoTeCOnmGTcwIXucqQROfAgNkLN5dNqcpR9+hMs4kgTzPw==
+"@devtron-labs/devtron-fe-common-lib@1.13.0-pre-6":
+  version "1.13.0-pre-6"
+  resolved "https://registry.yarnpkg.com/@devtron-labs/devtron-fe-common-lib/-/devtron-fe-common-lib-1.13.0-pre-6.tgz#eec6b658b6c656c860b4f6c55b10979f56b646fe"
+  integrity sha512-BOiT80SC8CzwueKe031FhdkbvrN/QyiZQRGP1XjsDwCsOxvEBcILICKKm5GeYfuIVsIbB8DaFiuLKXU5luJqCg==
   dependencies:
     "@codemirror/lang-json" "6.0.1"
     "@codemirror/lang-yaml" "6.1.2"
@@ -1165,9 +1163,9 @@
     tslib "2.7.0"
 
 "@emnapi/runtime@^1.2.0":
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.1.tgz#79e54e3cc7f1955b3080f6e1e0e111e06114e114"
-  integrity sha512-LMshMVP0ZhACNjQNYXiU1iZJ6QCcv0lUdPDPugqGvCGXt5xtRVBPdtA0qU12pEXZzpWAhWlZYptfdAFq10DOVQ==
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d"
+  integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==
   dependencies:
     tslib "^2.4.0"
 
@@ -1942,105 +1940,105 @@
     estree-walker "^2.0.2"
     picomatch "^4.0.2"
 
-"@rollup/rollup-android-arm-eabi@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3"
-  integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==
-
-"@rollup/rollup-android-arm64@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3"
-  integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==
-
-"@rollup/rollup-darwin-arm64@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz"
-  integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==
-
-"@rollup/rollup-darwin-x64@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504"
-  integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==
-
-"@rollup/rollup-freebsd-arm64@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936"
-  integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==
-
-"@rollup/rollup-freebsd-x64@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b"
-  integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==
-
-"@rollup/rollup-linux-arm-gnueabihf@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c"
-  integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==
-
-"@rollup/rollup-linux-arm-musleabihf@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7"
-  integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==
-
-"@rollup/rollup-linux-arm64-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c"
-  integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==
-
-"@rollup/rollup-linux-arm64-musl@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552"
-  integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==
-
-"@rollup/rollup-linux-loongarch64-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6"
-  integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==
-
-"@rollup/rollup-linux-powerpc64le-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83"
-  integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==
-
-"@rollup/rollup-linux-riscv64-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3"
-  integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==
-
-"@rollup/rollup-linux-riscv64-musl@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039"
-  integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==
-
-"@rollup/rollup-linux-s390x-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b"
-  integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==
-
-"@rollup/rollup-linux-x64-gnu@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0"
-  integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==
-
-"@rollup/rollup-linux-x64-musl@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282"
-  integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==
-
-"@rollup/rollup-win32-arm64-msvc@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b"
-  integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==
-
-"@rollup/rollup-win32-ia32-msvc@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921"
-  integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==
-
-"@rollup/rollup-win32-x64-msvc@4.40.0":
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76"
-  integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==
+"@rollup/rollup-android-arm-eabi@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz#c228d00a41f0dbd6fb8b7ea819bbfbf1c1157a10"
+  integrity sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==
+
+"@rollup/rollup-android-arm64@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz#e2b38d0c912169fd55d7e38d723aada208d37256"
+  integrity sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==
+
+"@rollup/rollup-darwin-arm64@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz"
+  integrity sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==
+
+"@rollup/rollup-darwin-x64@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz#818298d11c8109e1112590165142f14be24b396d"
+  integrity sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==
+
+"@rollup/rollup-freebsd-arm64@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz#91a28dc527d5bed7f9ecf0e054297b3012e19618"
+  integrity sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==
+
+"@rollup/rollup-freebsd-x64@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz#28acadefa76b5c7bede1576e065b51d335c62c62"
+  integrity sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz#819691464179cbcd9a9f9d3dc7617954840c6186"
+  integrity sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==
+
+"@rollup/rollup-linux-arm-musleabihf@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz#d149207039e4189e267e8724050388effc80d704"
+  integrity sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==
+
+"@rollup/rollup-linux-arm64-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz#fa72ebddb729c3c6d88973242f1a2153c83e86ec"
+  integrity sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==
+
+"@rollup/rollup-linux-arm64-musl@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz#2054216e34469ab8765588ebf343d531fc3c9228"
+  integrity sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz#818de242291841afbfc483a84f11e9c7a11959bc"
+  integrity sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz#0bb4cb8fc4a2c635f68c1208c924b2145eb647cb"
+  integrity sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==
+
+"@rollup/rollup-linux-riscv64-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz#4b3b8e541b7b13e447ae07774217d98c06f6926d"
+  integrity sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==
+
+"@rollup/rollup-linux-riscv64-musl@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz#e065405e67d8bd64a7d0126c931bd9f03910817f"
+  integrity sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==
+
+"@rollup/rollup-linux-s390x-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz#dda3265bbbfe16a5d0089168fd07f5ebb2a866fe"
+  integrity sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==
+
+"@rollup/rollup-linux-x64-gnu@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz#90993269b8b995b4067b7b9d72ff1c360ef90a17"
+  integrity sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==
+
+"@rollup/rollup-linux-x64-musl@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz#fdf5b09fd121eb8d977ebb0fda142c7c0167b8de"
+  integrity sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==
+
+"@rollup/rollup-win32-arm64-msvc@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz#6397e1e012db64dfecfed0774cb9fcf89503d716"
+  integrity sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==
+
+"@rollup/rollup-win32-ia32-msvc@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz#df0991464a52a35506103fe18d29913bf8798a0c"
+  integrity sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==
+
+"@rollup/rollup-win32-x64-msvc@4.40.2":
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz#8dae04d01a2cbd84d6297d99356674c6b993f0fc"
+  integrity sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==
 
 "@sagold/json-pointer@^5.1.1", "@sagold/json-pointer@^5.1.2":
   version "5.1.2"
@@ -7191,9 +7189,9 @@ prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2,
     react-is "^16.13.1"
 
 property-information@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.0.0.tgz#3508a6d6b0b8eb3ca6eb2c6623b164d2ed2ab112"
-  integrity sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d"
+  integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==
 
 proxy-from-env@^1.1.0:
   version "1.1.0"
@@ -7819,32 +7817,32 @@ rollup-pluginutils@^2.8.1:
     estree-walker "^0.6.1"
 
 rollup@^2.43.1, rollup@^4.20.0, rollup@^4.22.4:
-  version "4.40.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920"
-  integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==
+  version "4.40.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.2.tgz#778e88b7a197542682b3e318581f7697f55f0619"
+  integrity sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==
   dependencies:
     "@types/estree" "1.0.7"
   optionalDependencies:
-    "@rollup/rollup-android-arm-eabi" "4.40.0"
-    "@rollup/rollup-android-arm64" "4.40.0"
-    "@rollup/rollup-darwin-arm64" "4.40.0"
-    "@rollup/rollup-darwin-x64" "4.40.0"
-    "@rollup/rollup-freebsd-arm64" "4.40.0"
-    "@rollup/rollup-freebsd-x64" "4.40.0"
-    "@rollup/rollup-linux-arm-gnueabihf" "4.40.0"
-    "@rollup/rollup-linux-arm-musleabihf" "4.40.0"
-    "@rollup/rollup-linux-arm64-gnu" "4.40.0"
-    "@rollup/rollup-linux-arm64-musl" "4.40.0"
-    "@rollup/rollup-linux-loongarch64-gnu" "4.40.0"
-    "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0"
-    "@rollup/rollup-linux-riscv64-gnu" "4.40.0"
-    "@rollup/rollup-linux-riscv64-musl" "4.40.0"
-    "@rollup/rollup-linux-s390x-gnu" "4.40.0"
-    "@rollup/rollup-linux-x64-gnu" "4.40.0"
-    "@rollup/rollup-linux-x64-musl" "4.40.0"
-    "@rollup/rollup-win32-arm64-msvc" "4.40.0"
-    "@rollup/rollup-win32-ia32-msvc" "4.40.0"
-    "@rollup/rollup-win32-x64-msvc" "4.40.0"
+    "@rollup/rollup-android-arm-eabi" "4.40.2"
+    "@rollup/rollup-android-arm64" "4.40.2"
+    "@rollup/rollup-darwin-arm64" "4.40.2"
+    "@rollup/rollup-darwin-x64" "4.40.2"
+    "@rollup/rollup-freebsd-arm64" "4.40.2"
+    "@rollup/rollup-freebsd-x64" "4.40.2"
+    "@rollup/rollup-linux-arm-gnueabihf" "4.40.2"
+    "@rollup/rollup-linux-arm-musleabihf" "4.40.2"
+    "@rollup/rollup-linux-arm64-gnu" "4.40.2"
+    "@rollup/rollup-linux-arm64-musl" "4.40.2"
+    "@rollup/rollup-linux-loongarch64-gnu" "4.40.2"
+    "@rollup/rollup-linux-powerpc64le-gnu" "4.40.2"
+    "@rollup/rollup-linux-riscv64-gnu" "4.40.2"
+    "@rollup/rollup-linux-riscv64-musl" "4.40.2"
+    "@rollup/rollup-linux-s390x-gnu" "4.40.2"
+    "@rollup/rollup-linux-x64-gnu" "4.40.2"
+    "@rollup/rollup-linux-x64-musl" "4.40.2"
+    "@rollup/rollup-win32-arm64-msvc" "4.40.2"
+    "@rollup/rollup-win32-ia32-msvc" "4.40.2"
+    "@rollup/rollup-win32-x64-msvc" "4.40.2"
     fsevents "~2.3.2"
 
 run-parallel@^1.1.9:
@@ -7913,9 +7911,9 @@ semver@^7.3.7, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3:
   integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
 
 semver@^7.5.3:
-  version "7.7.1"
-  resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz"
-  integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
+  version "7.7.2"
+  resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
+  integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
 
 serialize-javascript@^6.0.1:
   version "6.0.2"
@@ -8542,7 +8540,7 @@ tsconfig-paths@^4.2.0:
 
 tslib@2.7.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.6.2:
   version "2.7.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
+  resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz"
   integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
 
 tslib@^1.8.1, tslib@^1.9.3:


Reviews:
user: login: AbhishekA1509
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-13T11:12:37Z
user: login: AbhishekA1509
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-13T11:45:39Z
user: login: RohitRaj011
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T09:11:53Z
user: login: AbhishekA1509
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-14T10:11:22Z
user: login: vivek-devtron
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T08:28:08Z

Review comments:
diff_hunk: @@ -84,41 +80,27 @@ const AppDetailsComponent = ({
                 ? processVirtualEnvironmentDeploymentData()
                 : processDeploymentStatusDetailsData()),
             deploymentStatus: DEFAULT_STATUS,
-            deploymentStatusText: DEFAULT_STATUS_TEXT,
         })
 
     useEffect(() => {
         if (appDetails?.appType === AppType.EXTERNAL_HELM_CHART && params.appId) {
             getSaveTelemetry(params.appId).catch(noop)
         }
     }, [])
-    useEffect(() => {
-        const isModalOpen = location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM)
-        // Reset the loading state when the modal is closed
-        if (shouldFetchTimelineRef.current && !isModalOpen) {
-            setIsInitialTimelineDataLoading(true)
-        }
-        // The timeline should be fetched by default if the modal is open
-        shouldFetchTimelineRef.current = isModalOpen
-    }, [location.search])
 
     const clearDeploymentStatusTimer = (): void => {
         if (deploymentStatusTimer) {
             clearTimeout(deploymentStatusTimer)
         }
     }
 
-    const getDeploymentDetailStepsData = (showTimeline?: boolean): void => {
-        const shouldFetchTimeline = showTimeline ?? shouldFetchTimelineRef.current
-
+    const getDeploymentDetailStepsData = (): void => {
+        // TODO: Ask why are we not sending wfrId in the request in case of virtual environment?
path: src/components/v2/appDetails/AppDetails.component.tsx
user: login: AbhishekA1509
body: @vivek-devtron
created_at: 2025-05-13T11:12:35Z
author_association: MEMBER
diff_hunk: @@ -741,26 +712,22 @@ const Details: React.FC<DetailsType> = ({
             ) : (
                 renderAppDetails()
             )}
-            {detailedStatus && (
+            {(showAppStatusModal || (appDetails && location.search.includes(DEPLOYMENT_STATUS_QUERY_PARAM))) && (
                 <AppStatusModal
                     titleSegments={[appDetailsFromIndexStore.appName, appDetailsFromIndexStore.environmentName]}
path: src/components/app/details/appDetails/AppDetails.tsx
user: login: AbhishekA1509
body: Should we add appDetails check here and in helm?
created_at: 2025-05-13T11:45:38Z
author_association: MEMBER
diff_hunk: @@ -27,7 +29,7 @@ export interface EnvironmentStatusComponentType {
     loadingResourceTree: boolean
     deploymentStatusDetailsBreakdownData: DeploymentStatusDetailsBreakdownDataType
     isVirtualEnvironment?: boolean
-    refetchDeploymentStatus: (showTimeline?: boolean) => void
+    handleUpdateDeploymentStatusDetailsBreakdownData: (data: DeploymentStatusDetailsBreakdownDataType) => void
path: src/components/v2/appDetails/sourceInfo/environment.type.ts
user: login: RohitRaj011
body: 
```suggestion
    updateDeploymentStatusDetailsBreakdownData: (data: DeploymentStatusDetailsBreakdownDataType) => void
```
created_at: 2025-05-14T09:06:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -91,7 +95,7 @@ export function getDeploymentStatusDetail(
         appendUrl = Routes.DEPLOYMENT_STATUS
     }
     return get(
-        `${appendUrl}/${appId}/${envId}${`?showTimeline=${showTimeline}`}${triggerId ? `&wfrId=${triggerId}` : ``}${installedAppVersionHistoryId ? `&installedAppVersionHistoryId=${installedAppVersionHistoryId}` : ''}`,
+        `${appendUrl}/${appId}/${envId}${`?showTimeline=${false}`}${triggerId ? `&wfrId=${triggerId}` : ``}${installedAppVersionHistoryId ? `&installedAppVersionHistoryId=${installedAppVersionHistoryId}` : ''}`,
path: src/components/app/details/appDetails/appDetails.service.ts
user: login: RohitRaj011
body: 
```suggestion
        `${appendUrl}/${appId}/${envId}${`?showTimeline=false`}${triggerId ? `&wfrId=${triggerId}` : ``}${installedAppVersionHistoryId ? `&installedAppVersionHistoryId=${installedAppVersionHistoryId}` : ''}`,
```
created_at: 2025-05-14T09:09:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -308,30 +292,14 @@ const Details: React.FC<DetailsType> = ({
         ],
     )
 
-    // This is called only when timeline modal is open
-    const getDeploymentDetailStepsData = useCallback(
-        (showTimeline?: boolean): void => {
-            const shouldFetchTimeline = showTimeline ?? shouldFetchTimelineRef.current
-
-            // Deployments status details for Devtron apps
-            getDeploymentStatusDetail(params.appId, params.envId, shouldFetchTimeline)
-                .then((deploymentStatusDetailRes) => {
-                    processDeploymentStatusData(deploymentStatusDetailRes.result)
-                    // Update the loading status if the modal is open
-                    if (shouldFetchTimeline) {
-                        setIsInitialTimelineDataLoading(false)
-                    }
-                })
-                .catch(noop)
-        },
-        [
-            params.appId,
-            params.envId,
-            shouldFetchTimelineRef.current,
-            getDeploymentStatusDetail,
-            processDeploymentStatusData,
-        ],
-    )
+    const getDeploymentDetailStepsData = useCallback((): void => {
path: src/components/app/details/appDetails/AppDetails.tsx
user: login: RohitRaj011
body: is there need for useCallback?
created_at: 2025-05-14T09:10:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -308,30 +292,14 @@ const Details: React.FC<DetailsType> = ({
         ],
     )
 
-    // This is called only when timeline modal is open
-    const getDeploymentDetailStepsData = useCallback(
-        (showTimeline?: boolean): void => {
-            const shouldFetchTimeline = showTimeline ?? shouldFetchTimelineRef.current
-
-            // Deployments status details for Devtron apps
-            getDeploymentStatusDetail(params.appId, params.envId, shouldFetchTimeline)
-                .then((deploymentStatusDetailRes) => {
-                    processDeploymentStatusData(deploymentStatusDetailRes.result)
-                    // Update the loading status if the modal is open
-                    if (shouldFetchTimeline) {
-                        setIsInitialTimelineDataLoading(false)
-                    }
-                })
-                .catch(noop)
-        },
-        [
-            params.appId,
-            params.envId,
-            shouldFetchTimelineRef.current,
-            getDeploymentStatusDetail,
-            processDeploymentStatusData,
-        ],
-    )
+    const getDeploymentDetailStepsData = useCallback((): void => {
path: src/components/app/details/appDetails/AppDetails.tsx
user: login: AbhishekA1509
body: Not sure its legacy, and there are multiple memo with stale dependencies causing issues in multiple places especially in the resource filter flow, need to fix this as whole
created_at: 2025-05-14T10:11:22Z
author_association: MEMBER

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-05-19T08:27:23Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=devtron-labs_dashboard&pullRequest=2703) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [8 New issues](https://sonarcloud.io/project/issues?id=devtron-labs_dashboard&pullRequest=2703&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=devtron-labs_dashboard&pullRequest=2703&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_dashboard&pullRequest=2703&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=devtron-labs_dashboard&pullRequest=2703&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=devtron-labs_dashboard&pullRequest=2703&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=devtron-labs_dashboard&pullRequest=2703)


author_association: NONE