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;