diff --git a/package.json b/package.json index e2d6a21643..249362b5a8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "/dashboard", "dependencies": { - "@devtron-labs/devtron-fe-common-lib": "1.1.5", + "@devtron-labs/devtron-fe-common-lib": "1.1.6", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rjsf/core": "^5.13.3", "@rjsf/utils": "^5.13.3", diff --git a/src/App.tsx b/src/App.tsx index ace35a25b0..5e744fd021 100755 --- a/src/App.tsx +++ b/src/App.tsx @@ -337,6 +337,7 @@ export default function App() {
+
{import.meta.env.VITE_NODE_ENV === 'production' && window._env_ && window._env_.HOTJAR_ENABLED && } diff --git a/src/components/app/details/appDetails/AppDetails.tsx b/src/components/app/details/appDetails/AppDetails.tsx index 0daca73e57..8b774a40ff 100644 --- a/src/components/app/details/appDetails/AppDetails.tsx +++ b/src/components/app/details/appDetails/AppDetails.tsx @@ -18,7 +18,6 @@ import React, { useEffect, useState, useMemo, useRef, useCallback } from 'react' import { showError, Progressing, - ConfirmationDialog, noop, stopPropagation, multiSelectStyles, @@ -35,6 +34,8 @@ import { ToastVariantType, ToastManager, SelectPicker, + ConfirmationModal, + ConfirmationModalVariantType, } from '@devtron-labs/devtron-fe-common-lib' import { Link, useParams, useHistory, useRouteMatch, generatePath, Route, useLocation } from 'react-router-dom' import Tippy from '@tippyjs/react' @@ -56,16 +57,16 @@ import { NavigationArrow, useAppContext, FragmentHOC } from '../../../common' import { groupHeaderStyle, Option } from '../../../v2/common/ReactSelect.utils' import { getAppConfigStatus, getAppOtherEnvironmentMin, stopStartApp } from '../../../../services/service' // @ts-check -import AppNotDeployedIcon from '../../../../assets/img/app-not-deployed.png' -import AppNotConfiguredIcon from '../../../../assets/img/app-not-configured.png' -import restoreIcon from '../../../../assets/icons/ic-restore.svg' -import warningIcon from '../../../../assets/icons/ic-warning.svg' -import { ReactComponent as PlayButton } from '../../../../assets/icons/ic-play.svg' -import { ReactComponent as Connect } from '../../../../assets/icons/ic-connected.svg' -import { ReactComponent as Disconnect } from '../../../../assets/icons/ic-disconnected.svg' -import { ReactComponent as Abort } from '../../../../assets/icons/ic-abort.svg' -import { ReactComponent as StopButton } from '../../../../assets/icons/ic-stop.svg' -import { ReactComponent as ForwardArrow } from '../../../../assets/icons/ic-arrow-forward.svg' +import AppNotDeployedIcon from '@Images/app-not-deployed.png' +import AppNotConfiguredIcon from '@Images/app-not-configured.png' +import { ReactComponent as ICHibernate } from '@Icons/ic-medium-hibernate.svg' +import { ReactComponent as ICUnhibernate } from '@Icons/ic-medium-unhibernate.svg' +import { ReactComponent as PlayButton } from '@Icons/ic-play.svg' +import { ReactComponent as Connect } from '@Icons/ic-connected.svg' +import { ReactComponent as Disconnect } from '@Icons/ic-disconnected.svg' +import { ReactComponent as Abort } from '@Icons/ic-abort.svg' +import { ReactComponent as StopButton } from '@Icons/ic-stop.svg' +import { ReactComponent as ForwardArrow } from '@Icons/ic-arrow-forward.svg' import { SourceInfo } from './SourceInfo' import { Application, Nodes, AggregatedNodes, NodeDetailTabs } from '../../types' @@ -657,12 +658,12 @@ export const Details: React.FC = ({ } const handleHibernateConfirmationModalClose = (e) => { - e.stopPropagation() + e?.stopPropagation() setHibernateConfirmationModal('') } const renderHibernateModal = (): JSX.Element => { - if (isDeploymentBlocked && DeploymentWindowConfirmationDialog) { + if (hibernateConfirmationModal && isDeploymentBlocked && DeploymentWindowConfirmationDialog) { return ( = ({ ) } return ( - - - - Pods for this application will be - - scaled - {hibernateConfirmationModal === 'hibernate' - ? ' down to 0 ' - : ' up to its original count '} - on {appDetails.environmentName} - - environment. -

- } - > -

Are you sure you want to continue?

-
- - - - -
+ + Pods for this application will be + + scaled + {hibernateConfirmationModal === 'hibernate' ? ' down to 0 ' : ' up to its original count '} + on {appDetails.environmentName} + + environment. +

+ } + buttonConfig={{ + secondaryButtonConfig: { + disabled: hibernating, + onClick: handleHibernateConfirmationModalClose, + text: 'Cancel', + }, + primaryButtonConfig: { + isLoading: hibernating, + onClick: handleHibernate, + text: getHibernateText(), + }, + }} + showConfirmationModal={!!hibernateConfirmationModal} + handleClose={handleHibernateConfirmationModalClose} + > + Are you sure you want to continue? +
) } @@ -821,7 +814,7 @@ export const Details: React.FC = ({ renderCIListHeader={renderCIListHeader} /> )} - {hibernateConfirmationModal && renderHibernateModal()} + {appDetails && renderHibernateModal()} {rotateModal && renderRestartWorkload()} { = ({ isVirtualEnvironment={isVirtualEnvRef.current} /> } - {isConfigDriftEnabled && ConfigDriftModalRoute && !isVirtualEnvRef.current && } + {isConfigDriftEnabled && ConfigDriftModalRoute && !isVirtualEnvRef.current && ( + + )} ) } diff --git a/src/components/cdPipeline/CDPipeline.tsx b/src/components/cdPipeline/CDPipeline.tsx index 9621564097..806919c594 100644 --- a/src/components/cdPipeline/CDPipeline.tsx +++ b/src/components/cdPipeline/CDPipeline.tsx @@ -1411,9 +1411,9 @@ export default function CDPipeline({ reload={reloadAppConfig} /> )} - - {cdPipelineId && showDeleteModal && ( + {cdPipelineId && ( handleDeleteCDNodePipeline(deleteCD, deploymentAppType as DeploymentAppTypes)} - closeDelete={hideDeleteModal} - apiCallInProgress={isLoading} - showDeleteConfirmation - deleteConfirmationText={deleteTitleName} + subtitle={`Are you sure you want to delete this CD Pipeline from '${appName}' application?`} + buttonConfig={{ + secondaryButtonConfig: { + text: 'Cancel', + onClick: hideDeleteModal, + disabled: isLoading, + }, + primaryButtonConfig: { + text: 'Delete', + onClick: () => handleDeleteCDNodePipeline(deleteCD, deploymentAppType as DeploymentAppTypes), + isLoading, + }, + }} + customInputConfig={{ + identifier: 'delete-cd-node-input', + confirmationKeyword: deleteTitleName, + }} + showConfirmationModal={showDeleteDialog} + handleClose={hideDeleteModal} /> ) } diff --git a/src/components/cdPipeline/types.ts b/src/components/cdPipeline/types.ts index 77b46e8df7..8c23c4aaa6 100644 --- a/src/components/cdPipeline/types.ts +++ b/src/components/cdPipeline/types.ts @@ -46,6 +46,7 @@ export interface ForceDeleteMessageType { } export interface DeleteCDNodeProps { + showDeleteDialog: boolean deleteDialog: DeleteDialogType setDeleteDialog: React.Dispatch> | ((deleteDialog: DeleteDialogType) => void) clusterName: string diff --git a/src/components/common/navigation/NavigationRoutes.tsx b/src/components/common/navigation/NavigationRoutes.tsx index acbd8181cb..b5e79193c9 100644 --- a/src/components/common/navigation/NavigationRoutes.tsx +++ b/src/components/common/navigation/NavigationRoutes.tsx @@ -28,6 +28,7 @@ import { URLS as CommonURLS, AppListConstants, MODES, + DEVTRON_BASE_MAIN_ID, } from '@devtron-labs/devtron-fe-common-lib' import { Route, Switch, useRouteMatch, useHistory, useLocation } from 'react-router-dom' import * as Sentry from '@sentry/browser' @@ -380,7 +381,7 @@ export default function NavigationRoutes() { isSuperAdmin, }} > -
+
{!_isOnboardingPage && ( { } renderWrapWithLink = (children: ReactElement) => ( - + {children} ) @@ -306,7 +311,7 @@ export class CDNode extends Component { const currentNodeKey = `${WorkflowNodeType.CD}-${this.props.id.substring(4)}` return (
{ > {this.props.cdNamesList?.length > 0 ? this.renderReadOnlyCard() : this.renderCardContent()} - - {this.state.showDeleteDialog && ( - - )} + + {this.renderDeleteConformationDialog()} ) diff --git a/src/css/base.scss b/src/css/base.scss index a6f709a165..725ae3e252 100644 --- a/src/css/base.scss +++ b/src/css/base.scss @@ -4012,6 +4012,10 @@ textarea, margin-bottom: 0px !important; } +.mt-40 { + margin-top: 40px; +} + .mt-120 { margin-top: 120px; } @@ -5254,3 +5258,9 @@ textarea::placeholder { .code-editor-red-diff { background: var(--R100); } + +.backdrop { + background: rgba(0, 0, 0, 0.75); + z-index: var(--modal-index); + backdrop-filter: blur(1px); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 73e55b72f6..f8e583a36d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -974,15 +974,16 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@devtron-labs/devtron-fe-common-lib@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@devtron-labs/devtron-fe-common-lib/-/devtron-fe-common-lib-1.1.5.tgz#67bc1dbcdbd96a80183bd0273a360ac7fef030f8" - integrity sha512-A8FIXCY6r2PHe1ALdt0rRK9fHPQeN+eliMX5Z6C5GgNeKemzXfQvEa7UIboZlhNj+LaRmA7elJvzkkqVQKHObA== +"@devtron-labs/devtron-fe-common-lib@1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@devtron-labs/devtron-fe-common-lib/-/devtron-fe-common-lib-1.1.6.tgz#13390eaef23265dfaf2525506fc37c263df3416c" + integrity sha512-t5o8rjIBxaUfL97yhXZHJUZDhiwhRQOgWGqaulD2PqzCei9I8rP+0wlwQbbRHh73HFSc3sxmesItYoHGeQhNJw== dependencies: "@types/react-dates" "^21.8.6" ansi_up "^5.2.1" dayjs "^1.11.13" fast-json-patch "^3.1.1" + framer-motion "^6.5.1" jsonpath-plus "^10.0.0" marked "^13.0.3" react-dates "^21.8.0" @@ -1068,6 +1069,18 @@ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" @@ -1571,6 +1584,59 @@ dependencies: "@types/mdx" "^2.0.0" +"@motionone/animation@^10.12.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b" + integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw== + dependencies: + "@motionone/easing" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/dom@10.12.0": + version "10.12.0" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.12.0.tgz#ae30827fd53219efca4e1150a5ff2165c28351ed" + integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== + dependencies: + "@motionone/animation" "^10.12.0" + "@motionone/generators" "^10.12.0" + "@motionone/types" "^10.12.0" + "@motionone/utils" "^10.12.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708" + integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg== + dependencies: + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/generators@^10.12.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762" + integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg== + dependencies: + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/types@^10.12.0", "@motionone/types@^10.17.1": + version "10.17.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb" + integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A== + +"@motionone/utils@^10.12.0", "@motionone/utils@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e" + integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw== + dependencies: + "@motionone/types" "^10.17.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -4741,6 +4807,27 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +framer-motion@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.5.1.tgz#802448a16a6eb764124bf36d8cbdfa6dd6b931a7" + integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== + dependencies: + "@motionone/dom" "10.12.0" + framesync "6.0.1" + hey-listen "^1.0.8" + popmotion "11.0.3" + style-value-types "5.0.0" + tslib "^2.1.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20" + integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== + dependencies: + tslib "^2.1.0" + fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" @@ -4979,6 +5066,11 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + history@^4.9.0: version "4.10.1" resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" @@ -6258,6 +6350,16 @@ polished@^4.2.2: dependencies: "@babel/runtime" "^7.17.8" +popmotion@11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9" + integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== + dependencies: + framesync "6.0.1" + hey-listen "^1.0.8" + style-value-types "5.0.0" + tslib "^2.1.0" + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" @@ -7322,6 +7424,14 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-value-types@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad" + integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== + dependencies: + hey-listen "^1.0.8" + tslib "^2.1.0" + stylis@4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" @@ -7556,6 +7666,11 @@ tslib@^2.1.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.3.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^2.6.2: version "2.6.3" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz"