github.com/minio/console@v1.4.1/web-app/src/screens/Console/Buckets/ListBuckets/Objects/ObjectDetails/DeleteSelectedVersions.tsx (about) 1 // This file is part of MinIO Console Server 2 // Copyright (c) 2022 MinIO, Inc. 3 // 4 // This program is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Affero General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Affero General Public License for more details. 13 // 14 // You should have received a copy of the GNU Affero General Public License 15 // along with this program. If not, see <http://www.gnu.org/licenses/>. 16 17 import React, { Fragment, useEffect, useState } from "react"; 18 import ConfirmDialog from "../../../../Common/ModalWrapper/ConfirmDialog"; 19 import { ConfirmDeleteIcon, Switch } from "mds"; 20 import { setErrorSnackMessage } from "../../../../../../systemSlice"; 21 import { AppState, useAppDispatch } from "../../../../../../store"; 22 import { hasPermission } from "../../../../../../common/SecureComponent"; 23 import { IAM_SCOPES } from "../../../../../../common/SecureComponent/permissions"; 24 import { useSelector } from "react-redux"; 25 import { api } from "api"; 26 import { errorToHandler } from "api/errors"; 27 28 interface IDeleteSelectedVersionsProps { 29 closeDeleteModalAndRefresh: (refresh: boolean) => void; 30 deleteOpen: boolean; 31 selectedVersions: string[]; 32 selectedObject: string; 33 selectedBucket: string; 34 } 35 36 const DeleteObject = ({ 37 closeDeleteModalAndRefresh, 38 deleteOpen, 39 selectedBucket, 40 selectedVersions, 41 selectedObject, 42 }: IDeleteSelectedVersionsProps) => { 43 const dispatch = useAppDispatch(); 44 const [deleteLoading, setDeleteLoading] = useState<boolean>(false); 45 const [bypassGovernance, setBypassGovernance] = useState<boolean>(false); 46 47 const retentionConfig = useSelector( 48 (state: AppState) => state.objectBrowser.retentionConfig, 49 ); 50 51 const canBypass = 52 hasPermission( 53 [selectedBucket], 54 [IAM_SCOPES.S3_BYPASS_GOVERNANCE_RETENTION], 55 ) && retentionConfig?.mode === "governance"; 56 57 const onClose = () => closeDeleteModalAndRefresh(false); 58 const onConfirmDelete = () => { 59 setDeleteLoading(true); 60 }; 61 62 useEffect(() => { 63 if (deleteLoading) { 64 const selectedObjectsRequest = selectedVersions.map((versionID) => { 65 return { 66 path: selectedObject, 67 versionID: versionID, 68 recursive: false, 69 }; 70 }); 71 72 if (selectedObjectsRequest.length > 0) { 73 api.buckets 74 .deleteMultipleObjects(selectedBucket, selectedObjectsRequest, { 75 all_versions: false, 76 bypass: bypassGovernance, 77 }) 78 .then(() => { 79 setDeleteLoading(false); 80 closeDeleteModalAndRefresh(true); 81 }) 82 .catch((err) => { 83 dispatch(setErrorSnackMessage(errorToHandler(err.error))); 84 setDeleteLoading(false); 85 }); 86 } 87 } 88 }, [ 89 deleteLoading, 90 closeDeleteModalAndRefresh, 91 selectedBucket, 92 selectedObject, 93 selectedVersions, 94 bypassGovernance, 95 dispatch, 96 ]); 97 98 if (!selectedVersions) { 99 return null; 100 } 101 102 return ( 103 <ConfirmDialog 104 title={`Delete Selected Versions`} 105 confirmText={"Delete"} 106 isOpen={deleteOpen} 107 titleIcon={<ConfirmDeleteIcon />} 108 isLoading={deleteLoading} 109 onConfirm={onConfirmDelete} 110 onClose={onClose} 111 confirmationContent={ 112 <Fragment> 113 Are you sure you want to delete the selected {selectedVersions.length}{" "} 114 versions for <strong>{selectedObject}</strong>? 115 {canBypass && ( 116 <Fragment> 117 <div 118 style={{ 119 marginTop: 10, 120 }} 121 > 122 <Switch 123 label={"Bypass Governance Mode"} 124 indicatorLabels={["Yes", "No"]} 125 checked={bypassGovernance} 126 value={"bypass_governance"} 127 id="bypass_governance" 128 name="bypass_governance" 129 onChange={(e) => { 130 setBypassGovernance(!bypassGovernance); 131 }} 132 description="" 133 /> 134 </div> 135 </Fragment> 136 )} 137 </Fragment> 138 } 139 /> 140 ); 141 }; 142 143 export default DeleteObject;