diff --git a/package-lock.json b/package-lock.json index b3f206a49..f5238bf18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.12.0-pre-4", + "version": "1.12.0-pre-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.12.0-pre-4", + "version": "1.12.0-pre-5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a6af9db1f..9ed6e2734 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.12.0-pre-4", + "version": "1.12.0-pre-5", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", diff --git a/src/Assets/IconV2/ic-info-filled.svg b/src/Assets/IconV2/ic-info-filled.svg index 8f79e556b..f9f02f2b0 100644 --- a/src/Assets/IconV2/ic-info-filled.svg +++ b/src/Assets/IconV2/ic-info-filled.svg @@ -16,5 +16,5 @@ - + diff --git a/src/Assets/IconV2/ic-thumb-down.svg b/src/Assets/IconV2/ic-thumb-down.svg new file mode 100644 index 000000000..54ef52337 --- /dev/null +++ b/src/Assets/IconV2/ic-thumb-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Assets/IconV2/ic-thumb-up.svg b/src/Assets/IconV2/ic-thumb-up.svg new file mode 100644 index 000000000..c98369a89 --- /dev/null +++ b/src/Assets/IconV2/ic-thumb-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Common/Types.ts b/src/Common/Types.ts index 438ac8947..9f67632bd 100644 --- a/src/Common/Types.ts +++ b/src/Common/Types.ts @@ -1071,16 +1071,6 @@ export interface EnvironmentHelmResult { export type EnvironmentListHelmResponse = ResponseType -export interface WidgetEventDetails { - message: string - namespace: string - object: string - source: string - count: number - age: string - lastSeen: string -} - export interface GlobalVariableDTO { name: string format: VariableTypeFormat @@ -1129,4 +1119,4 @@ export interface AppMeta { export interface EnvAppsMetaDTO { appCount: number apps: AppMeta[] -} \ No newline at end of file +} diff --git a/src/Shared/Components/Icon/Icon.tsx b/src/Shared/Components/Icon/Icon.tsx index 16c5e2585..5db478d3f 100644 --- a/src/Shared/Components/Icon/Icon.tsx +++ b/src/Shared/Components/Icon/Icon.tsx @@ -108,6 +108,8 @@ import { ReactComponent as ICSuccess } from '@IconsV2/ic-success.svg' import { ReactComponent as ICSuspended } from '@IconsV2/ic-suspended.svg' import { ReactComponent as ICTata1mg } from '@IconsV2/ic-tata1mg.svg' import { ReactComponent as ICTerminalFill } from '@IconsV2/ic-terminal-fill.svg' +import { ReactComponent as ICThumbDown } from '@IconsV2/ic-thumb-down.svg' +import { ReactComponent as ICThumbUp } from '@IconsV2/ic-thumb-up.svg' import { ReactComponent as ICTimeoutDash } from '@IconsV2/ic-timeout-dash.svg' import { ReactComponent as ICTimer } from '@IconsV2/ic-timer.svg' import { ReactComponent as ICTravclan } from '@IconsV2/ic-travclan.svg' @@ -229,6 +231,8 @@ export const iconMap = { 'ic-suspended': ICSuspended, 'ic-tata1mg': ICTata1mg, 'ic-terminal-fill': ICTerminalFill, + 'ic-thumb-down': ICThumbDown, + 'ic-thumb-up': ICThumbUp, 'ic-timeout-dash': ICTimeoutDash, 'ic-timer': ICTimer, 'ic-travclan': ICTravclan, diff --git a/src/Shared/Components/TabGroup/TabGroup.component.tsx b/src/Shared/Components/TabGroup/TabGroup.component.tsx index eb8059cb9..2d1d8a10b 100644 --- a/src/Shared/Components/TabGroup/TabGroup.component.tsx +++ b/src/Shared/Components/TabGroup/TabGroup.component.tsx @@ -28,7 +28,15 @@ import { getClassNameBySizeMap, tabGroupClassMap } from './TabGroup.utils' import './TabGroup.scss' const MotionLayoutUnderline = ({ layoutId }: { layoutId: string }) => ( - + + // Replace the y value in translate3d(x, y, z) with 0px to omit y axis transitions + generatedTransform.replace(/translate3d\(([^,]+),\s*[^,]+,\s*([^)]+)\)/, 'translate3d($1, 0px, $2)') + } + layoutId={layoutId} + className="underline bcb-5 w-100 dc__position-abs" + /> ) const Tab = ({ @@ -59,7 +67,6 @@ const Tab = ({ const { tabClassName, iconClassName, badgeClassName } = getClassNameBySizeMap({ hideTopPadding, - isTabActive, })[size] const onClickHandler = ( diff --git a/src/Shared/Components/TabGroup/TabGroup.scss b/src/Shared/Components/TabGroup/TabGroup.scss index 2ddaaf6b9..02f5e7967 100644 --- a/src/Shared/Components/TabGroup/TabGroup.scss +++ b/src/Shared/Components/TabGroup/TabGroup.scss @@ -34,9 +34,10 @@ @include svg-styles(var(--N700)); .underline { - height: 2px; + height: 2px !important; border-top-left-radius: 2px; border-top-right-radius: 2px; + bottom: -1px; } &--active { diff --git a/src/Shared/Components/TabGroup/TabGroup.utils.ts b/src/Shared/Components/TabGroup/TabGroup.utils.ts index 5bc8aeb6f..5682c1651 100644 --- a/src/Shared/Components/TabGroup/TabGroup.utils.ts +++ b/src/Shared/Components/TabGroup/TabGroup.utils.ts @@ -21,8 +21,7 @@ import { TabGroupProps } from './TabGroup.types' export const getClassNameBySizeMap = ({ hideTopPadding, - isTabActive, -}: Pick & { isTabActive: boolean }): Record< +}: Pick): Record< TabGroupProps['size'], { tabClassName: string @@ -31,17 +30,17 @@ export const getClassNameBySizeMap = ({ } > => ({ [ComponentSizeType.medium]: { - tabClassName: `fs-12 ${!hideTopPadding ? 'pt-6' : ''} ${isTabActive ? 'pb-3' : 'pb-5'}`, + tabClassName: `fs-12 ${!hideTopPadding ? 'pt-6' : ''} pb-5`, iconClassName: 'icon-dim-14', badgeClassName: 'fs-11 lh-18 tab-group__tab__badge--medium', }, [ComponentSizeType.large]: { - tabClassName: `fs-13 ${!hideTopPadding ? 'pt-8' : ''} ${isTabActive ? 'pb-5' : 'pb-7'}`, + tabClassName: `fs-13 ${!hideTopPadding ? 'pt-8' : ''} pb-7`, iconClassName: 'icon-dim-16', badgeClassName: 'fs-12 lh-20', }, [ComponentSizeType.xl]: { - tabClassName: `min-w-200 fs-13 ${!hideTopPadding ? 'pt-10' : ''} ${isTabActive ? 'pb-7' : 'pb-9'}`, + tabClassName: `min-w-200 fs-13 ${!hideTopPadding ? 'pt-10' : ''} pb-9`, iconClassName: 'icon-dim-16', badgeClassName: 'fs-12 lh-20', }, diff --git a/src/Shared/Helpers.tsx b/src/Shared/Helpers.tsx index eda31ea24..b73a459ad 100644 --- a/src/Shared/Helpers.tsx +++ b/src/Shared/Helpers.tsx @@ -790,19 +790,31 @@ export const getTimeDifference = ({ return fallbackString } - const seconds = moment(endTime).diff(moment(startTime), 'seconds') - const minutes = moment(endTime).diff(moment(startTime), 'minutes') - const hours = moment(endTime).diff(moment(startTime), 'hours') - - if (seconds < 60) { - return `${seconds}s` + const start = moment(startTime) + const end = moment(endTime) + if (!start.isValid() || !end.isValid()) { + return fallbackString } - if (minutes < 60) { - return `${minutes}m ${seconds % 60}s` + + const diff = Math.abs(end.diff(start)) + const duration = moment.duration(diff) + + const units = [ + { label: 'd', value: duration.days() }, + { label: 'h', value: duration.hours() }, + { label: 'm', value: duration.minutes() }, + { label: 's', value: duration.seconds() }, + ] + + // Filter out zero values and take the first two non-zero units + const nonZeroUnits = units.filter((unit) => unit.value > 0).slice(0, 2) + + // If all units are zero, show "0s" + if (nonZeroUnits.length === 0) { + return '0s' } - const leftOverMinutes = minutes - hours * 60 - const leftOverSeconds = seconds - minutes * 60 - return `${hours}h ${leftOverMinutes}m ${leftOverSeconds}s` + + return nonZeroUnits.map((unit) => `${unit.value}${unit.label}`).join(' ') } export const getFileNameFromHeaders = (headers: Headers) => diff --git a/src/Shared/Providers/types.ts b/src/Shared/Providers/types.ts index 68af58238..d3d456ad2 100644 --- a/src/Shared/Providers/types.ts +++ b/src/Shared/Providers/types.ts @@ -18,7 +18,7 @@ import { Dispatch, MutableRefObject, ReactNode, SetStateAction } from 'react' import { SERVER_MODE } from '../../Common' import { ServerInfo } from '../Components/Header/types' -import { DevtronLicenseInfo, LicenseInfoDialogType } from '..' +import { DevtronLicenseInfo, IntelligenceConfig, LicenseInfoDialogType } from '..' export interface MainContext { serverMode: SERVER_MODE @@ -66,6 +66,8 @@ export interface MainContext { licenseData: DevtronLicenseInfo setLicenseData: Dispatch> canFetchHelmAppStatus: boolean + intelligenceConfig: IntelligenceConfig + setIntelligenceConfig: Dispatch> } export interface MainContextProviderProps { diff --git a/src/Shared/types.ts b/src/Shared/types.ts index aaef6adc4..869bd4357 100644 --- a/src/Shared/types.ts +++ b/src/Shared/types.ts @@ -1152,3 +1152,10 @@ export enum RegistryCredentialsType { USERNAME_PASSWORD = 'username_password', ANONYMOUS = 'anonymous', } + +export interface IntelligenceConfig { + clusterId: number + metadata: Record + prompt: string + analyticsCategory: string +} diff --git a/src/index.ts b/src/index.ts index f582c59a3..f598dd3d3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -155,6 +155,7 @@ export interface customEnv { */ FEATURE_APPLICATION_TEMPLATES_ENABLE?: boolean GATEKEEPER_URL?: string + FEATURE_AI_INTEGRATION_ENABLE?: boolean } declare global { interface Window {