From 9ce94523d45977eb0af869b5d5d160386579d4c4 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Wed, 15 Apr 2026 17:46:06 +0530 Subject: [PATCH 01/10] feat: add condition handling to plugin creation process with input/output separation --- .../CIPipelineN/CreatePluginModal/types.ts | 8 +++ .../CIPipelineN/CreatePluginModal/utils.tsx | 54 +++++++++++++------ src/components/cdPipeline/cdpipeline.util.tsx | 21 ++++++++ 3 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/components/CIPipelineN/CreatePluginModal/types.ts b/src/components/CIPipelineN/CreatePluginModal/types.ts index 045789f15d..4e4388e963 100644 --- a/src/components/CIPipelineN/CreatePluginModal/types.ts +++ b/src/components/CIPipelineN/CreatePluginModal/types.ts @@ -15,6 +15,7 @@ */ import { + ConditionDetails, CustomInputProps, EditImageFormFieldProps, InlineStepDetailType, @@ -25,6 +26,7 @@ import { SelectPickerOptionType, ServerErrors, StepType, + ValueConstraintType, VariableType, } from '@devtron-labs/devtron-fe-common-lib' @@ -240,6 +242,10 @@ export enum CreatePluginVariableType { OUTPUT = 'OUTPUT', } +interface CreatePluginStepConditionPayload extends Pick { + conditionalOperator: ConditionDetails['conditionOperator'] +} + export interface CreatePluginPayloadPluginStepVariableItemType extends Pick< VariableType, @@ -249,6 +255,8 @@ export interface CreatePluginPayloadPluginStepVariableItemType valueType: VariableType['variableType'] referenceVariableName: VariableType['refVariableName'] isExposed: true + pluginStepCondition?: CreatePluginStepConditionPayload[] + valueConstraint?: ValueConstraintType } interface CreatePluginPayloadPluginStepsDTO extends Pick { diff --git a/src/components/CIPipelineN/CreatePluginModal/utils.tsx b/src/components/CIPipelineN/CreatePluginModal/utils.tsx index ea4473b009..c0a51cf7d9 100644 --- a/src/components/CIPipelineN/CreatePluginModal/utils.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/utils.tsx @@ -15,6 +15,7 @@ */ import { + ConditionDetails, InlineStepDetailType, PluginImageContainer, SelectPickerOptionType, @@ -23,6 +24,8 @@ import { VariableType, } from '@devtron-labs/devtron-fe-common-lib' +import { getInputOutputConditionDetails } from '@Components/cdPipeline/cdpipeline.util' + import { CREATE_PLUGIN_DEFAULT_FORM, MAX_TAG_LENGTH } from './constants' import { CreatePluginFormType, @@ -107,22 +110,37 @@ const getCreatePluginPayloadPathArgPortMapping = ( const parseInputVariablesIntoCreatePluginPayload = ( variableList: VariableType[], variableType: CreatePluginVariableType, + conditionDetailsList: ConditionDetails[], ): CreatePluginPayloadPluginStepVariableItemType[] => - variableList?.map((variable) => ({ - id: variable.id, - name: variable.name, - format: variable.format, - description: variable.description, - allowEmptyValue: variable.allowEmptyValue, - defaultValue: variable.defaultValue, - value: variable.value, - variableType, - valueType: variable.variableType, - referenceVariableName: variable.refVariableName, - isExposed: true, - fileMountDir: variable.fileMountDir, - fileReferenceId: variable.fileReferenceId, - })) || [] + variableList?.map((variable) => { + const variableConditionDetails: CreatePluginPayloadPluginStepVariableItemType['pluginStepCondition'] = ( + conditionDetailsList || [] + ) + .filter((condition) => condition.conditionOnVariable === variable.name) + .map((condition) => ({ + conditionType: condition.conditionType, + conditionalValue: condition.conditionalValue, + conditionalOperator: condition.conditionOperator, + })) + + return { + id: variable.id, + name: variable.name, + format: variable.format, + description: variable.description, + allowEmptyValue: variable.allowEmptyValue, + defaultValue: variable.defaultValue, + value: variable.value, + variableType, + valueType: variable.variableType, + referenceVariableName: variable.refVariableName, + isExposed: true, + fileMountDir: variable.fileMountDir, + fileReferenceId: variable.fileReferenceId, + ...(variableConditionDetails.length > 0 ? { pluginStepCondition: variableConditionDetails } : {}), + ...(variable.valueConstraint ? { valueConstraint: variable.valueConstraint } : {}), + } + }) || [] export const getCreatePluginPayload = ({ stepData, @@ -140,13 +158,19 @@ export const getCreatePluginPayload = ({ const inlineStepDetail: InlineStepDetailType = stepData.inlineStepDetail || ({} as InlineStepDetailType) + const { inputConditionDetails, outputConditionDetails } = getInputOutputConditionDetails( + inlineStepDetail.conditionDetails || [], + ) + const pluginInputVariables = parseInputVariablesIntoCreatePluginPayload( pluginForm.inputVariables, CreatePluginVariableType.INPUT, + inputConditionDetails, ) const pluginOutputVariables = parseInputVariablesIntoCreatePluginPayload( inlineStepDetail.outputVariables, CreatePluginVariableType.OUTPUT, + outputConditionDetails, ) return { diff --git a/src/components/cdPipeline/cdpipeline.util.tsx b/src/components/cdPipeline/cdpipeline.util.tsx index c5ebf12e6d..4460e84a4c 100644 --- a/src/components/cdPipeline/cdpipeline.util.tsx +++ b/src/components/cdPipeline/cdpipeline.util.tsx @@ -29,6 +29,7 @@ import { PipelineFormType, InputOutputVariablesHeaderKeys, ConditionDataTableHeaderKeys, + ConditionDetails, } from '@devtron-labs/devtron-fe-common-lib' import { ReactComponent as ArrowDown } from '../../assets/icons/ic-chevron-down.svg' import { ReactComponent as Search } from '../../assets/icons/ic-nav-search.svg' @@ -469,6 +470,26 @@ export const filterInvalidConditionDetails = ( ) } +export const getInputOutputConditionDetails = ( + conditionDetails: ConditionDetails[], +): { + inputConditionDetails: ConditionDetails[] + outputConditionDetails: ConditionDetails[] +} => { + const inputConditionDetails = (conditionDetails || []).filter( + (conditionDetail) => + conditionDetail.conditionType === ConditionType.TRIGGER || + conditionDetail.conditionType === ConditionType.SKIP, + ) + const outputConditionDetails = (conditionDetails || []).filter( + (conditionDetail) => + conditionDetail.conditionType === ConditionType.PASS || + conditionDetail.conditionType === ConditionType.FAIL, + ) + + return { inputConditionDetails, outputConditionDetails } +} + export const getNamespacePlaceholder = (isVirtualEnvironment: boolean, namespace: string): string => { if (isVirtualEnvironment && !namespace) { return 'Not available' From cb43dbfd157ae04d887a60dd861e84ab49ef104c Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Wed, 15 Apr 2026 23:24:50 +0530 Subject: [PATCH 02/10] feat: add isRuntimeArg handling to plugin payload and update utility imports --- src/components/CIPipelineN/CreatePluginModal/types.ts | 1 + src/components/CIPipelineN/CreatePluginModal/utils.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/CIPipelineN/CreatePluginModal/types.ts b/src/components/CIPipelineN/CreatePluginModal/types.ts index 4e4388e963..17fe29ac4f 100644 --- a/src/components/CIPipelineN/CreatePluginModal/types.ts +++ b/src/components/CIPipelineN/CreatePluginModal/types.ts @@ -257,6 +257,7 @@ export interface CreatePluginPayloadPluginStepVariableItemType isExposed: true pluginStepCondition?: CreatePluginStepConditionPayload[] valueConstraint?: ValueConstraintType + isRuntimeArg?: VariableType['isRuntimeArg'] } interface CreatePluginPayloadPluginStepsDTO extends Pick { diff --git a/src/components/CIPipelineN/CreatePluginModal/utils.tsx b/src/components/CIPipelineN/CreatePluginModal/utils.tsx index c0a51cf7d9..1acb665246 100644 --- a/src/components/CIPipelineN/CreatePluginModal/utils.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/utils.tsx @@ -25,6 +25,7 @@ import { } from '@devtron-labs/devtron-fe-common-lib' import { getInputOutputConditionDetails } from '@Components/cdPipeline/cdpipeline.util' +import { importComponentFromFELibrary } from '@Components/common' import { CREATE_PLUGIN_DEFAULT_FORM, MAX_TAG_LENGTH } from './constants' import { @@ -39,6 +40,8 @@ import { PathPortMappingType, } from './types' +const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function') + export const getDefaultPluginFormData = (currentInputVariables: VariableType[]): CreatePluginFormType => ({ ...structuredClone(CREATE_PLUGIN_DEFAULT_FORM), inputVariables: currentInputVariables, @@ -138,7 +141,9 @@ const parseInputVariablesIntoCreatePluginPayload = ( fileMountDir: variable.fileMountDir, fileReferenceId: variable.fileReferenceId, ...(variableConditionDetails.length > 0 ? { pluginStepCondition: variableConditionDetails } : {}), - ...(variable.valueConstraint ? { valueConstraint: variable.valueConstraint } : {}), + ...(isFELibAvailable + ? { valueConstraint: variable.valueConstraint, isRuntimeArg: variable.isRuntimeArg } + : {}), } }) || [] From 5ead99e712946e3e89487517c2db37b91cec77cf Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 16 Apr 2026 12:33:51 +0530 Subject: [PATCH 03/10] feat: enhance plugin condition handling by integrating condition details and updating related utilities --- .../CIPipelineN/CreatePluginModal/types.ts | 8 ++--- src/components/CIPipelineN/PreBuild.tsx | 19 ++++++++++-- .../CIPipelineN/ciPipeline.utils.tsx | 30 ++++++++++++++++++- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/components/CIPipelineN/CreatePluginModal/types.ts b/src/components/CIPipelineN/CreatePluginModal/types.ts index 17fe29ac4f..6e574e88ed 100644 --- a/src/components/CIPipelineN/CreatePluginModal/types.ts +++ b/src/components/CIPipelineN/CreatePluginModal/types.ts @@ -15,13 +15,13 @@ */ import { - ConditionDetails, CustomInputProps, EditImageFormFieldProps, InlineStepDetailType, ParentPluginDTO, PluginDataStoreType, PluginDetailType, + PluginStepConditionDTO, PortMapType, SelectPickerOptionType, ServerErrors, @@ -242,10 +242,6 @@ export enum CreatePluginVariableType { OUTPUT = 'OUTPUT', } -interface CreatePluginStepConditionPayload extends Pick { - conditionalOperator: ConditionDetails['conditionOperator'] -} - export interface CreatePluginPayloadPluginStepVariableItemType extends Pick< VariableType, @@ -255,9 +251,9 @@ export interface CreatePluginPayloadPluginStepVariableItemType valueType: VariableType['variableType'] referenceVariableName: VariableType['refVariableName'] isExposed: true - pluginStepCondition?: CreatePluginStepConditionPayload[] valueConstraint?: ValueConstraintType isRuntimeArg?: VariableType['isRuntimeArg'] + pluginStepCondition?: Omit[] } interface CreatePluginPayloadPluginStepsDTO extends Pick { diff --git a/src/components/CIPipelineN/PreBuild.tsx b/src/components/CIPipelineN/PreBuild.tsx index 8be4ed94e3..cccceaef2e 100644 --- a/src/components/CIPipelineN/PreBuild.tsx +++ b/src/components/CIPipelineN/PreBuild.tsx @@ -23,6 +23,8 @@ import { Progressing, CDEmptyState, PluginListContainer, + ConditionDetails, + DetailedPluginVersionType, } from '@devtron-labs/devtron-fe-common-lib' import { PreBuildType } from '../ciPipeline/types' import EmptyPreBuild from '../../assets/img/pre-build-empty.png' @@ -35,6 +37,7 @@ import { ReactComponent as Add } from '../../assets/icons/ic-add.svg' import { TaskDetailComponent } from './TaskDetailComponent' import nojobs from '../../assets/img/empty-joblist.webp' import { pipelineContext } from '../workflowEditor/workflowEditor' +import { getConditionDetailsAndVariablesFromPlugin } from './ciPipeline.utils' export const PreBuild: React.FC = ({ isJobView }) => { const { @@ -77,6 +80,7 @@ export const PreBuild: React.FC = ({ isJobView }) => { pluginDescription?: string, inputVariables?: VariableType[], outputVariables?: VariableType[], + conditionDetails?: ConditionDetails[], ): void { const _form = { ...formData } const _formDataErrorObj = { ...formDataErrorObj } @@ -109,7 +113,7 @@ export const PreBuild: React.FC = ({ isJobView }) => { _form[activeStageName].steps[selectedTaskIndex].pluginRefStepDetail = { id: 0, pluginId, - conditionDetails: [], + conditionDetails: conditionDetails ?? [], inputVariables: inputVariables.map(setVariableStepIndexInPlugin), outputVariables: outputVariables.map(setVariableStepIndexInPlugin), } @@ -132,13 +136,22 @@ export const PreBuild: React.FC = ({ isJobView }) => { const handlePluginSelection = (parentPluginId: number) => { const latestVersionPluginId = pluginDataStore.parentPluginStore[parentPluginId].latestVersionId const pluginDetails = pluginDataStore.pluginVersionStore[latestVersionPluginId] + + const { pluginVariables: pluginInputVariables, pluginConditionDetails: pluginInputConditionDetails } = + getConditionDetailsAndVariablesFromPlugin(pluginDetails.inputVariables) + const { pluginVariables: pluginOutputVariables, pluginConditionDetails: pluginOutputConditionDetails } = + getConditionDetailsAndVariablesFromPlugin(pluginDetails.outputVariables) + + const pluginConditionDetails = [...pluginInputConditionDetails, ...pluginOutputConditionDetails] + setPluginType( PluginType.PLUGIN_REF, pluginDetails.id, pluginDetails.name, pluginDetails.description, - pluginDetails.inputVariables ?? [], - pluginDetails.outputVariables ?? [], + pluginInputVariables, + pluginOutputVariables, + pluginConditionDetails, ) } diff --git a/src/components/CIPipelineN/ciPipeline.utils.tsx b/src/components/CIPipelineN/ciPipeline.utils.tsx index b205a7872b..25f41140d0 100644 --- a/src/components/CIPipelineN/ciPipeline.utils.tsx +++ b/src/components/CIPipelineN/ciPipeline.utils.tsx @@ -13,7 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { OptionType, SourceTypeMap } from '@devtron-labs/devtron-fe-common-lib' +import { + ConditionDetails, + DetailedPluginVersionType, + OptionType, + SourceTypeMap, + VariableType, +} from '@devtron-labs/devtron-fe-common-lib' export const CiPipelineSourceTypeBaseOptions = [ { @@ -62,3 +68,25 @@ export const getCDStageTypeSelectorValue = (customTagStage: string): OptionType } return stageTypeSelectorValue } + +export const getConditionDetailsAndVariablesFromPlugin = (variables: DetailedPluginVersionType['inputVariables']) => { + const pluginConditionDetails: ConditionDetails[] = [] + const pluginVariables = (variables || []).map((variable) => { + const { pluginStepCondition, ...rest } = variable + if (pluginStepCondition) { + ;(pluginStepCondition || []).forEach((condition) => { + pluginConditionDetails.push({ + conditionOnVariable: variable.name, + conditionalValue: condition.conditionalValue, + conditionOperator: condition.conditionalOperator, + conditionType: condition.conditionType, + id: condition.id, + }) + }) + } + + return rest + }) + + return { pluginConditionDetails, pluginVariables } +} From 37def8949d8b4045a669bb6b63ac7564b85f7ac0 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 16 Apr 2026 14:25:26 +0530 Subject: [PATCH 04/10] feat: integrate condition details into plugin creation process --- .../CreatePluginModal.component.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx b/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx index cdd35252ac..04d04520f7 100644 --- a/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/CreatePluginModal.component.tsx @@ -50,6 +50,7 @@ import { import { ReactComponent as ICCross } from '@Icons/ic-cross.svg' import { pipelineContext } from '@Components/workflowEditor/workflowEditor' +import { getConditionDetailsAndVariablesFromPlugin } from '../ciPipeline.utils' import { CREATE_PLUGIN_DEFAULT_FORM_ERROR } from './constants' import CreatePluginFormContent from './CreatePluginFormContent' import { createPlugin, getParentPluginList } from './service' @@ -324,6 +325,13 @@ const CreatePluginModal = ({ handleClose }: CreatePluginModalProps) => { ) const { inputVariables, outputVariables } = updatedPluginDataStore.pluginVersionStore[pluginVersionId] + const { pluginVariables: pluginInputVariables, pluginConditionDetails: pluginInputConditionDetails } = + getConditionDetailsAndVariablesFromPlugin(inputVariables) + const { pluginVariables: pluginOutputVariables, pluginConditionDetails: pluginOutputConditionDetails } = + getConditionDetailsAndVariablesFromPlugin(outputVariables) + + const pluginConditionDetails = [...pluginInputConditionDetails, ...pluginOutputConditionDetails] + const selectedTask: StepType = clonedFormData[activeStageName].steps[selectedTaskIndex] selectedTask.name = pluginForm.name selectedTask.description = pluginForm.description @@ -334,13 +342,13 @@ const CreatePluginModal = ({ handleClose }: CreatePluginModalProps) => { id: 0, pluginId: pluginVersionId, inputVariables: - inputVariables?.map((inputVariable) => ({ + pluginInputVariables?.map((inputVariable) => ({ ...inputVariable, variableType: RefVariableType.NEW, value: pluginFormInputVariableMap[inputVariable.name] || '', })) || [], - outputVariables: outputVariables || [], - conditionDetails: [], + outputVariables: pluginOutputVariables || [], + conditionDetails: pluginConditionDetails, } calculateLastStepDetail(false, clonedFormData, activeStageName) validateStage(BuildStageVariable.PreBuild, clonedFormData, undefined, updatedPluginDataStore) From f2c011c2b942b1633a68d839318566a33508a968 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Fri, 17 Apr 2026 13:14:49 +0530 Subject: [PATCH 05/10] feat: remove unused DetailedPluginVersionType import from PreBuild component --- src/components/CIPipelineN/PreBuild.tsx | 1 - src/components/CIPipelineN/ciPipeline.utils.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/CIPipelineN/PreBuild.tsx b/src/components/CIPipelineN/PreBuild.tsx index cccceaef2e..51ad9917bc 100644 --- a/src/components/CIPipelineN/PreBuild.tsx +++ b/src/components/CIPipelineN/PreBuild.tsx @@ -24,7 +24,6 @@ import { CDEmptyState, PluginListContainer, ConditionDetails, - DetailedPluginVersionType, } from '@devtron-labs/devtron-fe-common-lib' import { PreBuildType } from '../ciPipeline/types' import EmptyPreBuild from '../../assets/img/pre-build-empty.png' diff --git a/src/components/CIPipelineN/ciPipeline.utils.tsx b/src/components/CIPipelineN/ciPipeline.utils.tsx index 25f41140d0..57ad2e20a2 100644 --- a/src/components/CIPipelineN/ciPipeline.utils.tsx +++ b/src/components/CIPipelineN/ciPipeline.utils.tsx @@ -74,7 +74,7 @@ export const getConditionDetailsAndVariablesFromPlugin = (variables: DetailedPlu const pluginVariables = (variables || []).map((variable) => { const { pluginStepCondition, ...rest } = variable if (pluginStepCondition) { - ;(pluginStepCondition || []).forEach((condition) => { + ;(pluginStepCondition).forEach((condition) => { pluginConditionDetails.push({ conditionOnVariable: variable.name, conditionalValue: condition.conditionalValue, From 5377abd217691d12df0aec1a1f5ca96d696fd3bf Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 21 Apr 2026 14:34:20 +0530 Subject: [PATCH 06/10] feat: enhance plugin step condition handling based on FE library availability --- src/components/CIPipelineN/CreatePluginModal/utils.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/CIPipelineN/CreatePluginModal/utils.tsx b/src/components/CIPipelineN/CreatePluginModal/utils.tsx index 1acb665246..a439eff19d 100644 --- a/src/components/CIPipelineN/CreatePluginModal/utils.tsx +++ b/src/components/CIPipelineN/CreatePluginModal/utils.tsx @@ -140,7 +140,9 @@ const parseInputVariablesIntoCreatePluginPayload = ( isExposed: true, fileMountDir: variable.fileMountDir, fileReferenceId: variable.fileReferenceId, - ...(variableConditionDetails.length > 0 ? { pluginStepCondition: variableConditionDetails } : {}), + ...(isFELibAvailable && variableConditionDetails.length > 0 + ? { pluginStepCondition: variableConditionDetails } + : {}), ...(isFELibAvailable ? { valueConstraint: variable.valueConstraint, isRuntimeArg: variable.isRuntimeArg } : {}), From 16ebaa54ee01e279dc2b6e323dbfd9c5c9521dee Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 21 Apr 2026 16:26:16 +0530 Subject: [PATCH 07/10] feat: update devtron-fe-common-lib dependency to version 1.22.2-pre-1 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 373f95beed..69a1eea7ca 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "/dashboard", "dependencies": { - "@devtron-labs/devtron-fe-common-lib": "1.22.2", + "@devtron-labs/devtron-fe-common-lib": "1.22.2-pre-1", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rjsf/core": "^5.13.3", "@rjsf/utils": "^5.13.3", diff --git a/yarn.lock b/yarn.lock index c93d1cd429..bf187f41b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1729,9 +1729,9 @@ __metadata: languageName: node linkType: hard -"@devtron-labs/devtron-fe-common-lib@npm:1.22.2": - version: 1.22.2 - resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2" +"@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-1": + version: 1.22.2-pre-1 + resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-1" dependencies: "@codemirror/autocomplete": "npm:6.18.6" "@codemirror/lang-json": "npm:6.0.1" @@ -1785,7 +1785,7 @@ __metadata: react-select: 5.8.0 rxjs: ^7.8.1 yaml: ^2.4.1 - checksum: 10c0/ee799e53f222753b197a67b2d6ce62246f8559aedf25d5b7e2a5ed5450d5840d8ccb5980e6ee1a3d8ce1c985a88829e354f67303fc14159da149ae8933364534 + checksum: 10c0/190f90adeedfc8e3fe8aee4bbfa7d0ccc22a37c318813a93844af80d4dabed0c9f71a11480805b155930f62a33aebe003a96440d968780612296590bde2e3b0b languageName: node linkType: hard @@ -5599,7 +5599,7 @@ __metadata: version: 0.0.0-use.local resolution: "dashboard@workspace:." dependencies: - "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2" + "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2-pre-1" "@esbuild-plugins/node-globals-polyfill": "npm:0.2.3" "@playwright/test": "npm:^1.32.1" "@rjsf/core": "npm:^5.13.3" From 1442ac91653e7ae4b6a6e3b4b2a1141e83c9d845 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 30 Apr 2026 16:40:52 +0530 Subject: [PATCH 08/10] feat: update devtron-fe-common-lib dependency from version 1.22.2-pre-1 to 1.22.2-beta-0 --- package.json | 2 +- yarn.lock | 30 +++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 69a1eea7ca..e25f73e76d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "/dashboard", "dependencies": { - "@devtron-labs/devtron-fe-common-lib": "1.22.2-pre-1", + "@devtron-labs/devtron-fe-common-lib": "1.22.2-beta-0", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rjsf/core": "^5.13.3", "@rjsf/utils": "^5.13.3", diff --git a/yarn.lock b/yarn.lock index bf187f41b1..15c1eaac39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1729,9 +1729,9 @@ __metadata: languageName: node linkType: hard -"@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-1": - version: 1.22.2-pre-1 - resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-1" +"@devtron-labs/devtron-fe-common-lib@npm:1.22.2-beta-0": + version: 1.22.2-beta-0 + resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2-beta-0" dependencies: "@codemirror/autocomplete": "npm:6.18.6" "@codemirror/lang-json": "npm:6.0.1" @@ -1746,6 +1746,7 @@ __metadata: "@replit/codemirror-indentation-markers": "npm:6.5.3" "@replit/codemirror-vscode-keymap": "npm:6.0.2" "@tanstack/react-query": "npm:<5" + "@tanstack/react-virtual": "npm:^3.13.24" "@uiw/codemirror-extensions-hyper-link": "npm:4.23.10" "@uiw/codemirror-theme-github": "npm:4.23.7" "@uiw/react-codemirror": "npm:4.23.7" @@ -1785,7 +1786,7 @@ __metadata: react-select: 5.8.0 rxjs: ^7.8.1 yaml: ^2.4.1 - checksum: 10c0/190f90adeedfc8e3fe8aee4bbfa7d0ccc22a37c318813a93844af80d4dabed0c9f71a11480805b155930f62a33aebe003a96440d968780612296590bde2e3b0b + checksum: 10c0/6053e359afb7ecd792c255fc9f6e38228d5c0634ebce16e3991ff4ebb4c28f5320fb453f15fcf25005b5ba462cca693236a5fdbf8312a3b564c3cc900a9feb77 languageName: node linkType: hard @@ -3591,6 +3592,25 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-virtual@npm:^3.13.24": + version: 3.13.24 + resolution: "@tanstack/react-virtual@npm:3.13.24" + dependencies: + "@tanstack/virtual-core": "npm:3.14.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/f409b2bb67965a513b75a1403e622c0b86c88c67419f757c79f670615979e38dc7ad5569a02c924741697df3d4301a0f45208fd4b9f935a5d58dd83e1db5622a + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.14.0": + version: 3.14.0 + resolution: "@tanstack/virtual-core@npm:3.14.0" + checksum: 10c0/9e07e7f74f5e02dfc47b358f7b5089e680d8b14b9c5b90e9497be6f57c76ca98d185fbe5008795b89919346bfc3676ebe1c61b34980eefe6674c88ec6ff4b136 + languageName: node + linkType: hard + "@testing-library/dom@npm:^8.0.0": version: 8.20.1 resolution: "@testing-library/dom@npm:8.20.1" @@ -5599,7 +5619,7 @@ __metadata: version: 0.0.0-use.local resolution: "dashboard@workspace:." dependencies: - "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2-pre-1" + "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2-beta-0" "@esbuild-plugins/node-globals-polyfill": "npm:0.2.3" "@playwright/test": "npm:^1.32.1" "@rjsf/core": "npm:^5.13.3" From 855e3f60088d79b4adb0eaf9930b0e67f99bf819 Mon Sep 17 00:00:00 2001 From: Arun Jain Date: Mon, 4 May 2026 15:00:21 +0530 Subject: [PATCH 09/10] fix: ensure terminal font is loaded before initialization to prevent incorrect cell dimensions --- .../nodeDetail/NodeDetailTabs/terminal/Terminal.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/terminal/Terminal.tsx b/src/components/v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/terminal/Terminal.tsx index da73a16d33..12dacd9cd9 100644 --- a/src/components/v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/terminal/Terminal.tsx +++ b/src/components/v2/appDetails/k8Resource/nodeDetail/NodeDetailTabs/terminal/Terminal.tsx @@ -86,14 +86,18 @@ const TerminalView = ({ } }, [termDivRef.current]) - const createNewTerminal = () => { + const createNewTerminal = async () => { + // Ensure the font is loaded before xterm measures character cell dimensions. + // Without this, xterm falls back to a system font and gets wrong cell widths. + await document.fonts.load('14px Inconsolata').catch(noop) + // eslint-disable-next-line no-param-reassign terminalRef.current = new Terminal({ scrollback: 99999, fontSize: 14, lineHeight: 1.4, cursorBlink: false, - fontFamily: 'Inconsolata', + fontFamily: 'Inconsolata, monospace', screenReaderMode: true, theme: { // Cannot use variables here @@ -208,9 +212,7 @@ const TerminalView = ({ useEffect(() => { if (!terminalRef.current) { elementDidMount('#terminal-id') - .then(() => { - createNewTerminal() - }) + .then(() => createNewTerminal()) .catch(noop) } if (sessionId && terminalRef.current) { From 468ee1dec9478eb9c352b427ae99d99c6268c322 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 5 May 2026 12:26:58 +0530 Subject: [PATCH 10/10] feat: update devtron-fe-common-lib dependency from version 1.22.2-beta-0 to 1.22.2-pre-2 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e25f73e76d..f79ab5f0a3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "homepage": "/dashboard", "dependencies": { - "@devtron-labs/devtron-fe-common-lib": "1.22.2-beta-0", + "@devtron-labs/devtron-fe-common-lib": "1.22.2-pre-2", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@rjsf/core": "^5.13.3", "@rjsf/utils": "^5.13.3", diff --git a/yarn.lock b/yarn.lock index 15c1eaac39..808b023c64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1729,9 +1729,9 @@ __metadata: languageName: node linkType: hard -"@devtron-labs/devtron-fe-common-lib@npm:1.22.2-beta-0": - version: 1.22.2-beta-0 - resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2-beta-0" +"@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-2": + version: 1.22.2-pre-2 + resolution: "@devtron-labs/devtron-fe-common-lib@npm:1.22.2-pre-2" dependencies: "@codemirror/autocomplete": "npm:6.18.6" "@codemirror/lang-json": "npm:6.0.1" @@ -1786,7 +1786,7 @@ __metadata: react-select: 5.8.0 rxjs: ^7.8.1 yaml: ^2.4.1 - checksum: 10c0/6053e359afb7ecd792c255fc9f6e38228d5c0634ebce16e3991ff4ebb4c28f5320fb453f15fcf25005b5ba462cca693236a5fdbf8312a3b564c3cc900a9feb77 + checksum: 10c0/443852e194dc394ee45fa183a4171896305b5290be45d621ff2930e3d368660c45bde84cc17b43196accd1898779021a11c73bd29320d7a9a3fa0881947caffa languageName: node linkType: hard @@ -5619,7 +5619,7 @@ __metadata: version: 0.0.0-use.local resolution: "dashboard@workspace:." dependencies: - "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2-beta-0" + "@devtron-labs/devtron-fe-common-lib": "npm:1.22.2-pre-2" "@esbuild-plugins/node-globals-polyfill": "npm:0.2.3" "@playwright/test": "npm:^1.32.1" "@rjsf/core": "npm:^5.13.3"