From 5fda97eadfe669c33a303b3ee8c5cf50d5b7c677 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 4 Nov 2025 11:47:30 +0530 Subject: [PATCH 01/13] feat: add support for abort signal in getClusterOptions function --- src/Shared/Services/common.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Shared/Services/common.service.ts b/src/Shared/Services/common.service.ts index 4da269fb8..186bc64de 100644 --- a/src/Shared/Services/common.service.ts +++ b/src/Shared/Services/common.service.ts @@ -41,8 +41,8 @@ export const saveCDPipeline = (request, { isTemplateView }: Required get(ROUTES.ENVIRONMENT_DATA) -export const getClusterOptions = async (): Promise => { - const { result } = await get(ROUTES.CLUSTER_LIST_MIN) +export const getClusterOptions = async (signal?: AbortSignal): Promise => { + const { result } = await get(ROUTES.CLUSTER_LIST_MIN, { signal }) if (!result) { return [] From 41b0b8fc0291c26268b24680144b9ee3e95e06b9 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Thu, 6 Nov 2025 13:39:02 +0530 Subject: [PATCH 02/13] feat: add isUserIdentifier prop to SelectPicker components for user-specific rendering --- .../SelectPicker/FilterSelectPicker.tsx | 2 + .../SelectPicker/SelectPicker.component.tsx | 9 +++- src/Shared/Components/SelectPicker/common.tsx | 43 ++++++++++++++++--- src/Shared/Components/SelectPicker/type.ts | 3 ++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx b/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx index 1bfa388f3..1971725fd 100644 --- a/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx +++ b/src/Shared/Components/SelectPicker/FilterSelectPicker.tsx @@ -34,6 +34,7 @@ const FilterSelectPicker = ({ options, menuIsOpen = false, onMenuClose, + isUserIdentifier, ...props }: FilterSelectPickerProps) => { const selectRef = useRef['selectRef']['current']>() @@ -110,6 +111,7 @@ const FilterSelectPicker = ({
{...props} + isUserIdentifier={isUserIdentifier} selectRef={selectRef} options={options} value={selectedOptions} diff --git a/src/Shared/Components/SelectPicker/SelectPicker.component.tsx b/src/Shared/Components/SelectPicker/SelectPicker.component.tsx index 72e2b2ef1..8251b3892 100644 --- a/src/Shared/Components/SelectPicker/SelectPicker.component.tsx +++ b/src/Shared/Components/SelectPicker/SelectPicker.component.tsx @@ -199,6 +199,7 @@ const SelectPicker = ({ menuPosition = 'fixed', variant = SelectPickerVariantType.DEFAULT, disableDescriptionEllipsis = false, + isUserIdentifier = false, multiSelectProps = {}, isMulti, name, @@ -302,9 +303,13 @@ const SelectPicker = ({ const renderOption = useCallback( (optionProps: OptionProps>) => ( - + ), - [disableDescriptionEllipsis], + [disableDescriptionEllipsis, isUserIdentifier], ) const renderMultiValue = (multiValueProps: MultiValueProps, true>) => ( diff --git a/src/Shared/Components/SelectPicker/common.tsx b/src/Shared/Components/SelectPicker/common.tsx index 38d0d32af..a10bb5335 100644 --- a/src/Shared/Components/SelectPicker/common.tsx +++ b/src/Shared/Components/SelectPicker/common.tsx @@ -32,11 +32,11 @@ import { ReactComponent as ICCaretDown } from '@Icons/ic-caret-down.svg' import { ReactComponent as ICClose } from '@Icons/ic-close.svg' import { Checkbox } from '@Common/Checkbox' import { ReactSelectInputAction } from '@Common/Constants' -import { noop } from '@Common/Helper' +import { getAlphabetIcon, noop } from '@Common/Helper' import { Progressing } from '@Common/Progressing' import { Tooltip, TooltipProps } from '@Common/Tooltip' import { CHECKBOX_VALUE } from '@Common/Types' -import { ComponentSizeType } from '@Shared/constants' +import { API_TOKEN_PREFIX, ComponentSizeType } from '@Shared/constants' import { isNullOrUndefined } from '@Shared/Helpers' import { Button, ButtonProps, ButtonVariantType } from '../Button' @@ -191,9 +191,10 @@ export const SelectPickerValueContainer = export const SelectPickerOption = ({ disableDescriptionEllipsis, + isUserIdentifier, ...props }: OptionProps> & - Pick, 'disableDescriptionEllipsis'>) => { + Pick, 'disableDescriptionEllipsis' | 'isUserIdentifier'>) => { const { label, data, @@ -215,17 +216,47 @@ export const SelectPickerOption = ({ const iconBaseClass = 'dc__no-shrink icon-dim-16 flex dc__fill-available-space' + const showUserAvatar = isUserIdentifier && !isSelected && typeof label === 'string' + + const renderLabelText = () => { + if (showUserAvatar && label.startsWith(API_TOKEN_PREFIX)) { + return label.split(':')?.[1] || '-' + } + + return label + } + + const renderAvatar = () => { + if (!showUserAvatar) { + return null + } + + return ( +
+ {label.startsWith(API_TOKEN_PREFIX) ? ( + + ) : ( + getAlphabetIcon(label, 'dc__no-shrink m-0-imp') + )} +
+ ) + } + return ( - +
+ {showUserAvatar && renderAvatar()} {isMulti && showCheckboxForMultiSelect && !isCreatableOption && ( )} @@ -243,7 +274,7 @@ export const SelectPickerOption = ({

- {label} + {renderLabelText()}

{/* Add support for custom ellipsis if required */} diff --git a/src/Shared/Components/SelectPicker/type.ts b/src/Shared/Components/SelectPicker/type.ts index f32436e92..e09ce9ee4 100644 --- a/src/Shared/Components/SelectPicker/type.ts +++ b/src/Shared/Components/SelectPicker/type.ts @@ -310,6 +310,7 @@ export type SelectPickerProps, 'customDisplayText'>> & { /** * If true, the group heading can be selected @@ -328,6 +329,7 @@ export type SelectPickerProps { appliedFilterOptions: SelectPickerOptionType[] handleApplyFilter: (filtersToApply: SelectPickerOptionType[]) => void From e511bff89bd1bd173736bd09541c0b582c60a079 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Fri, 14 Nov 2025 14:50:10 +0530 Subject: [PATCH 03/13] feat: add construe & cronjs-parser --- package-lock.json | 17 +++++++++++++++++ package.json | 2 ++ src/Shared/Helpers.tsx | 15 +++++++++++++++ src/Shared/validations.tsx | 33 ++++++++++----------------------- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index f80cc192f..327d1308e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@codemirror/lint": "6.8.4", "@codemirror/merge": "^6.10.0", "@codemirror/search": "6.5.8", + "@datasert/cronjs-parser": "^1.4.0", "@lezer/highlight": "1.2.1", "@replit/codemirror-indentation-markers": "6.5.3", "@replit/codemirror-vscode-keymap": "6.0.2", @@ -29,6 +30,7 @@ "ansi_up": "^5.2.1", "chart.js": "^4.5.0", "codemirror-json-schema": "0.8.0", + "cronstrue": "^3.9.0", "dayjs": "^1.11.13", "fast-json-patch": "^3.1.1", "focus-trap-react": "^10.3.1", @@ -697,6 +699,12 @@ "w3c-keyname": "^2.2.4" } }, + "node_modules/@datasert/cronjs-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@datasert/cronjs-parser/-/cronjs-parser-1.4.0.tgz", + "integrity": "sha512-zHGlrWanS4Zjgf0aMi/sp/HTSa2xWDEtXW9xshhlGf/jPx3zTIqfX14PZnoFF7XVOwzC49Zy0SFWG90rlRY36Q==", + "license": "MIT" + }, "node_modules/@emnapi/runtime": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", @@ -5633,6 +5641,15 @@ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" }, + "node_modules/cronstrue": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-3.9.0.tgz", + "integrity": "sha512-T3S35zmD0Ai2B4ko6+mEM+k9C6tipe2nB9RLiGT6QL2Wn0Vsn2cCZAC8Oeuf4CaE00GZWVdpYitbpWCNlIWqdA==", + "license": "MIT", + "bin": { + "cronstrue": "bin/cli.js" + } + }, "node_modules/cross-spawn": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", diff --git a/package.json b/package.json index 5f9fc44de..c6aa9013b 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "@codemirror/lint": "6.8.4", "@codemirror/merge": "^6.10.0", "@codemirror/search": "6.5.8", + "@datasert/cronjs-parser": "^1.4.0", "@lezer/highlight": "1.2.1", "@replit/codemirror-indentation-markers": "6.5.3", "@replit/codemirror-vscode-keymap": "6.0.2", @@ -119,6 +120,7 @@ "ansi_up": "^5.2.1", "chart.js": "^4.5.0", "codemirror-json-schema": "0.8.0", + "cronstrue": "^3.9.0", "dayjs": "^1.11.13", "fast-json-patch": "^3.1.1", "focus-trap-react": "^10.3.1", diff --git a/src/Shared/Helpers.tsx b/src/Shared/Helpers.tsx index 2970db166..be06ee862 100644 --- a/src/Shared/Helpers.tsx +++ b/src/Shared/Helpers.tsx @@ -17,8 +17,10 @@ /* eslint-disable no-param-reassign */ import { ReactElement, useEffect, useRef, useState } from 'react' import { PromptProps } from 'react-router-dom' +import { parse as parseCronExpression } from '@datasert/cronjs-parser' import { StrictRJSFSchema } from '@rjsf/utils' import Tippy from '@tippyjs/react' +import cronstrue from 'cronstrue' import { animate } from 'framer-motion' import moment from 'moment' import { nanoid } from 'nanoid' @@ -752,3 +754,16 @@ export const formatNumberToCurrency = (value: number, currency: string, minimumF return value.toFixed(precision) } } + +/** + * Returns the human readable explanation of the expression + * NOTE: expectation is that the expression is valid + * + * @throws Error - if given expression is incorrect + * @param expression + * @returns string - helper text explaining the expression in a human readable format + */ +export const explainCronExpression = (expression: string): string => { + parseCronExpression(expression, { hasSeconds: expression.trim().split(' ').length > 5 }) + return cronstrue.toString(expression) +} diff --git a/src/Shared/validations.tsx b/src/Shared/validations.tsx index 419b773e2..1f3d936a0 100644 --- a/src/Shared/validations.tsx +++ b/src/Shared/validations.tsx @@ -14,6 +14,7 @@ * limitations under the License. */ +import { parse as parseCronExpression } from '@datasert/cronjs-parser' import { customizeValidator } from '@rjsf/validator-ajv8' import { parse } from 'yaml' @@ -546,31 +547,17 @@ export const getIsRegexValid = (regexString: string): ValidationResponseType => } } -export const validateCronExpression = (cron: string): ValidationResponseType => { - // Basic cron validation - 5 parts separated by spaces - const parts = cron.trim().split(/\s+/) - if (parts.length !== 5) { - return { isValid: false, message: 'Cron expression must have 5 parts separated by spaces' } - } - - const isValid = parts.every((part) => { - if (part === '*') return true - if (/^\d+$/.test(part)) return true - if (/^\d+-\d+$/.test(part)) return true - if (/^\*\/\d+$/.test(part)) return true - if (/^(\d+,)+\d+$/.test(part)) return true - return false - }) +export const validateCronExpression = (expression: string): ValidationResponseType => { + try { + parseCronExpression(expression, { hasSeconds: expression.trim().split(' ').length > 5 }) - // Basic validation - each part should be either * or a number or a range - if (isValid) { return { - isValid, + isValid: true, + } + } catch (err) { + return { + isValid: false, + message: (err as Error).message, } - } - - return { - isValid: false, - message: 'Invalid cron expression format', } } From 8e151c57da03bc7be086dc8d568b5be6104a03a6 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Thu, 20 Nov 2025 08:51:03 +0530 Subject: [PATCH 04/13] feat: add getK8sResourceManifest service --- src/Pages/ResourceBrowser/service.ts | 20 +++++++++++++++++++- src/Pages/ResourceBrowser/types.ts | 6 ++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Pages/ResourceBrowser/service.ts b/src/Pages/ResourceBrowser/service.ts index 588f5d8a7..281e4b504 100644 --- a/src/Pages/ResourceBrowser/service.ts +++ b/src/Pages/ResourceBrowser/service.ts @@ -18,16 +18,19 @@ import { get, post, put, trash } from '@Common/API' import { ROUTES } from '@Common/Constants' import { APIOptions, ResponseType } from '@Common/Types' +import { createResourceRequestBody } from '..' import { CreateResourceDTO, CreateResourcePayload, + GVKType, K8sResourceDetailType, K8sResourceListPayloadType, NodeActionRequest, ResourceListPayloadType, + ResourceManifestDTO, ResourceType, } from './ResourceBrowser.Types' -import { ClusterDetail, NodeCordonRequest } from './types' +import { ClusterDetail, GetResourceManifestProps, NodeCordonRequest } from './types' export const getK8sResourceList = ( resourceListPayload: K8sResourceListPayloadType, @@ -65,3 +68,18 @@ export const drainNodeCapacity = ( export const getClusterListRaw = (abortControllerRef?: APIOptions['abortControllerRef']) => get(ROUTES.CLUSTER_LIST_RAW, { abortControllerRef }) + +export const getK8sResourceManifest = ({ selectedResource, signal }: GetResourceManifestProps) => + post( + ROUTES.K8S_RESOURCE, + createResourceRequestBody({ + clusterId: selectedResource.clusterId, + group: selectedResource.group, + version: selectedResource.version, + kind: selectedResource.kind as GVKType['Kind'], + name: selectedResource.name, + namespace: selectedResource.namespace, + updatedManifest: null, + }), + { signal }, + ) diff --git a/src/Pages/ResourceBrowser/types.ts b/src/Pages/ResourceBrowser/types.ts index 4ba0a8f9a..8435914c2 100644 --- a/src/Pages/ResourceBrowser/types.ts +++ b/src/Pages/ResourceBrowser/types.ts @@ -18,6 +18,7 @@ import { Dispatch, ReactElement, SetStateAction } from 'react' import { TabProps } from '@Shared/Components' import { InstallationClusterType } from '@Shared/types' +import { SelectedResourceType } from '@Pages/Applications/DevtronApps/Details/CDPipeline/types' import { NodeActionRequest } from './ResourceBrowser.Types' @@ -170,3 +171,8 @@ export enum ResourceBrowserActionMenuEnum { delete = 'delete', vulnerability = 'vulnerability', } + +export interface GetResourceManifestProps { + selectedResource: SelectedResourceType + signal: AbortSignal +} From 9351b016075245888624dc4feeb219963da50e88 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Wed, 26 Nov 2025 14:39:50 +0530 Subject: [PATCH 05/13] fix: rowOnHover sizing --- src/Shared/Components/Table/TableContent.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Shared/Components/Table/TableContent.tsx b/src/Shared/Components/Table/TableContent.tsx index 11c1d4a5f..798acd5d1 100644 --- a/src/Shared/Components/Table/TableContent.tsx +++ b/src/Shared/Components/Table/TableContent.tsx @@ -92,7 +92,7 @@ const TableContent = < } = resizableConfig ?? {} const gridTemplateColumns = rowOnHoverComponentWidth - ? `${initialGridTemplateColumns} ${typeof rowOnHoverComponentWidth === 'number' ? `${rowOnHoverComponentWidth}px` : rowOnHoverComponentWidth}` + ? `${initialGridTemplateColumns} ${typeof rowOnHoverComponentWidth === 'number' ? `minmax(${rowOnHoverComponentWidth}px, 1fr)` : rowOnHoverComponentWidth}` : initialGridTemplateColumns useEffect(() => { @@ -110,7 +110,7 @@ const TableContent = < rowsContainerRef.current.addEventListener('keydown', preventScrollByKeyboard) }, []) - const bulkSelectionCount = isBulkSelectionApplied && rows ? rows.length : (getSelectedIdentifiersCount?.() ?? 0) + const bulkSelectionCount = isBulkSelectionApplied ? totalRows : (getSelectedIdentifiersCount?.() ?? 0) const visibleRows = useMemo(() => { const normalizedFilteredRows = filteredRows ?? [] From 51e03b193e6df95a281dc9faabf00838477edf73 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Wed, 26 Nov 2025 15:06:17 +0530 Subject: [PATCH 06/13] chore: update common-lib version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 94dcb64a7..31e85a5d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-pre-51", + "version": "1.20.6-alpha-95", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-pre-51", + "version": "1.20.6-alpha-95", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 566a30250..ad50850e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-pre-51", + "version": "1.20.6-alpha-95", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", From 64932a76cda6a30e654960d30469689600be6831 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Fri, 28 Nov 2025 13:09:26 +0530 Subject: [PATCH 07/13] chore: manual chunk cronstrue --- vite.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index bbf0c0665..5f8743896 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -64,6 +64,10 @@ export default defineConfig({ assetFileNames: 'assets/[name][extname]', entryFileNames: '[name].js', manualChunks(id: string) { + if (id.includes('/node_modules/cronstrue')) { + return '@cronstrue' + } + if (id.includes('/node_modules/react-dates')) { return '@react-dates' } From 38d325f20460ac316d383515fbe8be73d81e6d78 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Fri, 28 Nov 2025 13:48:22 +0530 Subject: [PATCH 08/13] fix: remove getK8sResourceManifest --- src/Pages/ResourceBrowser/service.ts | 20 +------------------- src/Pages/ResourceBrowser/types.ts | 6 ------ vite.config.ts | 4 ---- 3 files changed, 1 insertion(+), 29 deletions(-) diff --git a/src/Pages/ResourceBrowser/service.ts b/src/Pages/ResourceBrowser/service.ts index 281e4b504..588f5d8a7 100644 --- a/src/Pages/ResourceBrowser/service.ts +++ b/src/Pages/ResourceBrowser/service.ts @@ -18,19 +18,16 @@ import { get, post, put, trash } from '@Common/API' import { ROUTES } from '@Common/Constants' import { APIOptions, ResponseType } from '@Common/Types' -import { createResourceRequestBody } from '..' import { CreateResourceDTO, CreateResourcePayload, - GVKType, K8sResourceDetailType, K8sResourceListPayloadType, NodeActionRequest, ResourceListPayloadType, - ResourceManifestDTO, ResourceType, } from './ResourceBrowser.Types' -import { ClusterDetail, GetResourceManifestProps, NodeCordonRequest } from './types' +import { ClusterDetail, NodeCordonRequest } from './types' export const getK8sResourceList = ( resourceListPayload: K8sResourceListPayloadType, @@ -68,18 +65,3 @@ export const drainNodeCapacity = ( export const getClusterListRaw = (abortControllerRef?: APIOptions['abortControllerRef']) => get(ROUTES.CLUSTER_LIST_RAW, { abortControllerRef }) - -export const getK8sResourceManifest = ({ selectedResource, signal }: GetResourceManifestProps) => - post( - ROUTES.K8S_RESOURCE, - createResourceRequestBody({ - clusterId: selectedResource.clusterId, - group: selectedResource.group, - version: selectedResource.version, - kind: selectedResource.kind as GVKType['Kind'], - name: selectedResource.name, - namespace: selectedResource.namespace, - updatedManifest: null, - }), - { signal }, - ) diff --git a/src/Pages/ResourceBrowser/types.ts b/src/Pages/ResourceBrowser/types.ts index 8435914c2..4ba0a8f9a 100644 --- a/src/Pages/ResourceBrowser/types.ts +++ b/src/Pages/ResourceBrowser/types.ts @@ -18,7 +18,6 @@ import { Dispatch, ReactElement, SetStateAction } from 'react' import { TabProps } from '@Shared/Components' import { InstallationClusterType } from '@Shared/types' -import { SelectedResourceType } from '@Pages/Applications/DevtronApps/Details/CDPipeline/types' import { NodeActionRequest } from './ResourceBrowser.Types' @@ -171,8 +170,3 @@ export enum ResourceBrowserActionMenuEnum { delete = 'delete', vulnerability = 'vulnerability', } - -export interface GetResourceManifestProps { - selectedResource: SelectedResourceType - signal: AbortSignal -} diff --git a/vite.config.ts b/vite.config.ts index 5f8743896..bbf0c0665 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -64,10 +64,6 @@ export default defineConfig({ assetFileNames: 'assets/[name][extname]', entryFileNames: '[name].js', manualChunks(id: string) { - if (id.includes('/node_modules/cronstrue')) { - return '@cronstrue' - } - if (id.includes('/node_modules/react-dates')) { return '@react-dates' } From 2246159bebc26f91992bd686b99d776964bbdb4f Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Mon, 1 Dec 2025 11:00:26 +0530 Subject: [PATCH 09/13] feat: keep all across selection optional --- src/Shared/Components/Table/TableContent.tsx | 7 ++++++- src/Shared/Components/Table/types.ts | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Shared/Components/Table/TableContent.tsx b/src/Shared/Components/Table/TableContent.tsx index 798acd5d1..f7239c885 100644 --- a/src/Shared/Components/Table/TableContent.tsx +++ b/src/Shared/Components/Table/TableContent.tsx @@ -69,6 +69,7 @@ const TableContent = < bulkActionsData = null, BulkOperationModal, bulkOperationModalData = null, + disableSelectAllAcrossEvenIfPaginated = false, } = bulkSelectionConfig ?? {} const { showSeparatorBetweenRows = true } = stylesConfig ?? {} @@ -364,7 +365,11 @@ const TableContent = < diff --git a/src/Shared/Components/Table/types.ts b/src/Shared/Components/Table/types.ts index f871c5f1b..0d729b82a 100644 --- a/src/Shared/Components/Table/types.ts +++ b/src/Shared/Components/Table/types.ts @@ -169,6 +169,7 @@ export interface BulkOperationModalProps< type BulkSelectionConfigType = Pick, 'getSelectAllDialogStatus'> & { BulkActionsComponent: FunctionComponent BulkOperationModal: FunctionComponent + disableSelectAllAcrossEvenIfPaginated?: boolean } & Pick & Pick From 2fde9bfbdfc9d7049f42851499665a9f9a7ae495 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Mon, 1 Dec 2025 11:01:31 +0530 Subject: [PATCH 10/13] chore: update common-lib version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31e85a5d0..19a0f2bfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-95", + "version": "1.20.6-alpha-93", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-95", + "version": "1.20.6-alpha-93", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ad50850e6..0a2e20ed9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-95", + "version": "1.20.6-alpha-93", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", From 7c0eaedd009e527bd6dfa03688675c842f22a006 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Thu, 4 Dec 2025 10:43:43 +0530 Subject: [PATCH 11/13] chore: bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2b703d54..bdf41299d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-94", + "version": "1.20.6-alpha-73", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-94", + "version": "1.20.6-alpha-73", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 865b0fcd3..c26187fd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-94", + "version": "1.20.6-alpha-73", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", From 522a86af96d50d26b06e12ae206e0b8d05fdfa8f Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Thu, 4 Dec 2025 14:43:25 +0530 Subject: [PATCH 12/13] fix: selectPickerTextArea on enter selection condition --- .../SelectPickerTextArea.component.tsx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Shared/Components/SelectPicker/SelectPickerTextArea.component.tsx b/src/Shared/Components/SelectPicker/SelectPickerTextArea.component.tsx index 443058f67..5fe8fdb38 100644 --- a/src/Shared/Components/SelectPicker/SelectPickerTextArea.component.tsx +++ b/src/Shared/Components/SelectPicker/SelectPickerTextArea.component.tsx @@ -105,6 +105,21 @@ export const SelectPickerTextArea = ({ selectRef.current.blurInput() } + /** + * Create an option if no option preselectec & input is dirty + * @returns boolean - true if option was created + */ + const updateValueIfOnlyDirty = (): boolean => { + const selectValue = value as SingleValue> + + if (isCreatable && (!selectValue?.value || selectValue.value !== inputValue)) { + handleCreateOption(inputValue) + return true + } + + return false + } + const onInputChange = (newValue: string, { action }: InputActionMeta) => { if (action === ReactSelectInputAction.inputChange) { setInputValue(newValue) @@ -116,11 +131,10 @@ export const SelectPickerTextArea = ({ }) } } else if (action === ReactSelectInputAction.inputBlur) { - const selectValue = value as SingleValue> - if (isCreatable && (!selectValue?.value || selectValue.value !== inputValue)) { - handleCreateOption(inputValue) + if (updateValueIfOnlyDirty()) { return } + const selectValue = value as SingleValue> // Reverting input to previously selected value in case of blur event. (no-selection) setInputValue(selectValue?.value || '') } @@ -172,9 +186,7 @@ export const SelectPickerTextArea = ({ return } - if (isCreatable && event.key === 'Enter') { - handleCreateOption(inputValue) - } + updateValueIfOnlyDirty() } return ( From 720c40f8b8d08e0d6275c45f99b79b51699e3e70 Mon Sep 17 00:00:00 2001 From: Amrit Kashyap Borah Date: Thu, 4 Dec 2025 14:59:05 +0530 Subject: [PATCH 13/13] chore: bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdf41299d..c924adf35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-73", + "version": "1.20.6-alpha-72", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-73", + "version": "1.20.6-alpha-72", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index c26187fd8..8c1ddbbb5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.20.6-alpha-73", + "version": "1.20.6-alpha-72", "description": "Supporting common component library", "type": "module", "main": "dist/index.js",