diff --git a/.eslintrc.js b/.eslintrc.js index a052fdc9b4..400fd19ca5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,9 +14,11 @@ * limitations under the License. */ +const tsconfigPath = require('./tsconfig.json') + module.exports = { parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'react', 'prettier', 'import'], + plugins: ['@typescript-eslint', 'react', 'prettier', 'import', 'simple-import-sort'], env: { browser: true, es2021: true, @@ -112,6 +114,26 @@ module.exports = { 'import/named': 'off', 'no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': 'error', + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + // Packages `react` related packages and external packages. + ['^react', '^@?\\w'], + // Devtron packages + ['^@devtron-labs'], + // Internal packages. + [...Object.keys(tsconfigPath.compilerOptions.paths).map((alias) => alias.replace('/*', ''))], + // Side effect imports. + ['^\\u0000'], + // Put same-folder imports, `..` and `.` last. Other relative imports. + ['^\\.\\.(?!/?$)', '^\\.\\./?$', '^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$',], + // Style imports. + [ '^.+\\.?(css|scss)$'], + ], + }, + ], + 'simple-import-sort/exports': 'error', }, overrides: [ { diff --git a/config.md b/config.md index 32f8ca8ff3..f30ac44384 100644 --- a/config.md +++ b/config.md @@ -45,5 +45,9 @@ | TRIGGER_API_TIMEOUT | 60000 | Default timeout for all API requests for Trigger calls (Deploy artifacts, charts) in DASHBOARD | | FEATURE_HIDE_USER_DIRECT_PERMISSIONS_FOR_NON_SUPER_ADMINS | "true" | Would hide the user direct permissions for non-super admin users in User Permissions | | FEATURE_ACTION_AUDIOS_ENABLE | true | Would enable audios in dashboard | +| FEATURE_EXTERNAL_FLUX_CD_ENABLE | false | To enable flux cd option in app list page | +| FEATURE_BULK_RESTART_WORKLOADS_FROM_RB | deployment,rollout,daemonset,statefulset | Enables the bulk operations in the resource browser for specific workload type. | +| FEATURE_USER_DEFINED_GITOPS_REPO_ENABLE | false | If enabled user can pass the manual gitops repo | +| SENTRY_RELEASE_VERSION | | Sentry release Version | # DASHBOARD CONFIG SECRET diff --git a/nginx.conf b/nginx.conf index a80538636c..2394cf72f2 100644 --- a/nginx.conf +++ b/nginx.conf @@ -19,6 +19,14 @@ http { sendfile on; #tcp_nopush on; keepalive_timeout 65; + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_comp_level 6; + gzip_static on; + include /etc/nginx/conf.d/*.conf; } \ No newline at end of file diff --git a/package.json b/package.json index c68d56d2ea..9b2639cd29 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "/dashboard", "dependencies": { - "@devtron-labs/devtron-fe-common-lib": "1.11.2", + "@devtron-labs/devtron-fe-common-lib": "1.12.0", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rjsf/core": "^5.13.3", "@rjsf/utils": "^5.13.3", @@ -42,7 +42,7 @@ "rxjs": "^7.5.4", "sockjs-client": "1.6.1", "tippy.js": "^6.3.7", - "vite": "5.4.14", + "vite": "5.4.17", "vite-plugin-require-transform": "1.0.21", "vite-plugin-svgr": "^2.4.0", "xterm": "^4.19.0", @@ -111,6 +111,7 @@ "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-storybook": "^0.8.0", "husky": "^7.0.4", "jest-extended": "^2.0.0", @@ -129,6 +130,7 @@ "ts-jest": "29.2.5", "ts-node": "10.9.2", "typescript": "5.5.4", + "vite-plugin-compression2": "^1.3.3", "vite-plugin-image-optimizer": "^1.1.8", "vite-plugin-pwa": "^0.21.1", "vite-tsconfig-paths": "5.0.1" diff --git a/src/Pages/App/CreateAppModal/AppToCloneSelector.tsx b/src/Pages/App/CreateAppModal/AppToCloneSelector.tsx index 2051120982..1d99162b7d 100644 --- a/src/Pages/App/CreateAppModal/AppToCloneSelector.tsx +++ b/src/Pages/App/CreateAppModal/AppToCloneSelector.tsx @@ -14,6 +14,8 @@ * limitations under the License. */ +import { useState } from 'react' + import { AppSelectorNoOptionsMessage as appSelectorNoOptionsMessage, ComponentSizeType, @@ -21,8 +23,9 @@ import { SelectPicker, SelectPickerProps, } from '@devtron-labs/devtron-fe-common-lib' + import { appListOptions } from '@Components/AppSelector/AppSelectorUtil' -import { useState } from 'react' + import { AppToCloneSelectorProps } from './types' const AppToCloneSelector = ({ isJobView, error, handleCloneIdChange }: AppToCloneSelectorProps) => { diff --git a/src/Pages/App/CreateAppModal/ApplicationInfoForm.tsx b/src/Pages/App/CreateAppModal/ApplicationInfoForm.tsx index d8744d7472..9c94c47315 100644 --- a/src/Pages/App/CreateAppModal/ApplicationInfoForm.tsx +++ b/src/Pages/App/CreateAppModal/ApplicationInfoForm.tsx @@ -14,12 +14,16 @@ * limitations under the License. */ +import { ChangeEvent } from 'react' + import { CustomInput, TagsContainer, Textarea } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as ICDevtronApp } from '@Icons/ic-devtron-app.svg' + import { ReactComponent as ICCaretLeftSmall } from '@Icons/ic-caret-left-small.svg' -import { ChangeEvent } from 'react' +import { ReactComponent as ICDevtronApp } from '@Icons/ic-devtron-app.svg' import { importComponentFromFELibrary } from '@Components/common' import { APP_TYPE } from '@Config/constants' + +import AppToCloneSelector from './AppToCloneSelector' import ProjectSelector from './ProjectSelector' import { ApplicationInfoFormProps, @@ -29,7 +33,6 @@ import { HandleFormStateChangeParamsType, ProjectSelectorProps, } from './types' -import AppToCloneSelector from './AppToCloneSelector' const MandatoryTagsContainer = importComponentFromFELibrary('MandatoryTagsContainer', null, 'function') diff --git a/src/Pages/App/CreateAppModal/CreateAppModal.component.tsx b/src/Pages/App/CreateAppModal/CreateAppModal.component.tsx index 1652d5e0eb..51b56c057a 100644 --- a/src/Pages/App/CreateAppModal/CreateAppModal.component.tsx +++ b/src/Pages/App/CreateAppModal/CreateAppModal.component.tsx @@ -14,6 +14,9 @@ * limitations under the License. */ +import { useEffect, useMemo, useState } from 'react' +import { useHistory } from 'react-router-dom' + import { Button, ButtonStyleType, @@ -28,17 +31,21 @@ import { validateTagKeyValue, validateTagValue, } from '@devtron-labs/devtron-fe-common-lib' -import { useEffect, useMemo, useState } from 'react' -import { getHostURLConfiguration } from '@Services/service' + +import { ReactComponent as ICAppTemplate } from '@Icons/ic-app-template.svg' +import { ReactComponent as ICBack } from '@Icons/ic-caret-left-small.svg' +import { importComponentFromFELibrary } from '@Components/common' import { saveHostURLConfiguration } from '@Components/hostURL/hosturl.service' import { createJob } from '@Components/Jobs/Service' -import { APP_COMPOSE_STAGE, getAppComposeURL, URLS } from '@Config/routes' -import { useHistory } from 'react-router-dom' import { REQUIRED_FIELDS_MISSING } from '@Config/constants' -import { importComponentFromFELibrary } from '@Components/common' -import { ReactComponent as ICBack } from '@Icons/ic-caret-left-small.svg' -import { ReactComponent as ICAppTemplate } from '@Icons/ic-app-template.svg' +import { APP_COMPOSE_STAGE, getAppComposeURL, URLS } from '@Config/routes' +import { getHostURLConfiguration } from '@Services/service' +import ApplicationInfoForm from './ApplicationInfoForm' +import { createAppInitialFormErrorState, createAppInitialFormState } from './constants' +import HeaderSection from './HeaderSection' +import { createApp } from './service' +import Sidebar from './Sidebar' import { ApplicationInfoFormProps, CreateAppFormErrorStateType, @@ -47,13 +54,8 @@ import { CreateAppModalProps, CreationMethodType, } from './types' -import { createAppInitialFormErrorState, createAppInitialFormState } from './constants' -import { getCreateMethodConfig, validateAppName, validateCloneApp, validateProject } from './utils' -import { createApp } from './service' -import ApplicationInfoForm from './ApplicationInfoForm' -import HeaderSection from './HeaderSection' -import Sidebar from './Sidebar' import UpdateTemplateConfig from './UpdateTemplateConfig' +import { getCreateMethodConfig, validateAppName, validateCloneApp, validateProject } from './utils' import './styles.scss' diff --git a/src/Pages/App/CreateAppModal/HeaderSection.tsx b/src/Pages/App/CreateAppModal/HeaderSection.tsx index fa16aeb4f2..81449efed5 100644 --- a/src/Pages/App/CreateAppModal/HeaderSection.tsx +++ b/src/Pages/App/CreateAppModal/HeaderSection.tsx @@ -15,7 +15,9 @@ */ import { Button, ButtonStyleType, ButtonVariantType, ComponentSizeType } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICClose } from '@Icons/ic-close.svg' + import { HeaderSectionProps } from './types' const HeaderSection = ({ isJobView, handleClose, isCloseDisabled }: HeaderSectionProps) => ( diff --git a/src/Pages/App/CreateAppModal/ProjectSelector.tsx b/src/Pages/App/CreateAppModal/ProjectSelector.tsx index 3dea0dfc4b..88942b12c6 100644 --- a/src/Pages/App/CreateAppModal/ProjectSelector.tsx +++ b/src/Pages/App/CreateAppModal/ProjectSelector.tsx @@ -21,7 +21,9 @@ import { SelectPickerProps, useGetResourceKindsOptions, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICFolderColor } from '@Icons/ic-folder-color.svg' + import { CreateAppFormStateType, ProjectSelectorProps } from './types' const ProjectSelector = ({ selectedProjectId, handleProjectIdChange, error }: ProjectSelectorProps) => { diff --git a/src/Pages/App/CreateAppModal/Sidebar.tsx b/src/Pages/App/CreateAppModal/Sidebar.tsx index c9d6204c98..7d1cf69c09 100644 --- a/src/Pages/App/CreateAppModal/Sidebar.tsx +++ b/src/Pages/App/CreateAppModal/Sidebar.tsx @@ -15,7 +15,9 @@ */ import { ModalSidebarPanel } from '@devtron-labs/devtron-fe-common-lib' + import { DOCUMENTATION } from '@Config/constants' + import { CreationMethodType, SidebarProps } from './types' const Sidebar = ({ diff --git a/src/Pages/App/CreateAppModal/UpdateTemplateConfig.tsx b/src/Pages/App/CreateAppModal/UpdateTemplateConfig.tsx index 5d80a5fcc6..fd274fda9f 100644 --- a/src/Pages/App/CreateAppModal/UpdateTemplateConfig.tsx +++ b/src/Pages/App/CreateAppModal/UpdateTemplateConfig.tsx @@ -16,14 +16,14 @@ import { noop } from '@devtron-labs/devtron-fe-common-lib' -import MaterialList from '@Components/material/MaterialList' import CIConfig from '@Components/ciConfig/CIConfig' import { CIConfigProps } from '@Components/ciConfig/types' import { DockerConfigOverrideKeys } from '@Components/ciPipeline/types' import { MaterialListProps } from '@Components/material/material.types' +import MaterialList from '@Components/material/MaterialList' -import { Workflow, WorkflowProps } from './Workflow' import { CreateAppFormStateActionType, UpdateTemplateConfigProps } from './types' +import { Workflow, WorkflowProps } from './Workflow' const parentState: CIConfigProps['parentState'] = { loadingState: null, diff --git a/src/Pages/App/CreateAppModal/Workflow/Workflow.tsx b/src/Pages/App/CreateAppModal/Workflow/Workflow.tsx index 17b98437ce..7eff40a6e7 100644 --- a/src/Pages/App/CreateAppModal/Workflow/Workflow.tsx +++ b/src/Pages/App/CreateAppModal/Workflow/Workflow.tsx @@ -15,6 +15,7 @@ */ import { useEffect, useState } from 'react' + import { APIResponseHandler, GenericEmptyState, @@ -29,6 +30,7 @@ import { import { getCreateWorkflows } from '@Components/app/details/triggerView/workflow.service' import { getEnvironmentListMin } from '@Services/service' +import { HandleNodeUpdateActionProps, NodeUpdateActionType, WorkflowProps } from './types' import { getCDNodeIcon, getPipelineIdFromNodeId, @@ -37,7 +39,6 @@ import { getWorkflowGraphVisualizerNodes, getWorkflowLinkedCDNodes, } from './utils' -import { HandleNodeUpdateActionProps, NodeUpdateActionType, WorkflowProps } from './types' export const Workflow = ({ templateId, onChange, workflowIdToErrorMessageMap }: WorkflowProps) => { // STATES diff --git a/src/Pages/App/CreateAppModal/Workflow/index.ts b/src/Pages/App/CreateAppModal/Workflow/index.ts index e3d6dba9d2..e19381f415 100644 --- a/src/Pages/App/CreateAppModal/Workflow/index.ts +++ b/src/Pages/App/CreateAppModal/Workflow/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export * from './Workflow' export type { WorkflowProps } from './types' +export * from './Workflow' diff --git a/src/Pages/App/CreateAppModal/Workflow/utils.tsx b/src/Pages/App/CreateAppModal/Workflow/utils.tsx index 7f62f31b04..131e3b561e 100644 --- a/src/Pages/App/CreateAppModal/Workflow/utils.tsx +++ b/src/Pages/App/CreateAppModal/Workflow/utils.tsx @@ -26,15 +26,15 @@ import { WorkflowType, } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as ICCi } from '@Icons/ic-CI.svg' import { ReactComponent as ICCD } from '@Icons/ic-CD.svg' +import { ReactComponent as ICCi } from '@Icons/ic-CI.svg' import { ReactComponent as ICCIWebhook } from '@Icons/ic-CIWebhook.svg' -import { ReactComponent as ICNodeBuildLinked } from '@Icons/ic-node-build-linked.svg' -import { ReactComponent as ICWarning } from '@Icons/ic-warning.svg' +import { ReactComponent as ICError } from '@Icons/ic-error.svg' import { ReactComponent as ICJobNode } from '@Icons/ic-job-node.svg' import { ReactComponent as ICLinkedCD } from '@Icons/ic-linked-cd.svg' +import { ReactComponent as ICNodeBuildLinked } from '@Icons/ic-node-build-linked.svg' import { ReactComponent as ICPaperRocket } from '@Icons/ic-paper-rocket.svg' -import { ReactComponent as ICError } from '@Icons/ic-error.svg' +import { ReactComponent as ICWarning } from '@Icons/ic-warning.svg' import { createClusterEnvGroup } from '@Components/common' import { diff --git a/src/Pages/App/CreateAppModal/constants.ts b/src/Pages/App/CreateAppModal/constants.ts index 6a8f52e1b9..0396d0c3ed 100644 --- a/src/Pages/App/CreateAppModal/constants.ts +++ b/src/Pages/App/CreateAppModal/constants.ts @@ -15,6 +15,7 @@ */ import { getEmptyTagTableRow } from '@devtron-labs/devtron-fe-common-lib' + import { CreateAppFormErrorStateType, CreateAppFormStateType } from './types' export const createAppInitialFormState: CreateAppFormStateType = { diff --git a/src/Pages/App/CreateAppModal/service.ts b/src/Pages/App/CreateAppModal/service.ts index 739fcd10f1..61ce62c2af 100644 --- a/src/Pages/App/CreateAppModal/service.ts +++ b/src/Pages/App/CreateAppModal/service.ts @@ -15,6 +15,7 @@ */ import { post } from '@devtron-labs/devtron-fe-common-lib' + import { Routes } from '@Config/constants' export const createApp = (request) => post(Routes.APP, request) diff --git a/src/Pages/App/CreateAppModal/types.ts b/src/Pages/App/CreateAppModal/types.ts index f7e320d699..cb1c0db04a 100644 --- a/src/Pages/App/CreateAppModal/types.ts +++ b/src/Pages/App/CreateAppModal/types.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { SyntheticEvent } from 'react' + import { ButtonProps, DynamicDataTableCellErrorType, @@ -21,9 +23,10 @@ import { SelectPickerProps, TagsTableColumnsType, } from '@devtron-labs/devtron-fe-common-lib' -import { SyntheticEvent } from 'react' -import { GitMaterialType } from '@Components/material/material.types' + import { CIConfigProps } from '@Components/ciConfig/types' +import { GitMaterialType } from '@Components/material/material.types' + import { getCreateMethodConfig } from './utils' interface CreateAppWorkflowConfigType { diff --git a/src/Pages/App/CreateAppModal/utils.tsx b/src/Pages/App/CreateAppModal/utils.tsx index b713b8e891..d03620d569 100644 --- a/src/Pages/App/CreateAppModal/utils.tsx +++ b/src/Pages/App/CreateAppModal/utils.tsx @@ -14,10 +14,12 @@ * limitations under the License. */ -import { MAX_LENGTH_30 } from '@Config/constantMessaging' -import { PATTERNS } from '@Config/constants' import { Icon, IconsProps, SelectPickerOptionType, ValidationResponseType } from '@devtron-labs/devtron-fe-common-lib' + import { importComponentFromFELibrary } from '@Components/common' +import { MAX_LENGTH_30 } from '@Config/constantMessaging' +import { PATTERNS } from '@Config/constants' + import { CreateAppFormStateType, CreateAppModalProps, CreationMethodType } from './types' const isFELibAvailable: boolean = importComponentFromFELibrary('isFELibAvailable', null, 'function') diff --git a/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetails.tsx b/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetails.tsx index 66dcc5ebf8..2017e9360f 100644 --- a/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetails.tsx +++ b/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetails.tsx @@ -14,25 +14,27 @@ * limitations under the License. */ +import { useEffect, useState } from 'react' +import { useParams } from 'react-router-dom' + import { AppType, + DeploymentAppTypes, + ERROR_STATUS_CODE, ErrorScreenManager, IndexStore, - useMainContext, - DeploymentAppTypes, - showError, - ResponseType, noop, - ERROR_STATUS_CODE, + ResponseType, + showError, + useMainContext, } from '@devtron-labs/devtron-fe-common-lib' -import { useEffect, useState } from 'react' -import { useParams } from 'react-router-dom' -import { ExternalFluxAppDetailParams } from './types' -import { getExternalFluxCDAppDetails } from './service' + import { FluxCDTemplateType } from '../../../../components/app/list-new/AppListType' import AppDetailsComponent from '../../../../components/v2/appDetails/AppDetails.component' -import { getAppStatus } from './utils' import { AppDetails } from '../../../../components/v2/appDetails/appDetails.type' +import { getExternalFluxCDAppDetails } from './service' +import { ExternalFluxAppDetailParams } from './types' +import { getAppStatus } from './utils' let initTimer = null diff --git a/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetailsRoute.tsx b/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetailsRoute.tsx index ce248a5d2d..9d8eb3efba 100644 --- a/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetailsRoute.tsx +++ b/src/Pages/App/Details/ExternalFlux/ExternalFluxAppDetailsRoute.tsx @@ -15,8 +15,10 @@ */ import { lazy, Suspense } from 'react' -import { AppListConstants, Progressing, URLS } from '@devtron-labs/devtron-fe-common-lib' import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom' + +import { AppListConstants, Progressing, URLS } from '@devtron-labs/devtron-fe-common-lib' + import EAHeaderComponent from '../../../../components/v2/headers/EAHeader.component' const ExternalFluxAppDetails = lazy(() => import('./ExternalFluxAppDetails')) diff --git a/src/Pages/App/Details/ExternalFlux/service.tsx b/src/Pages/App/Details/ExternalFlux/service.tsx index 9ded6e1974..936f6382f2 100644 --- a/src/Pages/App/Details/ExternalFlux/service.tsx +++ b/src/Pages/App/Details/ExternalFlux/service.tsx @@ -15,6 +15,7 @@ */ import { get, getUrlWithSearchParams } from '@devtron-labs/devtron-fe-common-lib' + import { Routes } from '../../../../config' export const getExternalFluxCDAppDetails = (clusterId, namespace, appName, isKustomization) => { diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.service.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.service.ts index 6f835680ec..a7d4ad6079 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.service.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.service.ts @@ -17,10 +17,11 @@ import { AppConfigProps, get, - trash, - ROUTES as CommonRoutes, getUrlWithSearchParams, + ROUTES as CommonRoutes, + trash, } from '@devtron-labs/devtron-fe-common-lib' + import { Routes } from '../../../../../config' export const getGitProviderMin = () => { diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.tsx index 9b74529a66..c09672253e 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.tsx @@ -14,46 +14,50 @@ * limitations under the License. */ -import { useState, useEffect } from 'react' -import { useParams, useLocation, useRouteMatch, useHistory } from 'react-router-dom' +import { useEffect, useState } from 'react' +import { useHistory, useLocation, useParams, useRouteMatch } from 'react-router-dom' + import { - showError, - Progressing, - ErrorScreenManager, - useAsync, - ResourceKindType, - ToastManager, - ToastVariantType, - ResourceIdToResourceApprovalPolicyConfigMapType, AppConfigProps, ConfirmationModal, ConfirmationModalVariantType, + ErrorScreenManager, noop, + Progressing, + ResourceIdToResourceApprovalPolicyConfigMapType, + ResourceKindType, + showError, + ToastManager, + ToastVariantType, URLS as CommonUrls, + useAsync, } from '@devtron-labs/devtron-fe-common-lib' + import { DeleteComponentsName } from '@Config/constantMessaging' import { ApplicationDeletionInfo } from '@Pages/Shared/ApplicationDeletionInfo/ApplicationDeletionInfo' -import { URLS, getAppComposeURL, APP_COMPOSE_STAGE, ViewType } from '../../../../../config' + import { importComponentFromFELibrary } from '../../../../../components/common' +import { APP_COMPOSE_STAGE, getAppComposeURL, URLS, ViewType } from '../../../../../config' import { getAppOtherEnvironmentMin, getJobOtherEnvironmentMin, getWorkflowList } from '../../../../../services/service' -import './appConfig.scss' +import { getUserRole } from '../../../../GlobalConfigurations/Authorization/authorization.service' +import { UserRoleType } from '../../../../GlobalConfigurations/Authorization/constants' +import { getAppConfigStatus, getEnvConfig } from '../../service' +import { AppConfigStatusItemType } from '../../service.types' +import AppComposeRouter from './MainContent/AppComposeRouter' +import { AppNavigation } from './Navigation/AppNavigation' +import { ENV_CONFIG_PATH_REG } from './AppConfig.constants' +import { deleteApp } from './AppConfig.service' import { AppConfigState, AppStageUnlockedType, - STAGE_NAME, DEFAULT_LANDING_STAGE, EnvConfigType, + STAGE_NAME, } from './AppConfig.types' -import { getUserRole } from '../../../../GlobalConfigurations/Authorization/authorization.service' -import { isCIPipelineCreated, isCDPipelineCreated, getNavItems, isUnlocked } from './AppConfig.utils' -import AppComposeRouter from './MainContent/AppComposeRouter' -import { UserRoleType } from '../../../../GlobalConfigurations/Authorization/constants' -import { AppNavigation } from './Navigation/AppNavigation' -import { AppConfigStatusItemType } from '../../service.types' -import { getAppConfigStatus, getEnvConfig } from '../../service' -import { deleteApp } from './AppConfig.service' +import { getNavItems, isCDPipelineCreated, isCIPipelineCreated, isUnlocked } from './AppConfig.utils' import { AppConfigurationProvider } from './AppConfiguration.provider' -import { ENV_CONFIG_PATH_REG } from './AppConfig.constants' + +import './appConfig.scss' const getApprovalPolicyConfigForApp: (appId: number) => Promise = importComponentFromFELibrary('getApprovalPolicyConfigForApp', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.types.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.types.ts index 210b32ace5..8bd9dd514e 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.types.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.types.ts @@ -15,17 +15,17 @@ */ import { - ResourceKindType, - CollapsibleListItem, + AppConfigProps, AppEnvDeploymentConfigType, - EnvResourceType, AppEnvironment, + CollapsibleListItem, + EnvResourceType, ResourceIdToResourceApprovalPolicyConfigMapType, - AppConfigProps, + ResourceKindType, } from '@devtron-labs/devtron-fe-common-lib' -import { ViewType } from '@Config/constants' import { WorkflowResult } from '@Components/app/details/triggerView/types' +import { ViewType } from '@Config/constants' import { UserRoleType } from '@Pages/GlobalConfigurations/Authorization/constants' import { ResourceConfig, ResourceConfigState } from '../../service.types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.utils.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.utils.ts index c8344c161d..b5e0e645c0 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.utils.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfig.utils.ts @@ -14,17 +14,19 @@ * limitations under the License. */ +import { generatePath } from 'react-router-dom' + import { + AppConfigProps, + BASE_CONFIGURATION_ENV_ID, + ConfigResourceType, ResourceKindType, stringComparatorBySortOrder, - ConfigResourceType, - BASE_CONFIGURATION_ENV_ID, URLS as CommonURLS, - AppConfigProps, } from '@devtron-labs/devtron-fe-common-lib' -import { generatePath } from 'react-router-dom' -import { URLS, DOCUMENTATION, getAppComposeURL, APP_COMPOSE_STAGE } from '@Config/index' +import { APP_COMPOSE_STAGE, DOCUMENTATION, getAppComposeURL, URLS } from '@Config/index' + import { AppConfigStatusItemType, EnvConfigDTO } from '../../service.types' import { AppConfigState, AppStageUnlockedType, CustomNavItemsType, EnvConfigType, STAGE_NAME } from './AppConfig.types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfiguration.provider.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfiguration.provider.tsx index 5841d5e899..5defe04947 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfiguration.provider.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/AppConfiguration.provider.tsx @@ -17,6 +17,7 @@ import React, { useMemo, useState } from 'react' import { ResourceKindType } from '@devtron-labs/devtron-fe-common-lib' + import { AppConfigurationContextType, AppConfigurationProviderProps } from './AppConfig.types' export const AppConfigurationContext = React.createContext(null) diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/AppComposeRouter.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/AppComposeRouter.tsx index 9a70e5d701..63a82ca803 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/AppComposeRouter.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/AppComposeRouter.tsx @@ -15,28 +15,29 @@ */ import React, { lazy, Suspense } from 'react' -import { useRouteMatch, useHistory, Route, Switch, Redirect, useLocation, generatePath } from 'react-router-dom' +import { generatePath, Redirect, Route, Switch, useHistory, useLocation, useRouteMatch } from 'react-router-dom' + import { - Progressing, - EnvResourceType, - BASE_CONFIGURATION_ENV_ID, ApprovalConfigDataKindType, - getIsApprovalPolicyConfigured, - CMSecretComponentType, + BASE_CONFIGURATION_ENV_ID, Button, + CMSecretComponentType, + EnvResourceType, + getIsApprovalPolicyConfigured, + Progressing, } from '@devtron-labs/devtron-fe-common-lib' import { ReactComponent as Next } from '@Icons/ic-arrow-forward.svg' -import { DEPLOYMENT_CONFIGURATION_RESOURCE_TYPE_ROUTE, URLS } from '@Config/index' import { ErrorBoundary, useAppContext } from '@Components/common' import ExternalLinks from '@Components/externalLinks/ExternalLinks' +import { DEPLOYMENT_CONFIGURATION_RESOURCE_TYPE_ROUTE, URLS } from '@Config/index' import { ConfigMapSecretWrapper } from '@Pages/Shared/ConfigMapSecret/ConfigMapSecret.wrapper' import { NextButtonProps, STAGE_NAME } from '../AppConfig.types' import { useAppConfigurationContext } from '../AppConfiguration.provider' +import { DeploymentConfigCompare } from './DeploymentConfigCompare' import '../appConfig.scss' -import { DeploymentConfigCompare } from './DeploymentConfigCompare' const MaterialList = lazy(() => import('@Components/material/MaterialList')) const CIConfig = lazy(() => import('@Components/ciConfig/CIConfig')) diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/BaseConfigurationNavigation.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/BaseConfigurationNavigation.tsx index 0226ea347b..da3012bf9a 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/BaseConfigurationNavigation.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/BaseConfigurationNavigation.tsx @@ -21,6 +21,7 @@ import { ButtonVariantType, ComponentSizeType, } from '@devtron-labs/devtron-fe-common-lib' + import { BaseConfigurationNavigationProps } from './types' const BaseConfigurationNavigation = ({ baseConfigurationURL }: BaseConfigurationNavigationProps) => ( diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/CompareConfigView.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/CompareConfigView.tsx index b557c51aa8..b65439a127 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/CompareConfigView.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/CompareConfigView.tsx @@ -14,9 +14,11 @@ * limitations under the License. */ -import { importComponentFromFELibrary } from '@Components/common' -import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg' import { DeploymentHistoryDiffView, ErrorScreenManager } from '@devtron-labs/devtron-fe-common-lib' + +import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg' +import { importComponentFromFELibrary } from '@Components/common' + import { CompareConfigViewProps } from './types' import { getCompareViewHistoryDiffConfigProps } from './utils' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigDryRun.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigDryRun.tsx index 2e5e9b0fbf..2d65779aa4 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigDryRun.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigDryRun.tsx @@ -15,6 +15,7 @@ */ import { useParams } from 'react-router-dom' + import { abortPreviousRequests, APIResponseHandler, @@ -25,15 +26,17 @@ import { getDeploymentManifest, getIsRequestAborted, MODES, - useAsync, ToggleResolveScopedVariables, + useAsync, } from '@devtron-labs/devtron-fe-common-lib' -import { importComponentFromFELibrary } from '@Components/common' -import { ReactComponent as ICFilePlay } from '@Icons/ic-file-play.svg' + // FIXME: Placeholder icon since no sense of git merge icon as of now import { ReactComponent as ICFileCode } from '@Icons/ic-file-code.svg' -import SelectMergeStrategy from './SelectMergeStrategy' +import { ReactComponent as ICFilePlay } from '@Icons/ic-file-play.svg' +import { importComponentFromFELibrary } from '@Components/common' + import NoPublishedVersionEmptyState from './NoPublishedVersionEmptyState' +import SelectMergeStrategy from './SelectMergeStrategy' import { ConfigDryRunProps } from './types' const DryRunEditorModeSelect = importComponentFromFELibrary('DryRunEditorModeSelect', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigHeader.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigHeader.tsx index b8d77300e9..7c6ce60bf8 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigHeader.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigHeader.tsx @@ -20,7 +20,9 @@ import { ConfigHeaderTabType, InvalidYAMLTippyWrapper, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICErrorExclamation } from '@Icons/ic-error-exclamation.svg' + import { ConfigHeaderProps, ConfigHeaderTabProps } from './types' import { getConfigHeaderTabConfig } from './utils' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigToolbar.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigToolbar.tsx index 84e7935d9d..3ef556302d 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigToolbar.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/ConfigToolbar.tsx @@ -16,28 +16,31 @@ import { Fragment } from 'react' import ReactGA from 'react-ga4' +import { useParams } from 'react-router-dom' + import { + BaseURLParams, Button, ButtonStyleType, ButtonVariantType, - ConfigHeaderTabType, - ProtectConfigTabsType, - PopupMenu, - BaseURLParams, ComponentSizeType, + ConfigHeaderTabType, + Icon, InvalidYAMLTippyWrapper, + PopupMenu, + ProtectConfigTabsType, ToggleResolveScopedVariables, - Icon, } from '@devtron-labs/devtron-fe-common-lib' -import { useParams } from 'react-router-dom' -import { importComponentFromFELibrary } from '@Components/common' -import { ReactComponent as ICMore } from '@Icons/ic-more-option.svg' + import { ReactComponent as ICBookOpen } from '@Icons/ic-book-open.svg' import { ReactComponent as ICInfoOutlineGrey } from '@Icons/ic-info-outline-grey.svg' +import { ReactComponent as ICMore } from '@Icons/ic-more-option.svg' +import { importComponentFromFELibrary } from '@Components/common' + import BaseConfigurationNavigation from './BaseConfigurationNavigation' -import { PopupMenuItem } from './utils' -import { ConfigToolbarProps } from './types' import SelectMergeStrategy from './SelectMergeStrategy' +import { ConfigToolbarProps } from './types' +import { PopupMenuItem } from './utils' const ProtectionViewTabGroup = importComponentFromFELibrary('ProtectionViewTabGroup', null, 'function') const MergePatchWithTemplateCheckbox = importComponentFromFELibrary('MergePatchWithTemplateCheckbox', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/DeploymentConfigCompare.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/DeploymentConfigCompare.tsx index f4356388dc..fdcad751a1 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/DeploymentConfigCompare.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/DeploymentConfigCompare.tsx @@ -18,26 +18,26 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { generatePath, useHistory, useLocation, useRouteMatch } from 'react-router-dom' import { - useUrlFilters, - SelectPickerOptionType, - SelectPickerVariantType, - useAsync, + AppEnvDeploymentConfigType, + BASE_CONFIGURATION_ENV_ID, + DEPLOYMENT_CONFIG_DIFF_SORT_KEY, DeploymentConfigDiff, DeploymentConfigDiffProps, - AppEnvDeploymentConfigType, - getDefaultVersionAndPreviousDeploymentOptions, - getAppEnvDeploymentConfigList, - getSelectPickerOptionByValue, EnvResourceType, - BASE_CONFIGURATION_ENV_ID, - useMainContext, - getCompareSecretsData, getAppEnvDeploymentConfig, - DEPLOYMENT_CONFIG_DIFF_SORT_KEY, + getAppEnvDeploymentConfigList, + getCompareSecretsData, + getDefaultVersionAndPreviousDeploymentOptions, + getSelectPickerOptionByValue, + SelectPickerOptionType, + SelectPickerVariantType, SortingOrder, + useAsync, + useMainContext, + useUrlFilters, } from '@devtron-labs/devtron-fe-common-lib' -import { getTemplateOptions, getChartReferencesForAppAndEnv } from '@Services/service' +import { getChartReferencesForAppAndEnv, getTemplateOptions } from '@Services/service' import { BASE_CONFIGURATIONS } from '../../AppConfig.constants' import { @@ -46,24 +46,24 @@ import { DeploymentConfigCompareProps, DeploymentConfigParams, } from '../../AppConfig.types' +import { getDeploymentTemplateData, getManifestData } from './service.utils' +import { DeploymentConfigComparisonDataType } from './types' import { + deploymentConfigDiffTabs, + getAppAndEnvIds, + getAppEnvDeploymentConfigPayload, getCompareEnvironmentSelectorOptions, - getPreviousDeploymentOptionValue, - getPreviousDeploymentValue, - parseCompareWithSearchParams, - getEnvironmentConfigTypeOptions, getConfigChartRefId, - getManifestRequestValues, - deploymentConfigDiffTabs, getDeploymentConfigDiffTabs, - getAppAndEnvIds, + getEnvironmentConfigTypeOptions, + getIdentifierIdBasedOnConfiguration, + getManifestRequestValues, + getPreviousDeploymentOptionValue, + getPreviousDeploymentValue, isConfigTypeNonDraftOrPublished, isConfigTypePublished, - getAppEnvDeploymentConfigPayload, - getIdentifierIdBasedOnConfiguration, + parseCompareWithSearchParams, } from './utils' -import { getDeploymentTemplateData, getManifestData } from './service.utils' -import { DeploymentConfigComparisonDataType } from './types' export const DeploymentConfigCompare = ({ environments, diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/service.utils.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/service.utils.ts index 956a33c806..cf2c23e595 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/service.utils.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/service.utils.ts @@ -24,6 +24,7 @@ import { ResponseType, TemplateListType, } from '@devtron-labs/devtron-fe-common-lib' + import { GetDeploymentTemplateDataProps, GetManifestDataProps } from '../../AppConfig.types' import { getAppAndEnvIds } from './utils' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/types.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/types.ts index bc002ff1c4..219a65c88b 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/types.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/types.ts @@ -15,8 +15,9 @@ */ import { getAppEnvDeploymentConfig, TemplateListDTO } from '@devtron-labs/devtron-fe-common-lib' -import { getManifestData } from './service.utils' + import { AppEnvDeploymentConfigQueryParamsType } from '../../AppConfig.types' +import { getManifestData } from './service.utils' type ManifestComparisonDataType = { isManifestComparison: true diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/utils.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/utils.ts index d7a1469390..d78f2c7297 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/utils.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentConfigCompare/utils.ts @@ -28,14 +28,14 @@ import { import { Moment12HourFormat } from '@Config/constants' +import { BASE_CONFIGURATIONS } from '../../AppConfig.constants' import { - AppEnvDeploymentConfigQueryParamsType, - EnvironmentOptionType, AppEnvDeploymentConfigQueryParams, + AppEnvDeploymentConfigQueryParamsType, DeploymentConfigCompareProps, + EnvironmentOptionType, GetAppEnvDeploymentConfigProps, } from '../../AppConfig.types' -import { BASE_CONFIGURATIONS } from '../../AppConfig.constants' import { SetIdentifierIdBasedOnConfigurationProps } from './types' export const getPreviousDeploymentOptionValue = (identifierId: number, pipelineId?: number, chartRefId?: number) => { diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DTChartSelector.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DTChartSelector.tsx index a314519e51..8fc9754b57 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DTChartSelector.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DTChartSelector.tsx @@ -15,24 +15,27 @@ */ import { useState } from 'react' + import { - PopupMenu, - stopPropagation, - StyledRadioGroup as RadioGroup, + ComponentSizeType, DeploymentChartVersionType, + InvalidYAMLTippyWrapper, + PipelineMigratedFromType, + PopupMenu, SelectPicker, SelectPickerOptionType, SelectPickerVariantType, + stopPropagation, + StyledRadioGroup as RadioGroup, versionComparatorBySortOrder, - InvalidYAMLTippyWrapper, - ComponentSizeType, - PipelineMigratedFromType, } from '@devtron-labs/devtron-fe-common-lib' + +import { ReactComponent as Dropdown } from '@Icons/ic-chevron-down.svg' import { sortObjectArrayAlphabetically } from '@Components/common' import { DEPLOYMENT } from '@Config/constants' -import { ReactComponent as Dropdown } from '@Icons/ic-chevron-down.svg' + +import { CHART_DOCUMENTATION_LINK, CHART_TYPE_TAB, CHART_TYPE_TAB_KEYS } from './constants' import { ChartSelectorDropdownProps, DTChartSelectorProps } from './types' -import { CHART_TYPE_TAB_KEYS, CHART_TYPE_TAB, CHART_DOCUMENTATION_LINK } from './constants' const LoadingShimmer = () =>
diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeleteOverrideDialog.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeleteOverrideDialog.tsx index 8be3ee8376..cb1969b1dd 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeleteOverrideDialog.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeleteOverrideDialog.tsx @@ -15,6 +15,7 @@ */ import { useParams } from 'react-router-dom' + import { API_STATUS_CODES, BaseURLParams, @@ -22,9 +23,11 @@ import { ServerError, showError, } from '@devtron-labs/devtron-fe-common-lib' + import { DeleteComponentsName } from '@Config/constantMessaging' -import { DeleteOverrideDialogProps } from './types' + import { deleteOverrideDeploymentTemplate } from './service' +import { DeleteOverrideDialogProps } from './types' const DeleteOverrideDialog = ({ environmentConfigId, diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplate.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplate.tsx index 4759526e09..ad2d1ccb25 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplate.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplate.tsx @@ -14,63 +14,96 @@ * limitations under the License. */ -import { useEffect, SyntheticEvent, useMemo, useReducer, Reducer, useRef } from 'react' +import { Reducer, SyntheticEvent, useEffect, useMemo, useReducer, useRef } from 'react' import ReactGA from 'react-ga4' +import { Prompt, useLocation, useParams } from 'react-router-dom' +import YAML from 'yaml' + import { + abortPreviousRequests, + API_STATUS_CODES, + AppConfigProps, BASE_CONFIGURATION_ENV_ID, BaseURLParams, + Button, + ButtonStyleType, + ButtonVariantType, + checkIfPathIsMatching, + CompareFromApprovalOptionsValuesType, + ComponentSizeType, + ConfigHeaderTabType, + ConfigResourceType, ConfigurationType, + DEFAULT_LOCKED_KEYS_CONFIG, DeploymentChartVersionType, - DraftState, - showError, - useMainContext, - YAMLStringify, DeploymentTemplateConfigState, - Progressing, + DraftAction, + DraftState, + DryRunEditorMode, ErrorScreenManager, + FloatingVariablesSuggestions, + GenericEmptyState, + GET_RESOLVED_DEPLOYMENT_TEMPLATE_EMPTY_RESPONSE, + getIsRequestAborted, getResolvedDeploymentTemplate, - ModuleStatus, - useAsync, + logExceptionToSentry, ModuleNameMap, - ToastManager, - ToastVariantType, - SelectPickerOptionType, - ValuesAndManifestFlagDTO, - CompareFromApprovalOptionsValuesType, + ModuleStatus, noop, - logExceptionToSentry, - ConfigHeaderTabType, + OverrideMergeStrategyType, + Progressing, ProtectConfigTabsType, - Button, - ComponentSizeType, - ButtonStyleType, - ButtonVariantType, - DryRunEditorMode, - usePrompt, - DEFAULT_LOCKED_KEYS_CONFIG, - GenericEmptyState, - GET_RESOLVED_DEPLOYMENT_TEMPLATE_EMPTY_RESPONSE, ResponseType, - API_STATUS_CODES, - OverrideMergeStrategyType, - useUrlFilters, - ConfigResourceType, - abortPreviousRequests, - getIsRequestAborted, - DraftAction, - checkIfPathIsMatching, - FloatingVariablesSuggestions, + SelectPickerOptionType, + showError, + ToastManager, + ToastVariantType, + useAsync, + useMainContext, useOneTimePrompt, - AppConfigProps, + usePrompt, + useUrlFilters, + ValuesAndManifestFlagDTO, + YAMLStringify, } from '@devtron-labs/devtron-fe-common-lib' -import { Prompt, useLocation, useParams } from 'react-router-dom' -import YAML from 'yaml' -import { importComponentFromFELibrary } from '@Components/common' -import { getModuleInfo } from '@Components/v2/devtronStackManager/DevtronStackManager.service' -import { APP_COMPOSE_STAGE, getAppComposeURL } from '@Config/routes' + import { ReactComponent as ICClose } from '@Icons/ic-close.svg' import { ReactComponent as ICInfoOutlineGrey } from '@Icons/ic-info-outline-grey.svg' import deleteOverrideEmptyStateImage from '@Images/no-artifact.webp' +import { importComponentFromFELibrary } from '@Components/common' +import { getModuleInfo } from '@Components/v2/devtronStackManager/DevtronStackManager.service' +import { APP_COMPOSE_STAGE, getAppComposeURL } from '@Config/routes' + +import BaseConfigurationNavigation from '../BaseConfigurationNavigation' +import CompareConfigView from '../CompareConfigView' +import ConfigDryRun from '../ConfigDryRun' +import ConfigHeader from '../ConfigHeader' +import ConfigToolbar from '../ConfigToolbar' +import NoOverrideEmptyState from '../NoOverrideEmptyState' +import NoPublishedVersionEmptyState from '../NoPublishedVersionEmptyState' +import { ConfigToolbarProps, DeploymentTemplateComponentType } from '../types' +import { getConfigToolbarPopupConfig } from '../utils' +import { NO_SCOPED_VARIABLES_MESSAGE } from './constants' +import DeleteOverrideDialog from './DeleteOverrideDialog' +import DeploymentTemplateCTA from './DeploymentTemplateCTA' +import DeploymentTemplateForm from './DeploymentTemplateForm' +import DeploymentTemplateOptionsHeader from './DeploymentTemplateOptionsHeader' +import { + DeploymentTemplateActionState, + DeploymentTemplateActionType, + deploymentTemplateReducer, + getDeploymentTemplateInitialState, +} from './deploymentTemplateReducer' +import { + createBaseDeploymentTemplate, + createEnvDeploymentTemplate, + deleteOverrideDeploymentTemplate, + getBaseDeploymentTemplate, + getChartList, + getEnvOverrideDeploymentTemplate, + updateBaseDeploymentTemplate, + updateEnvDeploymentTemplate, +} from './service' import { ConfigEditorStatesType, DeploymentTemplateEditorDataStateType, @@ -85,10 +118,6 @@ import { UpdateBaseDTPayloadType, UpdateEnvironmentDTPayloadType, } from './types' -import { NO_SCOPED_VARIABLES_MESSAGE } from './constants' -import DeploymentTemplateOptionsHeader from './DeploymentTemplateOptionsHeader' -import DeploymentTemplateForm from './DeploymentTemplateForm' -import DeploymentTemplateCTA from './DeploymentTemplateCTA' import { getAreTemplateChangesPresent, getCompareFromEditorConfig, @@ -106,33 +135,8 @@ import { handleInitializeDraftData, parseDeploymentTemplateParams, } from './utils' -import DeleteOverrideDialog from './DeleteOverrideDialog' -import { - updateBaseDeploymentTemplate, - createBaseDeploymentTemplate, - updateEnvDeploymentTemplate, - createEnvDeploymentTemplate, - getEnvOverrideDeploymentTemplate, - getBaseDeploymentTemplate, - getChartList, - deleteOverrideDeploymentTemplate, -} from './service' -import ConfigHeader from '../ConfigHeader' + import './DeploymentTemplate.scss' -import ConfigToolbar from '../ConfigToolbar' -import { ConfigToolbarProps, DeploymentTemplateComponentType } from '../types' -import { getConfigToolbarPopupConfig } from '../utils' -import ConfigDryRun from '../ConfigDryRun' -import NoOverrideEmptyState from '../NoOverrideEmptyState' -import CompareConfigView from '../CompareConfigView' -import NoPublishedVersionEmptyState from '../NoPublishedVersionEmptyState' -import BaseConfigurationNavigation from '../BaseConfigurationNavigation' -import { - DeploymentTemplateActionState, - DeploymentTemplateActionType, - deploymentTemplateReducer, - getDeploymentTemplateInitialState, -} from './deploymentTemplateReducer' const getDraftByResourceName = importComponentFromFELibrary('getDraftByResourceName', null, 'function') const getJsonPath = importComponentFromFELibrary('getJsonPath', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateCTA.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateCTA.tsx index 43269575dd..a2d1854a43 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateCTA.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateCTA.tsx @@ -14,6 +14,8 @@ * limitations under the License. */ +import { useParams } from 'react-router-dom' + import { BaseURLParams, Button, @@ -21,8 +23,9 @@ import { DTApplicationMetricsFormField, InvalidYAMLTippyWrapper, } from '@devtron-labs/devtron-fe-common-lib' -import { useParams } from 'react-router-dom' + import { ReactComponent as ICArrowRight } from '@Icons/ic-arrow-right.svg' + import { DeploymentTemplateCTAProps } from './types' // For protect we will have a separate component diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateForm.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateForm.tsx index 0ccbc09064..266c396a07 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateForm.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateForm.tsx @@ -15,6 +15,7 @@ */ import { useMemo } from 'react' + import { CodeEditor, ConfigurationType, @@ -24,14 +25,16 @@ import { OverrideMergeStrategyType, SelectPickerOptionType, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICBookOpen } from '@Icons/ic-book-open.svg' import { ReactComponent as ICPencil } from '@Icons/ic-pencil.svg' import { importComponentFromFELibrary } from '@Components/common' -import { DeploymentTemplateFormProps } from './types' -import { GUIView as DeploymentTemplateGUIView } from './GUIView' + +import { MERGE_STRATEGY_OPTIONS } from '../constants' import { APPLICATION_METRICS_DROPDOWN_OPTIONS, DEPLOYMENT_TEMPLATE_LABELS_KEYS } from './constants' +import { GUIView as DeploymentTemplateGUIView } from './GUIView' +import { DeploymentTemplateFormProps } from './types' import { getEditorSchemaURIFromChartNameAndVersion } from './utils' -import { MERGE_STRATEGY_OPTIONS } from '../constants' const ExpressEditDiffEditor = importComponentFromFELibrary('ExpressEditDiffEditor', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateOptionsHeader.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateOptionsHeader.tsx index f18166a881..9780b22981 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateOptionsHeader.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/DeploymentTemplateOptionsHeader.tsx @@ -15,13 +15,14 @@ */ import { + ComponentSizeType, + CONFIGURATION_TYPE_OPTIONS, ConfigurationType, InvalidYAMLTippyWrapper, SegmentedControl, - CONFIGURATION_TYPE_OPTIONS, SegmentedControlProps, - ComponentSizeType, } from '@devtron-labs/devtron-fe-common-lib' + import DTChartSelector from './DTChartSelector' import { DeploymentTemplateOptionsHeaderProps } from './types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/GUIView.component.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/GUIView.component.tsx index 947cb209f9..7fe62dead5 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/GUIView.component.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/GUIView.component.tsx @@ -15,28 +15,31 @@ */ import { useEffect, useMemo, useRef, useState } from 'react' +import { JSONPath } from 'jsonpath-plus' import YAML from 'yaml' + import { - InfoColourBar, - RJSFForm, + flatMapOfJSONPaths, FormProps, GenericEmptyState, - joinObjects, - flatMapOfJSONPaths, + GUIViewError, HIDE_SUBMIT_BUTTON_UI_SCHEMA, + InfoColourBar, + joinObjects, OverrideMergeStrategyType, - GUIViewError, + RJSFForm, ToastManager, ToastVariantType, } from '@devtron-labs/devtron-fe-common-lib' -import { JSONPath } from 'jsonpath-plus' -import EmptyFolderImage from '@Images/empty-folder.webp' + +import { ReactComponent as ICArrow } from '@Icons/ic-arrow-forward.svg' import { ReactComponent as Help } from '@Icons/ic-help.svg' import { ReactComponent as ICWarningY5 } from '@Icons/ic-warning-y5.svg' -import { ReactComponent as ICArrow } from '@Icons/ic-arrow-forward.svg' +import EmptyFolderImage from '@Images/empty-folder.webp' import { importComponentFromFELibrary } from '@Components/common' + +import { DEPLOYMENT_TEMPLATE_LABELS_KEYS, GUI_VIEW_TEXTS } from '../constants' import { GUIViewProps, GUIViewState } from './types' -import { GUI_VIEW_TEXTS, DEPLOYMENT_TEMPLATE_LABELS_KEYS } from '../constants' import { getRenderActionButton } from './utils' const makeObjectFromJsonPathArray = importComponentFromFELibrary('makeObjectFromJsonPathArray', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/types.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/types.ts index cd54acb3c5..cd0f85c02c 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/types.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/GUIView/types.ts @@ -15,6 +15,7 @@ */ import { DeploymentChartVersionType, GUIViewError } from '@devtron-labs/devtron-fe-common-lib' + import { DeploymentTemplateFormProps } from '../types' export interface GUIViewProps diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/deploymentTemplateReducer.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/deploymentTemplateReducer.ts index 13dc96d7bb..e7abb9ec37 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/deploymentTemplateReducer.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/deploymentTemplateReducer.ts @@ -15,6 +15,7 @@ */ import YAML from 'yaml' + import { CompareFromApprovalOptionsValuesType, ConfigToolbarPopupNodeType, @@ -30,6 +31,7 @@ import { ToastVariantType, YAMLStringify, } from '@devtron-labs/devtron-fe-common-lib' + import { ConfigEditorStatesType, DeploymentTemplateEditorDataStateType, diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/service.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/service.ts index dc058713e2..6eb257eed3 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/service.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/service.ts @@ -14,21 +14,23 @@ * limitations under the License. */ -import { Routes } from '@Config/constants' import { AppConfigProps, BaseURLParams, get, + getTemplateAPIRoute, GetTemplateAPIRouteType, + getUrlWithSearchParams, post, put, ResponseType, trash, - getTemplateAPIRoute, - getUrlWithSearchParams, versionComparatorBySortOrder, } from '@devtron-labs/devtron-fe-common-lib' + +import { Routes } from '@Config/constants' import { getChartReferencesForAppAndEnv } from '@Services/service' + import { DeploymentTemplateConfigDTO, EnvironmentOverrideDeploymentTemplateDTO, diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/types.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/types.ts index 2e9fac4f38..6fd2879b02 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/types.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/types.ts @@ -16,23 +16,24 @@ import { SyntheticEvent } from 'react' import { Operation } from 'fast-json-patch' + import { - ConfigKeysWithLockType, - DeploymentChartVersionType, + AppConfigProps, ChartMetadataType, - DeploymentTemplateConfigState, - SelectedChartDetailsType, CompareFromApprovalOptionsValuesType, - ConfigurationType, - ServerErrors, - ConfigToolbarPopupNodeType, - DryRunEditorMode, ConfigHeaderTabType, - ProtectConfigTabsType, + ConfigKeysWithLockType, + ConfigToolbarPopupNodeType, + ConfigurationType, + DeploymentChartVersionType, + DeploymentTemplateConfigState, DraftMetadataDTO, + DryRunEditorMode, OverrideMergeStrategyType, - AppConfigProps, PipelineMigratedFromType, + ProtectConfigTabsType, + SelectedChartDetailsType, + ServerErrors, } from '@devtron-labs/devtron-fe-common-lib' import { ConfigToolbarProps } from '../types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/utils.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/utils.tsx index 9e76732887..33c296c568 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/utils.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/DeploymentTemplate/utils.tsx @@ -14,19 +14,25 @@ * limitations under the License. */ +import YAML from 'yaml' + import { applyCompareDiffOnUneditedDocument, + CONFIG_HEADER_TAB_VALUES, + ConfigHeaderTabType, + DeploymentTemplateConfigState, DryRunEditorMode, getGuiSchemaFromChartName, + OverrideMergeStrategyType, ResponseType, YAMLStringify, - DeploymentTemplateConfigState, - OverrideMergeStrategyType, - ConfigHeaderTabType, - CONFIG_HEADER_TAB_VALUES, } from '@devtron-labs/devtron-fe-common-lib' + import { importComponentFromFELibrary } from '@Components/common' -import YAML from 'yaml' + +import { DEFAULT_MERGE_STRATEGY } from '../constants' +import { CompareConfigViewProps, EnvOverrideEditorCommonStateType } from '../types' +import { CHART_NAME_TO_DOC_SEGMENT, PROTECT_BASE_DEPLOYMENT_TEMPLATE_IDENTIFIER_DTO } from './constants' import { BaseDeploymentTemplateParsedDraftDTO, ConfigEditorStatesType, @@ -44,9 +50,6 @@ import { UpdateBaseDTPayloadType, UpdateEnvironmentDTPayloadType, } from './types' -import { CHART_NAME_TO_DOC_SEGMENT, PROTECT_BASE_DEPLOYMENT_TEMPLATE_IDENTIFIER_DTO } from './constants' -import { DEFAULT_MERGE_STRATEGY } from '../constants' -import { CompareConfigViewProps, EnvOverrideEditorCommonStateType } from '../types' const removeLockedKeysFromYaml = importComponentFromFELibrary('removeLockedKeysFromYaml', null, 'function') const reapplyRemovedLockedKeysToYaml = importComponentFromFELibrary('reapplyRemovedLockedKeysToYaml', null, 'function') diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoOverrideEmptyState.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoOverrideEmptyState.tsx index 1bb63a6b7c..8a9234869e 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoOverrideEmptyState.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoOverrideEmptyState.tsx @@ -17,13 +17,15 @@ import { Button, ButtonVariantType, + CMSecretComponentType, ComponentSizeType, GenericEmptyState, ImageType, - CMSecretComponentType, } from '@devtron-labs/devtron-fe-common-lib' -import cmCsEmptyState from '@Images/cm-cs-empty-state.png' + import { ReactComponent as ICAdd } from '@Icons/ic-add.svg' +import cmCsEmptyState from '@Images/cm-cs-empty-state.png' + import { NoOverrideEmptyStateProps } from './types' import './NoOverrideEmptyState.scss' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoPublishedVersionEmptyState.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoPublishedVersionEmptyState.tsx index 70eeb96579..2196b8737e 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoPublishedVersionEmptyState.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/NoPublishedVersionEmptyState.tsx @@ -15,6 +15,7 @@ */ import { Button, ButtonVariantType, GenericEmptyState, Icon } from '@devtron-labs/devtron-fe-common-lib' + import noArtifact from '@Images/no-artifact.webp' import { NoPublishedVersionEmptyStateProps } from './types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/SelectMergeStrategy.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/SelectMergeStrategy.tsx index eadd4549ab..0cfb4ad4b3 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/SelectMergeStrategy.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/SelectMergeStrategy.tsx @@ -15,18 +15,20 @@ */ import { + ComponentSizeType, + DOCUMENTATION_HOME_PAGE, + getSelectPickerOptionByValue, InfoIconTippy, + noop, OverrideMergeStrategyType, OverrideStrategyTippyContent, SelectPicker, SelectPickerOptionType, SelectPickerVariantType, - DOCUMENTATION_HOME_PAGE, - ComponentSizeType, - noop, - getSelectPickerOptionByValue, } from '@devtron-labs/devtron-fe-common-lib' + import { importComponentFromFELibrary } from '@Components/common' + import { MERGE_STRATEGY_OPTIONS } from './constants' import { SelectMergeStrategyProps } from './types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/constants.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/constants.tsx index f32e6cf570..327f0fe409 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/constants.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/constants.tsx @@ -14,9 +14,10 @@ * limitations under the License. */ -import { importComponentFromFELibrary } from '@Components/common' import { EnterpriseTag, OverrideMergeStrategyType, SelectPickerOptionType } from '@devtron-labs/devtron-fe-common-lib' +import { importComponentFromFELibrary } from '@Components/common' + const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', false, 'function') const IS_ENV_MERGE_STRATEGY_VALID = diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/index.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/index.ts index 3c883fc22a..c3d0303c8c 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/index.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/index.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -export * from './DeploymentTemplate' +export { default as CompareConfigView } from './CompareConfigView' export { default as ConfigDryRun } from './ConfigDryRun' +export { default as ConfigHeader } from './ConfigHeader' export { default as ConfigToolbar } from './ConfigToolbar' +export * from './DeploymentConfigCompare' +export * from './DeploymentTemplate' export { default as NoOverrideEmptyState } from './NoOverrideEmptyState' -export { default as ConfigHeader } from './ConfigHeader' export { default as NoPublishedVersionEmptyState } from './NoPublishedVersionEmptyState' -export { default as CompareConfigView } from './CompareConfigView' -export * from './DeploymentConfigCompare' export { default as SelectMergeStrategy } from './SelectMergeStrategy' - -export type { ConfigToolbarProps, CompareConfigViewProps } from './types' +export type { CompareConfigViewProps, ConfigToolbarProps } from './types' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/types.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/types.ts index af9f659e18..e717d83aac 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/types.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/types.ts @@ -14,7 +14,10 @@ * limitations under the License. */ +import { FunctionComponent, MutableRefObject, ReactNode } from 'react' + import { + CMSecretComponentType, CompareFromApprovalOptionsValuesType, ConfigHeaderTabType, ConfigToolbarPopupMenuConfigType, @@ -23,13 +26,12 @@ import { DeploymentTemplateConfigState, DraftMetadataDTO, OverrideMergeStrategyType, + PipelineMigratedFromType, ProtectConfigTabsType, SelectPickerOptionType, ServerErrors, - CMSecretComponentType, - PipelineMigratedFromType, } from '@devtron-labs/devtron-fe-common-lib' -import { FunctionComponent, MutableRefObject, ReactNode } from 'react' + import { DeploymentTemplateStateType } from './DeploymentTemplate/types' export interface ConfigHeaderProps { diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/utils.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/utils.tsx index 919ef21c7b..e099278f77 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/utils.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/MainContent/utils.tsx @@ -21,11 +21,13 @@ import { PipelineMigratedFromType, Tooltip, } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as ICFilePlay } from '@Icons/ic-file-play.svg' -import { ReactComponent as ICFileCode } from '@Icons/ic-file-code.svg' + import { ReactComponent as ICArrowSquareIn } from '@Icons/ic-arrow-square-in.svg' import { ReactComponent as ICDeleteInteractive } from '@Icons/ic-delete-interactive.svg' +import { ReactComponent as ICFileCode } from '@Icons/ic-file-code.svg' +import { ReactComponent as ICFilePlay } from '@Icons/ic-file-play.svg' import { importComponentFromFELibrary } from '@Components/common' + import { CompareConfigViewEditorConfigType, ConfigHeaderTabConfigType, diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/AppNavigation.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/AppNavigation.tsx index 04c2d37769..bd1e7a6566 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/AppNavigation.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/AppNavigation.tsx @@ -33,6 +33,7 @@ import { ReactNode } from 'react' import { Route, Switch, useLocation, useRouteMatch } from 'react-router-dom' + import { Button, ButtonStyleType, @@ -42,16 +43,16 @@ import { TippyCustomized, TippyTheme, } from '@devtron-labs/devtron-fe-common-lib' -import { DEVTRON_APPS_STEPS, STAGE_NAME } from '../AppConfig.types' + +import DockerFileInUse from '../../../../../../assets/img/ic-dockerfile-in-use.png' import { DEPLOYMENT_CONFIGURATION_RESOURCE_TYPE_ROUTE, URLS } from '../../../../../../config' -import AppConfigurationCheckBox from './AppConfigurationCheckBox' import { GIT_MATERIAL_IN_USE_MESSAGE } from '../../../../../../config/constantMessaging' -import DockerFileInUse from '../../../../../../assets/img/ic-dockerfile-in-use.png' - -import EnvironmentOverrideRouter from './EnvironmentOverrideRouter' +import { DEVTRON_APPS_STEPS, STAGE_NAME } from '../AppConfig.types' import { useAppConfigurationContext } from '../AppConfiguration.provider' -import { renderNavItem } from './Navigation.helper' +import AppConfigurationCheckBox from './AppConfigurationCheckBox' import { EnvConfigurationsNav } from './EnvConfigurationsNav' +import EnvironmentOverrideRouter from './EnvironmentOverrideRouter' +import { renderNavItem } from './Navigation.helper' export const AppNavigation = () => { // HOOKS diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvConfigurationsNav.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvConfigurationsNav.tsx index 1552918af2..9b6ba81625 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvConfigurationsNav.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvConfigurationsNav.tsx @@ -15,9 +15,10 @@ */ import { Dispatch, MouseEvent, useEffect, useMemo, useState } from 'react' -import { useRouteMatch, useLocation, NavLink, useHistory, generatePath } from 'react-router-dom' -import Tippy from '@tippyjs/react' +import ReactGA from 'react-ga4' +import { generatePath, NavLink, useHistory, useLocation, useRouteMatch } from 'react-router-dom' import { GroupBase, OptionsOrGroups } from 'react-select' +import Tippy from '@tippyjs/react' import { BASE_CONFIGURATION_ENV_ID, @@ -36,18 +37,17 @@ import { useMainContext, } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as ICBack } from '@Icons/ic-caret-left-small.svg' -import { ReactComponent as ICArrowsLeftRight } from '@Icons/ic-arrows-left-right.svg' import { ReactComponent as ICAdd } from '@Icons/ic-add.svg' -import { ReactComponent as ICLocked } from '@Icons/ic-locked.svg' +import { ReactComponent as ICArrowsLeftRight } from '@Icons/ic-arrows-left-right.svg' +import { ReactComponent as ICBack } from '@Icons/ic-caret-left-small.svg' import { ReactComponent as ICFileCode } from '@Icons/ic-file-code.svg' +import { ReactComponent as ICLocked } from '@Icons/ic-locked.svg' +import { DEPLOYMENT_CONFIGURATION_RESOURCE_TYPE_ROUTE } from '@Config/constants' import { URLS } from '@Config/routes' import { ResourceConfigState } from '@Pages/Applications/DevtronApps/service.types' -import { DEPLOYMENT_CONFIGURATION_RESOURCE_TYPE_ROUTE } from '@Config/constants' -import ReactGA from 'react-ga4' import { BASE_CONFIGURATIONS } from '../AppConfig.constants' -import { EnvConfigRouteParams, EnvConfigurationsNavProps, EnvConfigObjectKey, EnvConfigType } from '../AppConfig.types' +import { EnvConfigObjectKey, EnvConfigRouteParams, EnvConfigType, EnvConfigurationsNavProps } from '../AppConfig.types' import { getEnvConfiguration, getNavigationPath, getUnnamedIconConfig } from './Navigation.helper' // LOADING SHIMMER diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvironmentOverrideRouter.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvironmentOverrideRouter.tsx index bab787a61c..441735e5ea 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvironmentOverrideRouter.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/EnvironmentOverrideRouter.tsx @@ -14,34 +14,37 @@ * limitations under the License. */ -import { useState, useEffect, Fragment } from 'react' -import { useParams, useLocation, useRouteMatch, NavLink, Link } from 'react-router-dom' +import { Fragment, useEffect, useState } from 'react' +import { Link, NavLink, useLocation, useParams, useRouteMatch } from 'react-router-dom' + import { - showError, ConfirmationDialog, + DeleteConfirmationModal, + EnvResourceType, + getEnvironmentListMinPublic, InfoColourBar, PopupMenu, Progressing, - getEnvironmentListMinPublic, - ToastVariantType, - ToastManager, SelectPicker, - DeleteConfirmationModal, - EnvResourceType, + showError, + ToastManager, + ToastVariantType, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICStamp } from '@Icons/ic-stamp.svg' -import { URLS, DOCUMENTATION } from '../../../../../../config' -import { usePrevious, createClusterEnvGroup } from '../../../../../../components/common' -import { addJobEnvironment, deleteJobEnvironment, getCIConfig } from '../../../../../../services/service' -import { ReactComponent as Help } from '../../../../../../assets/icons/ic-help.svg' + import { ReactComponent as Add } from '../../../../../../assets/icons/ic-add.svg' -import { ReactComponent as More } from '../../../../../../assets/icons/ic-more-option.svg' import { ReactComponent as DeleteIcon } from '../../../../../../assets/icons/ic-delete-interactive.svg' +import { ReactComponent as Help } from '../../../../../../assets/icons/ic-help.svg' +import { ReactComponent as More } from '../../../../../../assets/icons/ic-more-option.svg' import warn from '../../../../../../assets/icons/ic-warning.svg' -import { AppConfigState, JobEnvOverrideRouteProps } from '../AppConfig.types' +import { createClusterEnvGroup, usePrevious } from '../../../../../../components/common' import { RESOURCE_ACTION_MENU } from '../../../../../../components/ResourceBrowser/Constants' -import { renderNavItem } from './Navigation.helper' +import { DOCUMENTATION, URLS } from '../../../../../../config' +import { addJobEnvironment, deleteJobEnvironment, getCIConfig } from '../../../../../../services/service' +import { AppConfigState, JobEnvOverrideRouteProps } from '../AppConfig.types' import { useAppConfigurationContext } from '../AppConfiguration.provider' +import { renderNavItem } from './Navigation.helper' const EnvOverridesHelpNote = () => (
diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/Navigation.helper.tsx b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/Navigation.helper.tsx index 523f227d85..9bc7fe1c63 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/Navigation.helper.tsx +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/Navigation.helper.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { NavLink, generatePath } from 'react-router-dom' +import { generatePath, NavLink } from 'react-router-dom' import { ApprovalConfigDataKindType, @@ -31,10 +31,10 @@ import { ResourceConfigStage, ResourceConfigState } from '@Pages/Applications/De import { CustomNavItemsType, + EnvConfigObjectKey, EnvConfigRouteParams, EnvConfigType, ExtendedCollapsibleListItem, - EnvConfigObjectKey, } from '../AppConfig.types' import { RESOURCE_CONFIG_STATE_TO_ICON_CONFIG_MAP } from './constants' diff --git a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/constants.ts b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/constants.ts index f607a078e2..1c25781558 100644 --- a/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/constants.ts +++ b/src/Pages/Applications/DevtronApps/Details/AppConfigurations/Navigation/constants.ts @@ -15,10 +15,11 @@ */ import { CollapsibleListItem } from '@devtron-labs/devtron-fe-common-lib' -import { ResourceConfigState } from '@Pages/Applications/DevtronApps/service.types' -import { ReactComponent as ICStamp } from '@Icons/ic-stamp.svg' -import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg' + import { ReactComponent as ICCheckCircleDots } from '@Icons/ic-check-circle-dots.svg' +import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg' +import { ReactComponent as ICStamp } from '@Icons/ic-stamp.svg' +import { ResourceConfigState } from '@Pages/Applications/DevtronApps/service.types' export const RESOURCE_CONFIG_STATE_TO_ICON_CONFIG_MAP: Record< ResourceConfigState, diff --git a/src/Pages/Applications/DevtronApps/service.ts b/src/Pages/Applications/DevtronApps/service.ts index 59a6f69a54..62bd6d2792 100644 --- a/src/Pages/Applications/DevtronApps/service.ts +++ b/src/Pages/Applications/DevtronApps/service.ts @@ -33,21 +33,21 @@ import { AppConfigProps, - GetTemplateAPIRouteType, - ResourceKindType, - ResponseType, get, + getTemplateAPIRoute, + GetTemplateAPIRouteType, getUrlWithSearchParams, noop, + ResourceKindType, + ResponseType, showError, - getTemplateAPIRoute, } from '@devtron-labs/devtron-fe-common-lib' import { Routes } from '@Config/constants' -import { AppConfigStatusItemType } from './service.types' import { DEFAULT_LANDING_STAGE, EnvConfigType } from './Details/AppConfigurations/AppConfig.types' import { transformEnvConfig } from './Details/AppConfigurations/AppConfig.utils' +import { AppConfigStatusItemType } from './service.types' export const getAppConfigStatus = ( appId: number, diff --git a/src/Pages/Applications/DevtronApps/service.types.ts b/src/Pages/Applications/DevtronApps/service.types.ts index 4674e7d2b8..5c0c6e9e79 100644 --- a/src/Pages/Applications/DevtronApps/service.types.ts +++ b/src/Pages/Applications/DevtronApps/service.types.ts @@ -32,6 +32,7 @@ */ import { ConfigResourceType } from '@devtron-labs/devtron-fe-common-lib' + import { STAGE_NAME } from './Details/AppConfigurations/AppConfig.types' export interface AppConfigStatusItemType { diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/APITokenList.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/APITokenList.tsx index c72304b24e..a852a6b498 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/APITokenList.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/APITokenList.tsx @@ -14,24 +14,27 @@ * limitations under the License. */ -import moment from 'moment' import { useState } from 'react' import { useHistory } from 'react-router-dom' +import moment from 'moment' + import { - GenericFilterEmptyState, - FeatureTitleWithInfo, Button, ButtonStyleType, ButtonVariantType, ComponentSizeType, + FeatureTitleWithInfo, + GenericFilterEmptyState, } from '@devtron-labs/devtron-fe-common-lib' -import { HEADER_TEXT, MomentDateFormat } from '../../../../config' + +import { ReactComponent as Trash } from '../../../../assets/icons/ic-delete-interactive.svg' import { ReactComponent as Key } from '../../../../assets/icons/ic-key-bulb.svg' import { ReactComponent as Edit } from '../../../../assets/icons/ic-pencil.svg' -import { ReactComponent as Trash } from '../../../../assets/icons/ic-delete-interactive.svg' +import { HEADER_TEXT, MomentDateFormat } from '../../../../config' import { APITokenListType, TokenListType } from './apiToken.type' import { isTokenExpired } from './apiToken.utils' import DeleteAPITokenModal from './DeleteAPITokenModal' + import './apiToken.scss' const APITokenList = ({ tokenList, renderSearchToken, reload }: APITokenListType) => { diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/ApiTokens.component.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/ApiTokens.component.tsx index e3457b9dd3..3888215b37 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/ApiTokens.component.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/ApiTokens.component.tsx @@ -15,22 +15,26 @@ */ import { useEffect, useState } from 'react' -import './apiToken.scss' +import { Redirect, Route, Switch, useHistory, useLocation, useRouteMatch } from 'react-router-dom' + import { - showError, - Progressing, ErrorScreenManager, GenericEmptyState, + Progressing, SearchBar, + showError, } from '@devtron-labs/devtron-fe-common-lib' -import { Redirect, Route, Switch, useHistory, useLocation, useRouteMatch } from 'react-router-dom' + import emptyGeneratToken from '@Images/ic-empty-generate-token.png' import { EMPTY_STATE_STATUS } from '@Config/constantMessaging' -import { getGeneratedAPITokenList } from './service' + +import { TokenListType, TokenResponseType } from './apiToken.type' import APITokenList from './APITokenList' import CreateAPIToken from './CreateAPIToken' import EditAPIToken from './EditAPIToken' -import { TokenListType, TokenResponseType } from './apiToken.type' +import { getGeneratedAPITokenList } from './service' + +import './apiToken.scss' const ApiTokens = () => { const { path } = useRouteMatch() diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/CreateAPIToken.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/CreateAPIToken.tsx index 33355735f7..6f7ff3641b 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/CreateAPIToken.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/CreateAPIToken.tsx @@ -19,35 +19,37 @@ import { useEffect, useState } from 'react' import { useHistory, useRouteMatch } from 'react-router-dom' import { Moment } from 'moment' + import { - ServerErrors, - showError, CustomInput, InfoIconTippy, - useMainContext, - ToastVariantType, - ToastManager, + ServerErrors, + showError, Textarea, + ToastManager, + ToastVariantType, + useMainContext, } from '@devtron-labs/devtron-fe-common-lib' -import { FormType, GenerateTokenType } from './apiToken.type' -import { createGeneratedAPIToken } from './service' -import GenerateModal from './GenerateModal' -import { getDateInMilliseconds } from './apiToken.utils' -import GenerateActionButton from './GenerateActionButton' -import { ValidationRules } from './validationRules' + import { ReactComponent as Error } from '../../../../assets/icons/ic-warning.svg' -import ExpirationDate from './ExpirationDate' +import { importComponentFromFELibrary } from '../../../../components/common' import { DOCUMENTATION, REQUIRED_FIELDS_MISSING } from '../../../../config' import { API_COMPONENTS } from '../../../../config/constantMessaging' import { createOrUpdateUser } from '../authorization.service' +import { getDefaultUserStatusAndTimeout } from '../libUtils' import { PermissionConfigurationForm, PermissionConfigurationFormProvider, usePermissionConfiguration, } from '../Shared/components/PermissionConfigurationForm' import { createUserPermissionPayload, validateDirectPermissionForm } from '../utils' -import { getDefaultUserStatusAndTimeout } from '../libUtils' -import { importComponentFromFELibrary } from '../../../../components/common' +import { FormType, GenerateTokenType } from './apiToken.type' +import { getDateInMilliseconds } from './apiToken.utils' +import ExpirationDate from './ExpirationDate' +import GenerateActionButton from './GenerateActionButton' +import GenerateModal from './GenerateModal' +import { createGeneratedAPIToken } from './service' +import { ValidationRules } from './validationRules' const showStatus = !!importComponentFromFELibrary('StatusHeaderCell', null, 'function') diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/DeleteAPITokenModal.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/DeleteAPITokenModal.tsx index bc651799fd..894fb962c9 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/DeleteAPITokenModal.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/DeleteAPITokenModal.tsx @@ -15,10 +15,13 @@ */ import { useHistory, useRouteMatch } from 'react-router-dom' -import { DeleteComponentsName } from '@Config/constantMessaging' + import { DeleteConfirmationModal } from '@devtron-labs/devtron-fe-common-lib' -import { deleteGeneratedAPIToken } from './service' + +import { DeleteComponentsName } from '@Config/constantMessaging' + import { DeleteAPITokenModalProps } from './apiToken.type' +import { deleteGeneratedAPIToken } from './service' const DeleteAPITokenModal = ({ isEditView, tokenData, reload, setDeleteConfirmation }: DeleteAPITokenModalProps) => { const match = useRouteMatch() diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/EditAPIToken.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/EditAPIToken.tsx index 6242644859..2cc59a4d6e 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/EditAPIToken.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/EditAPIToken.tsx @@ -16,42 +16,44 @@ /* eslint-disable jsx-a11y/label-has-associated-control */ import React, { useEffect, useState } from 'react' +import { useHistory, useParams, useRouteMatch } from 'react-router-dom' +import moment from 'moment' + import { - showError, - Progressing, - InfoColourBar, + ButtonWithLoader, + ClipboardButton, CustomInput, + InfoColourBar, noop, - ClipboardButton, - useMainContext, - ButtonWithLoader, - ToastVariantType, - ToastManager, + Progressing, + showError, Textarea, + ToastManager, + ToastVariantType, + useMainContext, } from '@devtron-labs/devtron-fe-common-lib' -import { useHistory, useRouteMatch, useParams } from 'react-router-dom' -import moment from 'moment' -import { ReactComponent as InfoIcon } from '../../../../assets/icons/info-filled.svg' -import RegeneratedModal from './RegenerateModal' -import { EditDataType, EditTokenType } from './apiToken.type' -import { isTokenExpired } from './apiToken.utils' + import { ReactComponent as Delete } from '../../../../assets/icons/ic-delete-interactive.svg' -import GenerateActionButton from './GenerateActionButton' -import { MomentDateFormat } from '../../../../config' +import { ReactComponent as InfoIcon } from '../../../../assets/icons/info-filled.svg' import { importComponentFromFELibrary } from '../../../../components/common' -import { updateGeneratedAPIToken } from './service' -import DeleteAPITokenModal from './DeleteAPITokenModal' +import { MomentDateFormat } from '../../../../config' import { API_COMPONENTS } from '../../../../config/constantMessaging' -import { renderQuestionwithTippy } from './CreateAPIToken' import { createOrUpdateUser, getUserById } from '../authorization.service' -import { User } from '../types' +import { getDefaultUserStatusAndTimeout } from '../libUtils' import { PermissionConfigurationForm, PermissionConfigurationFormProvider, usePermissionConfiguration, } from '../Shared/components/PermissionConfigurationForm' +import { User } from '../types' import { createUserPermissionPayload, validateDirectPermissionForm } from '../utils' -import { getDefaultUserStatusAndTimeout } from '../libUtils' +import { EditDataType, EditTokenType } from './apiToken.type' +import { isTokenExpired } from './apiToken.utils' +import { renderQuestionwithTippy } from './CreateAPIToken' +import DeleteAPITokenModal from './DeleteAPITokenModal' +import GenerateActionButton from './GenerateActionButton' +import RegeneratedModal from './RegenerateModal' +import { updateGeneratedAPIToken } from './service' const showStatus = !!importComponentFromFELibrary('StatusHeaderCell', null, 'function') diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/ExpirationDate.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/ExpirationDate.tsx index 408158cfca..8fe9d078e4 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/ExpirationDate.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/ExpirationDate.tsx @@ -16,11 +16,13 @@ /* eslint-disable react/prop-types */ import moment from 'moment' + import { InfoColourBar, SelectPicker } from '@devtron-labs/devtron-fe-common-lib' -import { MomentDateFormat } from '../../../../config' -import { SingleDatePickerComponent } from '../../../../components/common' -import { getOptions, getDateInMilliseconds } from './apiToken.utils' + import { ReactComponent as Warn } from '../../../../assets/icons/ic-warning.svg' +import { SingleDatePickerComponent } from '../../../../components/common' +import { MomentDateFormat } from '../../../../config' +import { getDateInMilliseconds, getOptions } from './apiToken.utils' const ExpirationDate = ({ selectedExpirationDate, onChangeSelectFormData, handleDatesChange, customDate }) => (
diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateActionButton.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateActionButton.tsx index c85169addf..b102e07c3c 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateActionButton.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateActionButton.tsx @@ -15,6 +15,7 @@ */ import { ButtonWithLoader } from '@devtron-labs/devtron-fe-common-lib' + import { GenerateActionButtonType } from './apiToken.type' const GenerateActionButton = ({ diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateModal.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateModal.tsx index 4f359b5e2e..9607f8f3c8 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateModal.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/GenerateModal.tsx @@ -15,17 +15,19 @@ */ import { useState } from 'react' + import { Button, ButtonVariantType, ClipboardButton, ComponentSizeType, - VisibleModal, copyToClipboard, + VisibleModal, } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as Success } from '../../../../assets/icons/ic-success-outline.svg' + import { ReactComponent as Close } from '../../../../assets/icons/ic-close.svg' import { ReactComponent as Key } from '../../../../assets/icons/ic-key-bulb.svg' +import { ReactComponent as Success } from '../../../../assets/icons/ic-success-outline.svg' import { GenerateTokenModalType } from './apiToken.type' const GenerateModal = ({ close, token, reload, redirectToTokenList, isRegenerationModal }: GenerateTokenModalType) => { diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/RegenerateModal.tsx b/src/Pages/GlobalConfigurations/Authorization/APITokens/RegenerateModal.tsx index 9c5ac78018..d6231307b9 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/RegenerateModal.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/RegenerateModal.tsx @@ -15,15 +15,17 @@ */ import { useState } from 'react' -import { showError, Progressing, VisibleModal, InfoColourBar } from '@devtron-labs/devtron-fe-common-lib' + +import { InfoColourBar, Progressing, showError, VisibleModal } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as Close } from '../../../../assets/icons/ic-close.svg' import { ReactComponent as Warn } from '../../../../assets/icons/ic-warning.svg' -import GenerateActionButton from './GenerateActionButton' -import { getDateInMilliseconds } from './apiToken.utils' import { RegenerateModalType, TokenResponseType } from './apiToken.type' -import { updateGeneratedAPIToken } from './service' -import GenerateModal from './GenerateModal' +import { getDateInMilliseconds } from './apiToken.utils' import ExpirationDate from './ExpirationDate' +import GenerateActionButton from './GenerateActionButton' +import GenerateModal from './GenerateModal' +import { updateGeneratedAPIToken } from './service' const RegeneratedModal = ({ close, diff --git a/src/Pages/GlobalConfigurations/Authorization/APITokens/service.ts b/src/Pages/GlobalConfigurations/Authorization/APITokens/service.ts index eccd716cad..e5656ef653 100644 --- a/src/Pages/GlobalConfigurations/Authorization/APITokens/service.ts +++ b/src/Pages/GlobalConfigurations/Authorization/APITokens/service.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { get, post, put, trash, ResponseType } from '@devtron-labs/devtron-fe-common-lib' +import { get, post, put, ResponseType, trash } from '@devtron-labs/devtron-fe-common-lib' + import { Routes } from '../../../../config' export function getGeneratedAPITokenList(): Promise { diff --git a/src/Pages/GlobalConfigurations/Authorization/Authorization.component.tsx b/src/Pages/GlobalConfigurations/Authorization/Authorization.component.tsx index b79883c04d..31743ee2fb 100644 --- a/src/Pages/GlobalConfigurations/Authorization/Authorization.component.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/Authorization.component.tsx @@ -16,7 +16,9 @@ import { lazy } from 'react' import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom' + import { Routes } from '../../../config' + import './authorization.scss' const UserAndGroupPermissions = lazy(() => import('./UserAndGroupPermissions')) diff --git a/src/Pages/GlobalConfigurations/Authorization/AuthorizationProvider.tsx b/src/Pages/GlobalConfigurations/Authorization/AuthorizationProvider.tsx index 2962d5e406..2aa74a950b 100644 --- a/src/Pages/GlobalConfigurations/Authorization/AuthorizationProvider.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/AuthorizationProvider.tsx @@ -15,6 +15,7 @@ */ import { createContext, useContext } from 'react' + import { AuthorizationContextProps, AuthorizationProviderProps } from './types' const AuthorizationContext = createContext({ diff --git a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupAddEdit.component.tsx b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupAddEdit.component.tsx index 96274a963a..70a2e50d27 100644 --- a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupAddEdit.component.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupAddEdit.component.tsx @@ -14,16 +14,18 @@ * limitations under the License. */ +import { Link, useParams } from 'react-router-dom' + import { - ErrorScreenNotAuthorized, ERROR_EMPTY_SCREEN, + ErrorScreenNotAuthorized, GenericEmptyState, Progressing, Reload, TOAST_ACCESS_DENIED, useAsync, } from '@devtron-labs/devtron-fe-common-lib' -import { Link, useParams } from 'react-router-dom' + import { API_STATUS_CODES, URLS } from '../../../../../config' import { getPermissionGroupById } from '../../authorization.service' import { PermissionConfigurationFormProvider } from '../../Shared/components/PermissionConfigurationForm' diff --git a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupForm.tsx b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupForm.tsx index c8a650f7e8..b2a9225cb2 100644 --- a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupForm.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/AddEdit/PermissionGroupForm.tsx @@ -14,35 +14,37 @@ * limitations under the License. */ -import { useState, useEffect } from 'react' +import { useEffect, useState } from 'react' +import { Link, useHistory } from 'react-router-dom' + import { - showError, - CustomInput, - useMainContext, - ToastVariantType, - ToastManager, + Button, ButtonComponentType, + ButtonStyleType, ButtonVariantType, ComponentSizeType, - ButtonStyleType, - Button, + CustomInput, + showError, Textarea, + ToastManager, + ToastVariantType, + useMainContext, } from '@devtron-labs/devtron-fe-common-lib' -import { Link, useHistory } from 'react-router-dom' + import { ReactComponent as ICDeleteInteractive } from '@Icons/ic-delete-interactive.svg' import { ReactComponent as ICWarning } from '@Icons/ic-warning.svg' -import { deepEqual } from '../../../../../components/common' +import { deepEqual } from '../../../../../components/common' import { URLS } from '../../../../../config' -import { PermissionGroup, PermissionGroupCreateOrUpdatePayload } from '../../types' import { createOrUpdatePermissionGroup, deletePermissionGroup } from '../../authorization.service' +import { excludeKeyAndClusterValue } from '../../Shared/components/K8sObjectPermissions/utils' import { PermissionConfigurationForm, usePermissionConfiguration, } from '../../Shared/components/PermissionConfigurationForm' -import { getIsSuperAdminPermission, getRolesAndAccessRoles, validateDirectPermissionForm } from '../../utils' -import { excludeKeyAndClusterValue } from '../../Shared/components/K8sObjectPermissions/utils' +import { PermissionGroup, PermissionGroupCreateOrUpdatePayload } from '../../types' import { DeleteUserPermission } from '../../UserPermissions/DeleteUserPermission' +import { getIsSuperAdminPermission, getRolesAndAccessRoles, validateDirectPermissionForm } from '../../utils' const PermissionGroupForm = ({ isAddMode }: { isAddMode: boolean }) => { const { serverMode } = useMainContext() diff --git a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/ExportPermissionGroupsToCsv.tsx b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/ExportPermissionGroupsToCsv.tsx index 34ada23150..7ef385691b 100644 --- a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/ExportPermissionGroupsToCsv.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/ExportPermissionGroupsToCsv.tsx @@ -14,11 +14,11 @@ * limitations under the License. */ -import { PermissionGroupListHeaderProps } from './types' -import ExportToCsv from '../../../../../components/common/ExportToCsv/ExportToCsv' import { FILE_NAMES, GROUP_EXPORT_HEADER_ROW } from '../../../../../components/common/ExportToCsv/constants' +import ExportToCsv from '../../../../../components/common/ExportToCsv/ExportToCsv' import { useAuthorizationContext } from '../../AuthorizationProvider' import { getRoleFiltersToExport } from '../../utils' +import { PermissionGroupListHeaderProps } from './types' const ExportPermissionGroupsToCsv = ({ disabled, diff --git a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/NoPermissionGroups.tsx b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/NoPermissionGroups.tsx index e0074b792d..7676640262 100644 --- a/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/NoPermissionGroups.tsx +++ b/src/Pages/GlobalConfigurations/Authorization/PermissionGroups/List/NoPermissionGroups.tsx @@ -15,10 +15,11 @@ */ import { Button, ButtonComponentType, ComponentSizeType, GenericEmptyState } from '@devtron-labs/devtron-fe-common-lib' -import nullStateImage from '../../../../../assets/img/empty-applist@2x.png' + import { ReactComponent as AddIcon } from '../../../../../assets/icons/ic-add.svg' -import { EMPTY_STATE_STATUS } from '../../../../../config/constantMessaging' +import nullStateImage from '../../../../../assets/img/empty-applist@2x.png' import { URLS } from '../../../../../config' +import { EMPTY_STATE_STATUS } from '../../../../../config/constantMessaging' const renderAddGroupButton = () => ( + size={ComponentSizeType.xs} + icon={} + ariaLabel="close bulk cd trigger modal" + showAriaLabelInTippy={false} + style={ButtonStyleType.negativeGrey} + variant={ButtonVariantType.borderLess} + />
) } @@ -835,7 +843,7 @@ export default function BulkCDTrigger({ } else { isBulkDeploymentTriggered.current = true stopPropagation(e) - onClickTriggerBulkCD() + onClickTriggerBulkCD(skipHibernatedApps) setShowResistanceBox(false) } } @@ -848,8 +856,21 @@ export default function BulkCDTrigger({ const renderFooterSection = (): JSX.Element => { const isDeployButtonDisabled: boolean = isDeployDisabled() + const showSkipHibernatedCheckbox = !!SkipHibernatedCheckbox && canFetchHelmAppStatus return ( -
+
+ {showSkipHibernatedCheckbox && ( + app.appId)} + skipHibernated={skipHibernatedApps} + setSkipHibernated={setSkipHibernatedApps} + /> + )}
{!isDeployButtonDisabled && stage === DeploymentNodeType.CD && !isLoading ? ( @@ -874,7 +895,7 @@ export default function BulkCDTrigger({ return (
-
+
{renderHeaderSection()} {responseListLength ? ( ) : ( renderFooterSection() diff --git a/src/components/ApplicationGroup/Details/TriggerView/BulkSourceChange.tsx b/src/components/ApplicationGroup/Details/TriggerView/BulkSourceChange.tsx index 06858433a8..944d49fe98 100644 --- a/src/components/ApplicationGroup/Details/TriggerView/BulkSourceChange.tsx +++ b/src/components/ApplicationGroup/Details/TriggerView/BulkSourceChange.tsx @@ -14,6 +14,8 @@ * limitations under the License. */ +import React, { useEffect, useRef, useState } from 'react' + import { Button, ButtonStyleType, @@ -22,7 +24,7 @@ import { Drawer, InfoColourBar, } from '@devtron-labs/devtron-fe-common-lib' -import React, { useEffect, useRef, useState } from 'react' + import { ReactComponent as Close } from '../../../../assets/icons/ic-cross.svg' import { ReactComponent as Warn } from '../../../../assets/icons/ic-warning.svg' import SourceUpdateResponseModal from './SourceUpdateResponseModal' diff --git a/src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx b/src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx index 87945322bf..700e40260e 100644 --- a/src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx +++ b/src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx @@ -55,6 +55,7 @@ import { ButtonStyleType, ButtonVariantType, ComponentSizeType, + API_STATUS_CODES, } from '@devtron-labs/devtron-fe-common-lib' import Tippy from '@tippyjs/react' import { BUILD_STATUS, DEFAULT_GIT_BRANCH_VALUE, NO_COMMIT_SELECTED, URLS, ViewType } from '../../../../config' @@ -125,6 +126,8 @@ import { LinkedCIDetail } from '../../../../Pages/Shared/LinkedCIDetailsModal' import CIMaterialModal from '../../../app/details/triggerView/CIMaterialModal' import { RenderCDMaterialContentProps } from './types' import { WebhookReceivedPayloadModal } from '@Components/app/details/triggerView/WebhookReceivedPayloadModal' +import { getExternalCIConfig } from '@Components/ciPipeline/Webhook/webhook.service' +import { shouldRenderWebhookAddImageModal } from '@Components/app/details/triggerView/TriggerView.utils' const ApprovalMaterialModal = importComponentFromFELibrary('ApprovalMaterialModal') const getCIBlockState: (...props) => Promise = importComponentFromFELibrary( @@ -145,6 +148,7 @@ const validateRuntimeParameters = importComponentFromFELibrary( 'function', ) const ChangeImageSource = importComponentFromFELibrary('ChangeImageSource', null, 'function') +const WebhookAddImageModal = importComponentFromFELibrary('WebhookAddImageModal', null, 'function') // FIXME: IN CIMaterials we are sending isCDLoading while in CD materials we are sending isCILoading let inprogressStatusTimer @@ -192,6 +196,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou const [runtimeParams, setRuntimeParams] = useState>({}) const [runtimeParamsErrorState, setRuntimeParamsErrorState] = useState>({}) const [isBulkTriggerLoading, setIsBulkTriggerLoading] = useState(false) + const [selectedWebhookNode, setSelectedWebhookNode] = useState<{ appId: number; id: number }>(null) const selectedWorkflows = filteredWorkflows.filter((wf) => wf.isSelected) @@ -1429,7 +1434,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou return true } - const onClickTriggerBulkCD = (appsToRetry?: Record) => { + const onClickTriggerBulkCD = (skipIfHibernated: boolean, appsToRetry?: Record) => { if (isCDLoading || !validateBulkRuntimeParams()) { return } @@ -1482,6 +1487,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou ...(getRuntimeParamsPayload ? { runtimeParamsPayload: getRuntimeParamsPayload(runtimeParams[currentAppId] ?? []) } : {}), + skipIfHibernated, }), ) } else { @@ -1544,19 +1550,19 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou }) } else { const errorReason = response.reason - if (errorReason.code === 409) { + if (errorReason.code === API_STATUS_CODES.EXPECTATION_FAILED) { const statusType = filterStatusType( type, - BULK_CI_RESPONSE_STATUS_TEXT[BulkResponseStatus.FAIL], - BULK_VIRTUAL_RESPONSE_STATUS[BulkResponseStatus.FAIL], - BULK_CD_RESPONSE_STATUS_TEXT[BulkResponseStatus.FAIL], + BULK_CI_RESPONSE_STATUS_TEXT[BulkResponseStatus.SKIP], + BULK_VIRTUAL_RESPONSE_STATUS[BulkResponseStatus.SKIP], + BULK_CD_RESPONSE_STATUS_TEXT[BulkResponseStatus.SKIP], ) _responseList.push({ appId: triggeredAppList[index].appId, appName: triggeredAppList[index].appName, statusText: statusType, - status: BulkResponseStatus.FAIL, - message: errorReason.errors[0].internalMessage, + status: BulkResponseStatus.SKIP, + message: errorReason.errors[0].userMessage, }) } else if (errorReason.code === 403 || errorReason.code === 422) { // Adding 422 to handle the unauthorized state due to deployment window @@ -1941,7 +1947,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou } if (!filteredWorkflows.length) { return ( -
+
) @@ -2099,7 +2105,7 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou ) } - const renderBulkSourchChange = (): JSX.Element | null => { + const renderBulkSourceChange = (): JSX.Element | null => { if (!showBulkSourceChangeModal) { return null } @@ -2381,6 +2387,31 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou history.push(match.url) } + const getWebhookDetails = () => getExternalCIConfig(selectedWebhookNode.appId, selectedWebhookNode.id, false) + + const handleWebhookAddImageClick = (appId: number) => (id: number) => { + setSelectedWebhookNode({ appId, id }) + } + + const handleWebhookAddImageModalClose = () => { + setSelectedWebhookNode(null) + } + + const renderWebhookAddImageModal = () => { + if ( + WebhookAddImageModal && + shouldRenderWebhookAddImageModal(location) && + !location.pathname.includes('bulk-deploy/request') && + selectedWebhookNode + ) { + return ( + + ) + } + + return null + } + const renderWorkflow = (): JSX.Element => { return ( <> @@ -2403,10 +2434,12 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou location={location} match={match} index={index} + handleWebhookAddImageClick={handleWebhookAddImageClick(workflow.appId)} /> ) })} + {renderWebhookAddImageModal()} ) } @@ -2452,12 +2485,12 @@ export default function EnvTriggerView({ filteredAppIds, isVirtualEnv }: AppGrou {renderBulkCDMaterial()} {renderBulkCIMaterial()} {renderApprovalMaterial()} - {renderBulkSourchChange()} + {renderBulkSourceChange()}
{!!selectedAppList.length && ( -
+
{renderSelectedApps()} {renderBulkTriggerActionButtons()}
diff --git a/src/components/ApplicationGroup/Details/TriggerView/SourceUpdateResponseModal.tsx b/src/components/ApplicationGroup/Details/TriggerView/SourceUpdateResponseModal.tsx index dd5821cfe2..b02b3b454c 100644 --- a/src/components/ApplicationGroup/Details/TriggerView/SourceUpdateResponseModal.tsx +++ b/src/components/ApplicationGroup/Details/TriggerView/SourceUpdateResponseModal.tsx @@ -15,6 +15,7 @@ */ import { Progressing } from '@devtron-labs/devtron-fe-common-lib' + import { TriggerModalRow } from './TriggerModalTableRow' import { SourceUpdateResponseModalProps } from './types' diff --git a/src/components/ApplicationGroup/Details/TriggerView/TriggerModalTableRow.tsx b/src/components/ApplicationGroup/Details/TriggerView/TriggerModalTableRow.tsx index 4b41fecbed..94b15d488d 100644 --- a/src/components/ApplicationGroup/Details/TriggerView/TriggerModalTableRow.tsx +++ b/src/components/ApplicationGroup/Details/TriggerView/TriggerModalTableRow.tsx @@ -15,13 +15,14 @@ */ import { useDownload } from '@devtron-labs/devtron-fe-common-lib' -import { ResponseRowType, TriggerModalRowType } from '../../AppGroup.types' -import { ReactComponent as Error } from '../../../../assets/icons/ic-error-exclamation.svg' + import { ReactComponent as Success } from '../../../../assets/icons/appstatus/healthy.svg' -import { ReactComponent as UnAuthorized } from '../../../../assets/icons/ic-locked.svg' +import { ReactComponent as Error } from '../../../../assets/icons/ic-error-exclamation.svg' import { ReactComponent as ICInfoFilled } from '../../../../assets/icons/ic-info-filled.svg' -import { BulkResponseStatus } from '../../Constants' +import { ReactComponent as UnAuthorized } from '../../../../assets/icons/ic-locked.svg' import { importComponentFromFELibrary } from '../../../common' +import { ResponseRowType, TriggerModalRowType } from '../../AppGroup.types' +import { BulkResponseStatus } from '../../Constants' const DownloadManifestForVirtualEnvironmentButton = importComponentFromFELibrary( 'DownloadManifestForVirtualEnvironmentButton', diff --git a/src/components/ApplicationGroup/Details/TriggerView/TriggerResponseModal.tsx b/src/components/ApplicationGroup/Details/TriggerView/TriggerResponseModal.tsx index e6d88bb174..29a6e81d58 100644 --- a/src/components/ApplicationGroup/Details/TriggerView/TriggerResponseModal.tsx +++ b/src/components/ApplicationGroup/Details/TriggerView/TriggerResponseModal.tsx @@ -15,6 +15,7 @@ */ import React from 'react' + import { Button, ButtonStyleType, @@ -22,6 +23,7 @@ import { Progressing, sortCallback, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as RetryIcon } from '../../../../assets/icons/ic-arrow-clockwise.svg' import { TriggerResponseModalBodyProps, TriggerResponseModalFooterProps } from '../../AppGroup.types' import { BulkResponseStatus } from '../../Constants' @@ -31,7 +33,9 @@ export const TriggerResponseModalFooter = ({ closePopup, isLoading, responseList, + skipHibernatedApps, onClickRetryBuild, + onClickRetryDeploy, }: TriggerResponseModalFooterProps) => { const isShowRetryButton = responseList?.some((response) => response.status === BulkResponseStatus.FAIL) @@ -43,7 +47,12 @@ export const TriggerResponseModalFooter = ({ appsToRetry[response.appId] = true } }) - onClickRetryBuild(appsToRetry) + + if (onClickRetryBuild) { + onClickRetryBuild(appsToRetry) + } else { + onClickRetryDeploy(skipHibernatedApps, appsToRetry) + } } return ( diff --git a/src/components/ApplicationGroup/EnvEmptyStates.tsx b/src/components/ApplicationGroup/EnvEmptyStates.tsx index 99b55ba5c9..d68c7192ba 100644 --- a/src/components/ApplicationGroup/EnvEmptyStates.tsx +++ b/src/components/ApplicationGroup/EnvEmptyStates.tsx @@ -15,6 +15,7 @@ */ import { GenericFilterEmptyState } from '@devtron-labs/devtron-fe-common-lib' + import { EmptyEnvState } from './AppGroup.types' export const EnvEmptyStates = ({ actionHandler }: EmptyEnvState) => ( diff --git a/src/components/ApplicationGroup/EnvSelector.tsx b/src/components/ApplicationGroup/EnvSelector.tsx index 10099eaca2..dd10151a9d 100644 --- a/src/components/ApplicationGroup/EnvSelector.tsx +++ b/src/components/ApplicationGroup/EnvSelector.tsx @@ -16,12 +16,14 @@ import { useRef } from 'react' import AsyncSelect from 'react-select/async' + import { abortPreviousRequests, - AppSelectorNoOptionsMessage, - AppSelectorDropdownIndicator, APP_SELECTOR_STYLES, + AppSelectorDropdownIndicator, + AppSelectorNoOptionsMessage, } from '@devtron-labs/devtron-fe-common-lib' + import { EnvSelectorType } from './AppGroup.types' import { envListOptions } from './AppGroup.utils' diff --git a/src/components/ApplicationGroup/List/EnvironmentListView.tsx b/src/components/ApplicationGroup/List/EnvironmentListView.tsx index 6029116e0b..72bbd37ad6 100644 --- a/src/components/ApplicationGroup/List/EnvironmentListView.tsx +++ b/src/components/ApplicationGroup/List/EnvironmentListView.tsx @@ -14,19 +14,21 @@ * limitations under the License. */ -import { useState, useEffect } from 'react' +import { useEffect, useState } from 'react' +import { NavLink } from 'react-router-dom' + import { DEFAULT_BASE_PAGE_SIZE, + Icon, Pagination, ToastManager, ToastVariantType, - Icon, } from '@devtron-labs/devtron-fe-common-lib' -import { NavLink } from 'react-router-dom' -import { EnvEmptyStates } from '../EnvEmptyStates' + import { useAppContext } from '../../common' +import { EnvApp, EnvAppList, EnvironmentLinkProps, EnvironmentsListViewType } from '../AppGroup.types' import { EMPTY_LIST_MESSAGING, GROUP_LIST_HEADER, NO_ACCESS_TOAST_MESSAGE } from '../Constants' -import { EnvironmentsListViewType, EnvAppList, EnvironmentLinkProps, EnvApp } from '../AppGroup.types' +import { EnvEmptyStates } from '../EnvEmptyStates' import { LoadingShimmerList } from './LoadingShimmer' const EnvironmentLink = ({ diff --git a/src/components/ApplicationGroup/List/EnvironmentsList.tsx b/src/components/ApplicationGroup/List/EnvironmentsList.tsx index c1065e6017..f4833e28a1 100644 --- a/src/components/ApplicationGroup/List/EnvironmentsList.tsx +++ b/src/components/ApplicationGroup/List/EnvironmentsList.tsx @@ -15,25 +15,29 @@ */ import { useMemo } from 'react' + import { - useAsync, - PageHeader, - SearchBar, - useUrlFilters, - SelectPickerOptionType, - FilterSelectPicker, + ErrorScreenManager, FilterChips, + FilterSelectPicker, GenericEmptyState, - ErrorScreenManager, ImageType, + PageHeader, + SearchBar, + SelectPickerOptionType, + useAsync, + useUrlFilters, } from '@devtron-labs/devtron-fe-common-lib' + import appGroupEmpty from '@Images/application-group-empty-state.webp' -import './EnvironmentsList.scss' -import EnvironmentsListView from './EnvironmentListView' + import { getClusterListMinWithoutAuth } from '../../../services/service' +import { getEnvAppList } from '../AppGroup.service' import { AppGroupAdminType, AppGroupUrlFilters, AppGroupUrlFiltersType } from '../AppGroup.types' import { parseSearchParams } from '../AppGroup.utils' -import { getEnvAppList } from '../AppGroup.service' +import EnvironmentsListView from './EnvironmentListView' + +import './EnvironmentsList.scss' const EnvironmentsList = ({ isSuperAdmin }: AppGroupAdminType) => { const urlFilters = useUrlFilters({ diff --git a/src/components/ApplicationGroup/List/LoadingShimmer/LoadingShimmerList.tsx b/src/components/ApplicationGroup/List/LoadingShimmer/LoadingShimmerList.tsx index 0cf62f7d74..ccfdd09d7f 100644 --- a/src/components/ApplicationGroup/List/LoadingShimmer/LoadingShimmerList.tsx +++ b/src/components/ApplicationGroup/List/LoadingShimmer/LoadingShimmerList.tsx @@ -14,9 +14,10 @@ * limitations under the License. */ -import './loadingShimmerList.scss' import { LoadingShimmerListType } from './types' +import './loadingShimmerList.scss' + const renderShimmer = () =>
export const LoadingShimmerList = ({ hideLastColumn = false }: LoadingShimmerListType) => { diff --git a/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormContent.tsx b/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormContent.tsx index 26a7fbba80..c8edda17e2 100644 --- a/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormContent.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormContent.tsx @@ -14,6 +14,8 @@ * limitations under the License. */ +import { ReactNode } from 'react' + import { APIResponseHandler, ComponentSizeType, @@ -30,14 +32,15 @@ import { TippyCustomized, TippyTheme, } from '@devtron-labs/devtron-fe-common-lib' -import { ReactComponent as ICLegoBlock } from '@Icons/ic-lego-block.svg' -import { ReactComponent as ICVisibilityOn } from '@Icons/ic-visibility-on.svg' + import { ReactComponent as ICHelp } from '@Icons/ic-help.svg' +import { ReactComponent as ICLegoBlock } from '@Icons/ic-lego-block.svg' import { ReactComponent as ICTag } from '@Icons/ic-tag.svg' -import { ReactNode } from 'react' -import { CreatePluginActionType, CreatePluginFormContentProps, CreatePluginFormViewType } from './types' +import { ReactComponent as ICVisibilityOn } from '@Icons/ic-visibility-on.svg' + import CreatePluginFormField from './CreatePluginFormField' import CreatePluginInputVariableContainer from './CreatePluginInputVariableContainer' +import { CreatePluginActionType, CreatePluginFormContentProps, CreatePluginFormViewType } from './types' import { getIsTagValid, getSelectPickerOptionsFromParentPluginList } from './utils' const CreatePluginFormContent = ({ diff --git a/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormField.tsx b/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormField.tsx index 15c0735dce..5b69549f04 100644 --- a/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormField.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/CreatePluginFormField.tsx @@ -15,7 +15,9 @@ */ import { SyntheticEvent } from 'react' + import { CustomInput, Textarea } from '@devtron-labs/devtron-fe-common-lib' + import { CreatePluginFormFieldProps } from './types' const CreatePluginFormField = ({ action, handleChange, useTextArea, ...props }: CreatePluginFormFieldProps) => { diff --git a/src/components/CIPipelineN/CreatePluginModal/CreatePluginInputVariableContainer.tsx b/src/components/CIPipelineN/CreatePluginModal/CreatePluginInputVariableContainer.tsx index 57bdea67ae..c37d77fc07 100644 --- a/src/components/CIPipelineN/CreatePluginModal/CreatePluginInputVariableContainer.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/CreatePluginInputVariableContainer.tsx @@ -15,7 +15,9 @@ */ import { Toggle } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICAsterisk } from '@Icons/ic-asterisk.svg' + import { CreatePluginActionType, CreatePluginInputVariableContainerProps, InputVariableItemProps } from './types' const InputVariableItem = ({ handleChange, index, name, allowEmptyValue }: InputVariableItemProps) => { diff --git a/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx b/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx index 1bb1f9b47b..cdd35252ac 100644 --- a/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx @@ -15,9 +15,11 @@ */ import { useContext, useEffect, useRef, useState } from 'react' -import { useParams } from 'react-router-dom' import ReactGA from 'react-ga4' +import { useParams } from 'react-router-dom' + import { + abortPreviousRequests, BuildStageVariable, ButtonWithLoader, Checkbox, @@ -27,40 +29,42 @@ import { getIsRequestAborted, getPluginsDetail, getUpdatedPluginStore, + PluginDataStoreType, PluginType, + RefVariableType, ServerErrors, showError, StepType, stopPropagation, + ToastManager, + ToastVariantType, useAsync, validateDescription, validateDisplayName, validateName, + validateSemanticVersioning, VariableType, VisibleModal2, - validateSemanticVersioning, - PluginDataStoreType, - abortPreviousRequests, - ToastManager, - ToastVariantType, - RefVariableType, } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICCross } from '@Icons/ic-cross.svg' import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + +import { CREATE_PLUGIN_DEFAULT_FORM_ERROR } from './constants' import CreatePluginFormContent from './CreatePluginFormContent' +import { createPlugin, getParentPluginList } from './service' import { + CreatePluginActionType, + CreatePluginFormContentProps, + CreatePluginFormErrorType, CreatePluginFormType, CreatePluginHandleChangeType, CreatePluginModalProps, CreatePluginModalURLParamsType, - CreatePluginActionType, - CreatePluginFormErrorType, - CreatePluginFormContentProps, HandleCreatePluginReturnType, } from './types' -import { createPlugin, getParentPluginList } from './service' -import { CREATE_PLUGIN_DEFAULT_FORM_ERROR } from './constants' import { getDefaultPluginFormData, validateDocumentationLink, validateTags } from './utils' + import './CreatePluginModal.scss' const CreatePluginModal = ({ handleClose }: CreatePluginModalProps) => { diff --git a/src/components/CIPipelineN/CreatePluginModal/service.tsx b/src/components/CIPipelineN/CreatePluginModal/service.tsx index 341f46781e..e97ac11182 100644 --- a/src/components/CIPipelineN/CreatePluginModal/service.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/service.tsx @@ -21,7 +21,9 @@ import { ResponseType, showError, } from '@devtron-labs/devtron-fe-common-lib' + import { Routes } from '@Config/constants' + import { CreatePluginAPIParamsType, CreatePluginServiceParamsType, diff --git a/src/components/CIPipelineN/CreatePluginModal/utils.tsx b/src/components/CIPipelineN/CreatePluginModal/utils.tsx index 7e6049e102..ea4473b009 100644 --- a/src/components/CIPipelineN/CreatePluginModal/utils.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/utils.tsx @@ -22,18 +22,19 @@ import { ValidationResponseType, VariableType, } from '@devtron-labs/devtron-fe-common-lib' + +import { CREATE_PLUGIN_DEFAULT_FORM, MAX_TAG_LENGTH } from './constants' import { CreatePluginFormType, CreatePluginPayloadPipelineScriptDTO, - PathPortMappingType, - GetCreatePluginPayloadParamsType, + CreatePluginPayloadPluginStepVariableItemType, CreatePluginPayloadType, - ParentPluginListItemType, - GetSelectPickerOptionsFromParentPluginListReturnType, CreatePluginVariableType, - CreatePluginPayloadPluginStepVariableItemType, + GetCreatePluginPayloadParamsType, + GetSelectPickerOptionsFromParentPluginListReturnType, + ParentPluginListItemType, + PathPortMappingType, } from './types' -import { CREATE_PLUGIN_DEFAULT_FORM, MAX_TAG_LENGTH } from './constants' export const getDefaultPluginFormData = (currentInputVariables: VariableType[]): CreatePluginFormType => ({ ...structuredClone(CREATE_PLUGIN_DEFAULT_FORM), diff --git a/src/components/CIPipelineN/CustomImageTag.type.ts b/src/components/CIPipelineN/CustomImageTag.type.ts index 4caac0265f..7df8a9ea83 100644 --- a/src/components/CIPipelineN/CustomImageTag.type.ts +++ b/src/components/CIPipelineN/CustomImageTag.type.ts @@ -15,7 +15,9 @@ */ import React from 'react' + import { OptionType, PipelineFormType } from '@devtron-labs/devtron-fe-common-lib' + import { PipelineFormDataErrorType } from '../workflowEditor/types' export interface CustomTagType { diff --git a/src/components/CIPipelineN/CustomScript.tsx b/src/components/CIPipelineN/CustomScript.tsx index e9558c67b2..bd6c9ae0ba 100644 --- a/src/components/CIPipelineN/CustomScript.tsx +++ b/src/components/CIPipelineN/CustomScript.tsx @@ -15,11 +15,13 @@ */ import React, { useContext, useEffect, useState } from 'react' -import { ScriptType, CodeEditor, MODES } from '@devtron-labs/devtron-fe-common-lib' -import { TaskFieldDescription, TaskFieldLabel } from '../ciPipeline/types' -import TaskFieldTippyDescription from './TaskFieldTippyDescription' + +import { CodeEditor, MODES, ScriptType } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as AlertTriangle } from '../../assets/icons/ic-alert-triangle.svg' +import { TaskFieldDescription, TaskFieldLabel } from '../ciPipeline/types' import { pipelineContext } from '../workflowEditor/workflowEditor' +import TaskFieldTippyDescription from './TaskFieldTippyDescription' interface CustomScriptType { handleScriptChange: React.Dispatch> diff --git a/src/components/CIPipelineN/CustomScriptCard.tsx b/src/components/CIPipelineN/CustomScriptCard.tsx index 0e4c155637..5c7bf336dc 100644 --- a/src/components/CIPipelineN/CustomScriptCard.tsx +++ b/src/components/CIPipelineN/CustomScriptCard.tsx @@ -14,9 +14,11 @@ * limitations under the License. */ import { stopPropagation } from '@devtron-labs/devtron-fe-common-lib' + import { ReactComponent as ICBookOpen } from '@Icons/ic-book-open.svg' import { ReactComponent as ICCDStage } from '@Icons/ic-cd-stage.svg' import { DOCUMENTATION } from '@Config/constants' + import { INLINE_PLUGIN_TEXT } from './Constants' const CustomScriptCard = () => ( diff --git a/src/components/CIPipelineN/DockerArgs.tsx b/src/components/CIPipelineN/DockerArgs.tsx index 282fef7b07..7048c5ffde 100644 --- a/src/components/CIPipelineN/DockerArgs.tsx +++ b/src/components/CIPipelineN/DockerArgs.tsx @@ -15,9 +15,11 @@ */ import React, { FunctionComponent } from 'react' + import { CustomInput, InfoIconTippy, Textarea } from '@devtron-labs/devtron-fe-common-lib' -import { DockerArgsAction, DockerArgsItemProps, DockerArgsProps } from './types' + import { ReactComponent as Close } from '../../assets/icons/ic-close.svg' +import { DockerArgsAction, DockerArgsItemProps, DockerArgsProps } from './types' const DockerArgsItem: FunctionComponent = ({ arg, diff --git a/src/components/CIPipelineN/MountFromHost.tsx b/src/components/CIPipelineN/MountFromHost.tsx index 939d208fc2..87635a3549 100644 --- a/src/components/CIPipelineN/MountFromHost.tsx +++ b/src/components/CIPipelineN/MountFromHost.tsx @@ -15,11 +15,13 @@ */ import { useContext } from 'react' + import { CustomInput } from '@devtron-labs/devtron-fe-common-lib' -import { MountPathMap } from '../ciPipeline/types' + import { ReactComponent as Add } from '../../assets/icons/ic-add.svg' -import { ReactComponent as Close } from '../../assets/icons/ic-close.svg' import { ReactComponent as AlertTriangle } from '../../assets/icons/ic-alert-triangle.svg' +import { ReactComponent as Close } from '../../assets/icons/ic-close.svg' +import { MountPathMap } from '../ciPipeline/types' import { pipelineContext } from '../workflowEditor/workflowEditor' const MountFromHost = () => { diff --git a/src/components/CIPipelineN/PluginDetailHeader/CreatePluginButton.tsx b/src/components/CIPipelineN/PluginDetailHeader/CreatePluginButton.tsx index 669d610193..7c1da69a18 100644 --- a/src/components/CIPipelineN/PluginDetailHeader/CreatePluginButton.tsx +++ b/src/components/CIPipelineN/PluginDetailHeader/CreatePluginButton.tsx @@ -17,9 +17,12 @@ import { useContext, useState } from 'react' import ReactGA from 'react-ga4' import Tippy from '@tippyjs/react' -import { pipelineContext } from '@Components/workflowEditor/workflowEditor' -import { ReactComponent as ICSave } from '@Icons/ic-save.svg' + import { RefVariableType, ToastManager, ToastVariantType, VariableType } from '@devtron-labs/devtron-fe-common-lib' + +import { ReactComponent as ICSave } from '@Icons/ic-save.svg' +import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { CreatePluginModal } from '../CreatePluginModal' const CreatePluginButton = () => { diff --git a/src/components/CIPipelineN/PluginDetailHeader/PluginDetailHeader.component.tsx b/src/components/CIPipelineN/PluginDetailHeader/PluginDetailHeader.component.tsx index e26feb11d7..7cf237e144 100644 --- a/src/components/CIPipelineN/PluginDetailHeader/PluginDetailHeader.component.tsx +++ b/src/components/CIPipelineN/PluginDetailHeader/PluginDetailHeader.component.tsx @@ -15,24 +15,27 @@ */ import { useContext } from 'react' + import { - TippyCustomized, - TippyTheme, - PluginTagsContainer, - PluginImageContainer, PluginDetailType, + PluginImageContainer, + PluginTagsContainer, PluginType, + TippyCustomized, + TippyTheme, Tooltip, } from '@devtron-labs/devtron-fe-common-lib' -import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { ReactComponent as ICBookOpen } from '@Icons/ic-book-open.svg' -import { ReactComponent as ICHelp } from '@Icons/ic-help.svg' import { ReactComponent as ICCDStage } from '@Icons/ic-cd-stage.svg' +import { ReactComponent as ICHelp } from '@Icons/ic-help.svg' +import { pipelineContext } from '@Components/workflowEditor/workflowEditor' import { DOCUMENTATION } from '@Config/constants' -import PluginVersionSelect from './PluginVersionSelect' -import CreatePluginButton from './CreatePluginButton' -import { PluginDetailHeaderProps } from '../types' + import { INLINE_PLUGIN_TEXT } from '../Constants' +import { PluginDetailHeaderProps } from '../types' +import CreatePluginButton from './CreatePluginButton' +import PluginVersionSelect from './PluginVersionSelect' const PluginDetailHeader = ({ handlePluginVersionChange }: PluginDetailHeaderProps) => { const { formData, activeStageName, selectedTaskIndex, pluginDataStore } = useContext(pipelineContext) diff --git a/src/components/CIPipelineN/PluginDetailHeader/PluginVersionSelect.tsx b/src/components/CIPipelineN/PluginDetailHeader/PluginVersionSelect.tsx index 5d89890e30..56405af0ac 100644 --- a/src/components/CIPipelineN/PluginDetailHeader/PluginVersionSelect.tsx +++ b/src/components/CIPipelineN/PluginDetailHeader/PluginVersionSelect.tsx @@ -15,14 +15,17 @@ */ import { useContext } from 'react' + import { SelectPicker, SelectPickerOptionType, SelectPickerVariantType, stopPropagation, } from '@devtron-labs/devtron-fe-common-lib' -import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { ReactComponent as ICUpdateAnimated } from '@Icons/ic-update-animated.svg' +import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { PluginVersionSelectOptionType, PluginVersionSelectProps } from '../types' import { getPluginVersionSelectOption } from './utils' diff --git a/src/components/CIPipelineN/TaskFieldTippyDescription.tsx b/src/components/CIPipelineN/TaskFieldTippyDescription.tsx index 6723e314fc..d82fa620b6 100644 --- a/src/components/CIPipelineN/TaskFieldTippyDescription.tsx +++ b/src/components/CIPipelineN/TaskFieldTippyDescription.tsx @@ -15,6 +15,7 @@ */ import Tippy from '@tippyjs/react' + import { TaskFieldLabel } from '../ciPipeline/types' interface TippyDescriptionType { diff --git a/src/components/CIPipelineN/TaskTitle.tsx b/src/components/CIPipelineN/TaskTitle.tsx index df15bff955..0c2f15a51d 100644 --- a/src/components/CIPipelineN/TaskTitle.tsx +++ b/src/components/CIPipelineN/TaskTitle.tsx @@ -16,11 +16,14 @@ import { useContext } from 'react' import Tippy from '@tippyjs/react' + import { ActivityIndicator, PluginImageContainer, PluginType } from '@devtron-labs/devtron-fe-common-lib' -import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { ReactComponent as ICFileEdit } from '@Icons/ic-file-edit.svg' -import { TaskTitleProps, TaskTitleTippyContentProps } from './types' +import { pipelineContext } from '@Components/workflowEditor/workflowEditor' + import { ReactComponent as ICCDStage } from '../../assets/icons/ic-cd-stage.svg' +import { TaskTitleProps, TaskTitleTippyContentProps } from './types' const TaskTitleTippyContent = ({ isLatest, pluginName, pluginVersion, displayName }: TaskTitleTippyContentProps) => (
diff --git a/src/components/CIPipelineN/VariableDataTable/ValueConfigOverlay.tsx b/src/components/CIPipelineN/VariableDataTable/ValueConfigOverlay.tsx index 7ece1ebfcc..0c070e4483 100644 --- a/src/components/CIPipelineN/VariableDataTable/ValueConfigOverlay.tsx +++ b/src/components/CIPipelineN/VariableDataTable/ValueConfigOverlay.tsx @@ -36,13 +36,13 @@ import { } from '@devtron-labs/devtron-fe-common-lib' import { ReactComponent as ICAdd } from '@Icons/ic-add.svg' -import { ReactComponent as ICClose } from '@Icons/ic-close.svg' import { ReactComponent as ICChoicesDropdown } from '@Icons/ic-choices-dropdown.svg' +import { ReactComponent as ICClose } from '@Icons/ic-close.svg' import { ReactComponent as ICInfoOutlineGrey } from '@Icons/ic-info-outline-grey.svg' import { importComponentFromFELibrary } from '@Components/common' -import { ConfigOverlayProps, VariableDataTableActionType } from './types' import { FILE_UPLOAD_SIZE_UNIT_OPTIONS, FORMAT_OPTIONS_MAP } from './constants' +import { ConfigOverlayProps, VariableDataTableActionType } from './types' import { VariableDataTablePopupMenu } from './VariableDataTablePopupMenu' const AskValueAtRuntimeCheckbox = importComponentFromFELibrary('AskValueAtRuntimeCheckbox', null, 'function') diff --git a/src/components/CIPipelineN/VariableDataTable/VariableDataTable.component.tsx b/src/components/CIPipelineN/VariableDataTable/VariableDataTable.component.tsx index 3374c2da70..926f45fa95 100644 --- a/src/components/CIPipelineN/VariableDataTable/VariableDataTable.component.tsx +++ b/src/components/CIPipelineN/VariableDataTable/VariableDataTable.component.tsx @@ -32,9 +32,9 @@ import { } from '@devtron-labs/devtron-fe-common-lib' import { ReactComponent as ICAdd } from '@Icons/ic-add.svg' -import { pipelineContext } from '@Components/workflowEditor/workflowEditor' import { PluginVariableType } from '@Components/ciPipeline/types' import { importComponentFromFELibrary } from '@Components/common' +import { pipelineContext } from '@Components/workflowEditor/workflowEditor' import { FILE_MOUNT_DIR, @@ -65,9 +65,8 @@ import { getVariableDataTableRowEmptyValidationState, validateVariableDataTableVariableKeys, } from './validations' - -import { VariableConfigOverlay } from './VariableConfigOverlay' import { ValueConfigOverlay } from './ValueConfigOverlay' +import { VariableConfigOverlay } from './VariableConfigOverlay' const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function') diff --git a/src/components/CIPipelineN/VariableDataTable/VariableDataTablePopupMenu.tsx b/src/components/CIPipelineN/VariableDataTable/VariableDataTablePopupMenu.tsx index f9c91fa762..6c74b36e32 100644 --- a/src/components/CIPipelineN/VariableDataTable/VariableDataTablePopupMenu.tsx +++ b/src/components/CIPipelineN/VariableDataTable/VariableDataTablePopupMenu.tsx @@ -26,8 +26,8 @@ import { } from '@devtron-labs/devtron-fe-common-lib' import { ReactComponent as ICClose } from '@Icons/ic-close.svg' -import { ReactComponent as ICSlidersVertical } from '@Icons/ic-sliders-vertical.svg' import { ReactComponent as ICDot } from '@Icons/ic-dot.svg' +import { ReactComponent as ICSlidersVertical } from '@Icons/ic-sliders-vertical.svg' import { VariableDataTablePopupMenuProps } from './types' diff --git a/src/components/CIPipelineN/VariableDataTable/constants.ts b/src/components/CIPipelineN/VariableDataTable/constants.ts index 28a4f6c58e..542ca06490 100644 --- a/src/components/CIPipelineN/VariableDataTable/constants.ts +++ b/src/components/CIPipelineN/VariableDataTable/constants.ts @@ -22,8 +22,8 @@ import { VariableTypeFormat, } from '@devtron-labs/devtron-fe-common-lib' -import { importComponentFromFELibrary } from '@Components/common' import { PluginVariableType } from '@Components/ciPipeline/types' +import { importComponentFromFELibrary } from '@Components/common' const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function') diff --git a/src/components/CIPipelineN/VariableDataTable/types.ts b/src/components/CIPipelineN/VariableDataTable/types.ts index c495a0874f..00027df2c5 100644 --- a/src/components/CIPipelineN/VariableDataTable/types.ts +++ b/src/components/CIPipelineN/VariableDataTable/types.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import { PluginVariableType } from '@Components/ciPipeline/types' -import { PipelineContext } from '@Components/workflowEditor/types' import { DynamicDataTableCellErrorType, DynamicDataTableRowType, @@ -28,6 +26,9 @@ import { VariableTypeFormat, } from '@devtron-labs/devtron-fe-common-lib' +import { PluginVariableType } from '@Components/ciPipeline/types' +import { PipelineContext } from '@Components/workflowEditor/types' + export interface VariableDataTableProps { type: PluginVariableType isCustomTask?: boolean diff --git a/src/components/CIPipelineN/VariableDataTable/utils.tsx b/src/components/CIPipelineN/VariableDataTable/utils.tsx index 0ab0c5e548..ea0f29c605 100644 --- a/src/components/CIPipelineN/VariableDataTable/utils.tsx +++ b/src/components/CIPipelineN/VariableDataTable/utils.tsx @@ -34,9 +34,9 @@ import { VariableTypeFormat, } from '@devtron-labs/devtron-fe-common-lib' -import { BuildStageVariable } from '@Config/constants' -import { PipelineContext } from '@Components/workflowEditor/types' import { PluginVariableType } from '@Components/ciPipeline/types' +import { PipelineContext } from '@Components/workflowEditor/types' +import { BuildStageVariable } from '@Config/constants' import { excludeVariables } from '../Constants' import { @@ -49,9 +49,9 @@ import { import { GetValColumnRowPropsType, GetVariableDataTableInitialRowsProps, - VariableDataTableSelectPickerOptionType, - VariableDataRowType, VariableDataCustomState, + VariableDataRowType, + VariableDataTableSelectPickerOptionType, } from './types' const getOptionsForValColumn = ({ diff --git a/src/components/CIPipelineN/VariableDataTable/validations.ts b/src/components/CIPipelineN/VariableDataTable/validations.ts index 8cbfd71a77..c594a858b8 100644 --- a/src/components/CIPipelineN/VariableDataTable/validations.ts +++ b/src/components/CIPipelineN/VariableDataTable/validations.ts @@ -16,8 +16,8 @@ import { DynamicDataTableCellValidationState, - PATTERNS as FE_COMMON_LIB_PATTERNS, InputOutputVariablesHeaderKeys, + PATTERNS as FE_COMMON_LIB_PATTERNS, RefVariableType, VariableTypeFormat, } from '@devtron-labs/devtron-fe-common-lib' @@ -25,13 +25,13 @@ import { import { PluginVariableType } from '@Components/ciPipeline/types' import { PATTERNS } from '@Config/constants' +import { VARIABLE_DATA_TABLE_CELL_ERROR_MSGS } from './constants' import { GetValidateCellProps, ValidateInputOutputVariableCellProps, ValidateVariableDataTableKeysProps, VariableDataRowType, } from './types' -import { VARIABLE_DATA_TABLE_CELL_ERROR_MSGS } from './constants' const getVariableDataTableVariableKeysFrequency = ( rows: VariableDataRowType[], diff --git a/src/components/CIPipelineN/types.ts b/src/components/CIPipelineN/types.ts index 9d449c7c09..237f7dab0b 100644 --- a/src/components/CIPipelineN/types.ts +++ b/src/components/CIPipelineN/types.ts @@ -15,12 +15,12 @@ */ import { + Environment, OptionType, - StepType, + ParentPluginType, PipelineFormType, - Environment, SelectPickerOptionType, - ParentPluginType, + StepType, } from '@devtron-labs/devtron-fe-common-lib' export enum DockerArgsAction { diff --git a/src/components/ClusterNodes/ClusterList/ClusterList.tsx b/src/components/ClusterNodes/ClusterList/ClusterList.tsx new file mode 100644 index 0000000000..31b02a1a58 --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/ClusterList.tsx @@ -0,0 +1,70 @@ +import React from 'react' + +import { + BulkSelection, + ClusterFiltersType, + SortableTableHeaderCell, + useUrlFilters, +} from '@devtron-labs/devtron-fe-common-lib' + +import { importComponentFromFELibrary } from '@Components/common' + +import { ClusterMapListSortableKeys, ClusterMapListSortableTitle } from '../constants' +import { parseSearchParams } from '../utils' +import ClusterListRow from './ClusterListRow' +import { ClusterListTypes } from './types' + +const KubeConfigRowCheckbox = importComponentFromFELibrary('KubeConfigRowCheckbox', null, 'function') + +const ClusterList = ({ + filteredList, + clusterListLoader, + showKubeConfigModal, + onChangeShowKubeConfigModal, + setSelectedClusterName, +}: ClusterListTypes) => { + const { sortBy, sortOrder, handleSorting } = useUrlFilters< + ClusterMapListSortableKeys, + { clusterFilter: ClusterFiltersType } + >({ + parseSearchParams, + initialSortKey: ClusterMapListSortableKeys.CLUSTER_NAME, + }) + + const handleCellSorting = (cellToSort: ClusterMapListSortableKeys) => () => { + handleSorting(cellToSort) + } + + return ( +
+
+ {KubeConfigRowCheckbox ? :
} + {Object.entries(ClusterMapListSortableKeys).map(([cellName, cellKey]) => ( + + + + ))} +
+ {filteredList.map((clusterData) => ( + + ))} +
+ ) +} + +export default ClusterList diff --git a/src/components/ClusterNodes/ClusterList/ClusterListRow.tsx b/src/components/ClusterNodes/ClusterList/ClusterListRow.tsx new file mode 100644 index 0000000000..24c35a098c --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/ClusterListRow.tsx @@ -0,0 +1,138 @@ +import { Link } from 'react-router-dom' + +import { + ALL_NAMESPACE_OPTION, + BulkSelectionIdentifiersType, + Button, + ButtonComponentType, + ButtonStyleType, + ButtonVariantType, + ClusterDetail, + ClusterStatusType, + ComponentSizeType, + Icon, + Tooltip, + URLS, + useBulkSelection, +} from '@devtron-labs/devtron-fe-common-lib' + +import { ReactComponent as Error } from '@Icons/ic-error-exclamation.svg' +import { importComponentFromFELibrary } from '@Components/common' +import { K8S_EMPTY_GROUP, SIDEBAR_KEYS } from '@Components/ResourceBrowser/Constants' +import { AppDetailsTabs } from '@Components/v2/appDetails/appDetails.store' + +import { ClusterMapInitialStatus } from '../ClusterMapInitialStatus' +import { CLUSTER_PROD_TYPE } from '../constants' +import { ClusterListRowTypes } from './types' + +const CompareClusterButton = importComponentFromFELibrary('CompareClusterButton', null, 'function') +const ClusterStatusCell = importComponentFromFELibrary('ClusterStatus', null, 'function') +const KubeConfigButton = importComponentFromFELibrary('KubeConfigButton', null, 'function') +const KubeConfigRowCheckbox = importComponentFromFELibrary('KubeConfigRowCheckbox', null, 'function') + +const ClusterListRow = ({ + clusterData, + clusterListLoader, + onChangeShowKubeConfigModal, + setSelectedClusterName, +}: ClusterListRowTypes) => { + const { selectedIdentifiers: bulkSelectionState, getSelectedIdentifiersCount } = + useBulkSelection>() + const errorCount = clusterData.nodeErrors ? Object.keys(clusterData.nodeErrors).length : 0 + const identifierCount = getSelectedIdentifiersCount() + + const hideDataOnLoad = (value) => { + if (clusterListLoader) { + return null + } + return value + } + + const renderClusterStatus = ({ errorInNodeListing, status }: ClusterDetail) => { + if (ClusterStatusCell && status) { + return + } + + return + } + const isIdentifierSelected = !!bulkSelectionState[clusterData.name] + + // TODO: @Elessar1802 will be replacing all terminal url with new utils + + return ( +
+ {KubeConfigRowCheckbox && } + {!isIdentifierSelected && identifierCount === 0 && ( +
+ +
+ )} +
+ + {clusterData.name} + + {/* NOTE: visible-hover plays with display prop; therefore need to set display: flex on a new div */} +
+
+ {!!clusterData.nodeCount && !clusterListLoader && ( +
+
+
+ {renderClusterStatus(clusterData)} +
+ {hideDataOnLoad(clusterData.isProd ? CLUSTER_PROD_TYPE.PRODUCTION : CLUSTER_PROD_TYPE.NON_PRODUCTION)} +
+
{hideDataOnLoad(clusterData.nodeCount)}
+
+ {errorCount > 0 && + hideDataOnLoad( + <> + + {errorCount} + , + )} +
+
+ {hideDataOnLoad( + + {clusterData.serverVersion} + , + )} +
+
{hideDataOnLoad(clusterData.cpu?.capacity)}
+
{hideDataOnLoad(clusterData.memory?.capacity)}
+
+ ) +} + +export default ClusterListRow diff --git a/src/components/ClusterNodes/ClusterList/ClusterListView.tsx b/src/components/ClusterNodes/ClusterList/ClusterListView.tsx new file mode 100644 index 0000000000..ada7f19ce4 --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/ClusterListView.tsx @@ -0,0 +1,135 @@ +import { useMemo, useState } from 'react' +import dayjs, { Dayjs } from 'dayjs' + +import { + BulkSelectionEvents, + BulkSelectionIdentifiersType, + BulkSelectionProvider, + Button, + ButtonVariantType, + ClusterDetail, + ClusterFiltersType, + SearchBar, + SelectAllDialogStatus, + useBulkSelection, + useUrlFilters, +} from '@devtron-labs/devtron-fe-common-lib' + +import { importComponentFromFELibrary } from '@Components/common' +import Timer from '@Components/common/DynamicTabs/DynamicTabs.timer' + +import { ClusterMapListSortableKeys, ClusterStatusByFilter } from '../constants' +import { getSortedClusterList, parseSearchParams } from '../utils' +import ClusterSelectionBody from './ClusterSelectionBody' +import { ClusterViewType } from './types' + +const ClusterFilters = importComponentFromFELibrary('ClusterFilters', null, 'function') + +const getSelectAllDialogStatus = () => SelectAllDialogStatus.CLOSED + +const ClusterListView = (props: ClusterViewType) => { + const [lastSyncTime, setLastSyncTime] = useState(dayjs()) + + const { searchKey, clusterFilter, updateSearchParams, handleSearch, sortBy, sortOrder } = useUrlFilters< + ClusterMapListSortableKeys, + { clusterFilter: ClusterFiltersType } + >({ + parseSearchParams, + initialSortKey: ClusterMapListSortableKeys.CLUSTER_NAME, + }) + const { handleBulkSelection } = useBulkSelection>() + + const { clusterOptions, initialLoading, clusterListLoader, refreshData } = props + + const setClusterFilter = (_clusterFilter: ClusterFiltersType) => { + updateSearchParams({ clusterFilter: _clusterFilter }) + } + + const filteredList: ClusterDetail[] = useMemo(() => { + const loweredSearchKey = searchKey.toLowerCase() + const updatedClusterOptions = [...clusterOptions] + // Sort the cluster list based on the selected sorting key + getSortedClusterList(updatedClusterOptions, sortBy, sortOrder) + + // Filter the cluster list based on the search key and cluster filter + return updatedClusterOptions.filter((option) => { + const filterCondition = + clusterFilter === ClusterFiltersType.ALL_CLUSTERS || + !option.status || + option.status === ClusterStatusByFilter[clusterFilter] + + return (!searchKey || option.name.toLowerCase().includes(loweredSearchKey)) && filterCondition + }) + }, [searchKey, clusterOptions, `${clusterFilter}`, sortBy, sortOrder]) + + const handleFilterKeyPress = (value: string) => { + handleSearch(value) + } + + const allOnThisPageIdentifiers = useMemo( + () => + filteredList?.reduce((acc, cluster) => { + acc[cluster.name] = cluster + return acc + }, {} as ClusterDetail) ?? {}, + [filteredList], + ) + + const handleClearBulkSelection = () => { + handleBulkSelection({ + action: BulkSelectionEvents.CLEAR_ALL_SELECTIONS, + }) + } + + const handleRefresh = () => { + refreshData() + setLastSyncTime(dayjs()) + handleClearBulkSelection() + } + + return ( + > + identifiers={allOnThisPageIdentifiers} + getSelectAllDialogStatus={getSelectAllDialogStatus} + > +
+
+ + {ClusterFilters && ( + + )} +
+ {clusterListLoader ? ( + Syncing + ) : ( +
+ + Last refreshed  + +  ago + +
+ )} +
+ + + + ) +} + +export default ClusterListView diff --git a/src/components/ClusterNodes/ClusterList/ClusterSelectionBody.tsx b/src/components/ClusterNodes/ClusterList/ClusterSelectionBody.tsx new file mode 100644 index 0000000000..4a18e8ffcf --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/ClusterSelectionBody.tsx @@ -0,0 +1,150 @@ +/* + * 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 React, { useRef, useState } from 'react' + +import { + BulkSelectionEvents, + BulkSelectionIdentifiersType, + ClusterDetail, + ClusterFiltersType, + GenericEmptyState, + useBulkSelection, + useUrlFilters, +} from '@devtron-labs/devtron-fe-common-lib' + +import NoClusterEmptyState from '@Images/no-cluster-empty-state.png' +import { importComponentFromFELibrary } from '@Components/common' +import { AddClusterButton } from '@Components/ResourceBrowser/PageHeader.buttons' + +import ClusterNodeEmptyState from '../ClusterNodeEmptyStates' +import { ClusterMapListSortableKeys } from '../constants' +import { parseSearchParams } from '../utils' +import ClusterList from './ClusterList' +import { ClusterSelectionBodyTypes } from './types' + +import '../clusterNodes.scss' + +const ClusterMap = importComponentFromFELibrary('ClusterMap', null, 'function') +const ClusterBulkSelectionActionWidget = importComponentFromFELibrary( + 'ClusterBulkSelectionActionWidget', + null, + 'function', +) +const KubeConfigModal = importComponentFromFELibrary('KubeConfigModal', null, 'function') + +const ClusterSelectionBody: React.FC = ({ + clusterOptions, + clusterListLoader, + filteredList, +}) => { + const parentRef = useRef(null) + + const [showKubeConfigModal, setShowKubeConfigModal] = useState(false) + const [selectedClusterName, setSelectedClusterName] = useState('') + + const { clearFilters } = useUrlFilters({ + parseSearchParams, + initialSortKey: ClusterMapListSortableKeys.CLUSTER_NAME, + }) + + const { handleBulkSelection, getSelectedIdentifiersCount } = + useBulkSelection>() + + const identifierCount = getSelectedIdentifiersCount() + + const handleClearBulkSelection = () => { + handleBulkSelection({ + action: BulkSelectionEvents.CLEAR_ALL_SELECTIONS, + }) + } + + if (!clusterOptions.length) { + return ( + + ) + } + + const onChangeShowKubeConfigModal = () => { + setShowKubeConfigModal(true) + } + + const onChangeCloseKubeConfigModal = () => { + setShowKubeConfigModal(false) + setSelectedClusterName('') + } + + const renderClusterList = () => ( +
+ {ClusterMap && window._env_.FEATURE_CLUSTER_MAP_ENABLE && ( + + )} + {!filteredList?.length ? ( +
+ +
+ ) : ( + + )} +
+ ) + + const renderClusterBulkSelection = () => { + if (identifierCount > 0) { + return ( + + ) + } + return null + } + + return ( +
+ {renderClusterBulkSelection()} + {renderClusterList()} + {showKubeConfigModal && KubeConfigModal && ( + + )} +
+ ) +} + +export default ClusterSelectionBody diff --git a/src/components/ClusterNodes/ClusterList/index.ts b/src/components/ClusterNodes/ClusterList/index.ts new file mode 100644 index 0000000000..73c8c6e7df --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/index.ts @@ -0,0 +1,4 @@ +export { default as ClusterList } from './ClusterList' +export { default as ClusterListRow } from './ClusterListRow' +export { default as ClusterListView } from './ClusterListView' +export { default as ClusterSelectionBody } from './ClusterSelectionBody' diff --git a/src/components/ClusterNodes/ClusterList/types.ts b/src/components/ClusterNodes/ClusterList/types.ts new file mode 100644 index 0000000000..0f1b274399 --- /dev/null +++ b/src/components/ClusterNodes/ClusterList/types.ts @@ -0,0 +1,23 @@ +import { ClusterDetail } from '@devtron-labs/devtron-fe-common-lib' + +export interface ClusterViewType { + clusterOptions: ClusterDetail[] + clusterListLoader: boolean + initialLoading: boolean + refreshData: () => void +} + +export interface ClusterListTypes { + filteredList: ClusterDetail[] + clusterListLoader: boolean + showKubeConfigModal: boolean + onChangeShowKubeConfigModal: () => void + setSelectedClusterName: React.Dispatch> +} +export interface ClusterListRowTypes extends Omit { + clusterData: ClusterDetail +} + +export interface ClusterSelectionBodyTypes extends ClusterViewType { + filteredList: ClusterDetail[] +} diff --git a/src/components/ClusterNodes/ClusterMapInitialStatus.tsx b/src/components/ClusterNodes/ClusterMapInitialStatus.tsx index abd9d95307..7dec859121 100644 --- a/src/components/ClusterNodes/ClusterMapInitialStatus.tsx +++ b/src/components/ClusterNodes/ClusterMapInitialStatus.tsx @@ -14,9 +14,11 @@ * limitations under the License. */ -import { ReactComponent as Error } from '@Icons/ic-error-cross.svg' -import { ReactComponent as Success } from '@Icons/appstatus/healthy.svg' import { Tooltip } from '@devtron-labs/devtron-fe-common-lib' + +import { ReactComponent as Success } from '@Icons/appstatus/healthy.svg' +import { ReactComponent as Error } from '@Icons/ic-error-cross.svg' + import { ClusterMapInitialStatusType } from './types' export const ClusterMapInitialStatus = ({ errorInNodeListing }: ClusterMapInitialStatusType) => ( diff --git a/src/components/ClusterNodes/ClusterOverview.tsx b/src/components/ClusterNodes/ClusterOverview.tsx index ab519cc205..ec1d3f1d7c 100644 --- a/src/components/ClusterNodes/ClusterOverview.tsx +++ b/src/components/ClusterNodes/ClusterOverview.tsx @@ -26,6 +26,7 @@ import { getUrlWithSearchParams, showError, ClusterCapacityType, + Icon, } from '@devtron-labs/devtron-fe-common-lib' import { ClusterErrorType, @@ -412,7 +413,7 @@ function ClusterOverview({ selectedCluster, addTab }: ClusterOverviewProps) {