diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx index 69947f51f..2326275ee 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx @@ -74,7 +74,7 @@ import { setErrorSnackMessage, setSnackBarMessage, } from "../../../../../../actions"; -import { BucketInfo, BucketQuota, BucketVersioning } from "../../../types"; +import {BucketInfo, BucketObjectLocking, BucketQuota, BucketVersioning} from "../../../types"; import { ErrorResponseHandler } from "../../../../../../common/types"; import ScreenTitle from "../../../../Common/ScreenTitle/ScreenTitle"; @@ -290,6 +290,8 @@ const ListObjects = ({ useState(defLoading); const [loadingVersioning, setLoadingVersioning] = useState(true); const [isVersioned, setIsVersioned] = useState(false); + const [loadingLocking, setLoadingLocking] = useState(true); + const [lockingEnabled, setLockingEnabled] = useState(false); const [rewindSelect, setRewindSelect] = useState(false); const [selectedObjects, setSelectedObjects] = useState([]); const [previewOpen, setPreviewOpen] = useState(false); @@ -436,6 +438,25 @@ const ListObjects = ({ } }, [bucketName, loadingVersioning, setErrorSnackMessage, displayListObjects]); + useEffect(() => { + if (loadingLocking) { + if (displayListObjects) { + api + .invoke("GET", `/api/v1/buckets/${bucketName}/object-locking`) + .then((res: BucketObjectLocking) => { + setLockingEnabled(res.object_locking_enabled); + setLoadingLocking(false); + }) + .catch((err: ErrorResponseHandler) => { + setErrorSnackMessage(err); + setLoadingLocking(false); + }); + } else { + setLoadingLocking(false); + } + } + }, [bucketName, loadingLocking, setErrorSnackMessage, displayListObjects]); + // Rewind useEffect(() => { if (rewindEnabled) { @@ -1392,6 +1413,7 @@ const ListObjects = ({ bucketName={bucketName} onClosePanel={onClosePanel} versioning={isVersioned} + locking={lockingEnabled} /> )} diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx index a2ed152b5..b6856bd1c 100644 --- a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx +++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ObjectDetailPanel.tsx @@ -123,6 +123,7 @@ interface IObjectDetailPanelProps { bucketToRewind: string; distributedSetup: boolean; versioning: boolean; + locking: boolean; versionsMode: boolean; selectedVersion: string; loadingObjectInfo: boolean; @@ -156,6 +157,7 @@ const ObjectDetailPanel = ({ bucketName, distributedSetup, versioning, + locking, setErrorSnackMessage, setNewObject, updateProgress, @@ -405,11 +407,8 @@ const ObjectDetailPanel = ({ }, label: "Legal Hold", disabled: - !distributedSetup || - !!actualInfo.is_delete_marker || - !hasPermission(objectResources, [ - IAM_SCOPES.S3_PUT_OBJECT_LEGAL_HOLD, - ]) || + !locking || !distributedSetup || !!actualInfo.is_delete_marker || + !hasPermission(bucketName, [IAM_SCOPES.S3_PUT_OBJECT_LEGAL_HOLD]) || selectedVersion !== "", icon: , tooltip: "Change Legal Hold rules for this File",