diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteObject.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteObject.tsx
index 60ff63943..7eba0483d 100644
--- a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteObject.tsx
+++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/DeleteObject.tsx
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-import React, { useState } from "react";
+import React, { useState, Fragment } from "react";
import { connect } from "react-redux";
import { DialogContentText } from "@mui/material";
import { setErrorSnackMessage } from "../../../../../../actions";
@@ -32,6 +32,7 @@ interface IDeleteObjectProps {
selectedBucket: string;
setErrorSnackMessage: typeof setErrorSnackMessage;
versioning: boolean;
+ selectedVersion?: string;
}
const DeleteObject = ({
@@ -41,6 +42,7 @@ const DeleteObject = ({
selectedObject,
setErrorSnackMessage,
versioning,
+ selectedVersion = "",
}: IDeleteObjectProps) => {
const onDelSuccess = () => closeDeleteModalAndRefresh(true);
const onDelError = (err: ErrorResponseHandler) => setErrorSnackMessage(err);
@@ -57,7 +59,11 @@ const DeleteObject = ({
const recursive = decodedSelectedObject.endsWith("/");
invokeDeleteApi(
"DELETE",
- `/api/v1/buckets/${selectedBucket}/objects?path=${selectedObject}&recursive=${recursive}&all_versions=${deleteVersions}`
+ `/api/v1/buckets/${selectedBucket}/objects?path=${selectedObject}${
+ selectedVersion !== ""
+ ? `&version_id=${selectedVersion}`
+ : `&recursive=${recursive}&all_versions=${deleteVersions}`
+ }`
);
};
@@ -72,9 +78,22 @@ const DeleteObject = ({
onClose={onClose}
confirmationContent={
- Are you sure you want to delete:{" "}
- {decodeFileName(selectedObject)}?
- {versioning && (
+ Are you sure you want to delete:
+ {decodeFileName(selectedObject)}{" "}
+ {selectedVersion !== "" ? (
+
+
+
+ Version ID:
+
+ {selectedVersion}
+
+ ) : (
+ ""
+ )}
+ ?
+
+ {versioning && selectedVersion === "" && (
{
const [shareFileModalOpen, setShareFileModalOpen] = useState(false);
const [retentionModalOpen, setRetentionModalOpen] = useState(false);
@@ -313,8 +319,12 @@ const ObjectDetailPanel = ({
const closeDeleteModal = (closeAndReload: boolean) => {
setDeleteOpen(false);
- if (closeAndReload) {
+ if (closeAndReload && selectedVersion === "") {
onClosePanel(true);
+ } else {
+ setLoadingVersions(true);
+ setSelectedVersion("");
+ setLoadingObjectInfo(true);
}
};
@@ -466,6 +476,7 @@ const ObjectDetailPanel = ({
selectedObject={internalPaths}
closeDeleteModalAndRefresh={closeDeleteModal}
versioning={distributedSetup && versioning}
+ selectedVersion={selectedVersion}
/>
)}
{legalholdOpen && actualInfo && (
@@ -527,34 +538,32 @@ const ObjectDetailPanel = ({
/>
- {selectedVersion === "" && (
-
+ }
+ color="secondary"
+ variant={"outlined"}
+ onClick={() => {
+ setDeleteOpen(true);
+ }}
+ disabled={selectedVersion === "" && actualInfo.is_delete_marker}
+ sx={{
+ width: "calc(100% - 44px)",
+ margin: "8px 0",
+ "& svg.min-icon": {
+ width: 14,
+ height: 14,
+ },
+ }}
>
- }
- color="secondary"
- variant={"outlined"}
- onClick={() => {
- setDeleteOpen(true);
- }}
- disabled={actualInfo.is_delete_marker || selectedVersion !== ""}
- sx={{
- width: "calc(100% - 44px)",
- margin: "8px 0",
- "& svg.min-icon": {
- width: 14,
- height: 14,
- },
- }}
- >
- Delete
-
-
- )}
+ Delete{selectedVersion !== "" ? " version" : ""}
+
+
Object Info
@@ -687,6 +696,8 @@ const mapDispatchToProps = {
completeObject,
setVersionsModeEnabled,
setLoadingObjectInfo,
+ setLoadingVersions,
+ setSelectedVersion,
};
const connector = connect(mapStateToProps, mapDispatchToProps);