From b6a87a4fe36be0ab5c7f6df034a40811c8f7c0a5 Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Thu, 12 Oct 2023 12:59:34 -0700 Subject: [PATCH 1/7] Added newer_noncurrent_versions options to add ILM rule modal, handler WIP edit lifecyle rule with versions count Fixed lint error Fix lint error Fix lint errors correctly Fix lint error Removed changes to EditILMRule to put in new PR Removed newer_noncurrent_version_transition elements UI cleanup enabling button, display correct unit --- models/add_bucket_lifecycle.go | 3 ++ models/expiration_response.go | 3 ++ portal-ui/src/api/consoleApi.ts | 8 +++++ .../BucketDetails/AddLifecycleModal.tsx | 26 +++++++++++++--- .../BucketDetails/BucketLifecyclePanel.tsx | 31 +++++++++++++------ .../src/screens/Console/Buckets/types.tsx | 1 + restapi/embedded_spec.go | 20 ++++++++++++ restapi/user_buckets_lifecycle.go | 25 +++++++++------ swagger.yml | 8 +++++ 9 files changed, 101 insertions(+), 24 deletions(-) diff --git a/models/add_bucket_lifecycle.go b/models/add_bucket_lifecycle.go index ff9e933720..6af45297d1 100644 --- a/models/add_bucket_lifecycle.go +++ b/models/add_bucket_lifecycle.go @@ -46,6 +46,9 @@ type AddBucketLifecycle struct { // Required in case of expiry_date or transition fields are not set. it defines an expiry days for ILM ExpiryDays int32 `json:"expiry_days,omitempty"` + // Non required, can be set in case of expiration is enabled + NewerNoncurrentversionExpirationVersions int32 `json:"newer_noncurrentversion_expiration_versions,omitempty"` + // Non required, can be set in case of expiration is enabled NoncurrentversionExpirationDays int32 `json:"noncurrentversion_expiration_days,omitempty"` diff --git a/models/expiration_response.go b/models/expiration_response.go index e4c42a87c5..961ad3defe 100644 --- a/models/expiration_response.go +++ b/models/expiration_response.go @@ -43,6 +43,9 @@ type ExpirationResponse struct { // delete marker DeleteMarker bool `json:"delete_marker,omitempty"` + // newer noncurrent expiration versions + NewerNoncurrentExpirationVersions int64 `json:"newer_noncurrent_expiration_versions,omitempty"` + // noncurrent expiration days NoncurrentExpirationDays int64 `json:"noncurrent_expiration_days,omitempty"` } diff --git a/portal-ui/src/api/consoleApi.ts b/portal-ui/src/api/consoleApi.ts index 8a15145526..ce0fa3a4ee 100644 --- a/portal-ui/src/api/consoleApi.ts +++ b/portal-ui/src/api/consoleApi.ts @@ -880,6 +880,8 @@ export interface ExpirationResponse { delete_marker?: boolean; /** @format int64 */ noncurrent_expiration_days?: number; + /** @format int64 */ + newer_noncurrent_expiration_versions?: number; } export interface TransitionResponse { @@ -943,6 +945,12 @@ export interface AddBucketLifecycle { * @default 0 */ noncurrentversion_transition_days?: number; + /** + * Non required, can be set in case of expiration is enabled + * @format int32 + * @default 0 + */ + newer_noncurrentversion_expiration_versions?: number; /** Non required, can be set in case of transition is enabled */ noncurrentversion_transition_storage_class?: string; } diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index ac40702370..62bddb0313 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -74,6 +74,7 @@ const AddLifecycleModal = ({ const [loadingVersioning, setLoadingVersioning] = useState(true); const [expandedAdv, setExpandedAdv] = useState(false); const [expanded, setExpanded] = useState(false); + const [expiryUnit, setExpiryUnit] = useState("days"); /*To be removed on component replacement*/ const formFieldRowFilter = { @@ -116,7 +117,11 @@ const AddLifecycleModal = ({ valid = false; } } + if (!lifecycleDays || parseInt(lifecycleDays) === 0) { + valid = false; + } setIsFormValid(valid); + console.log("set to valid: ", valid, " lifecycledays: ", lifecycleDays); }, [ilmType, lifecycleDays, storageClass]); useEffect(() => { @@ -142,8 +147,11 @@ const AddLifecycleModal = ({ if (targetVersion === "current") { expiry["expiry_days"] = parseInt(lifecycleDays); - } else { + } else if (expiryUnit === "days") { expiry["noncurrentversion_expiration_days"] = parseInt(lifecycleDays); + } else { + expiry["newer_noncurrentversion_expiration_versions"] = + parseInt(lifecycleDays); } rules = { @@ -154,7 +162,7 @@ const AddLifecycleModal = ({ if (targetVersion === "current") { transition["transition_days"] = parseInt(lifecycleDays); transition["storage_class"] = storageClass; - } else { + } else if (expiryUnit === "days") { transition["noncurrentversion_transition_days"] = parseInt(lifecycleDays); transition["noncurrentversion_transition_storage_class"] = storageClass; @@ -297,9 +305,17 @@ const AddLifecycleModal = ({ overlayObject={ { + setExpiryUnit(newValue); + }} /> } /> diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketLifecyclePanel.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketLifecyclePanel.tsx index a7652b9240..3b931f6de1 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketLifecyclePanel.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketLifecyclePanel.tsx @@ -86,7 +86,6 @@ const BucketLifecyclePanel = () => { .getBucketLifecycle(bucketName) .then((res) => { const records = get(res.data, "lifecycle", []); - setLifecycleRecords(records || []); setLoadingLifecycle(false); }) @@ -147,7 +146,10 @@ const BucketLifecyclePanel = () => { } if ( el.expiration && - (el.expiration.days > 0 || el.expiration.noncurrent_expiration_days) + (el.expiration.days > 0 || + el.expiration.noncurrent_expiration_days || + (el.expiration.newer_noncurrent_expiration_versions && + el.expiration.newer_noncurrent_expiration_versions > 0)) ) { return Expiry; } @@ -170,7 +172,10 @@ const BucketLifecyclePanel = () => { if (el.expiration) { if (el.expiration.days > 0) { return Current; - } else if (el.expiration.noncurrent_expiration_days) { + } else if ( + el.expiration.noncurrent_expiration_days || + el.expiration.newer_noncurrent_expiration_versions + ) { return Non-Current; } } @@ -200,13 +205,6 @@ const BucketLifecyclePanel = () => { if (!el) { return ; } - if (el.expiration) { - if (el.expiration.days > 0) { - return {el.expiration.days} days; - } else if (el.expiration.noncurrent_expiration_days) { - return {el.expiration.noncurrent_expiration_days} days; - } - } if (el.transition) { if (el.transition.days > 0) { return {el.transition.days} days; @@ -214,6 +212,19 @@ const BucketLifecyclePanel = () => { return {el.transition.noncurrent_transition_days} days; } } + if (el.expiration) { + if (el.expiration.days > 0) { + return {el.expiration.days} days; + } else if (el.expiration.noncurrent_expiration_days) { + return {el.expiration.noncurrent_expiration_days} days; + } else { + return ( + + {el.expiration.newer_noncurrent_expiration_versions} versions + + ); + } + } }, }, { diff --git a/portal-ui/src/screens/Console/Buckets/types.tsx b/portal-ui/src/screens/Console/Buckets/types.tsx index 977e01e2d2..0a25846028 100644 --- a/portal-ui/src/screens/Console/Buckets/types.tsx +++ b/portal-ui/src/screens/Console/Buckets/types.tsx @@ -42,6 +42,7 @@ interface IExpirationLifecycle { date: string; delete_marker?: boolean; noncurrent_expiration_days?: number; + newer_noncurrent_expiration_versions?: number; } interface ITransitionLifecycle { diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 487ea7ef7c..86928ec80e 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -5385,6 +5385,12 @@ func init() { "format": "int32", "default": 0 }, + "newer_noncurrentversion_expiration_versions": { + "description": "Non required, can be set in case of expiration is enabled", + "type": "integer", + "format": "int32", + "default": 0 + }, "noncurrentversion_expiration_days": { "description": "Non required, can be set in case of expiration is enabled", "type": "integer", @@ -6190,6 +6196,10 @@ func init() { "delete_marker": { "type": "boolean" }, + "newer_noncurrent_expiration_versions": { + "type": "integer", + "format": "int64" + }, "noncurrent_expiration_days": { "type": "integer", "format": "int64" @@ -14656,6 +14666,12 @@ func init() { "format": "int32", "default": 0 }, + "newer_noncurrentversion_expiration_versions": { + "description": "Non required, can be set in case of expiration is enabled", + "type": "integer", + "format": "int32", + "default": 0 + }, "noncurrentversion_expiration_days": { "description": "Non required, can be set in case of expiration is enabled", "type": "integer", @@ -15456,6 +15472,10 @@ func init() { "delete_marker": { "type": "boolean" }, + "newer_noncurrent_expiration_versions": { + "type": "integer", + "format": "int64" + }, "noncurrent_expiration_days": { "type": "integer", "format": "int64" diff --git a/restapi/user_buckets_lifecycle.go b/restapi/user_buckets_lifecycle.go index 66f399efc8..1e013c7618 100644 --- a/restapi/user_buckets_lifecycle.go +++ b/restapi/user_buckets_lifecycle.go @@ -90,7 +90,6 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri if err != nil { return nil, err } - var rules []*models.ObjectBucketLifecycle for _, rule := range lifecycleList.Rules { @@ -115,10 +114,11 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri Status: rule.Status, Prefix: rulePrefix, Expiration: &models.ExpirationResponse{ - Date: rule.Expiration.Date.Format(time.RFC3339), - Days: int64(rule.Expiration.Days), - DeleteMarker: rule.Expiration.DeleteMarker.IsEnabled(), - NoncurrentExpirationDays: int64(rule.NoncurrentVersionExpiration.NoncurrentDays), + Date: rule.Expiration.Date.Format(time.RFC3339), + Days: int64(rule.Expiration.Days), + DeleteMarker: rule.Expiration.DeleteMarker.IsEnabled(), + NoncurrentExpirationDays: int64(rule.NoncurrentVersionExpiration.NoncurrentDays), + NewerNoncurrentExpirationVersions: int64(rule.NoncurrentVersionExpiration.NewerNoncurrentVersions), }, Transition: &models.TransitionResponse{ Date: rule.Transition.Date.Format(time.RFC3339), @@ -141,6 +141,7 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri // getBucketLifecycleResponse performs getBucketLifecycle() and serializes it to the handler's output func getBucketLifecycleResponse(session *models.Principal, params bucketApi.GetBucketLifecycleParams) (*models.BucketLifecycleResponse, *CodedAPIError) { + ctx, cancel := context.WithCancel(params.HTTPRequest.Context()) defer cancel() mClient, err := newMinioClient(session, getClientIP(params.HTTPRequest)) @@ -178,7 +179,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp switch params.Body.Type { case models.AddBucketLifecycleTypeTransition: if params.Body.TransitionDays == 0 && params.Body.NoncurrentversionTransitionDays == 0 { - return errors.New("only one expiry configuration can be set (days or date)") + return errors.New("you must provide a value for transition days or date") } status := !params.Body.Disable @@ -195,12 +196,13 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp noncurrentVersionTransitionStorageClass := strings.ToUpper(params.Body.NoncurrentversionTransitionStorageClass) opts.NoncurrentVersionTransitionDays = &noncurrentVersionTransitionDays opts.NoncurrentVersionTransitionStorageClass = &noncurrentVersionTransitionStorageClass - } else { + } else if params.Body.TransitionDays > 0 { tdays := strconv.Itoa(int(params.Body.TransitionDays)) sclass := strings.ToUpper(params.Body.StorageClass) opts.TransitionDays = &tdays opts.StorageClass = &sclass } + case models.AddBucketLifecycleTypeExpiry: // Verify if expiry items are set if params.Body.NoncurrentversionTransitionDays != 0 { @@ -220,10 +222,15 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker, } - if params.Body.NoncurrentversionExpirationDays > 0 { + if params.Body.NewerNoncurrentversionExpirationVersions > 0 { + versions := int(params.Body.NewerNoncurrentversionExpirationVersions) + opts.NewerNoncurrentExpirationVersions = &versions + } + switch { + case params.Body.NoncurrentversionExpirationDays > 0: days := int(params.Body.NoncurrentversionExpirationDays) opts.NoncurrentVersionExpirationDays = &days - } else { + case params.Body.ExpiryDays > 0: days := strconv.Itoa(int(params.Body.ExpiryDays)) opts.ExpiryDays = &days } diff --git a/swagger.yml b/swagger.yml index ee5786fe78..0922f7da3d 100644 --- a/swagger.yml +++ b/swagger.yml @@ -5067,6 +5067,9 @@ definitions: noncurrent_expiration_days: type: integer format: int64 + newer_noncurrent_expiration_versions: + type: integer + format: int64 transitionResponse: type: object @@ -5154,6 +5157,11 @@ definitions: type: integer format: int32 default: 0 + newer_noncurrentversion_expiration_versions: + description: Non required, can be set in case of expiration is enabled + type: integer + format: int32 + default: 0 noncurrentversion_transition_storage_class: description: Non required, can be set in case of transition is enabled type: string From a65564fed8ab9027851b7e19d65ac6f3280e91fa Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Fri, 27 Oct 2023 16:17:34 -0700 Subject: [PATCH 2/7] Gofumpt, remove debug line --- restapi/user_buckets_lifecycle.go | 1 - 1 file changed, 1 deletion(-) diff --git a/restapi/user_buckets_lifecycle.go b/restapi/user_buckets_lifecycle.go index 1e013c7618..e6737e631e 100644 --- a/restapi/user_buckets_lifecycle.go +++ b/restapi/user_buckets_lifecycle.go @@ -141,7 +141,6 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri // getBucketLifecycleResponse performs getBucketLifecycle() and serializes it to the handler's output func getBucketLifecycleResponse(session *models.Principal, params bucketApi.GetBucketLifecycleParams) (*models.BucketLifecycleResponse, *CodedAPIError) { - ctx, cancel := context.WithCancel(params.HTTPRequest.Context()) defer cancel() mClient, err := newMinioClient(session, getClientIP(params.HTTPRequest)) From 750f2551d9d47ffed0a67f7471315da1e1cf68cd Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Wed, 1 Nov 2023 12:59:01 -0700 Subject: [PATCH 3/7] WIP improve UI to show clickable selector, guidance text --- .../BucketDetails/AddLifecycleModal.tsx | 52 ++++++++++++++----- .../InputUnitMenu/InputUnitMenu.tsx | 2 + 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 62bddb0313..ca2747daf2 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -22,12 +22,14 @@ import { Button, FormLayout, Grid, + HelpTip, InputBox, LifecycleConfigIcon, ProgressBar, RadioGroup, Select, Switch, + Tooltip, } from "mds"; import { useSelector } from "react-redux"; import { api } from "api"; @@ -120,8 +122,11 @@ const AddLifecycleModal = ({ if (!lifecycleDays || parseInt(lifecycleDays) === 0) { valid = false; } + if (parseInt(lifecycleDays) > 2147483647) { + //values over int32 cannot be parsed + valid = false; + } setIsFormValid(valid); - console.log("set to valid: ", valid, " lifecycledays: ", lifecycleDays); }, [ilmType, lifecycleDays, storageClass]); useEffect(() => { @@ -269,6 +274,10 @@ const AddLifecycleModal = ({ label="Object Version" onChange={(value) => { setTargetVersion(value as "current" | "noncurrent"); + console.log( + "setTargetVersion(value as 'current' | 'noncurrent'):", + value, + ); }} options={[ { value: "current", label: "Current Version" }, @@ -292,6 +301,13 @@ const AddLifecycleModal = ({ )} ) => { @@ -303,20 +319,28 @@ const AddLifecycleModal = ({ label="After" value={lifecycleDays} overlayObject={ - { - setExpiryUnit(newValue); - }} - /> + > + { + setExpiryUnit(newValue); + }} + /> + } /> diff --git a/portal-ui/src/screens/Console/Common/FormComponents/InputUnitMenu/InputUnitMenu.tsx b/portal-ui/src/screens/Console/Common/FormComponents/InputUnitMenu/InputUnitMenu.tsx index 85cd4e8698..f6afb9529b 100644 --- a/portal-ui/src/screens/Console/Common/FormComponents/InputUnitMenu/InputUnitMenu.tsx +++ b/portal-ui/src/screens/Console/Common/FormComponents/InputUnitMenu/InputUnitMenu.tsx @@ -24,6 +24,7 @@ interface IInputUnitBox { unitSelected: string; unitsList: SelectorType[]; disabled?: boolean; + tooltip?: string; onUnitChange?: (newValue: string) => void; } @@ -40,6 +41,7 @@ const InputUnitMenu = ({ unitSelected, unitsList, disabled = false, + tooltip, onUnitChange, }: IInputUnitBox) => { const [anchorEl, setAnchorEl] = React.useState(null); From f9ebd44a1e6f17370c6f32a78d483fb05c43563d Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Wed, 1 Nov 2023 14:55:06 -0700 Subject: [PATCH 4/7] Added indcator with HelpTip to show that expiryUnit can be changed under relevant conditions, informative error text if inappropriate value used for lifecycleDays --- .../BucketDetails/AddLifecycleModal.tsx | 73 +++++++++++-------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index ca2747daf2..6cff25894e 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -19,6 +19,8 @@ import React, { Fragment, useEffect, useState } from "react"; import get from "lodash/get"; import { Accordion, + AlertIcon, + Box, Button, FormLayout, Grid, @@ -43,6 +45,7 @@ import ModalWrapper from "../../Common/ModalWrapper/ModalWrapper"; import QueryMultiSelector from "../../Common/FormComponents/QueryMultiSelector/QueryMultiSelector"; import InputUnitMenu from "../../Common/FormComponents/InputUnitMenu/InputUnitMenu"; import { IAM_PAGES } from "common/SecureComponent/permissions"; +import { ArrowBack } from "@mui/icons-material"; interface IReplicationModal { open: boolean; @@ -197,7 +200,7 @@ const AddLifecycleModal = ({ dispatch(setModalErrorSnackMessage(errorToHandler(err))); }); }; - + const testSwitch = true; return ( { setTargetVersion(value as "current" | "noncurrent"); - console.log( - "setTargetVersion(value as 'current' | 'noncurrent'):", - value, - ); }} options={[ { value: "current", label: "Current Version" }, @@ -302,10 +301,12 @@ const AddLifecycleModal = ({ 2147483647 + ? `Number of ${expiryUnit} must be less than max int32` + : "" : "" } id="expiry_days" @@ -319,28 +320,38 @@ const AddLifecycleModal = ({ label="After" value={lifecycleDays} overlayObject={ - - { - setExpiryUnit(newValue); - }} - /> - + + + { + setExpiryUnit(newValue); + }} + /> + {ilmType === "expiry" && targetVersion === "noncurrent" && ( + + Select to set expiry by days or newer noncurrent + versions + + } + placement="right" + > + {" "} + + + )} + + } /> From 3566900e2068408629af4ce92009175aa0c8543a Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Wed, 1 Nov 2023 14:59:30 -0700 Subject: [PATCH 5/7] removed unused imports --- .../Console/Buckets/BucketDetails/AddLifecycleModal.tsx | 4 ---- .../Common/FormComponents/InputUnitMenu/InputUnitMenu.tsx | 2 -- 2 files changed, 6 deletions(-) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 6cff25894e..7e6f3e293e 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -20,7 +20,6 @@ import get from "lodash/get"; import { Accordion, AlertIcon, - Box, Button, FormLayout, Grid, @@ -31,7 +30,6 @@ import { RadioGroup, Select, Switch, - Tooltip, } from "mds"; import { useSelector } from "react-redux"; import { api } from "api"; @@ -45,7 +43,6 @@ import ModalWrapper from "../../Common/ModalWrapper/ModalWrapper"; import QueryMultiSelector from "../../Common/FormComponents/QueryMultiSelector/QueryMultiSelector"; import InputUnitMenu from "../../Common/FormComponents/InputUnitMenu/InputUnitMenu"; import { IAM_PAGES } from "common/SecureComponent/permissions"; -import { ArrowBack } from "@mui/icons-material"; interface IReplicationModal { open: boolean; @@ -200,7 +197,6 @@ const AddLifecycleModal = ({ dispatch(setModalErrorSnackMessage(errorToHandler(err))); }); }; - const testSwitch = true; return ( void; } @@ -41,7 +40,6 @@ const InputUnitMenu = ({ unitSelected, unitsList, disabled = false, - tooltip, onUnitChange, }: IInputUnitBox) => { const [anchorEl, setAnchorEl] = React.useState(null); From e026562b3dbc600227e712f9558d28e52458731c Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Tue, 7 Nov 2023 14:31:41 -0800 Subject: [PATCH 6/7] Replaced 'max int32' with actual value in guidance text --- .../screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 7e6f3e293e..87dd732f3d 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -301,7 +301,7 @@ const AddLifecycleModal = ({ ? parseInt(lifecycleDays) <= 0 ? `Number of ${expiryUnit} to retain must be greater than zero` : parseInt(lifecycleDays) > 2147483647 - ? `Number of ${expiryUnit} must be less than max int32` + ? `Number of ${expiryUnit} must be less than 2147483647` : "" : "" } From 427e2e908ef677c928f1b641cabbae27bd51fc07 Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Thu, 9 Nov 2023 16:12:45 -0800 Subject: [PATCH 7/7] Corrected max value text to include 'or equal to' --- .../screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 87dd732f3d..ba1e90d7ca 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -301,7 +301,7 @@ const AddLifecycleModal = ({ ? parseInt(lifecycleDays) <= 0 ? `Number of ${expiryUnit} to retain must be greater than zero` : parseInt(lifecycleDays) > 2147483647 - ? `Number of ${expiryUnit} must be less than 2147483647` + ? `Number of ${expiryUnit} must be less than or equal to 2147483647` : "" : "" }